@magic-xpa/gui 4.800.0-dev480.21 → 4.800.0-dev480.210

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.
Files changed (105) hide show
  1. package/bundles/magic-xpa-gui.umd.js +1050 -7528
  2. package/bundles/magic-xpa-gui.umd.js.map +1 -1
  3. package/bundles/magic-xpa-gui.umd.min.js +1 -1
  4. package/bundles/magic-xpa-gui.umd.min.js.map +1 -1
  5. package/esm2015/index.js +1 -1
  6. package/esm2015/magic-xpa-gui.js +1 -4
  7. package/esm2015/src/Commands.js +11 -114
  8. package/esm2015/src/Events.js +1 -517
  9. package/esm2015/src/EventsProcessor.js +1 -51
  10. package/esm2015/src/FocusManager.js +1 -13
  11. package/esm2015/src/GuiConstants.js +2 -11
  12. package/esm2015/src/GuiEnums.js +126 -130
  13. package/esm2015/src/GuiEnvironment.js +1 -1
  14. package/esm2015/src/IFlowMonitorQueue.js +1 -1
  15. package/esm2015/src/Manager.js +10 -148
  16. package/esm2015/src/UIBridge.js +1 -6
  17. package/esm2015/src/env/IEnvironment.js +1 -1
  18. package/esm2015/src/gui/ControlBase.js +1 -1
  19. package/esm2015/src/gui/GuiMgControl.js +1 -94
  20. package/esm2015/src/gui/GuiMgForm.js +1 -1
  21. package/esm2015/src/gui/KeyboardItem.js +5 -46
  22. package/esm2015/src/gui/LastFocusedVal.js +1 -5
  23. package/esm2015/src/gui/MgValue.js +1 -1
  24. package/esm2015/src/gui/PropParentInterface.js +1 -1
  25. package/esm2015/src/gui/low/DialogHandler.js +1 -10
  26. package/esm2015/src/gui/low/GuiCommand.js +1 -12
  27. package/esm2015/src/gui/low/GuiCommandQueue.js +1 -66
  28. package/esm2015/src/gui/low/GuiInteractive.js +8 -465
  29. package/esm2015/src/gui/low/Style.js +1 -9
  30. package/esm2015/src/management/RuntimeContextBase.js +11 -14
  31. package/esm2015/src/management/data/BlobType.js +0 -0
  32. package/esm2015/src/management/data/DcValues.js +8 -67
  33. package/esm2015/src/management/data/DcValuesBuilderBase.js +2 -37
  34. package/esm2015/src/management/data/FieldDef.js +1 -95
  35. package/esm2015/src/management/data/FieldsTable.js +2 -28
  36. package/esm2015/src/management/data/GuiDataViewBase.js +33 -72
  37. package/esm2015/src/management/data/GuiFieldBase.js +4 -39
  38. package/esm2015/src/management/data/IRecord.js +1 -1
  39. package/esm2015/src/management/data/IReferencedObject.js +1 -8
  40. package/esm2015/src/management/data/NUM_TYPE.js +14 -485
  41. package/esm2015/src/management/data/ObjectReferenceBase.js +1 -3
  42. package/esm2015/src/management/data/ObjectReferencesCollection.js +1 -2
  43. package/esm2015/src/management/data/RecordUtils.js +6 -112
  44. package/esm2015/src/management/data/VectorType.js +17 -252
  45. package/esm2015/src/management/data/VectorTypeBase.js +1 -35
  46. package/esm2015/src/management/events/IActionManager.js +1 -1
  47. package/esm2015/src/management/events/IGuiEventsManager.js +1 -1
  48. package/esm2015/src/management/exp/ExpressionInterface.js +5 -3
  49. package/esm2015/src/management/exp/GuiExpressionEvaluator.js +38 -155
  50. package/esm2015/src/management/gui/ControlTable.js +18 -72
  51. package/esm2015/src/management/gui/DisplayConvertor.js +43 -493
  52. package/esm2015/src/management/gui/FieldValidator.js +58 -339
  53. package/esm2015/src/management/gui/GuiControlPropertyAdapter.js +1 -1
  54. package/esm2015/src/management/gui/GuiFormPropertyAdapter.js +1 -8
  55. package/esm2015/src/management/gui/HebrewDate.js +3 -140
  56. package/esm2015/src/management/gui/Helps.js +2 -48
  57. package/esm2015/src/management/gui/MgControlBase.js +143 -876
  58. package/esm2015/src/management/gui/MgFormBase.js +68 -407
  59. package/esm2015/src/management/gui/PIC.js +58 -285
  60. package/esm2015/src/management/gui/PropDefaults.js +13 -48
  61. package/esm2015/src/management/gui/PropInterface.js +2 -4
  62. package/esm2015/src/management/gui/PropTable.js +72 -183
  63. package/esm2015/src/management/gui/Property.js +35 -372
  64. package/esm2015/src/management/gui/ValidationDetails.js +10 -52
  65. package/esm2015/src/management/gui/ValidationDetailsBase.js +12 -45
  66. package/esm2015/src/management/gui/WrongFormatException.js +1 -15
  67. package/esm2015/src/management/tasks/GuiDataCollection.js +1 -1
  68. package/esm2015/src/management/tasks/GuiTaskBase.js +38 -383
  69. package/esm2015/src/management/tasks/IMGDataTable.js +1 -1
  70. package/esm2015/src/management/tasks/ITask.js +1 -1
  71. package/esm2015/src/management/tasks/MgTimer.js +1 -16
  72. package/esm2015/src/management/tasks/TaskDefinitionId.js +8 -18
  73. package/esm2015/src/management/tasks/TaskDefinitionIdTableSaxHandler.js +1 -13
  74. package/esm2015/src/util/AuthenticationDialogHandler.js +1 -4
  75. package/esm2015/src/util/MemoryUtil.js +1 -41
  76. package/esm2015/src/util/ObjectReference.js +1 -8
  77. package/esm2015/src/util/ProcessLauncher.js +3 -21
  78. package/esm2015/src/util/UsernamePasswordCredentials.js +1 -9
  79. package/fesm2015/magic-xpa-gui.js +857 -7052
  80. package/fesm2015/magic-xpa-gui.js.map +1 -1
  81. package/magic-xpa-gui.d.ts +0 -3
  82. package/package.json +2 -2
  83. package/src/Commands.d.ts +2 -0
  84. package/src/Events.d.ts +0 -2
  85. package/src/GuiEnums.d.ts +125 -128
  86. package/src/env/IEnvironment.d.ts +3 -0
  87. package/src/gui/PropParentInterface.d.ts +1 -1
  88. package/src/gui/low/GuiInteractive.d.ts +3 -1
  89. package/src/gui/low/Style.d.ts +0 -3
  90. package/src/management/RuntimeContextBase.d.ts +2 -0
  91. package/src/management/data/GuiDataViewBase.d.ts +4 -4
  92. package/src/management/data/IRecord.d.ts +1 -1
  93. package/src/management/exp/ExpressionInterface.d.ts +4 -0
  94. package/src/management/exp/GuiExpressionEvaluator.d.ts +4 -6
  95. package/src/management/gui/ControlTable.d.ts +1 -1
  96. package/src/management/gui/DisplayConvertor.d.ts +1 -1
  97. package/src/management/gui/GuiControlPropertyAdapter.d.ts +1 -1
  98. package/src/management/gui/MgControlBase.d.ts +7 -7
  99. package/src/management/gui/MgFormBase.d.ts +6 -6
  100. package/src/management/gui/PIC.d.ts +1 -0
  101. package/src/management/gui/PropInterface.d.ts +2 -4
  102. package/src/management/gui/PropTable.d.ts +4 -5
  103. package/src/management/gui/Property.d.ts +1 -1
  104. package/src/management/tasks/GuiTaskBase.d.ts +8 -14
  105. package/src/management/tasks/TaskDefinitionId.d.ts +1 -0
