sliftutils 1.7.118 → 1.7.119

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.
@@ -147,17 +147,11 @@ class BlobStore {
147
147
  }
148
148
  // The routing config as this store holds it, read straight off its folder: the store may be configuring itself before it has scanned anything, and this file is what decides what a scan would even talk to
149
149
  async readRoutingConfig() {
150
- var _a;
151
150
  let data = await this.ownDisk.get(remoteConfig_1.ROUTING_FILE);
152
151
  if (!data || !data.length)
153
152
  return undefined;
154
- try {
155
- return (0, remoteConfig_1.parseRoutingData)(data);
156
- }
157
- catch (e) {
158
- (0, storageLogs_1.logStorageError)(`Ignoring the routing config in store ${this.folder}: it could not be parsed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
159
- return undefined;
160
- }
153
+ // Unparseable reads as "no config" (parseRoutingData logs it) - a store must never be unable to start because its own routing file is torn
154
+ return (0, remoteConfig_1.parseRoutingData)(data);
161
155
  }
162
156
  /** The version of the routing config this store is running, so a copy found on a peer is only taken when it is genuinely newer. -1 means it has none. */
163
157
  routingVersion() {
@@ -911,6 +905,9 @@ class BlobStore {
911
905
  */
912
906
  assertRoutingConfigWritable(data) {
913
907
  let routing = (0, remoteConfig_1.parseRoutingData)(data);
908
+ if (!routing) {
909
+ throw new Error(`Routing config write rejected - not a parseable config. Refusing to write ${remoteConfig_1.ROUTING_FILE} to store ${this.folder}: the data is not a valid { version?, sources: [...] } JSON config (${data.length} bytes)`);
910
+ }
914
911
  (0, remoteConfig_1.assertValidRemoteConfig)(routing);
915
912
  let incoming = (0, remoteConfig_1.getConfigVersion)(routing);
916
913
  let current = this.routingVersion();
@@ -1090,5 +1087,5 @@ class BlobStore {
1090
1087
  }
1091
1088
  }
1092
1089
  exports.BlobStore = BlobStore;
1093
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELGtFQUErRTtBQUMvRSw0Q0FHc0I7QUFDdEIsa0RBQW1FO0FBQ25FLGlEQUFtTjtBQUNuTiwyQ0FBNEM7QUFDNUMsdURBQXFEO0FBQ3JELHdEQUFxRDtBQUNyRCwrQ0FBNEM7QUFDNUMsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1Qyx1REFBNkQ7QUFDN0QsK0NBQTZFO0FBRTdFLHFnQkFBcWdCO0FBRXJnQixtTkFBbU47QUFDdE0sUUFBQSx1QkFBdUIsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN4RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsMkdBQTJHO0FBQzNHLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDO0FBQzdDLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTlDLG9NQUFvTTtBQUN2TCxRQUFBLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsbUtBQW1LO0FBQzVKLEtBQUssVUFBVSxnQkFBZ0I7SUFDbEMsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUZELDRDQUVDO0FBb0NELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsdUJBQXVCLENBQUMsT0FBZTtJQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsR0FBRyx5QkFBeUI7UUFBRSxPQUFPO0lBQ3hFLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQyxJQUFBLDZCQUFlLEVBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELHVXQUF1VztBQUN2VyxNQUFhLFNBQVM7SUFxQmxCO0lBQ0ksOERBQThEO0lBQ3ZELE1BQWM7SUFDckIsMktBQTJLO0lBQ3BLLFNBQWlCLEVBQ2hCLE1BbUJQO1FBdEJNLFdBQU0sR0FBTixNQUFNLENBQVE7UUFFZCxjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBbUJiO1FBNUNMLGNBQWM7UUFDZCwwR0FBMEc7UUFDbkcsWUFBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2pDLCtGQUErRjtRQUN4RixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUMzQiw0VEFBNFQ7UUFDclQsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFDdEMsNElBQTRJO1FBQ3BJLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBR2hDLG1IQUFtSDtRQUMzRywyQkFBc0IsR0FBYSxFQUFFLENBQUM7UUFDdEMsc0JBQWlCLEdBQW9CLEVBQUUsQ0FBQztRQTRDaEQsMEdBQTBHO1FBQ2xHLDBCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBSW5DLHlCQUF5QjtRQUVsQixTQUFJLEdBQUcsSUFBQSxjQUFJLEVBQUMsS0FBSyxJQUFJLEVBQUU7O1lBQzFCLGdNQUFnTTtZQUNoTSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hDLHdOQUF3TjtZQUN4TixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEtBQUksTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxvQkFBb0IsQ0FBQSxFQUFFLENBQUM7Z0JBQ3RFLElBQUksQ0FBQztvQkFDRCxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sOEZBQThGLElBQUEsK0JBQWdCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBQ3BOLG9HQUFvRzt3QkFDcEcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSxvQ0FBcUIsRUFBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM3SCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNwQyxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBQSw0QkFBYyxFQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sOEhBQThILENBQUMsQ0FBQztvQkFDak4sQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsSUFBQSw2QkFBZSxFQUFDLGdFQUFnRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxvQ0FBb0MsTUFBQyxDQUFXLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4TSxDQUFDO1lBQ0wsQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUNELG9FQUFvRTtZQUNwRSxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBeURILHVJQUF1STtRQUMvSCxtQkFBYyxHQUFrQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUF2R3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSx5QkFBVyxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGlDQUFlLENBQWEsY0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUkseUJBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLDJCQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQTBDRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUssQ0FBQyxrQkFBa0I7O1FBQzNCLElBQUksT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsSUFBSSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEtBQUssR0FBbUIsRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxNQUFNLElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsT0FBTyxLQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFBRSxTQUFTO1lBQ3pDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxNQUFNLG1EQUFHLE1BQU0sQ0FBQyxDQUFBLEVBQUUsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFzQixDQUFDLENBQUM7Z0JBQ3JDLFNBQVM7WUFDYixDQUFDO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBQSw0QkFBYyxFQUFDLCtCQUErQixJQUFJLENBQUMsTUFBTSxhQUFhLElBQUEsK0JBQWdCLEVBQUMsT0FBTyxDQUFDLCtCQUErQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNuTixDQUFDO1FBQ0QsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ2pELElBQUksVUFBVSxHQUFHLE9BQU8sSUFBSSxJQUFBLCtCQUFnQixFQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksVUFBVSxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxvQ0FBb0MsZUFBZSxPQUFPLFVBQVUsS0FBSyxPQUFPLENBQUMsTUFBTSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLHNCQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQztRQUMxVixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFVBQVUsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUM5QixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGdCQUFnQixtREFBRyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRNQUE0TTtJQUNwTSxLQUFLLENBQUMsaUJBQWlCOztRQUMzQixJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QyxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFBLDZCQUFlLEVBQUMsd0NBQXdDLElBQUksQ0FBQyxNQUFNLDZCQUE2QixNQUFDLENBQVcsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0gsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztJQUNMLENBQUM7SUFFRCx5SkFBeUo7SUFDbEosY0FBYztRQUNqQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUN0QyxDQUFDO0lBSU0sb0JBQW9CO1FBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFLFdBQUMsT0FBQSxJQUFBLDZCQUFlLEVBQUMsd0NBQXdDLElBQUksQ0FBQyxNQUFNLFlBQVksTUFBQSxDQUFDLENBQUMsS0FBSyxtQ0FBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxDQUFDO0lBQ2xJLENBQUM7SUFFRCxzSkFBc0o7SUFDOUksV0FBVyxDQUFDLEtBQXFCO1FBQ3JDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxZQUFzQyxFQUFFLFlBQWdDLEVBQUUsS0FBbUMsRUFBRSxVQUErQixFQUFrQixFQUFFO1lBQzlLLElBQUksVUFBVSxHQUFHLElBQUEsa0NBQWdCLEVBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLE9BQU87Z0JBQ0gsUUFBUSxFQUFFLElBQUEsNkJBQWMsRUFBQyxZQUFZLENBQUM7Z0JBQ3RDLEdBQUcsRUFBRSxJQUFBLGtDQUFtQixFQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNuRCxZQUFZO2dCQUNaLEtBQUs7Z0JBQ0wsVUFBVTtnQkFDVixZQUFZLEVBQUUsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFlBQVk7Z0JBQ3hDLFlBQVk7Z0JBQ1osTUFBTSxFQUFFLEdBQUcsRUFBRTs7b0JBQ1QsSUFBSSxPQUFPLEdBQUcsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLFlBQVksbURBQUcsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsR0FBRyxLQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSx1QkFBdUIsQ0FBQyxDQUFDO29CQUMvSyxDQUFDO29CQUNELE9BQU8sT0FBTyxDQUFDO2dCQUNuQixDQUFDO2dCQUNELFdBQVcsRUFBRSxDQUFDLE1BQWlCLEVBQUUsRUFBRSxlQUFDLE9BQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLFdBQVcsbURBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQSxFQUFBO2FBQ25HLENBQUM7UUFDTixDQUFDLENBQUM7UUFDRix5SEFBeUg7UUFDekgsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEUsSUFBSSxLQUFLLEdBQXFCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsSUFBSSxDQUFDLDZCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDbEksZ0pBQWdKO1FBQ2hKLElBQUksVUFBVSxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO1FBQ25ELEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDckIsSUFBSSxNQUFNLEdBQUcsSUFBQSxnQ0FBaUIsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxTQUFTO1lBQ3RCLElBQUksUUFBUSxHQUFHLElBQUEsNkJBQWMsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3QyxTQUFTO1lBQ2IsQ0FBQztZQUNELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFGLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxnUUFBZ1E7SUFDelAsS0FBSyxDQUFDLE9BQU87UUFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQTBJO1FBQ3hKLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekIsZ1RBQWdUO1FBQ2hULElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsa05BQWtOO1FBQ2xOLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUI7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDaEQsd0dBQXdHO1lBQ3hHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDL0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksTUFBcUUsQ0FBQztRQUMxRSxJQUFJLFdBQThCLENBQUM7UUFDbkMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUM7Z0JBQ0QsNlBBQTZQO2dCQUM3UCxJQUFJLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDaEcsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNqSCxPQUFPLFNBQVMsQ0FBQztnQkFDckIsQ0FBQztnQkFDRCxtSUFBbUk7Z0JBQ25JLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3hFLE1BQU0sR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25GLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxXQUFXLEdBQUcsQ0FBVSxDQUFDO1lBQzdCLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULHdKQUF3SjtZQUN4SixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEYsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUNELDBLQUEwSztRQUMxSyxJQUFJLEdBQUcsS0FBSywyQkFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxXQUFXO2dCQUFFLE1BQU0sV0FBVyxDQUFDO1lBQ25DLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCwyS0FBMks7UUFDM0ssSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFNBQVM7WUFDbEQsSUFBSSxRQUF1RSxDQUFDO1lBQzVFLElBQUksQ0FBQztnQkFDRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDeEUsOEdBQThHO2dCQUM5RyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzlDLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JGLENBQUM7WUFDTCxDQUFDO1lBQUMsV0FBTSxDQUFDO2dCQUNMLFNBQVM7WUFDYixDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsU0FBUztZQUN4Qiw2RkFBNkY7WUFDN0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvRixDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLFdBQVc7WUFBRSxNQUFNLFdBQVcsQ0FBQztRQUNuQywwVUFBMFU7UUFDMVUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBa0k7UUFDL0ksSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLGlHQUFpRyxDQUFDLENBQUM7UUFDaE8sQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsNE1BQTRNO1FBQzVNLElBQUksR0FBRyxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksR0FBRyxLQUFLLDJCQUFZLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBWSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7WUFDeEksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksR0FBRyxLQUFLLDJCQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4RCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDZHQUE2RyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUMvSyxDQUFDO2dCQUNELDZHQUE2RztnQkFDN0csSUFBSSxJQUFJLEdBQUcsSUFBQSx5QkFBYSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFNBQVMsS0FBSSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUM7b0JBQUUsT0FBTztZQUNyRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUhBQW1ILElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDckwsQ0FBQztZQUNELHdQQUF3UDtZQUN4UCxJQUFJLEdBQUcsS0FBSywyQkFBWSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDekUsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFtRTtRQUNoRixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksR0FBRyxLQUFLLDJCQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsU0FBUyxDQUFDLDJCQUFZLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUNoSixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsb0tBQW9LO1FBQ3BLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBQSx1QkFBUSxFQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHVIQUF1SCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pMLENBQUM7WUFDRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBQSx1QkFBUSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUUsa0hBQWtIO1lBQ2xILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNwRixPQUFPO1FBQ1gsQ0FBQztRQUNELG1MQUFtTDtRQUNuTCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELHNhQUFzYTtJQUMvWixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQTRDO1FBQzFELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDOUMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLDJCQUFZLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSywyQkFBWSxFQUFFLENBQUM7WUFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBWSxDQUFDLDJCQUEyQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNqSCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdKLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUEseUJBQVcsRUFBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwSixDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFxRDtRQUN0RSxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RCLGdUQUFnVDtRQUNoVCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksS0FBSztZQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDaEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBdUM7UUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztRQUMvQyxtR0FBbUc7UUFDbkcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFBRSxTQUFTO1lBQ3RDLHdKQUF3SjtZQUN4SixJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUM1RixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixrRkFBa0Y7WUFDbEYsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7b0JBQUUsU0FBUztnQkFDdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLElBQUEsaUNBQWtCLEVBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkgsSUFBQSxXQUFJLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxvYkFBb2I7SUFDN2EsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQTBCO1FBQ3BELE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZDLElBQUksUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDRCQUFhLEVBQUMsS0FBSyxFQUFFLElBQUEsdUJBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkgsSUFBSSxLQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUM3Qiw4RkFBOEY7WUFDOUYsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDNUYsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJO2dCQUFFLFNBQVM7WUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBQSxXQUFJLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN0QixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELDBFQUEwRTtJQUNuRSxlQUFlO1FBT2xCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JDLE9BQU87WUFDSCxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNuRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUMzQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtTQUNyQyxDQUFDO0lBQ04sQ0FBQztJQUVELDhIQUE4SDtJQUN2SCxLQUFLLENBQUMsa0JBQWtCO1FBSzNCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsT0FBTztZQUNILFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUMzQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2lCQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxhQUFhLENBQUMsS0FBdUI7O1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLG1GQUFtRjtZQUNuRixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQUEsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQywwQ0FBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN4TCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFTLEVBQUUsT0FBMkIsRUFBRSxFQUFFO1lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPO1lBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvSixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsdVFBQXVRO1FBQ3ZRLElBQUksY0FBYyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ2pELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUM5QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLEVBQUUsS0FBSyxTQUFTO2dCQUFFLFNBQVM7WUFDL0IsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDVixjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUNoQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLElBQUksR0FBRyxNQUFBLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQ0FBRSxLQUFLLEVBQUUsQ0FBQztZQUN0RCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckIsNFJBQTRSO2dCQUM1UixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5SixRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxXQUFXLElBQUksQ0FBQyxNQUFNLG1EQUFtRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzlOLENBQUM7Z0JBQ0Qsc0lBQXNJO2dCQUN0SSxNQUFBLElBQUksQ0FBQyxXQUFXLHFEQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzFDLFNBQVM7WUFDYixDQUFDO1lBQ0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQUEsSUFBQSwyQkFBUyxFQUFDLE1BQU0sQ0FBQywwQ0FBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6TixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sNERBQTRELENBQUMsQ0FBQztZQUMxSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUFFLFNBQVM7WUFDaEQsa0pBQWtKO1lBQ2xKLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsV0FBQyxPQUFBLElBQUEsNkJBQWUsRUFBQyx3QkFBd0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sYUFBYSxNQUFBLENBQUMsQ0FBQyxLQUFLLG1DQUFJLENBQUMsRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7UUFDeEwsQ0FBQztJQUNMLENBQUM7SUFFRCw2S0FBNks7SUFDdEssS0FBSyxDQUFDLFVBQVU7UUFDbkIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCw0S0FBNEs7SUFDckssS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWlCLEVBQUUsTUFBbUQ7UUFDbEcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQscVhBQXFYO0lBQzlXLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFzSDtRQUNoSixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsSUFBSSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxFQUFFLENBQUM7WUFDTixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFlBQVksS0FBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMvRCxJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLEtBQUssMkJBQVksRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUNELElBQUksR0FBRyxLQUFLLDJCQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsaUJBQWlCLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrR0FBK0csSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDakwsQ0FBQztvQkFDRCxvUUFBb1E7b0JBQ3BRLElBQUksSUFBSSxHQUFHLElBQUEseUJBQWEsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDbkUsSUFBSSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxTQUFTLEtBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDdkQsSUFBSSxFQUFFLEdBQUcsR0FBRyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO3dCQUNuRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QixPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHFIQUFxSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN2TCxDQUFDO2dCQUNELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFxRDtRQUNoRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDakQsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUNNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnSTtRQUMzSixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDcEQsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakQsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBQSxtQ0FBdUIsRUFBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0MsNExBQTRMO1lBQzVMLElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakUsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxPQUFPO1lBQ1gsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFFLElBQUksSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUksSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUssQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBc0I7UUFDakQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPO1FBQ3BELE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGFBQWE7SUFFYixvQkFBb0I7SUFFcEIsZ05BQWdOO0lBQ2hOLElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO0lBQ3RELENBQUM7SUFFRCxrV0FBa1c7SUFDM1YsZ0JBQWdCLENBQUMsR0FBVztRQUMvQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxNQUFNLENBQUMsV0FBbUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVk7UUFDNUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQzVDLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvSkFBb0o7SUFDN0ksb0JBQW9CLENBQUMsSUFBWTtRQUNwQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsNEtBQTRLO0lBQ3JLLHNCQUFzQixDQUFDLElBQVk7O1FBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxJQUFJLEtBQUssTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBRSxHQUFHLG9DQUFvQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuSixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELHlSQUF5UjtJQUNsUix1QkFBdUIsQ0FBQyxnQkFBd0I7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELGdTQUFnUztJQUN6UixLQUFLLENBQUMsY0FBYyxDQUFDLEtBQWlCOztRQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzNCLE9BQU8sTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGdCQUFnQixtREFBRyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVM7UUFDbkIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLGdOQUFnTjtRQUNoTixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUFZLENBQUMsQ0FBQztRQUMvQyxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDbkksQ0FBQztJQUNMLENBQUM7SUFFRCw0R0FBNEc7SUFDckcsYUFBYSxDQUFDLEdBQVc7UUFDNUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM3QixPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVELG1KQUFtSjtJQUM1SSxlQUFlLENBQUMsR0FBVztRQUM5QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCw0TkFBNE47SUFDck4sQ0FBQyxZQUFZO1FBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztJQUNMLENBQUM7SUFFRCw4R0FBOEc7SUFDdkcsQ0FBQyxjQUFjO1FBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0wsQ0FBQztJQUVELG9LQUFvSztJQUM3SixjQUFjLENBQUMsR0FBVztRQUM3QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2xFLE9BQU8sRUFBRSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hKLENBQUM7SUFFRCxnSEFBZ0g7SUFDekcsQ0FBQyxhQUFhO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDdkQsSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUM1QyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RKLENBQUM7SUFDTCxDQUFDO0lBRUQsNEpBQTRKO0lBQ3JKLFlBQVk7UUFDZixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksZ0JBQW9DLENBQUM7UUFDekMsS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUN6QyxTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksZ0JBQWdCLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEUsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUN4QyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELHdMQUF3TDtJQUNqTCxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBVztRQUN0QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCwrV0FBK1c7SUFDdlcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBRSxRQUE2Qjs7UUFDbkYsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDckMsc0ZBQXNGO1lBQ3RGLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUNwQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLHdFQUF3RSxDQUFDLENBQUM7Z0JBQzlJLE9BQU87WUFDWCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxzRUFBc0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxtR0FBbUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RVLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSx1QkFBdUIsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksbUJBQW1CLE1BQU0sSUFBSSxJQUFBLCtCQUFzQixFQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMseUJBQXlCLElBQUEsK0JBQXNCLEVBQUMsU0FBUyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDelEsSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hJLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxjQUFjLG1EQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksUUFBUTtZQUFFLE9BQU87UUFDckIsc01BQXNNO1FBQ3RNLElBQUksS0FBSyxHQUFHLElBQUEsdUJBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ3RCLElBQUksQ0FBQyxJQUFBLDRCQUFhLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUFFLFNBQVM7WUFDM0QsNktBQTZLO1lBQzdLLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSwwQ0FBRSxJQUFJLE1BQUssUUFBUTtnQkFBRSxTQUFTO1lBQzlELElBQUksSUFBSSxHQUFHLElBQUEsK0JBQWEsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3SixLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRTs7Z0JBQ3pCLElBQUEsNkJBQWUsRUFBQywwQkFBMEIsR0FBRyxtQkFBbUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sdURBQXVELE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0TSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsa0RBQWtEO0lBQzNDLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnTEFBZ0w7SUFDekssV0FBVztRQUNkLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxLQUFLLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxDQUFDO1lBQ1osU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxLQUFLLFNBQVM7Z0JBQUUsU0FBUztZQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsbU5BQW1OO0lBQzVNLGFBQWEsQ0FBQyxHQUFXLEVBQUUsS0FBb0U7O1FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEgsc0pBQXNKO1FBQ3RKLElBQUksR0FBRyxLQUFLLDJCQUFZLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsY0FBYyxtREFBRyxHQUFHLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsb01BQW9NO0lBQzdMLGVBQWUsQ0FBQyxHQUFXLEVBQUUsU0FBaUI7O1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckQsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGNBQWMsbURBQUcsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHFRQUFxUTtJQUM5UCxlQUFlLENBQUMsR0FBVztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUxBQWlMO0lBQzFLLGdCQUFnQixDQUFDLFNBQWtDLEVBQUUsSUFBWSxFQUFFLEtBQWE7O1FBQ25GLElBQUEseUJBQVcsRUFBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLE1BQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxjQUFjLG1EQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDJEQUEyRDtJQUUzRDs7Ozs7OztPQU9HO0lBQ0ssaUJBQWlCLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBRSxZQUFnQztRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN2Qyx1QkFBdUIsQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxrQ0FBc0Isa0VBQWtFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSx5VEFBeVQsQ0FBQyxDQUFDO1FBQ3hjLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEQsT0FBTztRQUNYLENBQUM7UUFDRCw0T0FBNE87UUFDNU8sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUEsNEJBQWEsRUFBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUM1RSx1QkFBdUIsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxZQUFZLEtBQUssb0NBQW9DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLHNCQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5TixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsK0JBQW1CLHNEQUFzRCxLQUFLLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLHNCQUFVLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLGtEQUFrRCxDQUFDLENBQUM7SUFDbFMsQ0FBQztJQUVELHlMQUF5TDtJQUNqTCxrQkFBa0I7UUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxPQUFPLEdBQUcsUUFBUSw0REFBNEQsSUFBSSxDQUFDLFNBQVMsQ0FBQywyQkFBWSxDQUFDLFdBQVcsQ0FBQztRQUMxSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQW1CLENBQUM7UUFDbkYsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLFFBQVEsc0NBQXNDLElBQUEsK0JBQWdCLEVBQUMsT0FBTyxDQUFDLDhCQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQTJCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDek4sQ0FBQztRQUNELE9BQU8sR0FBRyxRQUFRLHNDQUFzQyxJQUFBLCtCQUFnQixFQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssQ0FBQyxNQUFNLFFBQVEsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpRkFBaUYsQ0FBQztJQUNyVSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSywyQkFBMkIsQ0FBQyxJQUFZO1FBQzVDLElBQUksT0FBTyxHQUFHLElBQUEsK0JBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBQSxzQ0FBdUIsRUFBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLFFBQVEsR0FBRyxJQUFBLCtCQUFnQixFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFFBQVEsSUFBSSxPQUFPO1lBQUUsT0FBTztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSwyQkFBWSxhQUFhLElBQUksQ0FBQyxNQUFNLGtCQUFrQixRQUFRLGtEQUFrRCxPQUFPLHdDQUF3QyxDQUFDLENBQUM7SUFDblEsQ0FBQztJQUVELDJQQUEyUDtJQUNuUCxzQkFBc0IsQ0FBQyxHQUFXLEVBQUUsU0FBaUIsRUFBRSxLQUFhO1FBQ3hFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLHVCQUF1QixDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxNQUFNLGdCQUFnQixTQUFTLEtBQUssSUFBQSwrQkFBc0IsRUFBQyxTQUFTLENBQUMsc0NBQXNDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUMxUyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsc0NBQTBCLDBFQUEwRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsU0FBUyxLQUFLLElBQUEsK0JBQXNCLEVBQUMsU0FBUyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sMkZBQTJGLENBQUMsQ0FBQztRQUMzZCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFBLDRCQUFhLEVBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsdUJBQXVCLENBQUMsNEJBQTRCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sWUFBWSxLQUFLLDBCQUEwQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLHNCQUFVLENBQUMsQ0FBQyxpQkFBaUIsU0FBUyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3BRLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRywrQkFBbUIsc0RBQXNELEtBQUssU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxzQkFBVSxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxrREFBa0QsQ0FBQyxDQUFDO1FBQ2xTLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsU0FBaUI7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBQSx5QkFBYSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUEsdUJBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxTQUFTLENBQUE7WUFBRSxPQUFPO1FBQzdCLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlLLENBQUM7SUFDTCxDQUFDO0lBRUQseVBBQXlQO0lBQ2pQLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxTQUFpQixFQUFFLEtBQWE7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDM0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFBLDRCQUFhLEVBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9JLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNEVBQTRFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsU0FBUyxLQUFLLElBQUEsK0JBQXNCLEVBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxnRUFBZ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxzQkFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDOVksQ0FBQztJQUNMLENBQUM7SUFFRCxtcEJBQW1wQjtJQUMzb0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUE2RjtRQUNwSCxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsMEhBQTBIO1lBQzFILElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksT0FBTztvQkFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3pGLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVELG9QQUFvUDtJQUM1TyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsTUFBZ0M7UUFDakYsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBQSxtQ0FBdUIsRUFBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsSUFBSSxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDbkUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLDRIQUE0SDtZQUM1SCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xJLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakksSUFBQSx5QkFBVyxFQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pKLENBQUM7SUFFRCxtTEFBbUw7SUFDM0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsTUFBMkM7UUFDNUUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNySSxvSEFBb0g7UUFDcEgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNktBQTZLO0lBQ3JLLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxNQUFpQzs7UUFDbEYsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGNBQWMsbURBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixJQUFBLG1DQUF1QixFQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLGtFQUFrRTtZQUNsRSxJQUFJLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsT0FBTztRQUNoRSxDQUFDO1FBQ0QsbVNBQW1TO1FBQ25TLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELHlZQUF5WTtJQUNsWSxrQkFBa0I7UUFDckIsbUdBQW1HO1FBQ25HLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkIsT0FBTyxHQUFHLEdBQUcsK0JBQXVCLENBQUM7SUFDekMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQW1DO1FBQzFELElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUM5QixJQUFJLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsWUFBWSxDQUFBLElBQUksQ0FBQyxJQUFBLCtCQUFtQixFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO2dCQUFFLFNBQVM7WUFDMUYsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVELG9OQUFvTjtJQUM1TSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsU0FBaUI7O1FBQ3JFLHVSQUF1UjtRQUN2UixNQUFBLE1BQUEsSUFBSSxDQUFDLE1BQU0sMENBQUUsY0FBYyxtREFBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksU0FBUyxHQUFHLEdBQUcsS0FBSywyQkFBWSxDQUFDO1FBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDRHQUE0RyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoSixDQUFDO1FBQ0QsZ09BQWdPO1FBQ2hPLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQixxVkFBcVY7WUFDclYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BILENBQUM7UUFDRCxJQUFBLHlCQUFXLEVBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDOUksSUFBSSxTQUFTO1lBQUUsT0FBTztRQUN0QixJQUFJLEtBQUssR0FBRyxJQUFBLHVCQUFRLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsNk1BQTZNO1FBQzdNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUEsNEJBQWEsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUMzRCx3UEFBd1A7WUFDeFAsSUFBSSxJQUFzQixDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDeEcsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkksQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztnQkFDekIsSUFBQSw2QkFBZSxFQUFDLHVCQUF1QixHQUFHLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6SixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0tBQWdLO0lBQ3hKLGFBQWE7UUFDakIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNkpBQTZKO0lBQ3JKLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFlO1FBQzVDLEtBQUssSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFBLDJCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQTVpQ0QsOEJBNGlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25GaWxlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uRmlsZVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IGxvZ011dGF0aW9uLCBsb2dTdG9yYWdlRXJyb3IsIGxvZ1N0b3JhZ2VXYXJuIH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuLy8gc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGFuIHVuZGVsZXRlIGNhcnJpZXMgbm8gZGF0YSAtIHRoaXMgc2luZ2xlIGlnbm9yZWQgYnl0ZSBzYXRpc2ZpZXMgdGhlIHdpcmVcbmNvbnN0IFVOREVMRVRFX1BMQUNFSE9MREVSID0gQnVmZmVyLmZyb20oWzFdKTtcblxuLy8gRGVsZXRpb24gaGlzdG9yeTogZGVsZXRlZCBmaWxlcyBrZWVwIHRoZWlyIGJ5dGVzIG9uIGRpc2sgKG1hcmtlZCBpbiB0aGUgaW5kZXgpIHVudGlsIHRoZSBoaXN0b3J5IG91dGdyb3dzIG1heChISVNUT1JZX01JTl9CWVRFUywgbGl2ZSBieXRlcyAqIGhpc3RvcnkgZmFjdG9yKSAtIHNlZSBTdG9yZVN5bmMuZW5mb3JjZUhpc3RvcnlMaW1pdFxuZXhwb3J0IGNvbnN0IEhJU1RPUllfTUlOX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBISVNUT1JZX0ZBQ1RPUiA9IDE7XG4vKiogVGhlIG11bHRpcGxlIG9mIGEgc3RvcmUncyBsaXZlIGJ5dGVzIGl0cyBkZWxldGlvbiBoaXN0b3J5IG1heSBncm93IHRvLiBBc3luYyBzbyBpdCBjYW4gbGF0ZXIgYmVjb21lIGR5bmFtaWMgYW5kIHVzZXItY29uZmlndXJhYmxlOyBmb3Igbm93IGl0IGlzIGEgY29uc3RhbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGlzdG9yeUZhY3RvcigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBISVNUT1JZX0ZBQ1RPUjtcbn1cblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGxvZ1N0b3JhZ2VFcnJvcihtZXNzYWdlKTtcbn1cblxuLy8gVGhlIGJ1Y2tldCBzdG9yZSwgYW5kIHRoZSBvbmx5IG9uZTogZXZlcnkgYnVja2V0IGEgc2VydmVyIGhvbGRzIGlzIHNlcnZlZCBieSB0aGVzZSwgb25lIHBlciBzdG9yZSBuYW1lIGluIGl0cyByb3V0aW5nIGNvbmZpZy4gSXRzIHNvdXJjZXMgYXJlIHBsYWluIElBcmNoaXZlcyAtIHRoZSBmaXJzdCBpcyBhbHdheXMgdGhlIHN0b3JlJ3Mgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIGNvbmZpZ3VyZWQgcGVlcnMgKHNlZSBjcmVhdGVTdG9yZVNvdXJjZSkgLSBzbyBcIm5vIHN5bmNocm9uaXphdGlvblwiIGlzIHNpbXBseSBhIHN0b3JlIHdpdGggbm8gcGVlcnMsIG5vdCBhIGRpZmZlcmVudCBraW5kIG9mIHN0b3JlLlxuZXhwb3J0IGNsYXNzIEJsb2JTdG9yZSB7XG4gICAgLy8g4pSA4pSAIHN0YXRlIOKUgOKUgFxuICAgIC8vIFNldCBvbmNlIHRoZSBzdG9yZSBpcyBzaHV0dGluZyBkb3duOyBldmVyeSBsb29wIGl0IG93bnMgKGFuZCBTdG9yZVN5bmMncyBtYWludGVuYW5jZSBsb29wcykgc3RvcHMgb24gaXRcbiAgICBwdWJsaWMgc3RvcHBlZCA9IHsgc3RvcDogZmFsc2UgfTtcbiAgICAvLyBXaGV0aGVyIGluaXQgaGFzIHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIGEgbmV3bHkgYWRkZWQgc291cmNlIGNhbiBzdGFydCBzY2FubmluZyBpbW1lZGlhdGVseVxuICAgIHB1YmxpYyBzeW5jU3RhcnRlZCA9IGZhbHNlO1xuICAgIC8qKiBJdHMgc291cmNlcywgaW4gY29uZmlnIG9yZGVyOiBzbG90IDAgaXMgYWx3YXlzIGl0cyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgcGVlcnMgaXQgc3luY2hyb25pemVzIHdpdGguIEZpbGxlZCBieSB1cGRhdGVTb3VyY2VzLCB3aGljaCBpcyBhbHNvIGhvdyB0aGV5IGNoYW5nZS4gVGhlIHN0b3JlIE9XTlMgdGhlbSAtIHdyaXRlcyBwaWNrIGFtb25nIHRoZW0sIHJlYWRzIHJlc29sdmUgaG9sZGVycyB0aHJvdWdoIHRoZW0gLSBhbmQgU3RvcmVTeW5jIG9ubHkgc2NhbnMgd2hhdGV2ZXIgaXMgaW4gaGVyZSBhdCB0aGUgdGltZS4gKi9cbiAgICBwdWJsaWMgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IFtdO1xuICAgIC8vIFVwbG9hZHMgaW1tdXRhYmlsaXR5IGFscmVhZHkgZGVjaWRlZCBhZ2FpbnN0OiB0aGUgY2xpZW50IGlzIG1pZC1zdHJlYW0gYnkgdGhlIHRpbWUgd2Uga25vdywgc28gaXQga2VlcHMgc2VuZGluZyBhbmQgZXZlcnkgcGFydCBpcyBkcm9wcGVkXG4gICAgcHJpdmF0ZSBkaXNjYXJkZWRVcGxvYWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBuZXh0RGlzY2FyZGVkVXBsb2FkID0gMTtcbiAgICAvLyBUaGUgcGVyc2lzdGVudCBpZGVudGl0aWVzIGJlaGluZCBJbmRleEVudHJ5LnNvdXJjZXNMaXN0SW5kZXggKHNlZSBTb3VyY2VzTGlzdClcbiAgICBwcml2YXRlIHNvdXJjZXNMaXN0OiBTb3VyY2VzTGlzdDtcbiAgICAvLyBQZXIgc2xvdDogdGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiB0aGF0IHNsb3QncyBVUkwsIGZpbGxlZCBieSByZWdpc3RlclNsb3QgYmVmb3JlIHRoZSBzbG90J3Mgc3luYyBydW5zXG4gICAgcHJpdmF0ZSBzbG90U291cmNlc0xpc3RJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgc2xvdFJlZ2lzdHJhdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIC8vIEV2ZXJ5IGZpbGUgd2Uga25vdyBvZiwgaW4gbWVtb3J5LCB3aXRoIGFuIGFwcGVuZC1vbmx5IGxvZyBvZiB0aGUgY2hhbmdlcyBiZWhpbmQgaXQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiBBIG5ldyBmaWxlIG5hbWUgZWFjaCB0aW1lIHRoZSBlbnRyeSBmb3JtYXQgY2hhbmdlcyBnZW5lcmF0aW9uOiB0aGUgcHJldmlvdXMgb25lcyBjYW5ub3QgYmUgcmVhZCwgYW5kIGEgc2NhbiByZWJ1aWxkcyB0aGUgaW5kZXggYW55d2F5LCBzbyB0aGV5IGFyZSBzaW1wbHkgbmV2ZXIgcmVhZCBhZ2Fpbi5cbiAgICBwcml2YXRlIGluZGV4OiBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT47XG4gICAgLyoqIEtlZXBpbmcgdGhlIGluZGV4IGluIGFncmVlbWVudCB3aXRoIHRoZSBzb3VyY2VzOiBzY2FubmluZywgcHVsbGluZywgcHVzaGluZywgYW5kIHRoZSBtYWludGVuYW5jZSB0aGF0IGZvbGxvd3MgZnJvbSBob2xkaW5nIGFuIGluZGV4IChkaXNrLWxpbWl0IGV2aWN0aW9uLCB0b21ic3RvbmUgZXhwaXJ5KS4gSXQgcmVhZHMgYW5kIHdyaXRlcyB0aGlzIHN0b3JlJ3MgaW5kZXggYW5kIHNvdXJjZXMgLSBpdCBkb2VzIG5vdCBvd24gdGhlbS4gKi9cbiAgICBwdWJsaWMgc3luYzogU3RvcmVTeW5jO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8vIFB1YmxpYyBmb3IgU3RvcmVTeW5jLCB3aGljaCBsb2dzIGl0IHdpdGggZXZlcnl0aGluZyBpdCBkb2VzXG4gICAgICAgIHB1YmxpYyBmb2xkZXI6IHN0cmluZyxcbiAgICAgICAgLyoqIFRoZSBuYW1lIHRoaXMgc3RvcmUgYW5zd2VycyB0byAoc2VlIENvbW1vbkNvbmZpZy5uYW1lKSAtIHRoZSBlbnRyaWVzIG9mIHRoZSByb3V0aW5nIGNvbmZpZyB0aGF0IGNhcnJ5IGl0IGFyZSB0aGUgb25lcyB0aGF0IGNvbmZpZ3VyZSBpdCwgYW5kIHRoZSByZXN0IGFyZSBpdHMgcGVlcnMuICovXG4gICAgICAgIHB1YmxpYyBzdG9yZU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc/OiB7XG4gICAgICAgICAgICAvKiogV2hldGhlciBhIGNvbmZpZyBlbnRyeSBpcyBUSElTIFNFUlZFUiAoc2FtZSBhY2NvdW50LCBzYW1lIGJ1Y2tldCwgb3VyIG93biBhZGRyZXNzKS4gSW5qZWN0ZWQgYmVjYXVzZSBhIHN0b3JlIGtub3dzIG5vdGhpbmcgYWJvdXQgc2VydmVycyAtIGl0IG9ubHkgbmVlZHMgdG8gdGVsbCBpdHMgb3duIGVudHJpZXMgYXBhcnQgZnJvbSBpdHMgcGVlcnMnLiBBYnNlbnQgbWVhbnMgbm90aGluZyBpcyB1cywgd2hpY2ggaXMgd2hhdCBhIGJhcmUgc3RvcmUgKG5vIHNlcnZlciBhcm91bmQgaXQpIHdhbnRzLiAqL1xuICAgICAgICAgICAgaXNTZWxmPzogKHNvdXJjZTogU291cmNlQ29uZmlnKSA9PiBib29sZWFuO1xuICAgICAgICAgICAgLyoqIEJ1aWxkcyBvbmUgb2YgaXRzIHNvdXJjZXMuIEluamVjdGVkIGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCBiZWNhdXNlIHRoZSBkZWxheSBpdCBpcyBjcmVhdGVkIHdpdGggaXMgdGhpcyBzdG9yZSdzIHBvbGljeS4gKi9cbiAgICAgICAgICAgIGNyZWF0ZVNvdXJjZT86IChjb25maWc6IHsgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnOyB3cml0ZURlbGF5OiBudW1iZXIgfSkgPT4gSUFyY2hpdmVzO1xuICAgICAgICAgICAgLyoqIEhhbmRzIGEgcnVubmluZyBzb3VyY2UgYSBjaGFuZ2VkIGNvbmZpZywgc28gYW4gZW5kcG9pbnQgd2UgYWxyZWFkeSB0YWxrIHRvIGlzIG5ldmVyIHJlYnVpbHQganVzdCBiZWNhdXNlIGEgZmxhZyBtb3ZlZC4gKi9cbiAgICAgICAgICAgIGFwcGx5U291cmNlPzogKHNvdXJjZTogSUFyY2hpdmVzLCBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCwgd3JpdGVEZWxheTogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEga2V5J3MgaW5kZXggZW50cnkgY2hhbmdlcyAob3VyIG93biB3cml0ZXMgQU5EIGZpbGVzIHB1bGxlZCBpbiB2aWEgc3luY2hyb25pemF0aW9uKSDigJQgaG93IHRoZSBzdG9yYWdlIHNlcnZlciBub3RpY2VzIHJvdXRpbmcgY29uZmlnIHVwZGF0ZXMuXG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZD86IChrZXk6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBDYWxsZWQgZXZlcnkgdGltZSB0aGlzIHN0b3JlIGFwcGxpZXMgYSByb3V0aW5nIGNvbmZpZyB0byBpdHNlbGYgKHN0YXJ0dXAsIGFuIG9wZXJhdG9yJ3Mgd3JpdGUsIGEgcGVlcidzIGNvcHkgYXJyaXZpbmcpIC0gdGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIHRoZSBzZXJ2ZXIgYXJtcyB3aW5kb3ctYm91bmRhcnkgc2NhbnMgZnJvbSBpdC4gKi9cbiAgICAgICAgICAgIG9uUm91dGluZ0FwcGxpZWQ/OiAocm91dGluZzogUmVtb3RlQ29uZmlnKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEFza3MgdGhlIGNsaWVudCB3aG9zZSByZXF1ZXN0IGNyZWF0ZWQgdGhpcyBzdG9yZSB3aGF0IHJvdXRpbmcgY29uZmlnIGl0IGludGVuZGVkIGZvciBvdXIgbmFtZS4gT25seSB1c2VkIHdoZW4gaW5pdCBmaW5kcyBOTyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXI6IGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBzbyB0aGUgcmVxdWVzdGVyIGhhcyB0aGF0IGNvbmZpZyAtIGFza2luZyBmb3IgaXQgbGF6aWx5IGlzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHBhc3NpbmcgdGhlIGNvbmZpZyBvbiBldmVyeSBjYWxsLCB3aXRob3V0IHRoZSBwZXItY2FsbCBraWxvYnl0ZXMuICovXG4gICAgICAgICAgICByZXF1ZXN0Um91dGluZ0NvbmZpZz86ICgpID0+IFByb21pc2U8UmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkPjtcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHdyaXRlIChcIm9yaWdpbmFsXCIpIGFuZCBldmVyeSB3cml0ZSB0aGF0IGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNvdXJjZXMgKFwiZmx1c2hlZFwiKS4gRmFzdCB3cml0ZXMgY29hbGVzY2UsIHNvIHRoZSB0d28gY291bnRzIGRpZmZlci5cbiAgICAgICAgICAgIG9uV3JpdGVDb3VudGVkPzogKGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyOiBcInN5bmMgZ2V0XCIgaXMgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSAodGhlIGJhY2tibGF6ZSBkb3dubG9hZCBiaWxsKSwgXCJzeW5jIHNldFwiIGlzIGJ5dGVzIHB1c2hlZCB0byBvbmUuIEluamVjdGVkIGJlY2F1c2Ugc3luYyB0cmFmZmljIG5ldmVyIHBhc3NlcyB0aHJvdWdoIHRoZSBBUEkgY29udHJvbGxlciwgc28gbm90aGluZyBlbHNlIGNhbiBjb3VudCBpdC4gKi9cbiAgICAgICAgICAgIG9uU3luY1RyYW5zZmVyPzogKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBSZXNvbHZlcyBhIHBlcnNpc3RlZCBzb3VyY2UgVVJMIChzZWUgQXJjaGl2ZXNTb3VyY2UudXJsKSB0byBhIGNhY2hlZCBJQXJjaGl2ZXMsIHNvIGVudHJpZXMgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBjb25maWd1cmVkIGNhbiBzdGlsbCBiZSByZWFkXG4gICAgICAgICAgICByZXNvbHZlU291cmNlVXJsPzogKHVybDogc3RyaW5nKSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzTGlzdCA9IG5ldyBTb3VyY2VzTGlzdChwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwic291cmNlc0xpc3QudHh0XCIpKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT4ocGF0aC5qb2luKGZvbGRlciwgXCJpbmRleFwiLCBcImJsb2JJbmRleDMubG9nXCIpKTtcbiAgICAgICAgdGhpcy5zeW5jID0gbmV3IFN0b3JlU3luYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZyA9IG5ldyBTdG9yZUNvbmZpZyhzdG9yZU5hbWUsIFtdKTtcbiAgICAgICAgdGhpcy5vd25EaXNrID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH1cblxuICAgIC8qKiBUaGlzIHN0b3JlJ3MgZm9sZGVyLCB1bndyYXBwZWQ6IHRoZSBzYW1lIGJ5dGVzIHNsb3QgMCBzZXJ2ZXMsIGJ1dCByZWFjaGVkIHdpdGhvdXQgaXRzIHdyaXRlIGRlbGF5LiBVc2VkIGZvciB0aGUgdHdvIHRoaW5ncyB0aGF0IGNhbm5vdCBnbyB0aHJvdWdoIGEgYnVmZmVyZWQgc291cmNlIC0gcmVhZGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIGJlZm9yZSB3ZSBoYXZlIGFueSBzb3VyY2VzLCBhbmQgc3RyZWFtaW5nIGEgbGFyZ2UgdXBsb2FkIHRoYXQgbXVzdCBub3Qgc2l0IGluIG1lbW9yeS4gKi9cbiAgICBwcml2YXRlIG93bkRpc2s6IEFyY2hpdmVzRGlzaztcblxuICAgIC8qKiBXaGF0IHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCB0byBiZS4gSXQgb3ducyB0aGlzOiB0aGUgcm91dGluZyBjb25maWcgaXMgYSBmaWxlIElOIHRoZSBzdG9yZSwgc28gdGhlIHN0b3JlIHJlYWRzIGl0LCBhcHBsaWVzIGl0IHRvIGl0c2VsZiwgYW5kIHJlLWFwcGxpZXMgaXQgd2hlbmV2ZXIgdGhlIGZpbGUgY2hhbmdlcyAtIGJ5IG91ciBvd24gd3JpdGUsIG9yIGJ5IGEgcGVlcidzIGNvcHkgYXJyaXZpbmcgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIHN0b3JlQ29uZmlnOiBTdG9yZUNvbmZpZztcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBsYXN0IGFwcGxpZWQsIHNvIGEgd3JpdGUgb2YgYW4gaWRlbnRpY2FsIChvciBvbGRlcikgb25lIGlzIG5vdCByZS1hcHBsaWVkXG4gICAgcHJpdmF0ZSBhcHBsaWVkUm91dGluZ1ZlcnNpb24gPSAtMTtcbiAgICAvLyAuLi5hbmQgdGhlIGNvbmZpZyBpdHNlbGYsIHNvIGEgcmVqZWN0aW9uIGNhbiBzYXkgZXhhY3RseSB3aGF0IHRoZSBzdG9yZSBJUyBydW5uaW5nIGluc3RlYWQgb2YgZ3Vlc3NpbmdcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyAjcmVnaW9uIE1haW4gaW50ZXJmYWNlXG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBDb25maWd1cmUgZmlyc3Q6IHRoZSBjb25maWcgZGVjaWRlcyB3aGF0IHRoZSBzb3VyY2VzIEFSRSwgYW5kIGV2ZXJ5dGhpbmcgYmVsb3cgaXMgcGVyIHNvdXJjZS4gV2l0aCBubyBjb25maWcgYXQgYWxsIHRoYXQgaXMganVzdCBvdXIgb3duIGRpc2ssIHdoaWNoIGlzIGVub3VnaCB0byBzZXJ2ZSBhbmQgdG8gYmUgd3JpdHRlbiB0by5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgLy8gTm8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyIGF0IGFsbCAtIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGlzIHN0b3JlIHdhcyBqdXN0IENSRUFURUQgYnkgYSByZXF1ZXN0LCBiZWZvcmUgYW55IGNvbmZpZyB3cml0ZSByZWFjaGVkIGl0LiBUaGUgcmVxdWVzdGVyIGtub3dzIGV4YWN0bHkgd2hhdCBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLCBzbyBhc2sgaXQuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGggJiYgdGhpcy5jb25maWc/LnJlcXVlc3RSb3V0aW5nQ29uZmlnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBwcm92aWRlZCA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3RSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgaW5pdGlhbGl6ZWQgd2l0aCBubyBjb25maWd1cmF0aW9uOyB0aGUgcmVxdWVzdGluZyBjbGllbnQgcHJvdmlkZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocHJvdmlkZWQpfSAtIGFkb3B0aW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmFpZ2h0IG9udG8gdGhlIGRpc2ssIG5vdCB0aHJvdWdoIHNldCgpOiBzZXQgd2FpdHMgZm9yIGluaXQsIHdoaWNoIGlzIHdoYXQgaXMgcnVubmluZyByaWdodCBub3dcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vd25EaXNrLnNldChST1VUSU5HX0ZJTEUsIEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhwcm92aWRlZCkpLCB7IGxhc3RNb2RpZmllZDogTWF0aC5yb3VuZChEYXRlLm5vdygpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dTdG9yYWdlV2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQXNraW5nIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBmb3IgdGhlIHJvdXRpbmcgY29uZmlnIG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQgLSBydW5uaW5nIHVuY29uZmlndXJlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclNsb3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWZ0ZXIgdGhlIHNsb3RzLCB3aGljaCBpcyB3aGF0IGluZGV4IGVudHJpZXMgbmFtZSBhcyB0aGVpciBob2xkZXJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3luYy5zdGFydCgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmUtcmVhZHMgdGhlIHJvdXRpbmcgY29uZmlnIG91dCBvZiB0aGlzIHN0b3JlIGFuZCBhcHBsaWVzIGl0IHRvIGl0c2VsZi4gQ2FsbGVkIGF0IHN0YXJ0dXAgYW5kXG4gICAgICogd2hlbmV2ZXIgdGhhdCBmaWxlIGNoYW5nZXMgaGVyZSAtIHdoaWNoIGlzIHRoZSBPTkUgbWVjaGFuaXNtOiBhIGNvbmZpZyB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yXG4gICAgICogYW5kIGEgY29uZmlnIHB1bGxlZCBvZmYgYSBwZWVyIGFyZSB0aGUgc2FtZSBldmVudCwgYSB3cml0ZSBvZiB0aGF0IHBhdGggaW50byB0aGlzIHN0b3JlLlxuICAgICAqXG4gICAgICogQSBzdG9yZSB3aXRoIG5vIHJvdXRpbmcgY29uZmlnIGNvbmZpZ3VyZXMgaXRzZWxmIGFzIGl0cyBvd24gZGlzaywgdmFsaWQgYWx3YXlzLCBmb3IgdGhlIHdob2xlXG4gICAgICoga2V5IHNwYWNlLiBUaGF0IGlzIGEgY29tcGxldGUsIHdvcmtpbmcgc3RvcmUgLSBpdCBqdXN0IGhhcyBub2JvZHkgdG8gc3luY2hyb25pemUgd2l0aCAtIGFuZCBpdFxuICAgICAqIGlzIHdoYXQgbGV0cyBhIHN0b3JlIGV4aXN0IGJlZm9yZSBpdCBoYXMgZXZlciBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGFwcGx5Um91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCB0aGlzLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIGxldCBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSA9IFtdO1xuICAgICAgICBsZXQgcGVlcnM6IFNvdXJjZUNvbmZpZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nPy5zb3VyY2VzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lICYmIHRoaXMuY29uZmlnPy5pc1NlbGY/Lihzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHNvdXJjZSBhcyBIb3N0ZWRDb25maWcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVlcnMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0aW5nICYmICFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nU3RvcmFnZVdhcm4oYFRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9KSBkb2VzIG5vdCBuYW1lIHRoaXMgc3RvcmUgKCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSkgYXMgb25lIG9mIG91cnMsIHNvIGl0IHN0YXlzIGEgZGlzay1vbmx5IHN0b3JlYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXZpb3VzVmVyc2lvbiA9IHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IHJvdXRpbmcgJiYgZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKSB8fCAtMTtcbiAgICAgICAgaWYgKG5ld1ZlcnNpb24gIT09IHByZXZpb3VzVmVyc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBhZG9wdGVkIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtwcmV2aW91c1ZlcnNpb259IC0+ICR7bmV3VmVyc2lvbn06ICR7ZW50cmllcy5sZW5ndGh9IGVudHIke2VudHJpZXMubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG9mIG91cnMgJHtKU09OLnN0cmluZ2lmeShlbnRyaWVzLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9LCAke3BlZXJzLmxlbmd0aH0gcGVlcihzKWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcudXBkYXRlKGVudHJpZXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZXModGhpcy5wbGFuU291cmNlcyhwZWVycykpO1xuICAgICAgICB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmcgPSByb3V0aW5nO1xuICAgICAgICBpZiAocm91dGluZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWc/Lm9uUm91dGluZ0FwcGxpZWQ/Lihyb3V0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBhcyB0aGlzIHN0b3JlIGhvbGRzIGl0LCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgZm9sZGVyOiB0aGUgc3RvcmUgbWF5IGJlIGNvbmZpZ3VyaW5nIGl0c2VsZiBiZWZvcmUgaXQgaGFzIHNjYW5uZWQgYW55dGhpbmcsIGFuZCB0aGlzIGZpbGUgaXMgd2hhdCBkZWNpZGVzIHdoYXQgYSBzY2FuIHdvdWxkIGV2ZW4gdGFsayB0b1xuICAgIHByaXZhdGUgYXN5bmMgcmVhZFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLm93bkRpc2suZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nU3RvcmFnZUVycm9yKGBJZ25vcmluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn06IGl0IGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSB2ZXJzaW9uIG9mIHRoZSByb3V0aW5nIGNvbmZpZyB0aGlzIHN0b3JlIGlzIHJ1bm5pbmcsIHNvIGEgY29weSBmb3VuZCBvbiBhIHBlZXIgaXMgb25seSB0YWtlbiB3aGVuIGl0IGlzIGdlbnVpbmVseSBuZXdlci4gLTEgbWVhbnMgaXQgaGFzIG5vbmUuICovXG4gICAgcHVibGljIHJvdXRpbmdWZXJzaW9uKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBBcHBseWluZyBpdCB0b3VjaGVzIHRoZSBzb3VyY2VzLCBzbyBpdCBpcyBzZXJpYWxpemVkIGJlaGluZCB3aGF0ZXZlciBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcgcmF0aGVyIHRoYW4gaW50ZXJsZWF2aW5nIHdpdGggaXRcbiAgICBwcml2YXRlIHJvdXRpbmdBcHBsaWVzOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcHVibGljIHJlYXBwbHlSb3V0aW5nQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMucm91dGluZ0FwcGxpZXMudGhlbigoKSA9PiB0aGlzLmFwcGx5Um91dGluZ0NvbmZpZygpKTtcbiAgICAgICAgdGhpcy5yb3V0aW5nQXBwbGllcyA9IG5leHQuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgdm9pZCBuZXh0LmNhdGNoKChlOiBFcnJvcikgPT4gbG9nU3RvcmFnZUVycm9yKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgaW4gc3RvcmUgJHt0aGlzLmZvbGRlcn0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfVxuXG4gICAgLy8gT3VyIG93biBkaXNrIGZpcnN0IChhbHdheXMpLCB0aGVuIGV2ZXJ5IHBlZXIgd2hvc2Ugcm91dGUgb3ZlcmxhcHMgb3VycyAtIHRoZSBzb3VyY2VzIHRoaXMgc3RvcmUgc3luY2hyb25pemVzIHdpdGgsIGFzIGl0cyBvd24gY29uZmlnIGRlc2NyaWJlcyB0aGVtXG4gICAgcHJpdmF0ZSBwbGFuU291cmNlcyhwZWVyczogU291cmNlQ29uZmlnW10pOiBCbG9iU291cmNlU3BlY1tdIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzLnN0b3JlQ29uZmlnLmN1cnJlbnQoKTtcbiAgICAgICAgbGV0IG1ha2VTcGVjID0gKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXSwgcm91dGU6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIG5vRnVsbFN5bmM6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBCbG9iU291cmNlU3BlYyA9PiB7XG4gICAgICAgICAgICBsZXQgd3JpdGVEZWxheSA9IHNvdXJjZVdyaXRlRGVsYXkoeyBzb3VyY2VDb25maWcsIGZhc3Q6IHNlbGYuZmFzdCwgd3JpdGVEZWxheTogc2VsZi53cml0ZURlbGF5IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZGVudGl0eTogc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgICAgICB1cmw6IHNvdXJjZVBlcnNpc3RlbnRVcmwoc291cmNlQ29uZmlnLCB0aGlzLmZvbGRlciksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIHJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlOiBzb3VyY2VDb25maWc/LmludGVybWVkaWF0ZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VDb25maWcsXG4gICAgICAgICAgICAgICAgY3JlYXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjcmVhdGVkID0gdGhpcy5jb25maWc/LmNyZWF0ZVNvdXJjZT8uKHsgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5IH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBzdG9yZSBoYXMgbm8gd2F5IHRvIGJ1aWxkIHNvdXJjZXMsIHNvIGl0IGNhbm5vdCB1c2UgJHtKU09OLnN0cmluZ2lmeShzb3VyY2VDb25maWc/LnVybCB8fCB0aGlzLmZvbGRlcil9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFBhc3MgY3JlYXRlU291cmNlLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXBwbHlDb25maWc6IChzb3VyY2U6IElBcmNoaXZlcykgPT4gdGhpcy5jb25maWc/LmFwcGx5U291cmNlPy4oc291cmNlLCBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gT3VyIG93biBkaXNrIGFjY2VwdHMgd3JpdGVzIHdoaWxlIEFOWSB3aW5kb3cgdGhpcyBzdG9yZSBob2xkcyBpcyBvcGVuOyB3aXRoIG5vIGNvbmZpZyBhdCBhbGwgaXQgaXMgc2ltcGx5IGFsd2F5cyB2YWxpZFxuICAgICAgICBsZXQgb3duV2luZG93cyA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdyk7XG4gICAgICAgIGxldCBzcGVjczogQmxvYlNvdXJjZVNwZWNbXSA9IFttYWtlU3BlYyh1bmRlZmluZWQsIG93bldpbmRvd3MubGVuZ3RoICYmIG93bldpbmRvd3MgfHwgW0ZVTExfVkFMSURfV0lORE9XXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpXTtcbiAgICAgICAgLy8gT25lIHNwZWMgcGVyIGVuZHBvaW50LCBjYXJyeWluZyBhbGwgb2YgaXRzIHdpbmRvd3M6IGEgc3dpdGNob3ZlciBzcGxpdHMgb25lIHdpbmRvdyBhcm91bmQgYW4gaW50ZXJtZWRpYXRlLCBhbmQgdGhhdCBpcyBzdGlsbCBvbmUgc291cmNlIHRvIHVzXG4gICAgICAgIGxldCBieUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIEJsb2JTb3VyY2VTcGVjPigpO1xuICAgICAgICBmb3IgKGxldCBwZWVyIG9mIHBlZXJzKSB7XG4gICAgICAgICAgICBsZXQgc2hhcmVkID0gcm91dGVJbnRlcnNlY3Rpb24oc2VsZi5yb3V0ZSwgcGVlci5yb3V0ZSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBzb3VyY2VJZGVudGl0eShwZWVyKTtcbiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGJ5SWRlbnRpdHkuZ2V0KGlkZW50aXR5KTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnZhbGlkV2luZG93cy5wdXNoKHBlZXIudmFsaWRXaW5kb3cpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNwZWMgPSBtYWtlU3BlYyhwZWVyLCBbcGVlci52YWxpZFdpbmRvd10sIHNoYXJlZCwgcGVlci5ub0Z1bGxTeW5jIHx8IHNlbGYubm9GdWxsU3luYyk7XG4gICAgICAgICAgICBieUlkZW50aXR5LnNldChpZGVudGl0eSwgc3BlYyk7XG4gICAgICAgICAgICBzcGVjcy5wdXNoKHNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGVjcztcbiAgICB9XG5cbiAgICAvLyBTdG9wcyBhbGwgc3luY2hyb25pemF0aW9uIHNjYW5zL3BvbGxzIGFuZCBmbHVzaGVzIHBlbmRpbmcgd3JpdGVzLiBPbmx5IHVzZWQgd2hlbiB0aGUgc3RvcmUgZ2VudWluZWx5IGNhbm5vdCBjb250aW51ZSAoaXRzIHJvdXRlIG9yIGRpc2sgbGltaXQgY2hhbmdlZCwgcHJvY2VzcyBzaHV0ZG93bikgLSByb3V0aW5lIGNvbmZpZyBjaGFuZ2VzIGdvIHRocm91Z2ggdXBkYXRlU291cmNlcyBpbnN0ZWFkLCB3aGljaCB0aGUgc3RvcmUgc3Vydml2ZXMuXG4gICAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RvcHBlZC5zdG9wID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zeW5jLnN0b3AoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5mbHVzaERlbGF5ZWRXcml0ZXModHJ1ZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5kZXguZmx1c2goKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Mihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW50ZXJuYWw/OiBib29sZWFuOyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW47IGluY2x1ZGVNYXJrZWQ/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWwyKGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgbGV0IHJhbmdlID0gY29uZmlnLnJhbmdlO1xuICAgICAgICAvLyBOb3QgaW4gdGhlIGluZGV4IG1lYW5zIGl0IGRvZXMgbm90IGV4aXN0IGhlcmU6IHRoZSBpbmRleCBJUyB0aGUgYW5zd2VyLCBhbmQgc2Nhbm5pbmcgaGVhbHMgaXQgb24gaXRzIG93biBzY2hlZHVsZS4gQW4gZW50cnkgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGxpc3QgaXMgc3RpbGwgdmFsaWQgLSBnZXRFbnRyeUhvbGRlciByZXNvbHZlcyB0aGUgcGVyc2lzdGVkIFVSTCBkaXJlY3RseSwgYW5kIGdldDIncyBmYWxsYmFjayBsb29wIGNvdmVycyBhIGhvbGRlciB0aGF0IGlzIGdvbmUgZW50aXJlbHkuXG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICAvLyBBIG1hcmtlZCBkZWxldGlvbiBzdGlsbCBoYXMgaXRzIGJ5dGVzLCBhbmQgdGhlIGtlcHQgdmFsdWUgc2F5cyB3aGVyZSAtIHNvIGFuIGluY2x1ZGVNYXJrZWQgcmVhZCBpcyBhIG5vcm1hbCByZWFkIHRocm91Z2ggdGhlIG1hcmtlZCBlbnRyeSAoaXQganVzdCBtdXN0IG5vdCBSRS1JTkRFWCBhbnl0aGluZzogc2VlIHRoZSBtYXJrZWRSZWFkIGd1YXJkcyBiZWxvdylcbiAgICAgICAgbGV0IG1hcmtlZFJlYWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFlbnRyeSAmJiBjb25maWcuaW5jbHVkZU1hcmtlZCkge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmdldE1hcmtlZEVudHJ5KGtleSk7XG4gICAgICAgICAgICBtYXJrZWRSZWFkID0gISFlbnRyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIEEgZGVsZXRpb24gaGFzIG5vIGJ5dGVzIC0gdGhlIHRvbWJzdG9uZSBJUyB0aGUgYW5zd2VyLCBzbyBhIGZsYWctY2FsbGVyIGdldHMgaXRzIHRpbWUgd2l0aCBlbXB0eSBkYXRhXG4gICAgICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSk7XG4gICAgICAgICAgICBpZiAoIWRlbGV0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIHdyaXRlVGltZTogZGVsZXRlZC53cml0ZVRpbWUsIHNpemU6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmMubm90ZUFjY2VzcyhrZXkpO1xuICAgICAgICBsZXQgaG9sZGVyQXJjaGl2ZXMgPSBhd2FpdCB0aGlzLmdldEVudHJ5SG9sZGVyKGVudHJ5KTtcbiAgICAgICAgbGV0IHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvbGRlckVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGhvbGRlckFyY2hpdmVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIGluY2x1ZGVUb21ic3RvbmVzOiB0aGUgaG9sZGVyIGFuc3dlcmluZyBcImRlbGV0ZWRcIiAoYSB0b21ic3RvbmUsIHdpdGggaXRzIHdyaXRlIHRpbWUpIG11c3QgYmUgZGlzdGluZ3Vpc2hhYmxlIGZyb20gXCJJIGxvc3QgdGhlIGZpbGVcIiAtIHRoZSBmb3JtZXIgaXMgYXV0aG9yaXRhdGl2ZSBhbmQgbXVzdCBOT1QgZmFsbCBiYWNrIHRvIG9sZGVyIGNvcGllcywgd2hpY2ggd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGlvbiBmb3IgdGhpcyByZWFkXG4gICAgICAgICAgICAgICAgbGV0IGFuc3dlciA9IGF3YWl0IGhvbGRlckFyY2hpdmVzLmdldDIoa2V5LCB7IHJhbmdlLCBpbnRlcm5hbDogdHJ1ZSwgaW5jbHVkZVRvbWJzdG9uZXM6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiAhYW5zd2VyLmRhdGEubGVuZ3RoICYmICEocmFuZ2UgJiYgYW5zd2VyLnNpemUpICYmIGFuc3dlci53cml0ZVRpbWUgPj0gZW50cnkud3JpdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IGEgcmFuZ2VkIHJlYWQgb2YgYSByZWFsIGZpbGUgY2FuIGxlZ2l0aW1hdGVseSBiZSBlbXB0eSAocmFuZ2UgcGFzdCBFT0YpLCBzbyBvbmx5IHVucmFuZ2VkIGVtcHRpbmVzcyBtZWFucyB0b21ic3RvbmUvYWJzZW50XG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiAoYW5zd2VyLmRhdGEubGVuZ3RoIHx8IHJhbmdlICYmIGFuc3dlci5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGhvbGRlckVycm9yID0gZSBhcyBFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBSYW5nZWQgcmVhZHMgY2FuJ3QgcG9wdWxhdGUgYSBjYWNoZSAodGhleSdyZSBwYXJ0aWFsKSwgYW5kIGEgbWFya2VkIHJlYWQgbXVzdCBub3QgcmUtaW5kZXggYW55dGhpbmcgLSBjYWNoaW5nIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRlZCBrZXkgYXMgbGl2ZVxuICAgICAgICAgICAgaWYgKCFtYXJrZWRSZWFkICYmIHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCkgIT09IDAgJiYgIXJhbmdlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgLSBmYWxsaW5nIGJhY2sgdG8gYW5vdGhlciBzb3VyY2UncyBjb3B5IHdvdWxkIHN5bmNocm9uaXplIGl0IGJldHdlZW4gbm9kZXMgdGhyb3VnaCB0aGUgcmVhZCBwYXRoLCB3aGljaCBpdCBuZXZlciBpc1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBob2xkZXIgaXMgZG93biBvciBsb3N0IHRoZSBmaWxlLiBBTlkgb3RoZXIgc291cmNlJ3MgY29weSBiZWF0cyBubyB2YWx1ZSAtIGV2ZW4gYW4gT0xERVIgb25lIC0gYW5kIGl0J3MgY29waWVkIG9udG8gb3VyIGRpc2sgc28gdGhlIG5leHQgcmVhZCBkb2Vzbid0IGRlcGVuZCBvbiBsdWNrLlxuICAgICAgICBsZXQgaG9sZGVyU2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gaG9sZGVyU2xvdCB8fCAhdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGZhbGxiYWNrOiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXQyKGtleSwgeyBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAvLyBFbXB0eSBkYXRhIGNvdW50cyBhcyBhYnNlbnQgLSBhIHRvbWJzdG9uZSwgbm90IGNvbnRlbnQgKHRoaXMgcmVhZCBpcyB1bnJhbmdlZCwgc28gZW1wdGluZXNzIGlzIHVuYW1iaWd1b3VzKVxuICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIgJiYgYW5zd2VyLmRhdGEgJiYgYW5zd2VyLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrID0geyBkYXRhOiBhbnN3ZXIuZGF0YSwgd3JpdGVUaW1lOiBhbnN3ZXIud3JpdGVUaW1lLCBzaXplOiBhbnN3ZXIuc2l6ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmYWxsYmFjaykgY29udGludWU7XG4gICAgICAgICAgICAvLyBBIG1hcmtlZCByZWFkIG11c3Qgbm90IHJlLWluZGV4IGFueXRoaW5nIC0gY2FjaGluZyB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0ZWQga2V5IGFzIGxpdmVcbiAgICAgICAgICAgIGlmICghbWFya2VkUmVhZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FjaGVSZWFkKGtleSwgZmFsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRhdGEgPSBmYWxsYmFjay5kYXRhO1xuICAgICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoTWF0aC5taW4ocmFuZ2Uuc3RhcnQsIGRhdGEubGVuZ3RoKSwgTWF0aC5taW4ocmFuZ2UuZW5kLCBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YSwgd3JpdGVUaW1lOiBmYWxsYmFjay53cml0ZVRpbWUsIHNpemU6IGZhbGxiYWNrLnNpemUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9sZGVyRXJyb3IpIHRocm93IGhvbGRlckVycm9yO1xuICAgICAgICAvLyBUaGUgaG9sZGVyIGFuc3dlcmVkIFwibm90IHRoZXJlXCIgYW5kIG5vIG90aGVyIHNvdXJjZSBoYXMgaXQgZWl0aGVyOiB0aGUgZW50cnkgd2FzIHN0YWxlLiBGb3Jnb3R0ZW4gcmF0aGVyIHRoYW4gZGVsZXRlZCAtIG5vdGhpbmcgaGFwcGVuZWQgdG8gdGhpcyBmaWxlLCB3ZSB3ZXJlIHNpbXBseSB3cm9uZyBhYm91dCBob2xkaW5nIGl0LCBhbmQgc2F5aW5nIG90aGVyd2lzZSB3b3VsZCBwdXNoIGEgZGVsZXRpb24gb3V0IHRvIGV2ZXJ5b25lIGVsc2UuIChOZXZlciBmb3IgYSBtYXJrZWQgcmVhZDogcHVyZ2luZyB3b3VsZCBlcmFzZSB0aGUgZGVsZXRpb24ncyB0b21ic3RvbmUuKVxuICAgICAgICBpZiAoIW1hcmtlZFJlYWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVyZ2VJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbjsgdW5kZWxldGU/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHsgcGF0aDoga2V5LCBkYXRhIH0gPSBjb25maWc7XG4gICAgICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRW1wdHkgd3JpdGUgcmVmdXNlZDogc2V0IHdhcyBjYWxsZWQgd2l0aCBhbiBlbXB0eSBidWZmZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYW4gZW1wdHkgZmlsZSBJUyBhIGRlbGV0aW9uIGluIHRoaXMgc3lzdGVtIGFuZCB3b3VsZCByZWFkIGJhY2sgYXMgbWlzc2luZyAtIGNhbGwgZGVsIGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IHdyaXRlVGltZSA9IE1hdGgucm91bmQoY29uZmlnLmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBkZWZpbmVzIHRoZSB3aW5kb3dzL3JvdXRlcywgc28gdGhleSBjYW4ndCBwb3NzaWJseSBhcHBseSB0byBpdCAoYW5kIGl0IG5ldmVyIGZsb3dzIHRocm91Z2ggdmFsaWRhdGlvbikgLSBidXQgaXQgaGFzIGEgcnVsZSBvZiBpdHMgb3duLCB3aGljaCBpcyBvdXJzIHRvIGVuZm9yY2UgYmVjYXVzZSB0aGUgZmlsZSBpcyBvdXJzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRSb3V0aW5nQ29uZmlnV3JpdGFibGUoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgcm91dGUsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcudW5kZWxldGUpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIHVuZGVsZXRlZCAoaXQgY2Fubm90IGJlIGRlbGV0ZWQgaW4gdGhlIGZpcnN0IHBsYWNlKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy51bmRlbGV0ZUtleShrZXksIHdyaXRlVGltZSwgY29uZmlnLmludGVybmFsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUgJiYgdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcuZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgZXhlbXB0IGZvciB0aGUgc2FtZSByZWFzb24gaXQgc2tpcHMgZXZlcnkgb3RoZXIgY2hlY2s6IGl0IGlzIHRoZSBmaWxlIHRoYXQgREVGSU5FUyBvdXIgd2luZG93cyBhbmQgcm91dGVzLCBzbyBqdWRnaW5nIGl0IGJ5IHRoZSBjb25maWcgaXQgaXMgYWJvdXQgdG8gcmVwbGFjZSBpcyBob3cgYSBzdG9yZSBnZXRzIHN0dWNrIG9uIGEgY29uZmlnIGl0IGNhbiBuZXZlciBiZSB0b2xkIHRvIGxlYXZlXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnNldE9yRGVsZXRlKGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbChjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICAvLyBBIGRlbGV0aW9uIGxhbmRzIGluIGV4YWN0bHkgdGhlIHNhbWUgcGxhY2UgYSB3cml0ZSB3b3VsZCwgc28gaXQgaXMganVkZ2VkIHRoZSBzYW1lIHdheTogb25lIGFpbWVkIGF0IGEgc2hhcmQgd2UgZG9uJ3Qgc2VydmUgaXMganVzdCBhcyBpbnZpc2libGUgYXMgYSB3cml0ZSB0byBpdFxuICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgZ2V0Um91dGUoa2V5KSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZGVsZXRpb25zIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCBkZWxldGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgZ2V0Um91dGUoa2V5KSk7XG4gICAgICAgICAgICAvLyBzZXRJbnRlcm5hbCB0cmVhdHMgYW4gZW1wdHkgYnVmZmVyIGFzIGV4YWN0bHkgYSBkZWxldGlvbjogZGlzayByZW1vdmFsIHBsdXMgYSB0b21ic3RvbmUgaW5kZXggZW50cnksIG5vIGZhbi1vdXRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SW50ZXJuYWwoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZXMgYXJlIHdyaXRlcyAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSk6IHRoZSB0b21ic3RvbmUgaXMgb3JkZXJlZCBieSB3cml0ZSB0aW1lIGxpa2UgYW55IG90aGVyIHdyaXRlLCBwcm9wYWdhdGVzIHRocm91Z2ggc3luY2hyb25pemF0aW9uLCBhbmQgaXMgZXZlbnR1YWxseSBleHBpcmVkXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBCdWZmZXIuYWxsb2MoMCksIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgIH1cblxuICAgIC8qKiBBIG5vZGUtc2lkZSBtb3ZlOiB0aGUgYnl0ZXMgbmV2ZXIgdHJhdmVsIHRocm91Z2ggdGhlIGNsaWVudC4gRGVsaWJlcmF0ZWx5IGp1c3QgZ2V0MiArIHNldCArIGRlbCByYXRoZXIgdGhhbiBhIGRpc2sgcmVuYW1lLCBzbyB0aGUgZGVzdGluYXRpb24gd3JpdGUgcGFzc2VzIEVWRVJZIHJ1bGUgYSBzZXQgcGFzc2VzICh3aW5kb3dzLCByb3V0ZXMsIGltbXV0YWJpbGl0eSwgb25seS10YWtlLWxhdGVzdCwgaW5kZXgsIGZhbi1vdXQgdG8gcGVlcnMpIGFuZCB0aGUgZGVsZXRpb24gcHJvcGFnYXRlcyBhcyBhIG5vcm1hbCB0b21ic3RvbmUgLSBhIHJlbmFtZSB3b3VsZCBieXBhc3MgYWxsIG9mIGl0LiBUaGUgc2V0IHN0YW1wcyBmcmVzaCwgc28gdGhlIG1vdmVkIGZpbGUgYmVhdHMgYW55IHRvbWJzdG9uZSBhdCBpdHMgbmV3IHBhdGguICovXG4gICAgcHVibGljIGFzeW5jIG1vdmUoY29uZmlnOiB7IGZyb21QYXRoOiBzdHJpbmc7IHRvUGF0aDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGlmIChjb25maWcuZnJvbVBhdGggPT09IGNvbmZpZy50b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gUk9VVElOR19GSUxFIHx8IGNvbmZpZy50b1BhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgbW92ZWQgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW92ZSBzb3VyY2UgZG9lcyBub3QgZXhpc3QuIENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmZyb21QYXRoKX0gdG8gJHtKU09OLnN0cmluZ2lmeShjb25maWcudG9QYXRoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KHsgcGF0aDogY29uZmlnLnRvUGF0aCwgZGF0YTogcmVzdWx0LmRhdGEgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsKHsgcGF0aDogY29uZmlnLmZyb21QYXRoIH0pO1xuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBcIm1vdmVcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBjb25maWcuZnJvbVBhdGgsIHRvUGF0aDogY29uZmlnLnRvUGF0aCwgc2l6ZTogcmVzdWx0LmRhdGEubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICAvLyBOb3QgaW4gdGhlIGluZGV4IG1lYW5zIGl0IGRvZXMgbm90IGV4aXN0IGhlcmU6IHRoZSBpbmRleCBJUyB0aGUgYW5zd2VyLCBhbmQgc2Nhbm5pbmcgaGVhbHMgaXQgb24gaXRzIG93biBzY2hlZHVsZS4gQW4gZW50cnkgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGxpc3QgaXMgc3RpbGwgdmFsaWQgLSBnZXRFbnRyeUhvbGRlciByZXNvbHZlcyB0aGUgcGVyc2lzdGVkIFVSTCBkaXJlY3RseSwgYW5kIGdldDIncyBmYWxsYmFjayBsb29wIGNvdmVycyBhIGhvbGRlciB0aGF0IGlzIGdvbmUgZW50aXJlbHkuXG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHJldHVybiB7IHdyaXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH07XG4gICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhjb25maWc6IEZpbmRDb25maWcgJiB7IHByZWZpeDogc3RyaW5nIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgICAgIGxldCBpbmZvcyA9IG5ldyBNYXA8c3RyaW5nLCBBcmNoaXZlRmlsZUluZm8+KCk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgYXQgYWxsLCB3aGljaCBpcyB3aGF0IGEgbGlzdGluZyB3YW50czogYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZVxuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFNlZSBGaW5kQ29uZmlnLmludGVybmFsOiBhbiBlbnRyeSBoZWxkIGJ5IG9uZSBvZiBvdXIgT1RIRVIgc291cmNlcyBjYW5ub3QgYmUgc2VydmVkIHRvIGEgcGVlcidzIGludGVybmFsIHJlYWQsIHNvIGl0IG11c3Qgbm90IGJlIGxpc3RlZCB0byBvbmUgZWl0aGVyXG4gICAgICAgICAgICBpZiAoY29uZmlnLmludGVybmFsICYmIHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCkgIT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmluY2x1ZGVNYXJrZWQpIHtcbiAgICAgICAgICAgIC8vIEEga2V5IGlzIGxpdmUgT1IgbWFya2VkLCBuZXZlciBib3RoLCBzbyB0aGlzIGNhbm5vdCBjb2xsaWRlIHdpdGggdGhlIGxvb3AgYWJvdmVcbiAgICAgICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLm1hcmtlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaW5mb3Muc2V0KGtleSwgeyBwYXRoOiBrZXksIGNyZWF0ZVRpbWU6IGVudHJ5LndyaXRlVGltZSwgc2l6ZTogZW50cnkuc2l6ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZXMgPSBhcHBseUZpbmRJbmZvU2hhcGUoQXJyYXkuZnJvbShpbmZvcy52YWx1ZXMoKSksIHByZWZpeCwgeyBzaGFsbG93OiBjb25maWcuc2hhbGxvdywgdHlwZTogY29uZmlnLnR5cGUgfSk7XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIC8vIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIGNvbmZpZy50aW1lIOKAlCBzdHJhaWdodCBmcm9tIHRoZSBpbmRleC4gRmlsdGVycyBvbiB3aGVuIFdFIGxlYXJuZWQgb2YgdGhlIGNoYW5nZSAoY2hhbmdlZEF0KSwgc28gZmlsZXMgc3luY2hyb25pemVkIGxhdGUgKHdpdGggb2xkIHdyaXRlIHRpbWVzKSBhcmUgc3RpbGwgcmVwb3J0ZWQuIERlbGV0aW9ucyBBUkUgcmVwb3J0ZWQsIGFzIHNpemUtMCBlbnRyaWVzOiBhIGNhbGxlciByZWFkaW5nIGEgY2hhbmdlIGZlZWQgaGFzIHRvIGhlYXIgYWJvdXQgdGhlbSwgYW5kIHNpemUgMCBpcyBob3cgdGhlIGZlZWQgc2F5cyBcImdvbmVcIiAoYW4gZW1wdHkgZmlsZSBJUyBhIG1pc3NpbmcgZmlsZSkuIGNvbmZpZy5yb3V0ZXMgbGV0cyBhIHN0b3JlIHN5bmNpbmcgYSBwYXJ0aWFsIHNoYXJkIGFzayBmb3IganVzdCBpdHMgc2xpY2UuXG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMud2FpdEZvclJlcXVpcmVkU2NhbnMoKTtcbiAgICAgICAgbGV0IGluUm91dGVzID0gKGtleTogc3RyaW5nKSA9PiAhY29uZmlnLnJvdXRlcyB8fCBjb25maWcucm91dGVzLnNvbWUocm91dGUgPT4gcm91dGVDb250YWlucyhyb3V0ZSwgZ2V0Um91dGUoa2V5KSkpO1xuICAgICAgICBsZXQgZmlsZXM6IEFyY2hpdmVGaWxlSW5mb1tdID0gW107XG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBTZWUgQ2hhbmdlc0FmdGVyQ29uZmlnLmludGVybmFsIChkZWxldGlvbnMgYmVsb3cgYXJlIGFsd2F5cyByZXBvcnRlZCAtIHRoZXkgYXJlIGluZGV4LW9ubHkpXG4gICAgICAgICAgICBpZiAoY29uZmlnLmludGVybmFsICYmIHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCkgIT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLmNoYW5nZWRBdCA8PSBjb25maWcudGltZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWluUm91dGVzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogdG9tYnN0b25lLndyaXRlVGltZSwgc2l6ZTogMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBzb3J0KGZpbGVzLCB4ID0+IHgucGF0aCk7XG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5nZXRTdGF0dXMoKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluZGV4J3MgdG90YWxzIHBsdXMgYW55IGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uLiAqL1xuICAgIHB1YmxpYyBnZXRTeW5jUHJvZ3Jlc3MoKToge1xuICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAgICAgbWFya2VkOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9O1xuICAgICAgICBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgICAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgICAgIHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdO1xuICAgIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogeyBmaWxlQ291bnQ6IHRvdGFscy5maWxlQ291bnQsIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCB9LFxuICAgICAgICAgICAgbWFya2VkOiB0aGlzLm1hcmtlZFRvdGFscygpLFxuICAgICAgICAgICAgc291cmNlczogdG90YWxzLnNvdXJjZXMsXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHRoaXMucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgc3luY2luZzogdGhpcy5zeW5jLmdldEFjdGl2aXRpZXMoKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogZ2V0U3luY1Byb2dyZXNzJ3MgdG90YWxzLCBidXQgbG9hZGluZyB0aGUgaW5kZXggZmlyc3QsIHNvIHRoZXkgYXJlIG5ldmVyIHRoZSB6ZXJvZXMgb2YgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHlldC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tcHV0ZUluZGV4VG90YWxzKCk6IFByb21pc2U8e1xuICAgICAgICBmaWxlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgYnl0ZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgfT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZWRJbmRleFRvdGFscygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmFtZWRJbmRleFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHtcbiAgICAgICAgbGV0IHRvdGFscyA9IHRoaXMuaW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCxcbiAgICAgICAgICAgIGJ5dGVDb3VudDogdG90YWxzLmJ5dGVDb3VudCxcbiAgICAgICAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlc1xuICAgICAgICAgICAgICAgIC5tYXAoKHgsIGkpID0+ICh7IGRlYnVnTmFtZTogeC5zb3VyY2UuZ2V0RGVidWdOYW1lKCksIC4uLnRvdGFscy5zbG90c1tpXSB9KSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4LCBpKSA9PiB0aGlzLmlzTGl2ZShpKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0b3JlJ3Mgc291cmNlcywgYXMgdGhlIGN1cnJlbnQgcm91dGluZyBjb25maWcgc2F5cyB0aGV5IHNob3VsZCBiZS4gVGhpcyBpcyB0aGUgT05MWSB3YXlcbiAgICAgKiB0aGV5IGFyZSBldmVyIHNldDogdGhlIGZpcnN0IGNhbGwgcG9wdWxhdGVzIGFuIGVtcHR5IHN0b3JlLCBldmVyeSBsYXRlciBvbmUgYXBwbGllcyBhIGNoYW5nZSB0b1xuICAgICAqIHRoZSBydW5uaW5nIG9uZS4gV2luZG93cywgcm91dGVzIGFuZCBmbGFncyBtb3ZlIGluIHBsYWNlLCBnZW51aW5lbHkgbmV3IGVuZHBvaW50cyBhcmUgYWRkZWQgYW5kXG4gICAgICogc3RhcnQgc2Nhbm5pbmcsIGFuZCBlbmRwb2ludHMgdGhhdCBhcmUgZ29uZSBnbyBkZWFkICh0aGVpciBzY2FucyBzdG9wLCB0aGVpciBpbmRleCBlbnRyaWVzXG4gICAgICogZHJvcCkuXG4gICAgICpcbiAgICAgKiBBIHN0b3JlIGlzIG5ldmVyIHJlYnVpbHQgZm9yIGEgY29uZmlnIGNoYW5nZS4gSXRzIG5hbWUgZGVjaWRlcyBpdHMgZm9sZGVyIGFuZCBpdHMgaWRlbnRpdHksIGFuZFxuICAgICAqIGEgY29uZmlnIGNoYW5nZSBjYW5ub3QgY2hhbmdlIGVpdGhlciAtIHNvIHRoZXJlIGlzIG5vdGhpbmcgYSBjaGFuZ2UgY2FuIGRvIHRvIGEgc3RvcmUgZXhjZXB0XG4gICAgICogdGhpcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlU291cmNlcyhzcGVjczogQmxvYlNvdXJjZVNwZWNbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXNwZWNzLmxlbmd0aCB8fCBzcGVjc1swXS5pZGVudGl0eSAhPT0gXCJkaXNrXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlU291cmNlcyBleHBlY3RzIHRoZSBkaXNrIHNvdXJjZSBmaXJzdCAoaWRlbnRpdHkgXCJkaXNrXCIpLCBnb3QgJHtKU09OLnN0cmluZ2lmeShzcGVjcy5tYXAoeCA9PiB4LmlkZW50aXR5KSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNhbGw6IHRoZSBkaXNrIHNsb3QgaGFzIHRvIGV4aXN0IGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgbWF0Y2hlZCBhZ2FpbnN0IGl0XG4gICAgICAgICAgICBsZXQgZGlzayA9IHNwZWNzWzBdO1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGRpc2suY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBkaXNrLnVybCwgdmFsaWRXaW5kb3dzOiBkaXNrLnZhbGlkV2luZG93cywgcm91dGU6IGRpc2sucm91dGUsIG5vRnVsbFN5bmM6IGRpc2subm9GdWxsU3luYywgc291cmNlQ29uZmlnOiBkaXNrLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IGRpc2suaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmMuYWRkU291cmNlKDApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZXRXaW5kb3dzID0gKGk6IG51bWJlciwgd2luZG93czogW251bWJlciwgbnVtYmVyXVtdKSA9PiB7XG4gICAgICAgICAgICBsZXQgb2xkID0gdGhpcy5zb3VyY2VzW2ldLnZhbGlkV2luZG93cztcbiAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGQpID09PSBKU09OLnN0cmluZ2lmeSh3aW5kb3dzKSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFZhbGlkIHdpbmRvd3MgY2hhbmdlZCBmb3IgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiAke0pTT04uc3RyaW5naWZ5KG9sZCl9IC0+ICR7SlNPTi5zdHJpbmdpZnkod2luZG93cyl9YCk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzID0gd2luZG93cztcbiAgICAgICAgfTtcbiAgICAgICAgc2V0V2luZG93cygwLCBzcGVjc1swXS52YWxpZFdpbmRvd3MpO1xuICAgICAgICAvLyBMaXZlIHNsb3RzIHBhaXIgd2l0aCBzcGVjcyBieSBpZGVudGl0eS4gRWFjaCBlbmRwb2ludCBpcyBub3cgT05FIHNwZWMgY2FycnlpbmcgYWxsIGl0cyB3aW5kb3dzLCBzbyB0aGlzIGlzIGEgMToxIHBhaXJpbmc7IGFueSBsZWZ0b3ZlciBkdXBsaWNhdGUgc2xvdHMgZnJvbSBiZWZvcmUgKGFuIGVuZHBvaW50IHRoYXQgdXNlZCB0byBiZSBzcGxpdCBpbnRvIHNldmVyYWwgc2xvdHMpIGdvIHVubWF0Y2hlZCBiZWxvdyBhbmQgYXJlIGNvbGxhcHNlZCBhd2F5LlxuICAgICAgICBsZXQgbGl2ZUJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gICAgICAgIGxldCBvcmlnaW5hbExlbmd0aCA9IHRoaXMuc291cmNlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgaWQgPSB0aGlzLnNvdXJjZXNbaV0uaWRlbnRpdHk7XG4gICAgICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IGxpdmVCeUlkZW50aXR5LmdldChpZCk7XG4gICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW107XG4gICAgICAgICAgICAgICAgbGl2ZUJ5SWRlbnRpdHkuc2V0KGlkLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgICBmb3IgKGxldCBzcGVjIG9mIHNwZWNzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IGxpdmVCeUlkZW50aXR5LmdldChzcGVjLmlkZW50aXR5KT8uc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgU0FNRSBlbmRwb2ludCAoc2VlIHNvdXJjZUlkZW50aXR5KSwgc28gd2UgYXJlIGFscmVhZHkgc3luY2hyb25pemVkIHdpdGggaXQ6IHRoZSBzbG90IGtlZXBzIGl0cyBjb25uZWN0aW9uLCBpdHMgY29tcGxldGVkIHNjYW5zLCBhbmQgaXRzIGluZGV4IGVudHJpZXMsIGFuZCBvbmx5IHRoZSBwb2xpY3kgb24gaXQgbW92ZXMuIFJlY3JlYXRpbmcgaXQgaGVyZSB3b3VsZCBtZWFuIHJlc2Nhbm5pbmcgdGhlIGVuZHBvaW50IGZyb20gc2NyYXRjaCBldmVyeSB0aW1lIGEgZmxhZyBjaGFuZ2VzLlxuICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRkKHNsb3QpO1xuICAgICAgICAgICAgICAgIHNldFdpbmRvd3Moc2xvdCwgc3BlYy52YWxpZFdpbmRvd3MpO1xuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc291cmNlc1tzbG90XTtcbiAgICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnJvdXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUm91dGUgY2hhbmdlZCBmb3IgJHtleGlzdGluZy5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkoZXhpc3Rpbmcucm91dGUpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpfWApO1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yb3V0ZSA9IHNwZWMucm91dGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpICE9PSBKU09OLnN0cmluZ2lmeShzcGVjLnNvdXJjZUNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZyBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSwga2VlcGluZyB0aGUgc291cmNlIChzbyBpdCBpcyBub3QgcmVzY2FubmVkKTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5zb3VyY2VDb25maWcpfSAtPiAke0pTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBjYXJyaWVzIGl0cyBjb25maWcgKGFuZCBpdHMgd3JpdGUgZGVsYXkpIGludG8gZXZlcnl0aGluZyBpdCBkb2VzLCBzbyBpdCBoYXMgdG8gbGVhcm4gdGhlIG5ldyBvbmUgLSBzZWUgYXBwbHlTb3VyY2VDb25maWdcbiAgICAgICAgICAgICAgICBzcGVjLmFwcGx5Q29uZmlnPy4oZXhpc3Rpbmcuc291cmNlKTtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5ub0Z1bGxTeW5jID0gc3BlYy5ub0Z1bGxTeW5jO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNwZWMuY3JlYXRlKCk7XG4gICAgICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uYmluZEZsdXNoRGVhZGxpbmUoKCkgPT4gdGhpcy53cml0ZUZsdXNoRGVhZGxpbmUoKSk7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMucHVzaCh7IHNvdXJjZSwgdXJsOiBzcGVjLnVybCwgdmFsaWRXaW5kb3dzOiBzcGVjLnZhbGlkV2luZG93cywgcm91dGU6IHNwZWMucm91dGUsIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYywgaW50ZXJtZWRpYXRlOiBzcGVjLmludGVybWVkaWF0ZSwgc291cmNlQ29uZmlnOiBzcGVjLnNvdXJjZUNvbmZpZywgaWRlbnRpdHk6IHNwZWMuaWRlbnRpdHkgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQWRkZWQgc3luYyBzb3VyY2UgJHtzb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGEgZ2VudWluZWx5IG5ldyBlbmRwb2ludCwgc28gaXQgaXMgc2Nhbm5lZCBmcm9tIHNjcmF0Y2hgKTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UodGhpcy5zb3VyY2VzLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3JpZ2luYWxMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSB8fCBtYXRjaGVkLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBUaGUgc2xvdCBpcyBkZWFkIHRoZSBtb21lbnQgdGhpcyByZXR1cm5zOyBkcm9wcGluZyB0aGUgaW5kZXggZW50cmllcyBpdCBoZWxkIGlzIHRoZSBwYXJ0IHRoYXQgcmVhZHMgdGhlIGluZGV4LCBzbyBpdCBmaW5pc2hlcyBpbiB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgdm9pZCB0aGlzLnN5bmMucmVtb3ZlU291cmNlKGkpLmNhdGNoKChlOiBFcnJvcikgPT4gbG9nU3RvcmFnZUVycm9yKGBSZW1vdmluZyBzeW5jIHNvdXJjZSAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSkgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUmVzY2FucyBvdXIgb3duIGRpc2sncyBtZXRhZGF0YSBpbnRvIHRoZSBpbmRleCAtIHVzZWQgYXJvdW5kIHZhbGlkIHdpbmRvdyBoYW5kb2Zmcywgd2hlcmUgYW5vdGhlciBwcm9jZXNzIHdyb3RlIGZpbGVzIHRvIHRoZSBzaGFyZWQgZm9sZGVyIHRoYXQgb3VyIGluZGV4IGhhc24ndCBzZWVuLiAqL1xuICAgIHB1YmxpYyBhc3luYyByZXNjYW5CYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jLnJlc2NhbkJhc2UoKTtcbiAgICB9XG5cbiAgICAvKiogQSBib3VuZGFyeSBzY2FuIG9mIHRoZSBub2RlIHRoYXQgb3duZWQgKHBhcnQgb2YpIG91ciByb3V0ZSBpbiB0aGUgdmFsaWQgd2luZG93IGJlZm9yZSBvdXJzLCB3aGVuIHRoYXQgbm9kZSBpcyBkaWZmZXJlbnQgc3RvcmFnZSAoYSBkaXNrIHJlc2NhbiBjYW4ndCBzZWUgaXRzIHdyaXRlcykuICovXG4gICAgcHVibGljIGFzeW5jIGJvdW5kYXJ5U2NhblJlbW90ZShzb3VyY2U6IElBcmNoaXZlcywgY29uZmlnOiB7IHNpbmNlOiBudW1iZXI7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXSB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMuYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZSwgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBMYXJnZSB1cGxvYWRzIHN0cmVhbSBvbnRvIHRoZSBsb2NhbCBkaXNrIHNvdXJjZSBkaXJlY3RseSAodGhleSBtYXkgbm90IGZpdCBpbiBtZW1vcnkpLCBhbmQgcmVjb25jaWxpYXRpb24gY2FycmllcyB0aGVtIHRvIHRoZSBvdGhlciBzb3VyY2VzIC0gdGhlcmUgaXMgbm8gZGVsYXllZC13cml0ZSBzdGFnZSB0aGV5IGNvdWxkIHBhc3MgdGhyb3VnaC4gVGhlIHdyaXRlIGl0c2VsZiBpcyB2YWxpZGF0ZWQgZXhhY3RseSBsaWtlIHNldCdzLCByaWdodCBoZXJlOiB0aGUgY2xpZW50IGlzIGFib3V0IHRvIHNlbmQgdGhlIHdob2xlIGZpbGUsIHNvIGV2ZXJ5IHJlYXNvbiB0byByZWZ1c2UgaXQgbXVzdCBiZSBmb3VuZCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0TGFyZ2VVcGxvYWQoY29uZmlnPzogeyBwYXRoPzogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnPy5wYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgd3JpdGVUaW1lID0gTWF0aC5yb3VuZChjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydFdyaXRlVGFyZ2V0KGtleSwgcm91dGUsIGNvbmZpZz8ubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpLiBUaGUgY2xpZW50IGlzIGFscmVhZHkgc3RyZWFtaW5nLCBzbyB0aGUgdXBsb2FkIGlzIGFjY2VwdGVkIGFuZCBldmVyeSBwYXJ0IGRpc2NhcmRlZCAtIHRoZSBhbHRlcm5hdGl2ZSBpcyB0aHJvd2luZyBhdCBhIGNhbGxlciB0aGF0IGRpZCBub3RoaW5nIHdyb25nLlxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSBgJHtESVNDQVJERURfVVBMT0FEX1BSRUZJWH0ke3RoaXMubmV4dERpc2NhcmRlZFVwbG9hZCsrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRlZFVwbG9hZHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0TXV0YWJsZShrZXksIHdyaXRlVGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZXMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHVwbG9hZGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCByb3V0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IGRhdGE6IEJ1ZmZlcjsgb2Zmc2V0PzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5oYXMoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmFwcGVuZExhcmdlVXBsb2FkKGNvbmZpZy5pZCwgY29uZmlnLmRhdGEsIGNvbmZpZy5vZmZzZXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IG5vQ2hlY2tzPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5kZWxldGUoY29uZmlnLmlkKSkgcmV0dXJuO1xuICAgICAgICBsZXQgeyBkaXNrLCBzb3VyY2VJbmRleCB9ID0gdGhpcy5nZXREaXNrU291cmNlKCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIC8vIEFuIG9sZGVyIHdyaXRlIG5ldmVyIG92ZXJ3cml0ZXMgYSBuZXdlciBvbmUgKHNlZSBJQXJjaGl2ZXMuc2V0KSAtIGEgbmV3ZXIgdmFsdWUgY2FuIGxhbmQgd2hpbGUgYSBsb25nIHVwbG9hZCBpcyBzdGlsbCBzdHJlYW1pbmcsIHNvIHRoaXMgaXMgcmUtY2hlY2tlZCBoZXJlIHJhdGhlciB0aGFuIG9ubHkgYXQgdGhlIHN0YXJ0XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShjb25maWcucGF0aCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLmNhbmNlbExhcmdlVXBsb2FkKGNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRpc2suZmluaXNoTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcucGF0aCwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGxldCBpbmZvID0gYXdhaXQgZGlzay5nZXRJbmZvKGNvbmZpZy5wYXRoKTtcbiAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShjb25maWcucGF0aCwgeyB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBzaXplOiBpbmZvLnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChzb3VyY2VJbmRleCkgfSk7XG4gICAgICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBcInNldExhcmdlXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDogY29uZmlnLnBhdGgsIHNpemU6IGluZm8uc2l6ZSwgd3JpdGVUaW1lOiBpbmZvLndyaXRlVGltZSwgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnOiB7IGlkOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIEludGVybmFsc1xuXG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQgY2FjaGUgdGhlIGRpc2sgbWF5IGhvbGQ7IHNlZSBDb21tb25Db25maWcucmVhZGVyRGlza0xpbWl0IChTdG9yZVN5bmMgZW5mb3JjZXMgaXQpLiBSZWFkIGZyb20gdGhlIGNvbmZpZyBpbiBlZmZlY3QsIHNvIHJhaXNpbmcgb3IgcmVtb3ZpbmcgdGhlIGxpbWl0IHRha2VzIGVmZmVjdCBvbiB0aGUgbmV4dCBldmljdGlvbiBwYXNzLiAqL1xuICAgIHB1YmxpYyBnZXQgcmVhZGVyRGlza0xpbWl0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlQ29uZmlnLmN1cnJlbnQoKS5yZWFkZXJEaXNrTGltaXQ7XG4gICAgfVxuXG4gICAgLyoqIFRoZSB3cml0ZSB0aW1lIGEgbmV3IHdyaXRlIGhhcyB0byBiZWF0LCBvciAwIHdoZW4gd2UgaGF2ZSBuZXZlciBoZWFyZCBvZiB0aGUga2V5LiBDb3VudHMgREVMRVRJT05TIHRvbzogYSB3cml0ZSBvbGRlciB0aGFuIHRoZSBkZWxldGlvbiB0aGF0IHJlbW92ZWQgaXQgbXVzdCBub3QgYnJpbmcgaXQgYmFjay4gVGhlIGluZGV4IGlzIGF1dGhvcml0YXRpdmUgZXZlbiBmb3IgYSB3cml0ZSBzdGlsbCBidWZmZXJlZCBpbiBhIGRlbGF5ZWQgc291cmNlLCBzaW5jZSB0aGUgZW50cnkgaXMgcmVjb3JkZWQgd2hlbiB0aGUgd3JpdGUgaXMgYWNjZXB0ZWQgcmF0aGVyIHRoYW4gd2hlbiBpdCByZWFjaGVzIHN0b3JhZ2UuICovXG4gICAgcHVibGljIGN1cnJlbnRXcml0ZVRpbWUoa2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC50aW1lT2Yoa2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTGl2ZShzb3VyY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmMuaXNMaXZlKHNvdXJjZUluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJTbG90KHNsb3Q6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnNsb3RSZWdpc3RyYXRpb25zW3Nsb3RdO1xuICAgICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICAgICAgbGV0IHJlZ2lzdHJhdGlvbiA9IHRoaXMuc291cmNlc0xpc3QuZW5zdXJlKHRoaXMuc291cmNlc1tzbG90XS51cmwpLnRoZW4oaW5kZXggPT4ge1xuICAgICAgICAgICAgdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNsb3RSZWdpc3RyYXRpb25zW3Nsb3RdID0gcmVnaXN0cmF0aW9uO1xuICAgICAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKiBUaGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIGEgc2xvdCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHNsb3QgbmV2ZXIgZ290IHRoYXQgZmFyIChhIHNvdXJjZSByZW1vdmVkIGJlZm9yZSBpdHMgcmVnaXN0cmF0aW9uIHJlc29sdmVkKS4gKi9cbiAgICBwdWJsaWMgc2xvdFNvdXJjZXNMaXN0SW5kZXgoc2xvdDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tzbG90XTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4IG9mIGEgc2xvdCAtIG9ubHkgdmFsaWQgb25jZSB0aGUgc2xvdCdzIHJlZ2lzdHJhdGlvbiByZXNvbHZlZCAoaW5pdCBhbmQgdGhlIHNvdXJjZSdzIHN5bmMgbG9vcCBndWFyYW50ZWUgdGhhdCBiZWZvcmUgYW55IGluZGV4aW5nIGhhcHBlbnMpXG4gICAgcHVibGljIHNvdXJjZXNMaXN0SW5kZXhPZlNsb3Qoc2xvdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2Ugc2xvdCBpcyBub3QgcmVnaXN0ZXJlZCB5ZXQuIFNsb3QgJHtzbG90fSAoJHt0aGlzLnNvdXJjZXNbc2xvdF0/LnVybH0pIGhhcyBubyBzb3VyY2VzTGlzdEluZGV4IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIGxpdmUgc2xvdCBjdXJyZW50bHkgc2VydmluZyBhIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY29uZmlndXJlZCBzb3VyY2UgaGFzIHRoYXQgVVJMIGFueW1vcmUuIExpbmVhciwgYnV0IHRoZSBzb3VyY2VzIGxpc3QgaXMgdGlueSBhbmQgdGhpcyBpcyBhbHdheXMgY3VycmVudCAoc2xvdHMgZHlpbmcsIG9yIHNldmVyYWwgc2xvdHMgc2hhcmluZyBvbmUgVVJMIGFjcm9zcyB2YWxpZCB3aW5kb3dzLCBuZWVkIG5vIGJvb2trZWVwaW5nKS5cbiAgICBwdWJsaWMgc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoc291cmNlc0xpc3RJbmRleDogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbaV0gPT09IHNvdXJjZXNMaXN0SW5kZXggJiYgdGhpcy5pc0xpdmUoaSkpIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIElBcmNoaXZlcyBjdXJyZW50bHkgaG9sZGluZyBhbiBlbnRyeSdzIGJ5dGVzOiB0aGUgbGl2ZSBzbG90IHdoZW4gdGhlIGhvbGRlciBpcyBzdGlsbCBjb25maWd1cmVkLCBvdGhlcndpc2UgcmVzb2x2ZWQgKGNhY2hlZCkgc3RyYWlnaHQgZnJvbSBpdHMgcGVyc2lzdGVkIFVSTCAtIHdpbmRvd3Mvcm91dGVzIGRlY2lkZSB3aGVuIGEgc291cmNlIGlzIHNjYW5uZWQgb3Igd3JpdHRlbiwgYnV0IGZvciByZWFkaW5nIGJ5dGVzIHdlIGtub3cgaXQgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoXG4gICAgcHVibGljIGFzeW5jIGdldEVudHJ5SG9sZGVyKGVudHJ5OiBJbmRleEVudHJ5KTogUHJvbWlzZTxJQXJjaGl2ZXMgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHNsb3QgPSB0aGlzLnNsb3RGb3JTb3VyY2VzTGlzdEluZGV4KGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoc2xvdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zb3VyY2VzW3Nsb3RdLnNvdXJjZTtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpIHx8IGF3YWl0IHRoaXMuc291cmNlc0xpc3QuZ2V0VXJsUmVsb2FkaW5nKGVudHJ5LnNvdXJjZXNMaXN0SW5kZXgpO1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnPy5yZXNvbHZlU291cmNlVXJsPy4odXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5sb2FkKCk7XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBpcyBvbmx5IGV2ZXIgcmVhZCBvZmYgb3VyIG93biBkaXNrIChzZWUgU3RvcmVTeW5jJ3Mgc2NhbiBoYW5kbGluZyksIGFuZCBhIGxvYWRlZCBidWNrZXQgYWx3YXlzIGhhcyBpdCB0aGVyZSAtIGEgcGVyc2lzdGVkIGVudHJ5IHBvaW50aW5nIGVsc2V3aGVyZSBpcyBzdGFsZSwgc28gaXQgaXMgY29ycmVjdGVkIG9uY2UsIGhlcmVcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmdldEluZGV4RW50cnkoUk9VVElOR19GSUxFKTtcbiAgICAgICAgbGV0IGJhc2VTb3VyY2VzTGlzdEluZGV4ID0gdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApO1xuICAgICAgICBpZiAocm91dGluZyAmJiByb3V0aW5nLnNvdXJjZXNMaXN0SW5kZXggIT09IGJhc2VTb3VyY2VzTGlzdEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoUk9VVElOR19GSUxFLCB7IHdyaXRlVGltZTogcm91dGluZy53cml0ZVRpbWUsIHNpemU6IHJvdXRpbmcuc2l6ZSwgc291cmNlc0xpc3RJbmRleDogYmFzZVNvdXJjZXNMaXN0SW5kZXggfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIHdlIGhvbGQuIEEgZGVsZXRlZCBvbmUgaXMgbm90IG9uZTogaXQgaXMgYSB0b21ic3RvbmUsIGFuZCBvbmx5IGdldERlbGV0ZWRFbnRyeSBrbm93cyBhYm91dCBpdC4gKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IEluZGV4RW50cnkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmluZGV4LmdldChrZXkpO1xuICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi5lbnRyeS52YWx1ZSwgd3JpdGVUaW1lOiBlbnRyeS50aW1lLCBjaGFuZ2VkQXQ6IGVudHJ5LmNoYW5nZWRBdCB9O1xuICAgIH1cblxuICAgIC8qKiBXaGVuIGEga2V5IHdhcyBkZWxldGVkLCBpZiBpdCB3YXMuIEEgZGVsZXRpb24gaXMgYW4gYWJzZW5jZSB3aXRoIGEgdGltZSBhdHRhY2hlZCAtIHRoYXQgdGltZSBpcyB3aGF0IG1ha2VzIGl0IHByb3BhZ2F0ZSBhbmQgd2hhdCBleHBpcmVzIGl0LiAqL1xuICAgIHB1YmxpYyBnZXREZWxldGVkRW50cnkoa2V5OiBzdHJpbmcpOiB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuaW5kZXguZ2V0RGVsZXRlZChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGZpbGUgd2UgaG9sZCwgZm9yIHRoZSBwYXNzZXMgdGhhdCB3YWxrIHRoZW0gYWxsIChsaXN0aW5ncywgc2NhbnMsIHJlY29uY2lsaWF0aW9uLCBldmljdGlvbikuIERlbGV0aW9ucyBhcmUgbm90IGluIGhlcmUgLSBzZWUgZGVsZXRlZEVudHJpZXMuIExpdmU6IGRlbGV0aW5nIGVudHJpZXMgd2hpbGUgaXRlcmF0aW5nIGlzIGV4cGVjdGVkIGhlcmUsIGFuZCBzYWZlLiAqL1xuICAgIHB1YmxpYyAqaW5kZXhFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgSW5kZXhFbnRyeV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXguZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IGRlbGV0aW9uIHdlIGtub3cgb2YuIEEgbXVjaCBzbWFsbGVyIHdhbGsgdGhhbiB0aGUgZmlsZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXMgZXhwaXJpbmcgdGhlbSBjaGVhcC4gKi9cbiAgICBwdWJsaWMgKmRlbGV0ZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgeyB3cml0ZVRpbWU6IG51bWJlcjsgY2hhbmdlZEF0OiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgd3JpdGVUaW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0IH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEEgZmlsZSBNQVJLRUQgZm9yIGRlbGV0aW9uOiBpdHMga2VwdCBpbmRleCB2YWx1ZSBwbHVzIHdoZW4gaXQgd2FzIGRlbGV0ZWQuIFVuZGVmaW5lZCB3aGVuIHRoZSBrZXkgaXMgbGl2ZSwgbmV2ZXIgZXhpc3RlZCwgb3IgaXRzIGhpc3Rvcnkgd2FzIGFscmVhZHkgZHJvcHBlZC4gKi9cbiAgICBwdWJsaWMgZ2V0TWFya2VkRW50cnkoa2V5OiBzdHJpbmcpOiAoSW5kZXhFbnRyeSAmIHsgZGVsZXRlVGltZTogbnVtYmVyIH0pIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuaW5kZXguZ2V0RGVsZXRlZChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSB8fCB0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4udG9tYnN0b25lLnZhbHVlLCB3cml0ZVRpbWU6IHRvbWJzdG9uZS52YWx1ZVRpbWUgfHwgdG9tYnN0b25lLnRpbWUsIGNoYW5nZWRBdDogdG9tYnN0b25lLmNoYW5nZWRBdCwgZGVsZXRlVGltZTogdG9tYnN0b25lLnRpbWUgfTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZmlsZSBtYXJrZWQgZm9yIGRlbGV0aW9uIC0gdGhlIGRlbGV0aW9uIGhpc3RvcnksIHdhbGtlZCBieSByZXRlbnRpb24gYW5kIGJ5IGluY2x1ZGVNYXJrZWQgbGlzdGluZ3MuICovXG4gICAgcHVibGljICptYXJrZWRFbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgSW5kZXhFbnRyeSAmIHsgZGVsZXRlVGltZTogbnVtYmVyIH1dPiB7XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5pbmRleC5kZWxldGVkRW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLnZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyAuLi50b21ic3RvbmUudmFsdWUsIHdyaXRlVGltZTogdG9tYnN0b25lLnZhbHVlVGltZSB8fCB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0LCBkZWxldGVUaW1lOiB0b21ic3RvbmUudGltZSB9XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUaGUgZGVsZXRpb24gaGlzdG9yeSdzIHRvdGFsczogaG93IG1hbnkgbWFya2VkIGZpbGVzLCB0aGVpciBieXRlcywgYW5kIHRoZSBkZWxldGUgdGltZSBvZiB0aGUgT0xERVNUIG9uZSAtIHdoaWNoIGlzIGhvdyBmYXIgYmFjayB0aGUgaGlzdG9yeSByZWFjaGVzLiAqL1xuICAgIHB1YmxpYyBtYXJrZWRUb3RhbHMoKTogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IG9sZGVzdERlbGV0ZVRpbWU/OiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBmaWxlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IG9sZGVzdERlbGV0ZVRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMubWFya2VkRW50cmllcygpKSB7XG4gICAgICAgICAgICBmaWxlQ291bnQrKztcbiAgICAgICAgICAgIGJ5dGVDb3VudCArPSBlbnRyeS5zaXplO1xuICAgICAgICAgICAgaWYgKG9sZGVzdERlbGV0ZVRpbWUgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5kZWxldGVUaW1lIDwgb2xkZXN0RGVsZXRlVGltZSkge1xuICAgICAgICAgICAgICAgIG9sZGVzdERlbGV0ZVRpbWUgPSBlbnRyeS5kZWxldGVUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZpbGVDb3VudCwgYnl0ZUNvdW50LCBvbGRlc3REZWxldGVUaW1lIH07XG4gICAgfVxuXG4gICAgLyoqIFBoeXNpY2FsbHkgcmVtb3ZlcyBhIG1hcmtlZCBmaWxlJ3MgYnl0ZXMgZnJvbSBvdXIgZGlzayBhbmQgZHJvcHMgaXRzIGtlcHQgdmFsdWUsIGxlYXZpbmcgYSBwbGFpbiB0b21ic3RvbmUgdGhhdCBhZ2VzIG91dCBub3JtYWxseSAtIHJldGVudGlvbiBjYWxsaW5nIHRpbWUgb24gdGhlIG9sZGVzdCBoaXN0b3J5LiAqL1xuICAgIHB1YmxpYyBhc3luYyBkcm9wTWFya2VkSGlzdG9yeShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLm93bkRpc2suZGVsKGtleSk7XG4gICAgICAgIHRoaXMuaW5kZXguZHJvcFZhbHVlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqIFNlZSBTZXRDb25maWcudW5kZWxldGU6IGZsaXBzIGEgbWFya2VkIGRlbGV0aW9uIGJhY2sgdG8gbGl2ZSAoZnJlc2ggd3JpdGUgdGltZSwgc28gdGhlIHJlc3RvcmUgb3V0cmFua3MgdGhlIGRlbGV0aW9uIGV2ZXJ5d2hlcmUgaXQgcHJvcGFnYXRlZCkgLSB0aGUgYnl0ZXMgbmV2ZXIgbGVmdCB0aGUgZGlzaywgc28gcmVhZHMganVzdCB3b3JrIGFnYWluLiBJbnRlcm5hbCByZXN0b3JlcyBhcmUgYSBwZWVyJ3MgcHJvcGFnYXRpb24gYW5kIHRvbGVyYXRlIGhhdmluZyBub3RoaW5nIHRvIHJlc3RvcmUgKHRoaXMgbm9kZSBtYXkgbmV2ZXIgaGF2ZSBoZWxkIHRoZSBmaWxlKTsgYSBjYWxsZXIncyByZXN0b3JlIHRocm93cyBpbnN0ZWFkLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgdW5kZWxldGVLZXkoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCBpbnRlcm5hbDogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgbWFya2VkID0gdGhpcy5nZXRNYXJrZWRFbnRyeShrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXgudW5tYXJrKGtleSwgd3JpdGVUaW1lKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsaXZlOiB1bmRlbGV0ZSBpcyBpZGVtcG90ZW50IChyZXRyaWVzIGFuZCBwZWVyIHByb3BhZ2F0aW9uIGJvdGggcmUtc2VuZCBpdClcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEluZGV4RW50cnkoa2V5KSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKGludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFVuZGVsZXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBoYXMgbm90aGluZyB0byByZXN0b3JlIGhlcmUgLSB0aGlzIG5vZGUgbWF5IG5ldmVyIGhhdmUgaGVsZCB0aGUgZmlsZWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5kZWxldGUgZmFpbGVkIC0gbm90aGluZyB0byByZXN0b3JlLiBDYW5ub3QgdW5kZWxldGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBpdCBoYXMgbm8gbWFya2VkIGRlbGV0aW9uIHRvIHJlc3RvcmUgLSBpdCB3YXMgbmV2ZXIgZGVsZXRlZCBoZXJlJHt0aGlzLmdldERlbGV0ZWRFbnRyeShrZXkpICYmIFwiLCBvciBpdHMgZGVsZXRpb24gaGlzdG9yeSB3YXMgYWxyZWFkeSBkcm9wcGVkIChhIHBsYWluIHRvbWJzdG9uZSByZW1haW5zLCBidXQgdGhlIGJ5dGVzIGFyZSBnb25lKVwiIHx8IFwiXCJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYFVuZGVsZXRlZCAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHRoZSBpbmRleCBlbnRyeSAoJHttYXJrZWQ/LnNpemV9IGJ5dGVzLCBkZWxldGVkICR7bWFya2VkICYmIGZvcm1hdERhdGVUaW1lRGV0YWlsZWQobWFya2VkLmRlbGV0ZVRpbWUpfSkgaXMgbGl2ZSBhZ2FpbiBhcyBvZiAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0gLSB0aGUgYnl0ZXMgbmV2ZXIgbGVmdCB0aGUgZGlza2ApO1xuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBcInVuZGVsZXRlXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBtYXJrZWQ/LnNpemUsIHdyaXRlVGltZSwgaW50ZXJuYWwgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIGlmIChpbnRlcm5hbCkgcmV0dXJuO1xuICAgICAgICAvLyBQZWVycyBtYXJrZWQgdGhlaXIgb3duIGNvcGllcyB3aGVuIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVkLCBzbyB0aGUgcmVzdG9yZSBwcm9wYWdhdGVzIHRoZSBzYW1lIHdheS4gU3RyYWlnaHQgcGFzdCBhbnkgd3JpdGUgZGVsYXkgLSBhIGJ1ZmZlcmVkIHVuZGVsZXRlIGNvdWxkIGJlIHJlYWQgYmFjayBhcyBpdHMgcGxhY2Vob2xkZXIgYnl0ZS5cbiAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSBvZiB0aGlzLmdldFdyaXRhYmxlU291cmNlcygpKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gT25seSBvdXIgb3duIHNlcnZlcnMgdW5kZXJzdGFuZCB0aGUgZmxhZyAtIGEgcmF3IHNvdXJjZSAoYmFja2JsYXplKSB3b3VsZCBzdG9yZSB0aGUgcGxhY2Vob2xkZXIgYnl0ZSBhcyB0aGUgZmlsZS4gVGhlaXIgb2xkZXIgY29weSBpcyByZS1wdXNoZWQgYnkgcmVjb25jaWxpYXRpb24gaW5zdGVhZC5cbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbaV0uc291cmNlQ29uZmlnPy50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBwdXNoID0gdW53cmFwRGVsYXllZCh0aGlzLnNvdXJjZXNbaV0uc291cmNlKS5zZXQoa2V5LCBVTkRFTEVURV9QTEFDRUhPTERFUiwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgdW5kZWxldGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYEJhY2tncm91bmQgdW5kZWxldGUgb2YgJHtrZXl9IG9uIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQgKGl0cyBzY2FuIG9mIHVzIHJlLWZpbmRzIHRoZSBmaWxlIGFueXdheSk6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgZmlsZXMgd2UgaG9sZCwgZGVsZXRpb25zIGV4Y2x1ZGVkLiAqL1xuICAgIHB1YmxpYyBpbmRleFNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguc2l6ZTtcbiAgICB9XG5cbiAgICAvKiogVG90YWxzIG92ZXIgdGhlIGZpbGVzIHdlIGhvbGQsIGJyb2tlbiBkb3duIGJ5IHRoZSBzbG90IGhvbGRpbmcgZWFjaCAoZW50cmllcyBjYW4gbmFtZSBhIHNvdXJjZSB0aGF0IGlzIG5vIGxvbmdlciBjb25maWd1cmVkLCB3aGljaCBjb3VudHMgdG93YXJkcyB0aGUgdG90YWwgYnV0IG5vIHNsb3QpLiAqL1xuICAgIHB1YmxpYyBpbmRleFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgc2xvdHM6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSB9IHtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgc2xvdHMgPSB0aGlzLnNvdXJjZXMubWFwKCgpID0+ICh7IGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH0pKTtcbiAgICAgICAgZm9yIChsZXQgWywgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgICAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNsb3RzW3Nsb3RdLmZpbGVDb3VudCsrO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIHNsb3RzIH07XG4gICAgfVxuXG4gICAgLyoqIFJlY29yZHMgYSBmaWxlLCBhcyBvZiBpdHMgd3JpdGUgdGltZS4gUmV0dXJucyBmYWxzZSwgaGF2aW5nIGNoYW5nZWQgbm90aGluZywgd2hlbiB3ZSBhbHJlYWR5IGtub3cgc29tZXRoaW5nIGF0IGxlYXN0IGFzIG5ldyAtIHRoZSBpbmRleCBjYW5ub3QgYmUgbWFkZSB0byBnbyBiYWNrd2FyZHMsIHdoaWNoZXZlciBwYXRoIHRoZSB3cml0ZSBjYW1lIGluIGJ5LiAqL1xuICAgIHB1YmxpYyBzZXRJbmRleEVudHJ5KGtleTogc3RyaW5nLCBlbnRyeTogeyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyBzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIgfSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaW5kZXguc2V0KGtleSwgeyBzaXplOiBlbnRyeS5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBlbnRyeS5zb3VyY2VzTGlzdEluZGV4IH0sIGVudHJ5LndyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGxhbmRpbmcgaGVyZSAtIHdyaXR0ZW4gYnkgYW4gb3BlcmF0b3IsIG9yIHB1bGxlZCBvZmYgYSBwZWVyIGJ5IHN5bmNocm9uaXphdGlvbiAtIGlzIGhvdyB0aGlzIHN0b3JlIGxlYXJucyB3aGF0IGl0IGlzIG1lYW50IHRvIGJlXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN5bmNTdGFydGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlYXBwbHlSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFJlY29yZHMgYSBERUxFVElPTiwgYXMgb2YgaXRzIHRpbWU6IHRoZSBrZXkgc3RvcHMgZXhpc3RpbmcgaGVyZSwgYW5kIHRoZSB0b21ic3RvbmUgaXMgd2hhdCBtYWtlcyB0aGF0IGZhY3QgcHJvcGFnYXRlIGFuZCByZWNvbmNpbGUgbGlrZSBhbnkgb3RoZXIgd3JpdGUuIFNhbWUgb3JkZXJpbmcgcnVsZSBhcyBzZXRJbmRleEVudHJ5LiAqL1xuICAgIHB1YmxpYyBzZXRJbmRleERlbGV0ZWQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5kZWxldGUoa2V5LCB3cml0ZVRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuY29uZmlnPy5vbkluZGV4Q2hhbmdlZD8uKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBGb3JnZXRzIGEga2V5IGVudGlyZWx5LCB0b21ic3RvbmUgaW5jbHVkZWQuIE5PVCBhIGRlbGV0aW9uOiBpdCBzYXlzIG5vdGhpbmcgaGFwcGVuZWQgdG8gdGhlIGZpbGUsIG9ubHkgdGhhdCB3ZSBubyBsb25nZXIga25vdyBhbnl0aGluZyBhYm91dCBpdCAtIGZvciBhbiBlbnRyeSB3aG9zZSBob2xkZXIgdHVybmVkIG91dCBub3QgdG8gaGF2ZSBpdCwgYW5kIGZvciBhIHRvbWJzdG9uZSBvbGQgZW5vdWdoIHRoYXQgZXZlcnlvbmUgaGFzIGhlYXJkLiAqL1xuICAgIHB1YmxpYyBwdXJnZUluZGV4RW50cnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmRleC5wdXJnZShrZXkpO1xuICAgIH1cblxuICAgIC8qKiBDb3VudHMgYSBzeW5jaHJvbml6YXRpb24gdHJhbnNmZXIgaW4gdGhlIHNlcnZlcidzIGFjY2VzcyBzdGF0aXN0aWNzIChzZWUgZ2V0U3RvcmUncyB3aXJpbmcpOiBcInN5bmMgZ2V0XCIgZm9yIGJ5dGVzIHB1bGxlZCBvZmYgYSBzb3VyY2UsIFwic3luYyBzZXRcIiBmb3IgYnl0ZXMgcHVzaGVkIHRvIG9uZS4gKi9cbiAgICBwdWJsaWMgbm90ZVN5bmNUcmFuc2ZlcihvcGVyYXRpb246IFwic3luYyBnZXRcIiB8IFwic3luYyBzZXRcIiwgcGF0aDogc3RyaW5nLCBieXRlczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IG9wZXJhdGlvbiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoLCBzaXplOiBieXRlcyB9KTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uU3luY1RyYW5zZmVyPy4ob3BlcmF0aW9uLCBwYXRoLCBieXRlcyk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIHZhbGlkYXRpb24gKGZyb20gdGhpcyBzdG9yZSdzIG93biByb3V0aW5nIGVudHJpZXMpIOKUgOKUgFxuXG4gICAgLyoqXG4gICAgICogRXZlcnkgd3JpdGUsIGhvd2V2ZXIgaXQgaXMgc3RhbXBlZCwgaGFzIHRvIGJlIG9uZSB3ZSBhcmUgYWN0dWFsbHkgbWVhbnQgdG8gaG9sZCAtIGJlY2F1c2UgdGhlXG4gICAgICogYWx0ZXJuYXRpdmUgaXMgbm90IGEgc21hbGxlciBwcm9ibGVtLCBpdCBpcyBhIHNpbGVudCBvbmUuIEEgd3JpdGUgdGhhdCBsYW5kcyBvbiBhIHN0b3JlIHRoYXRcbiAgICAgKiBkb2VzIG5vdCBzZXJ2ZSBpdHMgcm91dGUgKG9yIG9uIGEgc2VydmVyIHRoYXQgaXMgbm90IGluIHRoZSBidWNrZXQncyBjb25maWcgYXQgYWxsKSBnb2VzIGludG8gYVxuICAgICAqIGZvbGRlciBub3RoaW5nIHNjYW5zIGFuZCBubyBwZWVyIHJlY29uY2lsZXM6IGl0IHN1Y2NlZWRzLCBhbmQgdGhlbiBpdCBpcyBnb25lLiBUaGUgbWFya2VycyBtYWtlXG4gICAgICogdGhlIGNsaWVudCByZS1yZWFkIHRoZSByb3V0aW5nIGNvbmZpZyBhbmQgcmV0cnksIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHJpZ2h0IG91dGNvbWUgd2hlbiB0aGVcbiAgICAgKiByZWFzb24gaXQgYWltZWQgaGVyZSBpcyB0aGF0IGl0cyBjb25maWcgd2FzIHN0YWxlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0V3JpdGVUYXJnZXQoa2V5OiBzdHJpbmcsIHJvdXRlOiBudW1iZXIsIGxhc3RNb2RpZmllZDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkZXRhaWwgPSB0aGlzLnVuY29uZmlndXJlZERldGFpbCgpO1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke2RldGFpbH1gKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX05PVF9DT05GSUdVUkVEfSBXcml0ZSByZWplY3RlZDogdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbi4gQ2Fubm90IHdyaXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfSBEYXRhIHdyaXR0ZW4gdG8gYSBzdG9yZSB3aXRoIG5vIGNvbmZpZ3VyYXRpb24gZW50cnkgd291bGQgbmV2ZXIgYmUgc2Nhbm5lZCBvciByZWNvbmNpbGVkLCBzbyBhY2NlcHRpbmcgaXQgd291bGQgc2lsZW50bHkgbG9zZSBpdC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkgLSBvciwgaWYgdGhpcyBzdG9yZSBpcyBnZW51aW5lbHkgbWVhbnQgdG8gdGFrZSB0aGlzIHdyaXRlLCB3cml0ZSB0aGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcgd2l0aCBhbiBlbnRyeSBuYW1pbmcgaXQgb24gdGhpcyBzZXJ2ZXIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXksIERhdGUubm93KCksIHJvdXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHN0YW1wZWQgd3JpdGUgcGlja2VkIGl0cyBvd24gdGltZSwgc28gbm8gd2luZG93IGNhbiBqdWRnZSBpdCAodGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgYSBzeW5jaHJvbml6ZWQgd3JpdGUpIC0gYnV0IHRoZSBST1VURSBpcyBub3QgYSBtYXR0ZXIgb2YgdGltaW5nLCBhbmQgYSBzdGFtcGVkIHdyaXRlIHRvIHRoZSB3cm9uZyBzaGFyZCBpcyBleGFjdGx5IGFzIGludmlzaWJsZSBhcyBhIGZyZXNoIG9uZVxuICAgICAgICBpZiAodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSByZXR1cm47XG4gICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3Rpbmcgc3RhbXBlZCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgcm91dGUgd2Ugc2VydmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gV3JpdGUgcmVqZWN0ZWQ6IHdyb25nIHJvdXRlIGZvciB0aGlzIHN0b3JlLiBSb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0sIG91ciByb3V0ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0sIHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgfVxuXG4gICAgLyoqIEV4YWN0bHkgd2h5IHRoaXMgc3RvcmUgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZW50cmllcyAtIHdoaWNoIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSByZWFzb25zIGl0IGlzLCB3aXRoIHRoZSB2YWx1ZXMgdGhhdCBkZWNpZGVkIGl0LCBiZWNhdXNlIFwibm90IGNvbmZpZ3VyZWRcIiBhbG9uZSBpcyB1bmRpYWdub3NhYmxlLiAqL1xuICAgIHByaXZhdGUgdW5jb25maWd1cmVkRGV0YWlsKCk6IHN0cmluZyB7XG4gICAgICAgIGxldCByb3V0aW5nID0gdGhpcy5hcHBsaWVkUm91dGluZztcbiAgICAgICAgbGV0IGlkZW50aXR5ID0gYHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KWA7XG4gICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBoYXMgbm8gcm91dGluZyBjb25maWcgYXQgYWxsIC0gbm90aGluZyBoYXMgZXZlciB3cml0dGVuICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gaW50byBpdC5gO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvYmplY3RzID0gcm91dGluZy5zb3VyY2VzLmZpbHRlcih4ID0+IHR5cGVvZiB4ICE9PSBcInN0cmluZ1wiKSBhcyBTb3VyY2VDb25maWdbXTtcbiAgICAgICAgbGV0IG5hbWVkID0gb2JqZWN0cy5maWx0ZXIoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgICAgaWYgKCFuYW1lZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdoaWNoIGhhcyBubyBlbnRyeSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGl0cyBlbnRyaWVzIGFyZSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KG9iamVjdHMubWFwKHggPT4geC5uYW1lKSl9KS5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtpZGVudGl0eX0gaXMgcnVubmluZyByb3V0aW5nIGNvbmZpZyB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKX0sIHdob3NlICR7bmFtZWQubGVuZ3RofSBlbnRyJHtuYW1lZC5sZW5ndGggPT09IDEgJiYgXCJ5XCIgfHwgXCJpZXNcIn0gbmFtZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IHBvaW50KHMpIGF0ICR7SlNPTi5zdHJpbmdpZnkobmFtZWQubWFwKHggPT4geC51cmwpKX0gLSBub25lIG9mIHdoaWNoIGlzIFRISVMgc2VydmVyLCBzbyB0aGUgY29uZmlnIHNheXMgdGhpcyBzdG9yZSBsaXZlcyBlbHNld2hlcmUuYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGEgcm91dGluZyBjb25maWcgbWF5IGJlIHdyaXR0ZW4gaGVyZS4gVHdvIHJ1bGVzLCBhbmQgdGhpcyBpcyB0aGUgb25lIHBsYWNlIGVpdGhlciBpc1xuICAgICAqIGFwcGxpZWQgLSBhIGNvbmZpZyBvbmx5IGV2ZXIgZW50ZXJzIHRoZSBzeXN0ZW0gdGhyb3VnaCBhIHdyaXRlLCBzbyBhIGNvbmZpZyB0aGF0IGdvdCBpbiBpcyBhXG4gICAgICogY29uZmlnIHRoYXQgcGFzc2VkLCBhbmQgcmVhZGluZyBvbmUgYmFjayBuZXZlciBqdWRnZXMgaXQgYWdhaW4uXG4gICAgICpcbiAgICAgKiBUaGUgY29uZmlnIGhhcyB0byBiZSB2YWxpZCBhcyBhIHdob2xlIChzZWUgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcpLCBhbmQgaXQgaGFzIHRvIG91dHJhbmsgd2hhdFxuICAgICAqIHdlIGFyZSBydW5uaW5nOiB0aGUgc2FtZSB2ZXJzaW9uIG1lYW5zIHRoZSBzYW1lIGNvbmZpZywgc28gcmUtd3JpdGluZyBpdCBpcyBoYXJtbGVzcywgYnV0IGFcbiAgICAgKiBsb3dlciBvbmUgaXMgYW4gb2xkZXIgY29uZmlnIGFycml2aW5nIGxhdGUgYW5kIG11c3QgbmV2ZXIgdW5kbyBhIG5ld2VyIG9uZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgICAgICBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyhyb3V0aW5nKTtcbiAgICAgICAgbGV0IGluY29taW5nID0gZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLnJvdXRpbmdWZXJzaW9uKCk7XG4gICAgICAgIGlmIChpbmNvbWluZyA+PSBjdXJyZW50KSByZXR1cm47XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgd3JpdGUgcmVmdXNlZCAtIHRoZSB2ZXJzaW9uIGlzIG5vdCBuZXdlci4gUmVmdXNpbmcgdG8gd3JpdGUgJHtST1VUSU5HX0ZJTEV9IHRvIHN0b3JlICR7dGhpcy5mb2xkZXJ9OiBpdHMgdmVyc2lvbiAoJHtpbmNvbWluZ30pIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSB0aGlzIHN0b3JlIGlzIHJ1bm5pbmcgKCR7Y3VycmVudH0pLiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gdG8gdXBkYXRlIGl0LmApO1xuICAgIH1cblxuICAgIC8vIEEgZnJlc2ggKHVuc3RhbXBlZCkgd3JpdGUgbXVzdCBsYW5kIG9uIHRoZSBub2RlIHRoZSBjb25maWcgY3VycmVudGx5IHBvaW50cyBhdDogdGhlIG1hcmtlcnMgdGVsbCB0aGUgY2xpZW50IGl0cyBjb25maWcgaXMgc3RhbGUsIHNvIGl0IHJlLXJlc29sdmVzIGFuZCByZXRyaWVzIGFnYWluc3QgdGhlIHJpZ2h0IG5vZGUgaW5zdGVhZCBvZiB1cyBzaWxlbnRseSBhY2NlcHRpbmcgZGF0YSB3ZSB3ZXJlIG5ldmVyIG1lYW50IHRvIGhvbGQuXG4gICAgcHJpdmF0ZSBhc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSl9KSBpcyBvdXRzaWRlIGFsbCBvdXIgdmFsaWQgd2luZG93cyAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IFdyaXRlIHJlamVjdGVkOiB3cml0ZSB0aW1lIGlzIG91dHNpZGUgb3VyIHZhbGlkIHdpbmRvd3MuIENhbm5vdCB3cml0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9OiBpdHMgd3JpdGUgdGltZSAke3dyaXRlVGltZX0gKCR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSkgaXMgb3V0c2lkZSBldmVyeSB2YWxpZCB3aW5kb3cgb2Ygc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9ICh3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSwgZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSAtIGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRpbWVWYWxpZC5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBvdXIgcm91dGVzICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSBhdCB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICh0aGUgY2xpZW50J3Mgc2hhcmQgY29uZmlnIGlzIHN0YWxlKWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFdyaXRlIHJlamVjdGVkOiB3cm9uZyByb3V0ZSBmb3IgdGhpcyBzdG9yZS4gUm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGtleSl9LCBvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9LCBzdG9yZSAke3RoaXMuZm9sZGVyfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhc3NlcnRNdXRhYmxlKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIGdldFJvdXRlKGtleSkpO1xuICAgICAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5nZXRJbmZvKHsgcGF0aDoga2V5IH0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdyaXRlIHJlamVjdGVkIC0gaW1tdXRhYmxlIHN0b3JlIGFuZCB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cy4gQXQgd3JpdGUgdGltZSAke3dyaXRlVGltZX0sICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gYWxyZWFkeSBleGlzdHMgKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VlIFNldENvbmZpZy5pbnRlcm5hbDogdGhlIHN0YW1wIG11c3QgbGFuZCBpbnNpZGUgU09NRSB3aW5kb3crcm91dGUgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIGZvciAoYW55IHdpbmRvdywgaW5jbHVkaW5nIHBhc3Qgb25lcyAtIHN5bmNocm9uaXphdGlvbiBtb3ZlcyBvbGQgZGF0YSksIHNvIGEgY29uZnVzZWQgcGVlciBjYW4ndCBzdHVmZiBkYXRhIG9udG8gYSBzdG9yZSB0aGF0IHdhcyBuZXZlciBtZWFudCB0byBob2xkIGl0XG4gICAgcHJpdmF0ZSBhc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5OiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdICYmIHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKCFjb3ZlcmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlIHJlamVjdGVkIC0gb3V0c2lkZSBldmVyeSBjb25maWd1cmVkIHdpbmRvdy9yb3V0ZS4gV3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9OiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0pIGF0IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgd2luZG93L3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3I6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSByZWFkOiBuZXZlciBnb2VzIHRvIE9USEVSIHNvdXJjZXMgLSB0aGUgY2FsbGVyIGlzIGFub3RoZXIgc3RvcmUsIGFuZCBjaGFzaW5nIE9VUiByZW1vdGUgaG9sZGVycyB3aGlsZSBhbnN3ZXJpbmcgaXQgaXMgaG93IGluZmluaXRlIGdldCBsb29wcyBiZXR3ZWVuIHN0b3JlcyBmb3JtIC0gYnV0IHRoZSBJTkRFWCBzdGlsbCBnYXRlcywgYmVjYXVzZSBpdCBpcyB0aGUgc291cmNlIG9mIHRydXRoOiBhIG1hcmtlZCBkZWxldGlvbiBrZWVwcyBpdHMgYnl0ZXMgb24gZGlzayBhcyBoaXN0b3J5IChzZWUgd3JpdGVUb1NvdXJjZXMpLCBzbyB0aGUgZGlzayBhbG9uZSB3b3VsZCBoYXBwaWx5IHNlcnZlIGEgREVMRVRFRCBmaWxlIGFzIGxpdmUuIEluZGV4IHNheXMgbGl2ZSAtPiB0aGUgZGlzayBwcm92aWRlcyB0aGUgYnl0ZXMgKHBhc3QgYW55IHdyaXRlIGRlbGF5LCBzbyBhIGZhc3Qgd3JpdGUgc3RpbGwgYnVmZmVyZWQgaW4gbWVtb3J5IGlzIGludmlzaWJsZSBoZXJlOyB0aGUgY2FsbGVyIHJlLWZpbmRzIGl0IG9uY2UgaXQgZmx1c2hlcykuIEluZGV4IHNheXMgZGVsZXRlZCAtPiB0aGUgdG9tYnN0b25lIGlzIHRoZSBhbnN3ZXIsIG5ldmVyIHRoZSBkaXNrLiBObyB3aW5kb3cgb3Igcm91dGUgY2hlY2tzLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW50ZXJuYWwyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbmNsdWRlVG9tYnN0b25lcz86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBpZiAoIXRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpKSB7XG4gICAgICAgICAgICAvLyBEZWxldGVkLCBvciBuZXZlciBoZXJlOiBhIGZsYWctY2FsbGVyIChhIHBlZXIgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIG5lZWRzIHRvIHNlZSBvdXIgZGVsZXRpb25zLCBub3QganVzdCBvdXIgY29udGVudFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbmNsdWRlVG9tYnN0b25lcykge1xuICAgICAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZCkgcmV0dXJuIHsgZGF0YTogQnVmZmVyLmFsbG9jKDApLCB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERpc2tTb3VyY2UoKS5kaXNrLmdldDIoa2V5LCB7IHJhbmdlOiBjb25maWcucmFuZ2UgfSk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogcmVzdWx0LmRhdGEsIHdyaXRlVGltZTogcmVzdWx0LndyaXRlVGltZSwgc2l6ZTogcmVzdWx0LnNpemUgfTtcbiAgICB9XG5cbiAgICAvKiogSW50ZXJuYWwgKHN0b3JlLXRvLXN0b3JlKSB3cml0ZTogdGhlIGxvY2FsIGRpc2sgcGx1cyBvdXIgaW5kZXgsIHdpdGggTk8gZG93bnN0cmVhbSBmYW4tb3V0IC0gdGhlIHB1c2hpbmcgc3RvcmUgb3ducyBwcm9wYWdhdGlvbiwgYW5kIGZhbm5pbmcgaXRzIHB1c2hlcyBiYWNrIG91dCBpcyBob3cgd3JpdGUgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybS4gT25seS10YWtlLWxhdGVzdCBzdGlsbCBhcHBsaWVzIGhlcmUuICovXG4gICAgcHJpdmF0ZSBhc3luYyBzZXRJbnRlcm5hbChrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgYXNzZXJ0VmFsaWRMYXN0TW9kaWZpZWQoY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgc3RheSBvbiBvdXIgZGlzayBhcyBkZWxldGlvbiBoaXN0b3J5IChzZWUgd3JpdGVUb1NvdXJjZXMpIC0gdGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJkZWxcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZTogY29uZmlnLmxhc3RNb2RpZmllZCwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogXCJzZXRcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHNpemU6IGRhdGEubGVuZ3RoLCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSByZWFkJ3MgYnl0ZXMgY2FtZSBmcm9tIGEgcmVtb3RlIHNvdXJjZSwgc28gd3JpdGUgdGhlbSBvbnRvIG91ciBvd24gYmFzZSBzb3VyY2UgKHRoZSBsb2NhbCBkaXNrKSwgd2hpY2ggYmVjb21lcyB0aGUgZW50cnkncyBuZXcgaG9sZGVyIC0gcmVhZHMgb25seSBwYXkgdGhlIHJlbW90ZSBmZXRjaCBvbmNlXG4gICAgcHJpdmF0ZSBhc3luYyBjYWNoZVJlYWQoa2V5OiBzdHJpbmcsIHJlc3VsdDogeyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzWzBdLnNvdXJjZS5zZXQoa2V5LCByZXN1bHQuZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHJlc3VsdC53cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KDApIH0pO1xuICAgICAgICAvLyBBIGRvd24tY2FjaGUgcHVsbHMgdGhlIGJ5dGVzIG9mZiBhIHNvdXJjZSBleGFjdGx5IGxpa2Ugc3luY2hyb25pemF0aW9uIGRvZXMsIHNvIGl0IGNvdW50cyAoYW5kIGxvZ3MpIHRoZSBzYW1lIHdheVxuICAgICAgICB0aGlzLm5vdGVTeW5jVHJhbnNmZXIoXCJzeW5jIGdldFwiLCBrZXksIHJlc3VsdC5kYXRhLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNoYXJlZCBlbmdpbmUgb2Ygc2V0IGFuZCBkZWw6IGFuIGVtcHR5IGJ1ZmZlciBpcyBleGFjdGx5IGEgZGVsZXRpb24gaGVyZSwgd2hpY2ggaXMgd2h5IHRoZSBlbXB0eS1idWZmZXIgcmVqZWN0aW9uIGxpdmVzIGluIHNldCAodGhlIHB1YmxpYyBBUEkpLCBub3QgaW4gdGhpcyBtYWNoaW5lcnlcbiAgICBwcml2YXRlIGFzeW5jIHNldE9yRGVsZXRlKGtleTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25Xcml0ZUNvdW50ZWQ/LihcIm9yaWdpbmFsXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZCA9IGNvbmZpZy5sYXN0TW9kaWZpZWQ7XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAvLyBBbiBvbGRlciB3cml0ZSBuZXZlciBvdmVyd3JpdGVzIGEgbmV3ZXIgb25lIChzZWUgSUFyY2hpdmVzLnNldClcbiAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCBhd2FpdCB0aGlzLmN1cnJlbnRXcml0ZVRpbWUoa2V5KSkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3Qgd3JpdGVzIGFyZSBub3QgaGFuZGxlZCBoZXJlOiBhIHNvdXJjZSB0aGF0IHdhcyBjb25maWd1cmVkIHdpdGggYSB3cml0ZSBkZWxheSBidWZmZXJzIHRoZW0gaXRzZWxmIChzZWUgQXJjaGl2ZXNEZWxheWVkKSwgc28gdGhpcyB3cml0ZSBsYW5kcyBpbiBtZW1vcnkgYW5kIHJldHVybnMsIGV4YWN0bHkgYXMgaXQgd291bGQgaGF2ZS4gVGhlIGluZGV4IGlzIHVwZGF0ZWQgZWl0aGVyIHdheSwgc28gdGhlIHdyaXRlIGlzIGltbWVkaWF0ZWx5IHZpc2libGUgdG8gcmVhZGVycyBvZiB0aGlzIHN0b3JlLlxuICAgICAgICBhd2FpdCB0aGlzLndyaXRlVG9Tb3VyY2VzKGtleSwgZGF0YSwgTWF0aC5yb3VuZChsYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSkpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5zdGFudCBldmVyeSBkZWxheWVkIHdyaXRlIG11c3QgYmUgb24gaXRzIHNvdXJjZTogdGhlIGVuZCBvZiBvdXIgb3duIHdyaXRlIHdpbmRvdyB0aGF0IGNvbnRhaW5zIG5vdywgbWludXMgdGhlIGZsdXNoIG1hcmdpbiAoc28gdGhlIG5leHQgd2luZG93J3Mgc291cmNlIGZpbmRzIHRoZSBkYXRhIG9uIGhhbmRvZmYpLiBUaGUgTEFURVNUIGVuZCBhbW9uZyBjb3ZlcmluZyB3aW5kb3dzIC0gb3ZlcmxhcHBpbmcgd2luZG93cyBoYW5kIG9mZiBhdCB0aGUgbGFzdCBvbmUuIE5vIHdpbmRvdyBjb250YWlucyBub3cgKGFuIGluZXJ0IHN0b3JlLCBvciBhIG1vbWVudCBiZXR3ZWVuIG91ciB3aW5kb3dzKSAtPiAwLCBpLmUuIG5vdGhpbmcgbWF5IGJlIGRlbGF5ZWQgYXQgYWxsLiAqL1xuICAgIHB1YmxpYyB3cml0ZUZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gQmVmb3JlIHVwZGF0ZVNvdXJjZXMgaGFzIHJ1biB0aGVyZSBpcyBub3RoaW5nIHRvIGhvbGQgYSB3cml0ZSBhbnl3YXksIGFuZCBub3RoaW5nIG1heSBiZSBkZWxheWVkXG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkgcmV0dXJuIDA7XG4gICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBsZXQgZW5kID0gMDtcbiAgICAgICAgZm9yIChsZXQgdyBvZiB0aGlzLnNvdXJjZXNbMF0udmFsaWRXaW5kb3dzKSB7XG4gICAgICAgICAgICBpZiAod1swXSA8PSBub3cgJiYgbm93IDwgd1sxXSkgZW5kID0gTWF0aC5tYXgoZW5kLCB3WzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVuZCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBlbmQgLSBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyaXRhYmxlU291cmNlcyhjb25maWc/OiB7IGlnbm9yZVdpbmRvdz86IGJvb2xlYW4gfSk6IG51bWJlcltdIHtcbiAgICAgICAgbGV0IHdyaXRhYmxlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZz8uaWdub3JlV2luZG93ICYmICF3aW5kb3dzQWNjZXB0V3JpdGVzKHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHdyaXRhYmxlLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyaXRhYmxlO1xuICAgIH1cblxuICAgIC8vIE91ciBvd24gc291cmNlICh0aGUgZmlyc3Qgd3JpdGFibGUgb25lKSBwbHVzIGV2ZXJ5IHJvdXRlLW1hdGNoaW5nIHBlZXIuIEVhY2ggc291cmNlIGRlY2lkZXMgZm9yIGl0c2VsZiBob3cgbG9uZyBpdCBob2xkcyB0aGUgd3JpdGUgYmVmb3JlIGl0IGhpdHMgc3RvcmFnZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkgLSBoZXJlIHRoZXkgYWxsIGp1c3QgZ2V0IHdyaXR0ZW4uXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZVRvU291cmNlcyhrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGlzIE5FVkVSIHN5bmNocm9uaXplZCBiZXR3ZWVuIHN0b3JhZ2Ugbm9kZXM6IHRoZSB3cml0ZXIgd3JpdGVzIGl0IGRpcmVjdGx5IHRvIGVhY2ggbm9kZSwgc28gd2Ugc3RvcmUgaXQgb24gb3VyIG93biBkaXNrIG9ubHkgKG5vIHZhbGlkLXdpbmRvdyBmaWx0ZXIgLSByb3V0aW5nL3ZhbGlkIHdpbmRvd3MgY2FuJ3QgcG9zc2libHkgYXBwbHkgdG8gdGhlIGZpbGUgZGVmaW5pbmcgdGhlbSkgYW5kIG5ldmVyIGZvcndhcmQgaXQgdG8gb3RoZXIgc291cmNlcy5cbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJmbHVzaGVkXCIsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbGV0IGlzUm91dGluZyA9IGtleSA9PT0gUk9VVElOR19GSUxFO1xuICAgICAgICBsZXQgd3JpdGFibGUgPSB0aGlzLmdldFdyaXRhYmxlU291cmNlcyh7IGlnbm9yZVdpbmRvdzogaXNSb3V0aW5nIH0pO1xuICAgICAgICBsZXQgZmlyc3QgPSB3cml0YWJsZS5zaGlmdCgpO1xuICAgICAgICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzb3VyY2UgYWNjZXB0cyB3cml0ZXMgKGV2ZXJ5IHNvdXJjZSdzIHZhbGlkIHdpbmRvdyBpcyBpbiB0aGUgcGFzdCksIHNvIHdyaXRlcyBjYW5ub3QgYmUgc3RvcmVkIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG91ciBvd24gKGZpcnN0KSBzb3VyY2UgYmxvY2tzIHRoZSB3cml0ZS4gRG93bnN0cmVhbSBzb3VyY2VzIGFyZSB3cml0dGVuIGluIHRoZSBiYWNrZ3JvdW5kOiBhIGRvd24gZG93bnN0cmVhbSBzb3VyY2UgbXVzdCBub3QgZmFpbCBvciBzdGFsbCB3cml0ZXMsIGFuZCByZWNvbmNpbGlhdGlvbiByZS1zZW5kcyBhbnl0aGluZyB0aGV5IG1pc3NlZCBvbmNlIHRoZXkgY29tZSBiYWNrLlxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBieXRlcyBTVEFZIG9uIG91ciBkaXNrLCBhcyBkZWxldGlvbiBoaXN0b3J5OiB0aGUgaW5kZXggbWFya3MgdGhlIGtleSBkZWxldGVkIChrZWVwaW5nIGl0cyB2YWx1ZSAtIHNlZSBUcmFuc2FjdGlvbkZpbGUuZGVsZXRlKSwgcmVhZHMgc3RvcCBmaW5kaW5nIGl0LCBhbmQgdGhlIHJldGVudGlvbiBwYXNzIHBoeXNpY2FsbHkgcmVtb3ZlcyB0aGUgb2xkZXN0IGhpc3Rvcnkgb25jZSBpdCBvdXRncm93cyBpdHMgYnVkZ2V0IChzZWUgU3RvcmVTeW5jLmVuZm9yY2VIaXN0b3J5TGltaXQpLiBUaGUgbWFya2VkIGluZGV4IGVudHJ5IGlzIHRoZSB3aG9sZSBvZiB0aGUgbG9jYWwgZGVsZXRpb24uXG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RGVsZXRlZChrZXksIHdyaXRlVGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZXNbZmlyc3RdLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lLCBzaXplOiBkYXRhLmxlbmd0aCwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KGZpcnN0KSB9KTtcbiAgICAgICAgfVxuICAgICAgICBsb2dNdXRhdGlvbih7IG9wOiBkYXRhLmxlbmd0aCA9PT0gMCAmJiBcImRlbFwiIHx8IFwic2V0XCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBkYXRhLmxlbmd0aCwgd3JpdGVUaW1lIH0pO1xuICAgICAgICBpZiAoaXNSb3V0aW5nKSByZXR1cm47XG4gICAgICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGtleSk7XG4gICAgICAgIC8vIERlbGV0aW9ucyBkaWQgbm90IGNvbnN1bWUgdGhlIGZpcnN0IHNsb3QgKG5vdGhpbmcgaXMgd3JpdHRlbiBhbnl3aGVyZSBsb2NhbGx5KSwgc28gaXQgcmVjZWl2ZXMgdGhlIHByb3BhZ2F0ZWQgZGVsZXRpb24gbGlrZSB0aGUgcmVzdCAtIGV4Y2VwdCBzbG90IDAsIG91ciBvd24gZGlzaywgd2hvc2UgYnl0ZXMgQVJFIHRoZSBoaXN0b3J5IGJlaW5nIGtlcHRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwICYmIGZpcnN0ICE9PSAwKSB7XG4gICAgICAgICAgICB3cml0YWJsZS51bnNoaWZ0KGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpIG9mIHdyaXRhYmxlKSB7XG4gICAgICAgICAgICBpZiAoIXJvdXRlQ29udGFpbnModGhpcy5zb3VyY2VzW2ldLnJvdXRlLCByb3V0ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gRGVsZXRpb25zIHRyYXZlbCBhcyBkZWwgY2FycnlpbmcgdGhlIG9yaWdpbmFsIHdyaXRlIHRpbWUgKG5ldmVyIGFzIGVtcHR5IHNldHMgLSBzZXQgcmVqZWN0cyBlbXB0eSBidWZmZXJzKS4gQmFja2JsYXplIG1hdGVyaWFsaXplcyBzdWNoIGRlbHMgYXMgcmVhbCBlbXB0eSBmaWxlcywgc28gaXRzIGxpc3RpbmdzIHN0aWxsIHNob3cgdGhlIGRlbGV0aW9uIGZvciBvdGhlciBzdG9yZXMgdG8gc2NhbiBpbiBhcyBhIHRvbWJzdG9uZS5cbiAgICAgICAgICAgIGxldCBwdXNoOiBQcm9taXNlPHVua25vd24+O1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2UuZGVsKGtleSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoID0gdGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5zZXQoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQmFja2dyb3VuZCB3cml0ZSBvZiAke2tleX0gdG8gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNsb3QgMCBpcyBhbHdheXMgdGhpcyBzdG9yZSdzIG93biBmb2xkZXIgKHNlZSBwbGFuU291cmNlcyksIHNvIHRoZSBkaXNrIGlzIGtub3duIHdpdGhvdXQgc2VhcmNoaW5nIGZvciBpdCAtIGFuZCBpdCBpcyB0aGUgdW53cmFwcGVkIG9uZSwgcGFzdCBhbnkgd3JpdGUgZGVsYXlcbiAgICBwcml2YXRlIGdldERpc2tTb3VyY2UoKTogeyBkaXNrOiBBcmNoaXZlc0Rpc2s7IHNvdXJjZUluZGV4OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7IGRpc2s6IHRoaXMub3duRGlzaywgc291cmNlSW5kZXg6IDAgfTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgc3RpbGwgaGVsZCBieSBhIGRlbGF5ZWQgc291cmNlIChzZWUgQXJjaGl2ZXNEZWxheWVkKS4gZm9yY2UgYWxzbyB3cml0ZXMgd2hhdCBpc24ndCBkdWUgeWV0IC0gc2h1dGRvd24gY2Fubm90IGxlYXZlIHdyaXRlcyBpbiBtZW1vcnkuICovXG4gICAgcHJpdmF0ZSBhc3luYyBmbHVzaERlbGF5ZWRXcml0ZXMoZm9yY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAobGV0IHsgc291cmNlIH0gb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgZGVsYXllZCA9IGFzRGVsYXllZChzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFkZWxheWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5ZWQuZmx1c2goZm9yY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvblxufVxuIl19
1094
- /* _JS_SOURCE_HASH = "f5c2e37cf37ffd5677df0aef250af4c400dadff4e27618f02b615c996a3c5e85"; */
1090
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvYlN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmxvYlN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qix5REFBbUQ7QUFDbkQsbURBQThEO0FBQzlELGtFQUErRTtBQUMvRSw0Q0FHc0I7QUFDdEIsa0RBQW1FO0FBQ25FLGlEQUFtTjtBQUNuTiwyQ0FBNEM7QUFDNUMsdURBQXFEO0FBQ3JELHdEQUFxRDtBQUNyRCwrQ0FBNEM7QUFDNUMsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1Qyx1REFBNkQ7QUFDN0QsK0NBQTZFO0FBRTdFLHFnQkFBcWdCO0FBRXJnQixtTkFBbU47QUFDdE0sUUFBQSx1QkFBdUIsR0FBRyxtQkFBWSxHQUFHLENBQUMsQ0FBQztBQUN4RCxNQUFNLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDNUMsMkdBQTJHO0FBQzNHLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDO0FBQzdDLDJHQUEyRztBQUMzRyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTlDLG9NQUFvTTtBQUN2TCxRQUFBLGlCQUFpQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsbUtBQW1LO0FBQzVKLEtBQUssVUFBVSxnQkFBZ0I7SUFDbEMsT0FBTyxjQUFjLENBQUM7QUFDMUIsQ0FBQztBQUZELDRDQUVDO0FBb0NELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsdUJBQXVCLENBQUMsT0FBZTtJQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsR0FBRyx5QkFBeUI7UUFBRSxPQUFPO0lBQ3hFLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJ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RSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkksQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFOztnQkFDekIsSUFBQSw2QkFBZSxFQUFDLHVCQUF1QixHQUFHLG1CQUFtQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxhQUFhLE1BQUEsQ0FBQyxDQUFDLEtBQUssbUNBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6SixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0tBQWdLO0lBQ3hKLGFBQWE7UUFDakIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsNkpBQTZKO0lBQ3JKLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUFlO1FBQzVDLEtBQUssSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLE9BQU8sR0FBRyxJQUFBLDJCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsU0FBUztZQUN2QixNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7Q0FHSjtBQTNpQ0QsOEJBMmlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgdGltZUluTWludXRlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQge1xuICAgIElBcmNoaXZlcywgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEZpbmRDb25maWcsIEhvc3RlZENvbmZpZywgUmVtb3RlQ29uZmlnLCBTb3VyY2VDb25maWcsIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkLFxuICAgIHdpbmRvd3NBY2NlcHRXcml0ZXMsIFN5bmNBY3Rpdml0eSwgRlVMTF9ST1VURSwgRlVMTF9WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBTVE9SQUdFX05PVF9DT05GSUdVUkVELFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0Rpc2ssIGFwcGx5RmluZEluZm9TaGFwZSB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIGFzc2VydFZhbGlkUmVtb3RlQ29uZmlnLCBnZXRDb25maWdWZXJzaW9uLCBzb3VyY2VJZGVudGl0eSwgc291cmNlUGVyc2lzdGVudFVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgc2VsZWN0RW50cnlBdCB9IGZyb20gXCIuL3N0b3JlUGxhblwiO1xuaW1wb3J0IHsgc291cmNlV3JpdGVEZWxheSB9IGZyb20gXCIuL0FyY2hpdmVzRGVsYXllZFwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25GaWxlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uRmlsZVwiO1xuaW1wb3J0IHsgU291cmNlc0xpc3QgfSBmcm9tIFwiLi9zb3VyY2VzTGlzdFwiO1xuaW1wb3J0IHsgU3RvcmVTeW5jIH0gZnJvbSBcIi4vc3RvcmVTeW5jXCI7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlQ29uZmlnXCI7XG5pbXBvcnQgeyBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcbmltcG9ydCB7IGxvZ011dGF0aW9uLCBsb2dTdG9yYWdlRXJyb3IsIGxvZ1N0b3JhZ2VXYXJuIH0gZnJvbSBcIi4vc3RvcmFnZUxvZ3NcIjtcblxuLy8gVGhlIHN0b3JhZ2UgZW5naW5lIG9mIHRoZSByZW1vdGUgc3RvcmFnZSBzZXJ2ZXIuIERhdGEgbGl2ZXMgaW4gc3luY2hyb25pemF0aW9uIHNvdXJjZXMgKGF0IG1pbmltdW0gYW4gQXJjaGl2ZXNEaXNrLCB0aGUgbG9jYWwgZGlzayk7IEJsb2JTdG9yZSBrZWVwcyBhbiBpbmRleCBvZiBldmVyeSBmaWxlIChwYXRoLCBsYXN0IG1vZGlmaWVkIHRpbWUsIHNpemUsIGFuZCB3aGljaCBzb3VyY2UgY3VycmVudGx5IGhvbGRzIHRoZSBkYXRhKSBpbiBhIEJ1bGtEYXRhYmFzZTIsIGFuZCBhbnN3ZXJzIGV2ZXJ5IHJlYWQgZnJvbSBpdCAoc2VlIEFyY2hpdmVzU291cmNlIGluIElBcmNoaXZlcy50cykuIEtlZXBpbmcgdGhhdCBpbmRleCBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgc291cmNlcyBpcyBTdG9yZVN5bmMncyBqb2IsIG5vdCB0aGlzIGZpbGUnczsgd2hhdCBsaXZlcyBoZXJlIGlzIHRoZSBpbmRleCBpdHNlbGYsIHJlYWRzLCB3cml0ZXMsIGFuZCB0aGUgdmFsaWRhdGlvbiBhIHdyaXRlIGhhcyB0byBwYXNzLlxuXG4vLyBGYXN0IHdyaXRlcyBhcmUgbmV2ZXIgZGVsYXllZCBwYXN0IG91ciBvd24gdmFsaWQgd2luZG93LCBhbmQgd2l0aGluIHRoaXMgbWFyZ2luIG9mIHRoZSB3aW5kb3cncyBlbmQgdGhleSB3cml0ZSB0aHJvdWdoIGltbWVkaWF0ZWx5IC0gc28gd2hlbiB0aGUgbmV4dCB3aW5kb3cncyBzb3VyY2UgdGFrZXMgb3ZlciwgdGhlIHdyaXRlcyBhcmUgYWxyZWFkeSBvbiBkaXNrXG5leHBvcnQgY29uc3QgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gPSB0aW1lSW5NaW51dGUgKiA1O1xuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbi8vIE1hcmtzIGFuIHVwbG9hZCBpZCB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2ssIHNvIGl0IGNhbiBuZXZlciBjb2xsaWRlIHdpdGggb25lIEFyY2hpdmVzRGlzayBoYW5kZWQgb3V0XG5jb25zdCBESVNDQVJERURfVVBMT0FEX1BSRUZJWCA9IFwiZGlzY2FyZGVkX1wiO1xuLy8gc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGFuIHVuZGVsZXRlIGNhcnJpZXMgbm8gZGF0YSAtIHRoaXMgc2luZ2xlIGlnbm9yZWQgYnl0ZSBzYXRpc2ZpZXMgdGhlIHdpcmVcbmNvbnN0IFVOREVMRVRFX1BMQUNFSE9MREVSID0gQnVmZmVyLmZyb20oWzFdKTtcblxuLy8gRGVsZXRpb24gaGlzdG9yeTogZGVsZXRlZCBmaWxlcyBrZWVwIHRoZWlyIGJ5dGVzIG9uIGRpc2sgKG1hcmtlZCBpbiB0aGUgaW5kZXgpIHVudGlsIHRoZSBoaXN0b3J5IG91dGdyb3dzIG1heChISVNUT1JZX01JTl9CWVRFUywgbGl2ZSBieXRlcyAqIGhpc3RvcnkgZmFjdG9yKSAtIHNlZSBTdG9yZVN5bmMuZW5mb3JjZUhpc3RvcnlMaW1pdFxuZXhwb3J0IGNvbnN0IEhJU1RPUllfTUlOX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBISVNUT1JZX0ZBQ1RPUiA9IDE7XG4vKiogVGhlIG11bHRpcGxlIG9mIGEgc3RvcmUncyBsaXZlIGJ5dGVzIGl0cyBkZWxldGlvbiBoaXN0b3J5IG1heSBncm93IHRvLiBBc3luYyBzbyBpdCBjYW4gbGF0ZXIgYmVjb21lIGR5bmFtaWMgYW5kIHVzZXItY29uZmlndXJhYmxlOyBmb3Igbm93IGl0IGlzIGEgY29uc3RhbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SGlzdG9yeUZhY3RvcigpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBISVNUT1JZX0ZBQ1RPUjtcbn1cblxuXG4vKiogV2hhdCB3ZSBzdG9yZSBhYm91dCBhIGZpbGUuIEl0cyB0aW1lcyBhcmUgbm90IGluIGhlcmU6IHRoZSBpbmRleCBrZWVwcyB0aG9zZSBmb3IgZXZlcnkga2V5LCBkZWxldGVkIG9uZXMgaW5jbHVkZWQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiAqL1xudHlwZSBJbmRleFZhbHVlID0ge1xuICAgIHNpemU6IG51bWJlcjtcbiAgICAvLyBXaGljaCBzeW5jaHJvbml6YXRpb24gc291cmNlIGN1cnJlbnRseSBob2xkcyB0aGUgZGF0YTogdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzb3VyY2UncyBVUkwgaW4gdGhlIHN0b3JlJ3MgYXBwZW5kLW9ubHkgc291cmNlcyBsaXN0IChzZWUgU291cmNlc0xpc3QpIC0gTk9UIGEgcG9zaXRpb24gaW4gdGhlIGluLW1lbW9yeSBzb3VyY2VzIGFycmF5LCB3aGljaCBjaGFuZ2VzIGJldHdlZW4gcnVuc1xuICAgIHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiBPbmUgZmlsZSB3ZSBob2xkLCBhcyBldmVyeXRoaW5nIG91dHNpZGUgdGhlIGluZGV4IHNlZXMgaXQuICovXG5leHBvcnQgdHlwZSBJbmRleEVudHJ5ID0gSW5kZXhWYWx1ZSAmIHtcbiAgICB3cml0ZVRpbWU6IG51bWJlcjtcbiAgICAvLyBXaGVuIFdFIGxhc3QgY2hhbmdlZCB0aGlzIGVudHJ5IChub3QgdGhlIGZpbGUncyB3cml0ZSB0aW1lKSDigJQgd2hhdCBnZXRDaGFuZ2VzQWZ0ZXIyIGZpbHRlcnMgb24sIHNvIGxhdGUtYXJyaXZpbmcgZmlsZXMgd2l0aCBvbGQgd3JpdGUgdGltZXMgYXJlIHN0aWxsIHJlcG9ydGVkXG4gICAgY2hhbmdlZEF0OiBudW1iZXI7XG59O1xuXG4vLyBPbmUgc291cmNlIG9mIGEgbGl2ZSBzb3VyY2UtbGlzdCB1cGRhdGU7IHNlZSBCbG9iU3RvcmUudXBkYXRlU291cmNlc1xuZXhwb3J0IHR5cGUgQmxvYlNvdXJjZVNwZWMgPSB7XG4gICAgLy8gTWF0Y2hlZCBhZ2FpbnN0IEFyY2hpdmVzU291cmNlLmlkZW50aXR5IChcImRpc2tcIiBmb3IgdGhlIGJhc2Ugc2xvdCk7IGVxdWFsIGlkZW50aXRpZXMgcGFpciBvZmYgaW4gb3JkZXJcbiAgICBpZGVudGl0eTogc3RyaW5nO1xuICAgIC8vIFNlZSBBcmNoaXZlc1NvdXJjZS51cmxcbiAgICB1cmw6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvd3M6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLy8gU2VlIEFyY2hpdmVzU291cmNlLmludGVybWVkaWF0ZVxuICAgIGludGVybWVkaWF0ZT86IHN0cmluZztcbiAgICAvLyBTZWUgQXJjaGl2ZXNTb3VyY2Uuc291cmNlQ29uZmlnIChhYnNlbnQgZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlKVxuICAgIHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZztcbiAgICAvLyBPbmx5IGNhbGxlZCBmb3Igc291cmNlcyB0aGF0IGRvbid0IG1hdGNoIGFuIGV4aXN0aW5nIGxpdmUgc2xvdFxuICAgIGNyZWF0ZTogKCkgPT4gSUFyY2hpdmVzO1xuICAgIC8vIFRoZSBvcHBvc2l0ZSBjYXNlOiB0aGUgZW5kcG9pbnQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBvbmx5IGl0cyBjb25maWcgY2hhbmdlZCwgc28gdGhlIFJVTk5JTkcgc291cmNlIGlzIGhhbmRlZCB0aGUgbmV3IG9uZSAoc2VlIGFwcGx5U291cmNlQ29uZmlnKVxuICAgIGFwcGx5Q29uZmlnPzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB2b2lkO1xufTtcblxubGV0IGxhc3RXcm9uZ1RhcmdldExvZyA9IDA7XG5mdW5jdGlvbiBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RXcm9uZ1RhcmdldExvZyA8IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUpIHJldHVybjtcbiAgICBsYXN0V3JvbmdUYXJnZXRMb2cgPSBEYXRlLm5vdygpO1xuICAgIGxvZ1N0b3JhZ2VFcnJvcihtZXNzYWdlKTtcbn1cblxuLy8gVGhlIGJ1Y2tldCBzdG9yZSwgYW5kIHRoZSBvbmx5IG9uZTogZXZlcnkgYnVja2V0IGEgc2VydmVyIGhvbGRzIGlzIHNlcnZlZCBieSB0aGVzZSwgb25lIHBlciBzdG9yZSBuYW1lIGluIGl0cyByb3V0aW5nIGNvbmZpZy4gSXRzIHNvdXJjZXMgYXJlIHBsYWluIElBcmNoaXZlcyAtIHRoZSBmaXJzdCBpcyBhbHdheXMgdGhlIHN0b3JlJ3Mgb3duIGRpc2sgZm9sZGVyLCB0aGUgcmVzdCBhcmUgdGhlIGNvbmZpZ3VyZWQgcGVlcnMgKHNlZSBjcmVhdGVTdG9yZVNvdXJjZSkgLSBzbyBcIm5vIHN5bmNocm9uaXphdGlvblwiIGlzIHNpbXBseSBhIHN0b3JlIHdpdGggbm8gcGVlcnMsIG5vdCBhIGRpZmZlcmVudCBraW5kIG9mIHN0b3JlLlxuZXhwb3J0IGNsYXNzIEJsb2JTdG9yZSB7XG4gICAgLy8g4pSA4pSAIHN0YXRlIOKUgOKUgFxuICAgIC8vIFNldCBvbmNlIHRoZSBzdG9yZSBpcyBzaHV0dGluZyBkb3duOyBldmVyeSBsb29wIGl0IG93bnMgKGFuZCBTdG9yZVN5bmMncyBtYWludGVuYW5jZSBsb29wcykgc3RvcHMgb24gaXRcbiAgICBwdWJsaWMgc3RvcHBlZCA9IHsgc3RvcDogZmFsc2UgfTtcbiAgICAvLyBXaGV0aGVyIGluaXQgaGFzIHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIGEgbmV3bHkgYWRkZWQgc291cmNlIGNhbiBzdGFydCBzY2FubmluZyBpbW1lZGlhdGVseVxuICAgIHB1YmxpYyBzeW5jU3RhcnRlZCA9IGZhbHNlO1xuICAgIC8qKiBJdHMgc291cmNlcywgaW4gY29uZmlnIG9yZGVyOiBzbG90IDAgaXMgYWx3YXlzIGl0cyBvd24gZGlzayBmb2xkZXIsIHRoZSByZXN0IGFyZSB0aGUgcGVlcnMgaXQgc3luY2hyb25pemVzIHdpdGguIEZpbGxlZCBieSB1cGRhdGVTb3VyY2VzLCB3aGljaCBpcyBhbHNvIGhvdyB0aGV5IGNoYW5nZS4gVGhlIHN0b3JlIE9XTlMgdGhlbSAtIHdyaXRlcyBwaWNrIGFtb25nIHRoZW0sIHJlYWRzIHJlc29sdmUgaG9sZGVycyB0aHJvdWdoIHRoZW0gLSBhbmQgU3RvcmVTeW5jIG9ubHkgc2NhbnMgd2hhdGV2ZXIgaXMgaW4gaGVyZSBhdCB0aGUgdGltZS4gKi9cbiAgICBwdWJsaWMgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IFtdO1xuICAgIC8vIFVwbG9hZHMgaW1tdXRhYmlsaXR5IGFscmVhZHkgZGVjaWRlZCBhZ2FpbnN0OiB0aGUgY2xpZW50IGlzIG1pZC1zdHJlYW0gYnkgdGhlIHRpbWUgd2Uga25vdywgc28gaXQga2VlcHMgc2VuZGluZyBhbmQgZXZlcnkgcGFydCBpcyBkcm9wcGVkXG4gICAgcHJpdmF0ZSBkaXNjYXJkZWRVcGxvYWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBuZXh0RGlzY2FyZGVkVXBsb2FkID0gMTtcbiAgICAvLyBUaGUgcGVyc2lzdGVudCBpZGVudGl0aWVzIGJlaGluZCBJbmRleEVudHJ5LnNvdXJjZXNMaXN0SW5kZXggKHNlZSBTb3VyY2VzTGlzdClcbiAgICBwcml2YXRlIHNvdXJjZXNMaXN0OiBTb3VyY2VzTGlzdDtcbiAgICAvLyBQZXIgc2xvdDogdGhlIHBlcnNpc3RlbnQgc291cmNlc0xpc3RJbmRleCBvZiB0aGF0IHNsb3QncyBVUkwsIGZpbGxlZCBieSByZWdpc3RlclNsb3QgYmVmb3JlIHRoZSBzbG90J3Mgc3luYyBydW5zXG4gICAgcHJpdmF0ZSBzbG90U291cmNlc0xpc3RJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgc2xvdFJlZ2lzdHJhdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIC8vIEV2ZXJ5IGZpbGUgd2Uga25vdyBvZiwgaW4gbWVtb3J5LCB3aXRoIGFuIGFwcGVuZC1vbmx5IGxvZyBvZiB0aGUgY2hhbmdlcyBiZWhpbmQgaXQgKHNlZSBUcmFuc2FjdGlvbkZpbGUpLiBBIG5ldyBmaWxlIG5hbWUgZWFjaCB0aW1lIHRoZSBlbnRyeSBmb3JtYXQgY2hhbmdlcyBnZW5lcmF0aW9uOiB0aGUgcHJldmlvdXMgb25lcyBjYW5ub3QgYmUgcmVhZCwgYW5kIGEgc2NhbiByZWJ1aWxkcyB0aGUgaW5kZXggYW55d2F5LCBzbyB0aGV5IGFyZSBzaW1wbHkgbmV2ZXIgcmVhZCBhZ2Fpbi5cbiAgICBwcml2YXRlIGluZGV4OiBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT47XG4gICAgLyoqIEtlZXBpbmcgdGhlIGluZGV4IGluIGFncmVlbWVudCB3aXRoIHRoZSBzb3VyY2VzOiBzY2FubmluZywgcHVsbGluZywgcHVzaGluZywgYW5kIHRoZSBtYWludGVuYW5jZSB0aGF0IGZvbGxvd3MgZnJvbSBob2xkaW5nIGFuIGluZGV4IChkaXNrLWxpbWl0IGV2aWN0aW9uLCB0b21ic3RvbmUgZXhwaXJ5KS4gSXQgcmVhZHMgYW5kIHdyaXRlcyB0aGlzIHN0b3JlJ3MgaW5kZXggYW5kIHNvdXJjZXMgLSBpdCBkb2VzIG5vdCBvd24gdGhlbS4gKi9cbiAgICBwdWJsaWMgc3luYzogU3RvcmVTeW5jO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8vIFB1YmxpYyBmb3IgU3RvcmVTeW5jLCB3aGljaCBsb2dzIGl0IHdpdGggZXZlcnl0aGluZyBpdCBkb2VzXG4gICAgICAgIHB1YmxpYyBmb2xkZXI6IHN0cmluZyxcbiAgICAgICAgLyoqIFRoZSBuYW1lIHRoaXMgc3RvcmUgYW5zd2VycyB0byAoc2VlIENvbW1vbkNvbmZpZy5uYW1lKSAtIHRoZSBlbnRyaWVzIG9mIHRoZSByb3V0aW5nIGNvbmZpZyB0aGF0IGNhcnJ5IGl0IGFyZSB0aGUgb25lcyB0aGF0IGNvbmZpZ3VyZSBpdCwgYW5kIHRoZSByZXN0IGFyZSBpdHMgcGVlcnMuICovXG4gICAgICAgIHB1YmxpYyBzdG9yZU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSBjb25maWc/OiB7XG4gICAgICAgICAgICAvKiogV2hldGhlciBhIGNvbmZpZyBlbnRyeSBpcyBUSElTIFNFUlZFUiAoc2FtZSBhY2NvdW50LCBzYW1lIGJ1Y2tldCwgb3VyIG93biBhZGRyZXNzKS4gSW5qZWN0ZWQgYmVjYXVzZSBhIHN0b3JlIGtub3dzIG5vdGhpbmcgYWJvdXQgc2VydmVycyAtIGl0IG9ubHkgbmVlZHMgdG8gdGVsbCBpdHMgb3duIGVudHJpZXMgYXBhcnQgZnJvbSBpdHMgcGVlcnMnLiBBYnNlbnQgbWVhbnMgbm90aGluZyBpcyB1cywgd2hpY2ggaXMgd2hhdCBhIGJhcmUgc3RvcmUgKG5vIHNlcnZlciBhcm91bmQgaXQpIHdhbnRzLiAqL1xuICAgICAgICAgICAgaXNTZWxmPzogKHNvdXJjZTogU291cmNlQ29uZmlnKSA9PiBib29sZWFuO1xuICAgICAgICAgICAgLyoqIEJ1aWxkcyBvbmUgb2YgaXRzIHNvdXJjZXMuIEluamVjdGVkIGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCBiZWNhdXNlIHRoZSBkZWxheSBpdCBpcyBjcmVhdGVkIHdpdGggaXMgdGhpcyBzdG9yZSdzIHBvbGljeS4gKi9cbiAgICAgICAgICAgIGNyZWF0ZVNvdXJjZT86IChjb25maWc6IHsgc291cmNlQ29uZmlnPzogU291cmNlQ29uZmlnOyB3cml0ZURlbGF5OiBudW1iZXIgfSkgPT4gSUFyY2hpdmVzO1xuICAgICAgICAgICAgLyoqIEhhbmRzIGEgcnVubmluZyBzb3VyY2UgYSBjaGFuZ2VkIGNvbmZpZywgc28gYW4gZW5kcG9pbnQgd2UgYWxyZWFkeSB0YWxrIHRvIGlzIG5ldmVyIHJlYnVpbHQganVzdCBiZWNhdXNlIGEgZmxhZyBtb3ZlZC4gKi9cbiAgICAgICAgICAgIGFwcGx5U291cmNlPzogKHNvdXJjZTogSUFyY2hpdmVzLCBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZCwgd3JpdGVEZWxheTogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEga2V5J3MgaW5kZXggZW50cnkgY2hhbmdlcyAob3VyIG93biB3cml0ZXMgQU5EIGZpbGVzIHB1bGxlZCBpbiB2aWEgc3luY2hyb25pemF0aW9uKSDigJQgaG93IHRoZSBzdG9yYWdlIHNlcnZlciBub3RpY2VzIHJvdXRpbmcgY29uZmlnIHVwZGF0ZXMuXG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZD86IChrZXk6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgICAgICAgIC8qKiBDYWxsZWQgZXZlcnkgdGltZSB0aGlzIHN0b3JlIGFwcGxpZXMgYSByb3V0aW5nIGNvbmZpZyB0byBpdHNlbGYgKHN0YXJ0dXAsIGFuIG9wZXJhdG9yJ3Mgd3JpdGUsIGEgcGVlcidzIGNvcHkgYXJyaXZpbmcpIC0gdGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIHRoZSBzZXJ2ZXIgYXJtcyB3aW5kb3ctYm91bmRhcnkgc2NhbnMgZnJvbSBpdC4gKi9cbiAgICAgICAgICAgIG9uUm91dGluZ0FwcGxpZWQ/OiAocm91dGluZzogUmVtb3RlQ29uZmlnKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEFza3MgdGhlIGNsaWVudCB3aG9zZSByZXF1ZXN0IGNyZWF0ZWQgdGhpcyBzdG9yZSB3aGF0IHJvdXRpbmcgY29uZmlnIGl0IGludGVuZGVkIGZvciBvdXIgbmFtZS4gT25seSB1c2VkIHdoZW4gaW5pdCBmaW5kcyBOTyBjb25maWd1cmF0aW9uIGluIG91ciBmb2xkZXI6IGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBzbyB0aGUgcmVxdWVzdGVyIGhhcyB0aGF0IGNvbmZpZyAtIGFza2luZyBmb3IgaXQgbGF6aWx5IGlzIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHBhc3NpbmcgdGhlIGNvbmZpZyBvbiBldmVyeSBjYWxsLCB3aXRob3V0IHRoZSBwZXItY2FsbCBraWxvYnl0ZXMuICovXG4gICAgICAgICAgICByZXF1ZXN0Um91dGluZ0NvbmZpZz86ICgpID0+IFByb21pc2U8UmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkPjtcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGFjY2VwdGVkIHdyaXRlIChcIm9yaWdpbmFsXCIpIGFuZCBldmVyeSB3cml0ZSB0aGF0IGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNvdXJjZXMgKFwiZmx1c2hlZFwiKS4gRmFzdCB3cml0ZXMgY29hbGVzY2UsIHNvIHRoZSB0d28gY291bnRzIGRpZmZlci5cbiAgICAgICAgICAgIG9uV3JpdGVDb3VudGVkPzogKGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKSA9PiB2b2lkO1xuICAgICAgICAgICAgLyoqIEEgc3luY2hyb25pemF0aW9uIHRyYW5zZmVyOiBcInN5bmMgZ2V0XCIgaXMgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSAodGhlIGJhY2tibGF6ZSBkb3dubG9hZCBiaWxsKSwgXCJzeW5jIHNldFwiIGlzIGJ5dGVzIHB1c2hlZCB0byBvbmUuIEluamVjdGVkIGJlY2F1c2Ugc3luYyB0cmFmZmljIG5ldmVyIHBhc3NlcyB0aHJvdWdoIHRoZSBBUEkgY29udHJvbGxlciwgc28gbm90aGluZyBlbHNlIGNhbiBjb3VudCBpdC4gKi9cbiAgICAgICAgICAgIG9uU3luY1RyYW5zZmVyPzogKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgICAgICAgICAvLyBSZXNvbHZlcyBhIHBlcnNpc3RlZCBzb3VyY2UgVVJMIChzZWUgQXJjaGl2ZXNTb3VyY2UudXJsKSB0byBhIGNhY2hlZCBJQXJjaGl2ZXMsIHNvIGVudHJpZXMgd2hvc2UgaG9sZGVyIGlzIG5vIGxvbmdlciBjb25maWd1cmVkIGNhbiBzdGlsbCBiZSByZWFkXG4gICAgICAgICAgICByZXNvbHZlU291cmNlVXJsPzogKHVybDogc3RyaW5nKSA9PiBJQXJjaGl2ZXM7XG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzTGlzdCA9IG5ldyBTb3VyY2VzTGlzdChwYXRoLmpvaW4oZm9sZGVyLCBcImluZGV4XCIsIFwic291cmNlc0xpc3QudHh0XCIpKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBUcmFuc2FjdGlvbkZpbGU8SW5kZXhWYWx1ZT4ocGF0aC5qb2luKGZvbGRlciwgXCJpbmRleFwiLCBcImJsb2JJbmRleDMubG9nXCIpKTtcbiAgICAgICAgdGhpcy5zeW5jID0gbmV3IFN0b3JlU3luYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdG9yZUNvbmZpZyA9IG5ldyBTdG9yZUNvbmZpZyhzdG9yZU5hbWUsIFtdKTtcbiAgICAgICAgdGhpcy5vd25EaXNrID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH1cblxuICAgIC8qKiBUaGlzIHN0b3JlJ3MgZm9sZGVyLCB1bndyYXBwZWQ6IHRoZSBzYW1lIGJ5dGVzIHNsb3QgMCBzZXJ2ZXMsIGJ1dCByZWFjaGVkIHdpdGhvdXQgaXRzIHdyaXRlIGRlbGF5LiBVc2VkIGZvciB0aGUgdHdvIHRoaW5ncyB0aGF0IGNhbm5vdCBnbyB0aHJvdWdoIGEgYnVmZmVyZWQgc291cmNlIC0gcmVhZGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIGJlZm9yZSB3ZSBoYXZlIGFueSBzb3VyY2VzLCBhbmQgc3RyZWFtaW5nIGEgbGFyZ2UgdXBsb2FkIHRoYXQgbXVzdCBub3Qgc2l0IGluIG1lbW9yeS4gKi9cbiAgICBwcml2YXRlIG93bkRpc2s6IEFyY2hpdmVzRGlzaztcblxuICAgIC8qKiBXaGF0IHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCB0byBiZS4gSXQgb3ducyB0aGlzOiB0aGUgcm91dGluZyBjb25maWcgaXMgYSBmaWxlIElOIHRoZSBzdG9yZSwgc28gdGhlIHN0b3JlIHJlYWRzIGl0LCBhcHBsaWVzIGl0IHRvIGl0c2VsZiwgYW5kIHJlLWFwcGxpZXMgaXQgd2hlbmV2ZXIgdGhlIGZpbGUgY2hhbmdlcyAtIGJ5IG91ciBvd24gd3JpdGUsIG9yIGJ5IGEgcGVlcidzIGNvcHkgYXJyaXZpbmcgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIHN0b3JlQ29uZmlnOiBTdG9yZUNvbmZpZztcbiAgICAvLyBUaGUgcm91dGluZyBjb25maWcgdGhpcyBzdG9yZSBsYXN0IGFwcGxpZWQsIHNvIGEgd3JpdGUgb2YgYW4gaWRlbnRpY2FsIChvciBvbGRlcikgb25lIGlzIG5vdCByZS1hcHBsaWVkXG4gICAgcHJpdmF0ZSBhcHBsaWVkUm91dGluZ1ZlcnNpb24gPSAtMTtcbiAgICAvLyAuLi5hbmQgdGhlIGNvbmZpZyBpdHNlbGYsIHNvIGEgcmVqZWN0aW9uIGNhbiBzYXkgZXhhY3RseSB3aGF0IHRoZSBzdG9yZSBJUyBydW5uaW5nIGluc3RlYWQgb2YgZ3Vlc3NpbmdcbiAgICBwcml2YXRlIGFwcGxpZWRSb3V0aW5nOiBSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyAjcmVnaW9uIE1haW4gaW50ZXJmYWNlXG5cbiAgICBwdWJsaWMgaW5pdCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBDb25maWd1cmUgZmlyc3Q6IHRoZSBjb25maWcgZGVjaWRlcyB3aGF0IHRoZSBzb3VyY2VzIEFSRSwgYW5kIGV2ZXJ5dGhpbmcgYmVsb3cgaXMgcGVyIHNvdXJjZS4gV2l0aCBubyBjb25maWcgYXQgYWxsIHRoYXQgaXMganVzdCBvdXIgb3duIGRpc2ssIHdoaWNoIGlzIGVub3VnaCB0byBzZXJ2ZSBhbmQgdG8gYmUgd3JpdHRlbiB0by5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgLy8gTm8gY29uZmlndXJhdGlvbiBpbiBvdXIgZm9sZGVyIGF0IGFsbCAtIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGlzIHN0b3JlIHdhcyBqdXN0IENSRUFURUQgYnkgYSByZXF1ZXN0LCBiZWZvcmUgYW55IGNvbmZpZyB3cml0ZSByZWFjaGVkIGl0LiBUaGUgcmVxdWVzdGVyIGtub3dzIGV4YWN0bHkgd2hhdCBjb25maWcgaXQgaW50ZW5kZWQgZm9yIG91ciBuYW1lLCBzbyBhc2sgaXQuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5sZW5ndGggJiYgdGhpcy5jb25maWc/LnJlcXVlc3RSb3V0aW5nQ29uZmlnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBwcm92aWRlZCA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3RSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTdG9yZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gKGZvbGRlciAke3RoaXMuZm9sZGVyfSkgaW5pdGlhbGl6ZWQgd2l0aCBubyBjb25maWd1cmF0aW9uOyB0aGUgcmVxdWVzdGluZyBjbGllbnQgcHJvdmlkZWQgcm91dGluZyBjb25maWcgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocHJvdmlkZWQpfSAtIGFkb3B0aW5nIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmFpZ2h0IG9udG8gdGhlIGRpc2ssIG5vdCB0aHJvdWdoIHNldCgpOiBzZXQgd2FpdHMgZm9yIGluaXQsIHdoaWNoIGlzIHdoYXQgaXMgcnVubmluZyByaWdodCBub3dcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vd25EaXNrLnNldChST1VUSU5HX0ZJTEUsIEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhwcm92aWRlZCkpLCB7IGxhc3RNb2RpZmllZDogTWF0aC5yb3VuZChEYXRlLm5vdygpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dTdG9yYWdlV2FybihgU3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pIGluaXRpYWxpemVkIHdpdGggbm8gY29uZmlndXJhdGlvbiwgYW5kIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBoYWQgbm8gcm91dGluZyBjb25maWcgbmFtaW5nIGl0IGVpdGhlciAtIHJ1bm5pbmcgdW5jb25maWd1cmVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQXNraW5nIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBmb3IgdGhlIHJvdXRpbmcgY29uZmlnIG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQgLSBydW5uaW5nIHVuY29uZmlndXJlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclNsb3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWZ0ZXIgdGhlIHNsb3RzLCB3aGljaCBpcyB3aGF0IGluZGV4IGVudHJpZXMgbmFtZSBhcyB0aGVpciBob2xkZXJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkSW5kZXgoKTtcbiAgICAgICAgdGhpcy5zeW5jU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3luYy5zdGFydCgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmUtcmVhZHMgdGhlIHJvdXRpbmcgY29uZmlnIG91dCBvZiB0aGlzIHN0b3JlIGFuZCBhcHBsaWVzIGl0IHRvIGl0c2VsZi4gQ2FsbGVkIGF0IHN0YXJ0dXAgYW5kXG4gICAgICogd2hlbmV2ZXIgdGhhdCBmaWxlIGNoYW5nZXMgaGVyZSAtIHdoaWNoIGlzIHRoZSBPTkUgbWVjaGFuaXNtOiBhIGNvbmZpZyB3cml0dGVuIGJ5IGFuIG9wZXJhdG9yXG4gICAgICogYW5kIGEgY29uZmlnIHB1bGxlZCBvZmYgYSBwZWVyIGFyZSB0aGUgc2FtZSBldmVudCwgYSB3cml0ZSBvZiB0aGF0IHBhdGggaW50byB0aGlzIHN0b3JlLlxuICAgICAqXG4gICAgICogQSBzdG9yZSB3aXRoIG5vIHJvdXRpbmcgY29uZmlnIGNvbmZpZ3VyZXMgaXRzZWxmIGFzIGl0cyBvd24gZGlzaywgdmFsaWQgYWx3YXlzLCBmb3IgdGhlIHdob2xlXG4gICAgICoga2V5IHNwYWNlLiBUaGF0IGlzIGEgY29tcGxldGUsIHdvcmtpbmcgc3RvcmUgLSBpdCBqdXN0IGhhcyBub2JvZHkgdG8gc3luY2hyb25pemUgd2l0aCAtIGFuZCBpdFxuICAgICAqIGlzIHdoYXQgbGV0cyBhIHN0b3JlIGV4aXN0IGJlZm9yZSBpdCBoYXMgZXZlciBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGFwcGx5Um91dGluZ0NvbmZpZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCB0aGlzLnJlYWRSb3V0aW5nQ29uZmlnKCk7XG4gICAgICAgIGxldCBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSA9IFtdO1xuICAgICAgICBsZXQgcGVlcnM6IFNvdXJjZUNvbmZpZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nPy5zb3VyY2VzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICBpZiAoc291cmNlLm5hbWUgPT09IHRoaXMuc3RvcmVOYW1lICYmIHRoaXMuY29uZmlnPy5pc1NlbGY/Lihzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKHNvdXJjZSBhcyBIb3N0ZWRDb25maWcpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVlcnMucHVzaChzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0aW5nICYmICFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nU3RvcmFnZVdhcm4oYFRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSAodmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24ocm91dGluZyl9KSBkb2VzIG5vdCBuYW1lIHRoaXMgc3RvcmUgKCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSkgYXMgb25lIG9mIG91cnMsIHNvIGl0IHN0YXlzIGEgZGlzay1vbmx5IHN0b3JlYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXZpb3VzVmVyc2lvbiA9IHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgICAgICBsZXQgbmV3VmVyc2lvbiA9IHJvdXRpbmcgJiYgZ2V0Q29uZmlnVmVyc2lvbihyb3V0aW5nKSB8fCAtMTtcbiAgICAgICAgaWYgKG5ld1ZlcnNpb24gIT09IHByZXZpb3VzVmVyc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoZm9sZGVyICR7dGhpcy5mb2xkZXJ9KSBhZG9wdGVkIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtwcmV2aW91c1ZlcnNpb259IC0+ICR7bmV3VmVyc2lvbn06ICR7ZW50cmllcy5sZW5ndGh9IGVudHIke2VudHJpZXMubGVuZ3RoID09PSAxICYmIFwieVwiIHx8IFwiaWVzXCJ9IG9mIG91cnMgJHtKU09OLnN0cmluZ2lmeShlbnRyaWVzLm1hcCh4ID0+ICh7IHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCByb3V0ZTogeC5yb3V0ZSB8fCBGVUxMX1JPVVRFIH0pKSl9LCAke3BlZXJzLmxlbmd0aH0gcGVlcihzKWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcmVDb25maWcudXBkYXRlKGVudHJpZXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZXModGhpcy5wbGFuU291cmNlcyhwZWVycykpO1xuICAgICAgICB0aGlzLmFwcGxpZWRSb3V0aW5nVmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICAgIHRoaXMuYXBwbGllZFJvdXRpbmcgPSByb3V0aW5nO1xuICAgICAgICBpZiAocm91dGluZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWc/Lm9uUm91dGluZ0FwcGxpZWQ/Lihyb3V0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSByb3V0aW5nIGNvbmZpZyBhcyB0aGlzIHN0b3JlIGhvbGRzIGl0LCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgZm9sZGVyOiB0aGUgc3RvcmUgbWF5IGJlIGNvbmZpZ3VyaW5nIGl0c2VsZiBiZWZvcmUgaXQgaGFzIHNjYW5uZWQgYW55dGhpbmcsIGFuZCB0aGlzIGZpbGUgaXMgd2hhdCBkZWNpZGVzIHdoYXQgYSBzY2FuIHdvdWxkIGV2ZW4gdGFsayB0b1xuICAgIHByaXZhdGUgYXN5bmMgcmVhZFJvdXRpbmdDb25maWcoKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLm93bkRpc2suZ2V0KFJPVVRJTkdfRklMRSk7XG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFVucGFyc2VhYmxlIHJlYWRzIGFzIFwibm8gY29uZmlnXCIgKHBhcnNlUm91dGluZ0RhdGEgbG9ncyBpdCkgLSBhIHN0b3JlIG11c3QgbmV2ZXIgYmUgdW5hYmxlIHRvIHN0YXJ0IGJlY2F1c2UgaXRzIG93biByb3V0aW5nIGZpbGUgaXMgdG9yblxuICAgICAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHZlcnNpb24gb2YgdGhlIHJvdXRpbmcgY29uZmlnIHRoaXMgc3RvcmUgaXMgcnVubmluZywgc28gYSBjb3B5IGZvdW5kIG9uIGEgcGVlciBpcyBvbmx5IHRha2VuIHdoZW4gaXQgaXMgZ2VudWluZWx5IG5ld2VyLiAtMSBtZWFucyBpdCBoYXMgbm9uZS4gKi9cbiAgICBwdWJsaWMgcm91dGluZ1ZlcnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbGllZFJvdXRpbmdWZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEFwcGx5aW5nIGl0IHRvdWNoZXMgdGhlIHNvdXJjZXMsIHNvIGl0IGlzIHNlcmlhbGl6ZWQgYmVoaW5kIHdoYXRldmVyIGFwcGxpY2F0aW9uIGlzIGFscmVhZHkgcnVubmluZyByYXRoZXIgdGhhbiBpbnRlcmxlYXZpbmcgd2l0aCBpdFxuICAgIHByaXZhdGUgcm91dGluZ0FwcGxpZXM6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBwdWJsaWMgcmVhcHBseVJvdXRpbmdDb25maWcoKTogdm9pZCB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5yb3V0aW5nQXBwbGllcy50aGVuKCgpID0+IHRoaXMuYXBwbHlSb3V0aW5nQ29uZmlnKCkpO1xuICAgICAgICB0aGlzLnJvdXRpbmdBcHBsaWVzID0gbmV4dC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB2b2lkIG5leHQuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyBpbiBzdG9yZSAke3RoaXMuZm9sZGVyfSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIGRpc2sgZmlyc3QgKGFsd2F5cyksIHRoZW4gZXZlcnkgcGVlciB3aG9zZSByb3V0ZSBvdmVybGFwcyBvdXJzIC0gdGhlIHNvdXJjZXMgdGhpcyBzdG9yZSBzeW5jaHJvbml6ZXMgd2l0aCwgYXMgaXRzIG93biBjb25maWcgZGVzY3JpYmVzIHRoZW1cbiAgICBwcml2YXRlIHBsYW5Tb3VyY2VzKHBlZXJzOiBTb3VyY2VDb25maWdbXSk6IEJsb2JTb3VyY2VTcGVjW10ge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpO1xuICAgICAgICBsZXQgbWFrZVNwZWMgPSAoc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQsIHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdLCByb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgbm9GdWxsU3luYzogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IEJsb2JTb3VyY2VTcGVjID0+IHtcbiAgICAgICAgICAgIGxldCB3cml0ZURlbGF5ID0gc291cmNlV3JpdGVEZWxheSh7IHNvdXJjZUNvbmZpZywgZmFzdDogc2VsZi5mYXN0LCB3cml0ZURlbGF5OiBzZWxmLndyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlUGVyc2lzdGVudFVybChzb3VyY2VDb25maWcsIHRoaXMuZm9sZGVyKSxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvd3MsXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNyZWF0ZWQgPSB0aGlzLmNvbmZpZz8uY3JlYXRlU291cmNlPy4oeyBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIHN0b3JlIGhhcyBubyB3YXkgdG8gYnVpbGQgc291cmNlcywgc28gaXQgY2Fubm90IHVzZSAke0pTT04uc3RyaW5naWZ5KHNvdXJjZUNvbmZpZz8udXJsIHx8IHRoaXMuZm9sZGVyKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KS4gUGFzcyBjcmVhdGVTb3VyY2UuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBseUNvbmZpZzogKHNvdXJjZTogSUFyY2hpdmVzKSA9PiB0aGlzLmNvbmZpZz8uYXBwbHlTb3VyY2U/Lihzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICAvLyBPdXIgb3duIGRpc2sgYWNjZXB0cyB3cml0ZXMgd2hpbGUgQU5ZIHdpbmRvdyB0aGlzIHN0b3JlIGhvbGRzIGlzIG9wZW47IHdpdGggbm8gY29uZmlnIGF0IGFsbCBpdCBpcyBzaW1wbHkgYWx3YXlzIHZhbGlkXG4gICAgICAgIGxldCBvd25XaW5kb3dzID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5tYXAoeCA9PiB4LnZhbGlkV2luZG93KTtcbiAgICAgICAgbGV0IHNwZWNzOiBCbG9iU291cmNlU3BlY1tdID0gW21ha2VTcGVjKHVuZGVmaW5lZCwgb3duV2luZG93cy5sZW5ndGggJiYgb3duV2luZG93cyB8fCBbRlVMTF9WQUxJRF9XSU5ET1ddLCB1bmRlZmluZWQsIHVuZGVmaW5lZCldO1xuICAgICAgICAvLyBPbmUgc3BlYyBwZXIgZW5kcG9pbnQsIGNhcnJ5aW5nIGFsbCBvZiBpdHMgd2luZG93czogYSBzd2l0Y2hvdmVyIHNwbGl0cyBvbmUgd2luZG93IGFyb3VuZCBhbiBpbnRlcm1lZGlhdGUsIGFuZCB0aGF0IGlzIHN0aWxsIG9uZSBzb3VyY2UgdG8gdXNcbiAgICAgICAgbGV0IGJ5SWRlbnRpdHkgPSBuZXcgTWFwPHN0cmluZywgQmxvYlNvdXJjZVNwZWM+KCk7XG4gICAgICAgIGZvciAobGV0IHBlZXIgb2YgcGVlcnMpIHtcbiAgICAgICAgICAgIGxldCBzaGFyZWQgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmLnJvdXRlLCBwZWVyLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZGVudGl0eSA9IHNvdXJjZUlkZW50aXR5KHBlZXIpO1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gYnlJZGVudGl0eS5nZXQoaWRlbnRpdHkpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcudmFsaWRXaW5kb3dzLnB1c2gocGVlci52YWxpZFdpbmRvdyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3BlYyA9IG1ha2VTcGVjKHBlZXIsIFtwZWVyLnZhbGlkV2luZG93XSwgc2hhcmVkLCBwZWVyLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jKTtcbiAgICAgICAgICAgIGJ5SWRlbnRpdHkuc2V0KGlkZW50aXR5LCBzcGVjKTtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwZWNzO1xuICAgIH1cblxuICAgIC8vIFN0b3BzIGFsbCBzeW5jaHJvbml6YXRpb24gc2NhbnMvcG9sbHMgYW5kIGZsdXNoZXMgcGVuZGluZyB3cml0ZXMuIE9ubHkgdXNlZCB3aGVuIHRoZSBzdG9yZSBnZW51aW5lbHkgY2Fubm90IGNvbnRpbnVlIChpdHMgcm91dGUgb3IgZGlzayBsaW1pdCBjaGFuZ2VkLCBwcm9jZXNzIHNodXRkb3duKSAtIHJvdXRpbmUgY29uZmlnIGNoYW5nZXMgZ28gdGhyb3VnaCB1cGRhdGVTb3VyY2VzIGluc3RlYWQsIHdoaWNoIHRoZSBzdG9yZSBzdXJ2aXZlcy5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5zdG9wcGVkLnN0b3AgPSB0cnVlO1xuICAgICAgICB0aGlzLnN5bmMuc3RvcCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmZsdXNoRGVsYXllZFdyaXRlcyh0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbmRleC5mbHVzaCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9OyBpbnRlcm5hbD86IGJvb2xlYW47IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbjsgaW5jbHVkZU1hcmtlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoY29uZmlnLmludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbnRlcm5hbDIoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBsZXQgcmFuZ2UgPSBjb25maWcucmFuZ2U7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIC8vIEEgbWFya2VkIGRlbGV0aW9uIHN0aWxsIGhhcyBpdHMgYnl0ZXMsIGFuZCB0aGUga2VwdCB2YWx1ZSBzYXlzIHdoZXJlIC0gc28gYW4gaW5jbHVkZU1hcmtlZCByZWFkIGlzIGEgbm9ybWFsIHJlYWQgdGhyb3VnaCB0aGUgbWFya2VkIGVudHJ5IChpdCBqdXN0IG11c3Qgbm90IFJFLUlOREVYIGFueXRoaW5nOiBzZWUgdGhlIG1hcmtlZFJlYWQgZ3VhcmRzIGJlbG93KVxuICAgICAgICBsZXQgbWFya2VkUmVhZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWVudHJ5ICYmIGNvbmZpZy5pbmNsdWRlTWFya2VkKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuZ2V0TWFya2VkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIG1hcmtlZFJlYWQgPSAhIWVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmluY2x1ZGVUb21ic3RvbmVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gQSBkZWxldGlvbiBoYXMgbm8gYnl0ZXMgLSB0aGUgdG9tYnN0b25lIElTIHRoZSBhbnN3ZXIsIHNvIGEgZmxhZy1jYWxsZXIgZ2V0cyBpdHMgdGltZSB3aXRoIGVtcHR5IGRhdGFcbiAgICAgICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgICAgIGlmICghZGVsZXRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luYy5ub3RlQWNjZXNzKGtleSk7XG4gICAgICAgIGxldCBob2xkZXJBcmNoaXZlcyA9IGF3YWl0IHRoaXMuZ2V0RW50cnlIb2xkZXIoZW50cnkpO1xuICAgICAgICBsZXQgcmVzdWx0OiB7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9sZGVyRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaG9sZGVyQXJjaGl2ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZVRvbWJzdG9uZXM6IHRoZSBob2xkZXIgYW5zd2VyaW5nIFwiZGVsZXRlZFwiIChhIHRvbWJzdG9uZSwgd2l0aCBpdHMgd3JpdGUgdGltZSkgbXVzdCBiZSBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIkkgbG9zdCB0aGUgZmlsZVwiIC0gdGhlIGZvcm1lciBpcyBhdXRob3JpdGF0aXZlIGFuZCBtdXN0IE5PVCBmYWxsIGJhY2sgdG8gb2xkZXIgY29waWVzLCB3aGljaCB3b3VsZCByZXN1cnJlY3QgdGhlIGRlbGV0aW9uIGZvciB0aGlzIHJlYWRcbiAgICAgICAgICAgICAgICBsZXQgYW5zd2VyID0gYXdhaXQgaG9sZGVyQXJjaGl2ZXMuZ2V0MihrZXksIHsgcmFuZ2UsIGludGVybmFsOiB0cnVlLCBpbmNsdWRlVG9tYnN0b25lczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmICFhbnN3ZXIuZGF0YS5sZW5ndGggJiYgIShyYW5nZSAmJiBhbnN3ZXIuc2l6ZSkgJiYgYW5zd2VyLndyaXRlVGltZSA+PSBlbnRyeS53cml0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYSByYW5nZWQgcmVhZCBvZiBhIHJlYWwgZmlsZSBjYW4gbGVnaXRpbWF0ZWx5IGJlIGVtcHR5IChyYW5nZSBwYXN0IEVPRiksIHNvIG9ubHkgdW5yYW5nZWQgZW1wdGluZXNzIG1lYW5zIHRvbWJzdG9uZS9hYnNlbnRcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyICYmIGFuc3dlci5kYXRhICYmIChhbnN3ZXIuZGF0YS5sZW5ndGggfHwgcmFuZ2UgJiYgYW5zd2VyLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsgZGF0YTogYW5zd2VyLmRhdGEsIHdyaXRlVGltZTogYW5zd2VyLndyaXRlVGltZSwgc2l6ZTogYW5zd2VyLnNpemUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaG9sZGVyRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFJhbmdlZCByZWFkcyBjYW4ndCBwb3B1bGF0ZSBhIGNhY2hlICh0aGV5J3JlIHBhcnRpYWwpLCBhbmQgYSBtYXJrZWQgcmVhZCBtdXN0IG5vdCByZS1pbmRleCBhbnl0aGluZyAtIGNhY2hpbmcgd291bGQgcmVzdXJyZWN0IHRoZSBkZWxldGVkIGtleSBhcyBsaXZlXG4gICAgICAgICAgICBpZiAoIW1hcmtlZFJlYWQgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCAmJiAhcmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhY2hlUmVhZChrZXksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSByb3V0aW5nIGZpbGUgaXMgb25seSBldmVyIHJlYWQgb2ZmIG91ciBvd24gZGlzayAtIGZhbGxpbmcgYmFjayB0byBhbm90aGVyIHNvdXJjZSdzIGNvcHkgd291bGQgc3luY2hyb25pemUgaXQgYmV0d2VlbiBub2RlcyB0aHJvdWdoIHRoZSByZWFkIHBhdGgsIHdoaWNoIGl0IG5ldmVyIGlzXG4gICAgICAgIGlmIChrZXkgPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgaWYgKGhvbGRlckVycm9yKSB0aHJvdyBob2xkZXJFcnJvcjtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGhvbGRlciBpcyBkb3duIG9yIGxvc3QgdGhlIGZpbGUuIEFOWSBvdGhlciBzb3VyY2UncyBjb3B5IGJlYXRzIG5vIHZhbHVlIC0gZXZlbiBhbiBPTERFUiBvbmUgLSBhbmQgaXQncyBjb3BpZWQgb250byBvdXIgZGlzayBzbyB0aGUgbmV4dCByZWFkIGRvZXNuJ3QgZGVwZW5kIG9uIGx1Y2suXG4gICAgICAgIGxldCBob2xkZXJTbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBob2xkZXJTbG90IHx8ICF0aGlzLmlzTGl2ZShpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgZmFsbGJhY2s6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBhbnN3ZXIgPSBhd2FpdCB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldDIoa2V5LCB7IGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IGRhdGEgY291bnRzIGFzIGFic2VudCAtIGEgdG9tYnN0b25lLCBub3QgY29udGVudCAodGhpcyByZWFkIGlzIHVucmFuZ2VkLCBzbyBlbXB0aW5lc3MgaXMgdW5hbWJpZ3VvdXMpXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlciAmJiBhbnN3ZXIuZGF0YSAmJiBhbnN3ZXIuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSB7IGRhdGE6IGFuc3dlci5kYXRhLCB3cml0ZVRpbWU6IGFuc3dlci53cml0ZVRpbWUsIHNpemU6IGFuc3dlci5zaXplIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIEEgbWFya2VkIHJlYWQgbXVzdCBub3QgcmUtaW5kZXggYW55dGhpbmcgLSBjYWNoaW5nIHdvdWxkIHJlc3VycmVjdCB0aGUgZGVsZXRlZCBrZXkgYXMgbGl2ZVxuICAgICAgICAgICAgaWYgKCFtYXJrZWRSZWFkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWNoZVJlYWQoa2V5LCBmYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGZhbGxiYWNrLmRhdGE7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zdWJhcnJheShNYXRoLm1pbihyYW5nZS5zdGFydCwgZGF0YS5sZW5ndGgpLCBNYXRoLm1pbihyYW5nZS5lbmQsIGRhdGEubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhLCB3cml0ZVRpbWU6IGZhbGxiYWNrLndyaXRlVGltZSwgc2l6ZTogZmFsbGJhY2suc2l6ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChob2xkZXJFcnJvcikgdGhyb3cgaG9sZGVyRXJyb3I7XG4gICAgICAgIC8vIFRoZSBob2xkZXIgYW5zd2VyZWQgXCJub3QgdGhlcmVcIiBhbmQgbm8gb3RoZXIgc291cmNlIGhhcyBpdCBlaXRoZXI6IHRoZSBlbnRyeSB3YXMgc3RhbGUuIEZvcmdvdHRlbiByYXRoZXIgdGhhbiBkZWxldGVkIC0gbm90aGluZyBoYXBwZW5lZCB0byB0aGlzIGZpbGUsIHdlIHdlcmUgc2ltcGx5IHdyb25nIGFib3V0IGhvbGRpbmcgaXQsIGFuZCBzYXlpbmcgb3RoZXJ3aXNlIHdvdWxkIHB1c2ggYSBkZWxldGlvbiBvdXQgdG8gZXZlcnlvbmUgZWxzZS4gKE5ldmVyIGZvciBhIG1hcmtlZCByZWFkOiBwdXJnaW5nIHdvdWxkIGVyYXNlIHRoZSBkZWxldGlvbidzIHRvbWJzdG9uZS4pXG4gICAgICAgIGlmICghbWFya2VkUmVhZCkge1xuICAgICAgICAgICAgdGhpcy5wdXJnZUluZGV4RW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuOyB1bmRlbGV0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgeyBwYXRoOiBrZXksIGRhdGEgfSA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbXB0eSB3cml0ZSByZWZ1c2VkOiBzZXQgd2FzIGNhbGxlZCB3aXRoIGFuIGVtcHR5IGJ1ZmZlciBmb3IgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pOiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24gaW4gdGhpcyBzeXN0ZW0gYW5kIHdvdWxkIHJlYWQgYmFjayBhcyBtaXNzaW5nIC0gY2FsbCBkZWwgaW5zdGVhZGApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQgd3JpdGVUaW1lID0gTWF0aC5yb3VuZChjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBmaWxlIGRlZmluZXMgdGhlIHdpbmRvd3Mvcm91dGVzLCBzbyB0aGV5IGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIGl0IChhbmQgaXQgbmV2ZXIgZmxvd3MgdGhyb3VnaCB2YWxpZGF0aW9uKSAtIGJ1dCBpdCBoYXMgYSBydWxlIG9mIGl0cyBvd24sIHdoaWNoIGlzIG91cnMgdG8gZW5mb3JjZSBiZWNhdXNlIHRoZSBmaWxlIGlzIG91cnNcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydFJvdXRpbmdDb25maWdXcml0YWJsZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy51bmRlbGV0ZSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgdW5kZWxldGVkIChpdCBjYW5ub3QgYmUgZGVsZXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVuZGVsZXRlS2V5KGtleSwgd3JpdGVUaW1lLCBjb25maWcuaW50ZXJuYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSAmJiB0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tdXRhYmlsaXR5IHdpbnM6IGFuIGV4aXN0aW5nIHBhdGggaXMga2VwdCBpbnN0ZWFkIG9mIHRoZSBwdXNoIHRocm93aW5nIChzZWUgU2V0Q29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlKVxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydE11dGFibGUoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBza2lwcyBldmVyeSBvdGhlciBjaGVjazogaXQgaXMgdGhlIGZpbGUgdGhhdCBERUZJTkVTIG91ciB3aW5kb3dzIGFuZCByb3V0ZXMsIHNvIGp1ZGdpbmcgaXQgYnkgdGhlIGNvbmZpZyBpdCBpcyBhYm91dCB0byByZXBsYWNlIGlzIGhvdyBhIHN0b3JlIGdldHMgc3R1Y2sgb24gYSBjb25maWcgaXQgY2FuIG5ldmVyIGJlIHRvbGQgdG8gbGVhdmVcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleSwgY29uZmlnLmxhc3RNb2RpZmllZCwgcm91dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWcubGFzdE1vZGlmaWVkIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0T3JEZWxldGUoa2V5LCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnLmxhc3RNb2RpZmllZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGtleSA9IGNvbmZpZy5wYXRoO1xuICAgICAgICBpZiAoa2V5ID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIC8vIEEgZGVsZXRpb24gbGFuZHMgaW4gZXhhY3RseSB0aGUgc2FtZSBwbGFjZSBhIHdyaXRlIHdvdWxkLCBzbyBpdCBpcyBqdWRnZWQgdGhlIHNhbWUgd2F5OiBvbmUgYWltZWQgYXQgYSBzaGFyZCB3ZSBkb24ndCBzZXJ2ZSBpcyBqdXN0IGFzIGludmlzaWJsZSBhcyBhIHdyaXRlIHRvIGl0XG4gICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCBnZXRSb3V0ZShrZXkpLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBkZWxldGlvbnMgbXVzdCBjYXJyeSBsYXN0TW9kaWZpZWQgKHRoZXkgYXJlIHN5bmNocm9uaXphdGlvbiBwdXNoZXMsIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIGRlbGV0aW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hc3NlcnRJbnRlcm5hbFdyaXRlQWNjZXB0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgICAgIC8vIHNldEludGVybmFsIHRyZWF0cyBhbiBlbXB0eSBidWZmZXIgYXMgZXhhY3RseSBhIGRlbGV0aW9uOiBkaXNrIHJlbW92YWwgcGx1cyBhIHRvbWJzdG9uZSBpbmRleCBlbnRyeSwgbm8gZmFuLW91dFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnRlcm5hbChrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVsZXRlcyBhcmUgd3JpdGVzIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKTogdGhlIHRvbWJzdG9uZSBpcyBvcmRlcmVkIGJ5IHdyaXRlIHRpbWUgbGlrZSBhbnkgb3RoZXIgd3JpdGUsIHByb3BhZ2F0ZXMgdGhyb3VnaCBzeW5jaHJvbml6YXRpb24sIGFuZCBpcyBldmVudHVhbGx5IGV4cGlyZWRcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRPckRlbGV0ZShrZXksIEJ1ZmZlci5hbGxvYygwKSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgfVxuXG4gICAgLyoqIEEgbm9kZS1zaWRlIG1vdmU6IHRoZSBieXRlcyBuZXZlciB0cmF2ZWwgdGhyb3VnaCB0aGUgY2xpZW50LiBEZWxpYmVyYXRlbHkganVzdCBnZXQyICsgc2V0ICsgZGVsIHJhdGhlciB0aGFuIGEgZGlzayByZW5hbWUsIHNvIHRoZSBkZXN0aW5hdGlvbiB3cml0ZSBwYXNzZXMgRVZFUlkgcnVsZSBhIHNldCBwYXNzZXMgKHdpbmRvd3MsIHJvdXRlcywgaW1tdXRhYmlsaXR5LCBvbmx5LXRha2UtbGF0ZXN0LCBpbmRleCwgZmFuLW91dCB0byBwZWVycykgYW5kIHRoZSBkZWxldGlvbiBwcm9wYWdhdGVzIGFzIGEgbm9ybWFsIHRvbWJzdG9uZSAtIGEgcmVuYW1lIHdvdWxkIGJ5cGFzcyBhbGwgb2YgaXQuIFRoZSBzZXQgc3RhbXBzIGZyZXNoLCBzbyB0aGUgbW92ZWQgZmlsZSBiZWF0cyBhbnkgdG9tYnN0b25lIGF0IGl0cyBuZXcgcGF0aC4gKi9cbiAgICBwdWJsaWMgYXN5bmMgbW92ZShjb25maWc6IHsgZnJvbVBhdGg6IHN0cmluZzsgdG9QYXRoOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5mcm9tUGF0aCA9PT0gY29uZmlnLnRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoY29uZmlnLmZyb21QYXRoID09PSBST1VUSU5HX0ZJTEUgfHwgY29uZmlnLnRvUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBtb3ZlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0Mih7IHBhdGg6IGNvbmZpZy5mcm9tUGF0aCB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHNvdXJjZSBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShjb25maWcuZnJvbVBhdGgpfSB0byAke0pTT04uc3RyaW5naWZ5KGNvbmZpZy50b1BhdGgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5zZXQoeyBwYXRoOiBjb25maWcudG9QYXRoLCBkYXRhOiByZXN1bHQuZGF0YSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kZWwoeyBwYXRoOiBjb25maWcuZnJvbVBhdGggfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwibW92ZVwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGNvbmZpZy5mcm9tUGF0aCwgdG9QYXRoOiBjb25maWcudG9QYXRoLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBsZXQga2V5ID0gY29uZmlnLnBhdGg7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgaW5kZXggbWVhbnMgaXQgZG9lcyBub3QgZXhpc3QgaGVyZTogdGhlIGluZGV4IElTIHRoZSBhbnN3ZXIsIGFuZCBzY2FubmluZyBoZWFscyBpdCBvbiBpdHMgb3duIHNjaGVkdWxlLiBBbiBlbnRyeSB3aG9zZSBob2xkZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgbGlzdCBpcyBzdGlsbCB2YWxpZCAtIGdldEVudHJ5SG9sZGVyIHJlc29sdmVzIHRoZSBwZXJzaXN0ZWQgVVJMIGRpcmVjdGx5LCBhbmQgZ2V0MidzIGZhbGxiYWNrIGxvb3AgY292ZXJzIGEgaG9sZGVyIHRoYXQgaXMgZ29uZSBlbnRpcmVseS5cbiAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5nZXRJbmRleEVudHJ5KGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkgcmV0dXJuIHsgd3JpdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfTtcbiAgICAgICAgaWYgKCFjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkZWxldGVkID0gdGhpcy5nZXREZWxldGVkRW50cnkoa2V5KTtcbiAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IGRlbGV0ZWQud3JpdGVUaW1lLCBzaXplOiAwIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKGNvbmZpZzogRmluZENvbmZpZyAmIHsgcHJlZml4OiBzdHJpbmcgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgcHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICAgICAgbGV0IGluZm9zID0gbmV3IE1hcDxzdHJpbmcsIEFyY2hpdmVGaWxlSW5mbz4oKTtcbiAgICAgICAgLy8gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSBhdCBhbGwsIHdoaWNoIGlzIHdoYXQgYSBsaXN0aW5nIHdhbnRzOiBhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlXG4gICAgICAgIGZvciAobGV0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmluZGV4RW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gU2VlIEZpbmRDb25maWcuaW50ZXJuYWw6IGFuIGVudHJ5IGhlbGQgYnkgb25lIG9mIG91ciBPVEhFUiBzb3VyY2VzIGNhbm5vdCBiZSBzZXJ2ZWQgdG8gYSBwZWVyJ3MgaW50ZXJuYWwgcmVhZCwgc28gaXQgbXVzdCBub3QgYmUgbGlzdGVkIHRvIG9uZSBlaXRoZXJcbiAgICAgICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuaW5jbHVkZU1hcmtlZCkge1xuICAgICAgICAgICAgLy8gQSBrZXkgaXMgbGl2ZSBPUiBtYXJrZWQsIG5ldmVyIGJvdGgsIHNvIHRoaXMgY2Fubm90IGNvbGxpZGUgd2l0aCB0aGUgbG9vcCBhYm92ZVxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMubWFya2VkRW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpbmZvcy5zZXQoa2V5LCB7IHBhdGg6IGtleSwgY3JlYXRlVGltZTogZW50cnkud3JpdGVUaW1lLCBzaXplOiBlbnRyeS5zaXplIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlcyA9IGFwcGx5RmluZEluZm9TaGFwZShBcnJheS5mcm9tKGluZm9zLnZhbHVlcygpKSwgcHJlZml4LCB7IHNoYWxsb3c6IGNvbmZpZy5zaGFsbG93LCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgc29ydChmaWxlcywgeCA9PiB4LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmlsZXM7XG4gICAgfVxuXG4gICAgLy8gQWxsIGZpbGVzIGNoYW5nZWQgYWZ0ZXIgY29uZmlnLnRpbWUg4oCUIHN0cmFpZ2h0IGZyb20gdGhlIGluZGV4LiBGaWx0ZXJzIG9uIHdoZW4gV0UgbGVhcm5lZCBvZiB0aGUgY2hhbmdlIChjaGFuZ2VkQXQpLCBzbyBmaWxlcyBzeW5jaHJvbml6ZWQgbGF0ZSAod2l0aCBvbGQgd3JpdGUgdGltZXMpIGFyZSBzdGlsbCByZXBvcnRlZC4gRGVsZXRpb25zIEFSRSByZXBvcnRlZCwgYXMgc2l6ZS0wIGVudHJpZXM6IGEgY2FsbGVyIHJlYWRpbmcgYSBjaGFuZ2UgZmVlZCBoYXMgdG8gaGVhciBhYm91dCB0aGVtLCBhbmQgc2l6ZSAwIGlzIGhvdyB0aGUgZmVlZCBzYXlzIFwiZ29uZVwiIChhbiBlbXB0eSBmaWxlIElTIGEgbWlzc2luZyBmaWxlKS4gY29uZmlnLnJvdXRlcyBsZXRzIGEgc3RvcmUgc3luY2luZyBhIHBhcnRpYWwgc2hhcmQgYXNrIGZvciBqdXN0IGl0cyBzbGljZS5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyMihjb25maWc6IENoYW5nZXNBZnRlckNvbmZpZyk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy53YWl0Rm9yUmVxdWlyZWRTY2FucygpO1xuICAgICAgICBsZXQgaW5Sb3V0ZXMgPSAoa2V5OiBzdHJpbmcpID0+ICFjb25maWcucm91dGVzIHx8IGNvbmZpZy5yb3V0ZXMuc29tZShyb3V0ZSA9PiByb3V0ZUNvbnRhaW5zKHJvdXRlLCBnZXRSb3V0ZShrZXkpKSk7XG4gICAgICAgIGxldCBmaWxlczogQXJjaGl2ZUZpbGVJbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMuaW5kZXhFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5jaGFuZ2VkQXQgPD0gY29uZmlnLnRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFpblJvdXRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFNlZSBDaGFuZ2VzQWZ0ZXJDb25maWcuaW50ZXJuYWwgKGRlbGV0aW9ucyBiZWxvdyBhcmUgYWx3YXlzIHJlcG9ydGVkIC0gdGhleSBhcmUgaW5kZXgtb25seSlcbiAgICAgICAgICAgIGlmIChjb25maWcuaW50ZXJuYWwgJiYgdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KSAhPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiBlbnRyeS53cml0ZVRpbWUsIHNpemU6IGVudHJ5LnNpemUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUuY2hhbmdlZEF0IDw9IGNvbmZpZy50aW1lKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghaW5Sb3V0ZXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgcGF0aDoga2V5LCBjcmVhdGVUaW1lOiB0b21ic3RvbmUud3JpdGVUaW1lLCBzaXplOiAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvcnQoZmlsZXMsIHggPT4geC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgaW5kZXgncyB0b3RhbHMgcGx1cyBhbnkgaW4tcHJvZ3Jlc3MgYmFja2dyb3VuZCBzeW5jaHJvbml6YXRpb24uICovXG4gICAgcHVibGljIGdldFN5bmNQcm9ncmVzcygpOiB7XG4gICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9O1xuICAgICAgICBtYXJrZWQ6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH07XG4gICAgICAgIHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W107XG4gICAgICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICAgICAgc3luY2luZzogU3luY0FjdGl2aXR5W107XG4gICAgfSB7XG4gICAgICAgIGxldCB0b3RhbHMgPSB0aGlzLm5hbWVkSW5kZXhUb3RhbHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4OiB7IGZpbGVDb3VudDogdG90YWxzLmZpbGVDb3VudCwgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50IH0sXG4gICAgICAgICAgICBtYXJrZWQ6IHRoaXMubWFya2VkVG90YWxzKCksXG4gICAgICAgICAgICBzb3VyY2VzOiB0b3RhbHMuc291cmNlcyxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogdGhpcy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBzeW5jaW5nOiB0aGlzLnN5bmMuZ2V0QWN0aXZpdGllcygpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBnZXRTeW5jUHJvZ3Jlc3MncyB0b3RhbHMsIGJ1dCBsb2FkaW5nIHRoZSBpbmRleCBmaXJzdCwgc28gdGhleSBhcmUgbmV2ZXIgdGhlIHplcm9lcyBvZiBhIHN0b3JlIG5vdGhpbmcgaGFzIHRvdWNoZWQgeWV0LiAqL1xuICAgIHB1YmxpYyBhc3luYyBjb21wdXRlSW5kZXhUb3RhbHMoKTogUHJvbWlzZTx7XG4gICAgICAgIGZpbGVDb3VudDogbnVtYmVyO1xuICAgICAgICBieXRlQ291bnQ6IG51bWJlcjtcbiAgICAgICAgc291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXTtcbiAgICB9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEluZGV4VG90YWxzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYW1lZEluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgdG90YWxzID0gdGhpcy5pbmRleFRvdGFscygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZUNvdW50OiB0b3RhbHMuZmlsZUNvdW50LFxuICAgICAgICAgICAgYnl0ZUNvdW50OiB0b3RhbHMuYnl0ZUNvdW50LFxuICAgICAgICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzXG4gICAgICAgICAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHsgZGVidWdOYW1lOiB4LnNvdXJjZS5nZXREZWJ1Z05hbWUoKSwgLi4udG90YWxzLnNsb3RzW2ldIH0pKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgsIGkpID0+IHRoaXMuaXNMaXZlKGkpKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RvcmUncyBzb3VyY2VzLCBhcyB0aGUgY3VycmVudCByb3V0aW5nIGNvbmZpZyBzYXlzIHRoZXkgc2hvdWxkIGJlLiBUaGlzIGlzIHRoZSBPTkxZIHdheVxuICAgICAqIHRoZXkgYXJlIGV2ZXIgc2V0OiB0aGUgZmlyc3QgY2FsbCBwb3B1bGF0ZXMgYW4gZW1wdHkgc3RvcmUsIGV2ZXJ5IGxhdGVyIG9uZSBhcHBsaWVzIGEgY2hhbmdlIHRvXG4gICAgICogdGhlIHJ1bm5pbmcgb25lLiBXaW5kb3dzLCByb3V0ZXMgYW5kIGZsYWdzIG1vdmUgaW4gcGxhY2UsIGdlbnVpbmVseSBuZXcgZW5kcG9pbnRzIGFyZSBhZGRlZCBhbmRcbiAgICAgKiBzdGFydCBzY2FubmluZywgYW5kIGVuZHBvaW50cyB0aGF0IGFyZSBnb25lIGdvIGRlYWQgKHRoZWlyIHNjYW5zIHN0b3AsIHRoZWlyIGluZGV4IGVudHJpZXNcbiAgICAgKiBkcm9wKS5cbiAgICAgKlxuICAgICAqIEEgc3RvcmUgaXMgbmV2ZXIgcmVidWlsdCBmb3IgYSBjb25maWcgY2hhbmdlLiBJdHMgbmFtZSBkZWNpZGVzIGl0cyBmb2xkZXIgYW5kIGl0cyBpZGVudGl0eSwgYW5kXG4gICAgICogYSBjb25maWcgY2hhbmdlIGNhbm5vdCBjaGFuZ2UgZWl0aGVyIC0gc28gdGhlcmUgaXMgbm90aGluZyBhIGNoYW5nZSBjYW4gZG8gdG8gYSBzdG9yZSBleGNlcHRcbiAgICAgKiB0aGlzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTb3VyY2VzKHNwZWNzOiBCbG9iU291cmNlU3BlY1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghc3BlY3MubGVuZ3RoIHx8IHNwZWNzWzBdLmlkZW50aXR5ICE9PSBcImRpc2tcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVTb3VyY2VzIGV4cGVjdHMgdGhlIGRpc2sgc291cmNlIGZpcnN0IChpZGVudGl0eSBcImRpc2tcIiksIGdvdCAke0pTT04uc3RyaW5naWZ5KHNwZWNzLm1hcCh4ID0+IHguaWRlbnRpdHkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2FsbDogdGhlIGRpc2sgc2xvdCBoYXMgdG8gZXhpc3QgYmVmb3JlIGFueXRoaW5nIGNhbiBiZSBtYXRjaGVkIGFnYWluc3QgaXRcbiAgICAgICAgICAgIGxldCBkaXNrID0gc3BlY3NbMF07XG4gICAgICAgICAgICBsZXQgc291cmNlID0gZGlzay5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IGRpc2sudXJsLCB2YWxpZFdpbmRvd3M6IGRpc2sudmFsaWRXaW5kb3dzLCByb3V0ZTogZGlzay5yb3V0ZSwgbm9GdWxsU3luYzogZGlzay5ub0Z1bGxTeW5jLCBzb3VyY2VDb25maWc6IGRpc2suc291cmNlQ29uZmlnLCBpZGVudGl0eTogZGlzay5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luYy5hZGRTb3VyY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNldFdpbmRvd3MgPSAoaTogbnVtYmVyLCB3aW5kb3dzOiBbbnVtYmVyLCBudW1iZXJdW10pID0+IHtcbiAgICAgICAgICAgIGxldCBvbGQgPSB0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzO1xuICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgPT09IEpTT04uc3RyaW5naWZ5KHdpbmRvd3MpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVmFsaWQgd2luZG93cyBjaGFuZ2VkIGZvciAke3RoaXMuc291cmNlc1tpXS5zb3VyY2UuZ2V0RGVidWdOYW1lKCl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6ICR7SlNPTi5zdHJpbmdpZnkob2xkKX0gLT4gJHtKU09OLnN0cmluZ2lmeSh3aW5kb3dzKX1gKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlc1tpXS52YWxpZFdpbmRvd3MgPSB3aW5kb3dzO1xuICAgICAgICB9O1xuICAgICAgICBzZXRXaW5kb3dzKDAsIHNwZWNzWzBdLnZhbGlkV2luZG93cyk7XG4gICAgICAgIC8vIExpdmUgc2xvdHMgcGFpciB3aXRoIHNwZWNzIGJ5IGlkZW50aXR5LiBFYWNoIGVuZHBvaW50IGlzIG5vdyBPTkUgc3BlYyBjYXJyeWluZyBhbGwgaXRzIHdpbmRvd3MsIHNvIHRoaXMgaXMgYSAxOjEgcGFpcmluZzsgYW55IGxlZnRvdmVyIGR1cGxpY2F0ZSBzbG90cyBmcm9tIGJlZm9yZSAoYW4gZW5kcG9pbnQgdGhhdCB1c2VkIHRvIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBzbG90cykgZ28gdW5tYXRjaGVkIGJlbG93IGFuZCBhcmUgY29sbGFwc2VkIGF3YXkuXG4gICAgICAgIGxldCBsaXZlQnlJZGVudGl0eSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgICAgICAgbGV0IG9yaWdpbmFsTGVuZ3RoID0gdGhpcy5zb3VyY2VzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBpZCA9IHRoaXMuc291cmNlc1tpXS5pZGVudGl0eTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICBsaXZlQnlJZGVudGl0eS5zZXQoaWQsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICAgIGZvciAobGV0IHNwZWMgb2Ygc3BlY3Muc2xpY2UoMSkpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gbGl2ZUJ5SWRlbnRpdHkuZ2V0KHNwZWMuaWRlbnRpdHkpPy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBTQU1FIGVuZHBvaW50IChzZWUgc291cmNlSWRlbnRpdHkpLCBzbyB3ZSBhcmUgYWxyZWFkeSBzeW5jaHJvbml6ZWQgd2l0aCBpdDogdGhlIHNsb3Qga2VlcHMgaXRzIGNvbm5lY3Rpb24sIGl0cyBjb21wbGV0ZWQgc2NhbnMsIGFuZCBpdHMgaW5kZXggZW50cmllcywgYW5kIG9ubHkgdGhlIHBvbGljeSBvbiBpdCBtb3Zlcy4gUmVjcmVhdGluZyBpdCBoZXJlIHdvdWxkIG1lYW4gcmVzY2FubmluZyB0aGUgZW5kcG9pbnQgZnJvbSBzY3JhdGNoIGV2ZXJ5IHRpbWUgYSBmbGFnIGNoYW5nZXMuXG4gICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQoc2xvdCk7XG4gICAgICAgICAgICAgICAgc2V0V2luZG93cyhzbG90LCBzcGVjLnZhbGlkV2luZG93cyk7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5zb3VyY2VzW3Nsb3RdO1xuICAgICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSkgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMucm91dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSb3V0ZSBjaGFuZ2VkIGZvciAke2V4aXN0aW5nLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogJHtKU09OLnN0cmluZ2lmeShleGlzdGluZy5yb3V0ZSl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5yb3V0ZSl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJvdXRlID0gc3BlYy5yb3V0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZykgIT09IEpTT04uc3RyaW5naWZ5KHNwZWMuc291cmNlQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGNoYW5nZWQgZm9yICR7ZXhpc3Rpbmcuc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pLCBrZWVwaW5nIHRoZSBzb3VyY2UgKHNvIGl0IGlzIG5vdCByZXNjYW5uZWQpOiAke0pTT04uc3RyaW5naWZ5KGV4aXN0aW5nLnNvdXJjZUNvbmZpZyl9IC0+ICR7SlNPTi5zdHJpbmdpZnkoc3BlYy5zb3VyY2VDb25maWcpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGNhcnJpZXMgaXRzIGNvbmZpZyAoYW5kIGl0cyB3cml0ZSBkZWxheSkgaW50byBldmVyeXRoaW5nIGl0IGRvZXMsIHNvIGl0IGhhcyB0byBsZWFybiB0aGUgbmV3IG9uZSAtIHNlZSBhcHBseVNvdXJjZUNvbmZpZ1xuICAgICAgICAgICAgICAgIHNwZWMuYXBwbHlDb25maWc/LihleGlzdGluZy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLm5vRnVsbFN5bmMgPSBzcGVjLm5vRnVsbFN5bmM7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc291cmNlQ29uZmlnID0gc3BlYy5zb3VyY2VDb25maWc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc291cmNlID0gc3BlYy5jcmVhdGUoKTtcbiAgICAgICAgICAgIGFzRGVsYXllZChzb3VyY2UpPy5iaW5kRmx1c2hEZWFkbGluZSgoKSA9PiB0aGlzLndyaXRlRmx1c2hEZWFkbGluZSgpKTtcbiAgICAgICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHsgc291cmNlLCB1cmw6IHNwZWMudXJsLCB2YWxpZFdpbmRvd3M6IHNwZWMudmFsaWRXaW5kb3dzLCByb3V0ZTogc3BlYy5yb3V0ZSwgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLCBpbnRlcm1lZGlhdGU6IHNwZWMuaW50ZXJtZWRpYXRlLCBzb3VyY2VDb25maWc6IHNwZWMuc291cmNlQ29uZmlnLCBpZGVudGl0eTogc3BlYy5pZGVudGl0eSB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBZGRlZCBzeW5jIHNvdXJjZSAke3NvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogYSBnZW51aW5lbHkgbmV3IGVuZHBvaW50LCBzbyBpdCBpcyBzY2FubmVkIGZyb20gc2NyYXRjaGApO1xuICAgICAgICAgICAgdGhpcy5zeW5jLmFkZFNvdXJjZSh0aGlzLnNvdXJjZXMubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvcmlnaW5hbExlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMaXZlKGkpIHx8IG1hdGNoZWQuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIFRoZSBzbG90IGlzIGRlYWQgdGhlIG1vbWVudCB0aGlzIHJldHVybnM7IGRyb3BwaW5nIHRoZSBpbmRleCBlbnRyaWVzIGl0IGhlbGQgaXMgdGhlIHBhcnQgdGhhdCByZWFkcyB0aGUgaW5kZXgsIHNvIGl0IGZpbmlzaGVzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICB2b2lkIHRoaXMuc3luYy5yZW1vdmVTb3VyY2UoaSkuY2F0Y2goKGU6IEVycm9yKSA9PiBsb2dTdG9yYWdlRXJyb3IoYFJlbW92aW5nIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBSZXNjYW5zIG91ciBvd24gZGlzaydzIG1ldGFkYXRhIGludG8gdGhlIGluZGV4IC0gdXNlZCBhcm91bmQgdmFsaWQgd2luZG93IGhhbmRvZmZzLCB3aGVyZSBhbm90aGVyIHByb2Nlc3Mgd3JvdGUgZmlsZXMgdG8gdGhlIHNoYXJlZCBmb2xkZXIgdGhhdCBvdXIgaW5kZXggaGFzbid0IHNlZW4uICovXG4gICAgcHVibGljIGFzeW5jIHJlc2NhbkJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmMucmVzY2FuQmFzZSgpO1xuICAgIH1cblxuICAgIC8qKiBBIGJvdW5kYXJ5IHNjYW4gb2YgdGhlIG5vZGUgdGhhdCBvd25lZCAocGFydCBvZikgb3VyIHJvdXRlIGluIHRoZSB2YWxpZCB3aW5kb3cgYmVmb3JlIG91cnMsIHdoZW4gdGhhdCBub2RlIGlzIGRpZmZlcmVudCBzdG9yYWdlIChhIGRpc2sgcmVzY2FuIGNhbid0IHNlZSBpdHMgd3JpdGVzKS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgYm91bmRhcnlTY2FuUmVtb3RlKHNvdXJjZTogSUFyY2hpdmVzLCBjb25maWc6IHsgc2luY2U6IG51bWJlcjsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luYy5ib3VuZGFyeVNjYW5SZW1vdGUoc291cmNlLCBjb25maWcpO1xuICAgIH1cblxuICAgIC8vIExhcmdlIHVwbG9hZHMgc3RyZWFtIG9udG8gdGhlIGxvY2FsIGRpc2sgc291cmNlIGRpcmVjdGx5ICh0aGV5IG1heSBub3QgZml0IGluIG1lbW9yeSksIGFuZCByZWNvbmNpbGlhdGlvbiBjYXJyaWVzIHRoZW0gdG8gdGhlIG90aGVyIHNvdXJjZXMgLSB0aGVyZSBpcyBubyBkZWxheWVkLXdyaXRlIHN0YWdlIHRoZXkgY291bGQgcGFzcyB0aHJvdWdoLiBUaGUgd3JpdGUgaXRzZWxmIGlzIHZhbGlkYXRlZCBleGFjdGx5IGxpa2Ugc2V0J3MsIHJpZ2h0IGhlcmU6IHRoZSBjbGllbnQgaXMgYWJvdXQgdG8gc2VuZCB0aGUgd2hvbGUgZmlsZSwgc28gZXZlcnkgcmVhc29uIHRvIHJlZnVzZSBpdCBtdXN0IGJlIGZvdW5kIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZS5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnRMYXJnZVVwbG9hZChjb25maWc/OiB7IHBhdGg/OiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuOyBub0NoZWNrcz86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWc/LnBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCB3cml0ZVRpbWUgPSBNYXRoLnJvdW5kKGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICAgICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0V3JpdGVUYXJnZXQoa2V5LCByb3V0ZSwgY29uZmlnPy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSkuIFRoZSBjbGllbnQgaXMgYWxyZWFkeSBzdHJlYW1pbmcsIHNvIHRoZSB1cGxvYWQgaXMgYWNjZXB0ZWQgYW5kIGV2ZXJ5IHBhcnQgZGlzY2FyZGVkIC0gdGhlIGFsdGVybmF0aXZlIGlzIHRocm93aW5nIGF0IGEgY2FsbGVyIHRoYXQgZGlkIG5vdGhpbmcgd3JvbmcuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdCh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGY/LmltbXV0YWJsZSAmJiBhd2FpdCB0aGlzLmdldEluZm8oeyBwYXRoOiBrZXkgfSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9IGAke0RJU0NBUkRFRF9VUExPQURfUFJFRklYfSR7dGhpcy5uZXh0RGlzY2FyZGVkVXBsb2FkKyt9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZGVkVXBsb2Fkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRNdXRhYmxlKGtleSwgd3JpdGVUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnPy5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgdXBsb2FkaW5nICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydEludGVybmFsV3JpdGVBY2NlcHRlZChrZXksIGNvbmZpZy5sYXN0TW9kaWZpZWQsIHJvdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBhcHBlbmRMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgZGF0YTogQnVmZmVyOyBvZmZzZXQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmhhcyhjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0RGlza1NvdXJjZSgpLmRpc2suYXBwZW5kTGFyZ2VVcGxvYWQoY29uZmlnLmlkLCBjb25maWcuZGF0YSwgY29uZmlnLm9mZnNldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5pc2hMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgbm9DaGVja3M/OiBib29sZWFuOyBpbnRlcm5hbD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kaXNjYXJkZWRVcGxvYWRzLmRlbGV0ZShjb25maWcuaWQpKSByZXR1cm47XG4gICAgICAgIGxldCB7IGRpc2ssIHNvdXJjZUluZGV4IH0gPSB0aGlzLmdldERpc2tTb3VyY2UoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpIC0gYSBuZXdlciB2YWx1ZSBjYW4gbGFuZCB3aGlsZSBhIGxvbmcgdXBsb2FkIGlzIHN0aWxsIHN0cmVhbWluZywgc28gdGhpcyBpcyByZS1jaGVja2VkIGhlcmUgcmF0aGVyIHRoYW4gb25seSBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgIGlmIChjb25maWcubGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGNvbmZpZy5wYXRoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRpc2suY2FuY2VsTGFyZ2VVcGxvYWQoY29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZGlzay5maW5pc2hMYXJnZVVwbG9hZChjb25maWcuaWQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBkaXNrLmdldEluZm8oY29uZmlnLnBhdGgpO1xuICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGNvbmZpZy5wYXRoLCB7IHdyaXRlVGltZTogaW5mby53cml0ZVRpbWUsIHNpemU6IGluZm8uc2l6ZSwgc291cmNlc0xpc3RJbmRleDogdGhpcy5zb3VyY2VzTGlzdEluZGV4T2ZTbG90KHNvdXJjZUluZGV4KSB9KTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0TGFyZ2VcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBjb25maWcucGF0aCwgc2l6ZTogaW5mby5zaXplLCB3cml0ZVRpbWU6IGluZm8ud3JpdGVUaW1lLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjYW5jZWxMYXJnZVVwbG9hZChjb25maWc6IHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2NhcmRlZFVwbG9hZHMuZGVsZXRlKGNvbmZpZy5pZCkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5jYW5jZWxMYXJnZVVwbG9hZChjb25maWcuaWQpO1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gSW50ZXJuYWxzXG5cbiAgICAvKiogQnl0ZXMgb2YgcmVhZCBjYWNoZSB0aGUgZGlzayBtYXkgaG9sZDsgc2VlIENvbW1vbkNvbmZpZy5yZWFkZXJEaXNrTGltaXQgKFN0b3JlU3luYyBlbmZvcmNlcyBpdCkuIFJlYWQgZnJvbSB0aGUgY29uZmlnIGluIGVmZmVjdCwgc28gcmFpc2luZyBvciByZW1vdmluZyB0aGUgbGltaXQgdGFrZXMgZWZmZWN0IG9uIHRoZSBuZXh0IGV2aWN0aW9uIHBhc3MuICovXG4gICAgcHVibGljIGdldCByZWFkZXJEaXNrTGltaXQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVDb25maWcuY3VycmVudCgpLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG5cbiAgICAvKiogVGhlIHdyaXRlIHRpbWUgYSBuZXcgd3JpdGUgaGFzIHRvIGJlYXQsIG9yIDAgd2hlbiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIHRoZSBrZXkuIENvdW50cyBERUxFVElPTlMgdG9vOiBhIHdyaXRlIG9sZGVyIHRoYW4gdGhlIGRlbGV0aW9uIHRoYXQgcmVtb3ZlZCBpdCBtdXN0IG5vdCBicmluZyBpdCBiYWNrLiBUaGUgaW5kZXggaXMgYXV0aG9yaXRhdGl2ZSBldmVuIGZvciBhIHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIGEgZGVsYXllZCBzb3VyY2UsIHNpbmNlIHRoZSBlbnRyeSBpcyByZWNvcmRlZCB3aGVuIHRoZSB3cml0ZSBpcyBhY2NlcHRlZCByYXRoZXIgdGhhbiB3aGVuIGl0IHJlYWNoZXMgc3RvcmFnZS4gKi9cbiAgICBwdWJsaWMgY3VycmVudFdyaXRlVGltZShrZXk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4LnRpbWVPZihrZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMaXZlKHNvdXJjZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luYy5pc0xpdmUoc291cmNlSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlclNsb3Qoc2xvdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF07XG4gICAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICBsZXQgcmVnaXN0cmF0aW9uID0gdGhpcy5zb3VyY2VzTGlzdC5lbnN1cmUodGhpcy5zb3VyY2VzW3Nsb3RdLnVybCkudGhlbihpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF0gPSBpbmRleDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2xvdFJlZ2lzdHJhdGlvbnNbc2xvdF0gPSByZWdpc3RyYXRpb247XG4gICAgICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gICAgfVxuXG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90LCBvciB1bmRlZmluZWQgd2hlbiB0aGUgc2xvdCBuZXZlciBnb3QgdGhhdCBmYXIgKGEgc291cmNlIHJlbW92ZWQgYmVmb3JlIGl0cyByZWdpc3RyYXRpb24gcmVzb2x2ZWQpLiAqL1xuICAgIHB1YmxpYyBzbG90U291cmNlc0xpc3RJbmRleChzbG90OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zbG90U291cmNlc0xpc3RJbmRleGVzW3Nsb3RdO1xuICAgIH1cblxuICAgIC8vIFRoZSBwZXJzaXN0ZW50IHNvdXJjZXNMaXN0SW5kZXggb2YgYSBzbG90IC0gb25seSB2YWxpZCBvbmNlIHRoZSBzbG90J3MgcmVnaXN0cmF0aW9uIHJlc29sdmVkIChpbml0IGFuZCB0aGUgc291cmNlJ3Mgc3luYyBsb29wIGd1YXJhbnRlZSB0aGF0IGJlZm9yZSBhbnkgaW5kZXhpbmcgaGFwcGVucylcbiAgICBwdWJsaWMgc291cmNlc0xpc3RJbmRleE9mU2xvdChzbG90OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnNsb3RTb3VyY2VzTGlzdEluZGV4ZXNbc2xvdF07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldC4gU2xvdCAke3Nsb3R9ICgke3RoaXMuc291cmNlc1tzbG90XT8udXJsfSkgaGFzIG5vIHNvdXJjZXNMaXN0SW5kZXggKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGl2ZSBzbG90IGN1cnJlbnRseSBzZXJ2aW5nIGEgcGVyc2lzdGVudCBzb3VyY2VzTGlzdEluZGV4LCBvciB1bmRlZmluZWQgd2hlbiBubyBjb25maWd1cmVkIHNvdXJjZSBoYXMgdGhhdCBVUkwgYW55bW9yZS4gTGluZWFyLCBidXQgdGhlIHNvdXJjZXMgbGlzdCBpcyB0aW55IGFuZCB0aGlzIGlzIGFsd2F5cyBjdXJyZW50IChzbG90cyBkeWluZywgb3Igc2V2ZXJhbCBzbG90cyBzaGFyaW5nIG9uZSBVUkwgYWNyb3NzIHZhbGlkIHdpbmRvd3MsIG5lZWQgbm8gYm9va2tlZXBpbmcpLlxuICAgIHB1YmxpYyBzbG90Rm9yU291cmNlc0xpc3RJbmRleChzb3VyY2VzTGlzdEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xvdFNvdXJjZXNMaXN0SW5kZXhlc1tpXSA9PT0gc291cmNlc0xpc3RJbmRleCAmJiB0aGlzLmlzTGl2ZShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgSUFyY2hpdmVzIGN1cnJlbnRseSBob2xkaW5nIGFuIGVudHJ5J3MgYnl0ZXM6IHRoZSBsaXZlIHNsb3Qgd2hlbiB0aGUgaG9sZGVyIGlzIHN0aWxsIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSByZXNvbHZlZCAoY2FjaGVkKSBzdHJhaWdodCBmcm9tIGl0cyBwZXJzaXN0ZWQgVVJMIC0gd2luZG93cy9yb3V0ZXMgZGVjaWRlIHdoZW4gYSBzb3VyY2UgaXMgc2Nhbm5lZCBvciB3cml0dGVuLCBidXQgZm9yIHJlYWRpbmcgYnl0ZXMgd2Uga25vdyBpdCBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2hcbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cnlIb2xkZXIoZW50cnk6IEluZGV4RW50cnkpOiBQcm9taXNlPElBcmNoaXZlcyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgc2xvdCA9IHRoaXMuc2xvdEZvclNvdXJjZXNMaXN0SW5kZXgoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmIChzbG90ICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnNvdXJjZXNbc2xvdF0uc291cmNlO1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmwoZW50cnkuc291cmNlc0xpc3RJbmRleCkgfHwgYXdhaXQgdGhpcy5zb3VyY2VzTGlzdC5nZXRVcmxSZWxvYWRpbmcoZW50cnkuc291cmNlc0xpc3RJbmRleCk7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/LnJlc29sdmVTb3VyY2VVcmw/Lih1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluZGV4LmxvYWQoKTtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgY29uZmlnIGlzIG9ubHkgZXZlciByZWFkIG9mZiBvdXIgb3duIGRpc2sgKHNlZSBTdG9yZVN5bmMncyBzY2FuIGhhbmRsaW5nKSwgYW5kIGEgbG9hZGVkIGJ1Y2tldCBhbHdheXMgaGFzIGl0IHRoZXJlIC0gYSBwZXJzaXN0ZWQgZW50cnkgcG9pbnRpbmcgZWxzZXdoZXJlIGlzIHN0YWxlLCBzbyBpdCBpcyBjb3JyZWN0ZWQgb25jZSwgaGVyZVxuICAgICAgICBsZXQgcm91dGluZyA9IHRoaXMuZ2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUpO1xuICAgICAgICBsZXQgYmFzZVNvdXJjZXNMaXN0SW5kZXggPSB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCk7XG4gICAgICAgIGlmIChyb3V0aW5nICYmIHJvdXRpbmcuc291cmNlc0xpc3RJbmRleCAhPT0gYmFzZVNvdXJjZXNMaXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShST1VUSU5HX0ZJTEUsIHsgd3JpdGVUaW1lOiByb3V0aW5nLndyaXRlVGltZSwgc2l6ZTogcm91dGluZy5zaXplLCBzb3VyY2VzTGlzdEluZGV4OiBiYXNlU291cmNlc0xpc3RJbmRleCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZpbGUgd2UgaG9sZC4gQSBkZWxldGVkIG9uZSBpcyBub3Qgb25lOiBpdCBpcyBhIHRvbWJzdG9uZSwgYW5kIG9ubHkgZ2V0RGVsZXRlZEVudHJ5IGtub3dzIGFib3V0IGl0LiAqL1xuICAgIHB1YmxpYyBnZXRJbmRleEVudHJ5KGtleTogc3RyaW5nKTogSW5kZXhFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbnRyeSA9IHRoaXMuaW5kZXguZ2V0KGtleSk7XG4gICAgICAgIGlmICghZW50cnkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IC4uLmVudHJ5LnZhbHVlLCB3cml0ZVRpbWU6IGVudHJ5LnRpbWUsIGNoYW5nZWRBdDogZW50cnkuY2hhbmdlZEF0IH07XG4gICAgfVxuXG4gICAgLyoqIFdoZW4gYSBrZXkgd2FzIGRlbGV0ZWQsIGlmIGl0IHdhcy4gQSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlIHdpdGggYSB0aW1lIGF0dGFjaGVkIC0gdGhhdCB0aW1lIGlzIHdoYXQgbWFrZXMgaXQgcHJvcGFnYXRlIGFuZCB3aGF0IGV4cGlyZXMgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWRFbnRyeShrZXk6IHN0cmluZyk6IHsgd3JpdGVUaW1lOiBudW1iZXI7IGNoYW5nZWRBdDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfTtcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZmlsZSB3ZSBob2xkLCBmb3IgdGhlIHBhc3NlcyB0aGF0IHdhbGsgdGhlbSBhbGwgKGxpc3RpbmdzLCBzY2FucywgcmVjb25jaWxpYXRpb24sIGV2aWN0aW9uKS4gRGVsZXRpb25zIGFyZSBub3QgaW4gaGVyZSAtIHNlZSBkZWxldGVkRW50cmllcy4gTGl2ZTogZGVsZXRpbmcgZW50cmllcyB3aGlsZSBpdGVyYXRpbmcgaXMgZXhwZWN0ZWQgaGVyZSwgYW5kIHNhZmUuICovXG4gICAgcHVibGljICppbmRleEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCBlbnRyeV0gb2YgdGhpcy5pbmRleC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIFtrZXksIHsgLi4uZW50cnkudmFsdWUsIHdyaXRlVGltZTogZW50cnkudGltZSwgY2hhbmdlZEF0OiBlbnRyeS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRXZlcnkgZGVsZXRpb24gd2Uga25vdyBvZi4gQSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSBmaWxlcywgd2hpY2ggaXMgd2hhdCBtYWtlcyBleHBpcmluZyB0aGVtIGNoZWFwLiAqL1xuICAgIHB1YmxpYyAqZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCB7IHdyaXRlVGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9XT4ge1xuICAgICAgICBmb3IgKGxldCBba2V5LCB0b21ic3RvbmVdIG9mIHRoaXMuaW5kZXguZGVsZXRlZEVudHJpZXMoKSkge1xuICAgICAgICAgICAgeWllbGQgW2tleSwgeyB3cml0ZVRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQgfV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQSBmaWxlIE1BUktFRCBmb3IgZGVsZXRpb246IGl0cyBrZXB0IGluZGV4IHZhbHVlIHBsdXMgd2hlbiBpdCB3YXMgZGVsZXRlZC4gVW5kZWZpbmVkIHdoZW4gdGhlIGtleSBpcyBsaXZlLCBuZXZlciBleGlzdGVkLCBvciBpdHMgaGlzdG9yeSB3YXMgYWxyZWFkeSBkcm9wcGVkLiAqL1xuICAgIHB1YmxpYyBnZXRNYXJrZWRFbnRyeShrZXk6IHN0cmluZyk6IChJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfSkgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5pbmRleC5nZXREZWxldGVkKGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lIHx8IHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyAuLi50b21ic3RvbmUudmFsdWUsIHdyaXRlVGltZTogdG9tYnN0b25lLnZhbHVlVGltZSB8fCB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiB0b21ic3RvbmUuY2hhbmdlZEF0LCBkZWxldGVUaW1lOiB0b21ic3RvbmUudGltZSB9O1xuICAgIH1cblxuICAgIC8qKiBFdmVyeSBmaWxlIG1hcmtlZCBmb3IgZGVsZXRpb24gLSB0aGUgZGVsZXRpb24gaGlzdG9yeSwgd2Fsa2VkIGJ5IHJldGVudGlvbiBhbmQgYnkgaW5jbHVkZU1hcmtlZCBsaXN0aW5ncy4gKi9cbiAgICBwdWJsaWMgKm1hcmtlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBJbmRleEVudHJ5ICYgeyBkZWxldGVUaW1lOiBudW1iZXIgfV0+IHtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdG9tYnN0b25lXSBvZiB0aGlzLmluZGV4LmRlbGV0ZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICB5aWVsZCBba2V5LCB7IC4uLnRvbWJzdG9uZS52YWx1ZSwgd3JpdGVUaW1lOiB0b21ic3RvbmUudmFsdWVUaW1lIHx8IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IHRvbWJzdG9uZS5jaGFuZ2VkQXQsIGRlbGV0ZVRpbWU6IHRvbWJzdG9uZS50aW1lIH1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFRoZSBkZWxldGlvbiBoaXN0b3J5J3MgdG90YWxzOiBob3cgbWFueSBtYXJrZWQgZmlsZXMsIHRoZWlyIGJ5dGVzLCBhbmQgdGhlIGRlbGV0ZSB0aW1lIG9mIHRoZSBPTERFU1Qgb25lIC0gd2hpY2ggaXMgaG93IGZhciBiYWNrIHRoZSBoaXN0b3J5IHJlYWNoZXMuICovXG4gICAgcHVibGljIG1hcmtlZFRvdGFscygpOiB7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlcjsgb2xkZXN0RGVsZXRlVGltZT86IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGZpbGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBieXRlQ291bnQgPSAwO1xuICAgICAgICBsZXQgb2xkZXN0RGVsZXRlVGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5tYXJrZWRFbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGZpbGVDb3VudCsrO1xuICAgICAgICAgICAgYnl0ZUNvdW50ICs9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICBpZiAob2xkZXN0RGVsZXRlVGltZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LmRlbGV0ZVRpbWUgPCBvbGRlc3REZWxldGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgb2xkZXN0RGVsZXRlVGltZSA9IGVudHJ5LmRlbGV0ZVRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZmlsZUNvdW50LCBieXRlQ291bnQsIG9sZGVzdERlbGV0ZVRpbWUgfTtcbiAgICB9XG5cbiAgICAvKiogUGh5c2ljYWxseSByZW1vdmVzIGEgbWFya2VkIGZpbGUncyBieXRlcyBmcm9tIG91ciBkaXNrIGFuZCBkcm9wcyBpdHMga2VwdCB2YWx1ZSwgbGVhdmluZyBhIHBsYWluIHRvbWJzdG9uZSB0aGF0IGFnZXMgb3V0IG5vcm1hbGx5IC0gcmV0ZW50aW9uIGNhbGxpbmcgdGltZSBvbiB0aGUgb2xkZXN0IGhpc3RvcnkuICovXG4gICAgcHVibGljIGFzeW5jIGRyb3BNYXJrZWRIaXN0b3J5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMub3duRGlzay5kZWwoa2V5KTtcbiAgICAgICAgdGhpcy5pbmRleC5kcm9wVmFsdWUoa2V5KTtcbiAgICB9XG5cbiAgICAvKiogU2VlIFNldENvbmZpZy51bmRlbGV0ZTogZmxpcHMgYSBtYXJrZWQgZGVsZXRpb24gYmFjayB0byBsaXZlIChmcmVzaCB3cml0ZSB0aW1lLCBzbyB0aGUgcmVzdG9yZSBvdXRyYW5rcyB0aGUgZGVsZXRpb24gZXZlcnl3aGVyZSBpdCBwcm9wYWdhdGVkKSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrLCBzbyByZWFkcyBqdXN0IHdvcmsgYWdhaW4uIEludGVybmFsIHJlc3RvcmVzIGFyZSBhIHBlZXIncyBwcm9wYWdhdGlvbiBhbmQgdG9sZXJhdGUgaGF2aW5nIG5vdGhpbmcgdG8gcmVzdG9yZSAodGhpcyBub2RlIG1heSBuZXZlciBoYXZlIGhlbGQgdGhlIGZpbGUpOyBhIGNhbGxlcidzIHJlc3RvcmUgdGhyb3dzIGluc3RlYWQuICovXG4gICAgcHJpdmF0ZSBhc3luYyB1bmRlbGV0ZUtleShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIGludGVybmFsOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBtYXJrZWQgPSB0aGlzLmdldE1hcmtlZEVudHJ5KGtleSk7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC51bm1hcmsoa2V5LCB3cml0ZVRpbWUpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxpdmU6IHVuZGVsZXRlIGlzIGlkZW1wb3RlbnQgKHJldHJpZXMgYW5kIHBlZXIgcHJvcGFnYXRpb24gYm90aCByZS1zZW5kIGl0KVxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SW5kZXhFbnRyeShrZXkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGUgb2YgJHtKU09OLnN0cmluZ2lmeShrZXkpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGhhcyBub3RoaW5nIHRvIHJlc3RvcmUgaGVyZSAtIHRoaXMgbm9kZSBtYXkgbmV2ZXIgaGF2ZSBoZWxkIHRoZSBmaWxlYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlbGV0ZSBmYWlsZWQgLSBub3RoaW5nIHRvIHJlc3RvcmUuIENhbm5vdCB1bmRlbGV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IGl0IGhhcyBubyBtYXJrZWQgZGVsZXRpb24gdG8gcmVzdG9yZSAtIGl0IHdhcyBuZXZlciBkZWxldGVkIGhlcmUke3RoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSkgJiYgXCIsIG9yIGl0cyBkZWxldGlvbiBoaXN0b3J5IHdhcyBhbHJlYWR5IGRyb3BwZWQgKGEgcGxhaW4gdG9tYnN0b25lIHJlbWFpbnMsIGJ1dCB0aGUgYnl0ZXMgYXJlIGdvbmUpXCIgfHwgXCJcIn1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgVW5kZWxldGVkICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogdGhlIGluZGV4IGVudHJ5ICgke21hcmtlZD8uc2l6ZX0gYnl0ZXMsIGRlbGV0ZWQgJHttYXJrZWQgJiYgZm9ybWF0RGF0ZVRpbWVEZXRhaWxlZChtYXJrZWQuZGVsZXRlVGltZSl9KSBpcyBsaXZlIGFnYWluIGFzIG9mICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSAtIHRoZSBieXRlcyBuZXZlciBsZWZ0IHRoZSBkaXNrYCk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwidW5kZWxldGVcIiwgZm9sZGVyOiB0aGlzLmZvbGRlciwgc3RvcmU6IHRoaXMuc3RvcmVOYW1lLCBwYXRoOiBrZXksIHNpemU6IG1hcmtlZD8uc2l6ZSwgd3JpdGVUaW1lLCBpbnRlcm5hbCB9KTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgaWYgKGludGVybmFsKSByZXR1cm47XG4gICAgICAgIC8vIFBlZXJzIG1hcmtlZCB0aGVpciBvd24gY29waWVzIHdoZW4gdGhlIGRlbGV0aW9uIHByb3BhZ2F0ZWQsIHNvIHRoZSByZXN0b3JlIHByb3BhZ2F0ZXMgdGhlIHNhbWUgd2F5LiBTdHJhaWdodCBwYXN0IGFueSB3cml0ZSBkZWxheSAtIGEgYnVmZmVyZWQgdW5kZWxldGUgY291bGQgYmUgcmVhZCBiYWNrIGFzIGl0cyBwbGFjZWhvbGRlciBieXRlLlxuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICBmb3IgKGxldCBpIG9mIHRoaXMuZ2V0V3JpdGFibGVTb3VyY2VzKCkpIHtcbiAgICAgICAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcm91dGVDb250YWlucyh0aGlzLnNvdXJjZXNbaV0ucm91dGUsIHJvdXRlKSkgY29udGludWU7XG4gICAgICAgICAgICAvLyBPbmx5IG91ciBvd24gc2VydmVycyB1bmRlcnN0YW5kIHRoZSBmbGFnIC0gYSByYXcgc291cmNlIChiYWNrYmxhemUpIHdvdWxkIHN0b3JlIHRoZSBwbGFjZWhvbGRlciBieXRlIGFzIHRoZSBmaWxlLiBUaGVpciBvbGRlciBjb3B5IGlzIHJlLXB1c2hlZCBieSByZWNvbmNpbGlhdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tpXS5zb3VyY2VDb25maWc/LnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHB1c2ggPSB1bndyYXBEZWxheWVkKHRoaXMuc291cmNlc1tpXS5zb3VyY2UpLnNldChrZXksIFVOREVMRVRFX1BMQUNFSE9MREVSLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCB1bmRlbGV0ZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgdm9pZCBwdXNoLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ1N0b3JhZ2VFcnJvcihgQmFja2dyb3VuZCB1bmRlbGV0ZSBvZiAke2tleX0gb24gc3luYyBzb3VyY2UgJHt0aGlzLnNvdXJjZXNbaV0uc291cmNlLmdldERlYnVnTmFtZSgpfSAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pIGZhaWxlZCAoaXRzIHNjYW4gb2YgdXMgcmUtZmluZHMgdGhlIGZpbGUgYW55d2F5KTogJHtlLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmaWxlcyB3ZSBob2xkLCBkZWxldGlvbnMgZXhjbHVkZWQuICovXG4gICAgcHVibGljIGluZGV4U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleC5zaXplO1xuICAgIH1cblxuICAgIC8qKiBUb3RhbHMgb3ZlciB0aGUgZmlsZXMgd2UgaG9sZCwgYnJva2VuIGRvd24gYnkgdGhlIHNsb3QgaG9sZGluZyBlYWNoIChlbnRyaWVzIGNhbiBuYW1lIGEgc291cmNlIHRoYXQgaXMgbm8gbG9uZ2VyIGNvbmZpZ3VyZWQsIHdoaWNoIGNvdW50cyB0b3dhcmRzIHRoZSB0b3RhbCBidXQgbm8gc2xvdCkuICovXG4gICAgcHVibGljIGluZGV4VG90YWxzKCk6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzbG90czogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0ge1xuICAgICAgICBsZXQgZmlsZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgICAgIGxldCBzbG90cyA9IHRoaXMuc291cmNlcy5tYXAoKCkgPT4gKHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfSkpO1xuICAgICAgICBmb3IgKGxldCBbLCBlbnRyeV0gb2YgdGhpcy5pbmRleEVudHJpZXMoKSkge1xuICAgICAgICAgICAgZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgICAgIGxldCBzbG90ID0gdGhpcy5zbG90Rm9yU291cmNlc0xpc3RJbmRleChlbnRyeS5zb3VyY2VzTGlzdEluZGV4KTtcbiAgICAgICAgICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2xvdHNbc2xvdF0uZmlsZUNvdW50Kys7XG4gICAgICAgICAgICBzbG90c1tzbG90XS5ieXRlQ291bnQgKz0gZW50cnkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmaWxlQ291bnQsIGJ5dGVDb3VudCwgc2xvdHMgfTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIGZpbGUsIGFzIG9mIGl0cyB3cml0ZSB0aW1lLiBSZXR1cm5zIGZhbHNlLCBoYXZpbmcgY2hhbmdlZCBub3RoaW5nLCB3aGVuIHdlIGFscmVhZHkga25vdyBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IC0gdGhlIGluZGV4IGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcywgd2hpY2hldmVyIHBhdGggdGhlIHdyaXRlIGNhbWUgaW4gYnkuICovXG4gICAgcHVibGljIHNldEluZGV4RW50cnkoa2V5OiBzdHJpbmcsIGVudHJ5OiB7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHNvdXJjZXNMaXN0SW5kZXg6IG51bWJlciB9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pbmRleC5zZXQoa2V5LCB7IHNpemU6IGVudHJ5LnNpemUsIHNvdXJjZXNMaXN0SW5kZXg6IGVudHJ5LnNvdXJjZXNMaXN0SW5kZXggfSwgZW50cnkud3JpdGVUaW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBUaGUgcm91dGluZyBjb25maWcgbGFuZGluZyBoZXJlIC0gd3JpdHRlbiBieSBhbiBvcGVyYXRvciwgb3IgcHVsbGVkIG9mZiBhIHBlZXIgYnkgc3luY2hyb25pemF0aW9uIC0gaXMgaG93IHRoaXMgc3RvcmUgbGVhcm5zIHdoYXQgaXQgaXMgbWVhbnQgdG8gYmVcbiAgICAgICAgaWYgKGtleSA9PT0gUk9VVElOR19GSUxFICYmIHRoaXMuc3luY1N0YXJ0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVhcHBseVJvdXRpbmdDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZz8ub25JbmRleENoYW5nZWQ/LihrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogUmVjb3JkcyBhIERFTEVUSU9OLCBhcyBvZiBpdHMgdGltZTogdGhlIGtleSBzdG9wcyBleGlzdGluZyBoZXJlLCBhbmQgdGhlIHRvbWJzdG9uZSBpcyB3aGF0IG1ha2VzIHRoYXQgZmFjdCBwcm9wYWdhdGUgYW5kIHJlY29uY2lsZSBsaWtlIGFueSBvdGhlciB3cml0ZS4gU2FtZSBvcmRlcmluZyBydWxlIGFzIHNldEluZGV4RW50cnkuICovXG4gICAgcHVibGljIHNldEluZGV4RGVsZXRlZChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmluZGV4LmRlbGV0ZShrZXksIHdyaXRlVGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uSW5kZXhDaGFuZ2VkPy4oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgYSBrZXkgZW50aXJlbHksIHRvbWJzdG9uZSBpbmNsdWRlZC4gTk9UIGEgZGVsZXRpb246IGl0IHNheXMgbm90aGluZyBoYXBwZW5lZCB0byB0aGUgZmlsZSwgb25seSB0aGF0IHdlIG5vIGxvbmdlciBrbm93IGFueXRoaW5nIGFib3V0IGl0IC0gZm9yIGFuIGVudHJ5IHdob3NlIGhvbGRlciB0dXJuZWQgb3V0IG5vdCB0byBoYXZlIGl0LCBhbmQgZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBldmVyeW9uZSBoYXMgaGVhcmQuICovXG4gICAgcHVibGljIHB1cmdlSW5kZXhFbnRyeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmluZGV4LnB1cmdlKGtleSk7XG4gICAgfVxuXG4gICAgLyoqIENvdW50cyBhIHN5bmNocm9uaXphdGlvbiB0cmFuc2ZlciBpbiB0aGUgc2VydmVyJ3MgYWNjZXNzIHN0YXRpc3RpY3MgKHNlZSBnZXRTdG9yZSdzIHdpcmluZyk6IFwic3luYyBnZXRcIiBmb3IgYnl0ZXMgcHVsbGVkIG9mZiBhIHNvdXJjZSwgXCJzeW5jIHNldFwiIGZvciBieXRlcyBwdXNoZWQgdG8gb25lLiAqL1xuICAgIHB1YmxpYyBub3RlU3luY1RyYW5zZmVyKG9wZXJhdGlvbjogXCJzeW5jIGdldFwiIHwgXCJzeW5jIHNldFwiLCBwYXRoOiBzdHJpbmcsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogb3BlcmF0aW9uLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGgsIHNpemU6IGJ5dGVzIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZz8ub25TeW5jVHJhbnNmZXI/LihvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgdmFsaWRhdGlvbiAoZnJvbSB0aGlzIHN0b3JlJ3Mgb3duIHJvdXRpbmcgZW50cmllcykg4pSA4pSAXG5cbiAgICAvKipcbiAgICAgKiBFdmVyeSB3cml0ZSwgaG93ZXZlciBpdCBpcyBzdGFtcGVkLCBoYXMgdG8gYmUgb25lIHdlIGFyZSBhY3R1YWxseSBtZWFudCB0byBob2xkIC0gYmVjYXVzZSB0aGVcbiAgICAgKiBhbHRlcm5hdGl2ZSBpcyBub3QgYSBzbWFsbGVyIHByb2JsZW0sIGl0IGlzIGEgc2lsZW50IG9uZS4gQSB3cml0ZSB0aGF0IGxhbmRzIG9uIGEgc3RvcmUgdGhhdFxuICAgICAqIGRvZXMgbm90IHNlcnZlIGl0cyByb3V0ZSAob3Igb24gYSBzZXJ2ZXIgdGhhdCBpcyBub3QgaW4gdGhlIGJ1Y2tldCdzIGNvbmZpZyBhdCBhbGwpIGdvZXMgaW50byBhXG4gICAgICogZm9sZGVyIG5vdGhpbmcgc2NhbnMgYW5kIG5vIHBlZXIgcmVjb25jaWxlczogaXQgc3VjY2VlZHMsIGFuZCB0aGVuIGl0IGlzIGdvbmUuIFRoZSBtYXJrZXJzIG1ha2VcbiAgICAgKiB0aGUgY2xpZW50IHJlLXJlYWQgdGhlIHJvdXRpbmcgY29uZmlnIGFuZCByZXRyeSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgcmlnaHQgb3V0Y29tZSB3aGVuIHRoZVxuICAgICAqIHJlYXNvbiBpdCBhaW1lZCBoZXJlIGlzIHRoYXQgaXRzIGNvbmZpZyB3YXMgc3RhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3NlcnRXcml0ZVRhcmdldChrZXk6IHN0cmluZywgcm91dGU6IG51bWJlciwgbGFzdE1vZGlmaWVkOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGRldGFpbCA9IHRoaXMudW5jb25maWd1cmVkRGV0YWlsKCk7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7ZGV0YWlsfWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfTk9UX0NPTkZJR1VSRUR9IFdyaXRlIHJlamVjdGVkOiB0aGlzIHN0b3JlIGhhcyBubyBjb25maWd1cmF0aW9uLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHtkZXRhaWx9IERhdGEgd3JpdHRlbiB0byBhIHN0b3JlIHdpdGggbm8gY29uZmlndXJhdGlvbiBlbnRyeSB3b3VsZCBuZXZlciBiZSBzY2FubmVkIG9yIHJlY29uY2lsZWQsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBzaWxlbnRseSBsb3NlIGl0LiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeSAtIG9yLCBpZiB0aGlzIHN0b3JlIGlzIGdlbnVpbmVseSBtZWFudCB0byB0YWtlIHRoaXMgd3JpdGUsIHdyaXRlIHRoZSBidWNrZXQncyByb3V0aW5nIGNvbmZpZyB3aXRoIGFuIGVudHJ5IG5hbWluZyBpdCBvbiB0aGlzIHNlcnZlci5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRGcmVzaFdyaXRlVGFyZ2V0KGtleSwgRGF0ZS5ub3coKSwgcm91dGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgc3RhbXBlZCB3cml0ZSBwaWNrZWQgaXRzIG93biB0aW1lLCBzbyBubyB3aW5kb3cgY2FuIGp1ZGdlIGl0ICh0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBvZiBhIHN5bmNocm9uaXplZCB3cml0ZSkgLSBidXQgdGhlIFJPVVRFIGlzIG5vdCBhIG1hdHRlciBvZiB0aW1pbmcsIGFuZCBhIHN0YW1wZWQgd3JpdGUgdG8gdGhlIHdyb25nIHNoYXJkIGlzIGV4YWN0bHkgYXMgaW52aXNpYmxlIGFzIGEgZnJlc2ggb25lXG4gICAgICAgIGlmICh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHJldHVybjtcbiAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBzdGFtcGVkIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBldmVyeSByb3V0ZSB3ZSBzZXJ2ZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9YCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICB9XG5cbiAgICAvKiogRXhhY3RseSB3aHkgdGhpcyBzdG9yZSBoYXMgbm8gY29uZmlndXJhdGlvbiBlbnRyaWVzIC0gd2hpY2ggb2YgdGhlIHRocmVlIHBvc3NpYmxlIHJlYXNvbnMgaXQgaXMsIHdpdGggdGhlIHZhbHVlcyB0aGF0IGRlY2lkZWQgaXQsIGJlY2F1c2UgXCJub3QgY29uZmlndXJlZFwiIGFsb25lIGlzIHVuZGlhZ25vc2FibGUuICovXG4gICAgcHJpdmF0ZSB1bmNvbmZpZ3VyZWREZXRhaWwoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJvdXRpbmcgPSB0aGlzLmFwcGxpZWRSb3V0aW5nO1xuICAgICAgICBsZXQgaWRlbnRpdHkgPSBgc3RvcmUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlTmFtZSl9IChmb2xkZXIgJHt0aGlzLmZvbGRlcn0pYDtcbiAgICAgICAgaWYgKCFyb3V0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aWRlbnRpdHl9IGhhcyBubyByb3V0aW5nIGNvbmZpZyBhdCBhbGwgLSBub3RoaW5nIGhhcyBldmVyIHdyaXR0ZW4gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBpbnRvIGl0LmA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9iamVjdHMgPSByb3V0aW5nLnNvdXJjZXMuZmlsdGVyKHggPT4gdHlwZW9mIHggIT09IFwic3RyaW5nXCIpIGFzIFNvdXJjZUNvbmZpZ1tdO1xuICAgICAgICBsZXQgbmFtZWQgPSBvYmplY3RzLmZpbHRlcih4ID0+IHgubmFtZSA9PT0gdGhpcy5zdG9yZU5hbWUpO1xuICAgICAgICBpZiAoIW5hbWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hpY2ggaGFzIG5vIGVudHJ5IG5hbWVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAoaXRzIGVudHJpZXMgYXJlIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0cy5tYXAoeCA9PiB4Lm5hbWUpKX0pLmA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkZW50aXR5fSBpcyBydW5uaW5nIHJvdXRpbmcgY29uZmlnIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKHJvdXRpbmcpfSwgd2hvc2UgJHtuYW1lZC5sZW5ndGh9IGVudHIke25hbWVkLmxlbmd0aCA9PT0gMSAmJiBcInlcIiB8fCBcImllc1wifSBuYW1lZCAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVOYW1lKX0gcG9pbnQocykgYXQgJHtKU09OLnN0cmluZ2lmeShuYW1lZC5tYXAoeCA9PiB4LnVybCkpfSAtIG5vbmUgb2Ygd2hpY2ggaXMgVEhJUyBzZXJ2ZXIsIHNvIHRoZSBjb25maWcgc2F5cyB0aGlzIHN0b3JlIGxpdmVzIGVsc2V3aGVyZS5gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgYSByb3V0aW5nIGNvbmZpZyBtYXkgYmUgd3JpdHRlbiBoZXJlLiBUd28gcnVsZXMsIGFuZCB0aGlzIGlzIHRoZSBvbmUgcGxhY2UgZWl0aGVyIGlzXG4gICAgICogYXBwbGllZCAtIGEgY29uZmlnIG9ubHkgZXZlciBlbnRlcnMgdGhlIHN5c3RlbSB0aHJvdWdoIGEgd3JpdGUsIHNvIGEgY29uZmlnIHRoYXQgZ290IGluIGlzIGFcbiAgICAgKiBjb25maWcgdGhhdCBwYXNzZWQsIGFuZCByZWFkaW5nIG9uZSBiYWNrIG5ldmVyIGp1ZGdlcyBpdCBhZ2Fpbi5cbiAgICAgKlxuICAgICAqIFRoZSBjb25maWcgaGFzIHRvIGJlIHZhbGlkIGFzIGEgd2hvbGUgKHNlZSBhc3NlcnRWYWxpZFJlbW90ZUNvbmZpZyksIGFuZCBpdCBoYXMgdG8gb3V0cmFuayB3aGF0XG4gICAgICogd2UgYXJlIHJ1bm5pbmc6IHRoZSBzYW1lIHZlcnNpb24gbWVhbnMgdGhlIHNhbWUgY29uZmlnLCBzbyByZS13cml0aW5nIGl0IGlzIGhhcm1sZXNzLCBidXQgYVxuICAgICAqIGxvd2VyIG9uZSBpcyBhbiBvbGRlciBjb25maWcgYXJyaXZpbmcgbGF0ZSBhbmQgbXVzdCBuZXZlciB1bmRvIGEgbmV3ZXIgb25lLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXNzZXJ0Um91dGluZ0NvbmZpZ1dyaXRhYmxlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICBsZXQgcm91dGluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgICAgIGlmICghcm91dGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyB3cml0ZSByZWplY3RlZCAtIG5vdCBhIHBhcnNlYWJsZSBjb25maWcuIFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogdGhlIGRhdGEgaXMgbm90IGEgdmFsaWQgeyB2ZXJzaW9uPywgc291cmNlczogWy4uLl0gfSBKU09OIGNvbmZpZyAoJHtkYXRhLmxlbmd0aH0gYnl0ZXMpYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0VmFsaWRSZW1vdGVDb25maWcocm91dGluZyk7XG4gICAgICAgIGxldCBpbmNvbWluZyA9IGdldENvbmZpZ1ZlcnNpb24ocm91dGluZyk7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5yb3V0aW5nVmVyc2lvbigpO1xuICAgICAgICBpZiAoaW5jb21pbmcgPj0gY3VycmVudCkgcmV0dXJuO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIHdyaXRlIHJlZnVzZWQgLSB0aGUgdmVyc2lvbiBpcyBub3QgbmV3ZXIuIFJlZnVzaW5nIHRvIHdyaXRlICR7Uk9VVElOR19GSUxFfSB0byBzdG9yZSAke3RoaXMuZm9sZGVyfTogaXRzIHZlcnNpb24gKCR7aW5jb21pbmd9KSBpcyBvbGRlciB0aGFuIHRoZSBvbmUgdGhpcyBzdG9yZSBpcyBydW5uaW5nICgke2N1cnJlbnR9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC5gKTtcbiAgICB9XG5cbiAgICAvLyBBIGZyZXNoICh1bnN0YW1wZWQpIHdyaXRlIG11c3QgbGFuZCBvbiB0aGUgbm9kZSB0aGUgY29uZmlnIGN1cnJlbnRseSBwb2ludHMgYXQ6IHRoZSBtYXJrZXJzIHRlbGwgdGhlIGNsaWVudCBpdHMgY29uZmlnIGlzIHN0YWxlLCBzbyBpdCByZS1yZXNvbHZlcyBhbmQgcmV0cmllcyBhZ2FpbnN0IHRoZSByaWdodCBub2RlIGluc3RlYWQgb2YgdXMgc2lsZW50bHkgYWNjZXB0aW5nIGRhdGEgd2Ugd2VyZSBuZXZlciBtZWFudCB0byBob2xkLlxuICAgIHByaXZhdGUgYXNzZXJ0RnJlc2hXcml0ZVRhcmdldChrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IHRoaXMuc3RvcmVDb25maWcuYWxsKCkuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBXcml0ZSByZWplY3RlZDogd3JpdGUgdGltZSBpcyBvdXRzaWRlIG91ciB2YWxpZCB3aW5kb3dzLiBDYW5ub3Qgd3JpdGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogaXRzIHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9ICgke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQod3JpdGVUaW1lKX0pIGlzIG91dHNpZGUgZXZlcnkgdmFsaWQgd2luZG93IG9mIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZU5hbWUpfSAod2luZG93czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0sIGZvbGRlciAke3RoaXMuZm9sZGVyfSkgLSBhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldC4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGtleSl9IChzdG9yZSAke3RoaXMuZm9sZGVyfSk6IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBXcml0ZSByZWplY3RlZDogd3Jvbmcgcm91dGUgZm9yIHRoaXMgc3RvcmUuIFJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgb3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSwgc3RvcmUgJHt0aGlzLmZvbGRlcn0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXNzZXJ0TXV0YWJsZShrZXk6IHN0cmluZywgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlQ29uZmlnLmFsbCgpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQodGhpcy5zdG9yZUNvbmZpZy5hbGwoKSwgd3JpdGVUaW1lLCBnZXRSb3V0ZShrZXkpKTtcbiAgICAgICAgaWYgKCFzZWxmPy5pbW11dGFibGUpIHJldHVybjtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZ2V0SW5mbyh7IHBhdGg6IGtleSB9KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXcml0ZSByZWplY3RlZCAtIGltbXV0YWJsZSBzdG9yZSBhbmQgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuIEF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9LCAke0pTT04uc3RyaW5naWZ5KGtleSl9IGFscmVhZHkgZXhpc3RzIChzdG9yZSAke3RoaXMuZm9sZGVyfSlgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc3RvcmUgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgc3RvcmUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgIHByaXZhdGUgYXNzZXJ0SW50ZXJuYWxXcml0ZUFjY2VwdGVkKGtleTogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlciwgcm91dGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RvcmVDb25maWcuYWxsKCkubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBjb3ZlcmVkID0gdGhpcy5zdG9yZUNvbmZpZy5hbGwoKS5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSByZWplY3RlZCAtIG91dHNpZGUgZXZlcnkgY29uZmlndXJlZCB3aW5kb3cvcm91dGUuIFdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtmb3JtYXREYXRlVGltZURldGFpbGVkKHdyaXRlVGltZSl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHN0b3JlIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmVDb25maWcuYWxsKCkubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZDogbmV2ZXIgZ29lcyB0byBPVEhFUiBzb3VyY2VzIC0gdGhlIGNhbGxlciBpcyBhbm90aGVyIHN0b3JlLCBhbmQgY2hhc2luZyBPVVIgcmVtb3RlIGhvbGRlcnMgd2hpbGUgYW5zd2VyaW5nIGl0IGlzIGhvdyBpbmZpbml0ZSBnZXQgbG9vcHMgYmV0d2VlbiBzdG9yZXMgZm9ybSAtIGJ1dCB0aGUgSU5ERVggc3RpbGwgZ2F0ZXMsIGJlY2F1c2UgaXQgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aDogYSBtYXJrZWQgZGVsZXRpb24ga2VlcHMgaXRzIGJ5dGVzIG9uIGRpc2sgYXMgaGlzdG9yeSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSwgc28gdGhlIGRpc2sgYWxvbmUgd291bGQgaGFwcGlseSBzZXJ2ZSBhIERFTEVURUQgZmlsZSBhcyBsaXZlLiBJbmRleCBzYXlzIGxpdmUgLT4gdGhlIGRpc2sgcHJvdmlkZXMgdGhlIGJ5dGVzIChwYXN0IGFueSB3cml0ZSBkZWxheSwgc28gYSBmYXN0IHdyaXRlIHN0aWxsIGJ1ZmZlcmVkIGluIG1lbW9yeSBpcyBpbnZpc2libGUgaGVyZTsgdGhlIGNhbGxlciByZS1maW5kcyBpdCBvbmNlIGl0IGZsdXNoZXMpLiBJbmRleCBzYXlzIGRlbGV0ZWQgLT4gdGhlIHRvbWJzdG9uZSBpcyB0aGUgYW5zd2VyLCBuZXZlciB0aGUgZGlzay4gTm8gd2luZG93IG9yIHJvdXRlIGNoZWNrcy4gKi9cbiAgICBwcml2YXRlIGFzeW5jIGdldEludGVybmFsMihjb25maWc6IHsgcGF0aDogc3RyaW5nOyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTsgaW5jbHVkZVRvbWJzdG9uZXM/OiBib29sZWFuIH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGxldCBrZXkgPSBjb25maWcucGF0aDtcbiAgICAgICAgaWYgKCF0aGlzLmdldEluZGV4RW50cnkoa2V5KSkge1xuICAgICAgICAgICAgLy8gRGVsZXRlZCwgb3IgbmV2ZXIgaGVyZTogYSBmbGFnLWNhbGxlciAoYSBwZWVyIHN0b3JlJ3Mgc3luY2hyb25pemF0aW9uKSBuZWVkcyB0byBzZWUgb3VyIGRlbGV0aW9ucywgbm90IGp1c3Qgb3VyIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsZXRlZCA9IHRoaXMuZ2V0RGVsZXRlZEVudHJ5KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHJldHVybiB7IGRhdGE6IEJ1ZmZlci5hbGxvYygwKSwgd3JpdGVUaW1lOiBkZWxldGVkLndyaXRlVGltZSwgc2l6ZTogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREaXNrU291cmNlKCkuZGlzay5nZXQyKGtleSwgeyByYW5nZTogY29uZmlnLnJhbmdlIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHJlc3VsdC5kYXRhLCB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5zaXplIH07XG4gICAgfVxuXG4gICAgLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgd3JpdGU6IHRoZSBsb2NhbCBkaXNrIHBsdXMgb3VyIGluZGV4LCB3aXRoIE5PIGRvd25zdHJlYW0gZmFuLW91dCAtIHRoZSBwdXNoaW5nIHN0b3JlIG93bnMgcHJvcGFnYXRpb24sIGFuZCBmYW5uaW5nIGl0cyBwdXNoZXMgYmFjayBvdXQgaXMgaG93IHdyaXRlIGxvb3BzIGJldHdlZW4gc3RvcmVzIGZvcm0uIE9ubHktdGFrZS1sYXRlc3Qgc3RpbGwgYXBwbGllcyBoZXJlLiAqL1xuICAgIHByaXZhdGUgYXN5bmMgc2V0SW50ZXJuYWwoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnOiB7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBpZiAoY29uZmlnLmxhc3RNb2RpZmllZCA8IGF3YWl0IHRoaXMuY3VycmVudFdyaXRlVGltZShrZXkpKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIGJ5dGVzIHN0YXkgb24gb3VyIGRpc2sgYXMgZGVsZXRpb24gaGlzdG9yeSAoc2VlIHdyaXRlVG9Tb3VyY2VzKSAtIHRoZSBtYXJrZWQgaW5kZXggZW50cnkgaXMgdGhlIHdob2xlIG9mIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCBjb25maWcubGFzdE1vZGlmaWVkKTtcbiAgICAgICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwiZGVsXCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGludGVybmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIGZvcmNlU2V0SW1tdXRhYmxlOiB0cnVlLCBub0NoZWNrczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVudHJ5KGtleSwgeyB3cml0ZVRpbWU6IGNvbmZpZy5sYXN0TW9kaWZpZWQsIHNpemU6IGRhdGEubGVuZ3RoLCBzb3VyY2VzTGlzdEluZGV4OiB0aGlzLnNvdXJjZXNMaXN0SW5kZXhPZlNsb3QoMCkgfSk7XG4gICAgICAgIGxvZ011dGF0aW9uKHsgb3A6IFwic2V0XCIsIGZvbGRlcjogdGhpcy5mb2xkZXIsIHN0b3JlOiB0aGlzLnN0b3JlTmFtZSwgcGF0aDoga2V5LCBzaXplOiBkYXRhLmxlbmd0aCwgd3JpdGVUaW1lOiBjb25maWcubGFzdE1vZGlmaWVkLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZCdzIGJ5dGVzIGNhbWUgZnJvbSBhIHJlbW90ZSBzb3VyY2UsIHNvIHdyaXRlIHRoZW0gb250byBvdXIgb3duIGJhc2Ugc291cmNlICh0aGUgbG9jYWwgZGlzayksIHdoaWNoIGJlY29tZXMgdGhlIGVudHJ5J3MgbmV3IGhvbGRlciAtIHJlYWRzIG9ubHkgcGF5IHRoZSByZW1vdGUgZmV0Y2ggb25jZVxuICAgIHByaXZhdGUgYXN5bmMgY2FjaGVSZWFkKGtleTogc3RyaW5nLCByZXN1bHQ6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlc1swXS5zb3VyY2Uuc2V0KGtleSwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogdHJ1ZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbnRyeShrZXksIHsgd3JpdGVUaW1lOiByZXN1bHQud3JpdGVUaW1lLCBzaXplOiByZXN1bHQuZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdCgwKSB9KTtcbiAgICAgICAgLy8gQSBkb3duLWNhY2hlIHB1bGxzIHRoZSBieXRlcyBvZmYgYSBzb3VyY2UgZXhhY3RseSBsaWtlIHN5bmNocm9uaXphdGlvbiBkb2VzLCBzbyBpdCBjb3VudHMgKGFuZCBsb2dzKSB0aGUgc2FtZSB3YXlcbiAgICAgICAgdGhpcy5ub3RlU3luY1RyYW5zZmVyKFwic3luYyBnZXRcIiwga2V5LCByZXN1bHQuZGF0YS5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaGFyZWQgZW5naW5lIG9mIHNldCBhbmQgZGVsOiBhbiBlbXB0eSBidWZmZXIgaXMgZXhhY3RseSBhIGRlbGV0aW9uIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGUgZW1wdHktYnVmZmVyIHJlamVjdGlvbiBsaXZlcyBpbiBzZXQgKHRoZSBwdWJsaWMgQVBJKSwgbm90IGluIHRoaXMgbWFjaGluZXJ5XG4gICAgcHJpdmF0ZSBhc3luYyBzZXRPckRlbGV0ZShrZXk6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc6IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb25maWc/Lm9uV3JpdGVDb3VudGVkPy4oXCJvcmlnaW5hbFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWQgPSBjb25maWcubGFzdE1vZGlmaWVkO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZExhc3RNb2RpZmllZChsYXN0TW9kaWZpZWQpO1xuICAgICAgICAgICAgLy8gQW4gb2xkZXIgd3JpdGUgbmV2ZXIgb3ZlcndyaXRlcyBhIG5ld2VyIG9uZSAoc2VlIElBcmNoaXZlcy5zZXQpXG4gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDwgYXdhaXQgdGhpcy5jdXJyZW50V3JpdGVUaW1lKGtleSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYXN0IHdyaXRlcyBhcmUgbm90IGhhbmRsZWQgaGVyZTogYSBzb3VyY2UgdGhhdCB3YXMgY29uZmlndXJlZCB3aXRoIGEgd3JpdGUgZGVsYXkgYnVmZmVycyB0aGVtIGl0c2VsZiAoc2VlIEFyY2hpdmVzRGVsYXllZCksIHNvIHRoaXMgd3JpdGUgbGFuZHMgaW4gbWVtb3J5IGFuZCByZXR1cm5zLCBleGFjdGx5IGFzIGl0IHdvdWxkIGhhdmUuIFRoZSBpbmRleCBpcyB1cGRhdGVkIGVpdGhlciB3YXksIHNvIHRoZSB3cml0ZSBpcyBpbW1lZGlhdGVseSB2aXNpYmxlIHRvIHJlYWRlcnMgb2YgdGhpcyBzdG9yZS5cbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZVRvU291cmNlcyhrZXksIGRhdGEsIE1hdGgucm91bmQobGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpKTtcbiAgICB9XG5cbiAgICAvKiogVGhlIGluc3RhbnQgZXZlcnkgZGVsYXllZCB3cml0ZSBtdXN0IGJlIG9uIGl0cyBzb3VyY2U6IHRoZSBlbmQgb2Ygb3VyIG93biB3cml0ZSB3aW5kb3cgdGhhdCBjb250YWlucyBub3csIG1pbnVzIHRoZSBmbHVzaCBtYXJnaW4gKHNvIHRoZSBuZXh0IHdpbmRvdydzIHNvdXJjZSBmaW5kcyB0aGUgZGF0YSBvbiBoYW5kb2ZmKS4gVGhlIExBVEVTVCBlbmQgYW1vbmcgY292ZXJpbmcgd2luZG93cyAtIG92ZXJsYXBwaW5nIHdpbmRvd3MgaGFuZCBvZmYgYXQgdGhlIGxhc3Qgb25lLiBObyB3aW5kb3cgY29udGFpbnMgbm93IChhbiBpbmVydCBzdG9yZSwgb3IgYSBtb21lbnQgYmV0d2VlbiBvdXIgd2luZG93cykgLT4gMCwgaS5lLiBub3RoaW5nIG1heSBiZSBkZWxheWVkIGF0IGFsbC4gKi9cbiAgICBwdWJsaWMgd3JpdGVGbHVzaERlYWRsaW5lKCk6IG51bWJlciB7XG4gICAgICAgIC8vIEJlZm9yZSB1cGRhdGVTb3VyY2VzIGhhcyBydW4gdGhlcmUgaXMgbm90aGluZyB0byBob2xkIGEgd3JpdGUgYW55d2F5LCBhbmQgbm90aGluZyBtYXkgYmUgZGVsYXllZFxuICAgICAgICBpZiAoIXRoaXMuc291cmNlcy5sZW5ndGgpIHJldHVybiAwO1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5zb3VyY2VzWzBdLnZhbGlkV2luZG93cykge1xuICAgICAgICAgICAgaWYgKHdbMF0gPD0gbm93ICYmIG5vdyA8IHdbMV0pIGVuZCA9IE1hdGgubWF4KGVuZCwgd1sxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbmQpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gZW5kIC0gV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXcml0YWJsZVNvdXJjZXMoY29uZmlnPzogeyBpZ25vcmVXaW5kb3c/OiBib29sZWFuIH0pOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCB3cml0YWJsZTogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0xpdmUoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjb25maWc/Lmlnbm9yZVdpbmRvdyAmJiAhd2luZG93c0FjY2VwdFdyaXRlcyh0aGlzLnNvdXJjZXNbaV0udmFsaWRXaW5kb3dzKSkgY29udGludWU7XG4gICAgICAgICAgICB3cml0YWJsZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0YWJsZTtcbiAgICB9XG5cbiAgICAvLyBPdXIgb3duIHNvdXJjZSAodGhlIGZpcnN0IHdyaXRhYmxlIG9uZSkgcGx1cyBldmVyeSByb3V0ZS1tYXRjaGluZyBwZWVyLiBFYWNoIHNvdXJjZSBkZWNpZGVzIGZvciBpdHNlbGYgaG93IGxvbmcgaXQgaG9sZHMgdGhlIHdyaXRlIGJlZm9yZSBpdCBoaXRzIHN0b3JhZ2UgKHNlZSBBcmNoaXZlc0RlbGF5ZWQpIC0gaGVyZSB0aGV5IGFsbCBqdXN0IGdldCB3cml0dGVuLlxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVUb1NvdXJjZXMoa2V5OiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgd3JpdGVUaW1lOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gVGhlIHJvdXRpbmcgZmlsZSBpcyBORVZFUiBzeW5jaHJvbml6ZWQgYmV0d2VlbiBzdG9yYWdlIG5vZGVzOiB0aGUgd3JpdGVyIHdyaXRlcyBpdCBkaXJlY3RseSB0byBlYWNoIG5vZGUsIHNvIHdlIHN0b3JlIGl0IG9uIG91ciBvd24gZGlzayBvbmx5IChubyB2YWxpZC13aW5kb3cgZmlsdGVyIC0gcm91dGluZy92YWxpZCB3aW5kb3dzIGNhbid0IHBvc3NpYmx5IGFwcGx5IHRvIHRoZSBmaWxlIGRlZmluaW5nIHRoZW0pIGFuZCBuZXZlciBmb3J3YXJkIGl0IHRvIG90aGVyIHNvdXJjZXMuXG4gICAgICAgIHRoaXMuY29uZmlnPy5vbldyaXRlQ291bnRlZD8uKFwiZmx1c2hlZFwiLCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIGxldCBpc1JvdXRpbmcgPSBrZXkgPT09IFJPVVRJTkdfRklMRTtcbiAgICAgICAgbGV0IHdyaXRhYmxlID0gdGhpcy5nZXRXcml0YWJsZVNvdXJjZXMoeyBpZ25vcmVXaW5kb3c6IGlzUm91dGluZyB9KTtcbiAgICAgICAgbGV0IGZpcnN0ID0gd3JpdGFibGUuc2hpZnQoKTtcbiAgICAgICAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc291cmNlIGFjY2VwdHMgd3JpdGVzIChldmVyeSBzb3VyY2UncyB2YWxpZCB3aW5kb3cgaXMgaW4gdGhlIHBhc3QpLCBzbyB3cml0ZXMgY2Fubm90IGJlIHN0b3JlZCAoc3RvcmUgJHt0aGlzLmZvbGRlcn0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdXIgb3duIChmaXJzdCkgc291cmNlIGJsb2NrcyB0aGUgd3JpdGUuIERvd25zdHJlYW0gc291cmNlcyBhcmUgd3JpdHRlbiBpbiB0aGUgYmFja2dyb3VuZDogYSBkb3duIGRvd25zdHJlYW0gc291cmNlIG11c3Qgbm90IGZhaWwgb3Igc3RhbGwgd3JpdGVzLCBhbmQgcmVjb25jaWxpYXRpb24gcmUtc2VuZHMgYW55dGhpbmcgdGhleSBtaXNzZWQgb25jZSB0aGV5IGNvbWUgYmFjay5cbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgYnl0ZXMgU1RBWSBvbiBvdXIgZGlzaywgYXMgZGVsZXRpb24gaGlzdG9yeTogdGhlIGluZGV4IG1hcmtzIHRoZSBrZXkgZGVsZXRlZCAoa2VlcGluZyBpdHMgdmFsdWUgLSBzZWUgVHJhbnNhY3Rpb25GaWxlLmRlbGV0ZSksIHJlYWRzIHN0b3AgZmluZGluZyBpdCwgYW5kIHRoZSByZXRlbnRpb24gcGFzcyBwaHlzaWNhbGx5IHJlbW92ZXMgdGhlIG9sZGVzdCBoaXN0b3J5IG9uY2UgaXQgb3V0Z3Jvd3MgaXRzIGJ1ZGdldCAoc2VlIFN0b3JlU3luYy5lbmZvcmNlSGlzdG9yeUxpbWl0KS4gVGhlIG1hcmtlZCBpbmRleCBlbnRyeSBpcyB0aGUgd2hvbGUgb2YgdGhlIGxvY2FsIGRlbGV0aW9uLlxuICAgICAgICAgICAgdGhpcy5zZXRJbmRleERlbGV0ZWQoa2V5LCB3cml0ZVRpbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2VzW2ZpcnN0XS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgbm9DaGVja3M6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV4RW50cnkoa2V5LCB7IHdyaXRlVGltZSwgc2l6ZTogZGF0YS5sZW5ndGgsIHNvdXJjZXNMaXN0SW5kZXg6IHRoaXMuc291cmNlc0xpc3RJbmRleE9mU2xvdChmaXJzdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogZGF0YS5sZW5ndGggPT09IDAgJiYgXCJkZWxcIiB8fCBcInNldFwiLCBmb2xkZXI6IHRoaXMuZm9sZGVyLCBzdG9yZTogdGhpcy5zdG9yZU5hbWUsIHBhdGg6IGtleSwgc2l6ZTogZGF0YS5sZW5ndGgsIHdyaXRlVGltZSB9KTtcbiAgICAgICAgaWYgKGlzUm91dGluZykgcmV0dXJuO1xuICAgICAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShrZXkpO1xuICAgICAgICAvLyBEZWxldGlvbnMgZGlkIG5vdCBjb25zdW1lIHRoZSBmaXJzdCBzbG90IChub3RoaW5nIGlzIHdyaXR0ZW4gYW55d2hlcmUgbG9jYWxseSksIHNvIGl0IHJlY2VpdmVzIHRoZSBwcm9wYWdhdGVkIGRlbGV0aW9uIGxpa2UgdGhlIHJlc3QgLSBleGNlcHQgc2xvdCAwLCBvdXIgb3duIGRpc2ssIHdob3NlIGJ5dGVzIEFSRSB0aGUgaGlzdG9yeSBiZWluZyBrZXB0XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCAmJiBmaXJzdCAhPT0gMCkge1xuICAgICAgICAgICAgd3JpdGFibGUudW5zaGlmdChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSBvZiB3cml0YWJsZSkge1xuICAgICAgICAgICAgaWYgKCFyb3V0ZUNvbnRhaW5zKHRoaXMuc291cmNlc1tpXS5yb3V0ZSwgcm91dGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIERlbGV0aW9ucyB0cmF2ZWwgYXMgZGVsIGNhcnJ5aW5nIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIChuZXZlciBhcyBlbXB0eSBzZXRzIC0gc2V0IHJlamVjdHMgZW1wdHkgYnVmZmVycykuIEJhY2tibGF6ZSBtYXRlcmlhbGl6ZXMgc3VjaCBkZWxzIGFzIHJlYWwgZW1wdHkgZmlsZXMsIHNvIGl0cyBsaXN0aW5ncyBzdGlsbCBzaG93IHRoZSBkZWxldGlvbiBmb3Igb3RoZXIgc3RvcmVzIHRvIHNjYW4gaW4gYXMgYSB0b21ic3RvbmUuXG4gICAgICAgICAgICBsZXQgcHVzaDogUHJvbWlzZTx1bmtub3duPjtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHB1c2ggPSB0aGlzLnNvdXJjZXNbaV0uc291cmNlLmRlbChrZXksIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaCA9IHRoaXMuc291cmNlc1tpXS5zb3VyY2Uuc2V0KGtleSwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSwgZm9yY2VTZXRJbW11dGFibGU6IHRydWUsIG5vQ2hlY2tzOiB0cnVlLCBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgcHVzaC5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYEJhY2tncm91bmQgd3JpdGUgb2YgJHtrZXl9IHRvIHN5bmMgc291cmNlICR7dGhpcy5zb3VyY2VzW2ldLnNvdXJjZS5nZXREZWJ1Z05hbWUoKX0gKHN0b3JlICR7dGhpcy5mb2xkZXJ9KSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTbG90IDAgaXMgYWx3YXlzIHRoaXMgc3RvcmUncyBvd24gZm9sZGVyIChzZWUgcGxhblNvdXJjZXMpLCBzbyB0aGUgZGlzayBpcyBrbm93biB3aXRob3V0IHNlYXJjaGluZyBmb3IgaXQgLSBhbmQgaXQgaXMgdGhlIHVud3JhcHBlZCBvbmUsIHBhc3QgYW55IHdyaXRlIGRlbGF5XG4gICAgcHJpdmF0ZSBnZXREaXNrU291cmNlKCk6IHsgZGlzazogQXJjaGl2ZXNEaXNrOyBzb3VyY2VJbmRleDogbnVtYmVyIH0ge1xuICAgICAgICByZXR1cm4geyBkaXNrOiB0aGlzLm93bkRpc2ssIHNvdXJjZUluZGV4OiAwIH07XG4gICAgfVxuXG4gICAgLyoqIFdyaXRlcyBldmVyeXRoaW5nIHN0aWxsIGhlbGQgYnkgYSBkZWxheWVkIHNvdXJjZSAoc2VlIEFyY2hpdmVzRGVsYXllZCkuIGZvcmNlIGFsc28gd3JpdGVzIHdoYXQgaXNuJ3QgZHVlIHlldCAtIHNodXRkb3duIGNhbm5vdCBsZWF2ZSB3cml0ZXMgaW4gbWVtb3J5LiAqL1xuICAgIHByaXZhdGUgYXN5bmMgZmx1c2hEZWxheWVkV3JpdGVzKGZvcmNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCB7IHNvdXJjZSB9IG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IGRlbGF5ZWQgPSBhc0RlbGF5ZWQoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghZGVsYXllZCkgY29udGludWU7XG4gICAgICAgICAgICBhd2FpdCBkZWxheWVkLmZsdXNoKGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
1091
+ /* _JS_SOURCE_HASH = "6ed1437fda8cd69195ec57a1d0da119afc74a1b11778403a586d7d690d9922fb"; */