circuit-json-to-spice 0.0.28 → 0.0.30

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.
package/dist/index.js CHANGED
@@ -204,6 +204,50 @@ var InductorCommand = class {
204
204
  }
205
205
  };
206
206
 
207
+ // lib/spice-commands/MOSFETCommand.ts
208
+ var MOSFETCommand = class {
209
+ commandName = "mosfet";
210
+ props;
211
+ constructor(props) {
212
+ this.props = props;
213
+ }
214
+ toSpiceString() {
215
+ const {
216
+ name,
217
+ drain,
218
+ gate,
219
+ source,
220
+ substrate,
221
+ model,
222
+ length,
223
+ width,
224
+ drainArea,
225
+ sourceArea,
226
+ drainPerimeter,
227
+ sourcePerimeter,
228
+ drainResistance,
229
+ sourceResistance
230
+ } = this.props;
231
+ let spiceString = `M${name} ${drain} ${gate} ${source} ${substrate} ${model}`;
232
+ const params = {
233
+ L: length,
234
+ W: width,
235
+ AD: drainArea,
236
+ AS: sourceArea,
237
+ PD: drainPerimeter,
238
+ PS: sourcePerimeter,
239
+ NRD: drainResistance,
240
+ NRS: sourceResistance
241
+ };
242
+ Object.entries(params).forEach(([key, value]) => {
243
+ if (value) {
244
+ spiceString += ` ${key}=${value}`;
245
+ }
246
+ });
247
+ return spiceString;
248
+ }
249
+ };
250
+
207
251
  // lib/spice-commands/VoltageControlledSwitchCommand.ts