@@ -1,14 +1,8 @@
1
1
  import { HelpType, XMLConstants, XmlParser } from "@magic-xpa/utils";
2
2
  import { NNumber, List, NString } from "@magic-xpa/mscorelib";
3
3
  import { Events } from "../../Events";
4
- /// <summary>
5
- /// Base class for all the help types supported in magic.
6
- /// </summary>
7
4
  export class MagicHelp {
8
5
  }
9
- /// <summary>
10
- /// This class will contain the details required to draw the internal help window.
11
- /// </summary>
12
6
  export class InternalHelp extends MagicHelp {
13
7
  constructor() {
14
8
  super();
@@ -30,9 +24,6 @@ export class InternalHelp extends MagicHelp {
30
24
  return HelpType.Internal;
31
25
  }
32
26
  }
33
- /// <summary>
34
- /// This class will contain the details required to show prompt help.
35
- /// </summary>
36
27
  export class PromptpHelp extends MagicHelp {
37
28
  constructor() {
38
29
  super();
@@ -42,9 +33,6 @@ export class PromptpHelp extends MagicHelp {
42
33
  return HelpType.Prompt;
43
34
  }
44
35
  }
45
- /// <summary>
46
- /// This class will contain the details required to show tool tip help.
47
- /// </summary>
48
36
  export class ToolTipHelp extends MagicHelp {
49
37
  constructor() {
50
38
  super();
@@ -54,9 +42,6 @@ export class ToolTipHelp extends MagicHelp {
54
42
  return HelpType.Tooltip;
55
43
  }
56
44
  }
57
- /// <summary>
58
- /// This class will contain the details required to show URL help.
59
- /// </summary>
60
45
  export class URLHelp extends MagicHelp {
61
46
  constructor() {
62
47
  super();
@@ -66,9 +51,6 @@ export class URLHelp extends MagicHelp {
66
51
  return HelpType.URL;
67
52
  }
68
53
  }
69
- /// <summary>
70
- /// This class will contain the details required to show windows help.
71
- /// </summary>
72
54
  export class WindowsHelp extends MagicHelp {
73
55
  constructor() {
74
56
  super();
@@ -80,39 +62,24 @@ export class WindowsHelp extends MagicHelp {
80
62
  return HelpType.Windows;
81
63
  }
82
64
  }
83
- /// <summary>
84
- /// data for <helptable> <helpitem value = "string"> ... </helptable>
85
- /// </summary>
86
65
  export class Helps {
87
- /// <summary>
88
- /// CTOR
89
- /// </summary>
90
66
  constructor() {
91
67
  this._helps = null;
92
68
  this._helps = new List();
93
69
  }
94
- /// <summary>
95
- /// To parse the input string and fill data field (helps) in the class.
96
- /// </summary>
97
70
  fillData(parser) {
98
71
  while (this.initInnerObjects(parser.getNextTag(), parser)) {
99
72
  }
100
73
  }
101
- /// <summary>
102
- /// To initial inner object
103
- /// </summary>
104
- /// <param name = "foundTagName">of found/current tag</param>
105
74
  initInnerObjects(foundTagName, parser) {
106
75
  if (foundTagName === null)
107
76
  return false;
108
77
  if (foundTagName === XMLConstants.MG_TAG_HELPTABLE)
109
78
  parser.setCurrIndex(parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex()) +
110
- 1); //end of outer tad and its ">"
111
- // end of outer tad and its ">"
79
+ 1);
112
80
  else if (foundTagName === XMLConstants.MG_TAG_HELPITEM) {
113
81
  let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
114
82
  if (endContext !== -1 && endContext < parser.getXMLdata().length) {
115
- // last position of its tag
116
83
  let tag = parser.getXMLsubstring(endContext);
117
84
  parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_HELPITEM) +
118
85
  XMLConstants.MG_TAG_HELPITEM.length);
@@ -132,12 +99,7 @@ export class Helps {
132
99
  }
133
100
  return true;
134
101
  }
135
- /// <summary>
136
- /// Fill member element helps by <helpitem> tag
137
- /// </summary>
138
- /// <param name = "tokensVector">attribute/value/...attribute/value/ vector</param>
139
102
  fillHelpItem(tokensVector) {
140
- // Since the first attribute is type of help. Extract this attribute to check type.
141
103
  let j = 0;
142
104
  let attribute = tokensVector.get_Item(j);
143
105
  let valueStr = tokensVector.get_Item(j + 1);
@@ -149,8 +111,6 @@ export class Helps {
149
111
  attribute = tokensVector.get_Item(j);
150
112
  valueStr = tokensVector.get_Item(j + 1);
151
113
  if (attribute === XMLConstants.MG_ATTR_VALUE) {
152
- // #932086: Special characters in helps text are escaped while serializing,
153
- // so unescape the escaped characters.
154
114
  toolTipHelp.tooltipHelpText = XmlParser.unescape(valueStr).toString();
155
115
  }
156
116
  else
@@ -164,8 +124,6 @@ export class Helps {
164
124
  attribute = tokensVector.get_Item(j);
165
125
  valueStr = tokensVector.get_Item(j + 1);
166
126
  if (attribute === XMLConstants.MG_ATTR_VALUE) {
167
- // #932086: Special characters in helps text are escaped while serializing,
168
- // so unescape the escaped characters.
169
127
  promptpHelp.PromptHelpText = XmlParser.unescape(valueStr).toString();
170
128
  }
171
129
  else
@@ -187,7 +145,6 @@ export class Helps {
187
145
  break;
188
146
  case XMLConstants.MG_ATTR_HLP_TYP_INTERNAL:
189
147
  let internalHelpWindowDetails = new InternalHelp();
190
- // Init Internal Help Window Details.
191
148
  for (j = 2; j < tokensVector.length; j += 2) {
192
149
  attribute = tokensVector.get_Item(j);
193
150
  valueStr = tokensVector.get_Item(j + 1);
@@ -235,12 +192,10 @@ export class Helps {
235
192
  else
236
193
  Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
237
194
  }
238
- // Add help object to collection.
239
195
  this._helps.push(internalHelpWindowDetails);
240
196
  break;
241
197
  case XMLConstants.MG_ATTR_HLP_TYP_WINDOWS:
242
198
  let wndHelpDetails = new WindowsHelp();
243
- // Init Windows Help Details.
244
199
  for (j = 2; j < tokensVector.length; j = j + 2) {
245
200
  attribute = tokensVector.get_Item(j);
246
201
  valueStr = tokensVector.get_Item(j + 1);
@@ -256,7 +211,6 @@ export class Helps {
256
211
  else
257
212
  Events.WriteExceptionToLog(NString.Format("There is no such tag in <helptable><helpitem ..>.Insert case to HelpTable.FillHelpItem for {0}", attribute));
258
213
  }
259
- // Add help object to collection.
260
214
  this._helps.push(wndHelpDetails);
261
215
  break;
262
216
  }
@@ -273,4 +227,4 @@ export class Helps {
273
227
  return result;
274
228
  }
275
229
  }
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0hlbHBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFcEMsYUFBYTtBQUNiLHlEQUF5RDtBQUN6RCxjQUFjO0FBQ2QsTUFBTSxPQUFnQixTQUFTO0NBRTlCO0FBRUQsYUFBYTtBQUNiLGtGQUFrRjtBQUNsRixjQUFjO0FBQ2QsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBbUJ6QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBbkJWLFFBQUcsR0FBVyxJQUFJLENBQUM7UUFDbkIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBQ25CLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixtQkFBYyxHQUFXLENBQUMsQ0FBQztJQVEzQixDQUFDO0lBTkQsV0FBVztRQUNULE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBS0Y7QUFFRCxhQUFhO0FBQ2IscUVBQXFFO0FBQ3JFLGNBQWM7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RUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUMzSjtnQkFDRCxpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNqQyxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVc7UUFDakIsSUFBSSxJQUFJLEdBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekQsSUFBSSxNQUFpQixDQUFDO1FBQ3RCLElBQUksSUFBSSxFQUFFO1lBQ1IsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNmO2FBQ0k7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0hlbHBDb21tYW5kLCBIZWxwVHlwZSwgWE1MQ29uc3RhbnRzLCBYbWxQYXJzZXJ9IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7Tk51bWJlciwgTGlzdCwgTlN0cmluZ30gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7RXZlbnRzfSBmcm9tIFwiLi4vLi4vRXZlbnRzXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBCYXNlIGNsYXNzIGZvciBhbGwgdGhlIGhlbHAgdHlwZXMgc3VwcG9ydGVkIGluIG1hZ2ljLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWFnaWNIZWxwIHtcclxuICBhYnN0cmFjdCBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZTtcclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gZHJhdyB0aGUgaW50ZXJuYWwgaGVscCB3aW5kb3cuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEhlbHAgZXh0ZW5kcyBNYWdpY0hlbHAge1xyXG4gIHZhbDogc3RyaW5nID0gbnVsbDtcclxuICBOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIEZyYW1lWDogbnVtYmVyID0gMDtcclxuICBGcmFtZVk6IG51bWJlciA9IDA7XHJcbiAgRnJhbWVEeDogbnVtYmVyID0gMDtcclxuICBGcmFtZUR5OiBudW1iZXIgPSAwO1xyXG4gIFNpemVkWDogbnVtYmVyID0gMDtcclxuICBTaXplZFk6IG51bWJlciA9IDA7XHJcbiAgRmFjdG9yWDogbnVtYmVyID0gMDtcclxuICBGYWN0b3JZOiBudW1iZXIgPSAwO1xyXG4gIEJvcmRlcnN0eWxlOiBudW1iZXIgPSAwO1xyXG4gIFRpdGxlQmFyOiBudW1iZXIgPSAwO1xyXG4gIEZvbnRUYWJsZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZSB7XHJcbiAgICByZXR1cm4gSGVscFR5cGUuSW50ZXJuYWw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBUaGlzIGNsYXNzIHdpbGwgY29udGFpbiB0aGUgZGV0YWlscyByZXF1aXJlZCB0byBzaG93IHByb21wdCBoZWxwLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUHJvbXB0cEhlbHAgZXh0ZW5kcyBNYWdpY0hlbHAge1xyXG4gIFByb21wdEhlbHBUZXh0OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZSB7XHJcbiAgICByZXR1cm4gSGVscFR5cGUuUHJvbXB0O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyB0b29sIHRpcCBoZWxwLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVG9vbFRpcEhlbHAgZXh0ZW5kcyBNYWdpY0hlbHAge1xyXG4gIHRvb2x0aXBIZWxwVGV4dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgR2V0SGVscFR5cGUoKTogSGVscFR5cGUge1xyXG4gICAgcmV0dXJuIEhlbHBUeXBlLlRvb2x0aXA7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBUaGlzIGNsYXNzIHdpbGwgY29udGFpbiB0aGUgZGV0YWlscyByZXF1aXJlZCB0byBzaG93IFVSTCBoZWxwLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgVVJMSGVscCBleHRlbmRzIE1hZ2ljSGVscCB7XHJcbiAgdXJsSGVscFRleHQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEdldEhlbHBUeXBlKCk6IEhlbHBUeXBlIHtcclxuICAgIHJldHVybiBIZWxwVHlwZS5VUkw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyBUaGlzIGNsYXNzIHdpbGwgY29udGFpbiB0aGUgZGV0YWlscyByZXF1aXJlZCB0byBzaG93IHdpbmRvd3MgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd3NIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICBGaWxlUGF0aDogc3RyaW5nID0gbnVsbDtcclxuICBIZWxwQ29tbWFuZDogSGVscENvbW1hbmQgPSAwO1xyXG4gIEhlbHBLZXk6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEdldEhlbHBUeXBlKCk6IEhlbHBUeXBlIHtcclxuICAgIHJldHVybiBIZWxwVHlwZS5XaW5kb3dzO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gZGF0YSBmb3IgPGhlbHB0YWJsZT4gPGhlbHBpdGVtIHZhbHVlID0gXCJzdHJpbmdcIj4gLi4uIDwvaGVscHRhYmxlPlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgSGVscHMge1xyXG4gIHByaXZhdGUgX2hlbHBzOiBMaXN0PE1hZ2ljSGVscD4gPSBudWxsO1xyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5faGVscHMgPSBuZXcgTGlzdDxNYWdpY0hlbHA+KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRvIHBhcnNlIHRoZSBpbnB1dCBzdHJpbmcgYW5kIGZpbGwgZGF0YSBmaWVsZCAoaGVscHMpIGluIHRoZSBjbGFzcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlci5nZXROZXh0VGFnKCksIHBhcnNlcikpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVG8gaW5pdGlhbCBpbm5lciBvYmplY3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm91bmRUYWdOYW1lXCI+b2YgZm91bmQvY3VycmVudCB0YWc8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdElubmVyT2JqZWN0cyhmb3VuZFRhZ05hbWU6IHN0cmluZywgcGFyc2VyOiBYbWxQYXJzZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBUQUJMRSlcclxuICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKSArXHJcbiAgICAgICAgMSk7IC8vZW5kIG9mIG91dGVyIHRhZCBhbmQgaXRzIFwiPlwiXHJcbiAgICAvLyBlbmQgb2Ygb3V0ZXIgdGFkIGFuZCBpdHMgXCI+XCJcclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQSVRFTSkge1xyXG4gICAgICBsZXQgZW5kQ29udGV4dCA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX1RFUk0sIHBhcnNlci5nZXRDdXJySW5kZXgoKSk7XHJcbiAgICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfSEVMUElURU0pICtcclxuICAgICAgICAgIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUElURU0ubGVuZ3RoKTtcclxuICAgICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgICAgdGhpcy5maWxsSGVscEl0ZW0odG9rZW5zVmVjdG9yKTtcclxuICAgICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KGVuZENvbnRleHQgKyBYTUxDb25zdGFudHMuVEFHX1RFUk0ubGVuZ3RoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBcIi9cIiArIFhNTENvbnN0YW50cy5NR19UQUdfSEVMUFRBQkxFKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKFwiaW4gQ29tbWFuZC5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gRmlsbCBtZW1iZXIgZWxlbWVudCBoZWxwcyBieSA8aGVscGl0ZW0+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5hdHRyaWJ1dGUvdmFsdWUvLi4uYXR0cmlidXRlL3ZhbHVlLyB2ZWN0b3I8L3BhcmFtPlxyXG4gIHByaXZhdGUgZmlsbEhlbHBJdGVtKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogdm9pZCB7XHJcbiAgICAvLyBTaW5jZSB0aGUgZmlyc3QgYXR0cmlidXRlIGlzIHR5cGUgb2YgaGVscC4gRXh0cmFjdCB0aGlzIGF0dHJpYnV0ZSB0byBjaGVjayB0eXBlLlxyXG4gICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICBsZXQgaGxwVHlwZTogc3RyaW5nID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG5cclxuICAgIHN3aXRjaCAoaGxwVHlwZSkge1xyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0hMUF9UWVBfVE9PTFRJUDpcclxuICAgICAgICBsZXQgdG9vbFRpcEhlbHA6IFRvb2xUaXBIZWxwID0gbmV3IFRvb2xUaXBIZWxwKCk7XHJcbiAgICAgICAgZm9yIChqID0gMjsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUpIHtcclxuICAgICAgICAgICAgLy8gIzkzMjA4NjogU3BlY2lhbCBjaGFyYWN0ZXJzIGluIGhlbHBzIHRleHQgYXJlIGVzY2FwZWQgd2hpbGUgc2VyaWFsaXppbmcsXHJcbiAgICAgICAgICAgIC8vIHNvIHVuZXNjYXBlIHRoZSBlc2NhcGVkIGNoYXJhY3RlcnMuXHJcbiAgICAgICAgICAgIHRvb2xUaXBIZWxwLnRvb2x0aXBIZWxwVGV4dCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHRvb2xUaXBIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9QUk9NUFQ6XHJcbiAgICAgICAgbGV0IHByb21wdHBIZWxwOiBQcm9tcHRwSGVscCA9IG5ldyBQcm9tcHRwSGVscCgpO1xyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKSB7XHJcbiAgICAgICAgICAgIC8vICM5MzIwODY6IFNwZWNpYWwgY2hhcmFjdGVycyBpbiBoZWxwcyB0ZXh0IGFyZSBlc2NhcGVkIHdoaWxlIHNlcmlhbGl6aW5nLFxyXG4gICAgICAgICAgICAvLyBzbyB1bmVzY2FwZSB0aGUgZXNjYXBlZCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICBwcm9tcHRwSGVscC5Qcm9tcHRIZWxwVGV4dCA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHByb21wdHBIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9VUkw6XHJcbiAgICAgICAgbGV0IHVybEhlbHA6IFVSTEhlbHAgPSBuZXcgVVJMSGVscCgpO1xyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKVxyXG4gICAgICAgICAgICB1cmxIZWxwLnVybEhlbHBUZXh0ID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gPGhlbHB0YWJsZT48aGVscGl0ZW0gLi4+Lkluc2VydCBjYXNlIHRvIEhlbHBUYWJsZS5GaWxsSGVscEl0ZW0gZm9yIHswfVwiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaCh1cmxIZWxwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9JTlRFUk5BTDpcclxuICAgICAgICBsZXQgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlsczogSW50ZXJuYWxIZWxwID0gbmV3IEludGVybmFsSGVscCgpO1xyXG4gICAgICAgIC8vIEluaXQgSW50ZXJuYWwgSGVscCBXaW5kb3cgRGV0YWlscy5cclxuICAgICAgICBmb3IgKGogPSAyOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcblxyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfVkFMVUUpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy52YWwgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfTkFNRSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLk5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRlJBTUVYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GUkFNRVkpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GcmFtZVkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0ZSQU1FRFgpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GcmFtZUR4ID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GUkFNRURZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVEeSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfU0laRURYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuU2l6ZWRYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9TSVpFRFkpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5TaXplZFkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0ZBQ1RPUlgpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5GYWN0b3JYID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GQUNUT1JZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRmFjdG9yWSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfQk9SREVSU1RZTEUpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5Cb3JkZXJzdHlsZSA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX1RJVExFX0JBUikge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLlRpdGxlQmFyID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9TWVNURU1fTUVOVSkge1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GT05UX1RBQkxFX0lOREVYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRm9udFRhYmxlSW5kZXggPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIDxoZWxwdGFibGU+PGhlbHBpdGVtIC4uPi5JbnNlcnQgY2FzZSB0byBIZWxwVGFibGUuRmlsbEhlbHBJdGVtIGZvciB7MH1cIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgaGVscCBvYmplY3QgdG8gY29sbGVjdGlvbi5cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKGludGVybmFsSGVscFdpbmRvd0RldGFpbHMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9ITFBfVFlQX1dJTkRPV1M6XHJcbiAgICAgICAgbGV0IHduZEhlbHBEZXRhaWxzOiBXaW5kb3dzSGVscCA9IG5ldyBXaW5kb3dzSGVscCgpO1xyXG5cclxuICAgICAgICAvLyBJbml0IFdpbmRvd3MgSGVscCBEZXRhaWxzLlxyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9GSUxFKSB7XHJcbiAgICAgICAgICAgIHduZEhlbHBEZXRhaWxzLkZpbGVQYXRoID0gdmFsdWVTdHI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9DT01NQU5EKSB7XHJcbiAgICAgICAgICAgICAgd25kSGVscERldGFpbHMuSGVscENvbW1hbmQgPSA8SGVscENvbW1hbmQ+Tk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1dJTkRPV1NfSEVMUF9LRVkpIHtcclxuICAgICAgICAgICAgd25kSGVscERldGFpbHMuSGVscEtleSA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBZGQgaGVscCBvYmplY3QgdG8gY29sbGVjdGlvbi5cclxuICAgICAgICB0aGlzLl9oZWxwcy5wdXNoKHduZEhlbHBEZXRhaWxzKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlbHAoaWR4OiBudW1iZXIpOiBNYWdpY0hlbHAge1xyXG4gICAgbGV0IGZsYWc6IGJvb2xlYW4gPSBpZHggPCAwIHx8IGlkeCA+PSB0aGlzLl9oZWxwcy5sZW5ndGg7XHJcbiAgICBsZXQgcmVzdWx0OiBNYWdpY0hlbHA7XHJcbiAgICBpZiAoZmxhZykge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2hlbHBzLmdldF9JdGVtKGlkeCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufVxyXG4iXX0=
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZ3VpL0hlbHBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxRQUFRLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFLcEMsTUFBTSxPQUFnQixTQUFTO0NBRTlCO0FBS0QsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBbUJ6QztRQUNFLEtBQUssRUFBRSxDQUFDO1FBbkJWLFFBQUcsR0FBVyxJQUFJLENBQUM7UUFDbkIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBQ25CLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFDcEIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixtQkFBYyxHQUFXLENBQUMsQ0FBQztJQVEzQixDQUFDO0lBTkQsV0FBVztRQUNULE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBS0Y7QUFLRCxNQUFNLE9BQU8sV0FBWSxTQUFRLFNBQVM7SUFPeEM7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQVBWLG1CQUFjLEdBQVcsSUFBSSxDQUFDO0lBUTlCLENBQUM7SUFO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QUFLLFlBQVksQ0FBQyx5QkFBeUIsRUFBRTt3QkFDeEQsY0FBYyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7cUJBQ3BDO3lCQUNJLElBQUksU0FBUyxLQUFLLFlBQVksQ0FBQyw0QkFBNEIsRUFBRTt3QkFDOUQsY0FBYyxDQUFDLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDckU7eUJBQ0ksSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLHdCQUF3QixFQUFFO3dCQUM1RCxjQUFjLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7cUJBQ2xFOzt3QkFFQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnR0FBZ0csRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUMzSjtnQkFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDakMsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXO1FBQ2pCLElBQUksSUFBSSxHQUFZLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3pELElBQUksTUFBaUIsQ0FBQztRQUN0QixJQUFJLElBQUksRUFBRTtZQUNSLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDZjthQUNJO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIZWxwQ29tbWFuZCwgSGVscFR5cGUsIFhNTENvbnN0YW50cywgWG1sUGFyc2VyfSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge05OdW1iZXIsIExpc3QsIE5TdHJpbmd9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge0V2ZW50c30gZnJvbSBcIi4uLy4uL0V2ZW50c1wiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gQmFzZSBjbGFzcyBmb3IgYWxsIHRoZSBoZWxwIHR5cGVzIHN1cHBvcnRlZCBpbiBtYWdpYy5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1hZ2ljSGVscCB7XHJcbiAgYWJzdHJhY3QgR2V0SGVscFR5cGUoKTogSGVscFR5cGU7XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3Mgd2lsbCBjb250YWluIHRoZSBkZXRhaWxzIHJlcXVpcmVkIHRvIGRyYXcgdGhlIGludGVybmFsIGhlbHAgd2luZG93LlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICB2YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBGcmFtZVg6IG51bWJlciA9IDA7XHJcbiAgRnJhbWVZOiBudW1iZXIgPSAwO1xyXG4gIEZyYW1lRHg6IG51bWJlciA9IDA7XHJcbiAgRnJhbWVEeTogbnVtYmVyID0gMDtcclxuICBTaXplZFg6IG51bWJlciA9IDA7XHJcbiAgU2l6ZWRZOiBudW1iZXIgPSAwO1xyXG4gIEZhY3Rvclg6IG51bWJlciA9IDA7XHJcbiAgRmFjdG9yWTogbnVtYmVyID0gMDtcclxuICBCb3JkZXJzdHlsZTogbnVtYmVyID0gMDtcclxuICBUaXRsZUJhcjogbnVtYmVyID0gMDtcclxuICBGb250VGFibGVJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgR2V0SGVscFR5cGUoKTogSGVscFR5cGUge1xyXG4gICAgcmV0dXJuIEhlbHBUeXBlLkludGVybmFsO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyBwcm9tcHQgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFByb21wdHBIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICBQcm9tcHRIZWxwVGV4dDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgR2V0SGVscFR5cGUoKTogSGVscFR5cGUge1xyXG4gICAgcmV0dXJuIEhlbHBUeXBlLlByb21wdDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIFRoaXMgY2xhc3Mgd2lsbCBjb250YWluIHRoZSBkZXRhaWxzIHJlcXVpcmVkIHRvIHNob3cgdG9vbCB0aXAgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFRvb2xUaXBIZWxwIGV4dGVuZHMgTWFnaWNIZWxwIHtcclxuICB0b29sdGlwSGVscFRleHQ6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gIEdldEhlbHBUeXBlKCk6IEhlbHBUeXBlIHtcclxuICAgIHJldHVybiBIZWxwVHlwZS5Ub29sdGlwO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyBVUkwgaGVscC5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFVSTEhlbHAgZXh0ZW5kcyBNYWdpY0hlbHAge1xyXG4gIHVybEhlbHBUZXh0OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZSB7XHJcbiAgICByZXR1cm4gSGVscFR5cGUuVVJMO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gVGhpcyBjbGFzcyB3aWxsIGNvbnRhaW4gdGhlIGRldGFpbHMgcmVxdWlyZWQgdG8gc2hvdyB3aW5kb3dzIGhlbHAuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBXaW5kb3dzSGVscCBleHRlbmRzIE1hZ2ljSGVscCB7XHJcbiAgRmlsZVBhdGg6IHN0cmluZyA9IG51bGw7XHJcbiAgSGVscENvbW1hbmQ6IEhlbHBDb21tYW5kID0gMDtcclxuICBIZWxwS2V5OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBHZXRIZWxwVHlwZSgpOiBIZWxwVHlwZSB7XHJcbiAgICByZXR1cm4gSGVscFR5cGUuV2luZG93cztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vIGRhdGEgZm9yIDxoZWxwdGFibGU+IDxoZWxwaXRlbSB2YWx1ZSA9IFwic3RyaW5nXCI+IC4uLiA8L2hlbHB0YWJsZT5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEhlbHBzIHtcclxuICBwcml2YXRlIF9oZWxwczogTGlzdDxNYWdpY0hlbHA+ID0gbnVsbDtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX2hlbHBzID0gbmV3IExpc3Q8TWFnaWNIZWxwPigpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBUbyBwYXJzZSB0aGUgaW5wdXQgc3RyaW5nIGFuZCBmaWxsIGRhdGEgZmllbGQgKGhlbHBzKSBpbiB0aGUgY2xhc3MuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YShwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgd2hpbGUgKHRoaXMuaW5pdElubmVyT2JqZWN0cyhwYXJzZXIuZ2V0TmV4dFRhZygpLCBwYXJzZXIpKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFRvIGluaXRpYWwgaW5uZXIgb2JqZWN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvdW5kVGFnTmFtZVwiPm9mIGZvdW5kL2N1cnJlbnQgdGFnPC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRJbm5lck9iamVjdHMoZm91bmRUYWdOYW1lOiBzdHJpbmcsIHBhcnNlcjogWG1sUGFyc2VyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19IRUxQVEFCTEUpXHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgocGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfQ0xPU0UsIHBhcnNlci5nZXRDdXJySW5kZXgoKSkgK1xyXG4gICAgICAgIDEpOyAvL2VuZCBvZiBvdXRlciB0YWQgYW5kIGl0cyBcIj5cIlxyXG4gICAgLy8gZW5kIG9mIG91dGVyIHRhZCBhbmQgaXRzIFwiPlwiXHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09IFhNTENvbnN0YW50cy5NR19UQUdfSEVMUElURU0pIHtcclxuICAgICAgbGV0IGVuZENvbnRleHQgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19URVJNLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBJVEVNKSArXHJcbiAgICAgICAgICBYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBJVEVNLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICAgIHRoaXMuZmlsbEhlbHBJdGVtKHRva2Vuc1ZlY3Rvcik7XHJcbiAgICAgICAgcGFyc2VyLnNldEN1cnJJbmRleChlbmRDb250ZXh0ICsgWE1MQ29uc3RhbnRzLlRBR19URVJNLmxlbmd0aCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gXCIvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX0hFTFBUQUJMRSkge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhcImluIENvbW1hbmQuRmlsbERhdGEoKSBvdXQgb2Ygc3RyaW5nIGJvdW5kc1wiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEZpbGwgbWVtYmVyIGVsZW1lbnQgaGVscHMgYnkgPGhlbHBpdGVtPiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+YXR0cmlidXRlL3ZhbHVlLy4uLmF0dHJpYnV0ZS92YWx1ZS8gdmVjdG9yPC9wYXJhbT5cclxuICBwcml2YXRlIGZpbGxIZWxwSXRlbSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgLy8gU2luY2UgdGhlIGZpcnN0IGF0dHJpYnV0ZSBpcyB0eXBlIG9mIGhlbHAuIEV4dHJhY3QgdGhpcyBhdHRyaWJ1dGUgdG8gY2hlY2sgdHlwZS5cclxuICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG4gICAgbGV0IGhscFR5cGU6IHN0cmluZyA9IFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikudG9TdHJpbmcoKTtcclxuXHJcbiAgICBzd2l0Y2ggKGhscFR5cGUpIHtcclxuICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9ITFBfVFlQX1RPT0xUSVA6XHJcbiAgICAgICAgbGV0IHRvb2xUaXBIZWxwOiBUb29sVGlwSGVscCA9IG5ldyBUb29sVGlwSGVscCgpO1xyXG4gICAgICAgIGZvciAoaiA9IDI7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqID0gaiArIDIpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgICAgIHZhbHVlU3RyID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKTtcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKSB7XHJcbiAgICAgICAgICAgIC8vICM5MzIwODY6IFNwZWNpYWwgY2hhcmFjdGVycyBpbiBoZWxwcyB0ZXh0IGFyZSBlc2NhcGVkIHdoaWxlIHNlcmlhbGl6aW5nLFxyXG4gICAgICAgICAgICAvLyBzbyB1bmVzY2FwZSB0aGUgZXNjYXBlZCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICB0b29sVGlwSGVscC50b29sdGlwSGVscFRleHQgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gPGhlbHB0YWJsZT48aGVscGl0ZW0gLi4+Lkluc2VydCBjYXNlIHRvIEhlbHBUYWJsZS5GaWxsSGVscEl0ZW0gZm9yIHswfVwiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaCh0b29sVGlwSGVscCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0hMUF9UWVBfUFJPTVBUOlxyXG4gICAgICAgIGxldCBwcm9tcHRwSGVscDogUHJvbXB0cEhlbHAgPSBuZXcgUHJvbXB0cEhlbHAoKTtcclxuICAgICAgICBmb3IgKGogPSAyOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiA9IGogKyAyKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQUxVRSkge1xyXG4gICAgICAgICAgICAvLyAjOTMyMDg2OiBTcGVjaWFsIGNoYXJhY3RlcnMgaW4gaGVscHMgdGV4dCBhcmUgZXNjYXBlZCB3aGlsZSBzZXJpYWxpemluZyxcclxuICAgICAgICAgICAgLy8gc28gdW5lc2NhcGUgdGhlIGVzY2FwZWQgY2hhcmFjdGVycy5cclxuICAgICAgICAgICAgcHJvbXB0cEhlbHAuUHJvbXB0SGVscFRleHQgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gPGhlbHB0YWJsZT48aGVscGl0ZW0gLi4+Lkluc2VydCBjYXNlIHRvIEhlbHBUYWJsZS5GaWxsSGVscEl0ZW0gZm9yIHswfVwiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaChwcm9tcHRwSGVscCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0hMUF9UWVBfVVJMOlxyXG4gICAgICAgIGxldCB1cmxIZWxwOiBVUkxIZWxwID0gbmV3IFVSTEhlbHAoKTtcclxuICAgICAgICBmb3IgKGogPSAyOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiA9IGogKyAyKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9WQUxVRSlcclxuICAgICAgICAgICAgdXJsSGVscC51cmxIZWxwVGV4dCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBFdmVudHMuV3JpdGVFeGNlcHRpb25Ub0xvZyhOU3RyaW5nLkZvcm1hdChcIlRoZXJlIGlzIG5vIHN1Y2ggdGFnIGluIDxoZWxwdGFibGU+PGhlbHBpdGVtIC4uPi5JbnNlcnQgY2FzZSB0byBIZWxwVGFibGUuRmlsbEhlbHBJdGVtIGZvciB7MH1cIiwgYXR0cmlidXRlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2hlbHBzLnB1c2godXJsSGVscCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0hMUF9UWVBfSU5URVJOQUw6XHJcbiAgICAgICAgbGV0IGludGVybmFsSGVscFdpbmRvd0RldGFpbHM6IEludGVybmFsSGVscCA9IG5ldyBJbnRlcm5hbEhlbHAoKTtcclxuICAgICAgICAvLyBJbml0IEludGVybmFsIEhlbHAgV2luZG93IERldGFpbHMuXHJcbiAgICAgICAgZm9yIChqID0gMjsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgICAgYXR0cmlidXRlID0gdG9rZW5zVmVjdG9yLmdldF9JdGVtKGopO1xyXG4gICAgICAgICAgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX1ZBTFVFKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMudmFsID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX05BTUUpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5OYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0ZSQU1FWCkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLkZyYW1lWCA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRlJBTUVZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVZID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GUkFNRURYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRnJhbWVEeCA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRlJBTUVEWSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLkZyYW1lRHkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX1NJWkVEWCkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLlNpemVkWCA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfU0laRURZKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuU2l6ZWRZID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gWE1MQ29uc3RhbnRzLk1HX0FUVFJfSU5URVJOQUxfSEVMUF9GQUNUT1JYKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuRmFjdG9yWCA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRkFDVE9SWSkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLkZhY3RvclkgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9IRUxQX0JPUkRFUlNUWUxFKSB7XHJcbiAgICAgICAgICAgIGludGVybmFsSGVscFdpbmRvd0RldGFpbHMuQm9yZGVyc3R5bGUgPSBOTnVtYmVyLlBhcnNlKFhtbFBhcnNlci51bmVzY2FwZSh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9JTlRFUk5BTF9USVRMRV9CQVIpIHtcclxuICAgICAgICAgICAgaW50ZXJuYWxIZWxwV2luZG93RGV0YWlscy5UaXRsZUJhciA9IE5OdW1iZXIuUGFyc2UoWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfU1lTVEVNX01FTlUpIHtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGUgPT09IFhNTENvbnN0YW50cy5NR19BVFRSX0lOVEVSTkFMX0hFTFBfRk9OVF9UQUJMRV9JTkRFWCkge1xyXG4gICAgICAgICAgICBpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzLkZvbnRUYWJsZUluZGV4ID0gTk51bWJlci5QYXJzZShYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgRXZlbnRzLldyaXRlRXhjZXB0aW9uVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiA8aGVscHRhYmxlPjxoZWxwaXRlbSAuLj4uSW5zZXJ0IGNhc2UgdG8gSGVscFRhYmxlLkZpbGxIZWxwSXRlbSBmb3IgezB9XCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIGhlbHAgb2JqZWN0IHRvIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaChpbnRlcm5hbEhlbHBXaW5kb3dEZXRhaWxzKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSExQX1RZUF9XSU5ET1dTOlxyXG4gICAgICAgIGxldCB3bmRIZWxwRGV0YWlsczogV2luZG93c0hlbHAgPSBuZXcgV2luZG93c0hlbHAoKTtcclxuXHJcbiAgICAgICAgLy8gSW5pdCBXaW5kb3dzIEhlbHAgRGV0YWlscy5cclxuICAgICAgICBmb3IgKGogPSAyOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiA9IGogKyAyKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGUgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaik7XHJcbiAgICAgICAgICB2YWx1ZVN0ciA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9XSU5ET1dTX0hFTFBfRklMRSkge1xyXG4gICAgICAgICAgICB3bmRIZWxwRGV0YWlscy5GaWxlUGF0aCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9XSU5ET1dTX0hFTFBfQ09NTUFORCkge1xyXG4gICAgICAgICAgICAgIHduZEhlbHBEZXRhaWxzLkhlbHBDb21tYW5kID0gPEhlbHBDb21tYW5kPk5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlID09PSBYTUxDb25zdGFudHMuTUdfQVRUUl9XSU5ET1dTX0hFTFBfS0VZKSB7XHJcbiAgICAgICAgICAgIHduZEhlbHBEZXRhaWxzLkhlbHBLZXkgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIEV2ZW50cy5Xcml0ZUV4Y2VwdGlvblRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gPGhlbHB0YWJsZT48aGVscGl0ZW0gLi4+Lkluc2VydCBjYXNlIHRvIEhlbHBUYWJsZS5GaWxsSGVscEl0ZW0gZm9yIHswfVwiLCBhdHRyaWJ1dGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQWRkIGhlbHAgb2JqZWN0IHRvIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgdGhpcy5faGVscHMucHVzaCh3bmRIZWxwRGV0YWlscyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWxwKGlkeDogbnVtYmVyKTogTWFnaWNIZWxwIHtcclxuICAgIGxldCBmbGFnOiBib29sZWFuID0gaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5faGVscHMubGVuZ3RoO1xyXG4gICAgbGV0IHJlc3VsdDogTWFnaWNIZWxwO1xyXG4gICAgaWYgKGZsYWcpIHtcclxuICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLl9oZWxwcy5nZXRfSXRlbShpZHgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcbn1cclxuIl19