@discordeno/gateway 21.0.1-next.b6bfaa3 → 21.0.1-next.c86c512

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.
@@ -65,8 +65,7 @@ function createGatewayManager(options) {
65
65
  enabled: options.resharding?.enabled ?? true,
66
66
  shardsFullPercentage: options.resharding?.shardsFullPercentage ?? 80,
67
67
  checkInterval: options.resharding?.checkInterval ?? 28800000,
68
- shards: new _utils.Collection(),
69
- pendingShards: new _utils.Collection(),
68
+ shards: new Map(),
70
69
  getSessionInfo: options.resharding?.getSessionInfo,
71
70
  updateGuildsShardId: options.resharding?.updateGuildsShardId,
72
71
  async checkIfReshardingIsNeeded () {
@@ -122,19 +121,23 @@ function createGatewayManager(options) {
122
121
  if (typeof info.firstShardId === 'number') gateway.firstShardId = info.firstShardId;
123
122
  // Set last shard id if provided in info
124
123
  if (typeof info.lastShardId === 'number') gateway.lastShardId = info.lastShardId;
124
+ else gateway.lastShardId = gateway.totalShards - 1;
125
125
  gateway.logger.info(`[Resharding] Starting the reshard process. New total shards: ${gateway.totalShards}`);
126
126
  // Resetting buckets
127
127
  gateway.buckets.clear();
128
128
  // Refilling buckets with new values
129
129
  gateway.prepareBuckets();
130
- // SPREAD THIS OUT TO DIFFERENT WORKERS TO BEGIN STARTING UP
131
- gateway.buckets.forEach(async (bucket, bucketId)=>{
130
+ // Call all the buckets and tell their workers & shards to identify
131
+ const promises = Array.from(gateway.buckets.entries()).map(async ([bucketId, bucket])=>{
132
132
  for (const worker of bucket.workers){
133
133
  for (const shardId of worker.queue){
134
134
  await gateway.resharding.tellWorkerToPrepare(worker.id, shardId, bucketId);
135
135
  }
136
136
  }
137
137
  });
138
+ await Promise.all(promises);
139
+ gateway.logger.info(`[Resharding] All shards are now online.`);
140
+ await gateway.resharding.onReshardingSwitch();
138
141
  },
139
142
  async tellWorkerToPrepare (workerId, shardId, bucketId) {
140
143
  gateway.logger.debug(`[Resharding] Telling worker to prepare. Worker: ${workerId} | Shard: ${shardId} | Bucket: ${bucketId}.`);
@@ -150,9 +153,9 @@ function createGatewayManager(options) {
150
153
  url: gateway.url,
151
154
  version: gateway.version
152
155
  },
153
- // Ignore events until we are ready
154
156
  events: {
155
157
  async message (_shard, payload) {
158
+ // Ignore all events until we swich from the old shards to the new ones.
156
159
  if (payload.t === 'READY') {
157
160
  await gateway.resharding.updateGuildsShardId?.(payload.d.guilds.map((g)=>g.id), shardId);
158
161
  }
@@ -168,22 +171,14 @@ function createGatewayManager(options) {
168
171
  };
169
172
  }
170
173
  gateway.resharding.shards.set(shardId, shard);
171
- const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency);
172
- if (!bucket) return;
173
- await shard.identify().then(()=>gateway.resharding.shardIsPending(shard));
174
+ await shard.identify();
175
+ gateway.logger.debug(`[Resharding] Shard #${shardId} identified.`);
174
176
  },
175
- async shardIsPending (shard) {
176
- // Save this in pending at the moment, until all shards are online
177
- gateway.resharding.pendingShards.set(shard.id, shard);
178
- gateway.logger.debug(`[Resharding] Shard #${shard.id} is now pending.`);
179
- // Check if all shards are now online.
180
- if (gateway.lastShardId - gateway.firstShardId >= gateway.resharding.pendingShards.size) return;
181
- gateway.logger.info(`[Resharding] All shards are now online.`);
182
- // New shards start processing events
177
+ async onReshardingSwitch () {
178
+ gateway.logger.debug(`[Resharding] Making the switch from the old shards to the new ones.`);
179
+ // Move the events from the old shards to the new ones
183
180
  for (const shard of gateway.resharding.shards.values()){
184
- for(const event in options.events){
185
- shard.events[event] = options.events[event];
186
- }
181
+ shard.events = options.events ?? {};
187
182
  }
188
183
  // Old shards stop processing events
189
184
  for (const shard of gateway.shards.values()){
@@ -200,14 +195,10 @@ function createGatewayManager(options) {
200
195
  };
201
196
  }
202
197
  gateway.logger.info(`[Resharding] Shutting down old shards.`);
203
- // Close old shards
204
198
  await gateway.shutdown(_types1.ShardSocketCloseCodes.Resharded, 'Resharded!', false);
205
199
  gateway.logger.info(`[Resharding] Completed.`);
206
- // Replace old shards
207
- gateway.shards = new _utils.Collection(gateway.resharding.shards);
208
- // Clear our collections and keep only one reference to the shards, the one in gateway.shards
200
+ gateway.shards = new Map(gateway.resharding.shards);
209
201
  gateway.resharding.shards.clear();
210
- gateway.resharding.pendingShards.clear();
211
202
  }
212
203
  },
213
204
  calculateTotalShards () {
@@ -234,7 +225,8 @@ function createGatewayManager(options) {
234
225
  leakyBucket: new _utils.LeakyBucket({
235
226
  max: 1,
236
227
  refillAmount: 1,
237
- refillInterval: gateway.spawnShardDelay
228
+ refillInterval: gateway.spawnShardDelay,
229
+ logger: this.logger
238
230
  })
239
231
  });
240
232
  }
@@ -484,4 +476,4 @@ function createGatewayManager(options) {
484
476
  return gateway;
485
477
  }
486
478
 
487
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQge1xuICB0eXBlIEF0TGVhc3RPbmUsXG4gIHR5cGUgQmlnU3RyaW5nLFxuICB0eXBlIENhbWVsaXplLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkUmVhZHksXG4gIHR5cGUgRGlzY29yZFVwZGF0ZVByZXNlbmNlLFxuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgUmVxdWVzdEd1aWxkTWVtYmVycyxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBMZWFreUJ1Y2tldCwganNvblNhZmVSZXBsYWNlciwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcydcbmltcG9ydCB7IHR5cGUgU2hhcmRFdmVudHMsIFNoYXJkU29ja2V0Q2xvc2VDb2RlcywgdHlwZSBTaGFyZFNvY2tldFJlcXVlc3QsIHR5cGUgVHJhbnNwb3J0Q29tcHJlc3Npb24sIHR5cGUgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgcHJlZmVyU25ha2VDYXNlOiBvcHRpb25zLnByZWZlclNuYWtlQ2FzZSA/PyBmYWxzZSxcbiAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICBidWNrZXRzOiBuZXcgTWFwKCksXG4gICAgY2FjaGU6IHtcbiAgICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuY2FjaGU/LnJlcXVlc3RNZW1iZXJzPy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICBwZW5kaW5nOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIG1ha2VQcmVzZW5jZTogb3B0aW9ucy5tYWtlUHJlc2VuY2UgPz8gKCgpID0+IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpKSxcbiAgICByZXNoYXJkaW5nOiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLnJlc2hhcmRpbmc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNoYXJkc0Z1bGxQZXJjZW50YWdlOiBvcHRpb25zLnJlc2hhcmRpbmc/LnNoYXJkc0Z1bGxQZXJjZW50YWdlID8/IDgwLFxuICAgICAgY2hlY2tJbnRlcnZhbDogb3B0aW9ucy5yZXNoYXJkaW5nPy5jaGVja0ludGVydmFsID8/IDI4ODAwMDAwLCAvLyA4IGhvdXJzXG4gICAgICBzaGFyZHM6IG5ldyBDb2xsZWN0aW9uKCksXG4gICAgICBwZW5kaW5nU2hhcmRzOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgZ2V0U2Vzc2lvbkluZm86IG9wdGlvbnMucmVzaGFyZGluZz8uZ2V0U2Vzc2lvbkluZm8sXG4gICAgICB1cGRhdGVHdWlsZHNTaGFyZElkOiBvcHRpb25zLnJlc2hhcmRpbmc/LnVwZGF0ZUd1aWxkc1NoYXJkSWQsXG4gICAgICBhc3luYyBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkKCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIENoZWNraW5nIGlmIHJlc2hhcmRpbmcgaXMgbmVlZGVkLicpXG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBkaXNhYmxlZC4nKVxuXG4gICAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiBmYWxzZSB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWdhdGV3YXkucmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIGVuYWJsZWQgYnV0IG5vICdyZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCknIGlzIG5vdCBwcm92aWRlZC5cIilcbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkLicpXG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gU2Vzc2lvbiBpbmZvIHJldHJpZXZlZDogJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uSW5mbyl9YClcblxuICAgICAgICAvLyBEb24ndCBoYXZlIGVub3VnaCBpZGVudGlmeSBsaW1pdHMgdG8gdHJ5IHJlc2hhcmRpbmdcbiAgICAgICAgaWYgKHNlc3Npb25JbmZvLnNlc3Npb25TdGFydExpbWl0LnJlbWFpbmluZyA8IHNlc3Npb25JbmZvLnNoYXJkcykge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gTm90IGVub3VnaCBzZXNzaW9uIHN0YXJ0IGxpbWl0cyBsZWZ0IHRvIHJlc2hhcmQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UsIGluZm86IHNlc3Npb25JbmZvIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gQWJsZSB0byByZXNoYXJkLCBjaGVja2luZyB3aGV0aGVyIG5lY2Vzc2FyeSBub3cuJylcblxuICAgICAgICAvLyAyNTAwIGlzIHRoZSBtYXggYW1vdW50IG9mIGd1aWxkcyBhIHNpbmdsZSBzaGFyZCBjYW4gaGFuZGxlXG4gICAgICAgIC8vIDEwMDAgaXMgdGhlIGFtb3VudCBvZiBndWlsZHMgZGlzY29yZCB1c2VzIHRvIGRldGVybWluZSBob3cgbWFueSBzaGFyZHMgdG8gcmVjb21tZW5kLlxuICAgICAgICAvLyBUaGlzIGFsZ28gaGVscHMgY2hlY2sgaWYgeW91ciBib3QgaGFzIGdyb3duIGVub3VnaCB0byByZXNoYXJkLlxuICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGltcHJlY2lzZSBhcyBkaXNjb3JkIGNoYW5nZXMgdGhlIHJlY29tbWVuZGVkIG51bWJlciBvZiBzaGFyZCBldmVyeSAxMDAwIGd1aWxkcyBpdCBpcyBnb29kIGVub3VnaFxuICAgICAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gc3RvcmUgdGhlIGd1aWxkIGNvdW50IGZvciBlYWNoIHNoYXJkIGFuZCByZXF1aXJlIHRoZSBHdWlsZHMgaW50ZW50IGZvciBgR1VJTERfQ1JFQVRFYCBhbmQgYEdVSUxEX0RFTEVURWAgZXZlbnRzXG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoc2Vzc2lvbkluZm8uc2hhcmRzIC8gKChnYXRld2F5LnRvdGFsU2hhcmRzICogMjUwMCkgLyAxMDAwKSkgKiAxMDBcblxuICAgICAgICAvLyBMZXNzIHRoYW4gbmVjZXNzYXJ5JSBiZWluZyB1c2VkIHNvIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPCBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzRnVsbFBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgbm90IG5lZWRlZC4nKVxuXG4gICAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiBmYWxzZSwgaW5mbzogc2Vzc2lvbkluZm8gfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgbmVlZGVkLicpXG5cbiAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiB0cnVlLCBpbmZvOiBzZXNzaW9uSW5mbyB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmVzaGFyZChpbmZvKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBQcmV2aW91cyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICAvLyBTZXQgdmFsdWVzIG9uIGdhdGV3YXlcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGluZm8uc2hhcmRzXG4gICAgICAgIC8vIEhhbmRsZXMgcHJlcGFyaW5nIG1pZCBzaXplZCBib3RzIGZvciBMQlNcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGdhdGV3YXkuY2FsY3VsYXRlVG90YWxTaGFyZHMoKVxuICAgICAgICAvLyBTZXQgZmlyc3Qgc2hhcmQgaWQgaWYgcHJvdmlkZWQgaW4gaW5mb1xuICAgICAgICBpZiAodHlwZW9mIGluZm8uZmlyc3RTaGFyZElkID09PSAnbnVtYmVyJykgZ2F0ZXdheS5maXJzdFNoYXJkSWQgPSBpbmZvLmZpcnN0U2hhcmRJZFxuICAgICAgICAvLyBTZXQgbGFzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5sYXN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkubGFzdFNoYXJkSWQgPSBpbmZvLmxhc3RTaGFyZElkXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBOZXcgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcblxuICAgICAgICAvLyBSZXNldHRpbmcgYnVja2V0c1xuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuY2xlYXIoKVxuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpXG5cbiAgICAgICAgLy8gU1BSRUFEIFRISVMgT1VUIFRPIERJRkZFUkVOVCBXT1JLRVJTIFRPIEJFR0lOIFNUQVJUSU5HIFVQXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5mb3JFYWNoKGFzeW5jIChidWNrZXQsIGJ1Y2tldElkKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgYXN5bmMgdGVsbFdvcmtlclRvUHJlcGFyZSh3b3JrZXJJZCwgc2hhcmRJZCwgYnVja2V0SWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBUZWxsaW5nIHdvcmtlciB0byBwcmVwYXJlLiBXb3JrZXI6ICR7d29ya2VySWR9IHwgU2hhcmQ6ICR7c2hhcmRJZH0gfCBCdWNrZXQ6ICR7YnVja2V0SWR9LmApXG4gICAgICAgIGNvbnN0IHNoYXJkID0gbmV3IFNoYXJkKHtcbiAgICAgICAgICBpZDogc2hhcmRJZCxcbiAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICBjb21wcmVzczogZ2F0ZXdheS5jb21wcmVzcyxcbiAgICAgICAgICAgIHRyYW5zcG9ydENvbXByZXNzaW9uOiBnYXRld2F5LnRyYW5zcG9ydENvbXByZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgICBpbnRlbnRzOiBnYXRld2F5LmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBnYXRld2F5LnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogZ2F0ZXdheS50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiBnYXRld2F5LnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiBnYXRld2F5LnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IGdhdGV3YXkudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIElnbm9yZSBldmVudHMgdW50aWwgd2UgYXJlIHJlYWR5XG4gICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKF9zaGFyZCwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICBpZiAocGF5bG9hZC50ID09PSAnUkVBRFknKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnVwZGF0ZUd1aWxkc1NoYXJkSWQ/LihcbiAgICAgICAgICAgICAgICAgIChwYXlsb2FkLmQgYXMgRGlzY29yZFJlYWR5KS5ndWlsZHMubWFwKChnKSA9PiBnLmlkKSxcbiAgICAgICAgICAgICAgICAgIHNoYXJkSWQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9nZ2VyOiBnYXRld2F5LmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGdhdGV3YXkucHJlZmVyU25ha2VDYXNlKSB7XG4gICAgICAgICAgc2hhcmQuZm9yd2FyZFRvQm90ID0gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50cz8ubWVzc2FnZT8uKHNoYXJkLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuXG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCkudGhlbigoKSA9PiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRJc1BlbmRpbmcoc2hhcmQpKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHNoYXJkSXNQZW5kaW5nKHNoYXJkKSB7XG4gICAgICAgIC8vIFNhdmUgdGhpcyBpbiBwZW5kaW5nIGF0IHRoZSBtb21lbnQsIHVudGlsIGFsbCBzaGFyZHMgYXJlIG9ubGluZVxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcucGVuZGluZ1NoYXJkcy5zZXQoc2hhcmQuaWQsIHNoYXJkKVxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNoYXJkICMke3NoYXJkLmlkfSBpcyBub3cgcGVuZGluZy5gKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuXG4gICAgICAgIGlmIChnYXRld2F5Lmxhc3RTaGFyZElkIC0gZ2F0ZXdheS5maXJzdFNoYXJkSWQgPj0gZ2F0ZXdheS5yZXNoYXJkaW5nLnBlbmRpbmdTaGFyZHMuc2l6ZSkgcmV0dXJuXG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIEFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuYClcblxuICAgICAgICAvLyBOZXcgc2hhcmRzIHN0YXJ0IHByb2Nlc3NpbmcgZXZlbnRzXG4gICAgICAgIGZvciAoY29uc3Qgc2hhcmQgb2YgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy52YWx1ZXMoKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gb3B0aW9ucy5ldmVudHMpIHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50c1tldmVudCBhcyBrZXlvZiBTaGFyZEV2ZW50c10gPSBvcHRpb25zLmV2ZW50c1tldmVudCBhcyBrZXlvZiBTaGFyZEV2ZW50c10gYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93blxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9sZCBzaGFyZHMgc3RvcCBwcm9jZXNzaW5nIGV2ZW50c1xuICAgICAgICBmb3IgKGNvbnN0IHNoYXJkIG9mIGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSGFuZGxlciA9IHNoYXJkLmV2ZW50cy5tZXNzYWdlXG5cbiAgICAgICAgICAvLyBDaGFuZ2Ugd2l0aCBzcHJlYWQgb3BlcmF0b3IgdG8gbm90IGFmZmVjdCBuZXcgc2hhcmRzLCBhcyBjaGFuZ2luZyBhbnl0aGluZyBvbiBzaGFyZC5ldmVudHMgd2lsbCBkaXJlY3RseSBjaGFuZ2Ugb3B0aW9ucy5ldmVudHMsIHdoaWNoIGNoYW5nZXMgbmV3IHNoYXJkcycgZXZlbnRzXG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0ge1xuICAgICAgICAgICAgLi4uc2hhcmQuZXZlbnRzLFxuICAgICAgICAgICAgbWVzc2FnZTogYXN5bmMgZnVuY3Rpb24gKF8sIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgLy8gTWVtYmVyIGNoZWNrcyBuZWVkIHRvIGNvbnRpbnVlIGJ1dCBvdGhlcnMgY2FuIHN0b3BcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudCA9PT0gJ0dVSUxEX01FTUJFUlNfQ0hVTksnKSB7XG4gICAgICAgICAgICAgICAgb2xkSGFuZGxlcj8uKHNoYXJkLCBtZXNzYWdlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTaHV0dGluZyBkb3duIG9sZCBzaGFyZHMuYClcbiAgICAgICAgLy8gQ2xvc2Ugb2xkIHNoYXJkc1xuICAgICAgICBhd2FpdCBnYXRld2F5LnNodXRkb3duKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQsICdSZXNoYXJkZWQhJywgZmFsc2UpXG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIENvbXBsZXRlZC5gKVxuXG4gICAgICAgIC8vIFJlcGxhY2Ugb2xkIHNoYXJkc1xuICAgICAgICBnYXRld2F5LnNoYXJkcyA9IG5ldyBDb2xsZWN0aW9uKGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMpXG5cbiAgICAgICAgLy8gQ2xlYXIgb3VyIGNvbGxlY3Rpb25zIGFuZCBrZWVwIG9ubHkgb25lIHJlZmVyZW5jZSB0byB0aGUgc2hhcmRzLCB0aGUgb25lIGluIGdhdGV3YXkuc2hhcmRzXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuY2xlYXIoKVxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcucGVuZGluZ1NoYXJkcy5jbGVhcigpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBjYWxjdWxhdGVUb3RhbFNoYXJkcygpIHtcbiAgICAgIC8vIEJvdHMgdW5kZXIgMTAwayBzZXJ2ZXJzIGRvIG5vdCBoYXZlIGFjY2VzcyB0byBMQlMuXG4gICAgICBpZiAoZ2F0ZXdheS50b3RhbFNoYXJkcyA8IDEwMCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIHJldHVybiBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgLy8gQ2FsY3VsYXRlIGEgbXVsdGlwbGUgb2YgYG1heENvbmN1cnJlbmN5YCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBnYXRld2F5LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgL1xuICAgICAgICAgICAgLy8gSWYgYG1heENvbmN1cnJlbmN5YCBpcyAxLCB3ZSBjYW4gc2FmZWx5IHVzZSAxNiB0byBnZXQgYHRvdGFsU2hhcmRzYCB0byBiZSBpbiBhIG11bHRpcGxlIG9mIDE2IHNvIHRoYXQgd2UgY2FuIHByZXBhcmUgYm90cyB3aXRoIDEwMGsgc2VydmVycyBmb3IgTEJTLlxuICAgICAgICAgICAgKGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSA9PT0gMSA/IDE2IDogZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KSxcbiAgICAgICAgKSAqIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIClcbiAgICB9LFxuICAgIGNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpIHtcbiAgICAgIGNvbnN0IHdvcmtlcklkID0gb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW5cbiAgICAgICAgPyBzaGFyZElkICUgZ2F0ZXdheS50b3RhbFdvcmtlcnNcbiAgICAgICAgOiBNYXRoLm1pbihNYXRoLmZsb29yKHNoYXJkSWQgLyBnYXRld2F5LnNoYXJkc1BlcldvcmtlciksIGdhdGV3YXkudG90YWxXb3JrZXJzIC0gMSlcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gd29ya2VySWRcbiAgICB9LFxuICAgIHByZXBhcmVCdWNrZXRzKCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7ICsraSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBjb25jdXJyZW5jeTogJHtpfWApXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGxlYWt5QnVja2V0OiBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiAxLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IGdhdGV3YXkuc3Bhd25TaGFyZERlbGF5LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBPcmdhbml6ZSBhbGwgc2hhcmRzIGludG8gdGhlaXIgb3duIGJ1Y2tldHNcbiAgICAgIGZvciAobGV0IHNoYXJkSWQgPSBnYXRld2F5LmZpcnN0U2hhcmRJZDsgc2hhcmRJZCA8PSBnYXRld2F5Lmxhc3RTaGFyZElkOyArK3NoYXJkSWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3Igc2hhcmQ6ICR7c2hhcmRJZH1gKVxuXG4gICAgICAgIGlmIChzaGFyZElkID49IGdhdGV3YXkudG90YWxTaGFyZHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSkgaXMgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB1c2VkIGFtb3VudCBvZiB1c2VkIHNoYXJkcyB3aGljaCBpcyAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1Y2tldElkID0gc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeVxuICAgICAgICBjb25zdCBidWNrZXQgPSBnYXRld2F5LmJ1Y2tldHMuZ2V0KGJ1Y2tldElkKVxuXG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNoYXJkIChpZDogJHtzaGFyZElkfSkgZ290IGFzc2lnbmVkIHRvIGFuIGlsbGVnYWwgYnVja2V0IGlkOiAke2J1Y2tldElkfSwgZXhwZWN0ZWQgYSBidWNrZXQgaWQgYmV0d2VlbiAwIGFuZCAke1xuICAgICAgICAgICAgICBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgLSAxXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHdvcmtlciBpZCBmb3IgdGhpcyBzaGFyZFxuICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGdhdGV3YXkuY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZClcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYnVja2V0LndvcmtlcnMuZmluZCgodykgPT4gdy5pZCA9PT0gd29ya2VySWQpXG5cbiAgICAgICAgLy8gSWYgdGhpcyB3b3JrZXIgYWxyZWFkeSBleGlzdHMsIGFkZCB0aGUgc2hhcmQgdG8gaXRzIHF1ZXVlXG4gICAgICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgICB3b3JrZXIucXVldWUucHVzaChzaGFyZElkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Y2tldC53b3JrZXJzLnB1c2goeyBpZDogd29ya2VySWQsIHF1ZXVlOiBbc2hhcmRJZF0gfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc3Bhd25TaGFyZHMoKSB7XG4gICAgICAvLyBQcmVwYXJlIHRoZSBjb25jdXJyZW5jeSBidWNrZXRzXG4gICAgICBnYXRld2F5LnByZXBhcmVCdWNrZXRzKClcblxuICAgICAgY29uc3QgcHJvbWlzZXMgPSBbLi4uZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKV0ubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNoYXJkSWQgb2Ygd29ya2VyLnF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCBnYXRld2F5LnRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlci5pZCwgc2hhcmRJZCwgYnVja2V0SWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBXZSB1c2UgUHJvbWlzZS5hbGwgc28gd2UgY2FuIHN0YXJ0IGFsbCBidWNrZXRzIGF0IHRoZSBzYW1lIHRpbWVcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuXG4gICAgICAvLyBDaGVjayBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5IGlmIGF1dG8gcmVzaGFyZGluZyBpcyBlbmFibGVkLlxuICAgICAgaWYgKGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkICYmIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsICE9PSAtMSkge1xuICAgICAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gZW5zdXJlIHRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZVxuICAgICAgICBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpXG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIud2FybihcIltSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIGVuYWJsZWQgYnV0ICdyZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCknIHdhcyBub3QgcHJvdmlkZWQuIERpc2FibGluZyByZXNoYXJkaW5nLlwiKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2hhcmRpbmdJbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQoKVxuXG4gICAgICAgICAgaWYgKHJlc2hhcmRpbmdJbmZvLm5lZWRlZCAmJiByZXNoYXJkaW5nSW5mby5pbmZvKSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcucmVzaGFyZChyZXNoYXJkaW5nSW5mby5pbmZvKVxuICAgICAgICB9LCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbClcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNodXRkb3duKGNvZGUsIHJlYXNvbiwgY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwgPSB0cnVlKSB7XG4gICAgICBpZiAoY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwoZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZClcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShnYXRld2F5LnNoYXJkcy52YWx1ZXMoKSkubWFwKChzaGFyZCkgPT4gc2hhcmQuY2xvc2UoY29kZSwgcmVhc29uKSkpXG4gICAgfSxcbiAgICBhc3luYyBzZW5kUGF5bG9hZChzaGFyZElkLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IGdhdGV3YXkuc2hhcmRzLmdldChzaGFyZElkKVxuXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmQgKGlkOiAke3NoYXJkSWR9IG5vdCBmb3VuZGApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNoYXJkLnNlbmQocGF5bG9hZClcbiAgICB9LFxuICAgIGFzeW5jIHRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlcklkLCBzaGFyZElkLCBidWNrZXRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBUZWxsIHdvcmtlciAjJHt3b3JrZXJJZH0gdG8gaWRlbnRpZnkgc2hhcmQgIyR7c2hhcmRJZH0gZnJvbSBidWNrZXQgJHtidWNrZXRJZH1gKVxuICAgICAgYXdhaXQgZ2F0ZXdheS5pZGVudGlmeShzaGFyZElkKVxuICAgIH0sXG4gICAgYXN5bmMgaWRlbnRpZnkoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBsZXQgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3MsXG4gICAgICAgICAgICB0cmFuc3BvcnRDb21wcmVzc2lvbjogZ2F0ZXdheS50cmFuc3BvcnRDb21wcmVzc2lvbixcbiAgICAgICAgICAgIGludGVudHM6IHRoaXMuaW50ZW50cyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgIHRva2VuOiB0aGlzLnRva2VuLFxuICAgICAgICAgICAgdG90YWxTaGFyZHM6IHRoaXMudG90YWxTaGFyZHMsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBvcHRpb25zLmV2ZW50cyA/PyB7fSxcbiAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICAgIHJlcXVlc3RJZGVudGlmeTogYXN5bmMgKCkgPT4gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCksXG4gICAgICAgICAgbWFrZVByZXNlbmNlOiBnYXRld2F5Lm1ha2VQcmVzZW5jZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5wcmVmZXJTbmFrZUNhc2UpIHtcbiAgICAgICAgICBzaGFyZC5mb3J3YXJkVG9Cb3QgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgc2hhcmQhLmV2ZW50cy5tZXNzYWdlPy4oc2hhcmQhLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuaWRlbnRpZnkoKVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTaGFyZCAjJHtzaGFyZElkfSByZXF1ZXN0ZWQgYW4gaWRlbnRpZnkuYClcblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuXG4gICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IGlkZW50aWZ5IGZvciBhIHNoYXJkIHRoYXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueSBidWNrZXQuXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGJ1Y2tldC5sZWFreUJ1Y2tldC5hY3F1aXJlKClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBBcHByb3ZlZCBpZGVudGlmeSByZXF1ZXN0IGZvciBTaGFyZCAjJHtzaGFyZElkfS5gKVxuICAgIH0sXG5cbiAgICBhc3luYyBraWxsKHNoYXJkSWQ6IG51bWJlcikge1xuICAgICAgY29uc3Qgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTaGFyZCAjJHtzaGFyZElkfSB3YXMgcmVxdWVzdGVkIHRvIGJlIGtpbGxlZCwgYnV0IHRoZSBzaGFyZCBjb3VsZCBub3QgYmUgZm91bmQuYClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gS2lsbGluZyBTaGFyZCAjJHtzaGFyZElkfWApXG4gICAgICB0aGlzLnNoYXJkcy5kZWxldGUoc2hhcmRJZClcbiAgICAgIGF3YWl0IHNoYXJkLnNodXRkb3duKClcbiAgICB9LFxuXG4gICAgLy8gSGVscGVycyBtZXRob2RzIGJlbG93IHRoaXNcblxuICAgIGNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCwgdG90YWxTaGFyZHMpIHtcbiAgICAgIC8vIElmIG5vbmUgaXMgcHJvdmlkZWQsIHVzZSB0aGUgdG90YWwgc2hhcmRzIG51bWJlciBmcm9tIGdhdGV3YXkgb2JqZWN0LlxuICAgICAgaWYgKCF0b3RhbFNoYXJkcykgdG90YWxTaGFyZHMgPSBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICAvLyBJZiBpdCBpcyBvbmx5IDEgc2hhcmQsIGl0IHdpbGwgYWx3YXlzIGJlIHNoYXJkIGlkIDBcbiAgICAgIGlmICh0b3RhbFNoYXJkcyA9PT0gMSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGNhbGN1bGF0ZVNoYXJkSWQgKDEgc2hhcmQpYClcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBjYWxjdWxhdGVTaGFyZElkIChndWlsZElkOiAke2d1aWxkSWR9LCB0b3RhbFNoYXJkczogJHt0b3RhbFNoYXJkc30pYClcbiAgICAgIHJldHVybiBOdW1iZXIoKEJpZ0ludChndWlsZElkKSA+PiAyMm4pICUgQmlnSW50KHRvdGFsU2hhcmRzKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblZvaWNlQ2hhbm5lbChndWlsZElkLCBjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBqb2luVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gY2hhbm5lbElkOiAke2NoYW5uZWxJZH1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IGNoYW5uZWxJZC50b1N0cmluZygpLFxuICAgICAgICAgIHNlbGZfbXV0ZTogb3B0aW9ucz8uc2VsZk11dGUgPz8gZmFsc2UsXG4gICAgICAgICAgc2VsZl9kZWFmOiBvcHRpb25zPy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFN0YXR1cyhkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRCb3RTdGF0dXMgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uU2FmZVJlcGxhY2VyKX1gKVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLmdhdGV3YXkuc2hhcmRzLnZhbHVlcygpXS5tYXAoYXN5bmMgKHNoYXJkKSA9PiB7XG4gICAgICAgICAgZ2F0ZXdheS5lZGl0U2hhcmRTdGF0dXMoc2hhcmQuaWQsIGRhdGEpXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2hhcmRTdGF0dXMoc2hhcmRJZCwgZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0U2hhcmRTdGF0dXMgc2hhcmRJZDogJHtzaGFyZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUHJlc2VuY2VVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBzaW5jZTogbnVsbCxcbiAgICAgICAgICBhZms6IGZhbHNlLFxuICAgICAgICAgIGFjdGl2aXRpZXM6IGRhdGEuYWN0aXZpdGllcyxcbiAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWVzdE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBpZiAoZ2F0ZXdheS5pbnRlbnRzICYmICghb3B0aW9ucz8ubGltaXQgfHwgb3B0aW9ucy5saW1pdCA+IDEpICYmICEoZ2F0ZXdheS5pbnRlbnRzICYgR2F0ZXdheUludGVudHMuR3VpbGRNZW1iZXJzKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmV0Y2ggbW9yZSB0aGVuIDEgbWVtYmVyIHdpdGhvdXQgdGhlIEdVSUxEX01FTUJFUlMgaW50ZW50JylcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0TWVtYmVycyBndWlsZElkOiAke2d1aWxkSWR9IC0+IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcblxuICAgICAgaWYgKG9wdGlvbnM/LnVzZXJJZHM/Lmxlbmd0aCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gc2V0dGluZyB1c2VyIGxpbWl0IGJhc2VkIG9uIHVzZXJJZHMgbGVuZ3RoOiAke29wdGlvbnMudXNlcklkcy5sZW5ndGh9YClcblxuICAgICAgICBvcHRpb25zLmxpbWl0ID0gb3B0aW9ucy51c2VySWRzLmxlbmd0aFxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgIGxldCBub25jZSA9ICcnXG5cbiAgICAgICAgd2hpbGUgKCFub25jZSB8fCBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuaGFzKG5vbmNlKSkge1xuICAgICAgICAgIG5vbmNlID0gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA/Pz0geyBsaW1pdDogMCB9XG4gICAgICAgIG9wdGlvbnMubm9uY2UgPSBub25jZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZW1iZXJzID0gIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICAgICAgICAgICAgaWYgKCFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5wZW5kaW5nLnNldChvcHRpb25zLm5vbmNlLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiBvcHRpb25zLm5vbmNlLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXF1ZXN0R3VpbGRNZW1iZXJzLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAvLyBJZiBhIHF1ZXJ5IGlzIHByb3ZpZGVkIHVzZSBpdCwgT1IgaWYgYSBsaW1pdCBpcyBOT1QgcHJvdmlkZWQgdXNlIFwiXCJcbiAgICAgICAgICBxdWVyeTogb3B0aW9ucz8ucXVlcnkgPz8gKG9wdGlvbnM/LmxpbWl0ID8gdW5kZWZpbmVkIDogJycpLFxuICAgICAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdCA/PyAwLFxuICAgICAgICAgIHByZXNlbmNlczogb3B0aW9ucz8ucHJlc2VuY2VzID8/IGZhbHNlLFxuICAgICAgICAgIHVzZXJfaWRzOiBvcHRpb25zPy51c2VySWRzPy5tYXAoKGlkKSA9PiBpZC50b1N0cmluZygpKSxcbiAgICAgICAgICBub25jZTogb3B0aW9ucz8ubm9uY2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgbWVtYmVyc1xuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVZvaWNlQ2hhbm5lbChndWlsZElkKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gbGVhdmVWb2ljZUNoYW5uZWwgZ3VpbGRJZDogJHtndWlsZElkfSBTaGFyZCAke3NoYXJkSWR9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGFubmVsX2lkOiBudWxsLFxuICAgICAgICAgIHNlbGZfbXV0ZTogZmFsc2UsXG4gICAgICAgICAgc2VsZl9kZWFmOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RTb3VuZGJvYXJkU291bmRzKGd1aWxkSWRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIERpc2NvcmQgd2lsbCBzZW5kIHRoZSBldmVudHMgZm9yIHRoZSBndWlsZHMgdGhhdCBhcmUgXCJ1bmRlciB0aGUgc2hhcmRcIiB0aGF0IHNlbmRzIHRoZSBvcGNvZGUuXG4gICAgICAgKiBGb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBncm91cCB0aGUgaWRzIHdpdGggdGhlIHNoYXJkIHRoZSBjYWxjdWxhdGVTaGFyZElkIG1ldGhvZCBnaXZlc1xuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBCaWdTdHJpbmdbXT4oKVxuXG4gICAgICBmb3IgKGNvbnN0IGd1aWxkSWQgb2YgZ3VpbGRJZHMpIHtcbiAgICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICAgIGNvbnN0IGlkcyA9IG1hcC5nZXQoc2hhcmRJZCkgPz8gW11cbiAgICAgICAgbWFwLnNldChzaGFyZElkLCBpZHMpXG5cbiAgICAgICAgaWRzLnB1c2goZ3VpbGRJZClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5tYXAuZW50cmllcygpXS5tYXAoKFtzaGFyZElkLCBpZHNdKSA9PlxuICAgICAgICAgIGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlcXVlc3RTb3VuZGJvYXJkU291bmRzLFxuICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICBndWlsZF9pZHM6IGlkcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiBnYXRld2F5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBmaXJzdCBTaGFyZCB3aGljaCBzaG91bGQgZ2V0IGNvbnRyb2xsZWQgYnkgdGhpcyBtYW5hZ2VyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBmaXJzdFNoYXJkSWQ/OiBudW1iZXJcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBsYXN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGxhc3RTaGFyZElkPzogbnVtYmVyXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgc3Bhd25pbmcgbmV4dCBzaGFyZC4gT1BUSU1BTCBJUyBBQk9WRSA1MTAwLiBZT1UgRE9OJ1QgV0FOVCBUTyBISVQgVEhFIFJBVEUgTElNSVQhISFcbiAgICogQGRlZmF1bHQgNTMwMFxuICAgKi9cbiAgc3Bhd25TaGFyZERlbGF5PzogbnVtYmVyXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNlbmQgdGhlIGRpc2NvcmQgcGFja2V0cyBpbiBzbmFrZSBjYXNlIGZvcm0uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBwcmVmZXJTbmFrZUNhc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiBUb3RhbCBhbW91bnQgb2Ygc2hhcmRzIHlvdXIgYm90IHVzZXMuIFVzZWZ1bCBmb3IgemVyby1kb3dudGltZSB1cGRhdGVzIG9yIHJlc2hhcmRpbmcuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHRvdGFsU2hhcmRzPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHNoYXJkcyB0byBsb2FkIHBlciB3b3JrZXIuXG4gICAqIEBkZWZhdWx0IDI1XG4gICAqL1xuICBzaGFyZHNQZXJXb3JrZXI/OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29ya2VycyB0byB1c2UgZm9yIHlvdXIgYm90LlxuICAgKiBAZGVmYXVsdCA0XG4gICAqL1xuICB0b3RhbFdvcmtlcnM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3ByZWFkIHNoYXJkcyBhY3Jvc3Mgd29ya2VycyBpbiBhIHJvdW5kLXJvYmluIG1hbm5lci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQnkgZGVmYXVsdCwgc2hhcmRzIGFyZSBhc3NpZ25lZCB0byB3b3JrZXJzIGluIGNvbnRpZ3VvdXMgYmxvY2tzIGJhc2VkIG9uIHNoYXJkc1Blcldvcmtlci4gSWYgYW55IHNoYXJkIGlzIGxlZnQgb3ZlciwgaXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbGFzdCB3b3JrZXIuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSAzIHdvcmtlcnMgYW5kIDQwIHNoYXJkcyB3aGlsZSBzaGFyZHNQZXJXb3JrZXIgaXMgMTAsIHRoZSBmaXJzdCB3b3JrZXIgd2lsbCBnZXQgc2hhcmRzIDAtOSwgdGhlIHNlY29uZCB3b3JrZXIgd2lsbCBnZXQgc2hhcmRzIDEwLTE5LCBhbmQgc28gb24sIHRoZSBsYXN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMjAtMzkuXG4gICAqXG4gICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byB0cnVlLCB0aGUgc2hhcmRzIHdpbGwgYmUgYXNzaWduZWQgaW4gYSByb3VuZC1yb2JpbiBtYW5uZXIgdG8gc3ByZWFkIG1vcmUgZXZlbmx5IGFjcm9zcyB3b3JrZXJzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCAzIHdvcmtlcnMgYW5kIDQwIHNoYXJkcywgdGhlIGZpcnN0IHNoYXJkIHdpbGwgZ28gdG8gd29ya2VyIDAsIHRoZSBzZWNvbmQgc2hhcmQgdG8gd29ya2VyIDEsIHRoZSB0aGlyZCBzaGFyZCB0byB3b3JrZXIgMiwgdGhlIGZvdXJ0aCBzaGFyZCB0byB3b3JrZXIgMCwgYW5kIHNvIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc3ByZWFkU2hhcmRzSW5Sb3VuZFJvYmluPzogYm9vbGVhblxuICAvKiogSW1wb3J0YW50IGRhdGEgd2hpY2ggaXMgdXNlZCBieSB0aGUgbWFuYWdlciB0byBjb25uZWN0IHNoYXJkcyB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGlvbj86IENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90PlxuICAvKiogV2hldGhlciBpbmNvbWluZyBwYXlsb2FkcyBhcmUgY29tcHJlc3NlZCB1c2luZyB6bGliLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY29tcHJlc3M/OiBib29sZWFuXG4gIC8qKiBXaGF0IHRyYW5zcG9ydCBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAqL1xuICB0cmFuc3BvcnRDb21wcmVzc2lvbj86IFRyYW5zcG9ydENvbXByZXNzaW9uIHwgbnVsbFxuICAvKiogVGhlIGNhbGN1bGF0ZWQgaW50ZW50IHZhbHVlIG9mIHRoZSBldmVudHMgd2hpY2ggdGhlIHNoYXJkIHNob3VsZCByZWNlaXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBpbnRlbnRzPzogbnVtYmVyXG4gIC8qKiBJZGVudGlmeSBwcm9wZXJ0aWVzIHRvIHVzZSAqL1xuICBwcm9wZXJ0aWVzPzoge1xuICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHRoZSBzaGFyZCBydW5zIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJkYXJ3aW5cIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiXG4gICAgICovXG4gICAgb3M6IHN0cmluZ1xuICAgIC8qKiBUaGUgXCJicm93c2VyXCIgd2hlcmUgdGhpcyBzaGFyZCBpcyBydW5uaW5nIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBicm93c2VyOiBzdHJpbmdcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmdcbiAgfVxuICAvKiogQm90IHRva2VuIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsPzogc3RyaW5nXG4gIC8qKiBUaGUgZ2F0ZXdheSB2ZXJzaW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgdmVyc2lvbj86IG51bWJlclxuICAvKiogVGhlIGV2ZW50cyBoYW5kbGVycyAqL1xuICBldmVudHM/OiBTaGFyZEV2ZW50c1xuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZT86IHtcbiAgICByZXF1ZXN0TWVtYmVycz86IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciBvciBub3QgcmVxdWVzdCBtZW1iZXIgcmVxdWVzdHMgc2hvdWxkIGJlIGNhY2hlZC5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGdhdGV3YXkgbWFuYWdlciB3aWxsIHVzZS5cbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKlxuICAgKiBNYWtlIHRoZSBwcmVzZW5jZSBmb3Igd2hlbiB0aGUgYm90IGNvbm5lY3RzIHRvIHRoZSBnYXRld2F5XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgU2hhcmQgaXMgZ29pbmcgdG8gaWRlbnRpZnlcbiAgICovXG4gIG1ha2VQcmVzZW5jZT86ICgpID0+IFByb21pc2U8RGlzY29yZFVwZGF0ZVByZXNlbmNlIHwgdW5kZWZpbmVkPlxuICAvKiogT3B0aW9ucyByZWxhdGVkIHRvIHJlc2hhcmRpbmcuICovXG4gIHJlc2hhcmRpbmc/OiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgYXV0b21hdGVkIHJlc2hhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgJSBvZiBob3cgZnVsbCBhIHNoYXJkIGlzIHdoZW4gcmVzaGFyZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBXZSB1c2UgZGlzY29yZCByZWNvbW1lbmRlZCBzaGFyZCB2YWx1ZSB0byBnZXQgYW4gKiphcHByb3hpbWF0aW9uKiogb2YgdGhlIHNoYXJkIGZ1bGwgcGVyY2VudGFnZSB0byBjb21wYXJlIHdpdGggdGhpcyB2YWx1ZSBzbyB0aGUgYm90IG1heSBub3QgcmVzaGFyZCBhdCB0aGUgZXhhY3QgcGVyY2VudGFnZSBwcm92aWRlZCBidXQgbWF5IHJlc2hhcmQgd2hlbiBpdCBpcyBhIGJpdCBoaWdoZXIgdGhhbiB0aGUgcHJvdmlkZWQgcGVyY2VudGFnZS5cbiAgICAgKiBGb3IgYWNjdXJhdGUgY2FsY3VsYXRpb24sIHlvdSBtYXkgb3ZlcnJpZGUgdGhlIGBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkYCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODAgYXMgaW4gODAlXG4gICAgICovXG4gICAgc2hhcmRzRnVsbFBlcmNlbnRhZ2U6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMsIG9mIGhvdyBvZnRlbiB0byBjaGVjayB3aGV0aGVyIHJlc2hhcmRpbmcgaXMgbmVlZGVkIGFuZCByZXNoYXJkIGF1dG9tYXRpY2FsbHkuIFNldCB0byAtMSB0byBkaXNhYmxlIGF1dG8gcmVzaGFyZGluZy5cbiAgICAgKiBAZGVmYXVsdCAyODgwMDAwMCAoOCBob3VycylcbiAgICAgKi9cbiAgICBjaGVja0ludGVydmFsOiBudW1iZXJcbiAgICAvKiogSGFuZGxlciB0byBnZXQgc2hhcmQgY291bnQgYW5kIG90aGVyIHNlc3Npb24gaW5mby4gKi9cbiAgICBnZXRTZXNzaW9uSW5mbz86ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+PlxuICAgIC8qKiBIYW5kbGVyIHRvIGVkaXQgdGhlIHNoYXJkIGlkIG9uIGFueSBjYWNoZWQgZ3VpbGRzLiAqL1xuICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ/OiAoZ3VpbGRJZHM6IHN0cmluZ1tdLCBzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlNYW5hZ2VyIGV4dGVuZHMgUmVxdWlyZWQ8Q3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zPiB7XG4gIC8qKiBUaGUgbWF4IGNvbmN1cnJlbmN5IGJ1Y2tldHMuIFRob3NlIHdpbGwgYmUgY3JlYXRlZCB3aGVuIHRoZSBgc3Bhd25TaGFyZHNgICh3aGljaCBjYWxscyBgcHJlcGFyZUJ1Y2tldHNgIHVuZGVyIHRoZSBob29kKSBmdW5jdGlvbiBnZXRzIGNhbGxlZC4gKi9cbiAgYnVja2V0czogTWFwPFxuICAgIG51bWJlcixcbiAgICB7XG4gICAgICB3b3JrZXJzOiBBcnJheTx7IGlkOiBudW1iZXI7IHF1ZXVlOiBudW1iZXJbXSB9PlxuICAgICAgLyoqIFRoZSBidWNrZXQgdG8gcXVldWUgdGhlIGlkZW50aWZpZXMuICovXG4gICAgICBsZWFreUJ1Y2tldDogTGVha3lCdWNrZXRcbiAgICB9XG4gID5cbiAgLyoqIFRoZSBzaGFyZHMgdGhhdCBhcmUgY3JlYXRlZC4gKi9cbiAgc2hhcmRzOiBNYXA8bnVtYmVyLCBTaGFyZD5cbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZzogQ3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zWydyZXNoYXJkaW5nJ10gJiB7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVydmFsIGlkIG9mIHRoZSBjaGVjayBpbnRlcnZhbC4gVGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcnZhbCB3aGVuIHRoZSBtYW5hZ2VyIGlzIHNodXRkb3duLlxuICAgICAqL1xuICAgIGNoZWNrSW50ZXJ2YWxJZD86IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkXG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IENvbGxlY3Rpb248bnVtYmVyLCBTaGFyZD5cbiAgICAvKiogSG9sZHMgdGhlIHBlbmRpbmcgc2hhcmRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFyZSBwZW5kaW5nIGFsbCBzaGFyZHMgZmluaXNoIGxvYWRpbmcuICovXG4gICAgcGVuZGluZ1NoYXJkczogQ29sbGVjdGlvbjxudW1iZXIsIFNoYXJkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNoZWNrIGlmIHJlc2hhcmRpbmcgaXMgbmVjZXNzYXJ5LiAqL1xuICAgIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQ6ICgpID0+IFByb21pc2U8eyBuZWVkZWQ6IGJvb2xlYW47IGluZm8/OiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gfT5cbiAgICAvKiogSGFuZGxlciB0byBiZWdpbiByZXNoYXJkaW5nLiAqL1xuICAgIHJlc2hhcmQ6IChpbmZvOiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gJiB7IGZpcnN0U2hhcmRJZD86IG51bWJlcjsgbGFzdFNoYXJkSWQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgYSBzaGFyZCBuZWVkcyB0byBiZSBjcmVhdGVkLiAqL1xuICAgIHRlbGxXb3JrZXJUb1ByZXBhcmU6ICh3b3JrZXJJZDogbnVtYmVyLCBzaGFyZElkOiBudW1iZXIsIGJ1Y2tldElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgICAvKiogSGFuZGxlciB0byBhbGVydCB0aGUgZ2F0ZXdheSB0aGF0IGEgc2hhcmQocmVzaGFyZGVkKSBpcyBvbmxpbmUuIEl0IHNob3VsZCBub3cgd2FpdCBmb3IgYWxsIHNoYXJkcyB0byBiZSBwZW5kaW5nIGJlZm9yZSBzaHV0dGluZyBvZmYgb2xkIHNoYXJkcy4gKi9cbiAgICBzaGFyZElzUGVuZGluZzogKHNoYXJkOiBTaGFyZCkgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG4gIC8qKiBEZXRlcm1pbmUgbWF4IG51bWJlciBvZiBzaGFyZHMgdG8gdXNlIGJhc2VkIHVwb24gdGhlIG1heCBjb25jdXJyZW5jeS4gKi9cbiAgY2FsY3VsYXRlVG90YWxTaGFyZHM6ICgpID0+IG51bWJlclxuICAvKiogRGV0ZXJtaW5lIHRoZSBpZCBvZiB0aGUgd29ya2VyIHdoaWNoIGlzIGhhbmRsaW5nIGEgc2hhcmQuICovXG4gIGNhbGN1bGF0ZVdvcmtlcklkOiAoc2hhcmRJZDogbnVtYmVyKSA9PiBudW1iZXJcbiAgLyoqIFByZXBhcmVzIGFsbCB0aGUgYnVja2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGlkZW50aWZ5aW5nIHRoZSBzaGFyZHMuICovXG4gIHByZXBhcmVCdWNrZXRzOiAoKSA9PiB2b2lkXG4gIC8qKiBTdGFydCBpZGVudGlmeWluZyBhbGwgdGhlIHNoYXJkcy4gKi9cbiAgc3Bhd25TaGFyZHM6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFNodXRkb3duIGFsbCBzaGFyZHMuICovXG4gIHNodXRkb3duOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZywgY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWw/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEFsbG93cyB1c2VycyB0byBob29rIGluIGFuZCBjaGFuZ2UgdG8gY29tbXVuaWNhdGUgdG8gZGlmZmVyZW50IHdvcmtlcnMgYWNyb3NzIGRpZmZlcmVudCBzZXJ2ZXJzIG9yIGFueXRoaW5nIHRoZXkgbGlrZS5cbiAgICogRm9yIGV4YW1wbGUgdXNpbmcgcmVkaXMgcHVic3ViIHRvIHRhbGsgdG8gb3RoZXIgc2VydmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHJldHVybmVkIHByb21pc2VcbiAgICovXG4gIHRlbGxXb3JrZXJUb0lkZW50aWZ5OiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBUZWxsIHRoZSBtYW5hZ2VyIHRvIGlkZW50aWZ5IGEgU2hhcmQuIElmIHRoaXMgU2hhcmQgaXMgbm90IGFscmVhZHkgbWFuYWdlZCB0aGlzIHdpbGwgYWxzbyBhZGQgdGhlIFNoYXJkIHRvIHRoZSBtYW5hZ2VyLiAqL1xuICBpZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogS2lsbCBhIHNoYXJkLiBDbG9zZSBhIHNoYXJkcyBjb25uZWN0aW9uIHRvIERpc2NvcmQncyBnYXRld2F5IChpZiBhbnkpIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbWFuYWdlci4gKi9cbiAga2lsbDogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIGJ1Y2tldCBpcyBhbGxvd2VkIHRvIG1ha2UgdGhlIG5leHQgaWRlbnRpZnkgcmVxdWVzdC4gKi9cbiAgcmVxdWVzdElkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2Ygc2hhcmRzIGJhc2VkIG9uIHRoZSBndWlsZCBpZCBhbmQgdG90YWwgc2hhcmRzLiAqL1xuICBjYWxjdWxhdGVTaGFyZElkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0b3RhbFNoYXJkcz86IG51bWJlcikgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0aGUgYm90IHVzZXIgdG8gYSB2b2ljZSBvciBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBfVXBkYXRlIFZvaWNlIFN0YXRlXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSB2b2ljZSBjaGFubmVsIHRvIGxlYXZlIGlzIGluLlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHlvdSB3YW50IHRvIGpvaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgQ09OTkVDVGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBqb2luVm9pY2VDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEF0TGVhc3RPbmU8T21pdDxVcGRhdGVWb2ljZVN0YXRlLCAnZ3VpbGRJZCcgfCAnY2hhbm5lbElkJz4+KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90IHN0YXR1cyBpbiBhbGwgc2hhcmRzIHRoYXQgdGhpcyBnYXRld2F5IG1hbmFnZXMuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0Qm90U3RhdHVzOiAoZGF0YTogRGlzY29yZFVwZGF0ZVByZXNlbmNlKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90J3Mgc3RhdHVzIG9uIG9uZSBzaGFyZC5cbiAgICpcbiAgICogQHBhcmFtIHNoYXJkSWQgVGhlIHNoYXJkIGlkIHRvIGVkaXQgdGhlIHN0YXR1cyBmb3IuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0U2hhcmRTdGF0dXM6IChzaGFyZElkOiBudW1iZXIsIGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvciBhIGd1aWxkIG92ZXIgdGhlIGdhdGV3YXkuIElmIGBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWRgIGlzIG5vdCBzZXQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkgYW5kIHlvdSdsbCBoYXZlIHRvIGhhbmRsZSB0aGUgYEdVSUxEX01FTUJFUlNfQ0hVTktgIGV2ZW50cyB5b3Vyc2VsZi5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiByZXF1ZXN0aW5nIHRoZSBlbnRpcmUgbWVtYmVyIGxpc3Q6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBHVUlMRF9NRU1CRVJTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgcHJlc2VuY2VzICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5wcmVzZW5jZXMgfCBwcmVzZW5jZXN9IHNldCB0byBgdHJ1ZWApOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfUFJFU0VOQ0VTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSBwcmVmaXggKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnF1ZXJ5IHwgcXVlcnl9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSB1c2VycyBieSBJRCAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMudXNlcklkcyB8IHVzZXJJZHN9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlcnMgQ2h1bmtfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IDEwMDAgbWVtYmVycyBmZXRjaGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqL1xuICByZXF1ZXN0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IE9taXQ8UmVxdWVzdEd1aWxkTWVtYmVycywgJ2d1aWxkSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gIC8qKlxuICAgKiBMZWF2ZXMgdGhlIHZvaWNlIGNoYW5uZWwgdGhlIGJvdCB1c2VyIGlzIGN1cnJlbnRseSBpbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBsZWF2ZVZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogVXNlZCB0byByZXF1ZXN0IHNvdW5kYm9hcmQgc291bmRzIGZvciBhIGxpc3Qgb2YgZ3VpbGRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIG11bHRpcGxlIChzZWUgcmVtYXJrcykgX1JlcXVlc3QgU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZHMgLSBUaGUgZ3VpbGRzIHRvIGdldCB0aGUgc291bmRzIGZyb21cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIOKaoO+4jyBEaXNjb3JkIHdpbGwgc2VuZCB0aGUgX1NvdW5kYm9hcmQgU291bmRzXyBmb3IgZWFjaCBvZiB0aGUgZ3VpbGQgaWRzXG4gICAqIGhvd2V2ZXIgeW91IG1heSBub3QgcmVjZWl2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZXZlbnRzIGFzIHRoZSBpZHMgcGFzc2VkIHRvIF9SZXF1ZXN0IFNvdW5kYm9hcmQgU291bmRzXyBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcbiAgICogLSBUaGUgYm90IGlzIG5vdCBpbiB0aGUgc2VydmVyIHByb3ZpZGVkXG4gICAqIC0gVGhlIHNoYXJkIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHNlbnQgZnJvbSBkb2VzIG5vdCByZWNlaXZlIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBndWlsZFxuICAgKlxuICAgKiBUbyBhdm9pZCB0aGlzIERpc2NvcmRlbm8gd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBncm91cCB0aGUgaWRzIGJhc2VkIG9uIHdoYXQgc2hhcmQgdGhleSB3aWxsIG5lZWQgdG8gYmUgc2VudCwgYnV0IHRoaXMgaW52b2x2ZXMgc2VuZGluZyBtdWx0aXBsZSBtZXNzYWdlcyBpbiBtdWx0aXBsZSBzaGFyZHNcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI3JlcXVlc3Qtc291bmRib2FyZC1zb3VuZHN9XG4gICAqL1xuICByZXF1ZXN0U291bmRib2FyZFNvdW5kczogKGd1aWxkSWRzOiBCaWdTdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZToge1xuICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkOiBib29sZWFuXG4gICAgICAvKiogVGhlIHBlbmRpbmcgcmVxdWVzdHMuICovXG4gICAgICBwZW5kaW5nOiBDb2xsZWN0aW9uPHN0cmluZywgUmVxdWVzdE1lbWJlclJlcXVlc3Q+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE1lbWJlclJlcXVlc3Qge1xuICAvKiogVGhlIHVuaXF1ZSBub25jZSBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBub25jZTogc3RyaW5nXG4gIC8qKiBUaGUgcmVzb2x2ZXIgaGFuZGxlciB0byBydW4gd2hlbiBhbGwgbWVtYmVycyBhcnJpdmUuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogQ2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+IHwgUHJvbWlzZUxpa2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PikgPT4gdm9pZFxuICAvKiogVGhlIG1lbWJlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXJyaXZlZCBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBtZW1iZXJzOiBEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUdhdGV3YXlNYW5hZ2VyIiwib3B0aW9ucyIsImNvbm5lY3Rpb25PcHRpb25zIiwiY29ubmVjdGlvbiIsInVybCIsInNoYXJkcyIsInNlc3Npb25TdGFydExpbWl0IiwibWF4Q29uY3VycmVuY3kiLCJyZW1haW5pbmciLCJ0b3RhbCIsInJlc2V0QWZ0ZXIiLCJnYXRld2F5IiwiZXZlbnRzIiwiY29tcHJlc3MiLCJ0cmFuc3BvcnRDb21wcmVzc2lvbiIsImludGVudHMiLCJwcm9wZXJ0aWVzIiwib3MiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJicm93c2VyIiwiZGV2aWNlIiwidG9rZW4iLCJ2ZXJzaW9uIiwidG90YWxTaGFyZHMiLCJsYXN0U2hhcmRJZCIsImZpcnN0U2hhcmRJZCIsInRvdGFsV29ya2VycyIsInNoYXJkc1BlcldvcmtlciIsInNwYXduU2hhcmREZWxheSIsInNwcmVhZFNoYXJkc0luUm91bmRSb2JpbiIsInByZWZlclNuYWtlQ2FzZSIsIk1hcCIsImJ1Y2tldHMiLCJjYWNoZSIsInJlcXVlc3RNZW1iZXJzIiwiZW5hYmxlZCIsInBlbmRpbmciLCJDb2xsZWN0aW9uIiwibG9nZ2VyIiwibWFrZVByZXNlbmNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bmRlZmluZWQiLCJyZXNoYXJkaW5nIiwic2hhcmRzRnVsbFBlcmNlbnRhZ2UiLCJjaGVja0ludGVydmFsIiwicGVuZGluZ1NoYXJkcyIsImdldFNlc3Npb25JbmZvIiwidXBkYXRlR3VpbGRzU2hhcmRJZCIsImNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQiLCJkZWJ1ZyIsIm5lZWRlZCIsIkVycm9yIiwic2Vzc2lvbkluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiaW5mbyIsInBlcmNlbnRhZ2UiLCJyZXNoYXJkIiwiY2FsY3VsYXRlVG90YWxTaGFyZHMiLCJjbGVhciIsInByZXBhcmVCdWNrZXRzIiwiZm9yRWFjaCIsImJ1Y2tldCIsImJ1Y2tldElkIiwid29ya2VyIiwid29ya2VycyIsInNoYXJkSWQiLCJxdWV1ZSIsInRlbGxXb3JrZXJUb1ByZXBhcmUiLCJpZCIsIndvcmtlcklkIiwic2hhcmQiLCJTaGFyZCIsIm1lc3NhZ2UiLCJfc2hhcmQiLCJwYXlsb2FkIiwidCIsImQiLCJndWlsZHMiLCJtYXAiLCJnIiwicmVxdWVzdElkZW50aWZ5IiwiZm9yd2FyZFRvQm90Iiwic2V0IiwiZ2V0IiwiaWRlbnRpZnkiLCJ0aGVuIiwic2hhcmRJc1BlbmRpbmciLCJzaXplIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIYW5kbGVyIiwiXyIsInNodXRkb3duIiwiU2hhcmRTb2NrZXRDbG9zZUNvZGVzIiwiUmVzaGFyZGVkIiwiTWF0aCIsImNlaWwiLCJjYWxjdWxhdGVXb3JrZXJJZCIsIm1pbiIsImZsb29yIiwiaSIsImxlYWt5QnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImZpbmQiLCJ3IiwicHVzaCIsInNwYXduU2hhcmRzIiwicHJvbWlzZXMiLCJlbnRyaWVzIiwidGVsbFdvcmtlclRvSWRlbnRpZnkiLCJhbGwiLCJjbGVhckludGVydmFsIiwiY2hlY2tJbnRlcnZhbElkIiwid2FybiIsInNldEludGVydmFsIiwicmVzaGFyZGluZ0luZm8iLCJjb2RlIiwicmVhc29uIiwiY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwiLCJBcnJheSIsImZyb20iLCJjbG9zZSIsInNlbmRQYXlsb2FkIiwic2VuZCIsImFjcXVpcmUiLCJraWxsIiwiZGVsZXRlIiwiY2FsY3VsYXRlU2hhcmRJZCIsImd1aWxkSWQiLCJOdW1iZXIiLCJCaWdJbnQiLCJqb2luVm9pY2VDaGFubmVsIiwiY2hhbm5lbElkIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIlZvaWNlU3RhdGVVcGRhdGUiLCJndWlsZF9pZCIsInRvU3RyaW5nIiwiY2hhbm5lbF9pZCIsInNlbGZfbXV0ZSIsInNlbGZNdXRlIiwic2VsZl9kZWFmIiwic2VsZkRlYWYiLCJlZGl0Qm90U3RhdHVzIiwiZGF0YSIsImpzb25TYWZlUmVwbGFjZXIiLCJlZGl0U2hhcmRTdGF0dXMiLCJQcmVzZW5jZVVwZGF0ZSIsInNpbmNlIiwiYWZrIiwiYWN0aXZpdGllcyIsInN0YXR1cyIsImxpbWl0IiwiR2F0ZXdheUludGVudHMiLCJHdWlsZE1lbWJlcnMiLCJ1c2VySWRzIiwibGVuZ3RoIiwibm9uY2UiLCJoYXMiLCJyYW5kb21CeXRlcyIsIm1lbWJlcnMiLCJyZWplY3QiLCJSZXF1ZXN0R3VpbGRNZW1iZXJzIiwicXVlcnkiLCJwcmVzZW5jZXMiLCJ1c2VyX2lkcyIsImxlYXZlVm9pY2VDaGFubmVsIiwicmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZElkcyIsImlkcyIsIlJlcXVlc3RTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRfaWRzIl0sIm1hcHBpbmdzIjoiOzs7OytCQWlCZ0JBOzs7ZUFBQUE7Ozs0QkFqQlk7dUJBWXJCO3VCQUMyRDs4REFDaEQ7d0JBQ2lIOzs7Ozs7QUFFNUgsU0FBU0EscUJBQXFCQyxPQUFvQztJQUN2RSxNQUFNQyxvQkFBb0JELFFBQVFFLFVBQVUsSUFBSTtRQUM5Q0MsS0FBSztRQUNMQyxRQUFRO1FBQ1JDLG1CQUFtQjtZQUNqQkMsZ0JBQWdCO1lBQ2hCQyxXQUFXO1lBQ1hDLE9BQU87WUFDUEMsWUFBWSxPQUFPLEtBQUssS0FBSztRQUMvQjtJQUNGO0lBRUEsTUFBTUMsVUFBMEI7UUFDOUJDLFFBQVFYLFFBQVFXLE1BQU0sSUFBSSxDQUFDO1FBQzNCQyxVQUFVWixRQUFRWSxRQUFRLElBQUk7UUFDOUJDLHNCQUFzQmIsUUFBUWEsb0JBQW9CLElBQUk7UUFDdERDLFNBQVNkLFFBQVFjLE9BQU8sSUFBSTtRQUM1QkMsWUFBWTtZQUNWQyxJQUFJaEIsUUFBUWUs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
479
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQge1xuICB0eXBlIEF0TGVhc3RPbmUsXG4gIHR5cGUgQmlnU3RyaW5nLFxuICB0eXBlIENhbWVsaXplLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkUmVhZHksXG4gIHR5cGUgRGlzY29yZFVwZGF0ZVByZXNlbmNlLFxuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgUmVxdWVzdEd1aWxkTWVtYmVycyxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBMZWFreUJ1Y2tldCwganNvblNhZmVSZXBsYWNlciwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcydcbmltcG9ydCB7IHR5cGUgU2hhcmRFdmVudHMsIFNoYXJkU29ja2V0Q2xvc2VDb2RlcywgdHlwZSBTaGFyZFNvY2tldFJlcXVlc3QsIHR5cGUgVHJhbnNwb3J0Q29tcHJlc3Npb24sIHR5cGUgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgcHJlZmVyU25ha2VDYXNlOiBvcHRpb25zLnByZWZlclNuYWtlQ2FzZSA/PyBmYWxzZSxcbiAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICBidWNrZXRzOiBuZXcgTWFwKCksXG4gICAgY2FjaGU6IHtcbiAgICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuY2FjaGU/LnJlcXVlc3RNZW1iZXJzPy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICBwZW5kaW5nOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIG1ha2VQcmVzZW5jZTogb3B0aW9ucy5tYWtlUHJlc2VuY2UgPz8gKCgpID0+IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpKSxcbiAgICByZXNoYXJkaW5nOiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLnJlc2hhcmRpbmc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNoYXJkc0Z1bGxQZXJjZW50YWdlOiBvcHRpb25zLnJlc2hhcmRpbmc/LnNoYXJkc0Z1bGxQZXJjZW50YWdlID8/IDgwLFxuICAgICAgY2hlY2tJbnRlcnZhbDogb3B0aW9ucy5yZXNoYXJkaW5nPy5jaGVja0ludGVydmFsID8/IDI4ODAwMDAwLCAvLyA4IGhvdXJzXG4gICAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICAgIGdldFNlc3Npb25JbmZvOiBvcHRpb25zLnJlc2hhcmRpbmc/LmdldFNlc3Npb25JbmZvLFxuICAgICAgdXBkYXRlR3VpbGRzU2hhcmRJZDogb3B0aW9ucy5yZXNoYXJkaW5nPy51cGRhdGVHdWlsZHNTaGFyZElkLFxuICAgICAgYXN5bmMgY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBDaGVja2luZyBpZiByZXNoYXJkaW5nIGlzIG5lZWRlZC4nKVxuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZGlzYWJsZWQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkIGJ1dCBubyAncmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbygpJyBpcyBub3QgcHJvdmlkZWQuXCIpXG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZC4nKVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKClcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNlc3Npb24gaW5mbyByZXRyaWV2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkluZm8pfWApXG5cbiAgICAgICAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2ggaWRlbnRpZnkgbGltaXRzIHRvIHRyeSByZXNoYXJkaW5nXG4gICAgICAgIGlmIChzZXNzaW9uSW5mby5zZXNzaW9uU3RhcnRMaW1pdC5yZW1haW5pbmcgPCBzZXNzaW9uSW5mby5zaGFyZHMpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIE5vdCBlbm91Z2ggc2Vzc2lvbiBzdGFydCBsaW1pdHMgbGVmdCB0byByZXNoYXJkLicpXG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9XG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIEFibGUgdG8gcmVzaGFyZCwgY2hlY2tpbmcgd2hldGhlciBuZWNlc3Nhcnkgbm93LicpXG5cbiAgICAgICAgLy8gMjUwMCBpcyB0aGUgbWF4IGFtb3VudCBvZiBndWlsZHMgYSBzaW5nbGUgc2hhcmQgY2FuIGhhbmRsZVxuICAgICAgICAvLyAxMDAwIGlzIHRoZSBhbW91bnQgb2YgZ3VpbGRzIGRpc2NvcmQgdXNlcyB0byBkZXRlcm1pbmUgaG93IG1hbnkgc2hhcmRzIHRvIHJlY29tbWVuZC5cbiAgICAgICAgLy8gVGhpcyBhbGdvIGhlbHBzIGNoZWNrIGlmIHlvdXIgYm90IGhhcyBncm93biBlbm91Z2ggdG8gcmVzaGFyZC5cbiAgICAgICAgLy8gV2hpbGUgdGhpcyBpcyBpbXByZWNpc2UgYXMgZGlzY29yZCBjaGFuZ2VzIHRoZSByZWNvbW1lbmRlZCBudW1iZXIgb2Ygc2hhcmQgZXZlcnkgMTAwMCBndWlsZHMgaXQgaXMgZ29vZCBlbm91Z2hcbiAgICAgICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHN0b3JlIHRoZSBndWlsZCBjb3VudCBmb3IgZWFjaCBzaGFyZCBhbmQgcmVxdWlyZSB0aGUgR3VpbGRzIGludGVudCBmb3IgYEdVSUxEX0NSRUFURWAgYW5kIGBHVUlMRF9ERUxFVEVgIGV2ZW50c1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKHNlc3Npb25JbmZvLnNoYXJkcyAvICgoZ2F0ZXdheS50b3RhbFNoYXJkcyAqIDI1MDApIC8gMTAwMCkpICogMTAwXG5cbiAgICAgICAgLy8gTGVzcyB0aGFuIG5lY2Vzc2FyeSUgYmVpbmcgdXNlZCBzbyBkbyBub3RoaW5nXG4gICAgICAgIGlmIChwZXJjZW50YWdlIDwgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkc0Z1bGxQZXJjZW50YWdlKSB7XG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIG5vdCBuZWVkZWQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UsIGluZm86IHNlc3Npb25JbmZvIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIG5lZWRlZC4nKVxuXG4gICAgICAgIHJldHVybiB7IG5lZWRlZDogdHJ1ZSwgaW5mbzogc2Vzc2lvbkluZm8gfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHJlc2hhcmQoaW5mbykge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU3RhcnRpbmcgdGhlIHJlc2hhcmQgcHJvY2Vzcy4gUHJldmlvdXMgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcbiAgICAgICAgLy8gU2V0IHZhbHVlcyBvbiBnYXRld2F5XG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBpbmZvLnNoYXJkc1xuICAgICAgICAvLyBIYW5kbGVzIHByZXBhcmluZyBtaWQgc2l6ZWQgYm90cyBmb3IgTEJTXG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBnYXRld2F5LmNhbGN1bGF0ZVRvdGFsU2hhcmRzKClcbiAgICAgICAgLy8gU2V0IGZpcnN0IHNoYXJkIGlkIGlmIHByb3ZpZGVkIGluIGluZm9cbiAgICAgICAgaWYgKHR5cGVvZiBpbmZvLmZpcnN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkuZmlyc3RTaGFyZElkID0gaW5mby5maXJzdFNoYXJkSWRcbiAgICAgICAgLy8gU2V0IGxhc3Qgc2hhcmQgaWQgaWYgcHJvdmlkZWQgaW4gaW5mb1xuICAgICAgICBpZiAodHlwZW9mIGluZm8ubGFzdFNoYXJkSWQgPT09ICdudW1iZXInKSBnYXRld2F5Lmxhc3RTaGFyZElkID0gaW5mby5sYXN0U2hhcmRJZFxuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZ2V0IGFueSBsYXN0U2hhcmRJZCwgd2UgYXNzdW1lIGFsbCB0aGUgc2hhcmRzIGFyZSB0byBiZSB1c2VkXG4gICAgICAgIGVsc2UgZ2F0ZXdheS5sYXN0U2hhcmRJZCA9IGdhdGV3YXkudG90YWxTaGFyZHMgLSAxXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBOZXcgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcblxuICAgICAgICAvLyBSZXNldHRpbmcgYnVja2V0c1xuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuY2xlYXIoKVxuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpXG5cbiAgICAgICAgLy8gQ2FsbCBhbGwgdGhlIGJ1Y2tldHMgYW5kIHRlbGwgdGhlaXIgd29ya2VycyAmIHNoYXJkcyB0byBpZGVudGlmeVxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20oZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKSkubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiBidWNrZXQud29ya2Vycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzaGFyZElkIG9mIHdvcmtlci5xdWV1ZSkge1xuICAgICAgICAgICAgICBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcudGVsbFdvcmtlclRvUHJlcGFyZSh3b3JrZXIuaWQsIHNoYXJkSWQsIGJ1Y2tldElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gQWxsIHNoYXJkcyBhcmUgbm93IG9ubGluZS5gKVxuXG4gICAgICAgIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5vblJlc2hhcmRpbmdTd2l0Y2goKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gVGVsbGluZyB3b3JrZXIgdG8gcHJlcGFyZS4gV29ya2VyOiAke3dvcmtlcklkfSB8IFNoYXJkOiAke3NoYXJkSWR9IHwgQnVja2V0OiAke2J1Y2tldElkfS5gKVxuICAgICAgICBjb25zdCBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IGdhdGV3YXkuY29tcHJlc3MsXG4gICAgICAgICAgICB0cmFuc3BvcnRDb21wcmVzc2lvbjogZ2F0ZXdheS50cmFuc3BvcnRDb21wcmVzc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgaW50ZW50czogZ2F0ZXdheS5pbnRlbnRzLFxuICAgICAgICAgICAgcHJvcGVydGllczogZ2F0ZXdheS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdG9rZW46IGdhdGV3YXkudG9rZW4sXG4gICAgICAgICAgICB0b3RhbFNoYXJkczogZ2F0ZXdheS50b3RhbFNoYXJkcyxcbiAgICAgICAgICAgIHVybDogZ2F0ZXdheS51cmwsXG4gICAgICAgICAgICB2ZXJzaW9uOiBnYXRld2F5LnZlcnNpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIGFzeW5jIG1lc3NhZ2UoX3NoYXJkLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgZXZlbnRzIHVudGlsIHdlIHN3aWNoIGZyb20gdGhlIG9sZCBzaGFyZHMgdG8gdGhlIG5ldyBvbmVzLlxuICAgICAgICAgICAgICBpZiAocGF5bG9hZC50ID09PSAnUkVBRFknKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnVwZGF0ZUd1aWxkc1NoYXJkSWQ/LihcbiAgICAgICAgICAgICAgICAgIChwYXlsb2FkLmQgYXMgRGlzY29yZFJlYWR5KS5ndWlsZHMubWFwKChnKSA9PiBnLmlkKSxcbiAgICAgICAgICAgICAgICAgIHNoYXJkSWQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9nZ2VyOiBnYXRld2F5LmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGdhdGV3YXkucHJlZmVyU25ha2VDYXNlKSB7XG4gICAgICAgICAgc2hhcmQuZm9yd2FyZFRvQm90ID0gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50cz8ubWVzc2FnZT8uKHNoYXJkLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KClcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNoYXJkICMke3NoYXJkSWR9IGlkZW50aWZpZWQuYClcbiAgICAgIH0sXG4gICAgICBhc3luYyBvblJlc2hhcmRpbmdTd2l0Y2goKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gTWFraW5nIHRoZSBzd2l0Y2ggZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXMuYClcblxuICAgICAgICAvLyBNb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0gb3B0aW9ucy5ldmVudHMgPz8ge31cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9sZCBzaGFyZHMgc3RvcCBwcm9jZXNzaW5nIGV2ZW50c1xuICAgICAgICBmb3IgKGNvbnN0IHNoYXJkIG9mIGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSGFuZGxlciA9IHNoYXJkLmV2ZW50cy5tZXNzYWdlXG5cbiAgICAgICAgICAvLyBDaGFuZ2Ugd2l0aCBzcHJlYWQgb3BlcmF0b3IgdG8gbm90IGFmZmVjdCBuZXcgc2hhcmRzLCBhcyBjaGFuZ2luZyBhbnl0aGluZyBvbiBzaGFyZC5ldmVudHMgd2lsbCBkaXJlY3RseSBjaGFuZ2Ugb3B0aW9ucy5ldmVudHMsIHdoaWNoIGNoYW5nZXMgbmV3IHNoYXJkcycgZXZlbnRzXG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0ge1xuICAgICAgICAgICAgLi4uc2hhcmQuZXZlbnRzLFxuICAgICAgICAgICAgbWVzc2FnZTogYXN5bmMgZnVuY3Rpb24gKF8sIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgLy8gTWVtYmVyIGNoZWNrcyBuZWVkIHRvIGNvbnRpbnVlIGJ1dCBvdGhlcnMgY2FuIHN0b3BcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudCA9PT0gJ0dVSUxEX01FTUJFUlNfQ0hVTksnKSB7XG4gICAgICAgICAgICAgICAgb2xkSGFuZGxlcj8uKHNoYXJkLCBtZXNzYWdlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTaHV0dGluZyBkb3duIG9sZCBzaGFyZHMuYClcbiAgICAgICAgYXdhaXQgZ2F0ZXdheS5zaHV0ZG93bihTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkLCAnUmVzaGFyZGVkIScsIGZhbHNlKVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBDb21wbGV0ZWQuYClcbiAgICAgICAgZ2F0ZXdheS5zaGFyZHMgPSBuZXcgTWFwKGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMpXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuY2xlYXIoKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgY2FsY3VsYXRlVG90YWxTaGFyZHMoKSB7XG4gICAgICAvLyBCb3RzIHVuZGVyIDEwMGsgc2VydmVycyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gTEJTLlxuICAgICAgaWYgKGdhdGV3YXkudG90YWxTaGFyZHMgPCAxMDApIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBDYWxjdWxhdGluZyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICByZXR1cm4gZ2F0ZXdheS50b3RhbFNoYXJkc1xuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkc2AsIGdhdGV3YXkudG90YWxTaGFyZHMsIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIC8vIENhbGN1bGF0ZSBhIG11bHRpcGxlIG9mIGBtYXhDb25jdXJyZW5jeWAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZ2F0ZXdheS5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICBnYXRld2F5LnRvdGFsU2hhcmRzIC9cbiAgICAgICAgICAgIC8vIElmIGBtYXhDb25jdXJyZW5jeWAgaXMgMSwgd2UgY2FuIHNhZmVseSB1c2UgMTYgdG8gZ2V0IGB0b3RhbFNoYXJkc2AgdG8gYmUgaW4gYSBtdWx0aXBsZSBvZiAxNiBzbyB0aGF0IHdlIGNhbiBwcmVwYXJlIGJvdHMgd2l0aCAxMDBrIHNlcnZlcnMgZm9yIExCUy5cbiAgICAgICAgICAgIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSksXG4gICAgICAgICkgKiAoZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5ID09PSAxID8gMTYgOiBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG4gICAgICApXG4gICAgfSxcbiAgICBjYWxjdWxhdGVXb3JrZXJJZChzaGFyZElkKSB7XG4gICAgICBjb25zdCB3b3JrZXJJZCA9IG9wdGlvbnMuc3ByZWFkU2hhcmRzSW5Sb3VuZFJvYmluXG4gICAgICAgID8gc2hhcmRJZCAlIGdhdGV3YXkudG90YWxXb3JrZXJzXG4gICAgICAgIDogTWF0aC5taW4oTWF0aC5mbG9vcihzaGFyZElkIC8gZ2F0ZXdheS5zaGFyZHNQZXJXb3JrZXIpLCBnYXRld2F5LnRvdGFsV29ya2VycyAtIDEpXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFtHYXRld2F5XSBDYWxjdWxhdGluZyB3b3JrZXJJZDogU2hhcmQ6ICR7c2hhcmRJZH0gLT4gV29ya2VyOiAke3dvcmtlcklkfSAtPiBQZXIgV29ya2VyOiAke2dhdGV3YXkuc2hhcmRzUGVyV29ya2VyfSAtPiBUb3RhbDogJHtnYXRld2F5LnRvdGFsV29ya2Vyc31gLFxuICAgICAgKVxuICAgICAgcmV0dXJuIHdvcmtlcklkXG4gICAgfSxcbiAgICBwcmVwYXJlQnVja2V0cygpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5OyArK2kpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3IgY29uY3VycmVuY3k6ICR7aX1gKVxuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuc2V0KGksIHtcbiAgICAgICAgICB3b3JrZXJzOiBbXSxcbiAgICAgICAgICBsZWFreUJ1Y2tldDogbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogMSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiBnYXRld2F5LnNwYXduU2hhcmREZWxheSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIE9yZ2FuaXplIGFsbCBzaGFyZHMgaW50byB0aGVpciBvd24gYnVja2V0c1xuICAgICAgZm9yIChsZXQgc2hhcmRJZCA9IGdhdGV3YXkuZmlyc3RTaGFyZElkOyBzaGFyZElkIDw9IGdhdGV3YXkubGFzdFNoYXJkSWQ7ICsrc2hhcmRJZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBzaGFyZDogJHtzaGFyZElkfWApXG5cbiAgICAgICAgaWYgKHNoYXJkSWQgPj0gZ2F0ZXdheS50b3RhbFNoYXJkcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBpcyBiaWdnZXIgb3IgZXF1YWwgdG8gdGhlIHVzZWQgYW1vdW50IG9mIHVzZWQgc2hhcmRzIHdoaWNoIGlzICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVja2V0SWQgPSBzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoYnVja2V0SWQpXG5cbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBnb3QgYXNzaWduZWQgdG8gYW4gaWxsZWdhbCBidWNrZXQgaWQ6ICR7YnVja2V0SWR9LCBleHBlY3RlZCBhIGJ1Y2tldCBpZCBiZXR3ZWVuIDAgYW5kICR7XG4gICAgICAgICAgICAgIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSAtIDFcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgd29ya2VyIGlkIGZvciB0aGlzIHNoYXJkXG4gICAgICAgIGNvbnN0IHdvcmtlcklkID0gZ2F0ZXdheS5jYWxjdWxhdGVXb3JrZXJJZChzaGFyZElkKVxuICAgICAgICBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LmlkID09PSB3b3JrZXJJZClcblxuICAgICAgICAvLyBJZiB0aGlzIHdvcmtlciBhbHJlYWR5IGV4aXN0cywgYWRkIHRoZSBzaGFyZCB0byBpdHMgcXVldWVcbiAgICAgICAgaWYgKHdvcmtlcikge1xuICAgICAgICAgIHdvcmtlci5xdWV1ZS5wdXNoKHNoYXJkSWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVja2V0LndvcmtlcnMucHVzaCh7IGlkOiB3b3JrZXJJZCwgcXVldWU6IFtzaGFyZElkXSB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzcGF3blNoYXJkcygpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIGNvbmN1cnJlbmN5IGJ1Y2tldHNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKVxuXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFsuLi5nYXRld2F5LmJ1Y2tldHMuZW50cmllcygpXS5tYXAoYXN5bmMgKFtidWNrZXRJZCwgYnVja2V0XSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiBidWNrZXQud29ya2Vycykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkudGVsbFdvcmtlclRvSWRlbnRpZnkod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIFdlIHVzZSBQcm9taXNlLmFsbCBzbyB3ZSBjYW4gc3RhcnQgYWxsIGJ1Y2tldHMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgICAgIC8vIENoZWNrIGFuZCByZXNoYXJkIGF1dG9tYXRpY2FsbHkgaWYgYXV0byByZXNoYXJkaW5nIGlzIGVuYWJsZWQuXG4gICAgICBpZiAoZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQgJiYgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWwgIT09IC0xKSB7XG4gICAgICAgIC8vIEl0IGlzIGJldHRlciB0byBlbnN1cmUgdGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZClcblxuICAgICAgICBpZiAoIWdhdGV3YXkucmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbykge1xuICAgICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci53YXJuKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgd2FzIG5vdCBwcm92aWRlZC4gRGlzYWJsaW5nIHJlc2hhcmRpbmcuXCIpXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzaGFyZGluZ0luZm8gPSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCgpXG5cbiAgICAgICAgICBpZiAocmVzaGFyZGluZ0luZm8ubmVlZGVkICYmIHJlc2hhcmRpbmdJbmZvLmluZm8pIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5yZXNoYXJkKHJlc2hhcmRpbmdJbmZvLmluZm8pXG4gICAgICAgIH0sIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsKVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2h1dGRvd24oY29kZSwgcmVhc29uLCBjbGVhclJlc2hhcmRpbmdJbnRlcnZhbCA9IHRydWUpIHtcbiAgICAgIGlmIChjbGVhclJlc2hhcmRpbmdJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbElkKVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKS5tYXAoKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKSlcbiAgICB9LFxuICAgIGFzeW5jIHNlbmRQYXlsb2FkKHNoYXJkSWQsIHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gZ2F0ZXdheS5zaGFyZHMuZ2V0KHNoYXJkSWQpXG5cbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZCAoaWQ6ICR7c2hhcmRJZH0gbm90IGZvdW5kYClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuc2VuZChwYXlsb2FkKVxuICAgIH0sXG4gICAgYXN5bmMgdGVsbFdvcmtlclRvSWRlbnRpZnkod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFRlbGwgd29ya2VyICMke3dvcmtlcklkfSB0byBpZGVudGlmeSBzaGFyZCAjJHtzaGFyZElkfSBmcm9tIGJ1Y2tldCAke2J1Y2tldElkfWApXG4gICAgICBhd2FpdCBnYXRld2F5LmlkZW50aWZ5KHNoYXJkSWQpXG4gICAgfSxcbiAgICBhc3luYyBpZGVudGlmeShzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGxldCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKVxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBJZGVudGlmeWluZyAke3NoYXJkID8gJ2V4aXN0aW5nJyA6ICduZXcnfSBzaGFyZCAoJHtzaGFyZElkfSlgKVxuXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHNoYXJkID0gbmV3IFNoYXJkKHtcbiAgICAgICAgICBpZDogc2hhcmRJZCxcbiAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICBjb21wcmVzczogdGhpcy5jb21wcmVzcyxcbiAgICAgICAgICAgIHRyYW5zcG9ydENvbXByZXNzaW9uOiBnYXRld2F5LnRyYW5zcG9ydENvbXByZXNzaW9uLFxuICAgICAgICAgICAgaW50ZW50czogdGhpcy5pbnRlbnRzLFxuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdG9rZW46IHRoaXMudG9rZW4sXG4gICAgICAgICAgICB0b3RhbFNoYXJkczogdGhpcy50b3RhbFNoYXJkcyxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IG9wdGlvbnMuZXZlbnRzID8/IHt9LFxuICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgcmVxdWVzdElkZW50aWZ5OiBhc3luYyAoKSA9PiBhd2FpdCBnYXRld2F5LnJlcXVlc3RJZGVudGlmeShzaGFyZElkKSxcbiAgICAgICAgICBtYWtlUHJlc2VuY2U6IGdhdGV3YXkubWFrZVByZXNlbmNlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLnByZWZlclNuYWtlQ2FzZSkge1xuICAgICAgICAgIHNoYXJkLmZvcndhcmRUb0JvdCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBzaGFyZCEuZXZlbnRzLm1lc3NhZ2U/LihzaGFyZCEsIHBheWxvYWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBzaGFyZC5pZGVudGlmeSgpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RJZGVudGlmeShzaGFyZElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHJlcXVlc3RlZCBhbiBpZGVudGlmeS5gKVxuXG4gICAgICBjb25zdCBidWNrZXQgPSBnYXRld2F5LmJ1Y2tldHMuZ2V0KHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG5cbiAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlcXVlc3QgaWRlbnRpZnkgZm9yIGEgc2hhcmQgdGhhdCBpcyBub3QgYXNzaWduZWQgdG8gYW55IGJ1Y2tldC5cIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYnVja2V0LmxlYWt5QnVja2V0LmFjcXVpcmUoKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEFwcHJvdmVkIGlkZW50aWZ5IHJlcXVlc3QgZm9yIFNoYXJkICMke3NoYXJkSWR9LmApXG4gICAgfSxcblxuICAgIGFzeW5jIGtpbGwoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKVxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHdhcyByZXF1ZXN0ZWQgdG8gYmUga2lsbGVkLCBidXQgdGhlIHNoYXJkIGNvdWxkIG5vdCBiZSBmb3VuZC5gKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBLaWxsaW5nIFNoYXJkICMke3NoYXJkSWR9YClcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKVxuICAgICAgYXdhaXQgc2hhcmQuc2h1dGRvd24oKVxuICAgIH0sXG5cbiAgICAvLyBIZWxwZXJzIG1ldGhvZHMgYmVsb3cgdGhpc1xuXG4gICAgY2FsY3VsYXRlU2hhcmRJZChndWlsZElkLCB0b3RhbFNoYXJkcykge1xuICAgICAgLy8gSWYgbm9uZSBpcyBwcm92aWRlZCwgdXNlIHRoZSB0b3RhbCBzaGFyZHMgbnVtYmVyIGZyb20gZ2F0ZXdheSBvYmplY3QuXG4gICAgICBpZiAoIXRvdGFsU2hhcmRzKSB0b3RhbFNoYXJkcyA9IGdhdGV3YXkudG90YWxTaGFyZHNcbiAgICAgIC8vIElmIGl0IGlzIG9ubHkgMSBzaGFyZCwgaXQgd2lsbCBhbHdheXMgYmUgc2hhcmQgaWQgMFxuICAgICAgaWYgKHRvdGFsU2hhcmRzID09PSAxKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoMSBzaGFyZClgKVxuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGNhbGN1bGF0ZVNoYXJkSWQgKGd1aWxkSWQ6ICR7Z3VpbGRJZH0sIHRvdGFsU2hhcmRzOiAke3RvdGFsU2hhcmRzfSlgKVxuICAgICAgcmV0dXJuIE51bWJlcigoQmlnSW50KGd1aWxkSWQpID4+IDIybikgJSBCaWdJbnQodG90YWxTaGFyZHMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVm9pY2VDaGFubmVsKGd1aWxkSWQsIGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGpvaW5Wb2ljZUNoYW5uZWwgZ3VpbGRJZDogJHtndWlsZElkfSBjaGFubmVsSWQ6ICR7Y2hhbm5lbElkfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogY2hhbm5lbElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgc2VsZl9tdXRlOiBvcHRpb25zPy5zZWxmTXV0ZSA/PyBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IG9wdGlvbnM/LnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90U3RhdHVzKGRhdGEpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gZWRpdEJvdFN0YXR1cyBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25TYWZlUmVwbGFjZXIpfWApXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbLi4uZ2F0ZXdheS5zaGFyZHMudmFsdWVzKCldLm1hcChhc3luYyAoc2hhcmQpID0+IHtcbiAgICAgICAgICBnYXRld2F5LmVkaXRTaGFyZFN0YXR1cyhzaGFyZC5pZCwgZGF0YSlcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTaGFyZFN0YXR1cyhzaGFyZElkLCBkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRTaGFyZFN0YXR1cyBzaGFyZElkOiAke3NoYXJkSWR9IC0+IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5QcmVzZW5jZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHNpbmNlOiBudWxsLFxuICAgICAgICAgIGFmazogZmFsc2UsXG4gICAgICAgICAgYWN0aXZpdGllczogZGF0YS5hY3Rpdml0aWVzLFxuICAgICAgICAgIHN0YXR1czogZGF0YS5zdGF0dXMsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGlmIChnYXRld2F5LmludGVudHMgJiYgKCFvcHRpb25zPy5saW1pdCB8fCBvcHRpb25zLmxpbWl0ID4gMSkgJiYgIShnYXRld2F5LmludGVudHMgJiBHYXRld2F5SW50ZW50cy5HdWlsZE1lbWJlcnMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmZXRjaCBtb3JlIHRoZW4gMSBtZW1iZXIgd2l0aG91dCB0aGUgR1VJTERfTUVNQkVSUyBpbnRlbnQnKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuXG4gICAgICBpZiAob3B0aW9ucz8udXNlcklkcz8ubGVuZ3RoKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gcmVxdWVzdE1lbWJlcnMgZ3VpbGRJZDogJHtndWlsZElkfSAtPiBzZXR0aW5nIHVzZXIgbGltaXQgYmFzZWQgb24gdXNlcklkcyBsZW5ndGg6ICR7b3B0aW9ucy51c2VySWRzLmxlbmd0aH1gKVxuXG4gICAgICAgIG9wdGlvbnMubGltaXQgPSBvcHRpb25zLnVzZXJJZHMubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgbGV0IG5vbmNlID0gJydcblxuICAgICAgICB3aGlsZSAoIW5vbmNlIHx8IGdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMucGVuZGluZy5oYXMobm9uY2UpKSB7XG4gICAgICAgICAgbm9uY2UgPSByYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID8/PSB7IGxpbWl0OiAwIH1cbiAgICAgICAgb3B0aW9ucy5ub25jZSA9IG5vbmNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lbWJlcnMgPSAhZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBuZXcgUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gICAgICAgICAgICBpZiAoIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZCB8fCAhb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNhbid0IHJlcXVlc3QgdGhlIG1lbWJlcnMgd2l0aG91dCB0aGUgbm9uY2Ugb3Igd2l0aCB0aGUgZmVhdHVyZSBkaXNhYmxlZC5cIikpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuc2V0KG9wdGlvbnMubm9uY2UsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIG1lbWJlcnM6IFtdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlcXVlc3RHdWlsZE1lbWJlcnMsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIC8vIElmIGEgcXVlcnkgaXMgcHJvdmlkZWQgdXNlIGl0LCBPUiBpZiBhIGxpbWl0IGlzIE5PVCBwcm92aWRlZCB1c2UgXCJcIlxuICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zPy5xdWVyeSA/PyAob3B0aW9ucz8ubGltaXQgPyB1bmRlZmluZWQgOiAnJyksXG4gICAgICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0ID8/IDAsXG4gICAgICAgICAgcHJlc2VuY2VzOiBvcHRpb25zPy5wcmVzZW5jZXMgPz8gZmFsc2UsXG4gICAgICAgICAgdXNlcl9pZHM6IG9wdGlvbnM/LnVzZXJJZHM/Lm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICAgIG5vbmNlOiBvcHRpb25zPy5ub25jZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBhd2FpdCBtZW1iZXJzXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVm9pY2VDaGFubmVsKGd1aWxkSWQpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBsZWF2ZVZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IFNoYXJkICR7c2hhcmRJZH1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IG51bGwsXG4gICAgICAgICAgc2VsZl9tdXRlOiBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMoZ3VpbGRJZHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogRGlzY29yZCB3aWxsIHNlbmQgdGhlIGV2ZW50cyBmb3IgdGhlIGd1aWxkcyB0aGF0IGFyZSBcInVuZGVyIHRoZSBzaGFyZFwiIHRoYXQgc2VuZHMgdGhlIG9wY29kZS5cbiAgICAgICAqIEZvciB0aGlzIHJlYXNvbiB3ZSBuZWVkIHRvIGdyb3VwIHRoZSBpZHMgd2l0aCB0aGUgc2hhcmQgdGhlIGNhbGN1bGF0ZVNoYXJkSWQgbWV0aG9kIGdpdmVzXG4gICAgICAgKi9cblxuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIEJpZ1N0cmluZ1tdPigpXG5cbiAgICAgIGZvciAoY29uc3QgZ3VpbGRJZCBvZiBndWlsZElkcykge1xuICAgICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgICAgY29uc3QgaWRzID0gbWFwLmdldChzaGFyZElkKSA/PyBbXVxuICAgICAgICBtYXAuc2V0KHNoYXJkSWQsIGlkcylcblxuICAgICAgICBpZHMucHVzaChndWlsZElkKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLm1hcC5lbnRyaWVzKCldLm1hcCgoW3NoYXJkSWQsIGlkc10pID0+XG4gICAgICAgICAgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMsXG4gICAgICAgICAgICBkOiB7XG4gICAgICAgICAgICAgIGd1aWxkX2lkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIGdhdGV3YXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogSWQgb2YgdGhlIGZpcnN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGZpcnN0U2hhcmRJZD86IG51bWJlclxuICAvKipcbiAgICogSWQgb2YgdGhlIGxhc3QgU2hhcmQgd2hpY2ggc2hvdWxkIGdldCBjb250cm9sbGVkIGJ5IHRoaXMgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbGFzdFNoYXJkSWQ/OiBudW1iZXJcbiAgLyoqXG4gICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzcGF3bmluZyBuZXh0IHNoYXJkLiBPUFRJTUFMIElTIEFCT1ZFIDUxMDAuIFlPVSBET04nVCBXQU5UIFRPIEhJVCBUSEUgUkFURSBMSU1JVCEhIVxuICAgKiBAZGVmYXVsdCA1MzAwXG4gICAqL1xuICBzcGF3blNoYXJkRGVsYXk/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2VuZCB0aGUgZGlzY29yZCBwYWNrZXRzIGluIHNuYWtlIGNhc2UgZm9ybS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByZWZlclNuYWtlQ2FzZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRvdGFsIGFtb3VudCBvZiBzaGFyZHMgeW91ciBib3QgdXNlcy4gVXNlZnVsIGZvciB6ZXJvLWRvd250aW1lIHVwZGF0ZXMgb3IgcmVzaGFyZGluZy5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdG90YWxTaGFyZHM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2Ygc2hhcmRzIHRvIGxvYWQgcGVyIHdvcmtlci5cbiAgICogQGRlZmF1bHQgMjVcbiAgICovXG4gIHNoYXJkc1Blcldvcmtlcj86IG51bWJlclxuICAvKipcbiAgICogVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrZXJzIHRvIHVzZSBmb3IgeW91ciBib3QuXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIHRvdGFsV29ya2Vycz86IG51bWJlclxuICAvKipcbiAgICogV2hldGhlciB0byBzcHJlYWQgc2hhcmRzIGFjcm9zcyB3b3JrZXJzIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBCeSBkZWZhdWx0LCBzaGFyZHMgYXJlIGFzc2lnbmVkIHRvIHdvcmtlcnMgaW4gY29udGlndW91cyBibG9ja3MgYmFzZWQgb24gc2hhcmRzUGVyV29ya2VyLiBJZiBhbnkgc2hhcmQgaXMgbGVmdCBvdmVyLCBpdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBsYXN0IHdvcmtlci5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzIHdoaWxlIHNoYXJkc1BlcldvcmtlciBpcyAxMCwgdGhlIGZpcnN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMC05LCB0aGUgc2Vjb25kIHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMTAtMTksIGFuZCBzbyBvbiwgdGhlIGxhc3Qgd29ya2VyIHdpbGwgZ2V0IHNoYXJkcyAyMC0zOS5cbiAgICpcbiAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoZSBzaGFyZHMgd2lsbCBiZSBhc3NpZ25lZCBpbiBhIHJvdW5kLXJvYmluIG1hbm5lciB0byBzcHJlYWQgbW9yZSBldmVubHkgYWNyb3NzIHdvcmtlcnMuXG4gICAqIEZvciBleGFtcGxlLCB3aXRoIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzLCB0aGUgZmlyc3Qgc2hhcmQgd2lsbCBnbyB0byB3b3JrZXIgMCwgdGhlIHNlY29uZCBzaGFyZCB0byB3b3JrZXIgMSwgdGhlIHRoaXJkIHNoYXJkIHRvIHdvcmtlciAyLCB0aGUgZm91cnRoIHNoYXJkIHRvIHdvcmtlciAwLCBhbmQgc28gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4/OiBib29sZWFuXG4gIC8qKiBJbXBvcnRhbnQgZGF0YSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBtYW5hZ2VyIHRvIGNvbm5lY3Qgc2hhcmRzIHRvIHRoZSBnYXRld2F5LiAqL1xuICBjb25uZWN0aW9uPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+XG4gIC8qKiBXaGV0aGVyIGluY29taW5nIHBheWxvYWRzIGFyZSBjb21wcmVzc2VkIHVzaW5nIHpsaWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzcz86IGJvb2xlYW5cbiAgLyoqIFdoYXQgdHJhbnNwb3J0IGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkICovXG4gIHRyYW5zcG9ydENvbXByZXNzaW9uPzogVHJhbnNwb3J0Q29tcHJlc3Npb24gfCBudWxsXG4gIC8qKiBUaGUgY2FsY3VsYXRlZCBpbnRlbnQgdmFsdWUgb2YgdGhlIGV2ZW50cyB3aGljaCB0aGUgc2hhcmQgc2hvdWxkIHJlY2VpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGludGVudHM/OiBudW1iZXJcbiAgLyoqIElkZW50aWZ5IHByb3BlcnRpZXMgdG8gdXNlICovXG4gIHByb3BlcnRpZXM/OiB7XG4gICAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gdGhlIHNoYXJkIHJ1bnMgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImRhcndpblwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCJcbiAgICAgKi9cbiAgICBvczogc3RyaW5nXG4gICAgLyoqIFRoZSBcImJyb3dzZXJcIiB3aGVyZSB0aGlzIHNoYXJkIGlzIHJ1bm5pbmcgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGJyb3dzZXI6IHN0cmluZ1xuICAgIC8qKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHRoZSBzaGFyZCBpcyBydW5uaW5nLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBkZXZpY2U6IHN0cmluZ1xuICB9XG4gIC8qKiBCb3QgdG9rZW4gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQgKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKiogVGhlIFVSTCBvZiB0aGUgZ2F0ZXdheSB3aGljaCBzaG91bGQgYmUgY29ubmVjdGVkIHRvLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIndzczovL2dhdGV3YXkuZGlzY29yZC5nZ1wiXG4gICAqL1xuICB1cmw/OiBzdHJpbmdcbiAgLyoqIFRoZSBnYXRld2F5IHZlcnNpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uPzogbnVtYmVyXG4gIC8qKiBUaGUgZXZlbnRzIGhhbmRsZXJzICovXG4gIGV2ZW50cz86IFNoYXJkRXZlbnRzXG4gIC8qKiBUaGlzIG1hbmFnZXJzIGNhY2hlIHJlbGF0ZWQgc2V0dGluZ3MuICovXG4gIGNhY2hlPzoge1xuICAgIHJlcXVlc3RNZW1iZXJzPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIG9yIG5vdCByZXF1ZXN0IG1lbWJlciByZXF1ZXN0cyBzaG91bGQgYmUgY2FjaGVkLlxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgdGhhdCB0aGUgZ2F0ZXdheSBtYW5hZ2VyIHdpbGwgdXNlLlxuICAgKiBAZGVmYXVsdCBsb2dnZXIgLy8gVGhlIGxvZ2dlciBleHBvcnRlZCBieSBgQGRpc2NvcmRlbm8vdXRpbHNgXG4gICAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqXG4gICAqIE1ha2UgdGhlIHByZXNlbmNlIGZvciB3aGVuIHRoZSBib3QgY29ubmVjdHMgdG8gdGhlIGdhdGV3YXlcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBTaGFyZCBpcyBnb2luZyB0byBpZGVudGlmeVxuICAgKi9cbiAgbWFrZVByZXNlbmNlPzogKCkgPT4gUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+XG4gIC8qKiBPcHRpb25zIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZz86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBhdXRvbWF0ZWQgcmVzaGFyZGluZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSAlIG9mIGhvdyBmdWxsIGEgc2hhcmQgaXMgd2hlbiByZXNoYXJkaW5nIHNob3VsZCBiZSB0cmlnZ2VyZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFdlIHVzZSBkaXNjb3JkIHJlY29tbWVuZGVkIHNoYXJkIHZhbHVlIHRvIGdldCBhbiAqKmFwcHJveGltYXRpb24qKiBvZiB0aGUgc2hhcmQgZnVsbCBwZXJjZW50YWdlIHRvIGNvbXBhcmUgd2l0aCB0aGlzIHZhbHVlIHNvIHRoZSBib3QgbWF5IG5vdCByZXNoYXJkIGF0IHRoZSBleGFjdCBwZXJjZW50YWdlIHByb3ZpZGVkIGJ1dCBtYXkgcmVzaGFyZCB3aGVuIGl0IGlzIGEgYml0IGhpZ2hlciB0aGFuIHRoZSBwcm92aWRlZCBwZXJjZW50YWdlLlxuICAgICAqIEZvciBhY2N1cmF0ZSBjYWxjdWxhdGlvbiwgeW91IG1heSBvdmVycmlkZSB0aGUgYGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWRgIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCA4MCBhcyBpbiA4MCVcbiAgICAgKi9cbiAgICBzaGFyZHNGdWxsUGVyY2VudGFnZTogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcywgb2YgaG93IG9mdGVuIHRvIGNoZWNrIHdoZXRoZXIgcmVzaGFyZGluZyBpcyBuZWVkZWQgYW5kIHJlc2hhcmQgYXV0b21hdGljYWxseS4gU2V0IHRvIC0xIHRvIGRpc2FibGUgYXV0byByZXNoYXJkaW5nLlxuICAgICAqIEBkZWZhdWx0IDI4ODAwMDAwICg4IGhvdXJzKVxuICAgICAqL1xuICAgIGNoZWNrSW50ZXJ2YWw6IG51bWJlclxuICAgIC8qKiBIYW5kbGVyIHRvIGdldCBzaGFyZCBjb3VudCBhbmQgb3RoZXIgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIGdldFNlc3Npb25JbmZvPzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4+XG4gICAgLyoqIEhhbmRsZXIgdG8gZWRpdCB0aGUgc2hhcmQgaWQgb24gYW55IGNhY2hlZCBndWlsZHMuICovXG4gICAgdXBkYXRlR3VpbGRzU2hhcmRJZD86IChndWlsZElkczogc3RyaW5nW10sIHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+XG4gICAgICAvKiogVGhlIGJ1Y2tldCB0byBxdWV1ZSB0aGUgaWRlbnRpZmllcy4gKi9cbiAgICAgIGxlYWt5QnVja2V0OiBMZWFreUJ1Y2tldFxuICAgIH1cbiAgPlxuICAvKiogVGhlIHNoYXJkcyB0aGF0IGFyZSBjcmVhdGVkLiAqL1xuICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPlxuICAvKiogVGhlIGxvZ2dlciBmb3IgdGhlIGdhdGV3YXkgbWFuYWdlci4gKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIEV2ZXJ5dGhpbmcgcmVsYXRlZCB0byByZXNoYXJkaW5nLiAqL1xuICByZXNoYXJkaW5nOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnNbJ3Jlc2hhcmRpbmcnXSAmIHtcbiAgICAvKiogVGhlIGludGVydmFsIGlkIG9mIHRoZSBjaGVjayBpbnRlcnZhbC4gVGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcnZhbCB3aGVuIHRoZSBtYW5hZ2VyIGlzIHNodXRkb3duLiAqL1xuICAgIGNoZWNrSW50ZXJ2YWxJZD86IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkXG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNoZWNrIGlmIHJlc2hhcmRpbmcgaXMgbmVjZXNzYXJ5LiAqL1xuICAgIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQ6ICgpID0+IFByb21pc2U8eyBuZWVkZWQ6IGJvb2xlYW47IGluZm8/OiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gfT5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGJlZ2luIHJlc2hhcmRpbmcuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNvbHZlIG9uY2UgdGhlIHJlc2hhcmRpbmcgaXMgZG9uZS5cbiAgICAgKiBTbyB3aGVuIGFsbCB0aGUgY2FsbHMgdG8ge0BsaW5rIHRlbGxXb3JrZXJUb1ByZXBhcmV9IGFuZCB7QGxpbmsgb25SZXNoYXJkaW5nU3dpdGNofSBhcmUgZG9uZS5cbiAgICAgKi9cbiAgICByZXNoYXJkOiAoaW5mbzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+ICYgeyBmaXJzdFNoYXJkSWQ/OiBudW1iZXI7IGxhc3RTaGFyZElkPzogbnVtYmVyIH0pID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgaXQgbmVlZHMgdG8gc3Bhd24gYSBuZXcgc2hhcmQgYW5kIGlkZW50aWZ5IGl0IGZvciB0aGUgcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoYW5kbGVyIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUge0BsaW5rIHRlbGxXb3JrZXJUb0lkZW50aWZ5fSBoYW5kbGVyLlxuICAgICAqIFNvIHlvdSBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICB0ZWxsV29ya2VyVG9QcmVwYXJlOiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGNhbGxlZCB3aGVuIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHByZXBhcmluZyBmb3IgdGhlIHJlc2hhcmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIHNob3VsZCBtYWtlIHRoZSBuZXcgcmVzaGFyZGVkIHNoYXJkcyBiZWNvbWUgdGhlIGFjdGl2ZSBvbmVzIGFuZCBzaHV0ZG93biB0aGUgb2xkIG9uZXNcbiAgICAgKi9cbiAgICBvblJlc2hhcmRpbmdTd2l0Y2g6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgfVxuICAvKiogRGV0ZXJtaW5lIG1heCBudW1iZXIgb2Ygc2hhcmRzIHRvIHVzZSBiYXNlZCB1cG9uIHRoZSBtYXggY29uY3VycmVuY3kuICovXG4gIGNhbGN1bGF0ZVRvdGFsU2hhcmRzOiAoKSA9PiBudW1iZXJcbiAgLyoqIERldGVybWluZSB0aGUgaWQgb2YgdGhlIHdvcmtlciB3aGljaCBpcyBoYW5kbGluZyBhIHNoYXJkLiAqL1xuICBjYWxjdWxhdGVXb3JrZXJJZDogKHNoYXJkSWQ6IG51bWJlcikgPT4gbnVtYmVyXG4gIC8qKiBQcmVwYXJlcyBhbGwgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBpZGVudGlmeWluZyB0aGUgc2hhcmRzLiAqL1xuICBwcmVwYXJlQnVja2V0czogKCkgPT4gdm9pZFxuICAvKiogU3RhcnQgaWRlbnRpZnlpbmcgYWxsIHRoZSBzaGFyZHMuICovXG4gIHNwYXduU2hhcmRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBTaHV0ZG93biBhbGwgc2hhcmRzLiAqL1xuICBzaHV0ZG93bjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcsIGNsZWFyUmVzaGFyZGluZ0ludGVydmFsPzogYm9vbGVhbikgPT4gUHJvbWlzZTx2b2lkPlxuICBzZW5kUGF5bG9hZDogKHNoYXJkSWQ6IG51bWJlciwgcGF5bG9hZDogU2hhcmRTb2NrZXRSZXF1ZXN0KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gaG9vayBpbiBhbmQgY2hhbmdlIHRvIGNvbW11bmljYXRlIHRvIGRpZmZlcmVudCB3b3JrZXJzIGFjcm9zcyBkaWZmZXJlbnQgc2VydmVycyBvciBhbnl0aGluZyB0aGV5IGxpa2UuXG4gICAqIEZvciBleGFtcGxlIHVzaW5nIHJlZGlzIHB1YnN1YiB0byB0YWxrIHRvIG90aGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgc2hvdWxkIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gaGF2ZSBpZGVudGlmaWVkIHRoZSBzaGFyZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAqL1xuICB0ZWxsV29ya2VyVG9JZGVudGlmeTogKHdvcmtlcklkOiBudW1iZXIsIHNoYXJkSWQ6IG51bWJlciwgYnVja2V0SWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGVsbCB0aGUgbWFuYWdlciB0byBpZGVudGlmeSBhIFNoYXJkLiBJZiB0aGlzIFNoYXJkIGlzIG5vdCBhbHJlYWR5IG1hbmFnZWQgdGhpcyB3aWxsIGFsc28gYWRkIHRoZSBTaGFyZCB0byB0aGUgbWFuYWdlci4gKi9cbiAgaWRlbnRpZnk6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEtpbGwgYSBzaGFyZC4gQ2xvc2UgYSBzaGFyZHMgY29ubmVjdGlvbiB0byBEaXNjb3JkJ3MgZ2F0ZXdheSAoaWYgYW55KSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIG1hbmFnZXIuICovXG4gIGtpbGw6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWNrZXQgaXMgYWxsb3dlZCB0byBtYWtlIHRoZSBuZXh0IGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHNoYXJkcyBiYXNlZCBvbiB0aGUgZ3VpbGQgaWQgYW5kIHRvdGFsIHNoYXJkcy4gKi9cbiAgY2FsY3VsYXRlU2hhcmRJZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdG90YWxTaGFyZHM/OiBudW1iZXIpID0+IG51bWJlclxuICAvKipcbiAgICogQ29ubmVjdHMgdGhlIGJvdCB1c2VyIHRvIGEgdm9pY2Ugb3Igc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB5b3Ugd2FudCB0byBqb2luLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENPTk5FQ1RgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1ZvaWNlIFN0YXRlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgam9pblZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBBdExlYXN0T25lPE9taXQ8VXBkYXRlVm9pY2VTdGF0ZSwgJ2d1aWxkSWQnIHwgJ2NoYW5uZWxJZCc+PikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIGJvdCBzdGF0dXMgaW4gYWxsIHNoYXJkcyB0aGF0IHRoaXMgZ2F0ZXdheSBtYW5hZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RhdHVzIGRhdGEgdG8gc2V0IHRoZSBib3RzIHN0YXR1cyB0by5cbiAgICogQHJldHVybnMgbm90aGluZ1xuICAgKi9cbiAgZWRpdEJvdFN0YXR1czogKGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIGJvdCdzIHN0YXR1cyBvbiBvbmUgc2hhcmQuXG4gICAqXG4gICAqIEBwYXJhbSBzaGFyZElkIFRoZSBzaGFyZCBpZCB0byBlZGl0IHRoZSBzdGF0dXMgZm9yLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RhdHVzIGRhdGEgdG8gc2V0IHRoZSBib3RzIHN0YXR1cyB0by5cbiAgICogQHJldHVybnMgbm90aGluZ1xuICAgKi9cbiAgZWRpdFNoYXJkU3RhdHVzOiAoc2hhcmRJZDogbnVtYmVyLCBkYXRhOiBEaXNjb3JkVXBkYXRlUHJlc2VuY2UpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZCBvdmVyIHRoZSBnYXRld2F5LiBJZiBgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkYCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGFuZCB5b3UnbGwgaGF2ZSB0byBoYW5kbGUgdGhlIGBHVUlMRF9NRU1CRVJTX0NIVU5LYCBldmVudHMgeW91cnNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgcmVxdWVzdGluZyB0aGUgZW50aXJlIG1lbWJlciBsaXN0OlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIHByZXNlbmNlcyAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMucHJlc2VuY2VzIHwgcHJlc2VuY2VzfSBzZXQgdG8gYHRydWVgKTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYEdVSUxEX1BSRVNFTkNFU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgcHJlZml4ICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5xdWVyeSB8IHF1ZXJ5fSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgdXNlcnMgYnkgSUQgKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnVzZXJJZHMgfCB1c2VySWRzfSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXJzIENodW5rXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSAxMDAwIG1lbWJlcnMgZmV0Y2hlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVxdWVzdC1ndWlsZC1tZW1iZXJzfVxuICAgKi9cbiAgcmVxdWVzdE1lbWJlcnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBPbWl0PFJlcXVlc3RHdWlsZE1lbWJlcnMsICdndWlsZElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAvKipcbiAgICogTGVhdmVzIHRoZSB2b2ljZSBjaGFubmVsIHRoZSBib3QgdXNlciBpcyBjdXJyZW50bHkgaW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIF9VcGRhdGUgVm9pY2UgU3RhdGVfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIHZvaWNlIGNoYW5uZWwgdG8gbGVhdmUgaXMgaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX1ZvaWNlIFN0YXRlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgbGVhdmVWb2ljZUNoYW5uZWw6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVxdWVzdCBzb3VuZGJvYXJkIHNvdW5kcyBmb3IgYSBsaXN0IG9mIGd1aWxkcy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyBtdWx0aXBsZSAoc2VlIHJlbWFya3MpIF9SZXF1ZXN0IFNvdW5kYm9hcmQgU291bmRzXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWRzIC0gVGhlIGd1aWxkcyB0byBnZXQgdGhlIHNvdW5kcyBmcm9tXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX1NvdW5kYm9hcmQgU291bmRzXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiDimqDvuI8gRGlzY29yZCB3aWxsIHNlbmQgdGhlIF9Tb3VuZGJvYXJkIFNvdW5kc18gZm9yIGVhY2ggb2YgdGhlIGd1aWxkIGlkc1xuICAgKiBob3dldmVyIHlvdSBtYXkgbm90IHJlY2VpdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGV2ZW50cyBhcyB0aGUgaWRzIHBhc3NlZCB0byBfUmVxdWVzdCBTb3VuZGJvYXJkIFNvdW5kc18gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XG4gICAqIC0gVGhlIGJvdCBpcyBub3QgaW4gdGhlIHNlcnZlciBwcm92aWRlZFxuICAgKiAtIFRoZSBzaGFyZCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBzZW50IGZyb20gZG9lcyBub3QgcmVjZWl2ZSBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZ3VpbGRcbiAgICpcbiAgICogVG8gYXZvaWQgdGhpcyBEaXNjb3JkZW5vIHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gZ3JvdXAgdGhlIGlkcyBiYXNlZCBvbiB3aGF0IHNoYXJkIHRoZXkgd2lsbCBuZWVkIHRvIGJlIHNlbnQsIGJ1dCB0aGlzIGludm9sdmVzIHNlbmRpbmcgbXVsdGlwbGUgbWVzc2FnZXMgaW4gbXVsdGlwbGUgc2hhcmRzXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5LWV2ZW50cyNyZXF1ZXN0LXNvdW5kYm9hcmQtc291bmRzfVxuICAgKi9cbiAgcmVxdWVzdFNvdW5kYm9hcmRTb3VuZHM6IChndWlsZElkczogQmlnU3RyaW5nW10pID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoaXMgbWFuYWdlcnMgY2FjaGUgcmVsYXRlZCBzZXR0aW5ncy4gKi9cbiAgY2FjaGU6IHtcbiAgICByZXF1ZXN0TWVtYmVyczoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIG9yIG5vdCByZXF1ZXN0IG1lbWJlciByZXF1ZXN0cyBzaG91bGQgYmUgY2FjaGVkLlxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZDogYm9vbGVhblxuICAgICAgLyoqIFRoZSBwZW5kaW5nIHJlcXVlc3RzLiAqL1xuICAgICAgcGVuZGluZzogQ29sbGVjdGlvbjxzdHJpbmcsIFJlcXVlc3RNZW1iZXJSZXF1ZXN0PlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RNZW1iZXJSZXF1ZXN0IHtcbiAgLyoqIFRoZSB1bmlxdWUgbm9uY2UgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbm9uY2U6IHN0cmluZ1xuICAvKiogVGhlIHJlc29sdmVyIGhhbmRsZXIgdG8gcnVuIHdoZW4gYWxsIG1lbWJlcnMgYXJyaXZlLiAqL1xuICByZXNvbHZlOiAodmFsdWU6IENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPiB8IFByb21pc2VMaWtlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPj4pID0+IHZvaWRcbiAgLyoqIFRoZSBtZW1iZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGFycml2ZWQgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbWVtYmVyczogRGlzY29yZE1lbWJlcldpdGhVc2VyW11cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVHYXRld2F5TWFuYWdlciIsIm9wdGlvbnMiLCJjb25uZWN0aW9uT3B0aW9ucyIsImNvbm5lY3Rpb24iLCJ1cmwiLCJzaGFyZHMiLCJzZXNzaW9uU3RhcnRMaW1pdCIsIm1heENvbmN1cnJlbmN5IiwicmVtYWluaW5nIiwidG90YWwiLCJyZXNldEFmdGVyIiwiZ2F0ZXdheSIsImV2ZW50cyIsImNvbXByZXNzIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJpbnRlbnRzIiwicHJvcGVydGllcyIsIm9zIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYnJvd3NlciIsImRldmljZSIsInRva2VuIiwidmVyc2lvbiIsInRvdGFsU2hhcmRzIiwibGFzdFNoYXJkSWQiLCJmaXJzdFNoYXJkSWQiLCJ0b3RhbFdvcmtlcnMiLCJzaGFyZHNQZXJXb3JrZXIiLCJzcGF3blNoYXJkRGVsYXkiLCJzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4iLCJwcmVmZXJTbmFrZUNhc2UiLCJNYXAiLCJidWNrZXRzIiwiY2FjaGUiLCJyZXF1ZXN0TWVtYmVycyIsImVuYWJsZWQiLCJwZW5kaW5nIiwiQ29sbGVjdGlvbiIsImxvZ2dlciIsIm1ha2VQcmVzZW5jZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidW5kZWZpbmVkIiwicmVzaGFyZGluZyIsInNoYXJkc0Z1bGxQZXJjZW50YWdlIiwiY2hlY2tJbnRlcnZhbCIsImdldFNlc3Npb25JbmZvIiwidXBkYXRlR3VpbGRzU2hhcmRJZCIsImNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQiLCJkZWJ1ZyIsIm5lZWRlZCIsIkVycm9yIiwic2Vzc2lvbkluZm8iLCJKU09OIiwic3RyaW5naWZ5IiwiaW5mbyIsInBlcmNlbnRhZ2UiLCJyZXNoYXJkIiwiY2FsY3VsYXRlVG90YWxTaGFyZHMiLCJjbGVhciIsInByZXBhcmVCdWNrZXRzIiwicHJvbWlzZXMiLCJBcnJheSIsImZyb20iLCJlbnRyaWVzIiwibWFwIiwiYnVja2V0SWQiLCJidWNrZXQiLCJ3b3JrZXIiLCJ3b3JrZXJzIiwic2hhcmRJZCIsInF1ZXVlIiwidGVsbFdvcmtlclRvUHJlcGFyZSIsImlkIiwiYWxsIiwib25SZXNoYXJkaW5nU3dpdGNoIiwid29ya2VySWQiLCJzaGFyZCIsIlNoYXJkIiwibWVzc2FnZSIsIl9zaGFyZCIsInBheWxvYWQiLCJ0IiwiZCIsImd1aWxkcyIsImciLCJyZXF1ZXN0SWRlbnRpZnkiLCJmb3J3YXJkVG9Cb3QiLCJzZXQiLCJpZGVudGlmeSIsInZhbHVlcyIsIm9sZEhhbmRsZXIiLCJfIiwic2h1dGRvd24iLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJSZXNoYXJkZWQiLCJNYXRoIiwiY2VpbCIsImNhbGN1bGF0ZVdvcmtlcklkIiwibWluIiwiZmxvb3IiLCJpIiwibGVha3lCdWNrZXQiLCJMZWFreUJ1Y2tldCIsIm1heCIsInJlZmlsbEFtb3VudCIsInJlZmlsbEludGVydmFsIiwiZ2V0IiwiZmluZCIsInciLCJwdXNoIiwic3Bhd25TaGFyZHMiLCJ0ZWxsV29ya2VyVG9JZGVudGlmeSIsImNsZWFySW50ZXJ2YWwiLCJjaGVja0ludGVydmFsSWQiLCJ3YXJuIiwic2V0SW50ZXJ2YWwiLCJyZXNoYXJkaW5nSW5mbyIsImNvZGUiLCJyZWFzb24iLCJjbGVhclJlc2hhcmRpbmdJbnRlcnZhbCIsImNsb3NlIiwic2VuZFBheWxvYWQiLCJzZW5kIiwiYWNxdWlyZSIsImtpbGwiLCJkZWxldGUiLCJjYWxjdWxhdGVTaGFyZElkIiwiZ3VpbGRJZCIsIk51bWJlciIsIkJpZ0ludCIsImpvaW5Wb2ljZUNoYW5uZWwiLCJjaGFubmVsSWQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiVm9pY2VTdGF0ZVVwZGF0ZSIsImd1aWxkX2lkIiwidG9TdHJpbmciLCJjaGFubmVsX2lkIiwic2VsZl9tdXRlIiwic2VsZk11dGUiLCJzZWxmX2RlYWYiLCJzZWxmRGVhZiIsImVkaXRCb3RTdGF0dXMiLCJkYXRhIiwianNvblNhZmVSZXBsYWNlciIsImVkaXRTaGFyZFN0YXR1cyIsIlByZXNlbmNlVXBkYXRlIiwic2luY2UiLCJhZmsiLCJhY3Rpdml0aWVzIiwic3RhdHVzIiwibGltaXQiLCJHYXRld2F5SW50ZW50cyIsIkd1aWxkTWVtYmVycyIsInVzZXJJZHMiLCJsZW5ndGgiLCJub25jZSIsImhhcyIsInJhbmRvbUJ5dGVzIiwibWVtYmVycyIsInJlamVjdCIsIlJlcXVlc3RHdWlsZE1lbWJlcnMiLCJxdWVyeSIsInByZXNlbmNlcyIsInVzZXJfaWRzIiwibGVhdmVWb2ljZUNoYW5uZWwiLCJyZXF1ZXN0U291bmRib2FyZFNvdW5kcyIsImd1aWxkSWRzIiwiaWRzIiwiUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZF9pZHMiXSwibWFwcGluZ3MiOiI7Ozs7K0JBaUJnQkE7OztlQUFBQTs7OzRCQWpCWTt1QkFZckI7dUJBQzJEOzhEQUNoRDt3QkFDaUg7Ozs7OztBQUU1SCxTQUFTQSxxQkFBcUJDLE9BQW9DO0lBQ3ZFLE1BQU1DLG9CQUFvQkQsUUFBUUUsVUFBVSxJQUFJO1FBQzlDQyxLQUFLO1FBQ0xDLFFBQVE7UUFDUkMsbUJBQW1CO1lBQ2pCQyxnQkFBZ0I7WUFDaEJDLFdBQVc7WUFDWEMsT0FBTztZQUNQQyxZQUFZLE9BQU8sS0FBSyxLQUFLO1FBQy9CO0lBQ0Y7SUFFQSxNQUFNQyxVQUEwQjtRQUM5QkMsUUFBUVgsUUFBUVcsTUFBTSxJQUFJLENBQUM7UUFDM0JDLFVBQVVaLFFBQVFZLFFBQVEsSUFBSTtRQUM5QkMsc0JBQXNCYixRQUFRYSxvQkFBb0IsSUFBSTtRQUN0REMsU0FBU2QsUUFBUWMsT0FBTyxJQUFJO1FBQzVCQyxZQUFZO1lBQ1ZDLElBQUloQixRQUFRZSxVQUFVLEVBQUVDLE1BQU1DLFFBQVFDLFFBQVE7WUFDOUNDLFNBQVNuQixRQUFRZSxVQUFVLEVBQUVJLFdBQVc7WUFDeENDLFFBQVFwQixRQUFRZSxVQUFVLEVBQUVLLFVBQVU7UUFDeEM7UUFDQUMsT0FBT3JCLFFBQVFxQixL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
@@ -50,8 +50,7 @@ export function createGatewayManager(options) {
50
50
  enabled: options.resharding?.enabled ?? true,
51
51
  shardsFullPercentage: options.resharding?.shardsFullPercentage ?? 80,
52
52
  checkInterval: options.resharding?.checkInterval ?? 28800000,
53
- shards: new Collection(),
54
- pendingShards: new Collection(),
53
+ shards: new Map(),
55
54
  getSessionInfo: options.resharding?.getSessionInfo,
56
55
  updateGuildsShardId: options.resharding?.updateGuildsShardId,
57
56
  async checkIfReshardingIsNeeded () {
@@ -107,19 +106,23 @@ export function createGatewayManager(options) {
107
106
  if (typeof info.firstShardId === 'number') gateway.firstShardId = info.firstShardId;
108
107
  // Set last shard id if provided in info
109
108
  if (typeof info.lastShardId === 'number') gateway.lastShardId = info.lastShardId;
109
+ else gateway.lastShardId = gateway.totalShards - 1;
110
110
  gateway.logger.info(`[Resharding] Starting the reshard process. New total shards: ${gateway.totalShards}`);
111
111
  // Resetting buckets
112
112
  gateway.buckets.clear();
113
113
  // Refilling buckets with new values
114
114
  gateway.prepareBuckets();
115
- // SPREAD THIS OUT TO DIFFERENT WORKERS TO BEGIN STARTING UP
116
- gateway.buckets.forEach(async (bucket, bucketId)=>{
115
+ // Call all the buckets and tell their workers & shards to identify
116
+ const promises = Array.from(gateway.buckets.entries()).map(async ([bucketId, bucket])=>{
117
117
  for (const worker of bucket.workers){
118
118
  for (const shardId of worker.queue){
119
119
  await gateway.resharding.tellWorkerToPrepare(worker.id, shardId, bucketId);
120
120
  }
121
121
  }
122
122
  });
123
+ await Promise.all(promises);
124
+ gateway.logger.info(`[Resharding] All shards are now online.`);
125
+ await gateway.resharding.onReshardingSwitch();
123
126
  },
124
127
  async tellWorkerToPrepare (workerId, shardId, bucketId) {
125
128
  gateway.logger.debug(`[Resharding] Telling worker to prepare. Worker: ${workerId} | Shard: ${shardId} | Bucket: ${bucketId}.`);
@@ -135,9 +138,9 @@ export function createGatewayManager(options) {
135
138
  url: gateway.url,
136
139
  version: gateway.version
137
140
  },
138
- // Ignore events until we are ready
139
141
  events: {
140
142
  async message (_shard, payload) {
143
+ // Ignore all events until we swich from the old shards to the new ones.
141
144
  if (payload.t === 'READY') {
142
145
  await gateway.resharding.updateGuildsShardId?.(payload.d.guilds.map((g)=>g.id), shardId);
143
146
  }
@@ -153,22 +156,14 @@ export function createGatewayManager(options) {
153
156
  };
154
157
  }
155
158
  gateway.resharding.shards.set(shardId, shard);
156
- const bucket = gateway.buckets.get(shardId % gateway.connection.sessionStartLimit.maxConcurrency);
157
- if (!bucket) return;
158
- await shard.identify().then(()=>gateway.resharding.shardIsPending(shard));
159
+ await shard.identify();
160
+ gateway.logger.debug(`[Resharding] Shard #${shardId} identified.`);
159
161
  },
160
- async shardIsPending (shard) {
161
- // Save this in pending at the moment, until all shards are online
162
- gateway.resharding.pendingShards.set(shard.id, shard);
163
- gateway.logger.debug(`[Resharding] Shard #${shard.id} is now pending.`);
164
- // Check if all shards are now online.
165
- if (gateway.lastShardId - gateway.firstShardId >= gateway.resharding.pendingShards.size) return;
166
- gateway.logger.info(`[Resharding] All shards are now online.`);
167
- // New shards start processing events
162
+ async onReshardingSwitch () {
163
+ gateway.logger.debug(`[Resharding] Making the switch from the old shards to the new ones.`);
164
+ // Move the events from the old shards to the new ones
168
165
  for (const shard of gateway.resharding.shards.values()){
169
- for(const event in options.events){
170
- shard.events[event] = options.events[event];
171
- }
166
+ shard.events = options.events ?? {};
172
167
  }
173
168
  // Old shards stop processing events
174
169
  for (const shard of gateway.shards.values()){
@@ -185,14 +180,10 @@ export function createGatewayManager(options) {
185
180
  };
186
181
  }
187
182
  gateway.logger.info(`[Resharding] Shutting down old shards.`);
188
- // Close old shards
189
183
  await gateway.shutdown(ShardSocketCloseCodes.Resharded, 'Resharded!', false);
190
184
  gateway.logger.info(`[Resharding] Completed.`);
191
- // Replace old shards
192
- gateway.shards = new Collection(gateway.resharding.shards);
193
- // Clear our collections and keep only one reference to the shards, the one in gateway.shards
185
+ gateway.shards = new Map(gateway.resharding.shards);
194
186
  gateway.resharding.shards.clear();
195
- gateway.resharding.pendingShards.clear();
196
187
  }
197
188
  },
198
189
  calculateTotalShards () {
@@ -219,7 +210,8 @@ export function createGatewayManager(options) {
219
210
  leakyBucket: new LeakyBucket({
220
211
  max: 1,
221
212
  refillAmount: 1,
222
- refillInterval: gateway.spawnShardDelay
213
+ refillInterval: gateway.spawnShardDelay,
214
+ logger: this.logger
223
215
  })
224
216
  });
225
217
  }
@@ -469,4 +461,4 @@ export function createGatewayManager(options) {
469
461
  return gateway;
470
462
  }
471
463
 
472
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQge1xuICB0eXBlIEF0TGVhc3RPbmUsXG4gIHR5cGUgQmlnU3RyaW5nLFxuICB0eXBlIENhbWVsaXplLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkUmVhZHksXG4gIHR5cGUgRGlzY29yZFVwZGF0ZVByZXNlbmNlLFxuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgUmVxdWVzdEd1aWxkTWVtYmVycyxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBMZWFreUJ1Y2tldCwganNvblNhZmVSZXBsYWNlciwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcydcbmltcG9ydCB7IHR5cGUgU2hhcmRFdmVudHMsIFNoYXJkU29ja2V0Q2xvc2VDb2RlcywgdHlwZSBTaGFyZFNvY2tldFJlcXVlc3QsIHR5cGUgVHJhbnNwb3J0Q29tcHJlc3Npb24sIHR5cGUgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgcHJlZmVyU25ha2VDYXNlOiBvcHRpb25zLnByZWZlclNuYWtlQ2FzZSA/PyBmYWxzZSxcbiAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICBidWNrZXRzOiBuZXcgTWFwKCksXG4gICAgY2FjaGU6IHtcbiAgICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuY2FjaGU/LnJlcXVlc3RNZW1iZXJzPy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICBwZW5kaW5nOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIG1ha2VQcmVzZW5jZTogb3B0aW9ucy5tYWtlUHJlc2VuY2UgPz8gKCgpID0+IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpKSxcbiAgICByZXNoYXJkaW5nOiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLnJlc2hhcmRpbmc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNoYXJkc0Z1bGxQZXJjZW50YWdlOiBvcHRpb25zLnJlc2hhcmRpbmc/LnNoYXJkc0Z1bGxQZXJjZW50YWdlID8/IDgwLFxuICAgICAgY2hlY2tJbnRlcnZhbDogb3B0aW9ucy5yZXNoYXJkaW5nPy5jaGVja0ludGVydmFsID8/IDI4ODAwMDAwLCAvLyA4IGhvdXJzXG4gICAgICBzaGFyZHM6IG5ldyBDb2xsZWN0aW9uKCksXG4gICAgICBwZW5kaW5nU2hhcmRzOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgZ2V0U2Vzc2lvbkluZm86IG9wdGlvbnMucmVzaGFyZGluZz8uZ2V0U2Vzc2lvbkluZm8sXG4gICAgICB1cGRhdGVHdWlsZHNTaGFyZElkOiBvcHRpb25zLnJlc2hhcmRpbmc/LnVwZGF0ZUd1aWxkc1NoYXJkSWQsXG4gICAgICBhc3luYyBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkKCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIENoZWNraW5nIGlmIHJlc2hhcmRpbmcgaXMgbmVlZGVkLicpXG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBkaXNhYmxlZC4nKVxuXG4gICAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiBmYWxzZSB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWdhdGV3YXkucmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIltSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIGVuYWJsZWQgYnV0IG5vICdyZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCknIGlzIG5vdCBwcm92aWRlZC5cIilcbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkLicpXG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbkluZm8gPSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gU2Vzc2lvbiBpbmZvIHJldHJpZXZlZDogJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uSW5mbyl9YClcblxuICAgICAgICAvLyBEb24ndCBoYXZlIGVub3VnaCBpZGVudGlmeSBsaW1pdHMgdG8gdHJ5IHJlc2hhcmRpbmdcbiAgICAgICAgaWYgKHNlc3Npb25JbmZvLnNlc3Npb25TdGFydExpbWl0LnJlbWFpbmluZyA8IHNlc3Npb25JbmZvLnNoYXJkcykge1xuICAgICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gTm90IGVub3VnaCBzZXNzaW9uIHN0YXJ0IGxpbWl0cyBsZWZ0IHRvIHJlc2hhcmQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UsIGluZm86IHNlc3Npb25JbmZvIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKCdbUmVzaGFyZGluZ10gQWJsZSB0byByZXNoYXJkLCBjaGVja2luZyB3aGV0aGVyIG5lY2Vzc2FyeSBub3cuJylcblxuICAgICAgICAvLyAyNTAwIGlzIHRoZSBtYXggYW1vdW50IG9mIGd1aWxkcyBhIHNpbmdsZSBzaGFyZCBjYW4gaGFuZGxlXG4gICAgICAgIC8vIDEwMDAgaXMgdGhlIGFtb3VudCBvZiBndWlsZHMgZGlzY29yZCB1c2VzIHRvIGRldGVybWluZSBob3cgbWFueSBzaGFyZHMgdG8gcmVjb21tZW5kLlxuICAgICAgICAvLyBUaGlzIGFsZ28gaGVscHMgY2hlY2sgaWYgeW91ciBib3QgaGFzIGdyb3duIGVub3VnaCB0byByZXNoYXJkLlxuICAgICAgICAvLyBXaGlsZSB0aGlzIGlzIGltcHJlY2lzZSBhcyBkaXNjb3JkIGNoYW5nZXMgdGhlIHJlY29tbWVuZGVkIG51bWJlciBvZiBzaGFyZCBldmVyeSAxMDAwIGd1aWxkcyBpdCBpcyBnb29kIGVub3VnaFxuICAgICAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gc3RvcmUgdGhlIGd1aWxkIGNvdW50IGZvciBlYWNoIHNoYXJkIGFuZCByZXF1aXJlIHRoZSBHdWlsZHMgaW50ZW50IGZvciBgR1VJTERfQ1JFQVRFYCBhbmQgYEdVSUxEX0RFTEVURWAgZXZlbnRzXG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoc2Vzc2lvbkluZm8uc2hhcmRzIC8gKChnYXRld2F5LnRvdGFsU2hhcmRzICogMjUwMCkgLyAxMDAwKSkgKiAxMDBcblxuICAgICAgICAvLyBMZXNzIHRoYW4gbmVjZXNzYXJ5JSBiZWluZyB1c2VkIHNvIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPCBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzRnVsbFBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgbm90IG5lZWRlZC4nKVxuXG4gICAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiBmYWxzZSwgaW5mbzogc2Vzc2lvbkluZm8gfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgbmVlZGVkLicpXG5cbiAgICAgICAgcmV0dXJuIHsgbmVlZGVkOiB0cnVlLCBpbmZvOiBzZXNzaW9uSW5mbyB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmVzaGFyZChpbmZvKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBQcmV2aW91cyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICAvLyBTZXQgdmFsdWVzIG9uIGdhdGV3YXlcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGluZm8uc2hhcmRzXG4gICAgICAgIC8vIEhhbmRsZXMgcHJlcGFyaW5nIG1pZCBzaXplZCBib3RzIGZvciBMQlNcbiAgICAgICAgZ2F0ZXdheS50b3RhbFNoYXJkcyA9IGdhdGV3YXkuY2FsY3VsYXRlVG90YWxTaGFyZHMoKVxuICAgICAgICAvLyBTZXQgZmlyc3Qgc2hhcmQgaWQgaWYgcHJvdmlkZWQgaW4gaW5mb1xuICAgICAgICBpZiAodHlwZW9mIGluZm8uZmlyc3RTaGFyZElkID09PSAnbnVtYmVyJykgZ2F0ZXdheS5maXJzdFNoYXJkSWQgPSBpbmZvLmZpcnN0U2hhcmRJZFxuICAgICAgICAvLyBTZXQgbGFzdCBzaGFyZCBpZCBpZiBwcm92aWRlZCBpbiBpbmZvXG4gICAgICAgIGlmICh0eXBlb2YgaW5mby5sYXN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkubGFzdFNoYXJkSWQgPSBpbmZvLmxhc3RTaGFyZElkXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBOZXcgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcblxuICAgICAgICAvLyBSZXNldHRpbmcgYnVja2V0c1xuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuY2xlYXIoKVxuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpXG5cbiAgICAgICAgLy8gU1BSRUFEIFRISVMgT1VUIFRPIERJRkZFUkVOVCBXT1JLRVJTIFRPIEJFR0lOIFNUQVJUSU5HIFVQXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5mb3JFYWNoKGFzeW5jIChidWNrZXQsIGJ1Y2tldElkKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgYXN5bmMgdGVsbFdvcmtlclRvUHJlcGFyZSh3b3JrZXJJZCwgc2hhcmRJZCwgYnVja2V0SWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtSZXNoYXJkaW5nXSBUZWxsaW5nIHdvcmtlciB0byBwcmVwYXJlLiBXb3JrZXI6ICR7d29ya2VySWR9IHwgU2hhcmQ6ICR7c2hhcmRJZH0gfCBCdWNrZXQ6ICR7YnVja2V0SWR9LmApXG4gICAgICAgIGNvbnN0IHNoYXJkID0gbmV3IFNoYXJkKHtcbiAgICAgICAgICBpZDogc2hhcmRJZCxcbiAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICBjb21wcmVzczogZ2F0ZXdheS5jb21wcmVzcyxcbiAgICAgICAgICAgIHRyYW5zcG9ydENvbXByZXNzaW9uOiBnYXRld2F5LnRyYW5zcG9ydENvbXByZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgICBpbnRlbnRzOiBnYXRld2F5LmludGVudHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBnYXRld2F5LnByb3BlcnRpZXMsXG4gICAgICAgICAgICB0b2tlbjogZ2F0ZXdheS50b2tlbixcbiAgICAgICAgICAgIHRvdGFsU2hhcmRzOiBnYXRld2F5LnRvdGFsU2hhcmRzLFxuICAgICAgICAgICAgdXJsOiBnYXRld2F5LnVybCxcbiAgICAgICAgICAgIHZlcnNpb246IGdhdGV3YXkudmVyc2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIElnbm9yZSBldmVudHMgdW50aWwgd2UgYXJlIHJlYWR5XG4gICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKF9zaGFyZCwgcGF5bG9hZCkge1xuICAgICAgICAgICAgICBpZiAocGF5bG9hZC50ID09PSAnUkVBRFknKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnVwZGF0ZUd1aWxkc1NoYXJkSWQ/LihcbiAgICAgICAgICAgICAgICAgIChwYXlsb2FkLmQgYXMgRGlzY29yZFJlYWR5KS5ndWlsZHMubWFwKChnKSA9PiBnLmlkKSxcbiAgICAgICAgICAgICAgICAgIHNoYXJkSWQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9nZ2VyOiBnYXRld2F5LmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGdhdGV3YXkucHJlZmVyU25ha2VDYXNlKSB7XG4gICAgICAgICAgc2hhcmQuZm9yd2FyZFRvQm90ID0gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50cz8ubWVzc2FnZT8uKHNoYXJkLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuXG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVyblxuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KCkudGhlbigoKSA9PiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRJc1BlbmRpbmcoc2hhcmQpKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHNoYXJkSXNQZW5kaW5nKHNoYXJkKSB7XG4gICAgICAgIC8vIFNhdmUgdGhpcyBpbiBwZW5kaW5nIGF0IHRoZSBtb21lbnQsIHVudGlsIGFsbCBzaGFyZHMgYXJlIG9ubGluZVxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcucGVuZGluZ1NoYXJkcy5zZXQoc2hhcmQuaWQsIHNoYXJkKVxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNoYXJkICMke3NoYXJkLmlkfSBpcyBub3cgcGVuZGluZy5gKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuXG4gICAgICAgIGlmIChnYXRld2F5Lmxhc3RTaGFyZElkIC0gZ2F0ZXdheS5maXJzdFNoYXJkSWQgPj0gZ2F0ZXdheS5yZXNoYXJkaW5nLnBlbmRpbmdTaGFyZHMuc2l6ZSkgcmV0dXJuXG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIEFsbCBzaGFyZHMgYXJlIG5vdyBvbmxpbmUuYClcblxuICAgICAgICAvLyBOZXcgc2hhcmRzIHN0YXJ0IHByb2Nlc3NpbmcgZXZlbnRzXG4gICAgICAgIGZvciAoY29uc3Qgc2hhcmQgb2YgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkcy52YWx1ZXMoKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gb3B0aW9ucy5ldmVudHMpIHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50c1tldmVudCBhcyBrZXlvZiBTaGFyZEV2ZW50c10gPSBvcHRpb25zLmV2ZW50c1tldmVudCBhcyBrZXlvZiBTaGFyZEV2ZW50c10gYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93blxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9sZCBzaGFyZHMgc3RvcCBwcm9jZXNzaW5nIGV2ZW50c1xuICAgICAgICBmb3IgKGNvbnN0IHNoYXJkIG9mIGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSGFuZGxlciA9IHNoYXJkLmV2ZW50cy5tZXNzYWdlXG5cbiAgICAgICAgICAvLyBDaGFuZ2Ugd2l0aCBzcHJlYWQgb3BlcmF0b3IgdG8gbm90IGFmZmVjdCBuZXcgc2hhcmRzLCBhcyBjaGFuZ2luZyBhbnl0aGluZyBvbiBzaGFyZC5ldmVudHMgd2lsbCBkaXJlY3RseSBjaGFuZ2Ugb3B0aW9ucy5ldmVudHMsIHdoaWNoIGNoYW5nZXMgbmV3IHNoYXJkcycgZXZlbnRzXG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0ge1xuICAgICAgICAgICAgLi4uc2hhcmQuZXZlbnRzLFxuICAgICAgICAgICAgbWVzc2FnZTogYXN5bmMgZnVuY3Rpb24gKF8sIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgLy8gTWVtYmVyIGNoZWNrcyBuZWVkIHRvIGNvbnRpbnVlIGJ1dCBvdGhlcnMgY2FuIHN0b3BcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudCA9PT0gJ0dVSUxEX01FTUJFUlNfQ0hVTksnKSB7XG4gICAgICAgICAgICAgICAgb2xkSGFuZGxlcj8uKHNoYXJkLCBtZXNzYWdlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTaHV0dGluZyBkb3duIG9sZCBzaGFyZHMuYClcbiAgICAgICAgLy8gQ2xvc2Ugb2xkIHNoYXJkc1xuICAgICAgICBhd2FpdCBnYXRld2F5LnNodXRkb3duKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQsICdSZXNoYXJkZWQhJywgZmFsc2UpXG5cbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuaW5mbyhgW1Jlc2hhcmRpbmddIENvbXBsZXRlZC5gKVxuXG4gICAgICAgIC8vIFJlcGxhY2Ugb2xkIHNoYXJkc1xuICAgICAgICBnYXRld2F5LnNoYXJkcyA9IG5ldyBDb2xsZWN0aW9uKGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMpXG5cbiAgICAgICAgLy8gQ2xlYXIgb3VyIGNvbGxlY3Rpb25zIGFuZCBrZWVwIG9ubHkgb25lIHJlZmVyZW5jZSB0byB0aGUgc2hhcmRzLCB0aGUgb25lIGluIGdhdGV3YXkuc2hhcmRzXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuY2xlYXIoKVxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcucGVuZGluZ1NoYXJkcy5jbGVhcigpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBjYWxjdWxhdGVUb3RhbFNoYXJkcygpIHtcbiAgICAgIC8vIEJvdHMgdW5kZXIgMTAwayBzZXJ2ZXJzIGRvIG5vdCBoYXZlIGFjY2VzcyB0byBMQlMuXG4gICAgICBpZiAoZ2F0ZXdheS50b3RhbFNoYXJkcyA8IDEwMCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkczogJHtnYXRld2F5LnRvdGFsU2hhcmRzfWApXG4gICAgICAgIHJldHVybiBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gQ2FsY3VsYXRpbmcgdG90YWwgc2hhcmRzYCwgZ2F0ZXdheS50b3RhbFNoYXJkcywgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuICAgICAgLy8gQ2FsY3VsYXRlIGEgbXVsdGlwbGUgb2YgYG1heENvbmN1cnJlbmN5YCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBnYXRld2F5LlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgTWF0aC5jZWlsKFxuICAgICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgL1xuICAgICAgICAgICAgLy8gSWYgYG1heENvbmN1cnJlbmN5YCBpcyAxLCB3ZSBjYW4gc2FmZWx5IHVzZSAxNiB0byBnZXQgYHRvdGFsU2hhcmRzYCB0byBiZSBpbiBhIG11bHRpcGxlIG9mIDE2IHNvIHRoYXQgd2UgY2FuIHByZXBhcmUgYm90cyB3aXRoIDEwMGsgc2VydmVycyBmb3IgTEJTLlxuICAgICAgICAgICAgKGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSA9PT0gMSA/IDE2IDogZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KSxcbiAgICAgICAgKSAqIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIClcbiAgICB9LFxuICAgIGNhbGN1bGF0ZVdvcmtlcklkKHNoYXJkSWQpIHtcbiAgICAgIGNvbnN0IHdvcmtlcklkID0gb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW5cbiAgICAgICAgPyBzaGFyZElkICUgZ2F0ZXdheS50b3RhbFdvcmtlcnNcbiAgICAgICAgOiBNYXRoLm1pbihNYXRoLmZsb29yKHNoYXJkSWQgLyBnYXRld2F5LnNoYXJkc1BlcldvcmtlciksIGdhdGV3YXkudG90YWxXb3JrZXJzIC0gMSlcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgW0dhdGV3YXldIENhbGN1bGF0aW5nIHdvcmtlcklkOiBTaGFyZDogJHtzaGFyZElkfSAtPiBXb3JrZXI6ICR7d29ya2VySWR9IC0+IFBlciBXb3JrZXI6ICR7Z2F0ZXdheS5zaGFyZHNQZXJXb3JrZXJ9IC0+IFRvdGFsOiAke2dhdGV3YXkudG90YWxXb3JrZXJzfWAsXG4gICAgICApXG4gICAgICByZXR1cm4gd29ya2VySWRcbiAgICB9LFxuICAgIHByZXBhcmVCdWNrZXRzKCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3k7ICsraSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBjb25jdXJyZW5jeTogJHtpfWApXG4gICAgICAgIGdhdGV3YXkuYnVja2V0cy5zZXQoaSwge1xuICAgICAgICAgIHdvcmtlcnM6IFtdLFxuICAgICAgICAgIGxlYWt5QnVja2V0OiBuZXcgTGVha3lCdWNrZXQoe1xuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgcmVmaWxsQW1vdW50OiAxLFxuICAgICAgICAgICAgcmVmaWxsSW50ZXJ2YWw6IGdhdGV3YXkuc3Bhd25TaGFyZERlbGF5LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBPcmdhbml6ZSBhbGwgc2hhcmRzIGludG8gdGhlaXIgb3duIGJ1Y2tldHNcbiAgICAgIGZvciAobGV0IHNoYXJkSWQgPSBnYXRld2F5LmZpcnN0U2hhcmRJZDsgc2hhcmRJZCA8PSBnYXRld2F5Lmxhc3RTaGFyZElkOyArK3NoYXJkSWQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3Igc2hhcmQ6ICR7c2hhcmRJZH1gKVxuXG4gICAgICAgIGlmIChzaGFyZElkID49IGdhdGV3YXkudG90YWxTaGFyZHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNoYXJkIChpZDogJHtzaGFyZElkfSkgaXMgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB1c2VkIGFtb3VudCBvZiB1c2VkIHNoYXJkcyB3aGljaCBpcyAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1Y2tldElkID0gc2hhcmRJZCAlIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeVxuICAgICAgICBjb25zdCBidWNrZXQgPSBnYXRld2F5LmJ1Y2tldHMuZ2V0KGJ1Y2tldElkKVxuXG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNoYXJkIChpZDogJHtzaGFyZElkfSkgZ290IGFzc2lnbmVkIHRvIGFuIGlsbGVnYWwgYnVja2V0IGlkOiAke2J1Y2tldElkfSwgZXhwZWN0ZWQgYSBidWNrZXQgaWQgYmV0d2VlbiAwIGFuZCAke1xuICAgICAgICAgICAgICBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgLSAxXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHdvcmtlciBpZCBmb3IgdGhpcyBzaGFyZFxuICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGdhdGV3YXkuY2FsY3VsYXRlV29ya2VySWQoc2hhcmRJZClcbiAgICAgICAgY29uc3Qgd29ya2VyID0gYnVja2V0LndvcmtlcnMuZmluZCgodykgPT4gdy5pZCA9PT0gd29ya2VySWQpXG5cbiAgICAgICAgLy8gSWYgdGhpcyB3b3JrZXIgYWxyZWFkeSBleGlzdHMsIGFkZCB0aGUgc2hhcmQgdG8gaXRzIHF1ZXVlXG4gICAgICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgICB3b3JrZXIucXVldWUucHVzaChzaGFyZElkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Y2tldC53b3JrZXJzLnB1c2goeyBpZDogd29ya2VySWQsIHF1ZXVlOiBbc2hhcmRJZF0gfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc3Bhd25TaGFyZHMoKSB7XG4gICAgICAvLyBQcmVwYXJlIHRoZSBjb25jdXJyZW5jeSBidWNrZXRzXG4gICAgICBnYXRld2F5LnByZXBhcmVCdWNrZXRzKClcblxuICAgICAgY29uc3QgcHJvbWlzZXMgPSBbLi4uZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKV0ubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXIgb2YgYnVja2V0LndvcmtlcnMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNoYXJkSWQgb2Ygd29ya2VyLnF1ZXVlKSB7XG4gICAgICAgICAgICBhd2FpdCBnYXRld2F5LnRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlci5pZCwgc2hhcmRJZCwgYnVja2V0SWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBXZSB1c2UgUHJvbWlzZS5hbGwgc28gd2UgY2FuIHN0YXJ0IGFsbCBidWNrZXRzIGF0IHRoZSBzYW1lIHRpbWVcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuXG4gICAgICAvLyBDaGVjayBhbmQgcmVzaGFyZCBhdXRvbWF0aWNhbGx5IGlmIGF1dG8gcmVzaGFyZGluZyBpcyBlbmFibGVkLlxuICAgICAgaWYgKGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkICYmIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsICE9PSAtMSkge1xuICAgICAgICAvLyBJdCBpcyBiZXR0ZXIgdG8gZW5zdXJlIHRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZVxuICAgICAgICBjbGVhckludGVydmFsKGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQpXG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcuZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIud2FybihcIltSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIGVuYWJsZWQgYnV0ICdyZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKCknIHdhcyBub3QgcHJvdmlkZWQuIERpc2FibGluZyByZXNoYXJkaW5nLlwiKVxuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc2hhcmRpbmdJbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQoKVxuXG4gICAgICAgICAgaWYgKHJlc2hhcmRpbmdJbmZvLm5lZWRlZCAmJiByZXNoYXJkaW5nSW5mby5pbmZvKSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcucmVzaGFyZChyZXNoYXJkaW5nSW5mby5pbmZvKVxuICAgICAgICB9LCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbClcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNodXRkb3duKGNvZGUsIHJlYXNvbiwgY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwgPSB0cnVlKSB7XG4gICAgICBpZiAoY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwoZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZClcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShnYXRld2F5LnNoYXJkcy52YWx1ZXMoKSkubWFwKChzaGFyZCkgPT4gc2hhcmQuY2xvc2UoY29kZSwgcmVhc29uKSkpXG4gICAgfSxcbiAgICBhc3luYyBzZW5kUGF5bG9hZChzaGFyZElkLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IGdhdGV3YXkuc2hhcmRzLmdldChzaGFyZElkKVxuXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmQgKGlkOiAke3NoYXJkSWR9IG5vdCBmb3VuZGApXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNoYXJkLnNlbmQocGF5bG9hZClcbiAgICB9LFxuICAgIGFzeW5jIHRlbGxXb3JrZXJUb0lkZW50aWZ5KHdvcmtlcklkLCBzaGFyZElkLCBidWNrZXRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBUZWxsIHdvcmtlciAjJHt3b3JrZXJJZH0gdG8gaWRlbnRpZnkgc2hhcmQgIyR7c2hhcmRJZH0gZnJvbSBidWNrZXQgJHtidWNrZXRJZH1gKVxuICAgICAgYXdhaXQgZ2F0ZXdheS5pZGVudGlmeShzaGFyZElkKVxuICAgIH0sXG4gICAgYXN5bmMgaWRlbnRpZnkoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBsZXQgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gSWRlbnRpZnlpbmcgJHtzaGFyZCA/ICdleGlzdGluZycgOiAnbmV3J30gc2hhcmQgKCR7c2hhcmRJZH0pYClcblxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IHRoaXMuY29tcHJlc3MsXG4gICAgICAgICAgICB0cmFuc3BvcnRDb21wcmVzc2lvbjogZ2F0ZXdheS50cmFuc3BvcnRDb21wcmVzc2lvbixcbiAgICAgICAgICAgIGludGVudHM6IHRoaXMuaW50ZW50cyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgIHRva2VuOiB0aGlzLnRva2VuLFxuICAgICAgICAgICAgdG90YWxTaGFyZHM6IHRoaXMudG90YWxTaGFyZHMsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBvcHRpb25zLmV2ZW50cyA/PyB7fSxcbiAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICAgIHJlcXVlc3RJZGVudGlmeTogYXN5bmMgKCkgPT4gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCksXG4gICAgICAgICAgbWFrZVByZXNlbmNlOiBnYXRld2F5Lm1ha2VQcmVzZW5jZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5wcmVmZXJTbmFrZUNhc2UpIHtcbiAgICAgICAgICBzaGFyZC5mb3J3YXJkVG9Cb3QgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgc2hhcmQhLmV2ZW50cy5tZXNzYWdlPy4oc2hhcmQhLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hhcmRzLnNldChzaGFyZElkLCBzaGFyZClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuaWRlbnRpZnkoKVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoc2hhcmRJZCkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTaGFyZCAjJHtzaGFyZElkfSByZXF1ZXN0ZWQgYW4gaWRlbnRpZnkuYClcblxuICAgICAgY29uc3QgYnVja2V0ID0gZ2F0ZXdheS5idWNrZXRzLmdldChzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5KVxuXG4gICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IGlkZW50aWZ5IGZvciBhIHNoYXJkIHRoYXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueSBidWNrZXQuXCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGJ1Y2tldC5sZWFreUJ1Y2tldC5hY3F1aXJlKClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBBcHByb3ZlZCBpZGVudGlmeSByZXF1ZXN0IGZvciBTaGFyZCAjJHtzaGFyZElkfS5gKVxuICAgIH0sXG5cbiAgICBhc3luYyBraWxsKHNoYXJkSWQ6IG51bWJlcikge1xuICAgICAgY29uc3Qgc2hhcmQgPSB0aGlzLnNoYXJkcy5nZXQoc2hhcmRJZClcbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTaGFyZCAjJHtzaGFyZElkfSB3YXMgcmVxdWVzdGVkIHRvIGJlIGtpbGxlZCwgYnV0IHRoZSBzaGFyZCBjb3VsZCBub3QgYmUgZm91bmQuYClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gS2lsbGluZyBTaGFyZCAjJHtzaGFyZElkfWApXG4gICAgICB0aGlzLnNoYXJkcy5kZWxldGUoc2hhcmRJZClcbiAgICAgIGF3YWl0IHNoYXJkLnNodXRkb3duKClcbiAgICB9LFxuXG4gICAgLy8gSGVscGVycyBtZXRob2RzIGJlbG93IHRoaXNcblxuICAgIGNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZCwgdG90YWxTaGFyZHMpIHtcbiAgICAgIC8vIElmIG5vbmUgaXMgcHJvdmlkZWQsIHVzZSB0aGUgdG90YWwgc2hhcmRzIG51bWJlciBmcm9tIGdhdGV3YXkgb2JqZWN0LlxuICAgICAgaWYgKCF0b3RhbFNoYXJkcykgdG90YWxTaGFyZHMgPSBnYXRld2F5LnRvdGFsU2hhcmRzXG4gICAgICAvLyBJZiBpdCBpcyBvbmx5IDEgc2hhcmQsIGl0IHdpbGwgYWx3YXlzIGJlIHNoYXJkIGlkIDBcbiAgICAgIGlmICh0b3RhbFNoYXJkcyA9PT0gMSkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGNhbGN1bGF0ZVNoYXJkSWQgKDEgc2hhcmQpYClcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBjYWxjdWxhdGVTaGFyZElkIChndWlsZElkOiAke2d1aWxkSWR9LCB0b3RhbFNoYXJkczogJHt0b3RhbFNoYXJkc30pYClcbiAgICAgIHJldHVybiBOdW1iZXIoKEJpZ0ludChndWlsZElkKSA+PiAyMm4pICUgQmlnSW50KHRvdGFsU2hhcmRzKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblZvaWNlQ2hhbm5lbChndWlsZElkLCBjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBqb2luVm9pY2VDaGFubmVsIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gY2hhbm5lbElkOiAke2NoYW5uZWxJZH1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IGNoYW5uZWxJZC50b1N0cmluZygpLFxuICAgICAgICAgIHNlbGZfbXV0ZTogb3B0aW9ucz8uc2VsZk11dGUgPz8gZmFsc2UsXG4gICAgICAgICAgc2VsZl9kZWFmOiBvcHRpb25zPy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFN0YXR1cyhkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRCb3RTdGF0dXMgZGF0YTogJHtKU09OLnN0cmluZ2lmeShkYXRhLCBqc29uU2FmZVJlcGxhY2VyKX1gKVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLmdhdGV3YXkuc2hhcmRzLnZhbHVlcygpXS5tYXAoYXN5bmMgKHNoYXJkKSA9PiB7XG4gICAgICAgICAgZ2F0ZXdheS5lZGl0U2hhcmRTdGF0dXMoc2hhcmQuaWQsIGRhdGEpXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2hhcmRTdGF0dXMoc2hhcmRJZCwgZGF0YSkge1xuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBlZGl0U2hhcmRTdGF0dXMgc2hhcmRJZDogJHtzaGFyZElkfSAtPiBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUHJlc2VuY2VVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBzaW5jZTogbnVsbCxcbiAgICAgICAgICBhZms6IGZhbHNlLFxuICAgICAgICAgIGFjdGl2aXRpZXM6IGRhdGEuYWN0aXZpdGllcyxcbiAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWVzdE1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBpZiAoZ2F0ZXdheS5pbnRlbnRzICYmICghb3B0aW9ucz8ubGltaXQgfHwgb3B0aW9ucy5saW1pdCA+IDEpICYmICEoZ2F0ZXdheS5pbnRlbnRzICYgR2F0ZXdheUludGVudHMuR3VpbGRNZW1iZXJzKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmV0Y2ggbW9yZSB0aGVuIDEgbWVtYmVyIHdpdGhvdXQgdGhlIEdVSUxEX01FTUJFUlMgaW50ZW50JylcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSByZXF1ZXN0TWVtYmVycyBndWlsZElkOiAke2d1aWxkSWR9IC0+IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcblxuICAgICAgaWYgKG9wdGlvbnM/LnVzZXJJZHM/Lmxlbmd0aCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gc2V0dGluZyB1c2VyIGxpbWl0IGJhc2VkIG9uIHVzZXJJZHMgbGVuZ3RoOiAke29wdGlvbnMudXNlcklkcy5sZW5ndGh9YClcblxuICAgICAgICBvcHRpb25zLmxpbWl0ID0gb3B0aW9ucy51c2VySWRzLmxlbmd0aFxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgIGxldCBub25jZSA9ICcnXG5cbiAgICAgICAgd2hpbGUgKCFub25jZSB8fCBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuaGFzKG5vbmNlKSkge1xuICAgICAgICAgIG5vbmNlID0gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA/Pz0geyBsaW1pdDogMCB9XG4gICAgICAgIG9wdGlvbnMubm9uY2UgPSBub25jZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZW1iZXJzID0gIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogbmV3IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICAgICAgICAgICAgaWYgKCFnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWQgfHwgIW9wdGlvbnM/Lm5vbmNlKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDYW4ndCByZXF1ZXN0IHRoZSBtZW1iZXJzIHdpdGhvdXQgdGhlIG5vbmNlIG9yIHdpdGggdGhlIGZlYXR1cmUgZGlzYWJsZWQuXCIpKVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5wZW5kaW5nLnNldChvcHRpb25zLm5vbmNlLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiBvcHRpb25zLm5vbmNlLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXF1ZXN0R3VpbGRNZW1iZXJzLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAvLyBJZiBhIHF1ZXJ5IGlzIHByb3ZpZGVkIHVzZSBpdCwgT1IgaWYgYSBsaW1pdCBpcyBOT1QgcHJvdmlkZWQgdXNlIFwiXCJcbiAgICAgICAgICBxdWVyeTogb3B0aW9ucz8ucXVlcnkgPz8gKG9wdGlvbnM/LmxpbWl0ID8gdW5kZWZpbmVkIDogJycpLFxuICAgICAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdCA/PyAwLFxuICAgICAgICAgIHByZXNlbmNlczogb3B0aW9ucz8ucHJlc2VuY2VzID8/IGZhbHNlLFxuICAgICAgICAgIHVzZXJfaWRzOiBvcHRpb25zPy51c2VySWRzPy5tYXAoKGlkKSA9PiBpZC50b1N0cmluZygpKSxcbiAgICAgICAgICBub25jZTogb3B0aW9ucz8ubm9uY2UsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gYXdhaXQgbWVtYmVyc1xuICAgIH0sXG5cbiAgICBhc3luYyBsZWF2ZVZvaWNlQ2hhbm5lbChndWlsZElkKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gbGVhdmVWb2ljZUNoYW5uZWwgZ3VpbGRJZDogJHtndWlsZElkfSBTaGFyZCAke3NoYXJkSWR9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgICBkOiB7XG4gICAgICAgICAgZ3VpbGRfaWQ6IGd1aWxkSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGFubmVsX2lkOiBudWxsLFxuICAgICAgICAgIHNlbGZfbXV0ZTogZmFsc2UsXG4gICAgICAgICAgc2VsZl9kZWFmOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RTb3VuZGJvYXJkU291bmRzKGd1aWxkSWRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIERpc2NvcmQgd2lsbCBzZW5kIHRoZSBldmVudHMgZm9yIHRoZSBndWlsZHMgdGhhdCBhcmUgXCJ1bmRlciB0aGUgc2hhcmRcIiB0aGF0IHNlbmRzIHRoZSBvcGNvZGUuXG4gICAgICAgKiBGb3IgdGhpcyByZWFzb24gd2UgbmVlZCB0byBncm91cCB0aGUgaWRzIHdpdGggdGhlIHNoYXJkIHRoZSBjYWxjdWxhdGVTaGFyZElkIG1ldGhvZCBnaXZlc1xuICAgICAgICovXG5cbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBCaWdTdHJpbmdbXT4oKVxuXG4gICAgICBmb3IgKGNvbnN0IGd1aWxkSWQgb2YgZ3VpbGRJZHMpIHtcbiAgICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICAgIGNvbnN0IGlkcyA9IG1hcC5nZXQoc2hhcmRJZCkgPz8gW11cbiAgICAgICAgbWFwLnNldChzaGFyZElkLCBpZHMpXG5cbiAgICAgICAgaWRzLnB1c2goZ3VpbGRJZClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIFsuLi5tYXAuZW50cmllcygpXS5tYXAoKFtzaGFyZElkLCBpZHNdKSA9PlxuICAgICAgICAgIGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlcXVlc3RTb3VuZGJvYXJkU291bmRzLFxuICAgICAgICAgICAgZDoge1xuICAgICAgICAgICAgICBndWlsZF9pZHM6IGlkcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfSxcbiAgfVxuXG4gIHJldHVybiBnYXRld2F5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBmaXJzdCBTaGFyZCB3aGljaCBzaG91bGQgZ2V0IGNvbnRyb2xsZWQgYnkgdGhpcyBtYW5hZ2VyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBmaXJzdFNoYXJkSWQ/OiBudW1iZXJcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBsYXN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGxhc3RTaGFyZElkPzogbnVtYmVyXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgc3Bhd25pbmcgbmV4dCBzaGFyZC4gT1BUSU1BTCBJUyBBQk9WRSA1MTAwLiBZT1UgRE9OJ1QgV0FOVCBUTyBISVQgVEhFIFJBVEUgTElNSVQhISFcbiAgICogQGRlZmF1bHQgNTMwMFxuICAgKi9cbiAgc3Bhd25TaGFyZERlbGF5PzogbnVtYmVyXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNlbmQgdGhlIGRpc2NvcmQgcGFja2V0cyBpbiBzbmFrZSBjYXNlIGZvcm0uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBwcmVmZXJTbmFrZUNhc2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiBUb3RhbCBhbW91bnQgb2Ygc2hhcmRzIHlvdXIgYm90IHVzZXMuIFVzZWZ1bCBmb3IgemVyby1kb3dudGltZSB1cGRhdGVzIG9yIHJlc2hhcmRpbmcuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHRvdGFsU2hhcmRzPzogbnVtYmVyXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHNoYXJkcyB0byBsb2FkIHBlciB3b3JrZXIuXG4gICAqIEBkZWZhdWx0IDI1XG4gICAqL1xuICBzaGFyZHNQZXJXb3JrZXI/OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29ya2VycyB0byB1c2UgZm9yIHlvdXIgYm90LlxuICAgKiBAZGVmYXVsdCA0XG4gICAqL1xuICB0b3RhbFdvcmtlcnM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3ByZWFkIHNoYXJkcyBhY3Jvc3Mgd29ya2VycyBpbiBhIHJvdW5kLXJvYmluIG1hbm5lci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQnkgZGVmYXVsdCwgc2hhcmRzIGFyZSBhc3NpZ25lZCB0byB3b3JrZXJzIGluIGNvbnRpZ3VvdXMgYmxvY2tzIGJhc2VkIG9uIHNoYXJkc1Blcldvcmtlci4gSWYgYW55IHNoYXJkIGlzIGxlZnQgb3ZlciwgaXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgbGFzdCB3b3JrZXIuXG4gICAqIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaGF2ZSAzIHdvcmtlcnMgYW5kIDQwIHNoYXJkcyB3aGlsZSBzaGFyZHNQZXJXb3JrZXIgaXMgMTAsIHRoZSBmaXJzdCB3b3JrZXIgd2lsbCBnZXQgc2hhcmRzIDAtOSwgdGhlIHNlY29uZCB3b3JrZXIgd2lsbCBnZXQgc2hhcmRzIDEwLTE5LCBhbmQgc28gb24sIHRoZSBsYXN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMjAtMzkuXG4gICAqXG4gICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byB0cnVlLCB0aGUgc2hhcmRzIHdpbGwgYmUgYXNzaWduZWQgaW4gYSByb3VuZC1yb2JpbiBtYW5uZXIgdG8gc3ByZWFkIG1vcmUgZXZlbmx5IGFjcm9zcyB3b3JrZXJzLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCAzIHdvcmtlcnMgYW5kIDQwIHNoYXJkcywgdGhlIGZpcnN0IHNoYXJkIHdpbGwgZ28gdG8gd29ya2VyIDAsIHRoZSBzZWNvbmQgc2hhcmQgdG8gd29ya2VyIDEsIHRoZSB0aGlyZCBzaGFyZCB0byB3b3JrZXIgMiwgdGhlIGZvdXJ0aCBzaGFyZCB0byB3b3JrZXIgMCwgYW5kIHNvIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc3ByZWFkU2hhcmRzSW5Sb3VuZFJvYmluPzogYm9vbGVhblxuICAvKiogSW1wb3J0YW50IGRhdGEgd2hpY2ggaXMgdXNlZCBieSB0aGUgbWFuYWdlciB0byBjb25uZWN0IHNoYXJkcyB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgY29ubmVjdGlvbj86IENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90PlxuICAvKiogV2hldGhlciBpbmNvbWluZyBwYXlsb2FkcyBhcmUgY29tcHJlc3NlZCB1c2luZyB6bGliLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY29tcHJlc3M/OiBib29sZWFuXG4gIC8qKiBXaGF0IHRyYW5zcG9ydCBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAqL1xuICB0cmFuc3BvcnRDb21wcmVzc2lvbj86IFRyYW5zcG9ydENvbXByZXNzaW9uIHwgbnVsbFxuICAvKiogVGhlIGNhbGN1bGF0ZWQgaW50ZW50IHZhbHVlIG9mIHRoZSBldmVudHMgd2hpY2ggdGhlIHNoYXJkIHNob3VsZCByZWNlaXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBpbnRlbnRzPzogbnVtYmVyXG4gIC8qKiBJZGVudGlmeSBwcm9wZXJ0aWVzIHRvIHVzZSAqL1xuICBwcm9wZXJ0aWVzPzoge1xuICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIHRoZSBzaGFyZCBydW5zIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJkYXJ3aW5cIiB8IFwibGludXhcIiB8IFwid2luZG93c1wiXG4gICAgICovXG4gICAgb3M6IHN0cmluZ1xuICAgIC8qKiBUaGUgXCJicm93c2VyXCIgd2hlcmUgdGhpcyBzaGFyZCBpcyBydW5uaW5nIG9uLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBicm93c2VyOiBzdHJpbmdcbiAgICAvKiogVGhlIGRldmljZSBvbiB3aGljaCB0aGUgc2hhcmQgaXMgcnVubmluZy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiRGlzY29yZGVub1wiXG4gICAgICovXG4gICAgZGV2aWNlOiBzdHJpbmdcbiAgfVxuICAvKiogQm90IHRva2VuIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkICovXG4gIHRva2VuOiBzdHJpbmdcbiAgLyoqIFRoZSBVUkwgb2YgdGhlIGdhdGV3YXkgd2hpY2ggc2hvdWxkIGJlIGNvbm5lY3RlZCB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2dcIlxuICAgKi9cbiAgdXJsPzogc3RyaW5nXG4gIC8qKiBUaGUgZ2F0ZXdheSB2ZXJzaW9uIHdoaWNoIHNob3VsZCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgdmVyc2lvbj86IG51bWJlclxuICAvKiogVGhlIGV2ZW50cyBoYW5kbGVycyAqL1xuICBldmVudHM/OiBTaGFyZEV2ZW50c1xuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZT86IHtcbiAgICByZXF1ZXN0TWVtYmVycz86IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciBvciBub3QgcmVxdWVzdCBtZW1iZXIgcmVxdWVzdHMgc2hvdWxkIGJlIGNhY2hlZC5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIHRoYXQgdGhlIGdhdGV3YXkgbWFuYWdlciB3aWxsIHVzZS5cbiAgICogQGRlZmF1bHQgbG9nZ2VyIC8vIFRoZSBsb2dnZXIgZXhwb3J0ZWQgYnkgYEBkaXNjb3JkZW5vL3V0aWxzYFxuICAgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKlxuICAgKiBNYWtlIHRoZSBwcmVzZW5jZSBmb3Igd2hlbiB0aGUgYm90IGNvbm5lY3RzIHRvIHRoZSBnYXRld2F5XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgU2hhcmQgaXMgZ29pbmcgdG8gaWRlbnRpZnlcbiAgICovXG4gIG1ha2VQcmVzZW5jZT86ICgpID0+IFByb21pc2U8RGlzY29yZFVwZGF0ZVByZXNlbmNlIHwgdW5kZWZpbmVkPlxuICAvKiogT3B0aW9ucyByZWxhdGVkIHRvIHJlc2hhcmRpbmcuICovXG4gIHJlc2hhcmRpbmc/OiB7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgYXV0b21hdGVkIHJlc2hhcmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgJSBvZiBob3cgZnVsbCBhIHNoYXJkIGlzIHdoZW4gcmVzaGFyZGluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBXZSB1c2UgZGlzY29yZCByZWNvbW1lbmRlZCBzaGFyZCB2YWx1ZSB0byBnZXQgYW4gKiphcHByb3hpbWF0aW9uKiogb2YgdGhlIHNoYXJkIGZ1bGwgcGVyY2VudGFnZSB0byBjb21wYXJlIHdpdGggdGhpcyB2YWx1ZSBzbyB0aGUgYm90IG1heSBub3QgcmVzaGFyZCBhdCB0aGUgZXhhY3QgcGVyY2VudGFnZSBwcm92aWRlZCBidXQgbWF5IHJlc2hhcmQgd2hlbiBpdCBpcyBhIGJpdCBoaWdoZXIgdGhhbiB0aGUgcHJvdmlkZWQgcGVyY2VudGFnZS5cbiAgICAgKiBGb3IgYWNjdXJhdGUgY2FsY3VsYXRpb24sIHlvdSBtYXkgb3ZlcnJpZGUgdGhlIGBjaGVja0lmUmVzaGFyZGluZ0lzTmVlZGVkYCBmdW5jdGlvblxuICAgICAqXG4gICAgICogQGRlZmF1bHQgODAgYXMgaW4gODAlXG4gICAgICovXG4gICAgc2hhcmRzRnVsbFBlcmNlbnRhZ2U6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMsIG9mIGhvdyBvZnRlbiB0byBjaGVjayB3aGV0aGVyIHJlc2hhcmRpbmcgaXMgbmVlZGVkIGFuZCByZXNoYXJkIGF1dG9tYXRpY2FsbHkuIFNldCB0byAtMSB0byBkaXNhYmxlIGF1dG8gcmVzaGFyZGluZy5cbiAgICAgKiBAZGVmYXVsdCAyODgwMDAwMCAoOCBob3VycylcbiAgICAgKi9cbiAgICBjaGVja0ludGVydmFsOiBudW1iZXJcbiAgICAvKiogSGFuZGxlciB0byBnZXQgc2hhcmQgY291bnQgYW5kIG90aGVyIHNlc3Npb24gaW5mby4gKi9cbiAgICBnZXRTZXNzaW9uSW5mbz86ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+PlxuICAgIC8qKiBIYW5kbGVyIHRvIGVkaXQgdGhlIHNoYXJkIGlkIG9uIGFueSBjYWNoZWQgZ3VpbGRzLiAqL1xuICAgIHVwZGF0ZUd1aWxkc1NoYXJkSWQ/OiAoZ3VpbGRJZHM6IHN0cmluZ1tdLCBzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlNYW5hZ2VyIGV4dGVuZHMgUmVxdWlyZWQ8Q3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zPiB7XG4gIC8qKiBUaGUgbWF4IGNvbmN1cnJlbmN5IGJ1Y2tldHMuIFRob3NlIHdpbGwgYmUgY3JlYXRlZCB3aGVuIHRoZSBgc3Bhd25TaGFyZHNgICh3aGljaCBjYWxscyBgcHJlcGFyZUJ1Y2tldHNgIHVuZGVyIHRoZSBob29kKSBmdW5jdGlvbiBnZXRzIGNhbGxlZC4gKi9cbiAgYnVja2V0czogTWFwPFxuICAgIG51bWJlcixcbiAgICB7XG4gICAgICB3b3JrZXJzOiBBcnJheTx7IGlkOiBudW1iZXI7IHF1ZXVlOiBudW1iZXJbXSB9PlxuICAgICAgLyoqIFRoZSBidWNrZXQgdG8gcXVldWUgdGhlIGlkZW50aWZpZXMuICovXG4gICAgICBsZWFreUJ1Y2tldDogTGVha3lCdWNrZXRcbiAgICB9XG4gID5cbiAgLyoqIFRoZSBzaGFyZHMgdGhhdCBhcmUgY3JlYXRlZC4gKi9cbiAgc2hhcmRzOiBNYXA8bnVtYmVyLCBTaGFyZD5cbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBnYXRld2F5IG1hbmFnZXIuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZzogQ3JlYXRlR2F0ZXdheU1hbmFnZXJPcHRpb25zWydyZXNoYXJkaW5nJ10gJiB7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVydmFsIGlkIG9mIHRoZSBjaGVjayBpbnRlcnZhbC4gVGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcnZhbCB3aGVuIHRoZSBtYW5hZ2VyIGlzIHNodXRkb3duLlxuICAgICAqL1xuICAgIGNoZWNrSW50ZXJ2YWxJZD86IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkXG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IENvbGxlY3Rpb248bnVtYmVyLCBTaGFyZD5cbiAgICAvKiogSG9sZHMgdGhlIHBlbmRpbmcgc2hhcmRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFyZSBwZW5kaW5nIGFsbCBzaGFyZHMgZmluaXNoIGxvYWRpbmcuICovXG4gICAgcGVuZGluZ1NoYXJkczogQ29sbGVjdGlvbjxudW1iZXIsIFNoYXJkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNoZWNrIGlmIHJlc2hhcmRpbmcgaXMgbmVjZXNzYXJ5LiAqL1xuICAgIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQ6ICgpID0+IFByb21pc2U8eyBuZWVkZWQ6IGJvb2xlYW47IGluZm8/OiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gfT5cbiAgICAvKiogSGFuZGxlciB0byBiZWdpbiByZXNoYXJkaW5nLiAqL1xuICAgIHJlc2hhcmQ6IChpbmZvOiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gJiB7IGZpcnN0U2hhcmRJZD86IG51bWJlcjsgbGFzdFNoYXJkSWQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgYSBzaGFyZCBuZWVkcyB0byBiZSBjcmVhdGVkLiAqL1xuICAgIHRlbGxXb3JrZXJUb1ByZXBhcmU6ICh3b3JrZXJJZDogbnVtYmVyLCBzaGFyZElkOiBudW1iZXIsIGJ1Y2tldElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgICAvKiogSGFuZGxlciB0byBhbGVydCB0aGUgZ2F0ZXdheSB0aGF0IGEgc2hhcmQocmVzaGFyZGVkKSBpcyBvbmxpbmUuIEl0IHNob3VsZCBub3cgd2FpdCBmb3IgYWxsIHNoYXJkcyB0byBiZSBwZW5kaW5nIGJlZm9yZSBzaHV0dGluZyBvZmYgb2xkIHNoYXJkcy4gKi9cbiAgICBzaGFyZElzUGVuZGluZzogKHNoYXJkOiBTaGFyZCkgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG4gIC8qKiBEZXRlcm1pbmUgbWF4IG51bWJlciBvZiBzaGFyZHMgdG8gdXNlIGJhc2VkIHVwb24gdGhlIG1heCBjb25jdXJyZW5jeS4gKi9cbiAgY2FsY3VsYXRlVG90YWxTaGFyZHM6ICgpID0+IG51bWJlclxuICAvKiogRGV0ZXJtaW5lIHRoZSBpZCBvZiB0aGUgd29ya2VyIHdoaWNoIGlzIGhhbmRsaW5nIGEgc2hhcmQuICovXG4gIGNhbGN1bGF0ZVdvcmtlcklkOiAoc2hhcmRJZDogbnVtYmVyKSA9PiBudW1iZXJcbiAgLyoqIFByZXBhcmVzIGFsbCB0aGUgYnVja2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGlkZW50aWZ5aW5nIHRoZSBzaGFyZHMuICovXG4gIHByZXBhcmVCdWNrZXRzOiAoKSA9PiB2b2lkXG4gIC8qKiBTdGFydCBpZGVudGlmeWluZyBhbGwgdGhlIHNoYXJkcy4gKi9cbiAgc3Bhd25TaGFyZHM6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFNodXRkb3duIGFsbCBzaGFyZHMuICovXG4gIHNodXRkb3duOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZywgY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWw/OiBib29sZWFuKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHNlbmRQYXlsb2FkOiAoc2hhcmRJZDogbnVtYmVyLCBwYXlsb2FkOiBTaGFyZFNvY2tldFJlcXVlc3QpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEFsbG93cyB1c2VycyB0byBob29rIGluIGFuZCBjaGFuZ2UgdG8gY29tbXVuaWNhdGUgdG8gZGlmZmVyZW50IHdvcmtlcnMgYWNyb3NzIGRpZmZlcmVudCBzZXJ2ZXJzIG9yIGFueXRoaW5nIHRoZXkgbGlrZS5cbiAgICogRm9yIGV4YW1wbGUgdXNpbmcgcmVkaXMgcHVic3ViIHRvIHRhbGsgdG8gb3RoZXIgc2VydmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHJldHVybmVkIHByb21pc2VcbiAgICovXG4gIHRlbGxXb3JrZXJUb0lkZW50aWZ5OiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBUZWxsIHRoZSBtYW5hZ2VyIHRvIGlkZW50aWZ5IGEgU2hhcmQuIElmIHRoaXMgU2hhcmQgaXMgbm90IGFscmVhZHkgbWFuYWdlZCB0aGlzIHdpbGwgYWxzbyBhZGQgdGhlIFNoYXJkIHRvIHRoZSBtYW5hZ2VyLiAqL1xuICBpZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogS2lsbCBhIHNoYXJkLiBDbG9zZSBhIHNoYXJkcyBjb25uZWN0aW9uIHRvIERpc2NvcmQncyBnYXRld2F5IChpZiBhbnkpIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbWFuYWdlci4gKi9cbiAga2lsbDogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlIGJ1Y2tldCBpcyBhbGxvd2VkIHRvIG1ha2UgdGhlIG5leHQgaWRlbnRpZnkgcmVxdWVzdC4gKi9cbiAgcmVxdWVzdElkZW50aWZ5OiAoc2hhcmRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2Ygc2hhcmRzIGJhc2VkIG9uIHRoZSBndWlsZCBpZCBhbmQgdG90YWwgc2hhcmRzLiAqL1xuICBjYWxjdWxhdGVTaGFyZElkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0b3RhbFNoYXJkcz86IG51bWJlcikgPT4gbnVtYmVyXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0aGUgYm90IHVzZXIgdG8gYSB2b2ljZSBvciBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBfVXBkYXRlIFZvaWNlIFN0YXRlXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSB2b2ljZSBjaGFubmVsIHRvIGxlYXZlIGlzIGluLlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHlvdSB3YW50IHRvIGpvaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgQ09OTkVDVGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBqb2luVm9pY2VDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IEF0TGVhc3RPbmU8T21pdDxVcGRhdGVWb2ljZVN0YXRlLCAnZ3VpbGRJZCcgfCAnY2hhbm5lbElkJz4+KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90IHN0YXR1cyBpbiBhbGwgc2hhcmRzIHRoYXQgdGhpcyBnYXRld2F5IG1hbmFnZXMuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0Qm90U3RhdHVzOiAoZGF0YTogRGlzY29yZFVwZGF0ZVByZXNlbmNlKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgYm90J3Mgc3RhdHVzIG9uIG9uZSBzaGFyZC5cbiAgICpcbiAgICogQHBhcmFtIHNoYXJkSWQgVGhlIHNoYXJkIGlkIHRvIGVkaXQgdGhlIHN0YXR1cyBmb3IuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzdGF0dXMgZGF0YSB0byBzZXQgdGhlIGJvdHMgc3RhdHVzIHRvLlxuICAgKiBAcmV0dXJucyBub3RoaW5nXG4gICAqL1xuICBlZGl0U2hhcmRTdGF0dXM6IChzaGFyZElkOiBudW1iZXIsIGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvciBhIGd1aWxkIG92ZXIgdGhlIGdhdGV3YXkuIElmIGBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLmVuYWJsZWRgIGlzIG5vdCBzZXQsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkgYW5kIHlvdSdsbCBoYXZlIHRvIGhhbmRsZSB0aGUgYEdVSUxEX01FTUJFUlNfQ0hVTktgIGV2ZW50cyB5b3Vyc2VsZi5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiByZXF1ZXN0aW5nIHRoZSBlbnRpcmUgbWVtYmVyIGxpc3Q6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBHVUlMRF9NRU1CRVJTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgcHJlc2VuY2VzICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5wcmVzZW5jZXMgfCBwcmVzZW5jZXN9IHNldCB0byBgdHJ1ZWApOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfUFJFU0VOQ0VTYCBpbnRlbnQuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSBwcmVmaXggKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnF1ZXJ5IHwgcXVlcnl9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIElmIHJlcXVlc3RpbmcgYSB1c2VycyBieSBJRCAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMudXNlcklkcyB8IHVzZXJJZHN9IG5vbi1gdW5kZWZpbmVkYCk6XG4gICAqIC0gUmV0dXJucyBhIG1heGltdW0gb2YgMTAwIG1lbWJlcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlcnMgQ2h1bmtfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IDEwMDAgbWVtYmVycyBmZXRjaGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXF1ZXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqL1xuICByZXF1ZXN0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IE9taXQ8UmVxdWVzdEd1aWxkTWVtYmVycywgJ2d1aWxkSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gIC8qKlxuICAgKiBMZWF2ZXMgdGhlIHZvaWNlIGNoYW5uZWwgdGhlIGJvdCB1c2VyIGlzIGN1cnJlbnRseSBpbi5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfVm9pY2UgU3RhdGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSN1cGRhdGUtdm9pY2Utc3RhdGV9XG4gICAqL1xuICBsZWF2ZVZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogVXNlZCB0byByZXF1ZXN0IHNvdW5kYm9hcmQgc291bmRzIGZvciBhIGxpc3Qgb2YgZ3VpbGRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIG11bHRpcGxlIChzZWUgcmVtYXJrcykgX1JlcXVlc3QgU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZHMgLSBUaGUgZ3VpbGRzIHRvIGdldCB0aGUgc291bmRzIGZyb21cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfU291bmRib2FyZCBTb3VuZHNfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIOKaoO+4jyBEaXNjb3JkIHdpbGwgc2VuZCB0aGUgX1NvdW5kYm9hcmQgU291bmRzXyBmb3IgZWFjaCBvZiB0aGUgZ3VpbGQgaWRzXG4gICAqIGhvd2V2ZXIgeW91IG1heSBub3QgcmVjZWl2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZXZlbnRzIGFzIHRoZSBpZHMgcGFzc2VkIHRvIF9SZXF1ZXN0IFNvdW5kYm9hcmQgU291bmRzXyBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcbiAgICogLSBUaGUgYm90IGlzIG5vdCBpbiB0aGUgc2VydmVyIHByb3ZpZGVkXG4gICAqIC0gVGhlIHNoYXJkIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHNlbnQgZnJvbSBkb2VzIG5vdCByZWNlaXZlIGV2ZW50cyBmb3IgdGhlIHNwZWNpZmllZCBndWlsZFxuICAgKlxuICAgKiBUbyBhdm9pZCB0aGlzIERpc2NvcmRlbm8gd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBncm91cCB0aGUgaWRzIGJhc2VkIG9uIHdoYXQgc2hhcmQgdGhleSB3aWxsIG5lZWQgdG8gYmUgc2VudCwgYnV0IHRoaXMgaW52b2x2ZXMgc2VuZGluZyBtdWx0aXBsZSBtZXNzYWdlcyBpbiBtdWx0aXBsZSBzaGFyZHNcbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXktZXZlbnRzI3JlcXVlc3Qtc291bmRib2FyZC1zb3VuZHN9XG4gICAqL1xuICByZXF1ZXN0U291bmRib2FyZFNvdW5kczogKGd1aWxkSWRzOiBCaWdTdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhpcyBtYW5hZ2VycyBjYWNoZSByZWxhdGVkIHNldHRpbmdzLiAqL1xuICBjYWNoZToge1xuICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgb3Igbm90IHJlcXVlc3QgbWVtYmVyIHJlcXVlc3RzIHNob3VsZCBiZSBjYWNoZWQuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBlbmFibGVkOiBib29sZWFuXG4gICAgICAvKiogVGhlIHBlbmRpbmcgcmVxdWVzdHMuICovXG4gICAgICBwZW5kaW5nOiBDb2xsZWN0aW9uPHN0cmluZywgUmVxdWVzdE1lbWJlclJlcXVlc3Q+XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE1lbWJlclJlcXVlc3Qge1xuICAvKiogVGhlIHVuaXF1ZSBub25jZSBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBub25jZTogc3RyaW5nXG4gIC8qKiBUaGUgcmVzb2x2ZXIgaGFuZGxlciB0byBydW4gd2hlbiBhbGwgbWVtYmVycyBhcnJpdmUuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogQ2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+IHwgUHJvbWlzZUxpa2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PikgPT4gdm9pZFxuICAvKiogVGhlIG1lbWJlcnMgdGhhdCBoYXZlIGFscmVhZHkgYXJyaXZlZCBmb3IgdGhpcyByZXF1ZXN0LiAqL1xuICBtZW1iZXJzOiBEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbUJ5dGVzIiwiR2F0ZXdheUludGVudHMiLCJHYXRld2F5T3Bjb2RlcyIsIkNvbGxlY3Rpb24iLCJMZWFreUJ1Y2tldCIsImpzb25TYWZlUmVwbGFjZXIiLCJsb2dnZXIiLCJTaGFyZCIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsImNyZWF0ZUdhdGV3YXlNYW5hZ2VyIiwib3B0aW9ucyIsImNvbm5lY3Rpb25PcHRpb25zIiwiY29ubmVjdGlvbiIsInVybCIsInNoYXJkcyIsInNlc3Npb25TdGFydExpbWl0IiwibWF4Q29uY3VycmVuY3kiLCJyZW1haW5pbmciLCJ0b3RhbCIsInJlc2V0QWZ0ZXIiLCJnYXRld2F5IiwiZXZlbnRzIiwiY29tcHJlc3MiLCJ0cmFuc3BvcnRDb21wcmVzc2lvbiIsImludGVudHMiLCJwcm9wZXJ0aWVzIiwib3MiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJicm93c2VyIiwiZGV2aWNlIiwidG9rZW4iLCJ2ZXJzaW9uIiwidG90YWxTaGFyZHMiLCJsYXN0U2hhcmRJZCIsImZpcnN0U2hhcmRJZCIsInRvdGFsV29ya2VycyIsInNoYXJkc1BlcldvcmtlciIsInNwYXduU2hhcmREZWxheSIsInNwcmVhZFNoYXJkc0luUm91bmRSb2JpbiIsInByZWZlclNuYWtlQ2FzZSIsIk1hcCIsImJ1Y2tldHMiLCJjYWNoZSIsInJlcXVlc3RNZW1iZXJzIiwiZW5hYmxlZCIsInBlbmRpbmciLCJtYWtlUHJlc2VuY2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuZGVmaW5lZCIsInJlc2hhcmRpbmciLCJzaGFyZHNGdWxsUGVyY2VudGFnZSIsImNoZWNrSW50ZXJ2YWwiLCJwZW5kaW5nU2hhcmRzIiwiZ2V0U2Vzc2lvbkluZm8iLCJ1cGRhdGVHdWlsZHNTaGFyZElkIiwiY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCIsImRlYnVnIiwibmVlZGVkIiwiRXJyb3IiLCJzZXNzaW9uSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbmZvIiwicGVyY2VudGFnZSIsInJlc2hhcmQiLCJjYWxjdWxhdGVUb3RhbFNoYXJkcyIsImNsZWFyIiwicHJlcGFyZUJ1Y2tldHMiLCJmb3JFYWNoIiwiYnVja2V0IiwiYnVja2V0SWQiLCJ3b3JrZXIiLCJ3b3JrZXJzIiwic2hhcmRJZCIsInF1ZXVlIiwidGVsbFdvcmtlclRvUHJlcGFyZSIsImlkIiwid29ya2VySWQiLCJzaGFyZCIsIm1lc3NhZ2UiLCJfc2hhcmQiLCJwYXlsb2FkIiwidCIsImQiLCJndWlsZHMiLCJtYXAiLCJnIiwicmVxdWVzdElkZW50aWZ5IiwiZm9yd2FyZFRvQm90Iiwic2V0IiwiZ2V0IiwiaWRlbnRpZnkiLCJ0aGVuIiwic2hhcmRJc1BlbmRpbmciLCJzaXplIiwidmFsdWVzIiwiZXZlbnQiLCJvbGRIYW5kbGVyIiwiXyIsInNodXRkb3duIiwiUmVzaGFyZGVkIiwiTWF0aCIsImNlaWwiLCJjYWxjdWxhdGVXb3JrZXJJZCIsIm1pbiIsImZsb29yIiwiaSIsImxlYWt5QnVja2V0IiwibWF4IiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJmaW5kIiwidyIsInB1c2giLCJzcGF3blNoYXJkcyIsInByb21pc2VzIiwiZW50cmllcyIsInRlbGxXb3JrZXJUb0lkZW50aWZ5IiwiYWxsIiwiY2xlYXJJbnRlcnZhbCIsImNoZWNrSW50ZXJ2YWxJZCIsIndhcm4iLCJzZXRJbnRlcnZhbCIsInJlc2hhcmRpbmdJbmZvIiwiY29kZSIsInJlYXNvbiIsImNsZWFyUmVzaGFyZGluZ0ludGVydmFsIiwiQXJyYXkiLCJmcm9tIiwiY2xvc2UiLCJzZW5kUGF5bG9hZCIsInNlbmQiLCJhY3F1aXJlIiwia2lsbCIsImRlbGV0ZSIsImNhbGN1bGF0ZVNoYXJkSWQiLCJndWlsZElkIiwiTnVtYmVyIiwiQmlnSW50Iiwiam9pblZvaWNlQ2hhbm5lbCIsImNoYW5uZWxJZCIsIm9wIiwiVm9pY2VTdGF0ZVVwZGF0ZSIsImd1aWxkX2lkIiwidG9TdHJpbmciLCJjaGFubmVsX2lkIiwic2VsZl9tdXRlIiwic2VsZk11dGUiLCJzZWxmX2RlYWYiLCJzZWxmRGVhZiIsImVkaXRCb3RTdGF0dXMiLCJkYXRhIiwiZWRpdFNoYXJkU3RhdHVzIiwiUHJlc2VuY2VVcGRhdGUiLCJzaW5jZSIsImFmayIsImFjdGl2aXRpZXMiLCJzdGF0dXMiLCJsaW1pdCIsIkd1aWxkTWVtYmVycyIsInVzZXJJZHMiLCJsZW5ndGgiLCJub25jZSIsImhhcyIsIm1lbWJlcnMiLCJyZWplY3QiLCJSZXF1ZXN0R3VpbGRNZW1iZXJzIiwicXVlcnkiLCJwcmVzZW5jZXMiLCJ1c2VyX2lkcyIsImxlYXZlVm9pY2VDaGFubmVsIiwicmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZElkcyIsImlkcyIsIlJlcXVlc3RTb3VuZGJvYXJkU291bmRzIiwiZ3VpbGRfaWRzIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXLFFBQVEsY0FBYTtBQUN6QyxTQVFFQyxjQUFjLEVBQ2RDLGNBQWMsUUFFVCxvQkFBbUI7QUFDMUIsU0FBU0MsVUFBVSxFQUFFQyxXQUFXLEVBQUVDLGdCQUFnQixFQUFFQyxNQUFNLFFBQVEsb0JBQW1CO0FBQ3JGLE9BQU9DLFdBQVcsYUFBWTtBQUM5QixTQUEyQkMscUJBQXFCLFFBQW1GLGFBQVk7QUFFL0ksT0FBTyxTQUFTQyxxQkFBcUJDLE9BQW9DO0lBQ3ZFLE1BQU1DLG9CQUFvQkQsUUFBUUUsVUFBVSxJQUFJO1FBQzlDQyxLQUFLO1FBQ0xDLFFBQVE7UUFDUkMsbUJBQW1CO1lBQ2pCQyxnQkFBZ0I7WUFDaEJDLFdBQVc7WUFDWEMsT0FBTztZQUNQQyxZQUFZLE9BQU8sS0FBSyxLQUFLO1FBQy9CO0lBQ0Y7SUFFQSxNQUFNQyxVQUEwQjtRQUM5QkMsUUFBUVgsUUFBUVcsTUFBTSxJQUFJLENB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
464
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQge1xuICB0eXBlIEF0TGVhc3RPbmUsXG4gIHR5cGUgQmlnU3RyaW5nLFxuICB0eXBlIENhbWVsaXplLFxuICB0eXBlIERpc2NvcmRHZXRHYXRld2F5Qm90LFxuICB0eXBlIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgdHlwZSBEaXNjb3JkUmVhZHksXG4gIHR5cGUgRGlzY29yZFVwZGF0ZVByZXNlbmNlLFxuICBHYXRld2F5SW50ZW50cyxcbiAgR2F0ZXdheU9wY29kZXMsXG4gIHR5cGUgUmVxdWVzdEd1aWxkTWVtYmVycyxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBMZWFreUJ1Y2tldCwganNvblNhZmVSZXBsYWNlciwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgU2hhcmQgZnJvbSAnLi9TaGFyZC5qcydcbmltcG9ydCB7IHR5cGUgU2hhcmRFdmVudHMsIFNoYXJkU29ja2V0Q2xvc2VDb2RlcywgdHlwZSBTaGFyZFNvY2tldFJlcXVlc3QsIHR5cGUgVHJhbnNwb3J0Q29tcHJlc3Npb24sIHR5cGUgVXBkYXRlVm9pY2VTdGF0ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHYXRld2F5TWFuYWdlcihvcHRpb25zOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMpOiBHYXRld2F5TWFuYWdlciB7XG4gIGNvbnN0IGNvbm5lY3Rpb25PcHRpb25zID0gb3B0aW9ucy5jb25uZWN0aW9uID8/IHtcbiAgICB1cmw6ICd3c3M6Ly9nYXRld2F5LmRpc2NvcmQuZ2cnLFxuICAgIHNoYXJkczogMSxcbiAgICBzZXNzaW9uU3RhcnRMaW1pdDoge1xuICAgICAgbWF4Q29uY3VycmVuY3k6IDEsXG4gICAgICByZW1haW5pbmc6IDEwMDAsXG4gICAgICB0b3RhbDogMTAwMCxcbiAgICAgIHJlc2V0QWZ0ZXI6IDEwMDAgKiA2MCAqIDYwICogMjQsXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IGdhdGV3YXk6IEdhdGV3YXlNYW5hZ2VyID0ge1xuICAgIGV2ZW50czogb3B0aW9ucy5ldmVudHMgPz8ge30sXG4gICAgY29tcHJlc3M6IG9wdGlvbnMuY29tcHJlc3MgPz8gZmFsc2UsXG4gICAgdHJhbnNwb3J0Q29tcHJlc3Npb246IG9wdGlvbnMudHJhbnNwb3J0Q29tcHJlc3Npb24gPz8gbnVsbCxcbiAgICBpbnRlbnRzOiBvcHRpb25zLmludGVudHMgPz8gMCxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBvczogb3B0aW9ucy5wcm9wZXJ0aWVzPy5vcyA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYnJvd3Nlcjogb3B0aW9ucy5wcm9wZXJ0aWVzPy5icm93c2VyID8/ICdEaXNjb3JkZW5vJyxcbiAgICAgIGRldmljZTogb3B0aW9ucy5wcm9wZXJ0aWVzPy5kZXZpY2UgPz8gJ0Rpc2NvcmRlbm8nLFxuICAgIH0sXG4gICAgdG9rZW46IG9wdGlvbnMudG9rZW4sXG4gICAgdXJsOiBvcHRpb25zLnVybCA/PyBjb25uZWN0aW9uT3B0aW9ucy51cmwgPz8gJ3dzczovL2dhdGV3YXkuZGlzY29yZC5nZycsXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25PcHRpb25zLFxuICAgIHRvdGFsU2hhcmRzOiBvcHRpb25zLnRvdGFsU2hhcmRzID8/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyA/PyAxLFxuICAgIGxhc3RTaGFyZElkOiBvcHRpb25zLmxhc3RTaGFyZElkID8/IChvcHRpb25zLnRvdGFsU2hhcmRzID8gb3B0aW9ucy50b3RhbFNoYXJkcyAtIDEgOiBjb25uZWN0aW9uT3B0aW9ucyA/IGNvbm5lY3Rpb25PcHRpb25zLnNoYXJkcyAtIDEgOiAwKSxcbiAgICBmaXJzdFNoYXJkSWQ6IG9wdGlvbnMuZmlyc3RTaGFyZElkID8/IDAsXG4gICAgdG90YWxXb3JrZXJzOiBvcHRpb25zLnRvdGFsV29ya2VycyA/PyA0LFxuICAgIHNoYXJkc1Blcldvcmtlcjogb3B0aW9ucy5zaGFyZHNQZXJXb3JrZXIgPz8gMjUsXG4gICAgc3Bhd25TaGFyZERlbGF5OiBvcHRpb25zLnNwYXduU2hhcmREZWxheSA/PyA1MzAwLFxuICAgIHNwcmVhZFNoYXJkc0luUm91bmRSb2Jpbjogb3B0aW9ucy5zcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4gPz8gZmFsc2UsXG4gICAgcHJlZmVyU25ha2VDYXNlOiBvcHRpb25zLnByZWZlclNuYWtlQ2FzZSA/PyBmYWxzZSxcbiAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICBidWNrZXRzOiBuZXcgTWFwKCksXG4gICAgY2FjaGU6IHtcbiAgICAgIHJlcXVlc3RNZW1iZXJzOiB7XG4gICAgICAgIGVuYWJsZWQ6IG9wdGlvbnMuY2FjaGU/LnJlcXVlc3RNZW1iZXJzPy5lbmFibGVkID8/IGZhbHNlLFxuICAgICAgICBwZW5kaW5nOiBuZXcgQ29sbGVjdGlvbigpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuICAgIG1ha2VQcmVzZW5jZTogb3B0aW9ucy5tYWtlUHJlc2VuY2UgPz8gKCgpID0+IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpKSxcbiAgICByZXNoYXJkaW5nOiB7XG4gICAgICBlbmFibGVkOiBvcHRpb25zLnJlc2hhcmRpbmc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNoYXJkc0Z1bGxQZXJjZW50YWdlOiBvcHRpb25zLnJlc2hhcmRpbmc/LnNoYXJkc0Z1bGxQZXJjZW50YWdlID8/IDgwLFxuICAgICAgY2hlY2tJbnRlcnZhbDogb3B0aW9ucy5yZXNoYXJkaW5nPy5jaGVja0ludGVydmFsID8/IDI4ODAwMDAwLCAvLyA4IGhvdXJzXG4gICAgICBzaGFyZHM6IG5ldyBNYXAoKSxcbiAgICAgIGdldFNlc3Npb25JbmZvOiBvcHRpb25zLnJlc2hhcmRpbmc/LmdldFNlc3Npb25JbmZvLFxuICAgICAgdXBkYXRlR3VpbGRzU2hhcmRJZDogb3B0aW9ucy5yZXNoYXJkaW5nPy51cGRhdGVHdWlsZHNTaGFyZElkLFxuICAgICAgYXN5bmMgY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCgpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBDaGVja2luZyBpZiByZXNoYXJkaW5nIGlzIG5lZWRlZC4nKVxuXG4gICAgICAgIGlmICghZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZGlzYWJsZWQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFnYXRld2F5LnJlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbUmVzaGFyZGluZ10gUmVzaGFyZGluZyBpcyBlbmFibGVkIGJ1dCBubyAncmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbygpJyBpcyBub3QgcHJvdmlkZWQuXCIpXG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZC4nKVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25JbmZvID0gYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLmdldFNlc3Npb25JbmZvKClcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNlc3Npb24gaW5mbyByZXRyaWV2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkluZm8pfWApXG5cbiAgICAgICAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2ggaWRlbnRpZnkgbGltaXRzIHRvIHRyeSByZXNoYXJkaW5nXG4gICAgICAgIGlmIChzZXNzaW9uSW5mby5zZXNzaW9uU3RhcnRMaW1pdC5yZW1haW5pbmcgPCBzZXNzaW9uSW5mby5zaGFyZHMpIHtcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIE5vdCBlbm91Z2ggc2Vzc2lvbiBzdGFydCBsaW1pdHMgbGVmdCB0byByZXNoYXJkLicpXG5cbiAgICAgICAgICByZXR1cm4geyBuZWVkZWQ6IGZhbHNlLCBpbmZvOiBzZXNzaW9uSW5mbyB9XG4gICAgICAgIH1cblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZygnW1Jlc2hhcmRpbmddIEFibGUgdG8gcmVzaGFyZCwgY2hlY2tpbmcgd2hldGhlciBuZWNlc3Nhcnkgbm93LicpXG5cbiAgICAgICAgLy8gMjUwMCBpcyB0aGUgbWF4IGFtb3VudCBvZiBndWlsZHMgYSBzaW5nbGUgc2hhcmQgY2FuIGhhbmRsZVxuICAgICAgICAvLyAxMDAwIGlzIHRoZSBhbW91bnQgb2YgZ3VpbGRzIGRpc2NvcmQgdXNlcyB0byBkZXRlcm1pbmUgaG93IG1hbnkgc2hhcmRzIHRvIHJlY29tbWVuZC5cbiAgICAgICAgLy8gVGhpcyBhbGdvIGhlbHBzIGNoZWNrIGlmIHlvdXIgYm90IGhhcyBncm93biBlbm91Z2ggdG8gcmVzaGFyZC5cbiAgICAgICAgLy8gV2hpbGUgdGhpcyBpcyBpbXByZWNpc2UgYXMgZGlzY29yZCBjaGFuZ2VzIHRoZSByZWNvbW1lbmRlZCBudW1iZXIgb2Ygc2hhcmQgZXZlcnkgMTAwMCBndWlsZHMgaXQgaXMgZ29vZCBlbm91Z2hcbiAgICAgICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHN0b3JlIHRoZSBndWlsZCBjb3VudCBmb3IgZWFjaCBzaGFyZCBhbmQgcmVxdWlyZSB0aGUgR3VpbGRzIGludGVudCBmb3IgYEdVSUxEX0NSRUFURWAgYW5kIGBHVUlMRF9ERUxFVEVgIGV2ZW50c1xuICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKHNlc3Npb25JbmZvLnNoYXJkcyAvICgoZ2F0ZXdheS50b3RhbFNoYXJkcyAqIDI1MDApIC8gMTAwMCkpICogMTAwXG5cbiAgICAgICAgLy8gTGVzcyB0aGFuIG5lY2Vzc2FyeSUgYmVpbmcgdXNlZCBzbyBkbyBub3RoaW5nXG4gICAgICAgIGlmIChwZXJjZW50YWdlIDwgZ2F0ZXdheS5yZXNoYXJkaW5nLnNoYXJkc0Z1bGxQZXJjZW50YWdlKSB7XG4gICAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIG5vdCBuZWVkZWQuJylcblxuICAgICAgICAgIHJldHVybiB7IG5lZWRlZDogZmFsc2UsIGluZm86IHNlc3Npb25JbmZvIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oJ1tSZXNoYXJkaW5nXSBSZXNoYXJkaW5nIGlzIG5lZWRlZC4nKVxuXG4gICAgICAgIHJldHVybiB7IG5lZWRlZDogdHJ1ZSwgaW5mbzogc2Vzc2lvbkluZm8gfVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHJlc2hhcmQoaW5mbykge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gU3RhcnRpbmcgdGhlIHJlc2hhcmQgcHJvY2Vzcy4gUHJldmlvdXMgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcbiAgICAgICAgLy8gU2V0IHZhbHVlcyBvbiBnYXRld2F5XG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBpbmZvLnNoYXJkc1xuICAgICAgICAvLyBIYW5kbGVzIHByZXBhcmluZyBtaWQgc2l6ZWQgYm90cyBmb3IgTEJTXG4gICAgICAgIGdhdGV3YXkudG90YWxTaGFyZHMgPSBnYXRld2F5LmNhbGN1bGF0ZVRvdGFsU2hhcmRzKClcbiAgICAgICAgLy8gU2V0IGZpcnN0IHNoYXJkIGlkIGlmIHByb3ZpZGVkIGluIGluZm9cbiAgICAgICAgaWYgKHR5cGVvZiBpbmZvLmZpcnN0U2hhcmRJZCA9PT0gJ251bWJlcicpIGdhdGV3YXkuZmlyc3RTaGFyZElkID0gaW5mby5maXJzdFNoYXJkSWRcbiAgICAgICAgLy8gU2V0IGxhc3Qgc2hhcmQgaWQgaWYgcHJvdmlkZWQgaW4gaW5mb1xuICAgICAgICBpZiAodHlwZW9mIGluZm8ubGFzdFNoYXJkSWQgPT09ICdudW1iZXInKSBnYXRld2F5Lmxhc3RTaGFyZElkID0gaW5mby5sYXN0U2hhcmRJZFxuICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZ2V0IGFueSBsYXN0U2hhcmRJZCwgd2UgYXNzdW1lIGFsbCB0aGUgc2hhcmRzIGFyZSB0byBiZSB1c2VkXG4gICAgICAgIGVsc2UgZ2F0ZXdheS5sYXN0U2hhcmRJZCA9IGdhdGV3YXkudG90YWxTaGFyZHMgLSAxXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTdGFydGluZyB0aGUgcmVzaGFyZCBwcm9jZXNzLiBOZXcgdG90YWwgc2hhcmRzOiAke2dhdGV3YXkudG90YWxTaGFyZHN9YClcblxuICAgICAgICAvLyBSZXNldHRpbmcgYnVja2V0c1xuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuY2xlYXIoKVxuICAgICAgICAvLyBSZWZpbGxpbmcgYnVja2V0cyB3aXRoIG5ldyB2YWx1ZXNcbiAgICAgICAgZ2F0ZXdheS5wcmVwYXJlQnVja2V0cygpXG5cbiAgICAgICAgLy8gQ2FsbCBhbGwgdGhlIGJ1Y2tldHMgYW5kIHRlbGwgdGhlaXIgd29ya2VycyAmIHNoYXJkcyB0byBpZGVudGlmeVxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20oZ2F0ZXdheS5idWNrZXRzLmVudHJpZXMoKSkubWFwKGFzeW5jIChbYnVja2V0SWQsIGJ1Y2tldF0pID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiBidWNrZXQud29ya2Vycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzaGFyZElkIG9mIHdvcmtlci5xdWV1ZSkge1xuICAgICAgICAgICAgICBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcudGVsbFdvcmtlclRvUHJlcGFyZSh3b3JrZXIuaWQsIHNoYXJkSWQsIGJ1Y2tldElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5pbmZvKGBbUmVzaGFyZGluZ10gQWxsIHNoYXJkcyBhcmUgbm93IG9ubGluZS5gKVxuXG4gICAgICAgIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5vblJlc2hhcmRpbmdTd2l0Y2goKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHRlbGxXb3JrZXJUb1ByZXBhcmUod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gVGVsbGluZyB3b3JrZXIgdG8gcHJlcGFyZS4gV29ya2VyOiAke3dvcmtlcklkfSB8IFNoYXJkOiAke3NoYXJkSWR9IHwgQnVja2V0OiAke2J1Y2tldElkfS5gKVxuICAgICAgICBjb25zdCBzaGFyZCA9IG5ldyBTaGFyZCh7XG4gICAgICAgICAgaWQ6IHNoYXJkSWQsXG4gICAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgICAgY29tcHJlc3M6IGdhdGV3YXkuY29tcHJlc3MsXG4gICAgICAgICAgICB0cmFuc3BvcnRDb21wcmVzc2lvbjogZ2F0ZXdheS50cmFuc3BvcnRDb21wcmVzc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgaW50ZW50czogZ2F0ZXdheS5pbnRlbnRzLFxuICAgICAgICAgICAgcHJvcGVydGllczogZ2F0ZXdheS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdG9rZW46IGdhdGV3YXkudG9rZW4sXG4gICAgICAgICAgICB0b3RhbFNoYXJkczogZ2F0ZXdheS50b3RhbFNoYXJkcyxcbiAgICAgICAgICAgIHVybDogZ2F0ZXdheS51cmwsXG4gICAgICAgICAgICB2ZXJzaW9uOiBnYXRld2F5LnZlcnNpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIGFzeW5jIG1lc3NhZ2UoX3NoYXJkLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBhbGwgZXZlbnRzIHVudGlsIHdlIHN3aWNoIGZyb20gdGhlIG9sZCBzaGFyZHMgdG8gdGhlIG5ldyBvbmVzLlxuICAgICAgICAgICAgICBpZiAocGF5bG9hZC50ID09PSAnUkVBRFknKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2F0ZXdheS5yZXNoYXJkaW5nLnVwZGF0ZUd1aWxkc1NoYXJkSWQ/LihcbiAgICAgICAgICAgICAgICAgIChwYXlsb2FkLmQgYXMgRGlzY29yZFJlYWR5KS5ndWlsZHMubWFwKChnKSA9PiBnLmlkKSxcbiAgICAgICAgICAgICAgICAgIHNoYXJkSWQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9nZ2VyOiBnYXRld2F5LmxvZ2dlcixcbiAgICAgICAgICByZXF1ZXN0SWRlbnRpZnk6IGFzeW5jICgpID0+IGF3YWl0IGdhdGV3YXkucmVxdWVzdElkZW50aWZ5KHNoYXJkSWQpLFxuICAgICAgICAgIG1ha2VQcmVzZW5jZTogZ2F0ZXdheS5tYWtlUHJlc2VuY2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGdhdGV3YXkucHJlZmVyU25ha2VDYXNlKSB7XG4gICAgICAgICAgc2hhcmQuZm9yd2FyZFRvQm90ID0gYXN5bmMgKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHNoYXJkLmV2ZW50cz8ubWVzc2FnZT8uKHNoYXJkLCBwYXlsb2FkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuXG4gICAgICAgIGF3YWl0IHNoYXJkLmlkZW50aWZ5KClcblxuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW1Jlc2hhcmRpbmddIFNoYXJkICMke3NoYXJkSWR9IGlkZW50aWZpZWQuYClcbiAgICAgIH0sXG4gICAgICBhc3luYyBvblJlc2hhcmRpbmdTd2l0Y2goKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbUmVzaGFyZGluZ10gTWFraW5nIHRoZSBzd2l0Y2ggZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXMuYClcblxuICAgICAgICAvLyBNb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb2xkIHNoYXJkcyB0byB0aGUgbmV3IG9uZXNcbiAgICAgICAgZm9yIChjb25zdCBzaGFyZCBvZiBnYXRld2F5LnJlc2hhcmRpbmcuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0gb3B0aW9ucy5ldmVudHMgPz8ge31cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9sZCBzaGFyZHMgc3RvcCBwcm9jZXNzaW5nIGV2ZW50c1xuICAgICAgICBmb3IgKGNvbnN0IHNoYXJkIG9mIGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkSGFuZGxlciA9IHNoYXJkLmV2ZW50cy5tZXNzYWdlXG5cbiAgICAgICAgICAvLyBDaGFuZ2Ugd2l0aCBzcHJlYWQgb3BlcmF0b3IgdG8gbm90IGFmZmVjdCBuZXcgc2hhcmRzLCBhcyBjaGFuZ2luZyBhbnl0aGluZyBvbiBzaGFyZC5ldmVudHMgd2lsbCBkaXJlY3RseSBjaGFuZ2Ugb3B0aW9ucy5ldmVudHMsIHdoaWNoIGNoYW5nZXMgbmV3IHNoYXJkcycgZXZlbnRzXG4gICAgICAgICAgc2hhcmQuZXZlbnRzID0ge1xuICAgICAgICAgICAgLi4uc2hhcmQuZXZlbnRzLFxuICAgICAgICAgICAgbWVzc2FnZTogYXN5bmMgZnVuY3Rpb24gKF8sIG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgLy8gTWVtYmVyIGNoZWNrcyBuZWVkIHRvIGNvbnRpbnVlIGJ1dCBvdGhlcnMgY2FuIHN0b3BcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudCA9PT0gJ0dVSUxEX01FTUJFUlNfQ0hVTksnKSB7XG4gICAgICAgICAgICAgICAgb2xkSGFuZGxlcj8uKHNoYXJkLCBtZXNzYWdlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBTaHV0dGluZyBkb3duIG9sZCBzaGFyZHMuYClcbiAgICAgICAgYXdhaXQgZ2F0ZXdheS5zaHV0ZG93bihTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkLCAnUmVzaGFyZGVkIScsIGZhbHNlKVxuXG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmluZm8oYFtSZXNoYXJkaW5nXSBDb21wbGV0ZWQuYClcbiAgICAgICAgZ2F0ZXdheS5zaGFyZHMgPSBuZXcgTWFwKGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMpXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5zaGFyZHMuY2xlYXIoKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgY2FsY3VsYXRlVG90YWxTaGFyZHMoKSB7XG4gICAgICAvLyBCb3RzIHVuZGVyIDEwMGsgc2VydmVycyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gTEJTLlxuICAgICAgaWYgKGdhdGV3YXkudG90YWxTaGFyZHMgPCAxMDApIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBDYWxjdWxhdGluZyB0b3RhbCBzaGFyZHM6ICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICByZXR1cm4gZ2F0ZXdheS50b3RhbFNoYXJkc1xuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIENhbGN1bGF0aW5nIHRvdGFsIHNoYXJkc2AsIGdhdGV3YXkudG90YWxTaGFyZHMsIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSlcbiAgICAgIC8vIENhbGN1bGF0ZSBhIG11bHRpcGxlIG9mIGBtYXhDb25jdXJyZW5jeWAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZ2F0ZXdheS5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIE1hdGguY2VpbChcbiAgICAgICAgICBnYXRld2F5LnRvdGFsU2hhcmRzIC9cbiAgICAgICAgICAgIC8vIElmIGBtYXhDb25jdXJyZW5jeWAgaXMgMSwgd2UgY2FuIHNhZmVseSB1c2UgMTYgdG8gZ2V0IGB0b3RhbFNoYXJkc2AgdG8gYmUgaW4gYSBtdWx0aXBsZSBvZiAxNiBzbyB0aGF0IHdlIGNhbiBwcmVwYXJlIGJvdHMgd2l0aCAxMDBrIHNlcnZlcnMgZm9yIExCUy5cbiAgICAgICAgICAgIChnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kgPT09IDEgPyAxNiA6IGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSksXG4gICAgICAgICkgKiAoZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5ID09PSAxID8gMTYgOiBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG4gICAgICApXG4gICAgfSxcbiAgICBjYWxjdWxhdGVXb3JrZXJJZChzaGFyZElkKSB7XG4gICAgICBjb25zdCB3b3JrZXJJZCA9IG9wdGlvbnMuc3ByZWFkU2hhcmRzSW5Sb3VuZFJvYmluXG4gICAgICAgID8gc2hhcmRJZCAlIGdhdGV3YXkudG90YWxXb3JrZXJzXG4gICAgICAgIDogTWF0aC5taW4oTWF0aC5mbG9vcihzaGFyZElkIC8gZ2F0ZXdheS5zaGFyZHNQZXJXb3JrZXIpLCBnYXRld2F5LnRvdGFsV29ya2VycyAtIDEpXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFtHYXRld2F5XSBDYWxjdWxhdGluZyB3b3JrZXJJZDogU2hhcmQ6ICR7c2hhcmRJZH0gLT4gV29ya2VyOiAke3dvcmtlcklkfSAtPiBQZXIgV29ya2VyOiAke2dhdGV3YXkuc2hhcmRzUGVyV29ya2VyfSAtPiBUb3RhbDogJHtnYXRld2F5LnRvdGFsV29ya2Vyc31gLFxuICAgICAgKVxuICAgICAgcmV0dXJuIHdvcmtlcklkXG4gICAgfSxcbiAgICBwcmVwYXJlQnVja2V0cygpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5OyArK2kpIHtcbiAgICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBQcmVwYXJpbmcgYnVja2V0cyBmb3IgY29uY3VycmVuY3k6ICR7aX1gKVxuICAgICAgICBnYXRld2F5LmJ1Y2tldHMuc2V0KGksIHtcbiAgICAgICAgICB3b3JrZXJzOiBbXSxcbiAgICAgICAgICBsZWFreUJ1Y2tldDogbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogMSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiBnYXRld2F5LnNwYXduU2hhcmREZWxheSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIE9yZ2FuaXplIGFsbCBzaGFyZHMgaW50byB0aGVpciBvd24gYnVja2V0c1xuICAgICAgZm9yIChsZXQgc2hhcmRJZCA9IGdhdGV3YXkuZmlyc3RTaGFyZElkOyBzaGFyZElkIDw9IGdhdGV3YXkubGFzdFNoYXJkSWQ7ICsrc2hhcmRJZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFByZXBhcmluZyBidWNrZXRzIGZvciBzaGFyZDogJHtzaGFyZElkfWApXG5cbiAgICAgICAgaWYgKHNoYXJkSWQgPj0gZ2F0ZXdheS50b3RhbFNoYXJkcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBpcyBiaWdnZXIgb3IgZXF1YWwgdG8gdGhlIHVzZWQgYW1vdW50IG9mIHVzZWQgc2hhcmRzIHdoaWNoIGlzICR7Z2F0ZXdheS50b3RhbFNoYXJkc31gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVja2V0SWQgPSBzaGFyZElkICUgZ2F0ZXdheS5jb25uZWN0aW9uLnNlc3Npb25TdGFydExpbWl0Lm1heENvbmN1cnJlbmN5XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IGdhdGV3YXkuYnVja2V0cy5nZXQoYnVja2V0SWQpXG5cbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2hhcmQgKGlkOiAke3NoYXJkSWR9KSBnb3QgYXNzaWduZWQgdG8gYW4gaWxsZWdhbCBidWNrZXQgaWQ6ICR7YnVja2V0SWR9LCBleHBlY3RlZCBhIGJ1Y2tldCBpZCBiZXR3ZWVuIDAgYW5kICR7XG4gICAgICAgICAgICAgIGdhdGV3YXkuY29ubmVjdGlvbi5zZXNzaW9uU3RhcnRMaW1pdC5tYXhDb25jdXJyZW5jeSAtIDFcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgd29ya2VyIGlkIGZvciB0aGlzIHNoYXJkXG4gICAgICAgIGNvbnN0IHdvcmtlcklkID0gZ2F0ZXdheS5jYWxjdWxhdGVXb3JrZXJJZChzaGFyZElkKVxuICAgICAgICBjb25zdCB3b3JrZXIgPSBidWNrZXQud29ya2Vycy5maW5kKCh3KSA9PiB3LmlkID09PSB3b3JrZXJJZClcblxuICAgICAgICAvLyBJZiB0aGlzIHdvcmtlciBhbHJlYWR5IGV4aXN0cywgYWRkIHRoZSBzaGFyZCB0byBpdHMgcXVldWVcbiAgICAgICAgaWYgKHdvcmtlcikge1xuICAgICAgICAgIHdvcmtlci5xdWV1ZS5wdXNoKHNoYXJkSWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnVja2V0LndvcmtlcnMucHVzaCh7IGlkOiB3b3JrZXJJZCwgcXVldWU6IFtzaGFyZElkXSB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBzcGF3blNoYXJkcygpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIGNvbmN1cnJlbmN5IGJ1Y2tldHNcbiAgICAgIGdhdGV3YXkucHJlcGFyZUJ1Y2tldHMoKVxuXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFsuLi5nYXRld2F5LmJ1Y2tldHMuZW50cmllcygpXS5tYXAoYXN5bmMgKFtidWNrZXRJZCwgYnVja2V0XSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiBidWNrZXQud29ya2Vycykge1xuICAgICAgICAgIGZvciAoY29uc3Qgc2hhcmRJZCBvZiB3b3JrZXIucXVldWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGdhdGV3YXkudGVsbFdvcmtlclRvSWRlbnRpZnkod29ya2VyLmlkLCBzaGFyZElkLCBidWNrZXRJZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIFdlIHVzZSBQcm9taXNlLmFsbCBzbyB3ZSBjYW4gc3RhcnQgYWxsIGJ1Y2tldHMgYXQgdGhlIHNhbWUgdGltZVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgICAgIC8vIENoZWNrIGFuZCByZXNoYXJkIGF1dG9tYXRpY2FsbHkgaWYgYXV0byByZXNoYXJkaW5nIGlzIGVuYWJsZWQuXG4gICAgICBpZiAoZ2F0ZXdheS5yZXNoYXJkaW5nLmVuYWJsZWQgJiYgZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWwgIT09IC0xKSB7XG4gICAgICAgIC8vIEl0IGlzIGJldHRlciB0byBlbnN1cmUgdGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoZ2F0ZXdheS5yZXNoYXJkaW5nLmNoZWNrSW50ZXJ2YWxJZClcblxuICAgICAgICBpZiAoIWdhdGV3YXkucmVzaGFyZGluZy5nZXRTZXNzaW9uSW5mbykge1xuICAgICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgICBnYXRld2F5LmxvZ2dlci53YXJuKFwiW1Jlc2hhcmRpbmddIFJlc2hhcmRpbmcgaXMgZW5hYmxlZCBidXQgJ3Jlc2hhcmRpbmcuZ2V0U2Vzc2lvbkluZm8oKScgd2FzIG5vdCBwcm92aWRlZC4gRGlzYWJsaW5nIHJlc2hhcmRpbmcuXCIpXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzaGFyZGluZ0luZm8gPSBhd2FpdCBnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCgpXG5cbiAgICAgICAgICBpZiAocmVzaGFyZGluZ0luZm8ubmVlZGVkICYmIHJlc2hhcmRpbmdJbmZvLmluZm8pIGF3YWl0IGdhdGV3YXkucmVzaGFyZGluZy5yZXNoYXJkKHJlc2hhcmRpbmdJbmZvLmluZm8pXG4gICAgICAgIH0sIGdhdGV3YXkucmVzaGFyZGluZy5jaGVja0ludGVydmFsKVxuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2h1dGRvd24oY29kZSwgcmVhc29uLCBjbGVhclJlc2hhcmRpbmdJbnRlcnZhbCA9IHRydWUpIHtcbiAgICAgIGlmIChjbGVhclJlc2hhcmRpbmdJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChnYXRld2F5LnJlc2hhcmRpbmcuY2hlY2tJbnRlcnZhbElkKVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKGdhdGV3YXkuc2hhcmRzLnZhbHVlcygpKS5tYXAoKHNoYXJkKSA9PiBzaGFyZC5jbG9zZShjb2RlLCByZWFzb24pKSlcbiAgICB9LFxuICAgIGFzeW5jIHNlbmRQYXlsb2FkKHNoYXJkSWQsIHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IHNoYXJkID0gZ2F0ZXdheS5zaGFyZHMuZ2V0KHNoYXJkSWQpXG5cbiAgICAgIGlmICghc2hhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZCAoaWQ6ICR7c2hhcmRJZH0gbm90IGZvdW5kYClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc2hhcmQuc2VuZChwYXlsb2FkKVxuICAgIH0sXG4gICAgYXN5bmMgdGVsbFdvcmtlclRvSWRlbnRpZnkod29ya2VySWQsIHNoYXJkSWQsIGJ1Y2tldElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFRlbGwgd29ya2VyICMke3dvcmtlcklkfSB0byBpZGVudGlmeSBzaGFyZCAjJHtzaGFyZElkfSBmcm9tIGJ1Y2tldCAke2J1Y2tldElkfWApXG4gICAgICBhd2FpdCBnYXRld2F5LmlkZW50aWZ5KHNoYXJkSWQpXG4gICAgfSxcbiAgICBhc3luYyBpZGVudGlmeShzaGFyZElkOiBudW1iZXIpIHtcbiAgICAgIGxldCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKVxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBJZGVudGlmeWluZyAke3NoYXJkID8gJ2V4aXN0aW5nJyA6ICduZXcnfSBzaGFyZCAoJHtzaGFyZElkfSlgKVxuXG4gICAgICBpZiAoIXNoYXJkKSB7XG4gICAgICAgIHNoYXJkID0gbmV3IFNoYXJkKHtcbiAgICAgICAgICBpZDogc2hhcmRJZCxcbiAgICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgICBjb21wcmVzczogdGhpcy5jb21wcmVzcyxcbiAgICAgICAgICAgIHRyYW5zcG9ydENvbXByZXNzaW9uOiBnYXRld2F5LnRyYW5zcG9ydENvbXByZXNzaW9uLFxuICAgICAgICAgICAgaW50ZW50czogdGhpcy5pbnRlbnRzLFxuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgdG9rZW46IHRoaXMudG9rZW4sXG4gICAgICAgICAgICB0b3RhbFNoYXJkczogdGhpcy50b3RhbFNoYXJkcyxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IG9wdGlvbnMuZXZlbnRzID8/IHt9LFxuICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgcmVxdWVzdElkZW50aWZ5OiBhc3luYyAoKSA9PiBhd2FpdCBnYXRld2F5LnJlcXVlc3RJZGVudGlmeShzaGFyZElkKSxcbiAgICAgICAgICBtYWtlUHJlc2VuY2U6IGdhdGV3YXkubWFrZVByZXNlbmNlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLnByZWZlclNuYWtlQ2FzZSkge1xuICAgICAgICAgIHNoYXJkLmZvcndhcmRUb0JvdCA9IGFzeW5jIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBzaGFyZCEuZXZlbnRzLm1lc3NhZ2U/LihzaGFyZCEsIHBheWxvYWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaGFyZHMuc2V0KHNoYXJkSWQsIHNoYXJkKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBzaGFyZC5pZGVudGlmeSgpXG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVlc3RJZGVudGlmeShzaGFyZElkKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHJlcXVlc3RlZCBhbiBpZGVudGlmeS5gKVxuXG4gICAgICBjb25zdCBidWNrZXQgPSBnYXRld2F5LmJ1Y2tldHMuZ2V0KHNoYXJkSWQgJSBnYXRld2F5LmNvbm5lY3Rpb24uc2Vzc2lvblN0YXJ0TGltaXQubWF4Q29uY3VycmVuY3kpXG5cbiAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHJlcXVlc3QgaWRlbnRpZnkgZm9yIGEgc2hhcmQgdGhhdCBpcyBub3QgYXNzaWduZWQgdG8gYW55IGJ1Y2tldC5cIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYnVja2V0LmxlYWt5QnVja2V0LmFjcXVpcmUoKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEFwcHJvdmVkIGlkZW50aWZ5IHJlcXVlc3QgZm9yIFNoYXJkICMke3NoYXJkSWR9LmApXG4gICAgfSxcblxuICAgIGFzeW5jIGtpbGwoc2hhcmRJZDogbnVtYmVyKSB7XG4gICAgICBjb25zdCBzaGFyZCA9IHRoaXMuc2hhcmRzLmdldChzaGFyZElkKVxuICAgICAgaWYgKCFzaGFyZCkge1xuICAgICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFNoYXJkICMke3NoYXJkSWR9IHdhcyByZXF1ZXN0ZWQgdG8gYmUga2lsbGVkLCBidXQgdGhlIHNoYXJkIGNvdWxkIG5vdCBiZSBmb3VuZC5gKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBLaWxsaW5nIFNoYXJkICMke3NoYXJkSWR9YClcbiAgICAgIHRoaXMuc2hhcmRzLmRlbGV0ZShzaGFyZElkKVxuICAgICAgYXdhaXQgc2hhcmQuc2h1dGRvd24oKVxuICAgIH0sXG5cbiAgICAvLyBIZWxwZXJzIG1ldGhvZHMgYmVsb3cgdGhpc1xuXG4gICAgY2FsY3VsYXRlU2hhcmRJZChndWlsZElkLCB0b3RhbFNoYXJkcykge1xuICAgICAgLy8gSWYgbm9uZSBpcyBwcm92aWRlZCwgdXNlIHRoZSB0b3RhbCBzaGFyZHMgbnVtYmVyIGZyb20gZ2F0ZXdheSBvYmplY3QuXG4gICAgICBpZiAoIXRvdGFsU2hhcmRzKSB0b3RhbFNoYXJkcyA9IGdhdGV3YXkudG90YWxTaGFyZHNcbiAgICAgIC8vIElmIGl0IGlzIG9ubHkgMSBzaGFyZCwgaXQgd2lsbCBhbHdheXMgYmUgc2hhcmQgaWQgMFxuICAgICAgaWYgKHRvdGFsU2hhcmRzID09PSAxKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gY2FsY3VsYXRlU2hhcmRJZCAoMSBzaGFyZClgKVxuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGNhbGN1bGF0ZVNoYXJkSWQgKGd1aWxkSWQ6ICR7Z3VpbGRJZH0sIHRvdGFsU2hhcmRzOiAke3RvdGFsU2hhcmRzfSlgKVxuICAgICAgcmV0dXJuIE51bWJlcigoQmlnSW50KGd1aWxkSWQpID4+IDIybikgJSBCaWdJbnQodG90YWxTaGFyZHMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVm9pY2VDaGFubmVsKGd1aWxkSWQsIGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgY29uc3Qgc2hhcmRJZCA9IGdhdGV3YXkuY2FsY3VsYXRlU2hhcmRJZChndWlsZElkKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGpvaW5Wb2ljZUNoYW5uZWwgZ3VpbGRJZDogJHtndWlsZElkfSBjaGFubmVsSWQ6ICR7Y2hhbm5lbElkfWApXG5cbiAgICAgIGF3YWl0IGdhdGV3YXkuc2VuZFBheWxvYWQoc2hhcmRJZCwge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuVm9pY2VTdGF0ZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIGd1aWxkX2lkOiBndWlsZElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhbm5lbF9pZDogY2hhbm5lbElkLnRvU3RyaW5nKCksXG4gICAgICAgICAgc2VsZl9tdXRlOiBvcHRpb25zPy5zZWxmTXV0ZSA/PyBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IG9wdGlvbnM/LnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90U3RhdHVzKGRhdGEpIHtcbiAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gZWRpdEJvdFN0YXR1cyBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25TYWZlUmVwbGFjZXIpfWApXG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBbLi4uZ2F0ZXdheS5zaGFyZHMudmFsdWVzKCldLm1hcChhc3luYyAoc2hhcmQpID0+IHtcbiAgICAgICAgICBnYXRld2F5LmVkaXRTaGFyZFN0YXR1cyhzaGFyZC5pZCwgZGF0YSlcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTaGFyZFN0YXR1cyhzaGFyZElkLCBkYXRhKSB7XG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIGVkaXRTaGFyZFN0YXR1cyBzaGFyZElkOiAke3NoYXJkSWR9IC0+IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YClcblxuICAgICAgYXdhaXQgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5QcmVzZW5jZVVwZGF0ZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHNpbmNlOiBudWxsLFxuICAgICAgICAgIGFmazogZmFsc2UsXG4gICAgICAgICAgYWN0aXZpdGllczogZGF0YS5hY3Rpdml0aWVzLFxuICAgICAgICAgIHN0YXR1czogZGF0YS5zdGF0dXMsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXN0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgIGlmIChnYXRld2F5LmludGVudHMgJiYgKCFvcHRpb25zPy5saW1pdCB8fCBvcHRpb25zLmxpbWl0ID4gMSkgJiYgIShnYXRld2F5LmludGVudHMgJiBHYXRld2F5SW50ZW50cy5HdWlsZE1lbWJlcnMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmZXRjaCBtb3JlIHRoZW4gMSBtZW1iZXIgd2l0aG91dCB0aGUgR1VJTERfTUVNQkVSUyBpbnRlbnQnKVxuXG4gICAgICBnYXRld2F5LmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIHJlcXVlc3RNZW1iZXJzIGd1aWxkSWQ6ICR7Z3VpbGRJZH0gLT4gZGF0YTogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKVxuXG4gICAgICBpZiAob3B0aW9ucz8udXNlcklkcz8ubGVuZ3RoKSB7XG4gICAgICAgIGdhdGV3YXkubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gcmVxdWVzdE1lbWJlcnMgZ3VpbGRJZDogJHtndWlsZElkfSAtPiBzZXR0aW5nIHVzZXIgbGltaXQgYmFzZWQgb24gdXNlcklkcyBsZW5ndGg6ICR7b3B0aW9ucy51c2VySWRzLmxlbmd0aH1gKVxuXG4gICAgICAgIG9wdGlvbnMubGltaXQgPSBvcHRpb25zLnVzZXJJZHMubGVuZ3RoXG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgbGV0IG5vbmNlID0gJydcblxuICAgICAgICB3aGlsZSAoIW5vbmNlIHx8IGdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMucGVuZGluZy5oYXMobm9uY2UpKSB7XG4gICAgICAgICAgbm9uY2UgPSByYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID8/PSB7IGxpbWl0OiAwIH1cbiAgICAgICAgb3B0aW9ucy5ub25jZSA9IG5vbmNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lbWJlcnMgPSAhZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBuZXcgUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gICAgICAgICAgICBpZiAoIWdhdGV3YXkuY2FjaGUucmVxdWVzdE1lbWJlcnMuZW5hYmxlZCB8fCAhb3B0aW9ucz8ubm9uY2UpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNhbid0IHJlcXVlc3QgdGhlIG1lbWJlcnMgd2l0aG91dCB0aGUgbm9uY2Ugb3Igd2l0aCB0aGUgZmVhdHVyZSBkaXNhYmxlZC5cIikpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnYXRld2F5LmNhY2hlLnJlcXVlc3RNZW1iZXJzLnBlbmRpbmcuc2V0KG9wdGlvbnMubm9uY2UsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IG9wdGlvbnMubm9uY2UsXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIG1lbWJlcnM6IFtdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlcXVlc3RHdWlsZE1lbWJlcnMsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIC8vIElmIGEgcXVlcnkgaXMgcHJvdmlkZWQgdXNlIGl0LCBPUiBpZiBhIGxpbWl0IGlzIE5PVCBwcm92aWRlZCB1c2UgXCJcIlxuICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zPy5xdWVyeSA/PyAob3B0aW9ucz8ubGltaXQgPyB1bmRlZmluZWQgOiAnJyksXG4gICAgICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0ID8/IDAsXG4gICAgICAgICAgcHJlc2VuY2VzOiBvcHRpb25zPy5wcmVzZW5jZXMgPz8gZmFsc2UsXG4gICAgICAgICAgdXNlcl9pZHM6IG9wdGlvbnM/LnVzZXJJZHM/Lm1hcCgoaWQpID0+IGlkLnRvU3RyaW5nKCkpLFxuICAgICAgICAgIG5vbmNlOiBvcHRpb25zPy5ub25jZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBhd2FpdCBtZW1iZXJzXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlVm9pY2VDaGFubmVsKGd1aWxkSWQpIHtcbiAgICAgIGNvbnN0IHNoYXJkSWQgPSBnYXRld2F5LmNhbGN1bGF0ZVNoYXJkSWQoZ3VpbGRJZClcblxuICAgICAgZ2F0ZXdheS5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBsZWF2ZVZvaWNlQ2hhbm5lbCBndWlsZElkOiAke2d1aWxkSWR9IFNoYXJkICR7c2hhcmRJZH1gKVxuXG4gICAgICBhd2FpdCBnYXRld2F5LnNlbmRQYXlsb2FkKHNoYXJkSWQsIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICBndWlsZF9pZDogZ3VpbGRJZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYW5uZWxfaWQ6IG51bGwsXG4gICAgICAgICAgc2VsZl9tdXRlOiBmYWxzZSxcbiAgICAgICAgICBzZWxmX2RlYWY6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMoZ3VpbGRJZHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogRGlzY29yZCB3aWxsIHNlbmQgdGhlIGV2ZW50cyBmb3IgdGhlIGd1aWxkcyB0aGF0IGFyZSBcInVuZGVyIHRoZSBzaGFyZFwiIHRoYXQgc2VuZHMgdGhlIG9wY29kZS5cbiAgICAgICAqIEZvciB0aGlzIHJlYXNvbiB3ZSBuZWVkIHRvIGdyb3VwIHRoZSBpZHMgd2l0aCB0aGUgc2hhcmQgdGhlIGNhbGN1bGF0ZVNoYXJkSWQgbWV0aG9kIGdpdmVzXG4gICAgICAgKi9cblxuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxudW1iZXIsIEJpZ1N0cmluZ1tdPigpXG5cbiAgICAgIGZvciAoY29uc3QgZ3VpbGRJZCBvZiBndWlsZElkcykge1xuICAgICAgICBjb25zdCBzaGFyZElkID0gZ2F0ZXdheS5jYWxjdWxhdGVTaGFyZElkKGd1aWxkSWQpXG5cbiAgICAgICAgY29uc3QgaWRzID0gbWFwLmdldChzaGFyZElkKSA/PyBbXVxuICAgICAgICBtYXAuc2V0KHNoYXJkSWQsIGlkcylcblxuICAgICAgICBpZHMucHVzaChndWlsZElkKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLm1hcC5lbnRyaWVzKCldLm1hcCgoW3NoYXJkSWQsIGlkc10pID0+XG4gICAgICAgICAgZ2F0ZXdheS5zZW5kUGF5bG9hZChzaGFyZElkLCB7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMsXG4gICAgICAgICAgICBkOiB7XG4gICAgICAgICAgICAgIGd1aWxkX2lkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9LFxuICB9XG5cbiAgcmV0dXJuIGdhdGV3YXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnMge1xuICAvKipcbiAgICogSWQgb2YgdGhlIGZpcnN0IFNoYXJkIHdoaWNoIHNob3VsZCBnZXQgY29udHJvbGxlZCBieSB0aGlzIG1hbmFnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGZpcnN0U2hhcmRJZD86IG51bWJlclxuICAvKipcbiAgICogSWQgb2YgdGhlIGxhc3QgU2hhcmQgd2hpY2ggc2hvdWxkIGdldCBjb250cm9sbGVkIGJ5IHRoaXMgbWFuYWdlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbGFzdFNoYXJkSWQ/OiBudW1iZXJcbiAgLyoqXG4gICAqIERlbGF5IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzcGF3bmluZyBuZXh0IHNoYXJkLiBPUFRJTUFMIElTIEFCT1ZFIDUxMDAuIFlPVSBET04nVCBXQU5UIFRPIEhJVCBUSEUgUkFURSBMSU1JVCEhIVxuICAgKiBAZGVmYXVsdCA1MzAwXG4gICAqL1xuICBzcGF3blNoYXJkRGVsYXk/OiBudW1iZXJcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2VuZCB0aGUgZGlzY29yZCBwYWNrZXRzIGluIHNuYWtlIGNhc2UgZm9ybS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByZWZlclNuYWtlQ2FzZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFRvdGFsIGFtb3VudCBvZiBzaGFyZHMgeW91ciBib3QgdXNlcy4gVXNlZnVsIGZvciB6ZXJvLWRvd250aW1lIHVwZGF0ZXMgb3IgcmVzaGFyZGluZy5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgdG90YWxTaGFyZHM/OiBudW1iZXJcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2Ygc2hhcmRzIHRvIGxvYWQgcGVyIHdvcmtlci5cbiAgICogQGRlZmF1bHQgMjVcbiAgICovXG4gIHNoYXJkc1Blcldvcmtlcj86IG51bWJlclxuICAvKipcbiAgICogVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrZXJzIHRvIHVzZSBmb3IgeW91ciBib3QuXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIHRvdGFsV29ya2Vycz86IG51bWJlclxuICAvKipcbiAgICogV2hldGhlciB0byBzcHJlYWQgc2hhcmRzIGFjcm9zcyB3b3JrZXJzIGluIGEgcm91bmQtcm9iaW4gbWFubmVyLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBCeSBkZWZhdWx0LCBzaGFyZHMgYXJlIGFzc2lnbmVkIHRvIHdvcmtlcnMgaW4gY29udGlndW91cyBibG9ja3MgYmFzZWQgb24gc2hhcmRzUGVyV29ya2VyLiBJZiBhbnkgc2hhcmQgaXMgbGVmdCBvdmVyLCBpdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBsYXN0IHdvcmtlci5cbiAgICogVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzIHdoaWxlIHNoYXJkc1BlcldvcmtlciBpcyAxMCwgdGhlIGZpcnN0IHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMC05LCB0aGUgc2Vjb25kIHdvcmtlciB3aWxsIGdldCBzaGFyZHMgMTAtMTksIGFuZCBzbyBvbiwgdGhlIGxhc3Qgd29ya2VyIHdpbGwgZ2V0IHNoYXJkcyAyMC0zOS5cbiAgICpcbiAgICogSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoZSBzaGFyZHMgd2lsbCBiZSBhc3NpZ25lZCBpbiBhIHJvdW5kLXJvYmluIG1hbm5lciB0byBzcHJlYWQgbW9yZSBldmVubHkgYWNyb3NzIHdvcmtlcnMuXG4gICAqIEZvciBleGFtcGxlLCB3aXRoIDMgd29ya2VycyBhbmQgNDAgc2hhcmRzLCB0aGUgZmlyc3Qgc2hhcmQgd2lsbCBnbyB0byB3b3JrZXIgMCwgdGhlIHNlY29uZCBzaGFyZCB0byB3b3JrZXIgMSwgdGhlIHRoaXJkIHNoYXJkIHRvIHdvcmtlciAyLCB0aGUgZm91cnRoIHNoYXJkIHRvIHdvcmtlciAwLCBhbmQgc28gb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4/OiBib29sZWFuXG4gIC8qKiBJbXBvcnRhbnQgZGF0YSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBtYW5hZ2VyIHRvIGNvbm5lY3Qgc2hhcmRzIHRvIHRoZSBnYXRld2F5LiAqL1xuICBjb25uZWN0aW9uPzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+XG4gIC8qKiBXaGV0aGVyIGluY29taW5nIHBheWxvYWRzIGFyZSBjb21wcmVzc2VkIHVzaW5nIHpsaWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjb21wcmVzcz86IGJvb2xlYW5cbiAgLyoqIFdoYXQgdHJhbnNwb3J0IGNvbXByZXNzaW9uIHNob3VsZCBiZSB1c2VkICovXG4gIHRyYW5zcG9ydENvbXByZXNzaW9uPzogVHJhbnNwb3J0Q29tcHJlc3Npb24gfCBudWxsXG4gIC8qKiBUaGUgY2FsY3VsYXRlZCBpbnRlbnQgdmFsdWUgb2YgdGhlIGV2ZW50cyB3aGljaCB0aGUgc2hhcmQgc2hvdWxkIHJlY2VpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGludGVudHM/OiBudW1iZXJcbiAgLyoqIElkZW50aWZ5IHByb3BlcnRpZXMgdG8gdXNlICovXG4gIHByb3BlcnRpZXM/OiB7XG4gICAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gdGhlIHNoYXJkIHJ1bnMgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImRhcndpblwiIHwgXCJsaW51eFwiIHwgXCJ3aW5kb3dzXCJcbiAgICAgKi9cbiAgICBvczogc3RyaW5nXG4gICAgLyoqIFRoZSBcImJyb3dzZXJcIiB3aGVyZSB0aGlzIHNoYXJkIGlzIHJ1bm5pbmcgb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIkRpc2NvcmRlbm9cIlxuICAgICAqL1xuICAgIGJyb3dzZXI6IHN0cmluZ1xuICAgIC8qKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHRoZSBzaGFyZCBpcyBydW5uaW5nLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJEaXNjb3JkZW5vXCJcbiAgICAgKi9cbiAgICBkZXZpY2U6IHN0cmluZ1xuICB9XG4gIC8qKiBCb3QgdG9rZW4gd2hpY2ggaXMgdXNlZCB0byBjb25uZWN0IHRvIERpc2NvcmQgKi9cbiAgdG9rZW46IHN0cmluZ1xuICAvKiogVGhlIFVSTCBvZiB0aGUgZ2F0ZXdheSB3aGljaCBzaG91bGQgYmUgY29ubmVjdGVkIHRvLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIndzczovL2dhdGV3YXkuZGlzY29yZC5nZ1wiXG4gICAqL1xuICB1cmw/OiBzdHJpbmdcbiAgLyoqIFRoZSBnYXRld2F5IHZlcnNpb24gd2hpY2ggc2hvdWxkIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uPzogbnVtYmVyXG4gIC8qKiBUaGUgZXZlbnRzIGhhbmRsZXJzICovXG4gIGV2ZW50cz86IFNoYXJkRXZlbnRzXG4gIC8qKiBUaGlzIG1hbmFnZXJzIGNhY2hlIHJlbGF0ZWQgc2V0dGluZ3MuICovXG4gIGNhY2hlPzoge1xuICAgIHJlcXVlc3RNZW1iZXJzPzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIG9yIG5vdCByZXF1ZXN0IG1lbWJlciByZXF1ZXN0cyBzaG91bGQgYmUgY2FjaGVkLlxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgdGhhdCB0aGUgZ2F0ZXdheSBtYW5hZ2VyIHdpbGwgdXNlLlxuICAgKiBAZGVmYXVsdCBsb2dnZXIgLy8gVGhlIGxvZ2dlciBleHBvcnRlZCBieSBgQGRpc2NvcmRlbm8vdXRpbHNgXG4gICAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqXG4gICAqIE1ha2UgdGhlIHByZXNlbmNlIGZvciB3aGVuIHRoZSBib3QgY29ubmVjdHMgdG8gdGhlIGdhdGV3YXlcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBTaGFyZCBpcyBnb2luZyB0byBpZGVudGlmeVxuICAgKi9cbiAgbWFrZVByZXNlbmNlPzogKCkgPT4gUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+XG4gIC8qKiBPcHRpb25zIHJlbGF0ZWQgdG8gcmVzaGFyZGluZy4gKi9cbiAgcmVzaGFyZGluZz86IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBhdXRvbWF0ZWQgcmVzaGFyZGluZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlZDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSAlIG9mIGhvdyBmdWxsIGEgc2hhcmQgaXMgd2hlbiByZXNoYXJkaW5nIHNob3VsZCBiZSB0cmlnZ2VyZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFdlIHVzZSBkaXNjb3JkIHJlY29tbWVuZGVkIHNoYXJkIHZhbHVlIHRvIGdldCBhbiAqKmFwcHJveGltYXRpb24qKiBvZiB0aGUgc2hhcmQgZnVsbCBwZXJjZW50YWdlIHRvIGNvbXBhcmUgd2l0aCB0aGlzIHZhbHVlIHNvIHRoZSBib3QgbWF5IG5vdCByZXNoYXJkIGF0IHRoZSBleGFjdCBwZXJjZW50YWdlIHByb3ZpZGVkIGJ1dCBtYXkgcmVzaGFyZCB3aGVuIGl0IGlzIGEgYml0IGhpZ2hlciB0aGFuIHRoZSBwcm92aWRlZCBwZXJjZW50YWdlLlxuICAgICAqIEZvciBhY2N1cmF0ZSBjYWxjdWxhdGlvbiwgeW91IG1heSBvdmVycmlkZSB0aGUgYGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWRgIGZ1bmN0aW9uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCA4MCBhcyBpbiA4MCVcbiAgICAgKi9cbiAgICBzaGFyZHNGdWxsUGVyY2VudGFnZTogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcywgb2YgaG93IG9mdGVuIHRvIGNoZWNrIHdoZXRoZXIgcmVzaGFyZGluZyBpcyBuZWVkZWQgYW5kIHJlc2hhcmQgYXV0b21hdGljYWxseS4gU2V0IHRvIC0xIHRvIGRpc2FibGUgYXV0byByZXNoYXJkaW5nLlxuICAgICAqIEBkZWZhdWx0IDI4ODAwMDAwICg4IGhvdXJzKVxuICAgICAqL1xuICAgIGNoZWNrSW50ZXJ2YWw6IG51bWJlclxuICAgIC8qKiBIYW5kbGVyIHRvIGdldCBzaGFyZCBjb3VudCBhbmQgb3RoZXIgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIGdldFNlc3Npb25JbmZvPzogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4+XG4gICAgLyoqIEhhbmRsZXIgdG8gZWRpdCB0aGUgc2hhcmQgaWQgb24gYW55IGNhY2hlZCBndWlsZHMuICovXG4gICAgdXBkYXRlR3VpbGRzU2hhcmRJZD86IChndWlsZElkczogc3RyaW5nW10sIHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheU1hbmFnZXIgZXh0ZW5kcyBSZXF1aXJlZDxDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnM+IHtcbiAgLyoqIFRoZSBtYXggY29uY3VycmVuY3kgYnVja2V0cy4gVGhvc2Ugd2lsbCBiZSBjcmVhdGVkIHdoZW4gdGhlIGBzcGF3blNoYXJkc2AgKHdoaWNoIGNhbGxzIGBwcmVwYXJlQnVja2V0c2AgdW5kZXIgdGhlIGhvb2QpIGZ1bmN0aW9uIGdldHMgY2FsbGVkLiAqL1xuICBidWNrZXRzOiBNYXA8XG4gICAgbnVtYmVyLFxuICAgIHtcbiAgICAgIHdvcmtlcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcXVldWU6IG51bWJlcltdIH0+XG4gICAgICAvKiogVGhlIGJ1Y2tldCB0byBxdWV1ZSB0aGUgaWRlbnRpZmllcy4gKi9cbiAgICAgIGxlYWt5QnVja2V0OiBMZWFreUJ1Y2tldFxuICAgIH1cbiAgPlxuICAvKiogVGhlIHNoYXJkcyB0aGF0IGFyZSBjcmVhdGVkLiAqL1xuICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPlxuICAvKiogVGhlIGxvZ2dlciBmb3IgdGhlIGdhdGV3YXkgbWFuYWdlci4gKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIEV2ZXJ5dGhpbmcgcmVsYXRlZCB0byByZXNoYXJkaW5nLiAqL1xuICByZXNoYXJkaW5nOiBDcmVhdGVHYXRld2F5TWFuYWdlck9wdGlvbnNbJ3Jlc2hhcmRpbmcnXSAmIHtcbiAgICAvKiogVGhlIGludGVydmFsIGlkIG9mIHRoZSBjaGVjayBpbnRlcnZhbC4gVGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcnZhbCB3aGVuIHRoZSBtYW5hZ2VyIGlzIHNodXRkb3duLiAqL1xuICAgIGNoZWNrSW50ZXJ2YWxJZD86IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkXG4gICAgLyoqIEhvbGRzIHRoZSBzaGFyZHMgdGhhdCByZXNoYXJkaW5nIGhhcyBjcmVhdGVkLiBPbmNlIHJlc2hhcmRpbmcgaXMgZG9uZSwgdGhpcyByZXBsYWNlcyB0aGUgZ2F0ZXdheS5zaGFyZHMgKi9cbiAgICBzaGFyZHM6IE1hcDxudW1iZXIsIFNoYXJkPlxuICAgIC8qKiBIYW5kbGVyIHRvIGNoZWNrIGlmIHJlc2hhcmRpbmcgaXMgbmVjZXNzYXJ5LiAqL1xuICAgIGNoZWNrSWZSZXNoYXJkaW5nSXNOZWVkZWQ6ICgpID0+IFByb21pc2U8eyBuZWVkZWQ6IGJvb2xlYW47IGluZm8/OiBDYW1lbGl6ZTxEaXNjb3JkR2V0R2F0ZXdheUJvdD4gfT5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGJlZ2luIHJlc2hhcmRpbmcuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNvbHZlIG9uY2UgdGhlIHJlc2hhcmRpbmcgaXMgZG9uZS5cbiAgICAgKiBTbyB3aGVuIGFsbCB0aGUgY2FsbHMgdG8ge0BsaW5rIHRlbGxXb3JrZXJUb1ByZXBhcmV9IGFuZCB7QGxpbmsgb25SZXNoYXJkaW5nU3dpdGNofSBhcmUgZG9uZS5cbiAgICAgKi9cbiAgICByZXNoYXJkOiAoaW5mbzogQ2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+ICYgeyBmaXJzdFNoYXJkSWQ/OiBudW1iZXI7IGxhc3RTaGFyZElkPzogbnVtYmVyIH0pID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVyIHRvIGNvbW11bmljYXRlIHRvIGEgd29ya2VyIHRoYXQgaXQgbmVlZHMgdG8gc3Bhd24gYSBuZXcgc2hhcmQgYW5kIGlkZW50aWZ5IGl0IGZvciB0aGUgcmVzaGFyZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoYW5kbGVyIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUge0BsaW5rIHRlbGxXb3JrZXJUb0lkZW50aWZ5fSBoYW5kbGVyLlxuICAgICAqIFNvIHlvdSBzaG91bGQgd2FpdCBmb3IgdGhlIHdvcmtlciB0byBoYXZlIGlkZW50aWZpZWQgdGhlIHNoYXJkIGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICB0ZWxsV29ya2VyVG9QcmVwYXJlOiAod29ya2VySWQ6IG51bWJlciwgc2hhcmRJZDogbnVtYmVyLCBidWNrZXRJZDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGNhbGxlZCB3aGVuIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHByZXBhcmluZyBmb3IgdGhlIHJlc2hhcmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIHNob3VsZCBtYWtlIHRoZSBuZXcgcmVzaGFyZGVkIHNoYXJkcyBiZWNvbWUgdGhlIGFjdGl2ZSBvbmVzIGFuZCBzaHV0ZG93biB0aGUgb2xkIG9uZXNcbiAgICAgKi9cbiAgICBvblJlc2hhcmRpbmdTd2l0Y2g6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgfVxuICAvKiogRGV0ZXJtaW5lIG1heCBudW1iZXIgb2Ygc2hhcmRzIHRvIHVzZSBiYXNlZCB1cG9uIHRoZSBtYXggY29uY3VycmVuY3kuICovXG4gIGNhbGN1bGF0ZVRvdGFsU2hhcmRzOiAoKSA9PiBudW1iZXJcbiAgLyoqIERldGVybWluZSB0aGUgaWQgb2YgdGhlIHdvcmtlciB3aGljaCBpcyBoYW5kbGluZyBhIHNoYXJkLiAqL1xuICBjYWxjdWxhdGVXb3JrZXJJZDogKHNoYXJkSWQ6IG51bWJlcikgPT4gbnVtYmVyXG4gIC8qKiBQcmVwYXJlcyBhbGwgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBpZGVudGlmeWluZyB0aGUgc2hhcmRzLiAqL1xuICBwcmVwYXJlQnVja2V0czogKCkgPT4gdm9pZFxuICAvKiogU3RhcnQgaWRlbnRpZnlpbmcgYWxsIHRoZSBzaGFyZHMuICovXG4gIHNwYXduU2hhcmRzOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBTaHV0ZG93biBhbGwgc2hhcmRzLiAqL1xuICBzaHV0ZG93bjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcsIGNsZWFyUmVzaGFyZGluZ0ludGVydmFsPzogYm9vbGVhbikgPT4gUHJvbWlzZTx2b2lkPlxuICBzZW5kUGF5bG9hZDogKHNoYXJkSWQ6IG51bWJlciwgcGF5bG9hZDogU2hhcmRTb2NrZXRSZXF1ZXN0KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBBbGxvd3MgdXNlcnMgdG8gaG9vayBpbiBhbmQgY2hhbmdlIHRvIGNvbW11bmljYXRlIHRvIGRpZmZlcmVudCB3b3JrZXJzIGFjcm9zcyBkaWZmZXJlbnQgc2VydmVycyBvciBhbnl0aGluZyB0aGV5IGxpa2UuXG4gICAqIEZvciBleGFtcGxlIHVzaW5nIHJlZGlzIHB1YnN1YiB0byB0YWxrIHRvIG90aGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgc2hvdWxkIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gaGF2ZSBpZGVudGlmaWVkIHRoZSBzaGFyZCBiZWZvcmUgcmVzb2x2aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlXG4gICAqL1xuICB0ZWxsV29ya2VyVG9JZGVudGlmeTogKHdvcmtlcklkOiBudW1iZXIsIHNoYXJkSWQ6IG51bWJlciwgYnVja2V0SWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGVsbCB0aGUgbWFuYWdlciB0byBpZGVudGlmeSBhIFNoYXJkLiBJZiB0aGlzIFNoYXJkIGlzIG5vdCBhbHJlYWR5IG1hbmFnZWQgdGhpcyB3aWxsIGFsc28gYWRkIHRoZSBTaGFyZCB0byB0aGUgbWFuYWdlci4gKi9cbiAgaWRlbnRpZnk6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEtpbGwgYSBzaGFyZC4gQ2xvc2UgYSBzaGFyZHMgY29ubmVjdGlvbiB0byBEaXNjb3JkJ3MgZ2F0ZXdheSAoaWYgYW55KSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIG1hbmFnZXIuICovXG4gIGtpbGw6IChzaGFyZElkOiBudW1iZXIpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZSBidWNrZXQgaXMgYWxsb3dlZCB0byBtYWtlIHRoZSBuZXh0IGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeTogKHNoYXJkSWQ6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHNoYXJkcyBiYXNlZCBvbiB0aGUgZ3VpbGQgaWQgYW5kIHRvdGFsIHNoYXJkcy4gKi9cbiAgY2FsY3VsYXRlU2hhcmRJZDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdG90YWxTaGFyZHM/OiBudW1iZXIpID0+IG51bWJlclxuICAvKipcbiAgICogQ29ubmVjdHMgdGhlIGJvdCB1c2VyIHRvIGEgdm9pY2Ugb3Igc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgX1VwZGF0ZSBWb2ljZSBTdGF0ZV8gZ2F0ZXdheSBjb21tYW5kIG92ZXIgdGhlIGdhdGV3YXkgYmVoaW5kIHRoZSBzY2VuZXMuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgdm9pY2UgY2hhbm5lbCB0byBsZWF2ZSBpcyBpbi5cbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB5b3Ugd2FudCB0byBqb2luLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENPTk5FQ1RgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX1ZvaWNlIFN0YXRlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgam9pblZvaWNlQ2hhbm5lbDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBBdExlYXN0T25lPE9taXQ8VXBkYXRlVm9pY2VTdGF0ZSwgJ2d1aWxkSWQnIHwgJ2NoYW5uZWxJZCc+PikgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIGJvdCBzdGF0dXMgaW4gYWxsIHNoYXJkcyB0aGF0IHRoaXMgZ2F0ZXdheSBtYW5hZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RhdHVzIGRhdGEgdG8gc2V0IHRoZSBib3RzIHN0YXR1cyB0by5cbiAgICogQHJldHVybnMgbm90aGluZ1xuICAgKi9cbiAgZWRpdEJvdFN0YXR1czogKGRhdGE6IERpc2NvcmRVcGRhdGVQcmVzZW5jZSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIGJvdCdzIHN0YXR1cyBvbiBvbmUgc2hhcmQuXG4gICAqXG4gICAqIEBwYXJhbSBzaGFyZElkIFRoZSBzaGFyZCBpZCB0byBlZGl0IHRoZSBzdGF0dXMgZm9yLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc3RhdHVzIGRhdGEgdG8gc2V0IHRoZSBib3RzIHN0YXR1cyB0by5cbiAgICogQHJldHVybnMgbm90aGluZ1xuICAgKi9cbiAgZWRpdFNoYXJkU3RhdHVzOiAoc2hhcmRJZDogbnVtYmVyLCBkYXRhOiBEaXNjb3JkVXBkYXRlUHJlc2VuY2UpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZCBvdmVyIHRoZSBnYXRld2F5LiBJZiBgZ2F0ZXdheS5jYWNoZS5yZXF1ZXN0TWVtYmVycy5lbmFibGVkYCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGFuZCB5b3UnbGwgaGF2ZSB0byBoYW5kbGUgdGhlIGBHVUlMRF9NRU1CRVJTX0NIVU5LYCBldmVudHMgeW91cnNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgcmVxdWVzdGluZyB0aGUgZW50aXJlIG1lbWJlciBsaXN0OlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIHByZXNlbmNlcyAoe0BsaW5rIFJlcXVlc3RHdWlsZE1lbWJlcnMucHJlc2VuY2VzIHwgcHJlc2VuY2VzfSBzZXQgdG8gYHRydWVgKTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYEdVSUxEX1BSRVNFTkNFU2AgaW50ZW50LlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgcHJlZml4ICh7QGxpbmsgUmVxdWVzdEd1aWxkTWVtYmVycy5xdWVyeSB8IHF1ZXJ5fSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBJZiByZXF1ZXN0aW5nIGEgdXNlcnMgYnkgSUQgKHtAbGluayBSZXF1ZXN0R3VpbGRNZW1iZXJzLnVzZXJJZHMgfCB1c2VySWRzfSBub24tYHVuZGVmaW5lZGApOlxuICAgKiAtIFJldHVybnMgYSBtYXhpbXVtIG9mIDEwMCBtZW1iZXJzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXJzIENodW5rXyBnYXRld2F5IGV2ZW50IGZvciBldmVyeSAxMDAwIG1lbWJlcnMgZmV0Y2hlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVxdWVzdC1ndWlsZC1tZW1iZXJzfVxuICAgKi9cbiAgcmVxdWVzdE1lbWJlcnM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBPbWl0PFJlcXVlc3RHdWlsZE1lbWJlcnMsICdndWlsZElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAvKipcbiAgICogTGVhdmVzIHRoZSB2b2ljZSBjaGFubmVsIHRoZSBib3QgdXNlciBpcyBjdXJyZW50bHkgaW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIF9VcGRhdGUgVm9pY2UgU3RhdGVfIGdhdGV3YXkgY29tbWFuZCBvdmVyIHRoZSBnYXRld2F5IGJlaGluZCB0aGUgc2NlbmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdGhlIHZvaWNlIGNoYW5uZWwgdG8gbGVhdmUgaXMgaW4uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX1ZvaWNlIFN0YXRlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjdXBkYXRlLXZvaWNlLXN0YXRlfVxuICAgKi9cbiAgbGVhdmVWb2ljZUNoYW5uZWw6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVxdWVzdCBzb3VuZGJvYXJkIHNvdW5kcyBmb3IgYSBsaXN0IG9mIGd1aWxkcy5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBzZW5kcyBtdWx0aXBsZSAoc2VlIHJlbWFya3MpIF9SZXF1ZXN0IFNvdW5kYm9hcmQgU291bmRzXyBnYXRld2F5IGNvbW1hbmQgb3ZlciB0aGUgZ2F0ZXdheSBiZWhpbmQgdGhlIHNjZW5lcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWRzIC0gVGhlIGd1aWxkcyB0byBnZXQgdGhlIHNvdW5kcyBmcm9tXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX1NvdW5kYm9hcmQgU291bmRzXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiDimqDvuI8gRGlzY29yZCB3aWxsIHNlbmQgdGhlIF9Tb3VuZGJvYXJkIFNvdW5kc18gZm9yIGVhY2ggb2YgdGhlIGd1aWxkIGlkc1xuICAgKiBob3dldmVyIHlvdSBtYXkgbm90IHJlY2VpdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGV2ZW50cyBhcyB0aGUgaWRzIHBhc3NlZCB0byBfUmVxdWVzdCBTb3VuZGJvYXJkIFNvdW5kc18gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XG4gICAqIC0gVGhlIGJvdCBpcyBub3QgaW4gdGhlIHNlcnZlciBwcm92aWRlZFxuICAgKiAtIFRoZSBzaGFyZCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBzZW50IGZyb20gZG9lcyBub3QgcmVjZWl2ZSBldmVudHMgZm9yIHRoZSBzcGVjaWZpZWQgZ3VpbGRcbiAgICpcbiAgICogVG8gYXZvaWQgdGhpcyBEaXNjb3JkZW5vIHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gZ3JvdXAgdGhlIGlkcyBiYXNlZCBvbiB3aGF0IHNoYXJkIHRoZXkgd2lsbCBuZWVkIHRvIGJlIHNlbnQsIGJ1dCB0aGlzIGludm9sdmVzIHNlbmRpbmcgbXVsdGlwbGUgbWVzc2FnZXMgaW4gbXVsdGlwbGUgc2hhcmRzXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5LWV2ZW50cyNyZXF1ZXN0LXNvdW5kYm9hcmQtc291bmRzfVxuICAgKi9cbiAgcmVxdWVzdFNvdW5kYm9hcmRTb3VuZHM6IChndWlsZElkczogQmlnU3RyaW5nW10pID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoaXMgbWFuYWdlcnMgY2FjaGUgcmVsYXRlZCBzZXR0aW5ncy4gKi9cbiAgY2FjaGU6IHtcbiAgICByZXF1ZXN0TWVtYmVyczoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIG9yIG5vdCByZXF1ZXN0IG1lbWJlciByZXF1ZXN0cyBzaG91bGQgYmUgY2FjaGVkLlxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZW5hYmxlZDogYm9vbGVhblxuICAgICAgLyoqIFRoZSBwZW5kaW5nIHJlcXVlc3RzLiAqL1xuICAgICAgcGVuZGluZzogQ29sbGVjdGlvbjxzdHJpbmcsIFJlcXVlc3RNZW1iZXJSZXF1ZXN0PlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RNZW1iZXJSZXF1ZXN0IHtcbiAgLyoqIFRoZSB1bmlxdWUgbm9uY2UgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbm9uY2U6IHN0cmluZ1xuICAvKiogVGhlIHJlc29sdmVyIGhhbmRsZXIgdG8gcnVuIHdoZW4gYWxsIG1lbWJlcnMgYXJyaXZlLiAqL1xuICByZXNvbHZlOiAodmFsdWU6IENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPiB8IFByb21pc2VMaWtlPENhbWVsaXplPERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPj4pID0+IHZvaWRcbiAgLyoqIFRoZSBtZW1iZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGFycml2ZWQgZm9yIHRoaXMgcmVxdWVzdC4gKi9cbiAgbWVtYmVyczogRGlzY29yZE1lbWJlcldpdGhVc2VyW11cbn1cbiJdLCJuYW1lcyI6WyJyYW5kb21CeXRlcyIsIkdhdGV3YXlJbnRlbnRzIiwiR2F0ZXdheU9wY29kZXMiLCJDb2xsZWN0aW9uIiwiTGVha3lCdWNrZXQiLCJqc29uU2FmZVJlcGxhY2VyIiwibG9nZ2VyIiwiU2hhcmQiLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJjcmVhdGVHYXRld2F5TWFuYWdlciIsIm9wdGlvbnMiLCJjb25uZWN0aW9uT3B0aW9ucyIsImNvbm5lY3Rpb24iLCJ1cmwiLCJzaGFyZHMiLCJzZXNzaW9uU3RhcnRMaW1pdCIsIm1heENvbmN1cnJlbmN5IiwicmVtYWluaW5nIiwidG90YWwiLCJyZXNldEFmdGVyIiwiZ2F0ZXdheSIsImV2ZW50cyIsImNvbXByZXNzIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJpbnRlbnRzIiwicHJvcGVydGllcyIsIm9zIiwicHJvY2VzcyIsInBsYXRmb3JtIiwiYnJvd3NlciIsImRldmljZSIsInRva2VuIiwidmVyc2lvbiIsInRvdGFsU2hhcmRzIiwibGFzdFNoYXJkSWQiLCJmaXJzdFNoYXJkSWQiLCJ0b3RhbFdvcmtlcnMiLCJzaGFyZHNQZXJXb3JrZXIiLCJzcGF3blNoYXJkRGVsYXkiLCJzcHJlYWRTaGFyZHNJblJvdW5kUm9iaW4iLCJwcmVmZXJTbmFrZUNhc2UiLCJNYXAiLCJidWNrZXRzIiwiY2FjaGUiLCJyZXF1ZXN0TWVtYmVycyIsImVuYWJsZWQiLCJwZW5kaW5nIiwibWFrZVByZXNlbmNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bmRlZmluZWQiLCJyZXNoYXJkaW5nIiwic2hhcmRzRnVsbFBlcmNlbnRhZ2UiLCJjaGVja0ludGVydmFsIiwiZ2V0U2Vzc2lvbkluZm8iLCJ1cGRhdGVHdWlsZHNTaGFyZElkIiwiY2hlY2tJZlJlc2hhcmRpbmdJc05lZWRlZCIsImRlYnVnIiwibmVlZGVkIiwiRXJyb3IiLCJzZXNzaW9uSW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbmZvIiwicGVyY2VudGFnZSIsInJlc2hhcmQiLCJjYWxjdWxhdGVUb3RhbFNoYXJkcyIsImNsZWFyIiwicHJlcGFyZUJ1Y2tldHMiLCJwcm9taXNlcyIsIkFycmF5IiwiZnJvbSIsImVudHJpZXMiLCJtYXAiLCJidWNrZXRJZCIsImJ1Y2tldCIsIndvcmtlciIsIndvcmtlcnMiLCJzaGFyZElkIiwicXVldWUiLCJ0ZWxsV29ya2VyVG9QcmVwYXJlIiwiaWQiLCJhbGwiLCJvblJlc2hhcmRpbmdTd2l0Y2giLCJ3b3JrZXJJZCIsInNoYXJkIiwibWVzc2FnZSIsIl9zaGFyZCIsInBheWxvYWQiLCJ0IiwiZCIsImd1aWxkcyIsImciLCJyZXF1ZXN0SWRlbnRpZnkiLCJmb3J3YXJkVG9Cb3QiLCJzZXQiLCJpZGVudGlmeSIsInZhbHVlcyIsIm9sZEhhbmRsZXIiLCJfIiwic2h1dGRvd24iLCJSZXNoYXJkZWQiLCJNYXRoIiwiY2VpbCIsImNhbGN1bGF0ZVdvcmtlcklkIiwibWluIiwiZmxvb3IiLCJpIiwibGVha3lCdWNrZXQiLCJtYXgiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdldCIsImZpbmQiLCJ3IiwicHVzaCIsInNwYXduU2hhcmRzIiwidGVsbFdvcmtlclRvSWRlbnRpZnkiLCJjbGVhckludGVydmFsIiwiY2hlY2tJbnRlcnZhbElkIiwid2FybiIsInNldEludGVydmFsIiwicmVzaGFyZGluZ0luZm8iLCJjb2RlIiwicmVhc29uIiwiY2xlYXJSZXNoYXJkaW5nSW50ZXJ2YWwiLCJjbG9zZSIsInNlbmRQYXlsb2FkIiwic2VuZCIsImFjcXVpcmUiLCJraWxsIiwiZGVsZXRlIiwiY2FsY3VsYXRlU2hhcmRJZCIsImd1aWxkSWQiLCJOdW1iZXIiLCJCaWdJbnQiLCJqb2luVm9pY2VDaGFubmVsIiwiY2hhbm5lbElkIiwib3AiLCJWb2ljZVN0YXRlVXBkYXRlIiwiZ3VpbGRfaWQiLCJ0b1N0cmluZyIsImNoYW5uZWxfaWQiLCJzZWxmX211dGUiLCJzZWxmTXV0ZSIsInNlbGZfZGVhZiIsInNlbGZEZWFmIiwiZWRpdEJvdFN0YXR1cyIsImRhdGEiLCJlZGl0U2hhcmRTdGF0dXMiLCJQcmVzZW5jZVVwZGF0ZSIsInNpbmNlIiwiYWZrIiwiYWN0aXZpdGllcyIsInN0YXR1cyIsImxpbWl0IiwiR3VpbGRNZW1iZXJzIiwidXNlcklkcyIsImxlbmd0aCIsIm5vbmNlIiwiaGFzIiwibWVtYmVycyIsInJlamVjdCIsIlJlcXVlc3RHdWlsZE1lbWJlcnMiLCJxdWVyeSIsInByZXNlbmNlcyIsInVzZXJfaWRzIiwibGVhdmVWb2ljZUNoYW5uZWwiLCJyZXF1ZXN0U291bmRib2FyZFNvdW5kcyIsImd1aWxkSWRzIiwiaWRzIiwiUmVxdWVzdFNvdW5kYm9hcmRTb3VuZHMiLCJndWlsZF9pZHMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFdBQVcsUUFBUSxjQUFhO0FBQ3pDLFNBUUVDLGNBQWMsRUFDZEMsY0FBYyxRQUVULG9CQUFtQjtBQUMxQixTQUFTQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsZ0JBQWdCLEVBQUVDLE1BQU0sUUFBUSxvQkFBbUI7QUFDckYsT0FBT0MsV0FBVyxhQUFZO0FBQzlCLFNBQTJCQyxxQkFBcUIsUUFBbUYsYUFBWTtBQUUvSSxPQUFPLFNBQVNDLHFCQUFxQkMsT0FBb0M7SUFDdkUsTUFBTUMsb0JBQW9CRCxRQUFRRSxVQUFVLElBQUk7UUFDOUNDLEtBQUs7UUFDTEMsUUFBUTtRQUNSQyxtQkFBbUI7WUFDakJDLGdCQUFnQjtZQUNoQkMsV0FBVztZQUNYQyxPQUFPO1lBQ1BDLFlBQVksT0FBTyxLQUFLLEtBQUs7UUFDL0I7SUFDRjtJQUVBLE1BQU1DLFVBQTBCO1FBQzlCQyxRQUFRWCxRQUFRVyxNQUFNLElBQUksQ0FBQztRQUMzQkMsVUFBVVosUUFBUVksUUFBUSxJQUFJO1FBQzlCQyxzQkFBc0JiLFFBQVFhLG9CQUFvQixJQUFJO1FBQ3REQyxTQUFTZCxRQUFRYyxPQUFPLElBQUk7UUFDNUJDLFlBQVk7WUFDVkMsSUFBSWhCLFFBQVFlLFVB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
@@ -164,28 +164,40 @@ export interface GatewayManager extends Required<CreateGatewayManagerOptions> {
164
164
  logger: Pick<typeof logger, 'debug' | 'info' | 'warn' | 'error' | 'fatal'>;
165
165
  /** Everything related to resharding. */
166
166
  resharding: CreateGatewayManagerOptions['resharding'] & {
167
- /**
168
- * The interval id of the check interval. This is used to clear the interval when the manager is shutdown.
169
- */
167
+ /** The interval id of the check interval. This is used to clear the interval when the manager is shutdown. */
170
168
  checkIntervalId?: NodeJS.Timeout | undefined;
171
169
  /** Holds the shards that resharding has created. Once resharding is done, this replaces the gateway.shards */
172
- shards: Collection<number, Shard>;
173
- /** Holds the pending shards that have been created and are pending all shards finish loading. */
174
- pendingShards: Collection<number, Shard>;
170
+ shards: Map<number, Shard>;
175
171
  /** Handler to check if resharding is necessary. */
176
172
  checkIfReshardingIsNeeded: () => Promise<{
177
173
  needed: boolean;
178
174
  info?: Camelize<DiscordGetGatewayBot>;
179
175
  }>;
180
- /** Handler to begin resharding. */
176
+ /**
177
+ * Handler to begin resharding.
178
+ *
179
+ * @remarks
180
+ * This function will resolve once the resharding is done.
181
+ * So when all the calls to {@link tellWorkerToPrepare} and {@link onReshardingSwitch} are done.
182
+ */
181
183
  reshard: (info: Camelize<DiscordGetGatewayBot> & {
182
184
  firstShardId?: number;
183
185
  lastShardId?: number;
184
186
  }) => Promise<void>;
185
- /** Handler to communicate to a worker that a shard needs to be created. */
187
+ /**
188
+ * Handler to communicate to a worker that it needs to spawn a new shard and identify it for the resharding.
189
+ *
190
+ * @remarks
191
+ * This handler works in the same way as the {@link tellWorkerToIdentify} handler.
192
+ * So you should wait for the worker to have identified the shard before resolving the promise
193
+ */
186
194
  tellWorkerToPrepare: (workerId: number, shardId: number, bucketId: number) => Promise<void>;
187
- /** Handler to alert the gateway that a shard(resharded) is online. It should now wait for all shards to be pending before shutting off old shards. */
188
- shardIsPending: (shard: Shard) => Promise<void>;
195
+ /**
196
+ * Handle called when all the workers have finished preparing for the resharding.
197
+ *
198
+ * This should make the new resharded shards become the active ones and shutdown the old ones
199
+ */
200
+ onReshardingSwitch: () => Promise<void>;
189
201
  };
190
202
  /** Determine max number of shards to use based upon the max concurrency. */
191
203
  calculateTotalShards: () => number;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@discordeno/gateway",
3
- "version": "21.0.1-next.b6bfaa3",
3
+ "version": "21.0.1-next.c86c512",
4
4
  "main": "./dist/esm/index.js",
5
5
  "types": "./dist/types/index.d.ts",
6
6
  "exports": {
@@ -34,8 +34,8 @@
34
34
  "test:test-type": "tsc --project tests/tsconfig.json"
35
35
  },
36
36
  "dependencies": {
37
- "@discordeno/types": "21.0.1-next.b6bfaa3",
38
- "@discordeno/utils": "21.0.1-next.b6bfaa3",
37
+ "@discordeno/types": "21.0.1-next.c86c512",
38
+ "@discordeno/utils": "21.0.1-next.c86c512",
39
39
  "ws": "^8.18.1"
40
40
  },
41
41
  "optionalDependencies": {
@@ -44,14 +44,14 @@
44
44
  "devDependencies": {
45
45
  "@biomejs/biome": "^1.9.4",
46
46
  "@swc/cli": "^0.5.2",
47
- "@swc/core": "^1.12.9",
47
+ "@swc/core": "^1.13.3",
48
48
  "@types/chai": "^5.2.2",
49
49
  "@types/mocha": "^10.0.10",
50
- "@types/node": "^24.0.1",
50
+ "@types/node": "^24.1.0",
51
51
  "@types/sinon": "^17.0.3",
52
52
  "@types/ws": "^8.5.14",
53
53
  "c8": "^10.1.3",
54
- "chai": "^5.2.0",
54
+ "chai": "^5.2.1",
55
55
  "mocha": "patch:mocha@npm%3A11.0.2#~/.yarn/patches/mocha-npm-11.0.2-b5d6b95284.patch",
56
56
  "sinon": "^21.0.0",
57
57
  "ts-node": "^10.9.2",