208
252
  var VoltageControlledSwitchCommand = class {
209
253
  commandName = "voltage_controlled_switch";
@@ -493,29 +537,34 @@ function circuitJsonToSpice(circuitJson) {
493
537
  const drainNode = nodeMap.get(drainPort?.source_port_id ?? "") || "0";
494
538
  const gateNode = nodeMap.get(gatePort?.source_port_id ?? "") || "0";
495
539
  const sourceNode = nodeMap.get(sourcePort?.source_port_id ?? "") || "0";
496
- const channel_type = component.channel_type;
497
- let positiveControl = gateNode;
498
- let negativeControl = sourceNode;
499
- if (channel_type === "p") {
500
- positiveControl = sourceNode;
501
- negativeControl = gateNode;
502
- }
503
- const modelName = "ENH_SW";
540
+ const substrateNode = sourceNode;
541
+ const channel_type = component.channel_type ?? "n";
542
+ const mosfet_mode = component.mosfet_mode ?? "enhancement";
543
+ const modelType = `${channel_type.toUpperCase()}MOS`;
544
+ const modelName = `${modelType}_${mosfet_mode.toUpperCase()}`;
504
545
  if (!netlist.models.has(modelName)) {
505
- netlist.models.set(
506
- modelName,
507
- `.MODEL ${modelName} SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)`
508
- );
546
+ if (mosfet_mode === "enhancement") {
547
+ const vto = channel_type === "p" ? -1 : 1;
548
+ netlist.models.set(
549
+ modelName,
550
+ `.MODEL ${modelName} ${modelType} (VTO=${vto} KP=0.1)`
551
+ );
552
+ } else {
553
+ netlist.models.set(
554
+ modelName,
555
+ `.MODEL ${modelName} ${modelType} (KP=0.1)`
556
+ );
557
+ }
509
558
  }
510
- const switchCmd = new VoltageControlledSwitchCommand({
559
+ const mosfetCmd = new MOSFETCommand({
511
560
  name: component.name,
512
- positiveNode: drainNode,
513
- negativeNode: sourceNode,
514
- positiveControl,
515
- negativeControl,
561
+ drain: drainNode,
562
+ gate: gateNode,
563
+ source: sourceNode,
564
+ substrate: substrateNode,
516
565
  model: modelName
517
566
  });
518
- spiceComponent = new SpiceComponent(component.name, switchCmd, [
567
+ spiceComponent = new SpiceComponent(component.name, mosfetCmd, [
519
568
  drainNode,
520
569
  gateNode,
521
570
  sourceNode
@@ -848,50 +897,6 @@ var JFETCommand = class {
848
897
  }
849
898
  };
850
899
 
851
- // lib/spice-commands/MOSFETCommand.ts
852
- var MOSFETCommand = class {
853
- commandName = "mosfet";
854
- props;
855
- constructor(props) {
856
- this.props = props;
857
- }
858
- toSpiceString() {
859
- const {
860
- name,
861
- drain,
862
- gate,
863
- source,
864
- substrate,
865
- model,
866
- length,
867
- width,
868
- drainArea,
869
- sourceArea,
870
- drainPerimeter,
871
- sourcePerimeter,
872
- drainResistance,
873
- sourceResistance
874
- } = this.props;
875
- let spiceString = `M${name} ${drain} ${gate} ${source} ${substrate} ${model}`;
876
- const params = {
877
- L: length,
878
- W: width,
879
- AD: drainArea,
880
- AS: sourceArea,
881
- PD: drainPerimeter,
882
- PS: sourcePerimeter,
883
- NRD: drainResistance,
884
- NRS: sourceResistance
885
- };
886
- Object.entries(params).forEach(([key, value]) => {
887
- if (value) {
888
- spiceString += ` ${key}=${value}`;
889
- }
890
- });
891
- return spiceString;
892
- }
893
- };
894
-
895
900
  // lib/spice-commands/SubcircuitCallCommand.ts
896
901
  var SubcircuitCallCommand = class {
897
902
  commandName = "subcircuit_call";
@@ -956,4 +961,4 @@ export {
956
961
  circuitJsonToSpice,
957
962
  convertSpiceNetlistToString
958
963
  };
959
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0N1cnJlbnRTb3VyY2VDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1N1YmNpcmN1aXRDYWxsQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgLy8gQWRkIHN1YmNpcmN1aXQgZGVmaW5pdGlvbnNcbiAgZm9yIChjb25zdCBzdWJjaXJjdWl0IG9mIG5ldGxpc3Quc3ViY2lyY3VpdHMpIHtcbiAgICBsaW5lcy5wdXNoKHN1YmNpcmN1aXQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzKVxuICB9XG5cbiAgLy8gQWRkIGNvbnRyb2wgYmxvY2sgaWYgcHJlc2VudFxuICBpZiAobmV0bGlzdC5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIi5jb250cm9sXCIpXG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LmNvbnRyb2xzKVxuICAgIGxpbmVzLnB1c2goXCIuZW5kY1wiKVxuICB9XG5cbiAgaWYgKFxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgJiZcbiAgICAhbGluZXMuc29tZSgobCkgPT4gbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiLnRyYW5cIikpXG4gICkge1xuICAgIGxpbmVzLnB1c2gobmV0bGlzdC50cmFuQ29tbWFuZClcbiAgfVxuXG4gIC8vIEVuZCB3aXRoIC5FTkRcbiAgbGluZXMucHVzaChcIi5FTkRcIilcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIiwgImltcG9ydCB7IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyB9IGZyb20gXCIuLi9zcGljZS11dGlscy9jb252ZXJ0U3BpY2VOZXRsaXN0VG9TdHJpbmdcIlxuaW1wb3J0IHR5cGUgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcIi4vU3BpY2VTdWJjaXJjdWl0XCJcblxuZXhwb3J0IGNsYXNzIFNwaWNlTmV0bGlzdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgY29tcG9uZW50czogU3BpY2VDb21wb25lbnRbXVxuICBub2RlczogU2V0PHN0cmluZz5cbiAgY29udHJvbHM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXRzOiBTcGljZVN1YmNpcmN1aXRbXVxuICBtb2RlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgdHJhbkNvbW1hbmQ6IHN0cmluZyB8IG51bGxcbiAgcHJpbnRTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy50cmFuQ29tbWFuZCA9IG51bGxcbiAgICB0aGlzLnByaW50U3RhdGVtZW50cyA9IFtdXG4gIH1cblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBTcGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudClcbiAgICAvLyBBZGQgbm9kZXMgdG8gdGhlIHNldFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjb21wb25lbnQubm9kZXMpIHtcbiAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3ViY2lyY3VpdChzdWJjaXJjdWl0OiBTcGljZVN1YmNpcmN1aXQpIHtcbiAgICBpZiAodGhpcy5zdWJjaXJjdWl0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHN1YmNpcmN1aXQubmFtZSkpIHJldHVyblxuICAgIHRoaXMuc3ViY2lyY3VpdHMucHVzaChzdWJjaXJjdWl0KVxuICB9XG5cbiAgdG9TcGljZVN0cmluZygpIHtcbiAgICByZXR1cm4gY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nKHRoaXMpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi4vc3BpY2UtY29tbWFuZHMvQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBjbGFzcyBTcGljZUNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBjb21tYW5kOiBCYXNlU3BpY2VDb21tYW5kXG4gIG5vZGVzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZCwgbm9kZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLm5vZGVzID0gbm9kZXNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnRvU3BpY2VTdHJpbmcoKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFYke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERpb2RlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRGlvZGVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJkaW9kZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCBhcmVhIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEQke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbD86IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIGluaXRpYWxDb25kaXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEluZHVjdG9yQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCBtb2RlbCwgdmFsdWUsIGluaXRpYWxDb25kaXRpb24gfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEwke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIGlmIChpbml0aWFsQ29uZGl0aW9uKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIElDPSR7aW5pdGlhbENvbmRpdGlvbn1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgcG9zaXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbmVnYXRpdmVDb250cm9sOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX2NvbnRyb2xsZWRfc3dpdGNoXCIgYXMgY29uc3RcbiAgcHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIHBvc2l0aXZlQ29udHJvbCxcbiAgICAgIG5lZ2F0aXZlQ29udHJvbCxcbiAgICAgIG1vZGVsLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBTJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9ICR7cG9zaXRpdmVDb250cm9sfSAke25lZ2F0aXZlQ29udHJvbH0gJHttb2RlbH1gXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwiLi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgUmVzaXN0b3JDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvUmVzaXN0b3JDb21tYW5kXCJcbmltcG9ydCB7IENhcGFjaXRvckNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9DYXBhY2l0b3JDb21tYW5kXCJcbmltcG9ydCB7IFZvbHRhZ2VTb3VyY2VDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmRcIlxuaW1wb3J0IHsgQkpUQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmRcIlxuaW1wb3J0IHsgRGlvZGVDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvRGlvZGVDb21tYW5kXCJcbmltcG9ydCB7IEluZHVjdG9yQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0luZHVjdG9yQ29tbWFuZFwiXG5pbXBvcnQgeyBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRcIlxuaW1wb3J0IHR5cGUge1xuICBBbnlDaXJjdWl0RWxlbWVudCxcbiAgU2ltdWxhdGlvblN3aXRjaCxcbiAgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZSxcbn0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBnZXRTb3VyY2VQb3J0Q29ubmVjdGl2aXR5TWFwRnJvbUNpcmN1aXRKc29uIH0gZnJvbSBcImNpcmN1aXQtanNvbi10by1jb25uZWN0aXZpdHktbWFwXCJcbmltcG9ydCB7IHN1IH0gZnJvbSBcIkB0c2NpcmN1aXQvY2lyY3VpdC1qc29uLXV0aWxcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uU3dpdGNoZXMgPSBjaXJjdWl0SnNvblxuICAgIC5maWx0ZXIoXG4gICAgICAoZWxlbWVudCkgPT4gKGVsZW1lbnQgYXMgeyB0eXBlPzogc3RyaW5nIH0pLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zd2l0Y2hcIixcbiAgICApXG4gICAgLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudCBhcyB1bmtub3duIGFzIFNpbXVsYXRpb25Td2l0Y2gpXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hNYXAgPSBuZXcgTWFwPHN0cmluZywgU2ltdWxhdGlvblN3aXRjaD4oKVxuXG4gIGZvciAoY29uc3Qgc2ltU3dpdGNoIG9mIHNpbXVsYXRpb25Td2l0Y2hlcykge1xuICAgIGlmIChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCkge1xuICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcC5zZXQoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQsIHNpbVN3aXRjaClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25uTWFwID0gZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbihjaXJjdWl0SnNvbilcblxuICAvLyBDcmVhdGUgbm9kZSBtYXBwaW5nIGZyb20gcG9ydCBjb25uZWN0aW9uc1xuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBjb25zdCBuZXRUb05vZGVOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBsZXQgbm9kZUNvdW50ZXIgPSAxXG5cbiAgY29uc3QgcHJvYmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmIChwcm9iZS5uYW1lKSB7XG4gICAgICAgIHByb2JlTmFtZXMuYWRkKHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHByb2JlIG5hbWVzIGxpa2UgTjEsIE4yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBjb25mbGljdHNcbiAgY29uc3QgbnVtZXJpY1Byb2JlTmFtZXMgPSBbLi4ucHJvYmVOYW1lc11cbiAgICAubWFwKChuYW1lKSA9PiAvXk4oXFxkKykkL2kuZXhlYyhuYW1lKSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBSZWdFeHBFeGVjQXJyYXkgPT4gbSAhPT0gbnVsbClcbiAgICAubWFwKChtKSA9PiBwYXJzZUludChtWzFdLCAxMCkpXG5cbiAgaWYgKG51bWVyaWNQcm9iZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBub2RlQ291bnRlciA9IE1hdGgubWF4KC4uLm51bWVyaWNQcm9iZU5hbWVzKSArIDFcbiAgfVxuXG4gIGNvbnN0IGdyb3VuZE5ldHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIEZpbmQgZ3JvdW5kIGZyb20gc291cmNlIG5ldHMgdGhhdCBpbmNsdWRlIFwiZ25kXCIgaW4gdGhlIG5hbWVcbiAgY29uc3QgZ25kU291cmNlTmV0SWRzID0gbmV3IFNldChcbiAgICBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfbmV0Lmxpc3QoKVxuICAgICAgLmZpbHRlcigoc24pID0+IHNuLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJnbmRcIikpXG4gICAgICAubWFwKChzbikgPT4gc24uc291cmNlX25ldF9pZCksXG4gIClcblxuICBpZiAoZ25kU291cmNlTmV0SWRzLnNpemUgPiAwKSB7XG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKSkge1xuICAgICAgaWYgKHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBpc09uR25kTmV0ID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLnNvbWUoKG5ldElkKSA9PlxuICAgICAgICAgIGduZFNvdXJjZU5ldElkcy5oYXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIGlmIChpc09uR25kTmV0KSB7XG4gICAgICAgICAgY29uc3QgYVBvcnRPbkduZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBjb25zdCBnbmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoYVBvcnRPbkduZClcbiAgICAgICAgICBpZiAoZ25kTmV0KSB7XG4gICAgICAgICAgICBncm91bmROZXRzLmFkZChnbmROZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBncm91bmQgbm9kZSBmcm9tIHBvcnRzIG5hbWVkIFwiR05EXCJcbiAgY29uc3QgZ3JvdW5kUG9ydHMgPSBzb3VyY2VQb3J0cy5maWx0ZXIoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnbmRcIilcbiAgZm9yIChjb25zdCBncm91bmRQb3J0IG9mIGdyb3VuZFBvcnRzKSB7XG4gICAgY29uc3QgZ3JvdW5kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGdyb3VuZFBvcnQuc291cmNlX3BvcnRfaWQpXG4gICAgaWYgKGdyb3VuZE5ldCkge1xuICAgICAgZ3JvdW5kTmV0cy5hZGQoZ3JvdW5kTmV0KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSkge1xuICAgIGNvbnN0IG5lZ19wb3J0X2lkID1cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgIGlmIChuZWdfcG9ydF9pZCkge1xuICAgICAgY29uc3QgZ25kX25ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChuZWdfcG9ydF9pZClcbiAgICAgIGlmIChnbmRfbmV0KSB7XG4gICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZF9uZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBncm91bmROZXQgb2YgZ3JvdW5kTmV0cykge1xuICAgIG5ldFRvTm9kZU5hbWUuc2V0KGdyb3VuZE5ldCwgXCIwXCIpXG4gIH1cblxuICAvLyBQcmUtYXNzaWduIG5vZGUgbmFtZXMgZnJvbSB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAoIXByb2JlLm5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkIHx8XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IG5ldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgY29uc3Qgc2lnbmFsX3BvcnRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IHNpZ25hbF9uZXRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoc2lnbmFsX3BvcnRfaWQpIHtcbiAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHNpZ25hbF9wb3J0X2lkKVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfbmV0X2lkKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMoc2lnbmFsX25ldF9pZCEpLFxuICAgICAgICApXG4gICAgICAgIGlmICh0cmFjZSAmJiB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0SWQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV0KSB7XG4gICAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgcHJvYmUubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfcG9ydF9pZCAmJiBwcm9iZS5uYW1lKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZyBwb3J0IHdpdGggYSBwcm9iZSwgc28gd2UgbWFwIGl0IGRpcmVjdGx5LiBUaGlzIHBvcnRcbiAgICAgICAgLy8gd2lsbCBub3cgYmUgc2tpcHBlZCBpbiB0aGUgc2Vjb25kLXBhc3MgZm9yIHVuY29ubmVjdGVkIHBvcnRzLlxuICAgICAgICBub2RlTWFwLnNldChzaWduYWxfcG9ydF9pZCwgcHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIGFsbCBjb25uZWN0ZWQgbmV0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgY29uc3QgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICBpZiAobmV0KSB7XG4gICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgICAgfVxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBuZXRUb05vZGVOYW1lLmdldChuZXQpISlcbiAgICB9XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byB1bmNvbm5lY3RlZCBwb3J0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgLy8gSWYgYSBwb3J0IHdhc24ndCBpbiBhIG5ldCwgaXQgd29uJ3QgYmUgaW4gdGhlIG5vZGVNYXAgeWV0XG4gICAgaWYgKCFub2RlTWFwLmhhcyhwb3J0SWQpKSB7XG4gICAgICAvLyBVbmNvbm5lY3RlZCBwb3J0LCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgbm9kZSBmb3IgaXRcbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGVhY2ggY29tcG9uZW50XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNvdXJjZUNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09IFwic291cmNlX2NvbXBvbmVudFwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydHMgPSBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfcG9ydC5saXN0KHtcbiAgICAgICAgc291cmNlX2NvbXBvbmVudF9pZDogY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnBpbl9udW1iZXIgPz8gMCkgLSAoYi5waW5fbnVtYmVyID8/IDApKVxuXG4gICAgLy8gR2V0IG5vZGUgbmFtZXMgZm9yIGNvbXBvbmVudCBwb3J0c1xuICAgIGNvbnN0IG5vZGVzID0gY29tcG9uZW50UG9ydHMubWFwKChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQocG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIFNQSUNFIGNvbXBvbmVudCBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKFwiZnR5cGVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgIGxldCBzcGljZUNvbXBvbmVudDogU3BpY2VDb21wb25lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgICBzd2l0Y2ggKGNvbXBvbmVudC5mdHlwZSkge1xuICAgICAgICBjYXNlIFwic2ltcGxlX3Jlc2lzdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJyZXNpc3RhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgcmVzaXN0b3JDbWQgPSBuZXcgUmVzaXN0b3JDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRSZXNpc3RhbmNlKGNvbXBvbmVudC5yZXNpc3RhbmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHJlc2lzdG9yQ21kLFxuICAgICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3N3aXRjaFwiOiB7XG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVkQmFzZSA9IHNhbml0aXplSWRlbnRpZmllcihcbiAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lID8/IGNvbXBvbmVudC5zb3VyY2VfY29tcG9uZW50X2lkLFxuICAgICAgICAgICAgXCJTV1wiLFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2Rlc1swXSB8fCBcIjBcIlxuICAgICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVzWzFdIHx8IFwiMFwiXG4gICAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSBgTkNUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBgU1dfJHtzYW5pdGl6ZWRCYXNlfWBcblxuICAgICAgICAgIGNvbnN0IGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoID0gc2ltdWxhdGlvblN3aXRjaE1hcC5nZXQoXG4gICAgICAgICAgICBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gICAgICAgICAgICBhc3NvY2lhdGVkU2ltdWxhdGlvblN3aXRjaCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNhbml0aXplZEJhc2UsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICBwb3NpdGl2ZUNvbnRyb2w6IGNvbnRyb2xOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVDb250cm9sOiBcIjBcIixcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KHNhbml0aXplZEJhc2UsIHN3aXRjaENtZCwgW1xuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgY29udHJvbE5vZGUsXG4gICAgICAgICAgICBcIjBcIixcbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9IFNXKFJvbj0wLjEgUm9mZj0xZTkgVnQ9Mi41IFZoPTAuMSlgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xTb3VyY2VOYW1lID0gYENUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgICAgICAgICBjb25zdCBjb250cm9sU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IGNvbnRyb2xTb3VyY2VOYW1lLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBjb250cm9sTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogXCIwXCIsXG4gICAgICAgICAgICB2YWx1ZTogY29udHJvbFZhbHVlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBjb250cm9sQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgY29udHJvbFNvdXJjZU5hbWUsXG4gICAgICAgICAgICBjb250cm9sU291cmNlQ21kLFxuICAgICAgICAgICAgW2NvbnRyb2xOb2RlLCBcIjBcIl0sXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoY29udHJvbENvbXBvbmVudClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBcInNpbXBsZV9jYXBhY2l0b3JcIjoge1xuICAgICAgICAgIGlmIChcImNhcGFjaXRhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgY2FwYWNpdG9yQ21kID0gbmV3IENhcGFjaXRvckNvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBub2Rlc1sxXSB8fCBcIjBcIixcbiAgICAgICAgICAgICAgdmFsdWU6IGZvcm1hdENhcGFjaXRhbmNlKGNvbXBvbmVudC5jYXBhY2l0YW5jZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBjYXBhY2l0b3JDbWQsXG4gICAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfZGlvZGVcIjoge1xuICAgICAgICAgIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFub2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJhbm9kZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImFub2RlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgY2F0aG9kZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY2F0aG9kZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNhdGhvZGVcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChhbm9kZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChjYXRob2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcblxuICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gXCJEXCJcbiAgICAgICAgICAgIGNvbnN0IGRpb2RlQ21kID0gbmV3IERpb2RlQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSwgLy8gZ2VuZXJpYyBtb2RlbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIGAuTU9ERUwgJHttb2RlbE5hbWV9IERgKVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUsIGRpb2RlQ21kLCBbXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2luZHVjdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJpbmR1Y3RhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgaW5kdWN0b3JDbWQgPSBuZXcgSW5kdWN0b3JDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRJbmR1Y3RhbmNlKGNvbXBvbmVudC5pbmR1Y3RhbmNlKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIGluZHVjdG9yQ21kLFxuICAgICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX21vc2ZldFwiOiB7XG4gICAgICAgICAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc3QgZHJhaW5Qb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImRyYWluXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZHJhaW5cIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBnYXRlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnYXRlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZ2F0ZVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwic291cmNlXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwic291cmNlXCIpLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBkcmFpbk5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChkcmFpblBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBnYXRlTm9kZSA9IG5vZGVNYXAuZ2V0KGdhdGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9XG4gICAgICAgICAgICAgIG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxfdHlwZSA9IGNvbXBvbmVudC5jaGFubmVsX3R5cGVcblxuICAgICAgICAgICAgbGV0IHBvc2l0aXZlQ29udHJvbCA9IGdhdGVOb2RlXG4gICAgICAgICAgICBsZXQgbmVnYXRpdmVDb250cm9sID0gc291cmNlTm9kZVxuICAgICAgICAgICAgaWYgKGNoYW5uZWxfdHlwZSA9PT0gXCJwXCIpIHtcbiAgICAgICAgICAgICAgcG9zaXRpdmVDb250cm9sID0gc291cmNlTm9kZVxuICAgICAgICAgICAgICBuZWdhdGl2ZUNvbnRyb2wgPSBnYXRlTm9kZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBcIkVOSF9TV1wiXG4gICAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gU1coUm9uPTAuMSBSb2ZmPTFlOSBWdD0yLjUgVmg9MC4xKWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3dpdGNoQ21kID0gbmV3IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IGRyYWluTm9kZSxcbiAgICAgICAgICAgICAgbmVnYXRpdmVOb2RlOiBzb3VyY2VOb2RlLFxuICAgICAgICAgICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlQ29udHJvbCxcbiAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBzd2l0Y2hDbWQsIFtcbiAgICAgICAgICAgICAgZHJhaW5Ob2RlLFxuICAgICAgICAgICAgICBnYXRlTm9kZSxcbiAgICAgICAgICAgICAgc291cmNlTm9kZSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV90cmFuc2lzdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0b3JQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNvbGxlY3RvclwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImNvbGxlY3RvclwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGJhc2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImJhc2VcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJiYXNlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZW1pdHRlclBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZW1pdHRlclwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImVtaXR0ZXJcIiksXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmICghY29sbGVjdG9yUG9ydCB8fCAhYmFzZVBvcnQgfHwgIWVtaXR0ZXJQb3J0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVHJhbnNpc3RvciAke2NvbXBvbmVudC5uYW1lfSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBvcnRzIChjb2xsZWN0b3IsIGJhc2UsIGVtaXR0ZXIpYCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0b3JOb2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoY29sbGVjdG9yUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VOb2RlID0gbm9kZU1hcC5nZXQoYmFzZVBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgICAgICAgICBjb25zdCBlbWl0dGVyTm9kZSA9IG5vZGVNYXAuZ2V0KGVtaXR0ZXJQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2lzdG9yX3R5cGUgPSAoY29tcG9uZW50IGFzIGFueSkudHJhbnNpc3Rvcl90eXBlID8/IFwibnBuXCJcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHRyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHt0cmFuc2lzdG9yX3R5cGUudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJqdENtZCA9IG5ldyBCSlRDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIGNvbGxlY3RvcjogY29sbGVjdG9yTm9kZSxcbiAgICAgICAgICAgICAgYmFzZTogYmFzZU5vZGUsXG4gICAgICAgICAgICAgIGVtaXR0ZXI6IGVtaXR0ZXJOb2RlLFxuICAgICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBianRDbWQsIFtcbiAgICAgICAgICAgICAgY29sbGVjdG9yTm9kZSxcbiAgICAgICAgICAgICAgYmFzZU5vZGUsXG4gICAgICAgICAgICAgIGVtaXR0ZXJOb2RlLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3BpY2VDb21wb25lbnQpIHtcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBzaW11bGF0aW9uIHZvbHRhZ2Ugc291cmNlc1xuICBjb25zdCBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMgPVxuICAgIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlcykge1xuICAgIGlmIChzaW1Tb3VyY2UudHlwZSAhPT0gXCJzaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlXCIpIGNvbnRpbnVlXG5cbiAgICBpZiAoKHNpbVNvdXJjZSBhcyBhbnkpLmlzX2RjX3NvdXJjZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEFDIFNvdXJjZVxuICAgICAgaWYgKFxuICAgICAgICBcInRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBcInRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkICYmXG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9XG4gICAgICAgICAgbm9kZU1hcC5nZXQoKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcblxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiXG4gICAgICAgIGNvbnN0IHdhdmVfc2hhcGUgPSAoc2ltU291cmNlIGFzIGFueSkud2F2ZV9zaGFwZVxuICAgICAgICBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzaW5ld2F2ZVwiKSB7XG4gICAgICAgICAgY29uc3Qgdl9vZmZzZXQgPSAwIC8vIG5vdCBwcm92aWRlZCBpbiBjaXJjdWl0SnNvblxuICAgICAgICAgIGNvbnN0IHZfcGVhayA9IChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gKHNpbVNvdXJjZSBhcyBhbnkpLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwIC8vIG5vdCBwcm92aWRlZCBpbiBjaXJjdWl0SnNvblxuICAgICAgICAgIGNvbnN0IGRhbXBpbmdfZmFjdG9yID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBwaGFzZSA9IChzaW1Tb3VyY2UgYXMgYW55KS5waGFzZSA/PyAwXG4gICAgICAgICAgaWYgKGZyZXEgPiAwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGBTSU4oJHt2X29mZnNldH0gJHt2X3BlYWt9ICR7ZnJlcX0gJHtkZWxheX0gJHtkYW1waW5nX2ZhY3Rvcn0gJHtwaGFzZX0pYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlID8/IDB9YFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXZlX3NoYXBlID09PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgY29uc3Qgdl9pbml0aWFsID0gMFxuICAgICAgICAgIGNvbnN0IHZfcHVsc2VkID0gKHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgPz8gMFxuICAgICAgICAgIGNvbnN0IGZyZXEgPSAoc2ltU291cmNlIGFzIGFueSkuZnJlcXVlbmN5ID8/IDBcbiAgICAgICAgICBjb25zdCBwZXJpb2RfZnJvbV9mcmVxID0gZnJlcSA9PT0gMCA/IEluZmluaXR5IDogMSAvIGZyZXFcbiAgICAgICAgICBjb25zdCBwZXJpb2QgPSAoc2ltU291cmNlIGFzIGFueSkucGVyaW9kID8/IHBlcmlvZF9mcm9tX2ZyZXFcbiAgICAgICAgICBjb25zdCBkdXR5X2N5Y2xlID0gKHNpbVNvdXJjZSBhcyBhbnkpLmR1dHlfY3ljbGUgPz8gMC41XG4gICAgICAgICAgY29uc3QgcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgcmlzZV90aW1lID0gXCIxblwiXG4gICAgICAgICAgY29uc3QgZmFsbF90aW1lID0gXCIxblwiXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHt2X2luaXRpYWx9ICR7dl9wdWxzZWR9ICR7ZGVsYXl9ICR7cmlzZV90aW1lfSAke2ZhbGxfdGltZX0gJHtwdWxzZV93aWR0aH0gJHtwZXJpb2R9KWBcbiAgICAgICAgfSBlbHNlIGlmICgoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgICApXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gREMgU291cmNlIChpc19kY19zb3VyY2UgaXMgdHJ1ZSBvciB1bmRlZmluZWQpXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5wb3NpdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgICAoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG5cbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpdmVQb3J0SWQgJiZcbiAgICAgICAgbmVnYXRpdmVQb3J0SWQgJiZcbiAgICAgICAgXCJ2b2x0YWdlXCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2RlTWFwLmdldChwb3NpdGl2ZVBvcnRJZCkgfHwgXCIwXCJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZU1hcC5nZXQobmVnYXRpdmVQb3J0SWQpIHx8IFwiMFwiXG5cbiAgICAgICAgY29uc3Qgdm9sdGFnZVNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICB2YWx1ZTogYERDICR7KHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2V9YCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgIClcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2ltRXhwZXJpbWVudCA9IGNpcmN1aXRKc29uLmZpbmQoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9leHBlcmltZW50XCIsXG4gIClcblxuICBpZiAoc2ltRXhwZXJpbWVudCkge1xuICAgIC8vIFByb2Nlc3Mgc2ltdWxhdGlvbiB2b2x0YWdlIHByb2Jlc1xuICAgIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGVzVG9Qcm9iZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICAgIGNvbnN0IGdldFBvcnRJZEZyb21OZXRJZCA9IChuZXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiB0cmFjZT8uY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgICAgbGV0IHNpZ25hbFBvcnRJZCA9IHByb2JlLnNpZ25hbF9pbnB1dF9zb3VyY2VfcG9ydF9pZFxuICAgICAgICBpZiAoIXNpZ25hbFBvcnRJZCkge1xuICAgICAgICAgIGNvbnN0IHNpZ25hbE5ldElkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWRcbiAgICAgICAgICBpZiAoc2lnbmFsTmV0SWQpIHtcbiAgICAgICAgICAgIHNpZ25hbFBvcnRJZCA9IGdldFBvcnRJZEZyb21OZXRJZChzaWduYWxOZXRJZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNpZ25hbFBvcnRJZCkgY29udGludWVcblxuICAgICAgICBjb25zdCBzaWduYWxOb2RlTmFtZSA9IG5vZGVNYXAuZ2V0KHNpZ25hbFBvcnRJZClcbiAgICAgICAgaWYgKCFzaWduYWxOb2RlTmFtZSkgY29udGludWVcblxuICAgICAgICBsZXQgcmVmZXJlbmNlUG9ydElkID0gcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICAgIGlmICghcmVmZXJlbmNlUG9ydElkICYmIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkKSB7XG4gICAgICAgICAgcmVmZXJlbmNlUG9ydElkID0gZ2V0UG9ydElkRnJvbU5ldElkKFxuICAgICAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWQsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZmVyZW5jZVBvcnRJZCkge1xuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGVOYW1lID0gbm9kZU1hcC5nZXQocmVmZXJlbmNlUG9ydElkKVxuICAgICAgICAgIGlmIChyZWZlcmVuY2VOb2RlTmFtZSAmJiByZWZlcmVuY2VOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoYFYoJHtzaWduYWxOb2RlTmFtZX0sJHtyZWZlcmVuY2VOb2RlTmFtZX0pYClcbiAgICAgICAgICB9IGVsc2UgaWYgKHNpZ25hbE5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChgVigke3NpZ25hbE5vZGVOYW1lfSlgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW5nbGUtZW5kZWQgcHJvYmVcbiAgICAgICAgICBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKGBWKCR7c2lnbmFsTm9kZU5hbWV9KWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9kZXNUb1Byb2JlLnNpemUgPiAwICYmXG4gICAgICAgIChzaW1FeHBlcmltZW50IGFzIGFueSkuZXhwZXJpbWVudF90eXBlPy5pbmNsdWRlcyhcInRyYW5zaWVudFwiKVxuICAgICAgKSB7XG4gICAgICAgIG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLnB1c2goXG4gICAgICAgICAgYC5QUklOVCBUUkFOICR7Wy4uLm5vZGVzVG9Qcm9iZV0uam9pbihcIiBcIil9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVQZXJTdGVwID0gKHNpbUV4cGVyaW1lbnQgYXMgYW55KS50aW1lX3Blcl9zdGVwXG4gICAgY29uc3QgZW5kVGltZSA9IChzaW1FeHBlcmltZW50IGFzIGFueSkuZW5kX3RpbWVfbXNcbiAgICBjb25zdCBzdGFydFRpbWVNcyA9IChzaW1FeHBlcmltZW50IGFzIGFueSkuc3RhcnRfdGltZV9tc1xuXG4gICAgaWYgKHRpbWVQZXJTdGVwICYmIGVuZFRpbWUpIHtcbiAgICAgIC8vIGNpcmN1aXQtanNvbiB2YWx1ZXMgYXJlIGluIG1zLCBTUElDRSByZXF1aXJlcyBzZWNvbmRzXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSAoc3RhcnRUaW1lTXMgPz8gMCkgLyAxMDAwXG5cbiAgICAgIGxldCB0cmFuQ21kID0gYC50cmFuICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoXG4gICAgICAgIHRpbWVQZXJTdGVwIC8gMTAwMCxcbiAgICAgICl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoZW5kVGltZSAvIDEwMDApfWBcbiAgICAgIGlmIChzdGFydFRpbWUgPiAwKSB7XG4gICAgICAgIHRyYW5DbWQgKz0gYCAke2Zvcm1hdE51bWJlckZvclNwaWNlKHN0YXJ0VGltZSl9YFxuICAgICAgfVxuICAgICAgdHJhbkNtZCArPSBcIiBVSUNcIlxuICAgICAgbmV0bGlzdC50cmFuQ29tbWFuZCA9IHRyYW5DbWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV0bGlzdFxufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXNpc3RhbmNlKHJlc2lzdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChyZXNpc3RhbmNlID49IDFlNikgcmV0dXJuIGAke3Jlc2lzdGFuY2UgLyAxZTZ9TUVHYFxuICBpZiAocmVzaXN0YW5jZSA+PSAxZTMpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWUzfUtgXG4gIHJldHVybiByZXNpc3RhbmNlLnRvU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2FwYWNpdGFuY2UoY2FwYWNpdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS0zKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTN9TWBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTYpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlNn1VYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU5fU5gXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS0xMikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWUxMn1QYFxuICByZXR1cm4gY2FwYWNpdGFuY2UudG9TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRJbmR1Y3RhbmNlKGluZHVjdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmR1Y3RhbmNlID49IDEpIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTN9bWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTZ9dWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTl9bmBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUxMn1wYFxuICByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG59XG5cbmZ1bmN0aW9uIHNhbml0aXplSWRlbnRpZmllcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gcHJlZml4XG4gIGNvbnN0IHNhbml0aXplZCA9IHZhbHVlLnJlcGxhY2UoL1teQS1aYS16MC05X10vZywgXCJfXCIpXG4gIGlmICghc2FuaXRpemVkKSByZXR1cm4gcHJlZml4XG4gIGlmICgvXlswLTldLy50ZXN0KHNhbml0aXplZCkpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fV8ke3Nhbml0aXplZH1gXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplZFxufVxuXG5mdW5jdGlvbiBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gIHNpbXVsYXRpb25Td2l0Y2g6IFNpbXVsYXRpb25Td2l0Y2ggfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgaGlnaFZvbHRhZ2UgPSA1XG4gIGNvbnN0IGxvd1ZvbHRhZ2UgPSAwXG4gIGNvbnN0IHJpc2VUaW1lID0gXCIxblwiXG4gIGNvbnN0IGZhbGxUaW1lID0gXCIxblwiXG5cbiAgaWYgKCFzaW11bGF0aW9uU3dpdGNoKSB7XG4gICAgcmV0dXJuIGBEQyAke2xvd1ZvbHRhZ2V9YFxuICB9XG5cbiAgY29uc3Qgc3RhcnRzQ2xvc2VkID0gc2ltdWxhdGlvblN3aXRjaC5zdGFydHNfY2xvc2VkID8/IGZhbHNlXG4gIGNvbnN0IGNsb3Nlc0F0ID0gc2ltdWxhdGlvblN3aXRjaC5jbG9zZXNfYXQgPz8gMFxuICBjb25zdCBvcGVuc0F0ID0gc2ltdWxhdGlvblN3aXRjaC5vcGVuc19hdFxuICBjb25zdCBzd2l0Y2hpbmdGcmVxdWVuY3kgPSBzaW11bGF0aW9uU3dpdGNoLnN3aXRjaGluZ19mcmVxdWVuY3lcblxuICBjb25zdCBbaW5pdGlhbFZvbHRhZ2UsIHB1bHNlZFZvbHRhZ2VdID0gc3RhcnRzQ2xvc2VkXG4gICAgPyBbaGlnaFZvbHRhZ2UsIGxvd1ZvbHRhZ2VdXG4gICAgOiBbbG93Vm9sdGFnZSwgaGlnaFZvbHRhZ2VdXG5cbiAgaWYgKHN3aXRjaGluZ0ZyZXF1ZW5jeSAmJiBzd2l0Y2hpbmdGcmVxdWVuY3kgPiAwKSB7XG4gICAgY29uc3QgcGVyaW9kID0gMSAvIHN3aXRjaGluZ0ZyZXF1ZW5jeVxuICAgIGNvbnN0IHdpZHRoRnJvbU9wZW5DbG9zZSA9XG4gICAgICBvcGVuc0F0ICYmIG9wZW5zQXQgPiBjbG9zZXNBdCA/IE1hdGgubWluKG9wZW5zQXQgLSBjbG9zZXNBdCwgcGVyaW9kKSA6IDBcbiAgICBjb25zdCBwdWxzZVdpZHRoID1cbiAgICAgIHdpZHRoRnJvbU9wZW5DbG9zZSA+IDAgPyB3aWR0aEZyb21PcGVuQ2xvc2UgOiBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKG9wZW5zQXQgIT09IHVuZGVmaW5lZCAmJiBvcGVuc0F0ID4gY2xvc2VzQXQpIHtcbiAgICBjb25zdCBwdWxzZVdpZHRoID0gTWF0aC5tYXgob3BlbnNBdCAtIGNsb3Nlc0F0LCAxZS05KVxuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICsgcHVsc2VXaWR0aCAqIDJcblxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIGlmIChjbG9zZXNBdCA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSBjbG9zZXNBdCAqIDJcbiAgICBjb25zdCBwdWxzZVdpZHRoID0gTWF0aC5tYXgocGVyaW9kIC8gMiwgMWUtOSlcbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICByZXR1cm4gYERDICR7c3RhcnRzQ2xvc2VkID8gaGlnaFZvbHRhZ2UgOiBsb3dWb2x0YWdlfWBcbn1cblxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyRm9yU3BpY2UodmFsdWU6IG51bWJlcikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBgJHt2YWx1ZX1gXG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFwiMFwiXG5cbiAgY29uc3QgYWJzVmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoYWJzVmFsdWUgPj0gMWUzIHx8IGFic1ZhbHVlIDw9IDFlLTMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRXhwb25lbnRpYWwoNikpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKClcbn1cbiIsICJleHBvcnQgY2xhc3MgU3BpY2VTdWJjaXJjdWl0IHtcbiAgbmFtZTogc3RyaW5nXG4gIHBpbnM6IHN0cmluZ1tdXG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwaW5zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLnBpbnMgPSBwaW5zXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGluU3RyaW5nID0gdGhpcy5waW5zLmpvaW4oXCIgXCIpXG4gICAgY29uc3QgaGVhZGVyID0gYC5TVUJDS1QgJHt0aGlzLm5hbWV9ICR7cGluU3RyaW5nfWBcbiAgICBjb25zdCBmb290ZXIgPSBgLkVORFMgJHt0aGlzLm5hbWV9YFxuXG4gICAgY29uc3QgYm9keSA9IGAqIFBsYWNlaG9sZGVyIGZvciAke3RoaXMubmFtZX0uIE5vIGRlZmluaXRpb24gZm91bmQgaW4gY2lyY3VpdCBKU09OLmBcblxuICAgIHJldHVybiBbXCJcIiwgaGVhZGVyLCBib2R5LCBmb290ZXJdLmpvaW4oXCJcXG5cIilcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgYWNNYWduaXR1ZGU/OiBzdHJpbmdcbiAgYWNQaGFzZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQ3VycmVudFNvdXJjZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImN1cnJlbnRfc291cmNlXCIgYXMgY29uc3RcbiAgcHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIHZhbHVlLCBhY01hZ25pdHVkZSwgYWNQaGFzZSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSSR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgfVxuICAgIGlmIChhY01hZ25pdHVkZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCBBQyAke2FjTWFnbml0dWRlfWBcbiAgICAgIGlmIChhY1BoYXNlKSB7XG4gICAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthY1BoYXNlfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGluZHVjdG9yczogc3RyaW5nW11cbiAgY291cGxpbmc6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yX2NvdXBsaW5nXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgaW5kdWN0b3JzLCBjb3VwbGluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgSyR7bmFtZX0gJHtpbmR1Y3RvcnMuam9pbihcIiBcIil9ICR7Y291cGxpbmd9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSkZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEpGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJqZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEpGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSkZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgZHJhaW4sIGdhdGUsIHNvdXJjZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSiR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBNT1NGRVRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgZHJhaW46IHN0cmluZ1xuICBnYXRlOiBzdHJpbmdcbiAgc291cmNlOiBzdHJpbmdcbiAgc3Vic3RyYXRlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBsZW5ndGg/OiBzdHJpbmdcbiAgd2lkdGg/OiBzdHJpbmdcbiAgZHJhaW5BcmVhPzogc3RyaW5nXG4gIHNvdXJjZUFyZWE/OiBzdHJpbmdcbiAgZHJhaW5QZXJpbWV0ZXI/OiBzdHJpbmdcbiAgc291cmNlUGVyaW1ldGVyPzogc3RyaW5nXG4gIGRyYWluUmVzaXN0YW5jZT86IHN0cmluZ1xuICBzb3VyY2VSZXNpc3RhbmNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBNT1NGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJtb3NmZXRcIiBhcyBjb25zdFxuICBwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBkcmFpbixcbiAgICAgIGdhdGUsXG4gICAgICBzb3VyY2UsXG4gICAgICBzdWJzdHJhdGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHdpZHRoLFxuICAgICAgZHJhaW5BcmVhLFxuICAgICAgc291cmNlQXJlYSxcbiAgICAgIGRyYWluUGVyaW1ldGVyLFxuICAgICAgc291cmNlUGVyaW1ldGVyLFxuICAgICAgZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgc291cmNlUmVzaXN0YW5jZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYE0ke25hbWV9ICR7ZHJhaW59ICR7Z2F0ZX0gJHtzb3VyY2V9ICR7c3Vic3RyYXRlfSAke21vZGVsfWBcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIEw6IGxlbmd0aCxcbiAgICAgIFc6IHdpZHRoLFxuICAgICAgQUQ6IGRyYWluQXJlYSxcbiAgICAgIEFTOiBzb3VyY2VBcmVhLFxuICAgICAgUEQ6IGRyYWluUGVyaW1ldGVyLFxuICAgICAgUFM6IHNvdXJjZVBlcmltZXRlcixcbiAgICAgIE5SRDogZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgTlJTOiBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ViY2lyY3VpdENhbGxDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgbm9kZXM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmNpcmN1aXRDYWxsQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwic3ViY2lyY3VpdF9jYWxsXCIgYXMgY29uc3RcbiAgcHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBub2Rlcywgc3ViY2lyY3VpdE5hbWUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gYFgke25hbWV9ICR7bm9kZXMuam9pbihcIiBcIil9ICR7c3ViY2lyY3VpdE5hbWV9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBhUG9zaXRpdmU6IHN0cmluZ1xuICBhTmVnYXRpdmU6IHN0cmluZ1xuICBiUG9zaXRpdmU6IHN0cmluZ1xuICBiTmVnYXRpdmU6IHN0cmluZ1xuICBpbXBlZGFuY2U6IHN0cmluZ1xuICBkZWxheT86IHN0cmluZ1xuICBmcmVxdWVuY3k/OiBzdHJpbmdcbiAgbm9ybWFsaXplZExlbmd0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInRyYW5zbWlzc2lvbl9saW5lXCIgYXMgY29uc3RcbiAgcHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogVHJhbnNtaXNzaW9uTGluZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBhUG9zaXRpdmUsXG4gICAgICBhTmVnYXRpdmUsXG4gICAgICBiUG9zaXRpdmUsXG4gICAgICBiTmVnYXRpdmUsXG4gICAgICBpbXBlZGFuY2UsXG4gICAgICBkZWxheSxcbiAgICAgIGZyZXF1ZW5jeSxcbiAgICAgIG5vcm1hbGl6ZWRMZW5ndGgsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgVCR7bmFtZX0gJHthUG9zaXRpdmV9ICR7YU5lZ2F0aXZlfSAke2JQb3NpdGl2ZX0gJHtiTmVnYXRpdmV9IFowPSR7aW1wZWRhbmNlfWBcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgVEQ9JHtkZWxheX1gXG4gICAgfSBlbHNlIGlmIChmcmVxdWVuY3kpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgRj0ke2ZyZXF1ZW5jeX1gXG4gICAgICBpZiAobm9ybWFsaXplZExlbmd0aCkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgIE5MPSR7bm9ybWFsaXplZExlbmd0aH1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sSUFBTSw4QkFBOEIsQ0FBQyxZQUFrQztBQUM1RSxRQUFNLFFBQWtCLENBQUM7QUFHekIsUUFBTSxLQUFLLFFBQVEsS0FBSztBQUd4QixNQUFJLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFDM0IsVUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ25EO0FBR0EsYUFBVyxhQUFhLFFBQVEsWUFBWTtBQUMxQyxVQUFNLEtBQUssVUFBVSxjQUFjLENBQUM7QUFBQSxFQUN0QztBQUdBLGFBQVcsY0FBYyxRQUFRLGFBQWE7QUFDNUMsVUFB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
964
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZVNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0JKVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9NT1NGRVRDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0N1cnJlbnRTb3VyY2VDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1N1YmNpcmN1aXRDYWxsQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVHJhbnNtaXNzaW9uTGluZUNvbW1hbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgLy8gQWRkIHN1YmNpcmN1aXQgZGVmaW5pdGlvbnNcbiAgZm9yIChjb25zdCBzdWJjaXJjdWl0IG9mIG5ldGxpc3Quc3ViY2lyY3VpdHMpIHtcbiAgICBsaW5lcy5wdXNoKHN1YmNpcmN1aXQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QucHJpbnRTdGF0ZW1lbnRzKVxuICB9XG5cbiAgLy8gQWRkIGNvbnRyb2wgYmxvY2sgaWYgcHJlc2VudFxuICBpZiAobmV0bGlzdC5jb250cm9scy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaChcIi5jb250cm9sXCIpXG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LmNvbnRyb2xzKVxuICAgIGxpbmVzLnB1c2goXCIuZW5kY1wiKVxuICB9XG5cbiAgaWYgKFxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgJiZcbiAgICAhbGluZXMuc29tZSgobCkgPT4gbC50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiLnRyYW5cIikpXG4gICkge1xuICAgIGxpbmVzLnB1c2gobmV0bGlzdC50cmFuQ29tbWFuZClcbiAgfVxuXG4gIC8vIEVuZCB3aXRoIC5FTkRcbiAgbGluZXMucHVzaChcIi5FTkRcIilcblxuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKVxufVxuIiwgImltcG9ydCB7IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyB9IGZyb20gXCIuLi9zcGljZS11dGlscy9jb252ZXJ0U3BpY2VOZXRsaXN0VG9TdHJpbmdcIlxuaW1wb3J0IHR5cGUgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCIuL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcIi4vU3BpY2VTdWJjaXJjdWl0XCJcblxuZXhwb3J0IGNsYXNzIFNwaWNlTmV0bGlzdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgY29tcG9uZW50czogU3BpY2VDb21wb25lbnRbXVxuICBub2RlczogU2V0PHN0cmluZz5cbiAgY29udHJvbHM6IHN0cmluZ1tdXG4gIHN1YmNpcmN1aXRzOiBTcGljZVN1YmNpcmN1aXRbXVxuICBtb2RlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgdHJhbkNvbW1hbmQ6IHN0cmluZyB8IG51bGxcbiAgcHJpbnRTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy50cmFuQ29tbWFuZCA9IG51bGxcbiAgICB0aGlzLnByaW50U3RhdGVtZW50cyA9IFtdXG4gIH1cblxuICBhZGRDb21wb25lbnQoY29tcG9uZW50OiBTcGljZUNvbXBvbmVudCkge1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudClcbiAgICAvLyBBZGQgbm9kZXMgdG8gdGhlIHNldFxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjb21wb25lbnQubm9kZXMpIHtcbiAgICAgIHRoaXMubm9kZXMuYWRkKG5vZGUpXG4gICAgfVxuICB9XG5cbiAgYWRkU3ViY2lyY3VpdChzdWJjaXJjdWl0OiBTcGljZVN1YmNpcmN1aXQpIHtcbiAgICBpZiAodGhpcy5zdWJjaXJjdWl0cy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHN1YmNpcmN1aXQubmFtZSkpIHJldHVyblxuICAgIHRoaXMuc3ViY2lyY3VpdHMucHVzaChzdWJjaXJjdWl0KVxuICB9XG5cbiAgdG9TcGljZVN0cmluZygpIHtcbiAgICByZXR1cm4gY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nKHRoaXMpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi4vc3BpY2UtY29tbWFuZHMvQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBjbGFzcyBTcGljZUNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZ1xuICBjb21tYW5kOiBCYXNlU3BpY2VDb21tYW5kXG4gIG5vZGVzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZCwgbm9kZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLm5vZGVzID0gbm9kZXNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnRvU3BpY2VTdHJpbmcoKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ2b2x0YWdlX3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFZvbHRhZ2VTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFYke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIERpb2RlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgRGlvZGVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJkaW9kZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBEaW9kZUNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCBhcmVhIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEQke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbD86IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIGluaXRpYWxDb25kaXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEluZHVjdG9yQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCBtb2RlbCwgdmFsdWUsIGluaXRpYWxDb25kaXRpb24gfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEwke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7bW9kZWx9YFxuICAgIH1cbiAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIGlmIChpbml0aWFsQ29uZGl0aW9uKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIElDPSR7aW5pdGlhbENvbmRpdGlvbn1gXG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTU9TRkVUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRyYWluOiBzdHJpbmdcbiAgZ2F0ZTogc3RyaW5nXG4gIHNvdXJjZTogc3RyaW5nXG4gIHN1YnN0cmF0ZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgbGVuZ3RoPzogc3RyaW5nXG4gIHdpZHRoPzogc3RyaW5nXG4gIGRyYWluQXJlYT86IHN0cmluZ1xuICBzb3VyY2VBcmVhPzogc3RyaW5nXG4gIGRyYWluUGVyaW1ldGVyPzogc3RyaW5nXG4gIHNvdXJjZVBlcmltZXRlcj86IHN0cmluZ1xuICBkcmFpblJlc2lzdGFuY2U/OiBzdHJpbmdcbiAgc291cmNlUmVzaXN0YW5jZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgTU9TRkVUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwibW9zZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBNT1NGRVRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgZHJhaW4sXG4gICAgICBnYXRlLFxuICAgICAgc291cmNlLFxuICAgICAgc3Vic3RyYXRlLFxuICAgICAgbW9kZWwsXG4gICAgICBsZW5ndGgsXG4gICAgICB3aWR0aCxcbiAgICAgIGRyYWluQXJlYSxcbiAgICAgIHNvdXJjZUFyZWEsXG4gICAgICBkcmFpblBlcmltZXRlcixcbiAgICAgIHNvdXJjZVBlcmltZXRlcixcbiAgICAgIGRyYWluUmVzaXN0YW5jZSxcbiAgICAgIHNvdXJjZVJlc2lzdGFuY2UsXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGxldCBzcGljZVN0cmluZyA9IGBNJHtuYW1lfSAke2RyYWlufSAke2dhdGV9ICR7c291cmNlfSAke3N1YnN0cmF0ZX0gJHttb2RlbH1gXG5cbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSB7XG4gICAgICBMOiBsZW5ndGgsXG4gICAgICBXOiB3aWR0aCxcbiAgICAgIEFEOiBkcmFpbkFyZWEsXG4gICAgICBBUzogc291cmNlQXJlYSxcbiAgICAgIFBEOiBkcmFpblBlcmltZXRlcixcbiAgICAgIFBTOiBzb3VyY2VQZXJpbWV0ZXIsXG4gICAgICBOUkQ6IGRyYWluUmVzaXN0YW5jZSxcbiAgICAgIE5SUzogc291cmNlUmVzaXN0YW5jZSxcbiAgICB9XG5cbiAgICBPYmplY3QuZW50cmllcyhwYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHtrZXl9PSR7dmFsdWV9YFxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHBvc2l0aXZlQ29udHJvbDogc3RyaW5nXG4gIG5lZ2F0aXZlQ29udHJvbDogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9jb250cm9sbGVkX3N3aXRjaFwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICBuZWdhdGl2ZUNvbnRyb2wsXG4gICAgICBtb2RlbCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgUyR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke3Bvc2l0aXZlQ29udHJvbH0gJHtuZWdhdGl2ZUNvbnRyb2x9ICR7bW9kZWx9YFxuICB9XG59XG4iLCAiaW1wb3J0IHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwiLi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB7IFJlc2lzdG9yQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZFwiXG5pbXBvcnQgeyBDYXBhY2l0b3JDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL1ZvbHRhZ2VTb3VyY2VDb21tYW5kXCJcbmltcG9ydCB7IEJKVENvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9CSlRDb21tYW5kXCJcbmltcG9ydCB7IERpb2RlQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZFwiXG5pbXBvcnQgeyBJbmR1Y3RvckNvbW1hbmQgfSBmcm9tIFwiLi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvbW1hbmRcIlxuaW1wb3J0IHsgTU9TRkVUQ29tbWFuZCB9IGZyb20gXCIuL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmRcIlxuaW1wb3J0IHsgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kIH0gZnJvbSBcIi4vc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kXCJcbmltcG9ydCB0eXBlIHtcbiAgQW55Q2lyY3VpdEVsZW1lbnQsXG4gIFNpbXVsYXRpb25Td2l0Y2gsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbiB9IGZyb20gXCJjaXJjdWl0LWpzb24tdG8tY29ubmVjdGl2aXR5LW1hcFwiXG5pbXBvcnQgeyBzdSB9IGZyb20gXCJAdHNjaXJjdWl0L2NpcmN1aXQtanNvbi11dGlsXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNpcmN1aXRKc29uVG9TcGljZShcbiAgY2lyY3VpdEpzb246IEFueUNpcmN1aXRFbGVtZW50W10sXG4pOiBTcGljZU5ldGxpc3Qge1xuICBjb25zdCBuZXRsaXN0ID0gbmV3IFNwaWNlTmV0bGlzdChcIiogQ2lyY3VpdCBKU09OIHRvIFNQSUNFIE5ldGxpc3RcIilcbiAgY29uc3Qgc291cmNlQ29tcG9uZW50cyA9IHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfY29tcG9uZW50Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VQb3J0cyA9IHN1KGNpcmN1aXRKc29uKS5zb3VyY2VfcG9ydC5saXN0KClcbiAgY29uc3Qgc291cmNlVHJhY2VzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV90cmFjZS5saXN0KClcbiAgY29uc3Qgc2ltdWxhdGlvblByb2JlcyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVcIixcbiAgKSBhcyBTaW11bGF0aW9uVm9sdGFnZVByb2JlW11cbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaGVzID0gY2lyY3VpdEpzb25cbiAgICAuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+IChlbGVtZW50IGFzIHsgdHlwZT86IHN0cmluZyB9KS50eXBlID09PSBcInNpbXVsYXRpb25fc3dpdGNoXCIsXG4gICAgKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQgYXMgdW5rbm93biBhcyBTaW11bGF0aW9uU3dpdGNoKVxuICBjb25zdCBzaW11bGF0aW9uU3dpdGNoTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNpbXVsYXRpb25Td2l0Y2g+KClcblxuICBmb3IgKGNvbnN0IHNpbVN3aXRjaCBvZiBzaW11bGF0aW9uU3dpdGNoZXMpIHtcbiAgICBpZiAoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQpIHtcbiAgICAgIHNpbXVsYXRpb25Td2l0Y2hNYXAuc2V0KHNpbVN3aXRjaC5zb3VyY2VfY29tcG9uZW50X2lkLCBzaW1Td2l0Y2gpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29ubk1hcCA9IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24oY2lyY3VpdEpzb24pXG5cbiAgLy8gQ3JlYXRlIG5vZGUgbWFwcGluZyBmcm9tIHBvcnQgY29ubmVjdGlvbnNcbiAgY29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgY29uc3QgbmV0VG9Ob2RlTmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgbGV0IG5vZGVDb3VudGVyID0gMVxuXG4gIGNvbnN0IHByb2JlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAocHJvYmUubmFtZSkge1xuICAgICAgICBwcm9iZU5hbWVzLmFkZChwcm9iZS5uYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBwcm9iZSBuYW1lcyBsaWtlIE4xLCBOMiwgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgY29uZmxpY3RzXG4gIGNvbnN0IG51bWVyaWNQcm9iZU5hbWVzID0gWy4uLnByb2JlTmFtZXNdXG4gICAgLm1hcCgobmFtZSkgPT4gL15OKFxcZCspJC9pLmV4ZWMobmFtZSkpXG4gICAgLmZpbHRlcigobSk6IG0gaXMgUmVnRXhwRXhlY0FycmF5ID0+IG0gIT09IG51bGwpXG4gICAgLm1hcCgobSkgPT4gcGFyc2VJbnQobVsxXSwgMTApKVxuXG4gIGlmIChudW1lcmljUHJvYmVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgbm9kZUNvdW50ZXIgPSBNYXRoLm1heCguLi5udW1lcmljUHJvYmVOYW1lcykgKyAxXG4gIH1cblxuICBjb25zdCBncm91bmROZXRzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAvLyBGaW5kIGdyb3VuZCBmcm9tIHNvdXJjZSBuZXRzIHRoYXQgaW5jbHVkZSBcImduZFwiIGluIHRoZSBuYW1lXG4gIGNvbnN0IGduZFNvdXJjZU5ldElkcyA9IG5ldyBTZXQoXG4gICAgc3UoY2lyY3VpdEpzb24pXG4gICAgICAuc291cmNlX25ldC5saXN0KClcbiAgICAgIC5maWx0ZXIoKHNuKSA9PiBzbi5uYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiZ25kXCIpKVxuICAgICAgLm1hcCgoc24pID0+IHNuLnNvdXJjZV9uZXRfaWQpLFxuICApXG5cbiAgaWYgKGduZFNvdXJjZU5ldElkcy5zaXplID4gMCkge1xuICAgIGZvciAoY29uc3QgdHJhY2Ugb2Ygc3UoY2lyY3VpdEpzb24pLnNvdXJjZV90cmFjZS5saXN0KCkpIHtcbiAgICAgIGlmICh0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaXNPbkduZE5ldCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfbmV0X2lkcy5zb21lKChuZXRJZCkgPT5cbiAgICAgICAgICBnbmRTb3VyY2VOZXRJZHMuaGFzKG5ldElkKSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoaXNPbkduZE5ldCkge1xuICAgICAgICAgIGNvbnN0IGFQb3J0T25HbmQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgY29uc3QgZ25kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGFQb3J0T25HbmQpXG4gICAgICAgICAgaWYgKGduZE5ldCkge1xuICAgICAgICAgICAgZ3JvdW5kTmV0cy5hZGQoZ25kTmV0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgZ3JvdW5kIG5vZGUgZnJvbSBwb3J0cyBuYW1lZCBcIkdORFwiXG4gIGNvbnN0IGdyb3VuZFBvcnRzID0gc291cmNlUG9ydHMuZmlsdGVyKChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZ25kXCIpXG4gIGZvciAoY29uc3QgZ3JvdW5kUG9ydCBvZiBncm91bmRQb3J0cykge1xuICAgIGNvbnN0IGdyb3VuZE5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChncm91bmRQb3J0LnNvdXJjZV9wb3J0X2lkKVxuICAgIGlmIChncm91bmROZXQpIHtcbiAgICAgIGdyb3VuZE5ldHMuYWRkKGdyb3VuZE5ldClcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzdShjaXJjdWl0SnNvbikuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZS5saXN0KCkpIHtcbiAgICBjb25zdCBuZWdfcG9ydF9pZCA9XG4gICAgICAoc2ltU291cmNlIGFzIGFueSkubmVnYXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcbiAgICBpZiAobmVnX3BvcnRfaWQpIHtcbiAgICAgIGNvbnN0IGduZF9uZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQobmVnX3BvcnRfaWQpXG4gICAgICBpZiAoZ25kX25ldCkge1xuICAgICAgICBncm91bmROZXRzLmFkZChnbmRfbmV0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZ3JvdW5kTmV0IG9mIGdyb3VuZE5ldHMpIHtcbiAgICBuZXRUb05vZGVOYW1lLnNldChncm91bmROZXQsIFwiMFwiKVxuICB9XG5cbiAgLy8gUHJlLWFzc2lnbiBub2RlIG5hbWVzIGZyb20gdm9sdGFnZSBwcm9iZXNcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgaWYgKCFwcm9iZS5uYW1lKSBjb250aW51ZVxuXG4gICAgICBpZiAoXG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfcG9ydF9pZCB8fFxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBuZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcbiAgICAgIGNvbnN0IHNpZ25hbF9wb3J0X2lkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBzaWduYWxfbmV0X2lkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWRcblxuICAgICAgaWYgKHNpZ25hbF9wb3J0X2lkKSB7XG4gICAgICAgIG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChzaWduYWxfcG9ydF9pZClcbiAgICAgIH0gZWxzZSBpZiAoc2lnbmFsX25ldF9pZCkge1xuICAgICAgICBjb25zdCB0cmFjZSA9IHNvdXJjZVRyYWNlcy5maW5kKCh0KSA9PlxuICAgICAgICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKHNpZ25hbF9uZXRfaWQhKSxcbiAgICAgICAgKVxuICAgICAgICBpZiAodHJhY2UgJiYgdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcG9ydElkID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxuICAgICAgICAgIG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChwb3J0SWQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ldCkge1xuICAgICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgICBuZXRUb05vZGVOYW1lLnNldChuZXQsIHByb2JlLm5hbWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2lnbmFsX3BvcnRfaWQgJiYgcHJvYmUubmFtZSkge1xuICAgICAgICAvLyBJdCdzIGEgZmxvYXRpbmcgcG9ydCB3aXRoIGEgcHJvYmUsIHNvIHdlIG1hcCBpdCBkaXJlY3RseS4gVGhpcyBwb3J0XG4gICAgICAgIC8vIHdpbGwgbm93IGJlIHNraXBwZWQgaW4gdGhlIHNlY29uZC1wYXNzIGZvciB1bmNvbm5lY3RlZCBwb3J0cy5cbiAgICAgICAgbm9kZU1hcC5zZXQoc2lnbmFsX3BvcnRfaWQsIHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmlyc3QgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byBhbGwgY29ubmVjdGVkIG5ldHNcbiAgZm9yIChjb25zdCBwb3J0IG9mIHNvdXJjZVBvcnRzKSB7XG4gICAgY29uc3QgcG9ydElkID0gcG9ydC5zb3VyY2VfcG9ydF9pZFxuICAgIGNvbnN0IG5ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChwb3J0SWQpXG4gICAgaWYgKG5ldCkge1xuICAgICAgaWYgKCFuZXRUb05vZGVOYW1lLmhhcyhuZXQpKSB7XG4gICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICAgIH1cbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgbmV0VG9Ob2RlTmFtZS5nZXQobmV0KSEpXG4gICAgfVxuICB9XG5cbiAgLy8gU2Vjb25kIHBhc3M6IGFzc2lnbiBub2RlIG51bWJlcnMgdG8gdW5jb25uZWN0ZWQgcG9ydHNcbiAgZm9yIChjb25zdCBwb3J0IG9mIHNvdXJjZVBvcnRzKSB7XG4gICAgY29uc3QgcG9ydElkID0gcG9ydC5zb3VyY2VfcG9ydF9pZFxuICAgIC8vIElmIGEgcG9ydCB3YXNuJ3QgaW4gYSBuZXQsIGl0IHdvbid0IGJlIGluIHRoZSBub2RlTWFwIHlldFxuICAgIGlmICghbm9kZU1hcC5oYXMocG9ydElkKSkge1xuICAgICAgLy8gVW5jb25uZWN0ZWQgcG9ydCwgY3JlYXRlIGEgbmV3IGZsb2F0aW5nIG5vZGUgZm9yIGl0XG4gICAgICBub2RlTWFwLnNldChwb3J0SWQsIGBOJHtub2RlQ291bnRlcisrfWApXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvY2VzcyBlYWNoIGNvbXBvbmVudFxuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBzb3VyY2VDb21wb25lbnRzKSB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlICE9PSBcInNvdXJjZV9jb21wb25lbnRcIikgY29udGludWVcblxuICAgIGNvbnN0IGNvbXBvbmVudFBvcnRzID0gc3UoY2lyY3VpdEpzb24pXG4gICAgICAuc291cmNlX3BvcnQubGlzdCh7XG4gICAgICAgIHNvdXJjZV9jb21wb25lbnRfaWQ6IGNvbXBvbmVudC5zb3VyY2VfY29tcG9uZW50X2lkLFxuICAgICAgfSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5waW5fbnVtYmVyID8/IDApIC0gKGIucGluX251bWJlciA/PyAwKSlcblxuICAgIC8vIEdldCBub2RlIG5hbWVzIGZvciBjb21wb25lbnQgcG9ydHNcbiAgICBjb25zdCBub2RlcyA9IGNvbXBvbmVudFBvcnRzLm1hcCgocG9ydCkgPT4ge1xuICAgICAgcmV0dXJuIG5vZGVNYXAuZ2V0KHBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG4gICAgfSlcblxuICAgIC8vIENyZWF0ZSBTUElDRSBjb21wb25lbnQgYmFzZWQgb24gdHlwZVxuICAgIGlmIChcImZ0eXBlXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICBsZXQgc3BpY2VDb21wb25lbnQ6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9IG51bGxcblxuICAgICAgc3dpdGNoIChjb21wb25lbnQuZnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInNpbXBsZV9yZXNpc3RvclwiOiB7XG4gICAgICAgICAgaWYgKFwicmVzaXN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc2lzdG9yQ21kID0gbmV3IFJlc2lzdG9yQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IG5vZGVzWzBdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0UmVzaXN0YW5jZShjb21wb25lbnQucmVzaXN0YW5jZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICByZXNpc3RvckNtZCxcbiAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9zd2l0Y2hcIjoge1xuICAgICAgICAgIGNvbnN0IHNhbml0aXplZEJhc2UgPSBzYW5pdGl6ZUlkZW50aWZpZXIoXG4gICAgICAgICAgICBjb21wb25lbnQubmFtZSA/PyBjb21wb25lbnQuc291cmNlX2NvbXBvbmVudF9pZCxcbiAgICAgICAgICAgIFwiU1dcIixcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZXNbMF0gfHwgXCIwXCJcbiAgICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2Rlc1sxXSB8fCBcIjBcIlxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xOb2RlID0gYE5DVFJMXyR7c2FuaXRpemVkQmFzZX1gXG4gICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gYFNXXyR7c2FuaXRpemVkQmFzZX1gXG5cbiAgICAgICAgICBjb25zdCBhc3NvY2lhdGVkU2ltdWxhdGlvblN3aXRjaCA9IHNpbXVsYXRpb25Td2l0Y2hNYXAuZ2V0KFxuICAgICAgICAgICAgY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gYnVpbGRTaW11bGF0aW9uU3dpdGNoQ29udHJvbFZhbHVlKFxuICAgICAgICAgICAgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2gsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3Qgc3dpdGNoQ21kID0gbmV3IFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCh7XG4gICAgICAgICAgICBuYW1lOiBzYW5pdGl6ZWRCYXNlLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgcG9zaXRpdmVDb250cm9sOiBjb250cm9sTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlQ29udHJvbDogXCIwXCIsXG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChzYW5pdGl6ZWRCYXNlLCBzd2l0Y2hDbWQsIFtcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIGNvbnRyb2xOb2RlLFxuICAgICAgICAgICAgXCIwXCIsXG4gICAgICAgICAgXSlcblxuICAgICAgICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSBTVyhSb249MC4xIFJvZmY9MWU5IFZ0PTIuNSBWaD0wLjEpYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb250cm9sU291cmNlTmFtZSA9IGBDVFJMXyR7c2FuaXRpemVkQmFzZX1gXG4gICAgICAgICAgY29uc3QgY29udHJvbFNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgICBuYW1lOiBjb250cm9sU291cmNlTmFtZSxcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogY29udHJvbE5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGU6IFwiMFwiLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnRyb2xWYWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgY29udHJvbENvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgIGNvbnRyb2xTb3VyY2VOYW1lLFxuICAgICAgICAgICAgY29udHJvbFNvdXJjZUNtZCxcbiAgICAgICAgICAgIFtjb250cm9sTm9kZSwgXCIwXCJdLFxuICAgICAgICAgIClcblxuICAgICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KGNvbnRyb2xDb21wb25lbnQpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgXCJzaW1wbGVfY2FwYWNpdG9yXCI6IHtcbiAgICAgICAgICBpZiAoXCJjYXBhY2l0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcGFjaXRvckNtZCA9IG5ldyBDYXBhY2l0b3JDb21tYW5kKHtcbiAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICAgICAgICAgIHZhbHVlOiBmb3JtYXRDYXBhY2l0YW5jZShjb21wb25lbnQuY2FwYWNpdGFuY2UpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgICBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgY2FwYWNpdG9yQ21kLFxuICAgICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2Rpb2RlXCI6IHtcbiAgICAgICAgICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCBhbm9kZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYW5vZGVcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJhbm9kZVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGNhdGhvZGVQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNhdGhvZGVcIiB8fFxuICAgICAgICAgICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjYXRob2RlXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoYW5vZGVQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgICAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoY2F0aG9kZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IFwiRFwiXG4gICAgICAgICAgICBjb25zdCBkaW9kZUNtZCA9IG5ldyBEaW9kZUNvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsIC8vIGdlbmVyaWMgbW9kZWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQobW9kZWxOYW1lLCBgLk1PREVMICR7bW9kZWxOYW1lfSBEYClcbiAgICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lLCBkaW9kZUNtZCwgW1xuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9pbmR1Y3RvclwiOiB7XG4gICAgICAgICAgaWYgKFwiaW5kdWN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZHVjdG9yQ21kID0gbmV3IEluZHVjdG9yQ29tbWFuZCh7XG4gICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBwb3NpdGl2ZU5vZGU6IG5vZGVzWzBdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgICAgICAgICB2YWx1ZTogZm9ybWF0SW5kdWN0YW5jZShjb21wb25lbnQuaW5kdWN0YW5jZSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICBpbmR1Y3RvckNtZCxcbiAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9tb3NmZXRcIjoge1xuICAgICAgICAgIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyYWluUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJkcmFpblwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImRyYWluXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZ2F0ZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiZ2F0ZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImdhdGVcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcInNvdXJjZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcInNvdXJjZVwiKSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgZHJhaW5Ob2RlID1cbiAgICAgICAgICAgICAgbm9kZU1hcC5nZXQoZHJhaW5Qb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgICAgICAgICAgY29uc3QgZ2F0ZU5vZGUgPSBub2RlTWFwLmdldChnYXRlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChzb3VyY2VQb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuXG4gICAgICAgICAgICAvLyBGb3IgMy1waW4gTU9TRkVUcywgc3Vic3RyYXRlIGlzIHR5cGljYWxseSBjb25uZWN0ZWQgdG8gc291cmNlXG4gICAgICAgICAgICBjb25zdCBzdWJzdHJhdGVOb2RlID0gc291cmNlTm9kZVxuXG4gICAgICAgICAgICBjb25zdCBjaGFubmVsX3R5cGUgPSAoY29tcG9uZW50IGFzIGFueSkuY2hhbm5lbF90eXBlID8/IFwiblwiXG4gICAgICAgICAgICBjb25zdCBtb3NmZXRfbW9kZSA9IChjb21wb25lbnQgYXMgYW55KS5tb3NmZXRfbW9kZSA/PyBcImVuaGFuY2VtZW50XCJcblxuICAgICAgICAgICAgY29uc3QgbW9kZWxUeXBlID0gYCR7Y2hhbm5lbF90eXBlLnRvVXBwZXJDYXNlKCl9TU9TYFxuICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gYCR7bW9kZWxUeXBlfV8ke21vc2ZldF9tb2RlLnRvVXBwZXJDYXNlKCl9YFxuXG4gICAgICAgICAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICAgICAgICAgIGlmIChtb3NmZXRfbW9kZSA9PT0gXCJlbmhhbmNlbWVudFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdnRvID0gY2hhbm5lbF90eXBlID09PSBcInBcIiA/IC0xIDogMVxuICAgICAgICAgICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9ICR7bW9kZWxUeXBlfSAoVlRPPSR7dnRvfSBLUD0wLjEpYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICAgICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHttb2RlbFR5cGV9IChLUD0wLjEpYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbW9zZmV0Q21kID0gbmV3IE1PU0ZFVENvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgZHJhaW46IGRyYWluTm9kZSxcbiAgICAgICAgICAgICAgZ2F0ZTogZ2F0ZU5vZGUsXG4gICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTm9kZSxcbiAgICAgICAgICAgICAgc3Vic3RyYXRlOiBzdWJzdHJhdGVOb2RlLFxuICAgICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUsIG1vc2ZldENtZCwgW1xuICAgICAgICAgICAgICBkcmFpbk5vZGUsXG4gICAgICAgICAgICAgIGdhdGVOb2RlLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3RyYW5zaXN0b3JcIjoge1xuICAgICAgICAgIGlmIChcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3RvclBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY29sbGVjdG9yXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiY29sbGVjdG9yXCIpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgYmFzZVBvcnQgPSBjb21wb25lbnRQb3J0cy5maW5kKFxuICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmFzZVwiIHx8XG4gICAgICAgICAgICAgICAgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImJhc2VcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBlbWl0dGVyUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgIHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJlbWl0dGVyXCIgfHxcbiAgICAgICAgICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZW1pdHRlclwiKSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKCFjb2xsZWN0b3JQb3J0IHx8ICFiYXNlUG9ydCB8fCAhZW1pdHRlclBvcnQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUcmFuc2lzdG9yICR7Y29tcG9uZW50Lm5hbWV9IGlzIG1pc3NpbmcgcmVxdWlyZWQgcG9ydHMgKGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlcilgLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rvck5vZGUgPVxuICAgICAgICAgICAgICBub2RlTWFwLmdldChjb2xsZWN0b3JQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICAgICAgY29uc3QgYmFzZU5vZGUgPSBub2RlTWFwLmdldChiYXNlUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICAgICAgICAgIGNvbnN0IGVtaXR0ZXJOb2RlID0gbm9kZU1hcC5nZXQoZW1pdHRlclBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXN0b3JfdHlwZSA9IChjb21wb25lbnQgYXMgYW55KS50cmFuc2lzdG9yX3R5cGUgPz8gXCJucG5cIlxuICAgICAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gdHJhbnNpc3Rvcl90eXBlLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgICAgICAgbmV0bGlzdC5tb2RlbHMuc2V0KFxuICAgICAgICAgICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSAke3RyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYmp0Q21kID0gbmV3IEJKVENvbW1hbmQoe1xuICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgY29sbGVjdG9yOiBjb2xsZWN0b3JOb2RlLFxuICAgICAgICAgICAgICBiYXNlOiBiYXNlTm9kZSxcbiAgICAgICAgICAgICAgZW1pdHRlcjogZW1pdHRlck5vZGUsXG4gICAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUsIGJqdENtZCwgW1xuICAgICAgICAgICAgICBjb2xsZWN0b3JOb2RlLFxuICAgICAgICAgICAgICBiYXNlTm9kZSxcbiAgICAgICAgICAgICAgZW1pdHRlck5vZGUsXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGljZUNvbXBvbmVudCkge1xuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIHNpbXVsYXRpb24gdm9sdGFnZSBzb3VyY2VzXG4gIGNvbnN0IHNpbXVsYXRpb25Wb2x0YWdlU291cmNlcyA9XG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpXG5cbiAgZm9yIChjb25zdCBzaW1Tb3VyY2Ugb2Ygc2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzKSB7XG4gICAgaWYgKHNpbVNvdXJjZS50eXBlICE9PSBcInNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VcIikgY29udGludWVcblxuICAgIGlmICgoc2ltU291cmNlIGFzIGFueSkuaXNfZGNfc291cmNlID09PSBmYWxzZSkge1xuICAgICAgLy8gQUMgU291cmNlXG4gICAgICBpZiAoXG4gICAgICAgIFwidGVybWluYWwxX3NvdXJjZV9wb3J0X2lkXCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIFwidGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWQgJiZcbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9XG4gICAgICAgICAgbm9kZU1hcC5nZXQoKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldCgoc2ltU291cmNlIGFzIGFueSkudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuXG4gICAgICAgIGxldCB2YWx1ZSA9IFwiXCJcbiAgICAgICAgY29uc3Qgd2F2ZV9zaGFwZSA9IChzaW1Tb3VyY2UgYXMgYW55KS53YXZlX3NoYXBlXG4gICAgICAgIGlmICh3YXZlX3NoYXBlID09PSBcInNpbmV3YXZlXCIpIHtcbiAgICAgICAgICBjb25zdCB2X29mZnNldCA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3Qgdl9wZWFrID0gKHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgPz8gMFxuICAgICAgICAgIGNvbnN0IGZyZXEgPSAoc2ltU291cmNlIGFzIGFueSkuZnJlcXVlbmN5ID8/IDBcbiAgICAgICAgICBjb25zdCBkZWxheSA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgZGFtcGluZ19mYWN0b3IgPSAwIC8vIG5vdCBwcm92aWRlZCBpbiBjaXJjdWl0SnNvblxuICAgICAgICAgIGNvbnN0IHBoYXNlID0gKHNpbVNvdXJjZSBhcyBhbnkpLnBoYXNlID8/IDBcbiAgICAgICAgICBpZiAoZnJlcSA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gYFNJTigke3Zfb2Zmc2V0fSAke3ZfcGVha30gJHtmcmVxfSAke2RlbGF5fSAke2RhbXBpbmdfZmFjdG9yfSAke3BoYXNlfSlgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gYERDICR7KHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgPz8gMH1gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHdhdmVfc2hhcGUgPT09IFwic3F1YXJlXCIpIHtcbiAgICAgICAgICBjb25zdCB2X2luaXRpYWwgPSAwXG4gICAgICAgICAgY29uc3Qgdl9wdWxzZWQgPSAoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IChzaW1Tb3VyY2UgYXMgYW55KS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IHBlcmlvZF9mcm9tX2ZyZXEgPSBmcmVxID09PSAwID8gSW5maW5pdHkgOiAxIC8gZnJlcVxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IChzaW1Tb3VyY2UgYXMgYW55KS5wZXJpb2QgPz8gcGVyaW9kX2Zyb21fZnJlcVxuICAgICAgICAgIGNvbnN0IGR1dHlfY3ljbGUgPSAoc2ltU291cmNlIGFzIGFueSkuZHV0eV9jeWNsZSA/PyAwLjVcbiAgICAgICAgICBjb25zdCBwdWxzZV93aWR0aCA9IHBlcmlvZCAqIGR1dHlfY3ljbGVcbiAgICAgICAgICBjb25zdCBkZWxheSA9IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICBjb25zdCBmYWxsX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICB2YWx1ZSA9IGBQVUxTRSgke3ZfaW5pdGlhbH0gJHt2X3B1bHNlZH0gJHtkZWxheX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlX3dpZHRofSAke3BlcmlvZH0pYFxuICAgICAgICB9IGVsc2UgaWYgKChzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICAgIHZvbHRhZ2VTb3VyY2VDbWQsXG4gICAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICAgIClcbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEQyBTb3VyY2UgKGlzX2RjX3NvdXJjZSBpcyB0cnVlIG9yIHVuZGVmaW5lZClcbiAgICAgIGNvbnN0IHBvc2l0aXZlUG9ydElkID1cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnBvc2l0aXZlX3NvdXJjZV9wb3J0X2lkID8/XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IG5lZ2F0aXZlUG9ydElkID1cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkID8/XG4gICAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcblxuICAgICAgaWYgKFxuICAgICAgICBwb3NpdGl2ZVBvcnRJZCAmJlxuICAgICAgICBuZWdhdGl2ZVBvcnRJZCAmJlxuICAgICAgICBcInZvbHRhZ2VcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnZvbHRhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KHBvc2l0aXZlUG9ydElkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2RlTWFwLmdldChuZWdhdGl2ZVBvcnRJZCkgfHwgXCIwXCJcblxuICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgIHZhbHVlOiBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZX1gLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHZvbHRhZ2VTb3VyY2VDbWQsXG4gICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgKVxuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzaW1FeHBlcmltZW50ID0gY2lyY3VpdEpzb24uZmluZChcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX2V4cGVyaW1lbnRcIixcbiAgKVxuXG4gIGlmIChzaW1FeHBlcmltZW50KSB7XG4gICAgLy8gUHJvY2VzcyBzaW11bGF0aW9uIHZvbHRhZ2UgcHJvYmVzXG4gICAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZXNUb1Byb2JlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgY29uc3QgZ2V0UG9ydElkRnJvbU5ldElkID0gKG5ldElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSBzb3VyY2VUcmFjZXMuZmluZCgodCkgPT5cbiAgICAgICAgICB0LmNvbm5lY3RlZF9zb3VyY2VfbmV0X2lkcy5pbmNsdWRlcyhuZXRJZCksXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRyYWNlPy5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgICBsZXQgc2lnbmFsUG9ydElkID0gcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkXG4gICAgICAgIGlmICghc2lnbmFsUG9ydElkKSB7XG4gICAgICAgICAgY29uc3Qgc2lnbmFsTmV0SWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuICAgICAgICAgIGlmIChzaWduYWxOZXRJZCkge1xuICAgICAgICAgICAgc2lnbmFsUG9ydElkID0gZ2V0UG9ydElkRnJvbU5ldElkKHNpZ25hbE5ldElkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2lnbmFsUG9ydElkKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IHNpZ25hbE5vZGVOYW1lID0gbm9kZU1hcC5nZXQoc2lnbmFsUG9ydElkKVxuICAgICAgICBpZiAoIXNpZ25hbE5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICAgIGxldCByZWZlcmVuY2VQb3J0SWQgPSBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgICAgaWYgKCFyZWZlcmVuY2VQb3J0SWQgJiYgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWQpIHtcbiAgICAgICAgICByZWZlcmVuY2VQb3J0SWQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoXG4gICAgICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmZXJlbmNlUG9ydElkKSB7XG4gICAgICAgICAgY29uc3QgcmVmZXJlbmNlTm9kZU5hbWUgPSBub2RlTWFwLmdldChyZWZlcmVuY2VQb3J0SWQpXG4gICAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGVOYW1lICYmIHJlZmVyZW5jZU5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgICAgbm9kZXNUb1Byb2JlLmFkZChgVigke3NpZ25hbE5vZGVOYW1lfSwke3JlZmVyZW5jZU5vZGVOYW1lfSlgKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgICBub2Rlc1RvUHJvYmUuYWRkKGBWKCR7c2lnbmFsTm9kZU5hbWV9KWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbmdsZS1lbmRlZCBwcm9iZVxuICAgICAgICAgIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIG5vZGVzVG9Qcm9iZS5hZGQoYFYoJHtzaWduYWxOb2RlTmFtZX0pYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBub2Rlc1RvUHJvYmUuc2l6ZSA+IDAgJiZcbiAgICAgICAgKHNpbUV4cGVyaW1lbnQgYXMgYW55KS5leHBlcmltZW50X3R5cGU/LmluY2x1ZGVzKFwidHJhbnNpZW50XCIpXG4gICAgICApIHtcbiAgICAgICAgbmV0bGlzdC5wcmludFN0YXRlbWVudHMucHVzaChcbiAgICAgICAgICBgLlBSSU5UIFRSQU4gJHtbLi4ubm9kZXNUb1Byb2JlXS5qb2luKFwiIFwiKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGltZVBlclN0ZXAgPSAoc2ltRXhwZXJpbWVudCBhcyBhbnkpLnRpbWVfcGVyX3N0ZXBcbiAgICBjb25zdCBlbmRUaW1lID0gKHNpbUV4cGVyaW1lbnQgYXMgYW55KS5lbmRfdGltZV9tc1xuICAgIGNvbnN0IHN0YXJ0VGltZU1zID0gKHNpbUV4cGVyaW1lbnQgYXMgYW55KS5zdGFydF90aW1lX21zXG5cbiAgICBpZiAodGltZVBlclN0ZXAgJiYgZW5kVGltZSkge1xuICAgICAgLy8gY2lyY3VpdC1qc29uIHZhbHVlcyBhcmUgaW4gbXMsIFNQSUNFIHJlcXVpcmVzIHNlY29uZHNcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IChzdGFydFRpbWVNcyA/PyAwKSAvIDEwMDBcblxuICAgICAgbGV0IHRyYW5DbWQgPSBgLnRyYW4gJHtmb3JtYXROdW1iZXJGb3JTcGljZShcbiAgICAgICAgdGltZVBlclN0ZXAgLyAxMDAwLFxuICAgICAgKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShlbmRUaW1lIC8gMTAwMCl9YFxuICAgICAgaWYgKHN0YXJ0VGltZSA+IDApIHtcbiAgICAgICAgdHJhbkNtZCArPSBgICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2Uoc3RhcnRUaW1lKX1gXG4gICAgICB9XG4gICAgICB0cmFuQ21kICs9IFwiIFVJQ1wiXG4gICAgICBuZXRsaXN0LnRyYW5Db21tYW5kID0gdHJhbkNtZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXRsaXN0XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlc2lzdGFuY2UocmVzaXN0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHJlc2lzdGFuY2UgPj0gMWU2KSByZXR1cm4gYCR7cmVzaXN0YW5jZSAvIDFlNn1NRUdgXG4gIGlmIChyZXNpc3RhbmNlID49IDFlMykgcmV0dXJuIGAke3Jlc2lzdGFuY2UgLyAxZTN9S2BcbiAgcmV0dXJuIHJlc2lzdGFuY2UudG9TdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRDYXBhY2l0YW5jZShjYXBhY2l0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTMpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlM31NYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU2fVVgXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTl9TmBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTEyKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTEyfVBgXG4gIHJldHVybiBjYXBhY2l0YW5jZS50b1N0cmluZygpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEluZHVjdGFuY2UoaW5kdWN0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluZHVjdGFuY2UgPj0gMSkgcmV0dXJuIGluZHVjdGFuY2UudG9TdHJpbmcoKVxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS0zKSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlM31tYFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS02KSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlNn11YFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7aW5kdWN0YW5jZSAqIDFlOX1uYFxuICBpZiAoaW5kdWN0YW5jZSA+PSAxZS0xMikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTEyfXBgXG4gIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHByZWZpeDogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBwcmVmaXhcbiAgY29uc3Qgc2FuaXRpemVkID0gdmFsdWUucmVwbGFjZSgvW15BLVphLXowLTlfXS9nLCBcIl9cIilcbiAgaWYgKCFzYW5pdGl6ZWQpIHJldHVybiBwcmVmaXhcbiAgaWYgKC9eWzAtOV0vLnRlc3Qoc2FuaXRpemVkKSkge1xuICAgIHJldHVybiBgJHtwcmVmaXh9XyR7c2FuaXRpemVkfWBcbiAgfVxuICByZXR1cm4gc2FuaXRpemVkXG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgc2ltdWxhdGlvblN3aXRjaDogU2ltdWxhdGlvblN3aXRjaCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBoaWdoVm9sdGFnZSA9IDVcbiAgY29uc3QgbG93Vm9sdGFnZSA9IDBcbiAgY29uc3QgcmlzZVRpbWUgPSBcIjFuXCJcbiAgY29uc3QgZmFsbFRpbWUgPSBcIjFuXCJcblxuICBpZiAoIXNpbXVsYXRpb25Td2l0Y2gpIHtcbiAgICByZXR1cm4gYERDICR7bG93Vm9sdGFnZX1gXG4gIH1cblxuICBjb25zdCBzdGFydHNDbG9zZWQgPSBzaW11bGF0aW9uU3dpdGNoLnN0YXJ0c19jbG9zZWQgPz8gZmFsc2VcbiAgY29uc3QgY2xvc2VzQXQgPSBzaW11bGF0aW9uU3dpdGNoLmNsb3Nlc19hdCA/PyAwXG4gIGNvbnN0IG9wZW5zQXQgPSBzaW11bGF0aW9uU3dpdGNoLm9wZW5zX2F0XG4gIGNvbnN0IHN3aXRjaGluZ0ZyZXF1ZW5jeSA9IHNpbXVsYXRpb25Td2l0Y2guc3dpdGNoaW5nX2ZyZXF1ZW5jeVxuXG4gIGNvbnN0IFtpbml0aWFsVm9sdGFnZSwgcHVsc2VkVm9sdGFnZV0gPSBzdGFydHNDbG9zZWRcbiAgICA/IFtoaWdoVm9sdGFnZSwgbG93Vm9sdGFnZV1cbiAgICA6IFtsb3dWb2x0YWdlLCBoaWdoVm9sdGFnZV1cblxuICBpZiAoc3dpdGNoaW5nRnJlcXVlbmN5ICYmIHN3aXRjaGluZ0ZyZXF1ZW5jeSA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSAxIC8gc3dpdGNoaW5nRnJlcXVlbmN5XG4gICAgY29uc3Qgd2lkdGhGcm9tT3BlbkNsb3NlID1cbiAgICAgIG9wZW5zQXQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0ID8gTWF0aC5taW4ob3BlbnNBdCAtIGNsb3Nlc0F0LCBwZXJpb2QpIDogMFxuICAgIGNvbnN0IHB1bHNlV2lkdGggPVxuICAgICAgd2lkdGhGcm9tT3BlbkNsb3NlID4gMCA/IHdpZHRoRnJvbU9wZW5DbG9zZSA6IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAob3BlbnNBdCAhPT0gdW5kZWZpbmVkICYmIG9wZW5zQXQgPiBjbG9zZXNBdCkge1xuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChvcGVuc0F0IC0gY2xvc2VzQXQsIDFlLTkpXG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKyBwdWxzZVdpZHRoICogMlxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKGNsb3Nlc0F0ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICogMlxuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIHJldHVybiBgREMgJHtzdGFydHNDbG9zZWQgPyBoaWdoVm9sdGFnZSA6IGxvd1ZvbHRhZ2V9YFxufVxuXG5mdW5jdGlvbiBmb3JtYXROdW1iZXJGb3JTcGljZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGAke3ZhbHVlfWBcbiAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gXCIwXCJcblxuICBjb25zdCBhYnNWYWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChhYnNWYWx1ZSA+PSAxZTMgfHwgYWJzVmFsdWUgPD0gMWUtMykge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUudG9FeHBvbmVudGlhbCg2KSkudG9TdHJpbmcoKVxuICB9XG5cbiAgcmV0dXJuIE51bWJlcih2YWx1ZS50b1ByZWNpc2lvbig2KSkudG9TdHJpbmcoKVxufVxuIiwgImV4cG9ydCBjbGFzcyBTcGljZVN1YmNpcmN1aXQge1xuICBuYW1lOiBzdHJpbmdcbiAgcGluczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHBpbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMucGlucyA9IHBpbnNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwaW5TdHJpbmcgPSB0aGlzLnBpbnMuam9pbihcIiBcIilcbiAgICBjb25zdCBoZWFkZXIgPSBgLlNVQkNLVCAke3RoaXMubmFtZX0gJHtwaW5TdHJpbmd9YFxuICAgIGNvbnN0IGZvb3RlciA9IGAuRU5EUyAke3RoaXMubmFtZX1gXG5cbiAgICBjb25zdCBib2R5ID0gYCogUGxhY2Vob2xkZXIgZm9yICR7dGhpcy5uYW1lfS4gTm8gZGVmaW5pdGlvbiBmb3VuZCBpbiBjaXJjdWl0IEpTT04uYFxuXG4gICAgcmV0dXJuIFtcIlwiLCBoZWFkZXIsIGJvZHksIGZvb3Rlcl0uam9pbihcIlxcblwiKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICBhY01hZ25pdHVkZT86IHN0cmluZ1xuICBhY1BoYXNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDdXJyZW50U291cmNlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiY3VycmVudF9zb3VyY2VcIiBhcyBjb25zdFxuICBwcm9wczogQ3VycmVudFNvdXJjZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgdmFsdWUsIGFjTWFnbml0dWRlLCBhY1BoYXNlIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBJJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICB9XG4gICAgaWYgKGFjTWFnbml0dWRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEFDICR7YWNNYWduaXR1ZGV9YFxuICAgICAgaWYgKGFjUGhhc2UpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FjUGhhc2V9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgaW5kdWN0b3JzOiBzdHJpbmdbXVxuICBjb3VwbGluZzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiaW5kdWN0b3JfY291cGxpbmdcIiBhcyBjb25zdFxuICBwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBpbmR1Y3RvcnMsIGNvdXBsaW5nIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBLJHtuYW1lfSAke2luZHVjdG9ycy5qb2luKFwiIFwiKX0gJHtjb3VwbGluZ31gXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBKRkVUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGRyYWluOiBzdHJpbmdcbiAgZ2F0ZTogc3RyaW5nXG4gIHNvdXJjZTogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSkZFVENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImpmZXRcIiBhcyBjb25zdFxuICBwcm9wczogSkZFVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBKRkVUQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBkcmFpbiwgZ2F0ZSwgc291cmNlLCBtb2RlbCwgYXJlYSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBKJHtuYW1lfSAke2RyYWlufSAke2dhdGV9ICR7c291cmNlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzdWJjaXJjdWl0TmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInN1YmNpcmN1aXRfY2FsbFwiIGFzIGNvbnN0XG4gIHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgbm9kZXMsIHN1YmNpcmN1aXROYW1lIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBYJHtuYW1lfSAke25vZGVzLmpvaW4oXCIgXCIpfSAke3N1YmNpcmN1aXROYW1lfWBcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgYVBvc2l0aXZlOiBzdHJpbmdcbiAgYU5lZ2F0aXZlOiBzdHJpbmdcbiAgYlBvc2l0aXZlOiBzdHJpbmdcbiAgYk5lZ2F0aXZlOiBzdHJpbmdcbiAgaW1wZWRhbmNlOiBzdHJpbmdcbiAgZGVsYXk/OiBzdHJpbmdcbiAgZnJlcXVlbmN5Pzogc3RyaW5nXG4gIG5vcm1hbGl6ZWRMZW5ndGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ0cmFuc21pc3Npb25fbGluZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgYVBvc2l0aXZlLFxuICAgICAgYU5lZ2F0aXZlLFxuICAgICAgYlBvc2l0aXZlLFxuICAgICAgYk5lZ2F0aXZlLFxuICAgICAgaW1wZWRhbmNlLFxuICAgICAgZGVsYXksXG4gICAgICBmcmVxdWVuY3ksXG4gICAgICBub3JtYWxpemVkTGVuZ3RoLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFQke25hbWV9ICR7YVBvc2l0aXZlfSAke2FOZWdhdGl2ZX0gJHtiUG9zaXRpdmV9ICR7Yk5lZ2F0aXZlfSBaMD0ke2ltcGVkYW5jZX1gXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIFREPSR7ZGVsYXl9YFxuICAgIH0gZWxzZSBpZiAoZnJlcXVlbmN5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEY9JHtmcmVxdWVuY3l9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRMZW5ndGgpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCBOTD0ke25vcm1hbGl6ZWRMZW5ndGh9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVPLElBQU0sOEJBQThCLENBQUMsWUFBa0M7QUFDNUUsUUFBTSxRQUFrQixDQUFDO0FBR3pCLFFBQU0sS0FBSyxRQUFRLEtBQUs7QUFHeEIsTUFBSSxRQUFRLE9BQU8sT0FBTyxHQUFHO0FBQzNCLFVBQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxRQUFRLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFBQSxFQUNuRDtBQUdBLGFBQVcsYUFBYSxRQUFRLFlBQVk7QUFDMUMsVUFBTSxLQUFLLFVBQVUsY0FBYyxDQUFDO0FBQUEsRUFDdEM7QUFHQSxhQUFXLGNBQWMsUUFBUSxhQUFhO0FBQzVDLFVBQU0sS0FBSyxXQUFXLGNBQWMsQ0FBQztBQUFBLEVBQ3ZDO0FBRUEsTUFBSSxRQUFRLGdCQUFnQixTQUFTLEdBQUc7QUFDdEMsVUFBTSxLQUFLLEdBQUcsUUFBUSxlQUFlO0FBQUEsRUFDdkM7QUFHQSxNQUFJLFFBQVEsU0FBUyxTQUFTLEdBQUc7QUFDL0IsVUFBTSxLQUFLLFVBQVU7QUFDckIsVUFBTSxLQUFLLEdBQUcsUUFBUSxRQUFRO0FBQzlCLFVBQU0sS0FBSyxPQUFPO0FBQUEsRUFDcEI7QUFFQSxNQUNFLFFBQVEsZUFDUixDQUFDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFdBQVcsT0FBTyxDQUFDLEdBQzdEO0FBQ0EsVUFBTSxLQUFLLFFBQVEsV0FBVztBQUFBLEVBQ2hDO0FBR0EsUUFBTSxLQUFLLE1BQU07QUFFakIsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4Qjs7O0FDekNPLElBQU0sZUFBTixNQUFtQjtBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVB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
@@ -6,6 +6,7 @@ import { VoltageSourceCommand } from "./spice-commands/VoltageSourceCommand"
6
6
  import { BJTCommand } from "./spice-commands/BJTCommand"
7
7
  import { DiodeCommand } from "./spice-commands/DiodeCommand"
8
8
  import { InductorCommand } from "./spice-commands/InductorCommand"
9
+ import { MOSFETCommand } from "./spice-commands/MOSFETCommand"
9
10
  import { VoltageControlledSwitchCommand } from "./spice-commands/VoltageControlledSwitchCommand"
10
11
  import type {
11
12
  AnyCircuitElement,
@@ -361,33 +362,40 @@ export function circuitJsonToSpice(
361
362
  const sourceNode =
362
363
  nodeMap.get(sourcePort?.source_port_id ?? "") || "0"
363
364
 
364
- const channel_type = component.channel_type
365
+ // For 3-pin MOSFETs, substrate is typically connected to source
366
+ const substrateNode = sourceNode
365
367
 
366
- let positiveControl = gateNode
367
- let negativeControl = sourceNode
368
- if (channel_type === "p") {
369
- positiveControl = sourceNode
370
- negativeControl = gateNode
371
- }
368
+ const channel_type = (component as any).channel_type ?? "n"
369
+ const mosfet_mode = (component as any).mosfet_mode ?? "enhancement"
370
+
371
+ const modelType = `${channel_type.toUpperCase()}MOS`
372
+ const modelName = `${modelType}_${mosfet_mode.toUpperCase()}`
372
373
 
373
- const modelName = "ENH_SW"
374
374
  if (!netlist.models.has(modelName)) {
375
- netlist.models.set(
376
- modelName,
377
- `.MODEL ${modelName} SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)`,
378
- )
375
+ if (mosfet_mode === "enhancement") {
376
+ const vto = channel_type === "p" ? -1 : 1
377
+ netlist.models.set(
378
+ modelName,
379
+ `.MODEL ${modelName} ${modelType} (VTO=${vto} KP=0.1)`,
380
+ )
381
+ } else {
382
+ netlist.models.set(
383
+ modelName,
384
+ `.MODEL ${modelName} ${modelType} (KP=0.1)`,
385
+ )
386
+ }
379
387
  }
380
388
 
381
- const switchCmd = new VoltageControlledSwitchCommand({
389
+ const mosfetCmd = new MOSFETCommand({
382
390
  name: component.name,
383
- positiveNode: drainNode,
384
- negativeNode: sourceNode,
385
- positiveControl,
386
- negativeControl,
391
+ drain: drainNode,
392
+ gate: gateNode,
393
+ source: sourceNode,
394
+ substrate: substrateNode,
387
395
  model: modelName,
388
396
  })
389
397
 
390
- spiceComponent = new SpiceComponent(component.name, switchCmd, [
398
+ spiceComponent = new SpiceComponent(component.name, mosfetCmd, [
391
399
  drainNode,
392
400
  gateNode,
393
401
  sourceNode,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "circuit-json-to-spice",
3
3
  "main": "dist/index.js",
4
- "version": "0.0.28",
4
+ "version": "0.0.30",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "build": "tsup-node ./lib/index.ts --dts --format esm --sourcemap inline -d dist",
@@ -17,12 +17,12 @@ test(
17
17
  expect(spiceString).toMatchInlineSnapshot(`
18
18
  "* Circuit JSON to SPICE Netlist
19
19
  .MODEL D D
20
- .MODEL ENH_SW SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)
20
+ .MODEL NMOS_ENHANCEMENT NMOS (VTO=1 KP=0.1)
21
21
  LL1 N1 N2 1
22
22
  DD1 N2 N3 D
23
23
  CC1 N3 0 10U
24
24
  RR1 N3 0 1K
25
- SM1 N2 0 N4 0 ENH_SW
25
+ MM1 N2 N4 0 0 NMOS_ENHANCEMENT
26
26
  Vsimulation_voltage_source_0 N1 0 DC 5
27
27
  Vsimulation_voltage_source_1 N4 0 PULSE(0 10 0 1n 1n 0.00068 0.001)
28
28
  .END"
@@ -12,9 +12,9 @@ test(
12
12
 
13
13
  expect(spiceString).toMatchInlineSnapshot(`
14
14
  "* Circuit JSON to SPICE Netlist
15
- .MODEL ENH_SW SW(Ron=0.1 Roff=1e9 Vt=2.5 Vh=0.1)
15
+ .MODEL PMOS_ENHANCEMENT PMOS (VTO=-1 KP=0.1)
16
16
  .MODEL D D
17
- SM1 N2 VP_IN VP_IN N1 ENH_SW
17
+ MM1 N2 N1 VP_IN VP_IN PMOS_ENHANCEMENT
18
18
  DD1 0 N2 D
19
19
  LL1 N2 VP_OUT 10
20
20
  CC1 VP_OUT 0 10U