appium-xcuitest-driver 3.46.0 → 3.46.1
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/README.md +283 -14
- package/build/lib/commands/element.js +2 -2
- package/build/lib/commands/gesture.js +59 -70
- package/lib/commands/element.js +1 -1
- package/lib/commands/gesture.js +58 -56
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -341,7 +341,7 @@ one to select or value selection suing `sendKeys` API does not work because of a
|
|
|
341
341
|
|
|
342
342
|
Name | Type | Required | Description | Example
|
|
343
343
|
--- | --- | --- | --- | ---
|
|
344
|
-
element | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | abcdef12-1111-2222-3333-444444
|
|
344
|
+
elementId (`element` before version 1.22) | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | abcdef12-1111-2222-3333-444444
|
|
345
345
|
order | string | yes | Either `next` to select the value next to the current one from the target picker wheel or `previous` to select the previous one. | next
|
|
346
346
|
offset | number | no | The value in range [0.01, 0.5]. It defines how far from picker wheel's center the click should happen. The actual distance is calculated by multiplying this value to the actual picker wheel height. Too small offset value may not change the picker wheel value and too high value may cause the wheel to switch two or more values at once. Usually the optimal value is located in range [0.15, 0.3]. `0.2` by default | 0.15
|
|
347
347
|
|
|
@@ -934,24 +934,293 @@ The response looks like `{"value":{"statusBarSize":{"width":414,"height":48},"sc
|
|
|
934
934
|
`statusBarSize` contains status bar dimensions. It is the result of [status bar](https://developer.apple.com/documentation/xctest/xcuielementtypequeryprovider/1500428-statusbars).
|
|
935
935
|
`scale` is [screen scale](https://developer.apple.com/documentation/uikit/uiscreen/1617836-scale).
|
|
936
936
|
|
|
937
|
+
### mobile: swipe
|
|
937
938
|
|
|
939
|
+
This gesture performs a simple "swipe" gesture on the particular screen element or
|
|
940
|
+
on the application element, which is usually the whole screen. This method does not
|
|
941
|
+
accept coordinates and simply emulates single swipe with one finger. It might be
|
|
942
|
+
useful for such cases like album pagination, switching views, etc. More advanced
|
|
943
|
+
cases may require to call [mobile: dragFromToForDuration](#mobile-dragfromtoforduration),
|
|
944
|
+
where one can supply coordinates and duration.
|
|
938
945
|
|
|
939
|
-
|
|
946
|
+
#### Arguments
|
|
947
|
+
|
|
948
|
+
Name | Type | Required | Description | Example
|
|
949
|
+
--- | --- | --- | --- | ---
|
|
950
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to swipe on. Application element will be used instead if this argument is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
951
|
+
direction | Either 'up', 'down', 'left' or 'right' | yes | The direction in which to swipe | up
|
|
952
|
+
velocity | number | no | This argument is optional and is only supported since Appium server version 1.19 and Xcode SDK version 11.4+. The value is measured in pixels per second and same values could behave differently on different devices depending on their display density. Higher values make swipe gesture faster (which usually scrolls larger areas if we apply it to a list) and lower values slow it down. Only values greater than zero have effect. | 250
|
|
953
|
+
|
|
954
|
+
#### Examples
|
|
955
|
+
|
|
956
|
+
```java
|
|
957
|
+
// Java
|
|
958
|
+
JavascriptExecutor js = (JavascriptExecutor) driver;
|
|
959
|
+
Map<String, Object> params = new HashMap<>();
|
|
960
|
+
params.put("direction", "down");
|
|
961
|
+
params.put("velocity", 2500);
|
|
962
|
+
params.put("element", ((RemoteWebElement) element).getId());
|
|
963
|
+
js.executeScript("mobile: swipe", params);
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
#### References
|
|
967
|
+
|
|
968
|
+
- [swipeDown](https://developer.apple.com/documentation/xctest/xcuielement/1618664-swipedown?language=objc)
|
|
969
|
+
- [swipeDownWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551694-swipedownwithvelocity?language=objc)
|
|
970
|
+
- [swipeUp](https://developer.apple.com/documentation/xctest/xcuielement/1618667-swipeup?language=objc)
|
|
971
|
+
- [swipeUpWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551697-swipeupwithvelocity?language=objc)
|
|
972
|
+
- [swipeLeft](https://developer.apple.com/documentation/xctest/xcuielement/1618668-swipeleft?language=objc)
|
|
973
|
+
- [swipeLeftWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551695-swipeleftwithvelocity?language=objc)
|
|
974
|
+
- [swipeRight](https://developer.apple.com/documentation/xctest/xcuielement/1618674-swiperight?language=objc)
|
|
975
|
+
- [swipeRightWithVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/3551696-swiperightwithvelocity?language=objc)
|
|
976
|
+
|
|
977
|
+
### mobile: scroll
|
|
978
|
+
|
|
979
|
+
Scrolls the element or the whole screen. Different scrolling strategies are supported.
|
|
980
|
+
Arguments define the choosen strategy: either 'name', 'direction', 'predicateString' or
|
|
981
|
+
'toVisible' in that order. All strategies are exclusive and only one strategy
|
|
982
|
+
can be applied at a single moment of time. Use "mobile: scroll" to emulate precise
|
|
983
|
+
scrolling in tables or collection views, where it is already known to which element
|
|
984
|
+
the scrolling should be performed. Although, there is one known limitation there: in case
|
|
985
|
+
it is necessary to perform too many scroll gestures on parent container to reach the
|
|
986
|
+
necessary child element (tens of them) then the method call may fail.
|
|
987
|
+
_Important_: The implemntation of this extension relies on several undocumented XCTest features, which might not always be reliable. Thus it might *not* always work as expected.
|
|
988
|
+
|
|
989
|
+
#### Arguments
|
|
990
|
+
|
|
991
|
+
Name | Type | Required | Description | Example
|
|
992
|
+
--- | --- | --- | --- | ---
|
|
993
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to scroll on (e.g. the container). Application element will be used if this argument is not set | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
994
|
+
name | string | no | The accessibility id of the child element, to which scrolling is performed. The same result can be achieved by setting _predicateString_ argument to 'name == accessibilityId'. Has no effect if _elementId_ is not a container | cell12
|
|
995
|
+
direction | Either 'up', 'down', 'left' or 'right' | yes | The main difference from [swipe](#mobile-swipe) call with the same argument is that _scroll_ will try to move the current viewport exactly to the next/previous page (the term "page" means the content, which fits into a single device screen) | down
|
|
996
|
+
predicateString | string | no | The NSPredicate locator of the child element, to which the scrolling should be performed. Has no effect if _elementId_ is not a container | label == "foo"
|
|
997
|
+
toVisible | boolean | no | If set to _true_ then asks to scroll to the first visible _elementId_ in the parent container. Has no effect if _elementId_ is not set | true
|
|
998
|
+
|
|
999
|
+
#### Examples
|
|
1000
|
+
|
|
1001
|
+
```python
|
|
1002
|
+
# Python
|
|
1003
|
+
driver.execute_script('mobile: scroll', {'direction': 'down'});
|
|
1004
|
+
```
|
|
1005
|
+
|
|
1006
|
+
### mobile: pinch
|
|
1007
|
+
|
|
1008
|
+
Performs pinch gesture on the given element or on the application element.
|
|
1009
|
+
|
|
1010
|
+
#### Arguments
|
|
1011
|
+
|
|
1012
|
+
Name | Type | Required | Description | Example
|
|
1013
|
+
--- | --- | --- | --- | ---
|
|
1014
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to pinch on. Application element will be used instead if this parameter is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1015
|
+
scale | number | yes | Pinch scale of type float. Use a scale between 0 and 1 to "pinch close" or zoom out and a scale greater than 1 to "pinch open" or zoom in. | 0.5
|
|
1016
|
+
velocity | number | yes | The velocity of the pinch in scale factor per second (float value) | 2.2
|
|
1017
|
+
|
|
1018
|
+
#### Examples
|
|
1019
|
+
|
|
1020
|
+
```ruby
|
|
1021
|
+
# Ruby
|
|
1022
|
+
execute_script 'mobile: pinch', scale: 0.5, velocity: 1.1, element: element.ref
|
|
1023
|
+
```
|
|
1024
|
+
|
|
1025
|
+
#### Reference
|
|
1026
|
+
|
|
1027
|
+
[pinchWithScale:velocity:](https://developer.apple.com/documentation/xctest/xcuielement/1618669-pinchwithscale?language=objc)
|
|
1028
|
+
|
|
1029
|
+
### mobile: doubleTap
|
|
1030
|
+
|
|
1031
|
+
Performs double tap gesture on the given element or on the screen.
|
|
1032
|
+
|
|
1033
|
+
#### Arguments
|
|
1034
|
+
|
|
1035
|
+
Name | Type | Required | Description | Example
|
|
1036
|
+
--- | --- | --- | --- | ---
|
|
1037
|
+
elementId ("element" prior to Appium v 1.22) | string | no if x and y are set | The internal element identifier (as hexadecimal hash string) to double tap on | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1038
|
+
x | number | no if elementId is set | Screen x tap coordinate of type float. | 100
|
|
1039
|
+
y | number | no if elementId is set | Screen y tap coordinate of type float. | 100
|
|
1040
|
+
|
|
1041
|
+
#### Examples
|
|
1042
|
+
|
|
1043
|
+
```javascript
|
|
1044
|
+
// javascript
|
|
1045
|
+
driver.execute('mobile: doubleTap', {element: element.value.ELEMENT});
|
|
1046
|
+
```
|
|
1047
|
+
|
|
1048
|
+
### mobile: touchAndHold
|
|
1049
|
+
|
|
1050
|
+
Performs long press gesture on the given element or on the screen.
|
|
1051
|
+
|
|
1052
|
+
#### Arguments
|
|
1053
|
+
|
|
1054
|
+
Name | Type | Required | Description | Example
|
|
1055
|
+
--- | --- | --- | --- | ---
|
|
1056
|
+
elementId ("element" prior to Appium v 1.22) | string | no if x and y are set | The internal element identifier (as hexadecimal hash string) to long tap on | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1057
|
+
duration | number | yes | The float duration of press action in seconds | 1.5
|
|
1058
|
+
x | number | no if elementId is set | Screen x tap coordinate of type float. | 100
|
|
1059
|
+
y | number | no if elementId is set | Screen y tap coordinate of type float. | 100
|
|
1060
|
+
|
|
1061
|
+
#### Examples
|
|
1062
|
+
|
|
1063
|
+
```csharp
|
|
1064
|
+
// c#
|
|
1065
|
+
Dictionary<string, object> tfLongTap = new Dictionary<string, object>();
|
|
1066
|
+
tfLongTap.Add("element", element.Id);
|
|
1067
|
+
tfLongTap.Add("duration", 2.0);
|
|
1068
|
+
((IJavaScriptExecutor)driver).ExecuteScript("mobile: touchAndHold", tfLongTap);
|
|
1069
|
+
```
|
|
1070
|
+
|
|
1071
|
+
#### Reference
|
|
1072
|
+
|
|
1073
|
+
[pressForDuration:](https://developer.apple.com/documentation/xctest/xcuielement/1618663-pressforduration?language=objc)
|
|
1074
|
+
|
|
1075
|
+
### mobile: twoFingerTap
|
|
1076
|
+
|
|
1077
|
+
Performs two finger tap gesture on the given element or on the application element.
|
|
1078
|
+
|
|
1079
|
+
#### Arguments
|
|
1080
|
+
|
|
1081
|
+
Name | Type | Required | Description | Example
|
|
1082
|
+
--- | --- | --- | --- | ---
|
|
1083
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to tap on. Application element will be used instead if this parameter is not provided | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1084
|
+
|
|
1085
|
+
#### Examples
|
|
1086
|
+
|
|
1087
|
+
```csharp
|
|
1088
|
+
// c#
|
|
1089
|
+
Dictionary<string, object> tfTap = new Dictionary<string, object>();
|
|
1090
|
+
tfTap.Add("element", element.Id);
|
|
1091
|
+
((IJavaScriptExecutor)driver).ExecuteScript("mobile: twoFingerTap", tfTap);
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
#### Reference
|
|
1095
|
+
|
|
1096
|
+
[twoFingerTap](https://developer.apple.com/documentation/xctest/xcuielement/1618675-twofingertap?language=objc)
|
|
1097
|
+
|
|
1098
|
+
### mobile: tap
|
|
1099
|
+
|
|
1100
|
+
Performs tap gesture by coordinates on the given element or on the screen.
|
|
1101
|
+
|
|
1102
|
+
#### Arguments
|
|
1103
|
+
|
|
1104
|
+
Name | Type | Required | Description | Example
|
|
1105
|
+
--- | --- | --- | --- | ---
|
|
1106
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to tap on. _x_ and _y_ tap coordinates will be calulated relatively to the current element position on the screen if this argument is provided. Otherwise they should be calculated relatively to the active application element. | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1107
|
+
x | number | yes | Screen x tap coordinate of type float. | 100
|
|
1108
|
+
y | number | yes | Screen y tap coordinate of type float. | 100
|
|
1109
|
+
|
|
1110
|
+
### mobile: dragFromToForDuration
|
|
1111
|
+
|
|
1112
|
+
Performs drag and drop gesture by coordinates. This can be done either on an element or
|
|
1113
|
+
on the screen
|
|
1114
|
+
|
|
1115
|
+
#### Arguments
|
|
1116
|
+
|
|
1117
|
+
Name | Type | Required | Description | Example
|
|
1118
|
+
--- | --- | --- | --- | ---
|
|
1119
|
+
elementId ("element" prior to Appium v 1.22) | string | no | The internal element identifier (as hexadecimal hash string) to perform drag on. All the coordinates will be calculated relatively this this element position on the screen. Absolute screen coordinates are expected if this argument is not set | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1120
|
+
duration | number | yes | Float number of seconds in range [0.5, 60]. How long the tap gesture at starting drag point should be before to start dragging | 5.3
|
|
1121
|
+
fromX | number | yes | The x coordinate of starting drag point | 100
|
|
1122
|
+
fromY | number | yes | The y coordinate of starting drag point | 100
|
|
1123
|
+
toX | number | yes | The x coordinate of ending drag point | 200
|
|
1124
|
+
toY | number | yes | The y coordinate of ending drag point | 200
|
|
1125
|
+
|
|
1126
|
+
#### Examples
|
|
1127
|
+
|
|
1128
|
+
```java
|
|
1129
|
+
// Java
|
|
1130
|
+
JavascriptExecutor js = (JavascriptExecutor) driver;
|
|
1131
|
+
Map<String, Object> params = new HashMap<>();
|
|
1132
|
+
params.put("duration", 1.0);
|
|
1133
|
+
params.put("fromX", 100);
|
|
1134
|
+
params.put("fromY", 100);
|
|
1135
|
+
params.put("toX", 200);
|
|
1136
|
+
params.put("toY", 200);
|
|
1137
|
+
params.put("element", ((RemoteWebElement) element).getId());
|
|
1138
|
+
js.executeScript("mobile: dragFromToForDuration", params);
|
|
1139
|
+
```
|
|
1140
|
+
|
|
1141
|
+
#### Reference
|
|
1142
|
+
|
|
1143
|
+
[clickForDuration:thenDragToElement:](https://developer.apple.com/documentation/xctest/xcuielement/1500989-clickforduration?language=objc)
|
|
1144
|
+
|
|
1145
|
+
### mobile: selectPickerWheelValue
|
|
1146
|
+
|
|
1147
|
+
Performs selection of the next or previous picker wheel value. This might
|
|
1148
|
+
be useful if these values are populated dynamically, so you don't know which
|
|
1149
|
+
one to select or value selection does not work because of XCTest bug.
|
|
1150
|
+
|
|
1151
|
+
#### Arguments
|
|
1152
|
+
|
|
1153
|
+
Name | Type | Required | Description | Example
|
|
1154
|
+
--- | --- | --- | --- | ---
|
|
1155
|
+
elementId ("element" prior to Appium v 1.22) | string | yes | PickerWheel's internal element id (as hexadecimal hash string) to perform value selection on. The element must be of type XCUIElementTypePickerWheel | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1156
|
+
order | string | yes | Either _next_ to select the value next to the current one from the target picker wheel or _previous_ to select the previous one | next
|
|
1157
|
+
offset | number | no | The value in range [0.01, 0.5]. It defines how far from picker wheel's center the click should happen. The actual distance is calculated by multiplying this value to the actual picker wheel height. Too small offset value may not change the picker wheel value and too high value may cause the wheel to switch two or more values at once. Usually the optimal value is located in range [0.15, 0.3]. _0.2_ by default | 0.3
|
|
1158
|
+
|
|
1159
|
+
#### Examples
|
|
1160
|
+
|
|
1161
|
+
```java
|
|
1162
|
+
// Java
|
|
1163
|
+
JavascriptExecutor js = (JavascriptExecutor) driver;
|
|
1164
|
+
Map<String, Object> params = new HashMap<>();
|
|
1165
|
+
params.put("order", "next");
|
|
1166
|
+
params.put("offset", 0.15);
|
|
1167
|
+
params.put("element", ((RemoteWebElement) element).getId());
|
|
1168
|
+
js.executeScript("mobile: selectPickerWheelValue", params);
|
|
1169
|
+
```
|
|
1170
|
+
|
|
1171
|
+
### mobile: rotateElement
|
|
1172
|
+
|
|
1173
|
+
Performs [rotate](https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc) gesture on the given element.
|
|
1174
|
+
|
|
1175
|
+
#### Arguments
|
|
1176
|
+
|
|
1177
|
+
Name | Type | Required | Description | Example
|
|
1178
|
+
--- | --- | --- | --- | ---
|
|
1179
|
+
elementId ("element" prior to Appium v 1.22) | string | yes | Internal element id (as hexadecimal hash string) to perform rotation on | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1180
|
+
rotation | number | yes | The rotation of the gesture in radians | Math.PI
|
|
1181
|
+
velocity | number | yes | The velocity of the rotation gesture in radians per second | Math.PI / 4
|
|
1182
|
+
|
|
1183
|
+
#### Examples
|
|
1184
|
+
|
|
1185
|
+
```java
|
|
1186
|
+
// Java
|
|
1187
|
+
JavascriptExecutor js = (JavascriptExecutor) driver;
|
|
1188
|
+
js.executeScript("mobile: rotateElement", ImmutableMap.of(
|
|
1189
|
+
// rotate clockwise, 90 degrees
|
|
1190
|
+
"rotation", -Math.PI / 2,
|
|
1191
|
+
// in approximately two seconds
|
|
1192
|
+
"velocity", Math.PI / 4,
|
|
1193
|
+
"element", ((RemoteWebElement) element).getId()
|
|
1194
|
+
));
|
|
1195
|
+
```
|
|
1196
|
+
|
|
1197
|
+
#### Reference
|
|
940
1198
|
|
|
941
|
-
|
|
1199
|
+
[rotate:withVelocity:](https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc)
|
|
942
1200
|
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
1201
|
+
### mobile: tapWithNumberOfTaps
|
|
1202
|
+
|
|
1203
|
+
Sends one or more taps with one or more touch points since Appium 1.17.1.
|
|
1204
|
+
|
|
1205
|
+
#### Arguments
|
|
1206
|
+
|
|
1207
|
+
Name | Type | Required | Description | Example
|
|
1208
|
+
--- | --- | --- | --- | ---
|
|
1209
|
+
elementId ("element" prior to Appium v 1.22) | string | yes | The internal element identifier (as hexadecimal hash string) to perform one or more taps. | fe50b60b-916d-420b-8728-ee2072ec53eb
|
|
1210
|
+
numberOfTaps | number | yes | The number of taps | 2
|
|
1211
|
+
numberOfTouches | number | yes | The number of touch points | 2
|
|
1212
|
+
|
|
1213
|
+
#### Examples
|
|
1214
|
+
|
|
1215
|
+
```ruby
|
|
1216
|
+
# Ruby
|
|
1217
|
+
e = @driver.find_element :id, 'target element'
|
|
1218
|
+
# Taps the element with a single touch point twice
|
|
1219
|
+
@driver.execute_script 'mobile: tapWithNumberOfTaps', {element: e.ref, numberOfTaps: 2, numberOfTouches: 1}
|
|
1220
|
+
```
|
|
953
1221
|
|
|
954
|
-
|
|
1222
|
+
#### Reference
|
|
1223
|
+
[tapWithNumberOfTaps:numberOfTouches:](https://developer.apple.com/documentation/xctest/xcuielement/1618671-tapwithnumberoftaps)
|
|
955
1224
|
|
|
956
1225
|
|
|
957
1226
|
## Known issues
|
|
@@ -59,7 +59,7 @@ commands.getName = async function getName(el) {
|
|
|
59
59
|
|
|
60
60
|
if (this.isWebContext()) {
|
|
61
61
|
const atomsElement = this.useAtomsElement(el);
|
|
62
|
-
const script = 'return arguments[0].tagName';
|
|
62
|
+
const script = 'return arguments[0].tagName.toLowerCase()';
|
|
63
63
|
return await this.executeAtom('execute_script', [script, [atomsElement]]);
|
|
64
64
|
}
|
|
65
65
|
|
|
@@ -330,4 +330,4 @@ var _default = extensions;
|
|
|
330
330
|
exports.default = _default;require('source-map-support').install();
|
|
331
331
|
|
|
332
332
|
|
|
333
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbCIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwiZXhlY3V0ZUF0b20iLCJwcm94eUNvbW1hbmQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJzY3JpcHQiLCJnZXROYXRpdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRDb250ZW50U2l6ZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZ2V0VGV4dCIsImdldEVsZW1lbnRSZWN0IiwieCIsInkiLCJnZXRMb2NhdGlvbiIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0U2l6ZSIsImdldE5hdGl2ZVJlY3QiLCJsb2MiLCJvcHRzIiwiYWJzb2x1dGVXZWJMb2NhdGlvbnMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImV4ZWN1dGUiLCJyZWN0IiwiZ2V0TG9jYXRpb25JblZpZXciLCJwcmVwYXJlSW5wdXRWYWx1ZSIsImlucCIsImlzQXJyYXkiLCJpc0Zpbml0ZSIsInNvbWUiLCJmIiwiRXJyb3IiLCJqb2luIiwibWFwIiwiayIsInNldFZhbHVlSW1tZWRpYXRlIiwibG9nIiwiaW5mbyIsInNldFZhbHVlIiwia2V5cyIsImNsZWFyIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInR5cGUiLCJsb2NhdG9yIiwiY29udGVudEhlaWdodCIsImNoaWxkcmVuIiwiZmluZEVsT3JFbHMiLCJsZW5ndGgiLCJoZWFkIiwiZmlyc3RSZWN0IiwibGFzdFJlY3QiLCJsYXN0IiwiZWxzSW5Sb3ciLCJpbml0aWFsUmVjdHMiLCJpIiwicHVzaCIsInNwYWNlQmV0d2VlbkVscyIsIm51bVJvd3MiLCJNYXRoIiwiY2VpbCIsInNpemUiLCJvcmlnaW4iLCJ0b3AiLCJsZWZ0Iiwic2Nyb2xsYWJsZU9mZnNldCIsImlzS2V5Ym9hcmRTaG93biIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsImlnbiIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsVUFBVSxHQUFHLEVBQWxDOzs7QUFFQUQsUUFBUSxDQUFDRSxnQkFBVCxHQUE0QixlQUFlQSxnQkFBZixDQUFpQ0MsRUFBakMsRUFBcUM7QUFDL0RBLEVBQUFBLEVBQUUsR0FBR0Msb0JBQUtDLGFBQUwsQ0FBbUJGLEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxLQUFLRyxZQUFMLEVBQUosRUFBeUI7QUFDdkIsVUFBTUMsWUFBWSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJMLEVBQXJCLENBQXJCO0FBQ0EsV0FBTyxNQUFNLEtBQUtNLFdBQUwsQ0FBaUIsY0FBakIsRUFBaUMsQ0FBQ0YsWUFBRCxDQUFqQyxDQUFiO0FBQ0Q7O0FBRUQsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBbUIsWUFBV1AsRUFBRyxZQUFqQyxFQUE4QyxLQUE5QyxDQUFiO0FBQ0QsQ0FSRDs7QUFVQUgsUUFBUSxDQUFDVyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JSLEVBQS9CLEVBQW1DO0FBQzNEQSxFQUFBQSxFQUFFLEdBQUdDLG9CQUFLQyxhQUFMLENBQW1CRixFQUFuQixDQUFMOztBQUNBLE1BQUksS0FBS0csWUFBTCxFQUFKLEVBQXlCO0FBQ3ZCLFVBQU1DLFlBQVksR0FBRyxLQUFLQyxlQUFMLENBQXFCTCxFQUFyQixDQUFyQjtBQUNBLFdBQU8sTUFBTSxLQUFLTSxXQUFMLENBQWlCLFlBQWpCLEVBQStCLENBQUNGLFlBQUQsQ0FBL0IsQ0FB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QTFCWDtBQTZCRDs7QUFDRCxRQUFNa0IsSUFBSSxHQUFHLE1BQU0sS0FBSzdDLE9BQUwsQ0FBYWpDLEVBQWIsQ0FBbkI7QUFDQSxRQUFNK0UsTUFBTSxHQUFHLE1BQU0sS0FBS3JDLGlCQUFMLENBQXVCMUMsRUFBdkIsQ0FBckI7QUFFQSxTQUFPb0IsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDcEJVLElBQUFBLEtBQUssRUFBRStDLElBQUksQ0FBQy9DLEtBRFE7QUFFcEJDLElBQUFBLE1BQU0sRUFBRThDLElBQUksQ0FBQzlDLE1BRk87QUFHcEJnRCxJQUFBQSxHQUFHLEVBQUVELE1BQU0sQ0FBQ2xELENBSFE7QUFJcEJvRCxJQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ25ELENBSk87QUFLcEJzRCxJQUFBQSxnQkFBZ0IsRUFBRXBCO0FBTEUsR0FBZixDQUFQO0FBT0QsQ0FwRUQ7O0FBc0VBakUsUUFBUSxDQUFDc0YsZUFBVCxHQUEyQixlQUFlQSxlQUFmLEdBQWtDO0FBQzNELE1BQUk7QUFDRixVQUFNLEtBQUtDLDJCQUFMLENBQWlDLFlBQWpDLEVBQStDLHlCQUEvQyxFQUEwRSxLQUExRSxDQUFOO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWN6RixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZWxlbWVudERpc3BsYXllZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnREaXNwbGF5ZWQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2lzX2Rpc3BsYXllZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZGlzcGxheWVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfZW5hYmxlZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZW5hYmxlZGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfc2VsZWN0ZWQnLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3NlbGVjdGVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBhcmd1bWVudHNbMF0udGFnTmFtZSc7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgW2F0b21zRWxlbWVudF1dKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vbmFtZWAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldE5hdGl2ZUF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZUF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBpZiAoYXR0cmlidXRlID09PSAnY29udGVudFNpemUnKSB7XG4gICAgLy8gZG9uJ3QgcHJveHkgcmVxdWVzdHMgZm9yIHRoZSBjb250ZW50IHNpemUgb2YgYSBzY3JvbGxhYmxlIGVsZW1lbnRcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRDb250ZW50U2l6ZShlbCk7XG4gIH1cblxuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG5cbiAgLy8gb3RoZXJ3aXNlIGxldCBXREEgaGFuZGxlIGF0dHJpYnV0ZSByZXF1ZXN0c1xuICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vYXR0cmlidXRlLyR7YXR0cmlidXRlfWAsICdHRVQnKTtcbiAgLy8gVHJhbnNmb3JtIHRoZSByZXN1bHQgZm9yIHRoZSBjYXNlIHdoZW4gV0RBIHJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBmb3IgYSBib29sZWFuIHZhbHVlXG4gIGlmIChbMCwgMV0uaW5jbHVkZXModmFsdWUpKSB7XG4gICAgdmFsdWUgPSAhIXZhbHVlO1xuICB9XG4gIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIGFjY29yZGluZyB0byBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZHJpdmVyLyNnZXQtZWxlbWVudC1hdHRyaWJ1dGVcbiAgcmV0dXJuIChfLmlzTnVsbCh2YWx1ZSkgfHwgXy5pc1N0cmluZyh2YWx1ZSkpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59O1xuXG5jb21tYW5kcy5nZXRBdHRyaWJ1dGUgPSBhc3luYyBmdW5jdGlvbiBnZXRBdHRyaWJ1dGUgKGF0dHJpYnV0ZSwgZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVBdHRyaWJ1dGUoYXR0cmlidXRlLCBlbCk7XG4gIH1cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICBpZiAoXy5pc051bGwoYXRvbXNFbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBFcnJvciBjb252ZXJ0aW5nIGVsZW1lbnQgSUQgZm9yIHVzaW5nIGluIFdEIGF0b21zOiAnJHtlbH1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZ2V0X2F0dHJpYnV0ZV92YWx1ZScsIFthdG9tc0VsZW1lbnQsIGF0dHJpYnV0ZV0pO1xufTtcblxuY29tbWFuZHMuZ2V0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldFRleHQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS90ZXh0YCwgJ0dFVCcpO1xuICB9XG4gIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdGV4dCcsIFthdG9tc0VsZW1lbnRdKTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsKSB7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgLy8gTW9iaWxlIHNhZmFyaSBkb2Vzbid0IHN1cHBvcnQgcmVjdFxuICAgIGNvbnN0IHt4LCB5fSA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24oZWwpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gICAgcmV0dXJuIHt4LCB5LCB3aWR0aCwgaGVpZ2h0fTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmF0aXZlUmVjdChlbCk7XG59O1xuXG5leHRlbnNpb25zLmdldE5hdGl2ZVJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXROYXRpdmVSZWN0IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3JlY3RgLCAnR0VUJyk7XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gYXdhaXQgdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGxldCBsb2MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfdG9wX2xlZnRfY29vcmRpbmF0ZXMnLCBbYXRvbXNFbGVtZW50XSk7XG4gICAgaWYgKHRoaXMub3B0cy5hYnNvbHV0ZVdlYkxvY2F0aW9ucykge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBbZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcF07JztcbiAgICAgIGNvbnN0IFt4T2Zmc2V0LCB5T2Zmc2V0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZShzY3JpcHQpO1xuICAgICAgbG9jLnggKz0geE9mZnNldDtcbiAgICAgIGxvYy55ICs9IHlPZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiBsb2M7XG4gIH1cblxuICBjb25zdCByZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChlbCk7XG4gIHJldHVybiB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xufTtcblxuY29tbWFuZHMuZ2V0TG9jYXRpb25JblZpZXcgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvbkluVmlldyAoZWwpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24oZWwpO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBsZXQgYXRvbXNFbGVtZW50ID0gdGhpcy5nZXRBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGlmIChhdG9tc0VsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGBFcnJvciBjb252ZXJ0aW5nIGVsZW1lbnQgSUQgZm9yIHVzaW5nIGluIFdEIGF0b21zOiAnJHtlbH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfc2l6ZScsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt3aWR0aDogcmVjdC53aWR0aCwgaGVpZ2h0OiByZWN0LmhlaWdodH07XG59O1xuXG4vKipcbiAqIFByZXBhcmVzIHRoZSBpbnB1dCB2YWx1ZSB0byBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gV0RBLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5PHN0cmluZz58bnVtYmVyfSBpbnAgVGhlIGFjdHVhbCB0ZXh0IHRvIHR5cGUuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBvZiBgaW5wYDpcbiAqICAgWydzb21lIHRleHQnXVxuICogICBbJ3MnLCAnbycsICdtJywgJ2UnLCAnICcsICd0JywgJ2UnLCAneCcsICd0J11cbiAqICAgJ3NvbWUgdGV4dCdcbiAqICAgMTIzNFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB2YWx1ZSBpcyBub3QgYWNjZXB0YWJsZSBmb3IgaW5wdXRcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgcHJlcHJvY2Vzc2VkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVJbnB1dFZhbHVlIChpbnApIHtcbiAgaWYgKCFbXy5pc0FycmF5LCBfLmlzU3RyaW5nLCBfLmlzRmluaXRlXS5zb21lKChmKSA9PiBmKGlucCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHN0cmluZ3MsIG51bWJlcnMgYW5kIGFycmF5cyBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFyZ3VtZW50cy4gYCArXG4gICAgICBgUmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5wKX1gKTtcbiAgfVxuXG4gIC8vIG1ha2UgaXQgaW50byBhIHN0cmluZywgc28gdGhlbiB3ZSBhc3N1cmVcbiAgLy8gdGhlIGFycmF5IGl0ZW1zIGFyZSBzaW5nbGUgY2hhcmFjdGVyc1xuICBpZiAoXy5pc0FycmF5KGlucCkpIHtcbiAgICBpbnAgPSBpbnAuam9pbignJyk7XG4gIH0gZWxzZSBpZiAoXy5pc0Zpbml0ZShpbnApKSB7XG4gICAgaW5wID0gYCR7aW5wfWA7XG4gIH1cbiAgLy8gVGhlIGBzcGxpdGAgbWV0aG9kIG11c3Qgbm90IGJlIHVzZWQgb24gdGhlIHN0cmluZ1xuICAvLyB0byBwcm9wZXJseSBoYW5kbGUgYWxsIFVuaWNvZGUgY29kZSBwb2ludHNcbiAgcmV0dXJuIFsuLi5pbnBdLm1hcCgoaykgPT4ge1xuICAgIGlmIChbJ1xcdUUwMDYnLCAnXFx1RTAwNyddLmluY2x1ZGVzKGspKSB7IC8vIFJFVFVSTiBvciBFTlRFUlxuICAgICAgcmV0dXJuICdcXG4nO1xuICAgIH1cbiAgICBpZiAoWydcXHVFMDAzJywgJ1xcdWUwMTcnXS5pbmNsdWRlcyhrKSkgeyAvLyBCQUNLU1BBQ0Ugb3IgREVMRVRFXG4gICAgICByZXR1cm4gJ1xcYic7XG4gICAgfVxuICAgIHJldHVybiBrO1xuICB9KTtcbn1cblxuY29tbWFuZHMuc2V0VmFsdWVJbW1lZGlhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZUltbWVkaWF0ZSAodmFsdWUsIGVsKSB7XG4gIC8vIFdEQSBkb2VzIG5vdCBwcm92aWRlIG5vIHdheSB0byBzZXQgdGhlIHZhbHVlIGRpcmVjdGx5XG4gIGxvZy5pbmZvKCdUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGJ5cGFzcyB0eXBpbmcgdXNpbmcgWENVSVRlc3QuIFNldHRpbmcgdmFsdWUgdGhyb3VnaCBrZXlib2FyZCcpO1xuICBhd2FpdCB0aGlzLnNldFZhbHVlKHZhbHVlLCBlbCk7XG59O1xuXG5jb21tYW5kcy5zZXRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlICh2YWx1ZSwgZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vdmFsdWVgLCAnUE9TVCcsIHtcbiAgICAgIHZhbHVlOiBwcmVwYXJlSW5wdXRWYWx1ZSh2YWx1ZSksXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdjbGljaycsIFthdG9tc0VsZW1lbnRdKTtcbiAgYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgndHlwZScsIFthdG9tc0VsZW1lbnQsIHZhbHVlXSk7XG59O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAodmFsdWUpIHtcbiAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy93ZGEva2V5cycsICdQT1NUJywge1xuICAgIHZhbHVlOiBwcmVwYXJlSW5wdXRWYWx1ZSh2YWx1ZSksXG4gIH0pO1xufTtcblxuY29tbWFuZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdjbGVhcicsIFthdG9tc0VsZW1lbnRdKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L2NsZWFyYCwgJ1BPU1QnKTtcbn07XG5cbmNvbW1hbmRzLmdldENvbnRlbnRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q29udGVudFNpemUgKGVsKSB7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCdTdXBwb3J0IGZvciBnZXRDb250ZW50U2l6ZSBmb3Igd2ViIGNvbnRleHQgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4gUGxlYXNlIGNvbnRhY3QgYW4gQXBwaXVtIGRldicpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJywgZWwpO1xuXG4gIGlmICh0eXBlICE9PSAnWENVSUVsZW1lbnRUeXBlVGFibGUnICYmXG4gICAgICB0eXBlICE9PSAnWENVSUVsZW1lbnRUeXBlQ29sbGVjdGlvblZpZXcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBnZXQgY29udGVudCBzaXplIGZvciB0eXBlICcke3R5cGV9Jywgb25seSBmb3IgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0YWJsZXMgYW5kIGNvbGxlY3Rpb24gdmlld3NgKTtcbiAgfVxuICBsZXQgbG9jYXRvciA9ICcqJztcbiAgaWYgKHR5cGUgPT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScpIHtcbiAgICAvLyBvbmx5IGZpbmQgdGFibGUgY2VsbHMsIG5vdCBqdXN0IGFueSBjaGlsZHJlblxuICAgIGxvY2F0b3IgPSAnWENVSUVsZW1lbnRUeXBlQ2VsbCc7XG4gIH1cblxuICBsZXQgY29udGVudEhlaWdodCA9IDA7XG4gIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5maW5kRWxPckVscyhgY2xhc3MgY2hhaW5gLCBsb2NhdG9yLCB0cnVlLCBlbCk7XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBpZiB3ZSBrbm93IHRoZXJlJ3Mgb25seSBvbmUgZWxlbWVudCwgd2UgY2FuIG9wdGltaXplIHRvIG1ha2UganVzdCBvbmVcbiAgICAvLyBjYWxsIHRvIFdEQVxuICAgIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8uaGVhZChjaGlsZHJlbikpO1xuICAgIGNvbnRlbnRIZWlnaHQgPSByZWN0LmhlaWdodDtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAvLyBvdGhlcndpc2UgaWYgd2UgaGF2ZSBtdWx0aXBsZSBlbGVtZW50cywgbG9naWMgZGlmZmVycyBiYXNlZCBvbiBlbGVtZW50XG4gICAgLy8gdHlwZVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnWENVSUVsZW1lbnRUeXBlVGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGZpcnN0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgICAgIGNvbnN0IGxhc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmxhc3QoY2hpbGRyZW4pKTtcbiAgICAgICAgY29udGVudEhlaWdodCA9IGxhc3RSZWN0LnkgKyBsYXN0UmVjdC5oZWlnaHQgLSBmaXJzdFJlY3QueTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldyc6IHtcbiAgICAgICAgbGV0IGVsc0luUm93ID0gMTsgLy8gd2Uga25vdyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBlbGVtZW50IGluIHRoZSByb3dcbiAgICAgICAgbGV0IGZpcnN0UmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgICAgIGxldCBpbml0aWFsUmVjdHMgPSBbZmlyc3RSZWN0XTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICBpbml0aWFsUmVjdHMucHVzaChyZWN0KTtcbiAgICAgICAgICBpZiAocmVjdC55ICE9PSBmaXJzdFJlY3QueSkge1xuICAgICAgICAgICAgZWxzSW5Sb3cgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwYWNlQmV0d2VlbkVscyA9IGluaXRpYWxSZWN0c1tlbHNJblJvd10ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLnkgLSBpbml0aWFsUmVjdHNbZWxzSW5Sb3cgLSAxXS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bVJvd3MgPSBNYXRoLmNlaWwoY2hpbGRyZW4ubGVuZ3RoIC8gZWxzSW5Sb3cpO1xuXG4gICAgICAgIC8vIGFzc3VtZSBhbGwgY2VsbHMgYXJlIHRoZSBzYW1lIGhlaWdodFxuICAgICAgICBjb250ZW50SGVpZ2h0ID0gKG51bVJvd3MgKiBmaXJzdFJlY3QuaGVpZ2h0KSArIChzcGFjZUJldHdlZW5FbHMgKiAobnVtUm93cyAtIDEpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoYFByb2dyYW1taW5nIGVycm9yOiB0eXBlICcke3R5cGV9JyB3YXMgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB2YWxpZCBidXQgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlamVjdGVkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNpemUgPSBhd2FpdCB0aGlzLmdldFNpemUoZWwpO1xuICBjb25zdCBvcmlnaW4gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uSW5WaWV3KGVsKTtcbiAgLy8gYXR0cmlidXRlcyBoYXZlIHRvIGJlIHN0cmluZ3MsIHNvIHN0cmluZ2lmeSB0aGlzIHVwXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgd2lkdGg6IHNpemUud2lkdGgsXG4gICAgaGVpZ2h0OiBzaXplLmhlaWdodCxcbiAgICB0b3A6IG9yaWdpbi55LFxuICAgIGxlZnQ6IG9yaWdpbi54LFxuICAgIHNjcm9sbGFibGVPZmZzZXQ6IGNvbnRlbnRIZWlnaHRcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5pc0tleWJvYXJkU2hvd24gPSBhc3luYyBmdW5jdGlvbiBpc0tleWJvYXJkU2hvd24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZUtleWJvYXJkJywgZmFsc2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMpO1xuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
333
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sIm5hbWVzIjpbImNvbW1hbmRzIiwiZXh0ZW5zaW9ucyIsImVsZW1lbnREaXNwbGF5ZWQiLCJlbCIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwiaXNXZWJDb250ZXh0IiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwiZXhlY3V0ZUF0b20iLCJwcm94eUNvbW1hbmQiLCJlbGVtZW50RW5hYmxlZCIsImVsZW1lbnRTZWxlY3RlZCIsImdldE5hbWUiLCJzY3JpcHQiLCJnZXROYXRpdmVBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRDb250ZW50U2l6ZSIsInZhbHVlIiwiaW5jbHVkZXMiLCJfIiwiaXNOdWxsIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0QXR0cmlidXRlIiwiZ2V0QXRvbXNFbGVtZW50IiwiZXJyb3JzIiwiVW5rbm93bkVycm9yIiwiZ2V0VGV4dCIsImdldEVsZW1lbnRSZWN0IiwieCIsInkiLCJnZXRMb2NhdGlvbiIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0U2l6ZSIsImdldE5hdGl2ZVJlY3QiLCJsb2MiLCJvcHRzIiwiYWJzb2x1dGVXZWJMb2NhdGlvbnMiLCJ4T2Zmc2V0IiwieU9mZnNldCIsImV4ZWN1dGUiLCJyZWN0IiwiZ2V0TG9jYXRpb25JblZpZXciLCJwcmVwYXJlSW5wdXRWYWx1ZSIsImlucCIsImlzQXJyYXkiLCJpc0Zpbml0ZSIsInNvbWUiLCJmIiwiRXJyb3IiLCJqb2luIiwibWFwIiwiayIsInNldFZhbHVlSW1tZWRpYXRlIiwibG9nIiwiaW5mbyIsInNldFZhbHVlIiwia2V5cyIsImNsZWFyIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInR5cGUiLCJsb2NhdG9yIiwiY29udGVudEhlaWdodCIsImNoaWxkcmVuIiwiZmluZEVsT3JFbHMiLCJsZW5ndGgiLCJoZWFkIiwiZmlyc3RSZWN0IiwibGFzdFJlY3QiLCJsYXN0IiwiZWxzSW5Sb3ciLCJpbml0aWFsUmVjdHMiLCJpIiwicHVzaCIsInNwYWNlQmV0d2VlbkVscyIsIm51bVJvd3MiLCJNYXRoIiwiY2VpbCIsInNpemUiLCJvcmlnaW4iLCJ0b3AiLCJsZWZ0Iiwic2Nyb2xsYWJsZU9mZnNldCIsImlzS2V5Ym9hcmRTaG93biIsImZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyIsImlnbiIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7QUFBQSxNQUFxQkMsVUFBVSxHQUFHLEVBQWxDOzs7QUFFQUQsUUFBUSxDQUFDRSxnQkFBVCxHQUE0QixlQUFlQSxnQkFBZixDQUFpQ0MsRUFBakMsRUFBcUM7QUFDL0RBLEVBQUFBLEVBQUUsR0FBR0Msb0JBQUtDLGFBQUwsQ0FBbUJGLEVBQW5CLENBQUw7O0FBQ0EsTUFBSSxLQUFLRyxZQUFMLEVBQUosRUFBeUI7QUFDdkIsVUFBTUMsWUFBWSxHQUFHLEtBQUtDLGVBQUwsQ0FBcUJMLEVBQXJCLENBQXJCO0FBQ0EsV0FBTyxNQUFNLEtBQUtNLFdBQUwsQ0FBaUIsY0FBakIsRUFBaUMsQ0FBQ0YsWUFBRCxDQUFqQyxDQUFiO0FBQ0Q7O0FBRUQsU0FBTyxNQUFNLEtBQUtHLFlBQUwsQ0FBbUIsWUFBV1AsRUFBRyxZQUFqQyxFQUE4QyxLQUE5QyxDQUFiO0FBQ0QsQ0FSRDs7QUFVQUgsUUFBUSxDQUFDVyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JSLEVBQS9CLEVBQW1DO0FBQzNEQSxFQUFBQSxFQUFFLEdBQUdDLG9CQUFLQyxhQUFMLENBQW1CRixFQUFuQixDQUFMOztBQUNBLE1BQUksS0FBS0csWUFBTCxFQUFKLEVBQXlCO0FBQ3ZCLFVBQU1DLFlBQVksR0FBRyxLQUFLQyxlQUFMLENBQXFCTCxFQUFyQixDQUFyQjtBQUNBLFdBQU8sTUFBTSxLQUFLTSxXQUFMLENBQWlCLFlBQWpCLEVBQStCLENBQUNGLFlBQUQsQ0FBL0IsQ0FB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QTFCWDtBQTZCRDs7QUFDRCxRQUFNa0IsSUFBSSxHQUFHLE1BQU0sS0FBSzdDLE9BQUwsQ0FBYWpDLEVBQWIsQ0FBbkI7QUFDQSxRQUFNK0UsTUFBTSxHQUFHLE1BQU0sS0FBS3JDLGlCQUFMLENBQXVCMUMsRUFBdkIsQ0FBckI7QUFFQSxTQUFPb0IsSUFBSSxDQUFDQyxTQUFMLENBQWU7QUFDcEJVLElBQUFBLEtBQUssRUFBRStDLElBQUksQ0FBQy9DLEtBRFE7QUFFcEJDLElBQUFBLE1BQU0sRUFBRThDLElBQUksQ0FBQzlDLE1BRk87QUFHcEJnRCxJQUFBQSxHQUFHLEVBQUVELE1BQU0sQ0FBQ2xELENBSFE7QUFJcEJvRCxJQUFBQSxJQUFJLEVBQUVGLE1BQU0sQ0FBQ25ELENBSk87QUFLcEJzRCxJQUFBQSxnQkFBZ0IsRUFBRXBCO0FBTEUsR0FBZixDQUFQO0FBT0QsQ0FwRUQ7O0FBc0VBakUsUUFBUSxDQUFDc0YsZUFBVCxHQUEyQixlQUFlQSxlQUFmLEdBQWtDO0FBQzNELE1BQUk7QUFDRixVQUFNLEtBQUtDLDJCQUFMLENBQWlDLFlBQWpDLEVBQStDLHlCQUEvQyxFQUEwRSxLQUExRSxDQUFOO0FBQ0EsV0FBTyxJQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLFdBQU8sS0FBUDtBQUNEO0FBQ0YsQ0FQRDs7QUFTQUMsTUFBTSxDQUFDQyxNQUFQLENBQWN6RixVQUFkLEVBQTBCRCxRQUExQjtlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZWxlbWVudERpc3BsYXllZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnREaXNwbGF5ZWQgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2lzX2Rpc3BsYXllZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZGlzcGxheWVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfZW5hYmxlZCcsIFthdG9tc0VsZW1lbnRdKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vZW5hYmxlZGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnaXNfc2VsZWN0ZWQnLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3NlbGVjdGVkYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgY29uc3Qgc2NyaXB0ID0gJ3JldHVybiBhcmd1bWVudHNbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpJztcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBbYXRvbXNFbGVtZW50XV0pO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9uYW1lYCwgJ0dFVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0TmF0aXZlQXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmF0aXZlQXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsKSB7XG4gIGlmIChhdHRyaWJ1dGUgPT09ICdjb250ZW50U2l6ZScpIHtcbiAgICAvLyBkb24ndCBwcm94eSByZXF1ZXN0cyBmb3IgdGhlIGNvbnRlbnQgc2l6ZSBvZiBhIHNjcm9sbGFibGUgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbnRlbnRTaXplKGVsKTtcbiAgfVxuXG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICAvLyBvdGhlcndpc2UgbGV0IFdEQSBoYW5kbGUgYXR0cmlidXRlIHJlcXVlc3RzXG4gIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS9hdHRyaWJ1dGUvJHthdHRyaWJ1dGV9YCwgJ0dFVCcpO1xuICAvLyBUcmFuc2Zvcm0gdGhlIHJlc3VsdCBmb3IgdGhlIGNhc2Ugd2hlbiBXREEgcmV0dXJucyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGZvciBhIGJvb2xlYW4gdmFsdWVcbiAgaWYgKFswLCAxXS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9ICEhdmFsdWU7XG4gIH1cbiAgLy8gVGhlIHJldHVybmVkIHZhbHVlIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2dldC1lbGVtZW50LWF0dHJpYnV0ZVxuICByZXR1cm4gKF8uaXNOdWxsKHZhbHVlKSB8fCBfLmlzU3RyaW5nKHZhbHVlKSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn07XG5cbmNvbW1hbmRzLmdldEF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldE5hdGl2ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVsKTtcbiAgfVxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gIGlmIChfLmlzTnVsbChhdG9tc0VsZW1lbnQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdnZXRfYXR0cmlidXRlX3ZhbHVlJywgW2F0b21zRWxlbWVudCwgYXR0cmlidXRlXSk7XG59O1xuXG5jb21tYW5kcy5nZXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGV4dCAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC9lbGVtZW50LyR7ZWx9L3RleHRgLCAnR0VUJyk7XG4gIH1cbiAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90ZXh0JywgW2F0b21zRWxlbWVudF0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAvLyBNb2JpbGUgc2FmYXJpIGRvZXNuJ3Qgc3VwcG9ydCByZWN0XG4gICAgY29uc3Qge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gYXdhaXQgdGhpcy5nZXRTaXplKGVsKTtcbiAgICByZXR1cm4ge3gsIHksIHdpZHRoLCBoZWlnaHR9O1xuICB9XG5cbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXROYXRpdmVSZWN0KGVsKTtcbn07XG5cbmV4dGVuc2lvbnMuZ2V0TmF0aXZlUmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hdGl2ZVJlY3QgKGVsKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vcmVjdGAsICdHRVQnKTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSBhd2FpdCB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IGxvYyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF90b3BfbGVmdF9jb29yZGluYXRlcycsIFthdG9tc0VsZW1lbnRdKTtcbiAgICBpZiAodGhpcy5vcHRzLmFic29sdXRlV2ViTG9jYXRpb25zKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSAncmV0dXJuIFtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXTsnO1xuICAgICAgY29uc3QgW3hPZmZzZXQsIHlPZmZzZXRdID0gYXdhaXQgdGhpcy5leGVjdXRlKHNjcmlwdCk7XG4gICAgICBsb2MueCArPSB4T2Zmc2V0O1xuICAgICAgbG9jLnkgKz0geU9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIGxvYztcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsKTtcbiAgcmV0dXJuIHt4OiByZWN0LngsIHk6IHJlY3QueX07XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbkluVmlldyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uSW5WaWV3IChlbCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG59O1xuXG5jb21tYW5kcy5nZXRTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2l6ZSAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLmdldEF0b21zRWxlbWVudChlbCk7XG4gICAgaWYgKGF0b21zRWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYEVycm9yIGNvbnZlcnRpbmcgZWxlbWVudCBJRCBmb3IgdXNpbmcgaW4gV0QgYXRvbXM6ICcke2VsfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2dldF9zaXplJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICByZXR1cm4ge3dpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0fTtcbn07XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIGlucHV0IHZhbHVlIHRvIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBXREEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8c3RyaW5nPnxudW1iZXJ9IGlucCBUaGUgYWN0dWFsIHRleHQgdG8gdHlwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIG9mIGBpbnBgOlxuICogICBbJ3NvbWUgdGV4dCddXG4gKiAgIFsncycsICdvJywgJ20nLCAnZScsICcgJywgJ3QnLCAnZScsICd4JywgJ3QnXVxuICogICAnc29tZSB0ZXh0J1xuICogICAxMjM0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHZhbHVlIGlzIG5vdCBhY2NlcHRhYmxlIGZvciBpbnB1dFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBwcmVwcm9jZXNzZWQgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUlucHV0VmFsdWUgKGlucCkge1xuICBpZiAoIVtfLmlzQXJyYXksIF8uaXNTdHJpbmcsIF8uaXNGaW5pdGVdLnNvbWUoKGYpID0+IGYoaW5wKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ubHkgc3RyaW5ncywgbnVtYmVycyBhbmQgYXJyYXlzIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYXJndW1lbnRzLiBgICtcbiAgICAgIGBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeShpbnApfWApO1xuICB9XG5cbiAgLy8gbWFrZSBpdCBpbnRvIGEgc3RyaW5nLCBzbyB0aGVuIHdlIGFzc3VyZVxuICAvLyB0aGUgYXJyYXkgaXRlbXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzXG4gIGlmIChfLmlzQXJyYXkoaW5wKSkge1xuICAgIGlucCA9IGlucC5qb2luKCcnKTtcbiAgfSBlbHNlIGlmIChfLmlzRmluaXRlKGlucCkpIHtcbiAgICBpbnAgPSBgJHtpbnB9YDtcbiAgfVxuICAvLyBUaGUgYHNwbGl0YCBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBvbiB0aGUgc3RyaW5nXG4gIC8vIHRvIHByb3Blcmx5IGhhbmRsZSBhbGwgVW5pY29kZSBjb2RlIHBvaW50c1xuICByZXR1cm4gWy4uLmlucF0ubWFwKChrKSA9PiB7XG4gICAgaWYgKFsnXFx1RTAwNicsICdcXHVFMDA3J10uaW5jbHVkZXMoaykpIHsgLy8gUkVUVVJOIG9yIEVOVEVSXG4gICAgICByZXR1cm4gJ1xcbic7XG4gICAgfVxuICAgIGlmIChbJ1xcdUUwMDMnLCAnXFx1ZTAxNyddLmluY2x1ZGVzKGspKSB7IC8vIEJBQ0tTUEFDRSBvciBERUxFVEVcbiAgICAgIHJldHVybiAnXFxiJztcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH0pO1xufVxuXG5jb21tYW5kcy5zZXRWYWx1ZUltbWVkaWF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFZhbHVlSW1tZWRpYXRlICh2YWx1ZSwgZWwpIHtcbiAgLy8gV0RBIGRvZXMgbm90IHByb3ZpZGUgbm8gd2F5IHRvIHNldCB0aGUgdmFsdWUgZGlyZWN0bHlcbiAgbG9nLmluZm8oJ1RoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgdG8gYnlwYXNzIHR5cGluZyB1c2luZyBYQ1VJVGVzdC4gU2V0dGluZyB2YWx1ZSB0aHJvdWdoIGtleWJvYXJkJyk7XG4gIGF3YWl0IHRoaXMuc2V0VmFsdWUodmFsdWUsIGVsKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWUgKHZhbHVlLCBlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvZWxlbWVudC8ke2VsfS92YWx1ZWAsICdQT1NUJywge1xuICAgICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCd0eXBlJywgW2F0b21zRWxlbWVudCwgdmFsdWVdKTtcbn07XG5cbmNvbW1hbmRzLmtleXMgPSBhc3luYyBmdW5jdGlvbiBrZXlzICh2YWx1ZSkge1xuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9rZXlzJywgJ1BPU1QnLCB7XG4gICAgdmFsdWU6IHByZXBhcmVJbnB1dFZhbHVlKHZhbHVlKSxcbiAgfSk7XG59O1xuXG5jb21tYW5kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChlbCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgY29uc3QgYXRvbXNFbGVtZW50ID0gdGhpcy51c2VBdG9tc0VsZW1lbnQoZWwpO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsZWFyJywgW2F0b21zRWxlbWVudF0pO1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL2VsZW1lbnQvJHtlbH0vY2xlYXJgLCAnUE9TVCcpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGVudFNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZW50U2l6ZSAoZWwpIHtcbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdFlldEltcGxlbWVudGVkRXJyb3IoJ1N1cHBvcnQgZm9yIGdldENvbnRlbnRTaXplIGZvciB3ZWIgY29udGV4dCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBQbGVhc2UgY29udGFjdCBhbiBBcHBpdW0gZGV2Jyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnLCBlbCk7XG5cbiAgaWYgKHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVUYWJsZScgJiZcbiAgICAgIHR5cGUgIT09ICdYQ1VJRWxlbWVudFR5cGVDb2xsZWN0aW9uVmlldycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGdldCBjb250ZW50IHNpemUgZm9yIHR5cGUgJyR7dHlwZX0nLCBvbmx5IGZvciBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRhYmxlcyBhbmQgY29sbGVjdGlvbiB2aWV3c2ApO1xuICB9XG4gIGxldCBsb2NhdG9yID0gJyonO1xuICBpZiAodHlwZSA9PT0gJ1hDVUlFbGVtZW50VHlwZVRhYmxlJykge1xuICAgIC8vIG9ubHkgZmluZCB0YWJsZSBjZWxscywgbm90IGp1c3QgYW55IGNoaWxkcmVuXG4gICAgbG9jYXRvciA9ICdYQ1VJRWxlbWVudFR5cGVDZWxsJztcbiAgfVxuXG4gIGxldCBjb250ZW50SGVpZ2h0ID0gMDtcbiAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKGBjbGFzcyBjaGFpbmAsIGxvY2F0b3IsIHRydWUsIGVsKTtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIGlmIHdlIGtub3cgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50LCB3ZSBjYW4gb3B0aW1pemUgdG8gbWFrZSBqdXN0IG9uZVxuICAgIC8vIGNhbGwgdG8gV0RBXG4gICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoXy5oZWFkKGNoaWxkcmVuKSk7XG4gICAgY29udGVudEhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIC8vIG90aGVyd2lzZSBpZiB3ZSBoYXZlIG11bHRpcGxlIGVsZW1lbnRzLCBsb2dpYyBkaWZmZXJzIGJhc2VkIG9uIGVsZW1lbnRcbiAgICAvLyB0eXBlXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdYQ1VJRWxlbWVudFR5cGVUYWJsZSc6IHtcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KF8ubGFzdChjaGlsZHJlbikpO1xuICAgICAgICBjb250ZW50SGVpZ2h0ID0gbGFzdFJlY3QueSArIGxhc3RSZWN0LmhlaWdodCAtIGZpcnN0UmVjdC55O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1hDVUlFbGVtZW50VHlwZUNvbGxlY3Rpb25WaWV3Jzoge1xuICAgICAgICBsZXQgZWxzSW5Sb3cgPSAxOyAvLyB3ZSBrbm93IHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIHJvd1xuICAgICAgICBsZXQgZmlyc3RSZWN0ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50UmVjdChfLmhlYWQoY2hpbGRyZW4pKTtcbiAgICAgICAgbGV0IGluaXRpYWxSZWN0cyA9IFtmaXJzdFJlY3RdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoY2hpbGRyZW5baV0pO1xuICAgICAgICAgIGluaXRpYWxSZWN0cy5wdXNoKHJlY3QpO1xuICAgICAgICAgIGlmIChyZWN0LnkgIT09IGZpcnN0UmVjdC55KSB7XG4gICAgICAgICAgICBlbHNJblJvdyA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BhY2VCZXR3ZWVuRWxzID0gaW5pdGlhbFJlY3RzW2Vsc0luUm93XS55IC0gaW5pdGlhbFJlY3RzW2Vsc0luUm93IC0gMV0ueSAtIGluaXRpYWxSZWN0c1tlbHNJblJvdyAtIDFdLmhlaWdodDtcbiAgICAgICAgY29uc3QgbnVtUm93cyA9IE1hdGguY2VpbChjaGlsZHJlbi5sZW5ndGggLyBlbHNJblJvdyk7XG5cbiAgICAgICAgLy8gYXNzdW1lIGFsbCBjZWxscyBhcmUgdGhlIHNhbWUgaGVpZ2h0XG4gICAgICAgIGNvbnRlbnRIZWlnaHQgPSAobnVtUm93cyAqIGZpcnN0UmVjdC5oZWlnaHQpICsgKHNwYWNlQmV0d2VlbkVscyAqIChudW1Sb3dzIC0gMSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgUHJvZ3JhbW1pbmcgZXJyb3I6IHR5cGUgJyR7dHlwZX0nIHdhcyBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHZhbGlkIGJ1dCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVqZWN0ZWRgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IGF3YWl0IHRoaXMuZ2V0U2l6ZShlbCk7XG4gIGNvbnN0IG9yaWdpbiA9IGF3YWl0IHRoaXMuZ2V0TG9jYXRpb25JblZpZXcoZWwpO1xuICAvLyBhdHRyaWJ1dGVzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gc3RyaW5naWZ5IHRoaXMgdXBcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICB3aWR0aDogc2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHNpemUuaGVpZ2h0LFxuICAgIHRvcDogb3JpZ2luLnksXG4gICAgbGVmdDogb3JpZ2luLngsXG4gICAgc2Nyb2xsYWJsZU9mZnNldDogY29udGVudEhlaWdodFxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlS2V5Ym9hcmQnLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcyk7XG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2VsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -25,6 +25,19 @@ exports.commands = commands;
|
|
|
25
25
|
exports.extensions = extensions;
|
|
26
26
|
exports.helpers = helpers;
|
|
27
27
|
|
|
28
|
+
function toElementId(opts = {}) {
|
|
29
|
+
if (opts.element) {
|
|
30
|
+
_logger.default.info(`The 'element' argument name is deprecated. Consider using 'elementId' instead`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const el = opts.elementId || opts.element;
|
|
34
|
+
return el ? _appiumSupport.util.unwrapElement(el) : null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function toElementOrApplicationId(driver, opts = {}) {
|
|
38
|
+
return toElementId(opts) || _appiumSupport.util.unwrapElement(await driver.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false));
|
|
39
|
+
}
|
|
40
|
+
|
|
28
41
|
commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
|
|
29
42
|
el = _appiumSupport.util.unwrapElement(el);
|
|
30
43
|
|
|
@@ -45,7 +58,7 @@ commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
|
|
|
45
58
|
};
|
|
46
59
|
await this.executeAtom('move_mouse', [atomsElement, relCoords]);
|
|
47
60
|
} else {
|
|
48
|
-
if (_lodash.default.
|
|
61
|
+
if (_lodash.default.isNil(el)) {
|
|
49
62
|
if (!this.curCoords) {
|
|
50
63
|
throw new _appiumBaseDriver.errors.UnknownException('Current cursor position unknown, please use moveTo with an element the first time.');
|
|
51
64
|
}
|
|
@@ -66,13 +79,13 @@ commands.moveTo = async function moveTo(el, xoffset = 0, yoffset = 0) {
|
|
|
66
79
|
|
|
67
80
|
function requireFloatParameter(paramName, paramValue, methodName) {
|
|
68
81
|
if (_lodash.default.isUndefined(paramValue)) {
|
|
69
|
-
|
|
82
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
|
|
70
83
|
}
|
|
71
84
|
|
|
72
85
|
const result = parseFloat(paramValue);
|
|
73
86
|
|
|
74
87
|
if (isNaN(result)) {
|
|
75
|
-
|
|
88
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
return result;
|
|
@@ -80,13 +93,13 @@ function requireFloatParameter(paramName, paramValue, methodName) {
|
|
|
80
93
|
|
|
81
94
|
function requireIntParameter(paramName, paramValue, methodName) {
|
|
82
95
|
if (_lodash.default.isUndefined(paramValue)) {
|
|
83
|
-
|
|
96
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
|
|
84
97
|
}
|
|
85
98
|
|
|
86
99
|
const result = parseInt(paramValue, 10);
|
|
87
100
|
|
|
88
101
|
if (isNaN(result)) {
|
|
89
|
-
|
|
102
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
|
|
90
103
|
}
|
|
91
104
|
|
|
92
105
|
return result;
|
|
@@ -194,11 +207,7 @@ commands.nativeClick = async function nativeClick(el) {
|
|
|
194
207
|
};
|
|
195
208
|
|
|
196
209
|
helpers.mobileScroll = async function mobileScroll(opts = {}, swipe = false) {
|
|
197
|
-
|
|
198
|
-
opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
let params = {};
|
|
210
|
+
const params = {};
|
|
202
211
|
|
|
203
212
|
if (opts.name && !swipe) {
|
|
204
213
|
params.name = opts.name;
|
|
@@ -215,18 +224,16 @@ helpers.mobileScroll = async function mobileScroll(opts = {}, swipe = false) {
|
|
|
215
224
|
} else if (opts.toVisible && !swipe) {
|
|
216
225
|
params.toVisible = opts.toVisible;
|
|
217
226
|
} else {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
_logger.default.errorAndThrow(msg);
|
|
227
|
+
const msg = swipe ? 'Mobile swipe requires direction' : 'Mobile scroll supports the following strategies: name, direction, predicateString, and toVisible. Specify one of these';
|
|
228
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(msg);
|
|
221
229
|
}
|
|
222
230
|
|
|
223
231
|
if (!swipe && opts.distance) {
|
|
224
232
|
params.distance = opts.distance;
|
|
225
233
|
}
|
|
226
234
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
let endpoint = `/wda/element/${element}/${swipe ? 'swipe' : 'scroll'}`;
|
|
235
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
236
|
+
const endpoint = `/wda/element/${elementId}/${swipe ? 'swipe' : 'scroll'}`;
|
|
230
237
|
return await this.proxyCommand(endpoint, 'POST', params);
|
|
231
238
|
};
|
|
232
239
|
|
|
@@ -235,25 +242,19 @@ helpers.mobileSwipe = async function mobileSwipe(opts = {}) {
|
|
|
235
242
|
};
|
|
236
243
|
|
|
237
244
|
helpers.mobilePinch = async function mobilePinch(opts = {}) {
|
|
238
|
-
if (!opts.element) {
|
|
239
|
-
opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
245
|
const params = {
|
|
243
246
|
scale: requireFloatParameter('scale', opts.scale, 'pinch'),
|
|
244
247
|
velocity: requireFloatParameter('velocity', opts.velocity, 'pinch')
|
|
245
248
|
};
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
return await this.proxyCommand(`/wda/element/${el}/pinch`, 'POST', params);
|
|
249
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
250
|
+
return await this.proxyCommand(`/wda/element/${elementId}/pinch`, 'POST', params);
|
|
250
251
|
};
|
|
251
252
|
|
|
252
253
|
helpers.mobileDoubleTap = async function mobileDoubleTap(opts = {}) {
|
|
253
|
-
|
|
254
|
-
const el = _appiumSupport.util.unwrapElement(opts.element);
|
|
254
|
+
const elementId = toElementId(opts);
|
|
255
255
|
|
|
256
|
-
|
|
256
|
+
if (elementId) {
|
|
257
|
+
return await this.proxyCommand(`/wda/element/${elementId}/doubleTap`, 'POST');
|
|
257
258
|
}
|
|
258
259
|
|
|
259
260
|
const params = {
|
|
@@ -264,24 +265,18 @@ helpers.mobileDoubleTap = async function mobileDoubleTap(opts = {}) {
|
|
|
264
265
|
};
|
|
265
266
|
|
|
266
267
|
helpers.mobileTwoFingerTap = async function mobileTwoFingerTap(opts = {}) {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const el = _appiumSupport.util.unwrapElement(opts.element);
|
|
272
|
-
|
|
273
|
-
return await this.proxyCommand(`/wda/element/${el}/twoFingerTap`, 'POST');
|
|
268
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
269
|
+
return await this.proxyCommand(`/wda/element/${elementId}/twoFingerTap`, 'POST');
|
|
274
270
|
};
|
|
275
271
|
|
|
276
272
|
helpers.mobileTouchAndHold = async function mobileTouchAndHold(opts = {}) {
|
|
277
|
-
|
|
273
|
+
const params = {
|
|
278
274
|
duration: requireFloatParameter('duration', opts.duration, 'touchAndHold')
|
|
279
275
|
};
|
|
276
|
+
const elementId = toElementId(opts);
|
|
280
277
|
|
|
281
|
-
if (
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
return await this.proxyCommand(`/wda/element/${el}/touchAndHold`, 'POST', params);
|
|
278
|
+
if (elementId) {
|
|
279
|
+
return await this.proxyCommand(`/wda/element/${elementId}/touchAndHold`, 'POST', params);
|
|
285
280
|
}
|
|
286
281
|
|
|
287
282
|
params.x = requireFloatParameter('x', opts.x, 'touchAndHold');
|
|
@@ -294,8 +289,8 @@ helpers.mobileTap = async function mobileTap(opts = {}) {
|
|
|
294
289
|
x: requireFloatParameter('x', opts.x, 'tap'),
|
|
295
290
|
y: requireFloatParameter('y', opts.y, 'tap')
|
|
296
291
|
};
|
|
297
|
-
const
|
|
298
|
-
return await this.proxyCommand(`/wda/tap/${
|
|
292
|
+
const elementId = toElementId(opts) || '0';
|
|
293
|
+
return await this.proxyCommand(`/wda/tap/${elementId}`, 'POST', params);
|
|
299
294
|
};
|
|
300
295
|
|
|
301
296
|
helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration(opts = {}) {
|
|
@@ -306,42 +301,35 @@ helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration
|
|
|
306
301
|
toX: requireFloatParameter('toX', opts.toX, 'dragFromToForDuration'),
|
|
307
302
|
toY: requireFloatParameter('toY', opts.toY, 'dragFromToForDuration')
|
|
308
303
|
};
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
const el = _appiumSupport.util.unwrapElement(opts.element);
|
|
312
|
-
|
|
313
|
-
return await this.proxyCommand(`/wda/element/${el}/dragfromtoforduration`, 'POST', params);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
return await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
|
|
304
|
+
const elementId = toElementId(opts);
|
|
305
|
+
return elementId ? await this.proxyCommand(`/wda/element/${elementId}/dragfromtoforduration`, 'POST', params) : await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
|
|
317
306
|
};
|
|
318
307
|
|
|
319
308
|
helpers.mobileTapWithNumberOfTaps = async function mobileTapWithNumberOfTaps(opts = {}) {
|
|
320
|
-
|
|
321
|
-
|
|
309
|
+
const elementId = toElementId(opts);
|
|
310
|
+
|
|
311
|
+
if (!elementId) {
|
|
312
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for tapWithNumberOfTaps method');
|
|
322
313
|
}
|
|
323
314
|
|
|
324
315
|
const params = {
|
|
325
316
|
numberOfTaps: requireIntParameter('numberOfTaps', opts.numberOfTaps, 'tapWithNumberOfTaps'),
|
|
326
317
|
numberOfTouches: requireIntParameter('numberOfTouches', opts.numberOfTouches, 'tapWithNumberOfTaps')
|
|
327
318
|
};
|
|
328
|
-
|
|
329
|
-
const el = _appiumSupport.util.unwrapElement(opts.element);
|
|
330
|
-
|
|
331
|
-
return await this.proxyCommand(`/wda/element/${el}/tapWithNumberOfTaps`, 'POST', params);
|
|
319
|
+
return await this.proxyCommand(`/wda/element/${elementId}/tapWithNumberOfTaps`, 'POST', params);
|
|
332
320
|
};
|
|
333
321
|
|
|
334
322
|
helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelValue(opts = {}) {
|
|
335
|
-
|
|
336
|
-
|
|
323
|
+
const elementId = toElementId(opts);
|
|
324
|
+
|
|
325
|
+
if (!elementId) {
|
|
326
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for selectPickerWheelValue method');
|
|
337
327
|
}
|
|
338
328
|
|
|
339
329
|
if (!_lodash.default.isString(opts.order) || !['next', 'previous'].includes(opts.order.toLowerCase())) {
|
|
340
|
-
|
|
330
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` + `'${opts.order}' is given instead`);
|
|
341
331
|
}
|
|
342
332
|
|
|
343
|
-
const el = _appiumSupport.util.unwrapElement(opts.element);
|
|
344
|
-
|
|
345
333
|
const params = {
|
|
346
334
|
order: opts.order
|
|
347
335
|
};
|
|
@@ -350,25 +338,24 @@ helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelVal
|
|
|
350
338
|
params.offset = requireFloatParameter('offset', opts.offset, 'selectPickerWheelValue');
|
|
351
339
|
}
|
|
352
340
|
|
|
353
|
-
return await this.proxyCommand(`/wda/pickerwheel/${
|
|
341
|
+
return await this.proxyCommand(`/wda/pickerwheel/${elementId}/select`, 'POST', params);
|
|
354
342
|
};
|
|
355
343
|
|
|
356
344
|
helpers.mobileRotateElement = async function mobileRotateElement(opts = {}) {
|
|
357
|
-
|
|
358
|
-
_logger.default.errorAndThrow('Element id is expected to be set for rotateElement method');
|
|
359
|
-
}
|
|
345
|
+
const elementId = toElementId(opts);
|
|
360
346
|
|
|
361
|
-
|
|
347
|
+
if (!elementId) {
|
|
348
|
+
throw new _appiumBaseDriver.errors.InvalidArgumentError('Element id is expected to be set for rotateElement method');
|
|
349
|
+
}
|
|
362
350
|
|
|
363
351
|
const params = {
|
|
364
352
|
rotation: requireFloatParameter('rotation', opts.rotation, 'rotateElement'),
|
|
365
353
|
velocity: requireFloatParameter('velocity', opts.velocity, 'rotateElement')
|
|
366
354
|
};
|
|
367
|
-
return await this.proxyCommand(`/wda/element/${
|
|
355
|
+
return await this.proxyCommand(`/wda/element/${elementId}/rotate`, 'POST', params);
|
|
368
356
|
};
|
|
369
357
|
|
|
370
358
|
helpers.getCoordinates = async function getCoordinates(gesture) {
|
|
371
|
-
let el = gesture.options.element;
|
|
372
359
|
let coordinates = {
|
|
373
360
|
x: 0,
|
|
374
361
|
y: 0,
|
|
@@ -386,8 +373,10 @@ helpers.getCoordinates = async function getCoordinates(gesture) {
|
|
|
386
373
|
optionY = requireFloatParameter('y', gesture.options.y, 'getCoordinates');
|
|
387
374
|
}
|
|
388
375
|
|
|
389
|
-
|
|
390
|
-
|
|
376
|
+
const elementId = toElementId(gesture.options);
|
|
377
|
+
|
|
378
|
+
if (elementId) {
|
|
379
|
+
let rect = await this.getElementRect(elementId);
|
|
391
380
|
let pos = {
|
|
392
381
|
x: rect.x,
|
|
393
382
|
y: rect.y
|
|
@@ -434,4 +423,4 @@ var _default = extensions;
|
|
|
434
423
|
exports.default = _default;require('source-map-support').install();
|
|
435
424
|
|
|
436
425
|
|
|
437
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIl0sIm5hbWVzIjpbImhlbHBlcnMiLCJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJtb3ZlVG8iLCJlbCIsInhvZmZzZXQiLCJ5b2Zmc2V0IiwidXRpbCIsInVud3JhcEVsZW1lbnQiLCJpc1dlYkNvbnRleHQiLCJ4IiwieSIsImdldExvY2F0aW9uIiwiY29vcmRzIiwiY3VyV2ViQ29vcmRzIiwiYXRvbXNFbGVtZW50IiwidXNlQXRvbXNFbGVtZW50IiwicmVsQ29vcmRzIiwiZXhlY3V0ZUF0b20iLCJfIiwiaXNOdWxsIiwiaXNVbmRlZmluZWQiLCJjdXJDb29yZHMiLCJlcnJvcnMiLCJVbmtub3duRXhjZXB0aW9uIiwiZWxQb3MiLCJyZXF1aXJlRmxvYXRQYXJhbWV0ZXIiLCJwYXJhbU5hbWUiLCJwYXJhbVZhbHVlIiwibWV0aG9kTmFtZSIsImxvZyIsImVycm9yQW5kVGhyb3ciLCJyZXN1bHQiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJyZXF1aXJlSW50UGFyYW1ldGVyIiwicGFyc2VJbnQiLCJtb2JpbGVTaGFrZSIsImlzU2ltdWxhdG9yIiwiVW5rbm93bkVycm9yIiwib3B0cyIsImRldmljZSIsInNoYWtlIiwiY2xpY2siLCJuYXRpdmVDbGljayIsInNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJuYXRpdmVXZWJUYXAiLCJuYXRpdmVXZWJUYXBTdHJpY3QiLCJkZWJ1ZyIsImdlc3R1cmVzQ2hhaW5Ub1N0cmluZyIsImdlc3R1cmVzIiwia2V5c1RvSW5jbHVkZSIsIm1hcCIsIml0ZW0iLCJvdGhlcktleXMiLCJkaWZmZXJlbmNlIiwia2V5cyIsImlzQXJyYXkiLCJpbnRlcnNlY3Rpb24iLCJsZW5ndGgiLCJhY3Rpb24iLCJpc1BsYWluT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsImpvaW4iLCJwZXJmb3JtQWN0aW9ucyIsImFjdGlvbnMiLCJwcmVwcm9jZXNzZWRBY3Rpb25zIiwiT2JqZWN0IiwiYXNzaWduIiwidHlwZSIsInBhcmFtZXRlcnMiLCJwb2ludGVyVHlwZSIsIm1vZGlmaWVkQWN0aW9uIiwiY2xvbmUiLCJmaWx0ZXIiLCJpbm5lckFjdGlvbiIsImR1cmF0aW9uIiwicHJveHlDb21tYW5kIiwicGVyZm9ybVRvdWNoIiwiZSIsIm1lc3NhZ2UiLCJwZXJmb3JtTXVsdGlBY3Rpb24iLCJpIiwiZW5kcG9pbnQiLCJtb2JpbGVTY3JvbGwiLCJzd2lwZSIsImVsZW1lbnQiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJwYXJhbXMiLCJuYW1lIiwiZGlyZWN0aW9uIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsIm1zZyIsInByZWRpY2F0ZVN0cmluZyIsInRvVmlzaWJsZSIsImRpc3RhbmNlIiwibW9iaWxlU3dpcGUiLCJtb2JpbGVQaW5jaCIsInNjYWxlIiwidmVsb2NpdHkiLCJtb2JpbGVEb3VibGVUYXAiLCJtb2JpbGVUd29GaW5nZXJUYXAiLCJtb2JpbGVUb3VjaEFuZEhvbGQiLCJtb2JpbGVUYXAiLCJtb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24iLCJmcm9tWCIsImZyb21ZIiwidG9YIiwidG9ZIiwibW9iaWxlVGFwV2l0aE51bWJlck9mVGFwcyIsIm51bWJlck9mVGFwcyIsIm51bWJlck9mVG91Y2hlcyIsIm1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUiLCJpc1N0cmluZyIsIm9yZGVyIiwib2Zmc2V0IiwibW9iaWxlUm90YXRlRWxlbWVudCIsInJvdGF0aW9uIiwiZ2V0Q29vcmRpbmF0ZXMiLCJnZXN0dXJlIiwib3B0aW9ucyIsImNvb3JkaW5hdGVzIiwiYXJlT2Zmc2V0cyIsIm9wdGlvblgiLCJvcHRpb25ZIiwicmVjdCIsImdldEVsZW1lbnRSZWN0IiwicG9zIiwic2l6ZSIsInciLCJ3aWR0aCIsImgiLCJoZWlnaHQiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImFwcGx5TW92ZVRvT2Zmc2V0IiwiZmlyc3RDb29yZGluYXRlcyIsInNlY29uZENvb3JkaW5hdGVzIl0sIm1hcHBpbmdz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QTBCSCxPQUFPLENBQUM3RCxNQUFSLEtBQW1CLFFBQTdDO0FBQ0ErRCxJQUFBQSxXQUFXLENBQUNsSCxDQUFaLEdBQWlCb0gsT0FBTyxJQUFJLENBQTVCO0FBQ0FGLElBQUFBLFdBQVcsQ0FBQ2pILENBQVosR0FBaUJvSCxPQUFPLElBQUksQ0FBNUI7QUFDRDs7QUFDRCxTQUFPSCxXQUFQO0FBQ0QsQ0E1Q0Q7O0FBOENBNUgsT0FBTyxDQUFDMEksaUJBQVIsR0FBNEIsU0FBU0EsaUJBQVQsQ0FBNEJDLGdCQUE1QixFQUE4Q0MsaUJBQTlDLEVBQWlFO0FBQzNGLE1BQUlBLGlCQUFpQixDQUFDZixVQUF0QixFQUFrQztBQUNoQyxXQUFPO0FBQ0xuSCxNQUFBQSxDQUFDLEVBQUVpSSxnQkFBZ0IsQ0FBQ2pJLENBQWpCLEdBQXFCa0ksaUJBQWlCLENBQUNsSSxDQURyQztBQUVMQyxNQUFBQSxDQUFDLEVBQUVnSSxnQkFBZ0IsQ0FBQ2hJLENBQWpCLEdBQXFCaUksaUJBQWlCLENBQUNqSTtBQUZyQyxLQUFQO0FBSUQsR0FMRCxNQUtPO0FBQ0wsV0FBT2lJLGlCQUFQO0FBQ0Q7QUFDRixDQVREOztBQVdBdkUsTUFBTSxDQUFDQyxNQUFQLENBQWNyRSxVQUFkLEVBQTBCRCxPQUExQixFQUFtQ0UsUUFBbkM7ZUFFZUQsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcblxuXG5jb25zdCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fSwgY29tbWFuZHMgPSB7fTtcblxuY29tbWFuZHMubW92ZVRvID0gYXN5bmMgZnVuY3Rpb24gbW92ZVRvIChlbCwgeG9mZnNldCA9IDAsIHlvZmZzZXQgPSAwKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcblxuICBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGxldCB7eCwgeX0gPSBhd2FpdCB0aGlzLmdldExvY2F0aW9uKGVsKTtcbiAgICBsZXQgY29vcmRzID0ge1xuICAgICAgeDogeCArIHhvZmZzZXQsXG4gICAgICB5OiB5ICsgeW9mZnNldFxuICAgIH07XG4gICAgdGhpcy5jdXJXZWJDb29yZHMgPSBjb29yZHM7XG4gICAgbGV0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICBsZXQgcmVsQ29vcmRzID0ge3g6IHhvZmZzZXQsIHk6IHlvZmZzZXR9O1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ21vdmVfbW91c2UnLCBbYXRvbXNFbGVtZW50LCByZWxDb29yZHNdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXy5pc051bGwoZWwpIHx8IF8uaXNVbmRlZmluZWQoZWwpKSB7XG4gICAgICBpZiAoIXRoaXMuY3VyQ29vcmRzKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkV4Y2VwdGlvbihcbiAgICAgICAgICAnQ3VycmVudCBjdXJzb3IgcG9zaXRpb24gdW5rbm93biwgcGxlYXNlIHVzZSBtb3ZlVG8gd2l0aCBhbiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJDb29yZHMgPSB7XG4gICAgICAgIHg6IHRoaXMuY3VyQ29vcmRzLnggKyB4b2Zmc2V0LFxuICAgICAgICB5OiB0aGlzLmN1ckNvb3Jkcy55ICsgeW9mZnNldFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsUG9zID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgICB0aGlzLmN1ckNvb3JkcyA9IHtcbiAgICAgICAgeDogZWxQb3MueCArIHhvZmZzZXQsXG4gICAgICAgIHk6IGVsUG9zLnkgKyB5b2Zmc2V0XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gcmVxdWlyZUZsb2F0UGFyYW1ldGVyIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1WYWx1ZSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGZvciBcIiR7bWV0aG9kTmFtZX1cIiBjYWxsYCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VGbG9hdChwYXJhbVZhbHVlKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgdmFsaWQgbnVtYmVyLiBcIiR7cGFyYW1WYWx1ZX1cIiBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZUludFBhcmFtZXRlciAocGFyYW1OYW1lLCBwYXJhbVZhbHVlLCBtZXRob2ROYW1lKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgXCIke21ldGhvZE5hbWV9XCIgY2FsbGApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHBhcmFtVmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCIke3BhcmFtTmFtZX1cIiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgdmFsaWQgaW50ZWdlci4gXCIke3BhcmFtVmFsdWV9XCIgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLm1vYmlsZVNoYWtlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2hha2UgKCkge1xuICBpZiAoIXRoaXMuaXNTaW11bGF0b3IoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKCdTaGFrZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHJlYWwgZGV2aWNlcycpO1xuICB9XG4gIGF3YWl0IHRoaXMub3B0cy5kZXZpY2Uuc2hha2UoKTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gY2xpY2sgKGVsKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSBjb21tYW5kcyB0aGF0IG1hcCBoZXJlLCBzbyBtYW51YWxseSBwcm94eVxuICAgIHJldHVybiBhd2FpdCB0aGlzLm5hdGl2ZUNsaWNrKGVsKTtcbiAgfVxuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG4gIGlmICgoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXAgfHwgKGF3YWl0IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKSkubmF0aXZlV2ViVGFwU3RyaWN0KSB7XG4gICAgLy8gYXRvbXMtYmFzZWQgY2xpY2tzIGRvbid0IGFsd2F5cyB3b3JrIGluIHNhZmFyaSA3XG4gICAgbG9nLmRlYnVnKCdVc2luZyBuYXRpdmUgd2ViIHRhcCcpO1xuICAgIGF3YWl0IHRoaXMubmF0aXZlV2ViVGFwKGVsKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2NsaWNrJywgW2F0b21zRWxlbWVudF0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXN0dXJlc0NoYWluVG9TdHJpbmcgKGdlc3R1cmVzLCBrZXlzVG9JbmNsdWRlID0gWydvcHRpb25zJ10pIHtcbiAgcmV0dXJuIGdlc3R1cmVzLm1hcCgoaXRlbSkgPT4ge1xuICAgIGxldCBvdGhlcktleXMgPSBfLmRpZmZlcmVuY2UoXy5rZXlzKGl0ZW0pLCBbJ2FjdGlvbiddKTtcbiAgICBvdGhlcktleXMgPSBfLmlzQXJyYXkoa2V5c1RvSW5jbHVkZSkgPyBfLmludGVyc2VjdGlvbihvdGhlcktleXMsIGtleXNUb0luY2x1ZGUpIDogb3RoZXJLZXlzO1xuICAgIGlmIChvdGhlcktleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYCR7aXRlbS5hY3Rpb259YCArXG4gICAgICAgIGAoJHtfLm1hcChvdGhlcktleXMsICh4KSA9PiB4ICsgJz0nICsgKF8uaXNQbGFpbk9iamVjdChpdGVtW3hdKSA/IEpTT04uc3RyaW5naWZ5KGl0ZW1beF0pIDogaXRlbVt4XSkpLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIHJldHVybiBpdGVtLmFjdGlvbjtcbiAgfSkuam9pbignLScpO1xufVxuXG5jb21tYW5kcy5wZXJmb3JtQWN0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1BY3Rpb25zIChhY3Rpb25zKSB7XG4gIGxvZy5kZWJ1ZyhgUmVjZWl2ZWQgdGhlIGZvbGxvd2luZyBXM0MgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShhY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgLy8gVGhpcyBpcyBtYW5kYXRvcnksIHNpbmNlIFdEQSBvbmx5IHN1cHBvcnRzIFRPVUNIIHBvaW50ZXIgdHlwZVxuICAvLyBhbmQgU2VsZW5pdW0gQVBJIHVzZXMgTU9VU0UgYXMgdGhlIGRlZmF1bHQgb25lXG4gIGNvbnN0IHByZXByb2Nlc3NlZEFjdGlvbnMgPSBhY3Rpb25zXG4gICAgLm1hcCgoYWN0aW9uKSA9PiBPYmplY3QuYXNzaWduKHt9LCBhY3Rpb24sIGFjdGlvbi50eXBlID09PSAncG9pbnRlcicgPyB7XG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHBvaW50ZXJUeXBlOiAndG91Y2gnXG4gICAgICB9XG4gICAgfSA6IHt9KSlcbiAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IG1vZGlmaWVkQWN0aW9uID0gXy5jbG9uZShhY3Rpb24pIHx8IHt9O1xuICAgICAgLy8gU2VsZW5pdW0gQVBJIHVuZXhwZWN0ZWRseSBpbnNlcnRzIHplcm8gcGF1c2VzLCB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSBXREFcbiAgICAgIG1vZGlmaWVkQWN0aW9uLmFjdGlvbnMgPSAoYWN0aW9uLmFjdGlvbnMgfHwgW10pXG4gICAgICAgIC5maWx0ZXIoKGlubmVyQWN0aW9uKSA9PiAhKGlubmVyQWN0aW9uLnR5cGUgPT09ICdwYXVzZScgJiYgaW5uZXJBY3Rpb24uZHVyYXRpb24gPT09IDApKTtcbiAgICAgIHJldHVybiBtb2RpZmllZEFjdGlvbjtcbiAgICB9KTtcbiAgbG9nLmRlYnVnKGBQcmVwcm9jZXNzZWQgYWN0aW9uczogJHtKU09OLnN0cmluZ2lmeShwcmVwcm9jZXNzZWRBY3Rpb25zLCBudWxsLCAnICAnKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvYWN0aW9ucycsICdQT1NUJywge2FjdGlvbnM6IHByZXByb2Nlc3NlZEFjdGlvbnN9KTtcbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1Ub3VjaCA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1Ub3VjaCAoZ2VzdHVyZXMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIHRvdWNoIGFjdGlvbjogJHtnZXN0dXJlc0NoYWluVG9TdHJpbmcoZ2VzdHVyZXMpfWApO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS90b3VjaC9wZXJmb3JtJywgJ1BPU1QnLCB7YWN0aW9uczogZ2VzdHVyZXN9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBUb3VjaCBBUEkgaXMgYWltZWQgZm9yIHVzYWdlIGluIE5BVElWRSBjb250ZXh0LiAnICtcbiAgICAgICdDb25zaWRlciB1c2luZyBcImV4ZWN1dGVcIiBBUEkgd2l0aCBjdXN0b20gZXZlbnRzIHRyaWdnZXIgc2NyaXB0ICcgK1xuICAgICAgYHRvIGVtdWxhdGUgdG91Y2ggZXZlbnRzIGJlaW5nIGluIFdFQlZJRVcgY29udGV4dC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5jb21tYW5kcy5wZXJmb3JtTXVsdGlBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtTXVsdGlBY3Rpb24gKGFjdGlvbnMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIG11bHRpIHRvdWNoIGFjdGlvbjpgKTtcbiAgZm9yIChsZXQgaSBpbiBhY3Rpb25zKSB7XG4gICAgbG9nLmRlYnVnKGAgICAgJHtwYXJzZUludChpLCAxMCkgKyAxfTogJHtfLm1hcChhY3Rpb25zW2ldLCAnYWN0aW9uJykuam9pbignLScpfWApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoL211bHRpL3BlcmZvcm0nLCAnUE9TVCcsIHthY3Rpb25zfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgTXVsdGlUb3VjaCBBUEkgaXMgYWltZWQgZm9yIHVzYWdlIGluIE5BVElWRSBjb250ZXh0LiAnICtcbiAgICAgICdDb25zaWRlciB1c2luZyBcImV4ZWN1dGVcIiBBUEkgd2l0aCBjdXN0b20gZXZlbnRzIHRyaWdnZXIgc2NyaXB0ICcgK1xuICAgICAgYHRvIGVtdWxhdGUgbXVsdGl0b3VjaCBldmVudHMgYmVpbmcgaW4gV0VCVklFVyBjb250ZXh0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLm5hdGl2ZUNsaWNrID0gYXN5bmMgZnVuY3Rpb24gbmF0aXZlQ2xpY2sgKGVsKSB7XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgbGV0IGVuZHBvaW50ID0gYC9lbGVtZW50LyR7ZWx9L2NsaWNrYDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHt9KTtcbn07XG5cbi8qXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL1dlYkRyaXZlckFnZW50L2Jsb2IvbWFzdGVyL1dlYkRyaXZlckFnZW50TGliL0NvbW1hbmRzL0ZCRWxlbWVudENvbW1hbmRzLm1cbiAqIHRvIGdldCB0aGUgaW5mbyBhYm91dCBhdmFpbGFibGUgV0RBIGdlc3R1cmVzIEFQSVxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vcmVmZXJlbmNlL3hjdGVzdC94Y3VpZWxlbWVudCBhbmRcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9yZWZlcmVuY2UveGN0ZXN0L3hjdWljb29yZGluYXRlIHRvIGdldCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2ZcbiAqIGFsbCBYQ1Rlc3QgZ2VzdHVyZXNcbiovXG5cbmhlbHBlcnMubW9iaWxlU2Nyb2xsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2Nyb2xsIChvcHRzID0ge30sIHN3aXBlID0gZmFsc2UpIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBvcHRzLmVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKTtcbiAgfVxuICAvLyBXREEgc3VwcG9ydHMgZm91ciBzY3JvbGxpbmcgc3RyYXRlZ2llczogcHJlZGljYXRpb24gYmFzZWQgb24gbmFtZSwgZGlyZWN0aW9uLFxuICAvLyBwcmVkaWNhdGVTdHJpbmcsIGFuZCB0b1Zpc2libGUsIGluIHRoYXQgb3JkZXIuIFN3aXBpbmcgcmVxdWlyZXMgZGlyZWN0aW9uLlxuICBsZXQgcGFyYW1zID0ge307XG4gIGlmIChvcHRzLm5hbWUgJiYgIXN3aXBlKSB7XG4gICAgcGFyYW1zLm5hbWUgPSBvcHRzLm5hbWU7XG4gIH0gZWxzZSBpZiAob3B0cy5kaXJlY3Rpb24pIHtcbiAgICBpZiAoIVsndXAnLCAnZG93bicsICdsZWZ0JywgJ3JpZ2h0J10uaW5jbHVkZXMob3B0cy5kaXJlY3Rpb24udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIGxldCBtc2cgPSAnRGlyZWN0aW9uIG11c3QgYmUgdXAsIGRvd24sIGxlZnQgb3IgcmlnaHQnO1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgICB9XG4gICAgcGFyYW1zLmRpcmVjdGlvbiA9IG9wdHMuZGlyZWN0aW9uO1xuICB9IGVsc2UgaWYgKG9wdHMucHJlZGljYXRlU3RyaW5nICYmICFzd2lwZSkge1xuICAgIHBhcmFtcy5wcmVkaWNhdGVTdHJpbmcgPSBvcHRzLnByZWRpY2F0ZVN0cmluZztcbiAgfSBlbHNlIGlmIChvcHRzLnRvVmlzaWJsZSAmJiAhc3dpcGUpIHtcbiAgICBwYXJhbXMudG9WaXNpYmxlID0gb3B0cy50b1Zpc2libGU7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG1zZyA9IHN3aXBlXG4gICAgICA/ICdNb2JpbGUgc3dpcGUgcmVxdWlyZXMgZGlyZWN0aW9uJ1xuICAgICAgOiAnTW9iaWxlIHNjcm9sbCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHN0cmF0ZWdpZXM6IG5hbWUsIGRpcmVjdGlvbiwgcHJlZGljYXRlU3RyaW5nLCBhbmQgdG9WaXNpYmxlLiBTcGVjaWZ5IG9uZSBvZiB0aGVzZSc7XG4gICAgbG9nLmVycm9yQW5kVGhyb3cobXNnKTtcbiAgfVxuXG4gIC8vIHdlIGNhbiBhbHNvIG9wdGlvbmFsbHkgcGFzcyBhIGRpc3RhbmNlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSByYXRpbyBvZlxuICAvLyBzY3JlZW4gaGVpZ2h0LCBzbyAxLjAgbWVhbnMgYSBmdWxsIHNjcmVlbidzIHdvcnRoIG9mIHNjcm9sbGluZ1xuICBpZiAoIXN3aXBlICYmIG9wdHMuZGlzdGFuY2UpIHtcbiAgICBwYXJhbXMuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICB9XG5cbiAgbGV0IGVsZW1lbnQgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgbGV0IGVuZHBvaW50ID0gYC93ZGEvZWxlbWVudC8ke2VsZW1lbnR9LyR7c3dpcGUgPyAnc3dpcGUnIDogJ3Njcm9sbCd9YDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVN3aXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5tb2JpbGVTY3JvbGwob3B0cywgdHJ1ZSk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVBpbmNoID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2ggKG9wdHMgPSB7fSkge1xuICBpZiAoIW9wdHMuZWxlbWVudCkge1xuICAgIG9wdHMuZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKGBjbGFzcyBuYW1lYCwgYFhDVUlFbGVtZW50VHlwZUFwcGxpY2F0aW9uYCwgZmFsc2UpO1xuICB9XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBzY2FsZTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdzY2FsZScsIG9wdHMuc2NhbGUsICdwaW5jaCcpLFxuICAgIHZlbG9jaXR5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3ZlbG9jaXR5Jywgb3B0cy52ZWxvY2l0eSwgJ3BpbmNoJylcbiAgfTtcbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbH0vcGluY2hgLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZURvdWJsZVRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURvdWJsZVRhcCAob3B0cyA9IHt9KSB7XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBEb3VibGUgdGFwIGVsZW1lbnRcbiAgICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L2RvdWJsZVRhcGAsICdQT1NUJyk7XG4gIH1cbiAgLy8gRG91YmxlIHRhcCBjb29yZGluYXRlc1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgeDogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd4Jywgb3B0cy54LCAnZG91YmxlVGFwJyksXG4gICAgeTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd5Jywgb3B0cy55LCAnZG91YmxlVGFwJylcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL2RvdWJsZVRhcCcsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVHdvRmluZ2VyVGFwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVHdvRmluZ2VyVGFwIChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBvcHRzLmVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKTtcbiAgfVxuICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsfS90d29GaW5nZXJUYXBgLCAnUE9TVCcpO1xufTtcblxuaGVscGVycy5tb2JpbGVUb3VjaEFuZEhvbGQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUb3VjaEFuZEhvbGQgKG9wdHMgPSB7fSkge1xuICBsZXQgcGFyYW1zID0ge1xuICAgIGR1cmF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2R1cmF0aW9uJywgb3B0cy5kdXJhdGlvbiwgJ3RvdWNoQW5kSG9sZCcpXG4gIH07XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBMb25nIHRhcCBlbGVtZW50XG4gICAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsfS90b3VjaEFuZEhvbGRgLCAnUE9TVCcsIHBhcmFtcyk7XG4gIH1cbiAgLy8gTG9uZyB0YXAgY29vcmRpbmF0ZXNcbiAgcGFyYW1zLnggPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3gnLCBvcHRzLngsICd0b3VjaEFuZEhvbGQnKTtcbiAgcGFyYW1zLnkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBvcHRzLnksICd0b3VjaEFuZEhvbGQnKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoQW5kSG9sZCcsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVGFwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVGFwIChvcHRzID0ge30pIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIG9wdHMueCwgJ3RhcCcpLFxuICAgIHk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneScsIG9wdHMueSwgJ3RhcCcpXG4gIH07XG4gIGNvbnN0IGVsID0gb3B0cy5lbGVtZW50ID8gKHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpKSA6ICcwJztcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL3RhcC8ke2VsfWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGR1cmF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2R1cmF0aW9uJywgb3B0cy5kdXJhdGlvbiwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIGZyb21YOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2Zyb21YJywgb3B0cy5mcm9tWCwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIGZyb21ZOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ2Zyb21ZJywgb3B0cy5mcm9tWSwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIHRvWDogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd0b1gnLCBvcHRzLnRvWCwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpLFxuICAgIHRvWTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd0b1knLCBvcHRzLnRvWSwgJ2RyYWdGcm9tVG9Gb3JEdXJhdGlvbicpXG4gIH07XG4gIGlmIChvcHRzLmVsZW1lbnQpIHtcbiAgICAvLyBEcmFnIGVsZW1lbnRcbiAgICBjb25zdCBlbCA9IHV0aWwudW53cmFwRWxlbWVudChvcHRzLmVsZW1lbnQpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L2RyYWdmcm9tdG9mb3JkdXJhdGlvbmAsICdQT1NUJywgcGFyYW1zKTtcbiAgfVxuICAvLyBEcmFnIGNvb3JkaW5hdGVzXG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9kcmFnZnJvbXRvZm9yZHVyYXRpb24nLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUYXBXaXRoTnVtYmVyT2ZUYXBzIChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnRWxlbWVudCBpZCBpcyBleHBlY3RlZCB0byBiZSBzZXQgZm9yIHRhcFdpdGhOdW1iZXJPZlRhcHMgbWV0aG9kJyk7XG4gIH1cbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG51bWJlck9mVGFwczogcmVxdWlyZUludFBhcmFtZXRlcignbnVtYmVyT2ZUYXBzJywgb3B0cy5udW1iZXJPZlRhcHMsICd0YXBXaXRoTnVtYmVyT2ZUYXBzJyksXG4gICAgbnVtYmVyT2ZUb3VjaGVzOiByZXF1aXJlSW50UGFyYW1ldGVyKCdudW1iZXJPZlRvdWNoZXMnLCBvcHRzLm51bWJlck9mVG91Y2hlcywgJ3RhcFdpdGhOdW1iZXJPZlRhcHMnKSxcbiAgfTtcbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbH0vdGFwV2l0aE51bWJlck9mVGFwc2AsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUgKG9wdHMgPSB7fSkge1xuICBpZiAoIW9wdHMuZWxlbWVudCkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igc2VsZWN0UGlja2VyV2hlZWxWYWx1ZSBtZXRob2QnKTtcbiAgfVxuICBpZiAoIV8uaXNTdHJpbmcob3B0cy5vcmRlcikgfHwgIVsnbmV4dCcsICdwcmV2aW91cyddLmluY2x1ZGVzKG9wdHMub3JkZXIudG9Mb3dlckNhc2UoKSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIG1hbmRhdG9yeSAnb3JkZXInIHBhcmFtZXRlciBpcyBleHBlY3RlZCB0byBiZSBlcXVhbCBlaXRoZXIgdG8gJ25leHQnIG9yICdwcmV2aW91cycuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAnJHtvcHRzLm9yZGVyfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGNvbnN0IGVsID0gdXRpbC51bndyYXBFbGVtZW50KG9wdHMuZWxlbWVudCk7XG4gIGNvbnN0IHBhcmFtcyA9IHtvcmRlcjogb3B0cy5vcmRlcn07XG4gIGlmIChvcHRzLm9mZnNldCkge1xuICAgIHBhcmFtcy5vZmZzZXQgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ29mZnNldCcsIG9wdHMub2Zmc2V0LCAnc2VsZWN0UGlja2VyV2hlZWxWYWx1ZScpO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9waWNrZXJ3aGVlbC8ke2VsfS9zZWxlY3RgLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVJvdGF0ZUVsZW1lbnQgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSb3RhdGVFbGVtZW50IChvcHRzID0ge30pIHtcbiAgaWYgKCFvcHRzLmVsZW1lbnQpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnRWxlbWVudCBpZCBpcyBleHBlY3RlZCB0byBiZSBzZXQgZm9yIHJvdGF0ZUVsZW1lbnQgbWV0aG9kJyk7XG4gIH1cbiAgY29uc3QgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQob3B0cy5lbGVtZW50KTtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHJvdGF0aW9uOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3JvdGF0aW9uJywgb3B0cy5yb3RhdGlvbiwgJ3JvdGF0ZUVsZW1lbnQnKSxcbiAgICB2ZWxvY2l0eTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd2ZWxvY2l0eScsIG9wdHMudmVsb2NpdHksICdyb3RhdGVFbGVtZW50JyksXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWx9L3JvdGF0ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q29vcmRpbmF0ZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29yZGluYXRlcyAoZ2VzdHVyZSkge1xuICBsZXQgZWwgPSBnZXN0dXJlLm9wdGlvbnMuZWxlbWVudDtcblxuICAvLyBkZWZhdWx0c1xuICBsZXQgY29vcmRpbmF0ZXMgPSB7eDogMCwgeTogMCwgYXJlT2Zmc2V0czogZmFsc2V9O1xuXG4gIGxldCBvcHRpb25YID0gbnVsbDtcbiAgaWYgKGdlc3R1cmUub3B0aW9ucy54KSB7XG4gICAgb3B0aW9uWCA9IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIGdlc3R1cmUub3B0aW9ucy54LCAnZ2V0Q29vcmRpbmF0ZXMnKTtcbiAgfVxuICBsZXQgb3B0aW9uWSA9IG51bGw7XG4gIGlmIChnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgIG9wdGlvblkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBnZXN0dXJlLm9wdGlvbnMueSwgJ2dldENvb3JkaW5hdGVzJyk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IHRoZSBlbGVtZW50IGNvb3JkaW5hdGVzLlxuICBpZiAoZWwpIHtcbiAgICBsZXQgcmVjdCA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudFJlY3QoZWwpO1xuICAgIGxldCBwb3MgPSB7eDogcmVjdC54LCB5OiByZWN0Lnl9O1xuICAgIGxldCBzaXplID0ge3c6IHJlY3Qud2lkdGgsIGg6IHJlY3QuaGVpZ2h0fTtcblxuICAgIC8vIGRlZmF1bHRzXG4gICAgbGV0IG9mZnNldFggPSAwO1xuICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgIC8vIGdldCB0aGUgcmVhbCBvZmZzZXRzXG4gICAgaWYgKG9wdGlvblggfHwgb3B0aW9uWSkge1xuICAgICAgb2Zmc2V0WCA9IChvcHRpb25YIHx8IDApO1xuICAgICAgb2Zmc2V0WSA9IChvcHRpb25ZIHx8IDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXRYID0gKHNpemUudyAvIDIpO1xuICAgICAgb2Zmc2V0WSA9IChzaXplLmggLyAyKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0aGUgb2Zmc2V0c1xuICAgIGNvb3JkaW5hdGVzLnggPSBwb3MueCArIG9mZnNldFg7XG4gICAgY29vcmRpbmF0ZXMueSA9IHBvcy55ICsgb2Zmc2V0WTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtb3ZlVG8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZCBpbiBhcyBvZmZzZXRzXG4gICAgY29vcmRpbmF0ZXMuYXJlT2Zmc2V0cyA9IChnZXN0dXJlLmFjdGlvbiA9PT0gJ21vdmVUbycpO1xuICAgIGNvb3JkaW5hdGVzLnggPSAob3B0aW9uWCB8fCAwKTtcbiAgICBjb29yZGluYXRlcy55ID0gKG9wdGlvblkgfHwgMCk7XG4gIH1cbiAgcmV0dXJuIGNvb3JkaW5hdGVzO1xufTtcblxuaGVscGVycy5hcHBseU1vdmVUb09mZnNldCA9IGZ1bmN0aW9uIGFwcGx5TW92ZVRvT2Zmc2V0IChmaXJzdENvb3JkaW5hdGVzLCBzZWNvbmRDb29yZGluYXRlcykge1xuICBpZiAoc2Vjb25kQ29vcmRpbmF0ZXMuYXJlT2Zmc2V0cykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBmaXJzdENvb3JkaW5hdGVzLnggKyBzZWNvbmRDb29yZGluYXRlcy54LFxuICAgICAgeTogZmlyc3RDb29yZGluYXRlcy55ICsgc2Vjb25kQ29vcmRpbmF0ZXMueSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzZWNvbmRDb29yZGluYXRlcztcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBoZWxwZXJzLCBjb21tYW5kcyk7XG5leHBvcnQgeyBleHRlbnNpb25zLCBoZWxwZXJzLCBjb21tYW5kcywgZ2VzdHVyZXNDaGFpblRvU3RyaW5nIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VzdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
426
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIl0sIm5hbWVzIjpbImhlbHBlcnMiLCJleHRlbnNpb25zIiwiY29tbWFuZHMiLCJ0b0VsZW1lbnRJZCIsIm9wdHMiLCJlbGVtZW50IiwibG9nIiwiaW5mbyIsImVsIiwiZWxlbWVudElkIiwidXRpbCIsInVud3JhcEVsZW1lbnQiLCJ0b0VsZW1lbnRPckFwcGxpY2F0aW9uSWQiLCJkcml2ZXIiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJtb3ZlVG8iLCJ4b2Zmc2V0IiwieW9mZnNldCIsImlzV2ViQ29udGV4dCIsIngiLCJ5IiwiZ2V0TG9jYXRpb24iLCJjb29yZHMiLCJjdXJXZWJDb29yZHMiLCJhdG9tc0VsZW1lbnQiLCJ1c2VBdG9tc0VsZW1lbnQiLCJyZWxDb29yZHMiLCJleGVjdXRlQXRvbSIsIl8iLCJpc05pbCIsImN1ckNvb3JkcyIsImVycm9ycyIsIlVua25vd25FeGNlcHRpb24iLCJlbFBvcyIsInJlcXVpcmVGbG9hdFBhcmFtZXRlciIsInBhcmFtTmFtZSIsInBhcmFtVmFsdWUiLCJtZXRob2ROYW1lIiwiaXNVbmRlZmluZWQiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInJlc3VsdCIsInBhcnNlRmxvYXQiLCJpc05hTiIsInJlcXVpcmVJbnRQYXJhbWV0ZXIiLCJwYXJzZUludCIsIm1vYmlsZVNoYWtlIiwiaXNTaW11bGF0b3IiLCJVbmtub3duRXJyb3IiLCJkZXZpY2UiLCJzaGFrZSIsImNsaWNrIiwibmF0aXZlQ2xpY2siLCJzZXR0aW5ncyIsImdldFNldHRpbmdzIiwibmF0aXZlV2ViVGFwIiwibmF0aXZlV2ViVGFwU3RyaWN0IiwiZGVidWciLCJnZXN0dXJlc0NoYWluVG9TdHJpbmciLCJnZXN0dXJlcyIsImtleXNUb0luY2x1ZGUiLCJtYXAiLCJpdGVtIiwib3RoZXJLZXlzIiwiZGlmZmVyZW5jZSIsImtleXMiLCJpc0FycmF5IiwiaW50ZXJzZWN0aW9uIiwibGVuZ3RoIiwiYWN0aW9uIiwiaXNQbGFpbk9iamVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJqb2luIiwicGVyZm9ybUFjdGlvbnMiLCJhY3Rpb25zIiwicHJlcHJvY2Vzc2VkQWN0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInR5cGUiLCJwYXJhbWV0ZXJzIiwicG9pbnRlclR5cGUiLCJtb2RpZmllZEFjdGlvbiIsImNsb25lIiwiZmlsdGVyIiwiaW5uZXJBY3Rpb24iLCJkdXJhdGlvbiIsInByb3h5Q29tbWFuZCIsInBlcmZvcm1Ub3VjaCIsImUiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInBlcmZvcm1NdWx0aUFjdGlvbiIsImkiLCJlbmRwb2ludCIsIm1vYmlsZVNjcm9sbCIsInN3aXBlIiwicGFyYW1zIiwibmFtZSIsImRpcmVjdGlvbiIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJtc2ciLCJwcmVkaWNhdGVTdHJpbmciLCJ0b1Zpc2libGUiLCJkaXN0YW5jZSIsIm1vYmlsZVN3aXBlIiwibW9iaWxlUGluY2giLCJzY2FsZSIsInZlbG9jaXR5IiwibW9iaWxlRG91YmxlVGFwIiwibW9iaWxlVHdvRmluZ2VyVGFwIiwibW9iaWxlVG91Y2hBbmRIb2xkIiwibW9iaWxlVGFwIiwibW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwiZnJvbVgiLCJmcm9tWSIsInRvWCIsInRvWSIsIm1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMiLCJudW1iZXJPZlRhcHMiLCJudW1iZXJPZlRvdWNoZXMiLCJtb2JpbGVTZWxlY3RQaWNrZXJXaGVlbFZhbHVlIiwiaXNTdHJpbmciLCJvcmRlciIsIm9mZnNldCIsIm1vYmlsZVJvdGF0ZUVsZW1lbnQiLCJyb3RhdGlvbiIsImdldENvb3JkaW5hdGVzIiwiZ2VzdHVyZSIsImNvb3JkaW5hdGVzIiwiYXJlT2Zmc2V0cyIsIm9wdGlvblgiLCJvcHRpb25zIiwib3B0aW9uWSIsInJlY3QiLCJnZXRFbGVtZW50UmVjdCIsInBvcyIsInNpemUiLCJ3Iiwid2lkdGgiLCJoIiwiaGVpZ2h0Iiwib2Zmc2V0WCIsIm9mZnNldFkiLCJhcHBseU1vdmVUb09mZnNldCIsImZpcnN0Q29vcmRpbmF0ZXMiLCJzZWNvbmRDb29yZGluYXRlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsT0FBTyxHQUFHLEVBQWhCO0FBQUEsTUFBb0JDLFVBQVUsR0FBRyxFQUFqQztBQUFBLE1BQXFDQyxRQUFRLEdBQUcsRUFBaEQ7Ozs7O0FBRUEsU0FBU0MsV0FBVCxDQUFzQkMsSUFBSSxHQUFHLEVBQTdCLEVBQWlDO0FBQy9CLE1BQUlBLElBQUksQ0FBQ0MsT0FBVCxFQUFrQjtBQUNoQkMsb0JBQUlDLElBQUosQ0FBVSwrRUFBVjtBQUNEOztBQUNELFFBQU1DLEVBQUUsR0FBR0osSUFBSSxDQUFDSyxTQUFMLElBQWtCTCxJQUFJLENBQUNDLE9BQWxDO0FBQ0EsU0FBT0csRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBSCxHQUE0QixJQUFyQztBQUNEOztBQUVELGVBQWVJLHdCQUFmLENBQXlDQyxNQUF6QyxFQUFpRFQsSUFBSSxHQUFHLEVBQXhELEVBQTREO0FBQzFELFNBQU9ELFdBQVcsQ0FBQ0MsSUFBRCxDQUFYLElBQ0ZNLG9CQUFLQyxhQUFMLENBQW1CLE1BQU1FLE1BQU0sQ0FBQ0MsMkJBQVAsQ0FBb0MsWUFBcEMsRUFBa0QsNEJBQWxELEVBQStFLEtBQS9FLENBQXpCLENBREw7QUFFRDs7QUFFRFosUUFBUSxDQUFDYSxNQUFULEdBQWtCLGVBQWVBLE1BQWYsQ0FBdUJQLEVBQXZCLEVBQTJCUSxPQUFPLEdBQUcsQ0FBckMsRUFBd0NDLE9BQU8sR0FBRyxDQUFsRCxFQUFxRDtBQUNyRVQsRUFBQUEsRUFBRSxHQUFHRSxvQkFBS0MsYUFBTCxDQUFtQkgsRUFBbkIsQ0FBTDs7QUFFQSxNQUFJLEtBQUtVLFlBQUwsRUFBSixFQUF5QjtBQUN2QixRQUFJO0FBQUNDLE1BQUFBLENBQUQ7QUFBSUMsTUFBQUE7QUFBSixRQUFTLE1B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LENBQUM5RyxDQUFaLEdBQWlCZ0gsT0FBTyxJQUFJLENBQTVCO0FBQ0FGLElBQUFBLFdBQVcsQ0FBQzdHLENBQVosR0FBaUJpSCxPQUFPLElBQUksQ0FBNUI7QUFDRDs7QUFDRCxTQUFPSixXQUFQO0FBQ0QsQ0EzQ0Q7O0FBNkNBakksT0FBTyxDQUFDZ0osaUJBQVIsR0FBNEIsU0FBU0EsaUJBQVQsQ0FBNEJDLGdCQUE1QixFQUE4Q0MsaUJBQTlDLEVBQWlFO0FBQzNGLE1BQUlBLGlCQUFpQixDQUFDaEIsVUFBdEIsRUFBa0M7QUFDaEMsV0FBTztBQUNML0csTUFBQUEsQ0FBQyxFQUFFOEgsZ0JBQWdCLENBQUM5SCxDQUFqQixHQUFxQitILGlCQUFpQixDQUFDL0gsQ0FEckM7QUFFTEMsTUFBQUEsQ0FBQyxFQUFFNkgsZ0JBQWdCLENBQUM3SCxDQUFqQixHQUFxQjhILGlCQUFpQixDQUFDOUg7QUFGckMsS0FBUDtBQUlELEdBTEQsTUFLTztBQUNMLFdBQU84SCxpQkFBUDtBQUNEO0FBQ0YsQ0FURDs7QUFXQXRFLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjNUUsVUFBZCxFQUEwQkQsT0FBMUIsRUFBbUNFLFFBQW5DO2VBRWVELFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5cblxuY29uc3QgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge30sIGNvbW1hbmRzID0ge307XG5cbmZ1bmN0aW9uIHRvRWxlbWVudElkIChvcHRzID0ge30pIHtcbiAgaWYgKG9wdHMuZWxlbWVudCkge1xuICAgIGxvZy5pbmZvKGBUaGUgJ2VsZW1lbnQnIGFyZ3VtZW50IG5hbWUgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgdXNpbmcgJ2VsZW1lbnRJZCcgaW5zdGVhZGApO1xuICB9XG4gIGNvbnN0IGVsID0gb3B0cy5lbGVtZW50SWQgfHwgb3B0cy5lbGVtZW50O1xuICByZXR1cm4gZWwgPyB1dGlsLnVud3JhcEVsZW1lbnQoZWwpIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdG9FbGVtZW50T3JBcHBsaWNhdGlvbklkIChkcml2ZXIsIG9wdHMgPSB7fSkge1xuICByZXR1cm4gdG9FbGVtZW50SWQob3B0cylcbiAgICB8fCB1dGlsLnVud3JhcEVsZW1lbnQoYXdhaXQgZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhgY2xhc3MgbmFtZWAsIGBYQ1VJRWxlbWVudFR5cGVBcHBsaWNhdGlvbmAsIGZhbHNlKSk7XG59XG5cbmNvbW1hbmRzLm1vdmVUbyA9IGFzeW5jIGZ1bmN0aW9uIG1vdmVUbyAoZWwsIHhvZmZzZXQgPSAwLCB5b2Zmc2V0ID0gMCkge1xuICBlbCA9IHV0aWwudW53cmFwRWxlbWVudChlbCk7XG5cbiAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBsZXQge3gsIHl9ID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgbGV0IGNvb3JkcyA9IHtcbiAgICAgIHg6IHggKyB4b2Zmc2V0LFxuICAgICAgeTogeSArIHlvZmZzZXRcbiAgICB9O1xuICAgIHRoaXMuY3VyV2ViQ29vcmRzID0gY29vcmRzO1xuICAgIGxldCBhdG9tc0VsZW1lbnQgPSB0aGlzLnVzZUF0b21zRWxlbWVudChlbCk7XG4gICAgbGV0IHJlbENvb3JkcyA9IHt4OiB4b2Zmc2V0LCB5OiB5b2Zmc2V0fTtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdtb3ZlX21vdXNlJywgW2F0b21zRWxlbWVudCwgcmVsQ29vcmRzXSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKF8uaXNOaWwoZWwpKSB7XG4gICAgICBpZiAoIXRoaXMuY3VyQ29vcmRzKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkV4Y2VwdGlvbihcbiAgICAgICAgICAnQ3VycmVudCBjdXJzb3IgcG9zaXRpb24gdW5rbm93biwgcGxlYXNlIHVzZSBtb3ZlVG8gd2l0aCBhbiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lLicpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJDb29yZHMgPSB7XG4gICAgICAgIHg6IHRoaXMuY3VyQ29vcmRzLnggKyB4b2Zmc2V0LFxuICAgICAgICB5OiB0aGlzLmN1ckNvb3Jkcy55ICsgeW9mZnNldFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsUG9zID0gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbCk7XG4gICAgICB0aGlzLmN1ckNvb3JkcyA9IHtcbiAgICAgICAgeDogZWxQb3MueCArIHhvZmZzZXQsXG4gICAgICAgIHk6IGVsUG9zLnkgKyB5b2Zmc2V0XG4gICAgICB9O1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gcmVxdWlyZUZsb2F0UGFyYW1ldGVyIChwYXJhbU5hbWUsIHBhcmFtVmFsdWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1WYWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBcIiR7cGFyYW1OYW1lfVwiIHBhcmFtZXRlciBpcyBtYW5kYXRvcnkgZm9yIFwiJHttZXRob2ROYW1lfVwiIGNhbGxgKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHBhcmFtVmFsdWUpO1xuICBpZiAoaXNOYU4ocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIHNob3VsZCBiZSBhIHZhbGlkIG51bWJlci4gXCIke3BhcmFtVmFsdWV9XCIgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVJbnRQYXJhbWV0ZXIgKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbVZhbHVlKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFwiJHtwYXJhbU5hbWV9XCIgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeSBmb3IgXCIke21ldGhvZE5hbWV9XCIgY2FsbGApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHBhcmFtVmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBcIiR7cGFyYW1OYW1lfVwiIHBhcmFtZXRlciBzaG91bGQgYmUgYSB2YWxpZCBpbnRlZ2VyLiBcIiR7cGFyYW1WYWx1ZX1cIiBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29tbWFuZHMubW9iaWxlU2hha2UgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTaGFrZSAoKSB7XG4gIGlmICghdGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoJ1NoYWtlIGlzIG5vdCBzdXBwb3J0ZWQgb24gcmVhbCBkZXZpY2VzJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5vcHRzLmRldmljZS5zaGFrZSgpO1xufTtcblxuY29tbWFuZHMuY2xpY2sgPSBhc3luYyBmdW5jdGlvbiBjbGljayAoZWwpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIGNvbW1hbmRzIHRoYXQgbWFwIGhlcmUsIHNvIG1hbnVhbGx5IHByb3h5XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubmF0aXZlQ2xpY2soZWwpO1xuICB9XG4gIGVsID0gdXRpbC51bndyYXBFbGVtZW50KGVsKTtcbiAgaWYgKChhd2FpdCB0aGlzLnNldHRpbmdzLmdldFNldHRpbmdzKCkpLm5hdGl2ZVdlYlRhcCB8fCAoYXdhaXQgdGhpcy5zZXR0aW5ncy5nZXRTZXR0aW5ncygpKS5uYXRpdmVXZWJUYXBTdHJpY3QpIHtcbiAgICAvLyBhdG9tcy1iYXNlZCBjbGlja3MgZG9uJ3QgYWx3YXlzIHdvcmsgaW4gc2FmYXJpIDdcbiAgICBsb2cuZGVidWcoJ1VzaW5nIG5hdGl2ZSB3ZWIgdGFwJyk7XG4gICAgYXdhaXQgdGhpcy5uYXRpdmVXZWJUYXAoZWwpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGF0b21zRWxlbWVudCA9IHRoaXMudXNlQXRvbXNFbGVtZW50KGVsKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnY2xpY2snLCBbYXRvbXNFbGVtZW50XSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGdlc3R1cmVzQ2hhaW5Ub1N0cmluZyAoZ2VzdHVyZXMsIGtleXNUb0luY2x1ZGUgPSBbJ29wdGlvbnMnXSkge1xuICByZXR1cm4gZ2VzdHVyZXMubWFwKChpdGVtKSA9PiB7XG4gICAgbGV0IG90aGVyS2V5cyA9IF8uZGlmZmVyZW5jZShfLmtleXMoaXRlbSksIFsnYWN0aW9uJ10pO1xuICAgIG90aGVyS2V5cyA9IF8uaXNBcnJheShrZXlzVG9JbmNsdWRlKSA/IF8uaW50ZXJzZWN0aW9uKG90aGVyS2V5cywga2V5c1RvSW5jbHVkZSkgOiBvdGhlcktleXM7XG4gICAgaWYgKG90aGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBgJHtpdGVtLmFjdGlvbn1gICtcbiAgICAgICAgYCgke18ubWFwKG90aGVyS2V5cywgKHgpID0+IHggKyAnPScgKyAoXy5pc1BsYWluT2JqZWN0KGl0ZW1beF0pID8gSlNPTi5zdHJpbmdpZnkoaXRlbVt4XSkgOiBpdGVtW3hdKSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW0uYWN0aW9uO1xuICB9KS5qb2luKCctJyk7XG59XG5cbmNvbW1hbmRzLnBlcmZvcm1BY3Rpb25zID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbnMgKGFjdGlvbnMpIHtcbiAgbG9nLmRlYnVnKGBSZWNlaXZlZCB0aGUgZm9sbG93aW5nIFczQyBhY3Rpb25zOiAke0pTT04uc3RyaW5naWZ5KGFjdGlvbnMsIG51bGwsICcgICcpfWApO1xuICAvLyBUaGlzIGlzIG1hbmRhdG9yeSwgc2luY2UgV0RBIG9ubHkgc3VwcG9ydHMgVE9VQ0ggcG9pbnRlciB0eXBlXG4gIC8vIGFuZCBTZWxlbml1bSBBUEkgdXNlcyBNT1VTRSBhcyB0aGUgZGVmYXVsdCBvbmVcbiAgY29uc3QgcHJlcHJvY2Vzc2VkQWN0aW9ucyA9IGFjdGlvbnNcbiAgICAubWFwKChhY3Rpb24pID0+IE9iamVjdC5hc3NpZ24oe30sIGFjdGlvbiwgYWN0aW9uLnR5cGUgPT09ICdwb2ludGVyJyA/IHtcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcG9pbnRlclR5cGU6ICd0b3VjaCdcbiAgICAgIH1cbiAgICB9IDoge30pKVxuICAgIC5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgY29uc3QgbW9kaWZpZWRBY3Rpb24gPSBfLmNsb25lKGFjdGlvbikgfHwge307XG4gICAgICAvLyBTZWxlbml1bSBBUEkgdW5leHBlY3RlZGx5IGluc2VydHMgemVybyBwYXVzZXMsIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFdEQVxuICAgICAgbW9kaWZpZWRBY3Rpb24uYWN0aW9ucyA9IChhY3Rpb24uYWN0aW9ucyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcigoaW5uZXJBY3Rpb24pID0+ICEoaW5uZXJBY3Rpb24udHlwZSA9PT0gJ3BhdXNlJyAmJiBpbm5lckFjdGlvbi5kdXJhdGlvbiA9PT0gMCkpO1xuICAgICAgcmV0dXJuIG1vZGlmaWVkQWN0aW9uO1xuICAgIH0pO1xuICBsb2cuZGVidWcoYFByZXByb2Nlc3NlZCBhY3Rpb25zOiAke0pTT04uc3RyaW5naWZ5KHByZXByb2Nlc3NlZEFjdGlvbnMsIG51bGwsICcgICcpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy9hY3Rpb25zJywgJ1BPU1QnLCB7YWN0aW9uczogcHJlcHJvY2Vzc2VkQWN0aW9uc30pO1xufTtcblxuY29tbWFuZHMucGVyZm9ybVRvdWNoID0gYXN5bmMgZnVuY3Rpb24gcGVyZm9ybVRvdWNoIChnZXN0dXJlcykge1xuICBsb2cuZGVidWcoYFJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdG91Y2ggYWN0aW9uOiAke2dlc3R1cmVzQ2hhaW5Ub1N0cmluZyhnZXN0dXJlcyl9YCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL3RvdWNoL3BlcmZvcm0nLCAnUE9TVCcsIHthY3Rpb25zOiBnZXN0dXJlc30pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnVGhlIFRvdWNoIEFQSSBpcyBhaW1lZCBmb3IgdXNhZ2UgaW4gTkFUSVZFIGNvbnRleHQuICcgK1xuICAgICAgJ0NvbnNpZGVyIHVzaW5nIFwiZXhlY3V0ZVwiIEFQSSB3aXRoIGN1c3RvbSBldmVudHMgdHJpZ2dlciBzY3JpcHQgJyArXG4gICAgICBgdG8gZW11bGF0ZSB0b3VjaCBldmVudHMgYmVpbmcgaW4gV0VCVklFVyBjb250ZXh0LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLnBlcmZvcm1NdWx0aUFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1NdWx0aUFjdGlvbiAoYWN0aW9ucykge1xuICBsb2cuZGVidWcoYFJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgbXVsdGkgdG91Y2ggYWN0aW9uOmApO1xuICBmb3IgKGxldCBpIGluIGFjdGlvbnMpIHtcbiAgICBsb2cuZGVidWcoYCAgICAke3BhcnNlSW50KGksIDEwKSArIDF9OiAke18ubWFwKGFjdGlvbnNbaV0sICdhY3Rpb24nKS5qb2luKCctJyl9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy93ZGEvdG91Y2gvbXVsdGkvcGVyZm9ybScsICdQT1NUJywge2FjdGlvbnN9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBNdWx0aVRvdWNoIEFQSSBpcyBhaW1lZCBmb3IgdXNhZ2UgaW4gTkFUSVZFIGNvbnRleHQuICcgK1xuICAgICAgJ0NvbnNpZGVyIHVzaW5nIFwiZXhlY3V0ZVwiIEFQSSB3aXRoIGN1c3RvbSBldmVudHMgdHJpZ2dlciBzY3JpcHQgJyArXG4gICAgICBgdG8gZW11bGF0ZSBtdWx0aXRvdWNoIGV2ZW50cyBiZWluZyBpbiBXRUJWSUVXIGNvbnRleHQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuY29tbWFuZHMubmF0aXZlQ2xpY2sgPSBhc3luYyBmdW5jdGlvbiBuYXRpdmVDbGljayAoZWwpIHtcbiAgZWwgPSB1dGlsLnVud3JhcEVsZW1lbnQoZWwpO1xuICBsZXQgZW5kcG9pbnQgPSBgL2VsZW1lbnQvJHtlbH0vY2xpY2tgO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoZW5kcG9pbnQsICdQT1NUJywge30pO1xufTtcblxuLypcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svV2ViRHJpdmVyQWdlbnQvYmxvYi9tYXN0ZXIvV2ViRHJpdmVyQWdlbnRMaWIvQ29tbWFuZHMvRkJFbGVtZW50Q29tbWFuZHMubVxuICogdG8gZ2V0IHRoZSBpbmZvIGFib3V0IGF2YWlsYWJsZSBXREEgZ2VzdHVyZXMgQVBJXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9yZWZlcmVuY2UveGN0ZXN0L3hjdWllbGVtZW50IGFuZFxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3JlZmVyZW5jZS94Y3Rlc3QveGN1aWNvb3JkaW5hdGUgdG8gZ2V0IHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZlxuICogYWxsIFhDVGVzdCBnZXN0dXJlc1xuKi9cblxuaGVscGVycy5tb2JpbGVTY3JvbGwgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGwgKG9wdHMgPSB7fSwgc3dpcGUgPSBmYWxzZSkge1xuICAvLyBXREEgc3VwcG9ydHMgZm91ciBzY3JvbGxpbmcgc3RyYXRlZ2llczogcHJlZGljYXRpb24gYmFzZWQgb24gbmFtZSwgZGlyZWN0aW9uLFxuICAvLyBwcmVkaWNhdGVTdHJpbmcsIGFuZCB0b1Zpc2libGUsIGluIHRoYXQgb3JkZXIuIFN3aXBpbmcgcmVxdWlyZXMgZGlyZWN0aW9uLlxuICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgaWYgKG9wdHMubmFtZSAmJiAhc3dpcGUpIHtcbiAgICBwYXJhbXMubmFtZSA9IG9wdHMubmFtZTtcbiAgfSBlbHNlIGlmIChvcHRzLmRpcmVjdGlvbikge1xuICAgIGlmICghWyd1cCcsICdkb3duJywgJ2xlZnQnLCAncmlnaHQnXS5pbmNsdWRlcyhvcHRzLmRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgbGV0IG1zZyA9ICdEaXJlY3Rpb24gbXVzdCBiZSB1cCwgZG93biwgbGVmdCBvciByaWdodCc7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICAgIH1cbiAgICBwYXJhbXMuZGlyZWN0aW9uID0gb3B0cy5kaXJlY3Rpb247XG4gIH0gZWxzZSBpZiAob3B0cy5wcmVkaWNhdGVTdHJpbmcgJiYgIXN3aXBlKSB7XG4gICAgcGFyYW1zLnByZWRpY2F0ZVN0cmluZyA9IG9wdHMucHJlZGljYXRlU3RyaW5nO1xuICB9IGVsc2UgaWYgKG9wdHMudG9WaXNpYmxlICYmICFzd2lwZSkge1xuICAgIHBhcmFtcy50b1Zpc2libGUgPSBvcHRzLnRvVmlzaWJsZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtc2cgPSBzd2lwZVxuICAgICAgPyAnTW9iaWxlIHN3aXBlIHJlcXVpcmVzIGRpcmVjdGlvbidcbiAgICAgIDogJ01vYmlsZSBzY3JvbGwgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzOiBuYW1lLCBkaXJlY3Rpb24sIHByZWRpY2F0ZVN0cmluZywgYW5kIHRvVmlzaWJsZS4gU3BlY2lmeSBvbmUgb2YgdGhlc2UnO1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IobXNnKTtcbiAgfVxuXG4gIC8vIHdlIGNhbiBhbHNvIG9wdGlvbmFsbHkgcGFzcyBhIGRpc3RhbmNlIHdoaWNoIGFwcGVhcnMgdG8gYmUgYSByYXRpbyBvZlxuICAvLyBzY3JlZW4gaGVpZ2h0LCBzbyAxLjAgbWVhbnMgYSBmdWxsIHNjcmVlbidzIHdvcnRoIG9mIHNjcm9sbGluZ1xuICBpZiAoIXN3aXBlICYmIG9wdHMuZGlzdGFuY2UpIHtcbiAgICBwYXJhbXMuZGlzdGFuY2UgPSBvcHRzLmRpc3RhbmNlO1xuICB9XG5cbiAgY29uc3QgZWxlbWVudElkID0gYXdhaXQgdG9FbGVtZW50T3JBcHBsaWNhdGlvbklkKHRoaXMsIG9wdHMpO1xuICBjb25zdCBlbmRwb2ludCA9IGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9LyR7c3dpcGUgPyAnc3dpcGUnIDogJ3Njcm9sbCd9YDtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVN3aXBlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3dpcGUgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5tb2JpbGVTY3JvbGwob3B0cywgdHJ1ZSk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVBpbmNoID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2ggKG9wdHMgPSB7fSkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgc2NhbGU6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignc2NhbGUnLCBvcHRzLnNjYWxlLCAncGluY2gnKSxcbiAgICB2ZWxvY2l0eTogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd2ZWxvY2l0eScsIG9wdHMudmVsb2NpdHksICdwaW5jaCcpXG4gIH07XG4gIGNvbnN0IGVsZW1lbnRJZCA9IGF3YWl0IHRvRWxlbWVudE9yQXBwbGljYXRpb25JZCh0aGlzLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3BpbmNoYCwgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuaGVscGVycy5tb2JpbGVEb3VibGVUYXAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEb3VibGVUYXAgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKGVsZW1lbnRJZCkge1xuICAgIC8vIERvdWJsZSB0YXAgZWxlbWVudFxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS9lbGVtZW50LyR7ZWxlbWVudElkfS9kb3VibGVUYXBgLCAnUE9TVCcpO1xuICB9XG4gIC8vIERvdWJsZSB0YXAgY29vcmRpbmF0ZXNcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIHg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIG9wdHMueCwgJ2RvdWJsZVRhcCcpLFxuICAgIHk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneScsIG9wdHMueSwgJ2RvdWJsZVRhcCcpXG4gIH07XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS9kb3VibGVUYXAnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVR3b0ZpbmdlclRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVR3b0ZpbmdlclRhcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IGVsZW1lbnRJZCA9IGF3YWl0IHRvRWxlbWVudE9yQXBwbGljYXRpb25JZCh0aGlzLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3R3b0ZpbmdlclRhcGAsICdQT1NUJyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRvdWNoQW5kSG9sZCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRvdWNoQW5kSG9sZCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBkdXJhdGlvbjogcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdkdXJhdGlvbicsIG9wdHMuZHVyYXRpb24sICd0b3VjaEFuZEhvbGQnKVxuICB9O1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKGVsZW1lbnRJZCkge1xuICAgIC8vIExvbmcgdGFwIGVsZW1lbnRcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsZW1lbnRJZH0vdG91Y2hBbmRIb2xkYCwgJ1BPU1QnLCBwYXJhbXMpO1xuICB9XG4gIC8vIExvbmcgdGFwIGNvb3JkaW5hdGVzXG4gIHBhcmFtcy54ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd4Jywgb3B0cy54LCAndG91Y2hBbmRIb2xkJyk7XG4gIHBhcmFtcy55ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCd5Jywgb3B0cy55LCAndG91Y2hBbmRIb2xkJyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCgnL3dkYS90b3VjaEFuZEhvbGQnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG5oZWxwZXJzLm1vYmlsZVRhcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRhcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICB4OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3gnLCBvcHRzLngsICd0YXAnKSxcbiAgICB5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBvcHRzLnksICd0YXAnKVxuICB9O1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKSB8fCAnMCc7XG4gIHJldHVybiBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChgL3dkYS90YXAvJHtlbGVtZW50SWR9YCwgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuaGVscGVycy5tb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24gPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgZHVyYXRpb246IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZHVyYXRpb24nLCBvcHRzLmR1cmF0aW9uLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgZnJvbVg6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZnJvbVgnLCBvcHRzLmZyb21YLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgZnJvbVk6IHJlcXVpcmVGbG9hdFBhcmFtZXRlcignZnJvbVknLCBvcHRzLmZyb21ZLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgdG9YOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3RvWCcsIG9wdHMudG9YLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyksXG4gICAgdG9ZOiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3RvWScsIG9wdHMudG9ZLCAnZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJylcbiAgfTtcbiAgY29uc3QgZWxlbWVudElkID0gdG9FbGVtZW50SWQob3B0cyk7XG4gIHJldHVybiBlbGVtZW50SWRcbiAgICAvLyBEcmFnIGVsZW1lbnRcbiAgICA/IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L2RyYWdmcm9tdG9mb3JkdXJhdGlvbmAsICdQT1NUJywgcGFyYW1zKVxuICAgIC8vIERyYWcgY29vcmRpbmF0ZXNcbiAgICA6IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKCcvd2RhL2RyYWdmcm9tdG9mb3JkdXJhdGlvbicsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlVGFwV2l0aE51bWJlck9mVGFwcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3IgdGFwV2l0aE51bWJlck9mVGFwcyBtZXRob2QnKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgbnVtYmVyT2ZUYXBzOiByZXF1aXJlSW50UGFyYW1ldGVyKCdudW1iZXJPZlRhcHMnLCBvcHRzLm51bWJlck9mVGFwcywgJ3RhcFdpdGhOdW1iZXJPZlRhcHMnKSxcbiAgICBudW1iZXJPZlRvdWNoZXM6IHJlcXVpcmVJbnRQYXJhbWV0ZXIoJ251bWJlck9mVG91Y2hlcycsIG9wdHMubnVtYmVyT2ZUb3VjaGVzLCAndGFwV2l0aE51bWJlck9mVGFwcycpLFxuICB9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvZWxlbWVudC8ke2VsZW1lbnRJZH0vdGFwV2l0aE51bWJlck9mVGFwc2AsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igc2VsZWN0UGlja2VyV2hlZWxWYWx1ZSBtZXRob2QnKTtcbiAgfVxuICBpZiAoIV8uaXNTdHJpbmcob3B0cy5vcmRlcikgfHwgIVsnbmV4dCcsICdwcmV2aW91cyddLmluY2x1ZGVzKG9wdHMub3JkZXIudG9Mb3dlckNhc2UoKSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgbWFuZGF0b3J5ICdvcmRlcicgcGFyYW1ldGVyIGlzIGV4cGVjdGVkIHRvIGJlIGVxdWFsIGVpdGhlciB0byAnbmV4dCcgb3IgJ3ByZXZpb3VzJy4gYCArXG4gICAgICBgJyR7b3B0cy5vcmRlcn0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7b3JkZXI6IG9wdHMub3JkZXJ9O1xuICBpZiAob3B0cy5vZmZzZXQpIHtcbiAgICBwYXJhbXMub2Zmc2V0ID0gcmVxdWlyZUZsb2F0UGFyYW1ldGVyKCdvZmZzZXQnLCBvcHRzLm9mZnNldCwgJ3NlbGVjdFBpY2tlcldoZWVsVmFsdWUnKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoYC93ZGEvcGlja2Vyd2hlZWwvJHtlbGVtZW50SWR9L3NlbGVjdGAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMubW9iaWxlUm90YXRlRWxlbWVudCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJvdGF0ZUVsZW1lbnQgKG9wdHMgPSB7fSkge1xuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChvcHRzKTtcbiAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKCdFbGVtZW50IGlkIGlzIGV4cGVjdGVkIHRvIGJlIHNldCBmb3Igcm90YXRlRWxlbWVudCBtZXRob2QnKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgcm90YXRpb246IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigncm90YXRpb24nLCBvcHRzLnJvdGF0aW9uLCAncm90YXRlRWxlbWVudCcpLFxuICAgIHZlbG9jaXR5OiByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3ZlbG9jaXR5Jywgb3B0cy52ZWxvY2l0eSwgJ3JvdGF0ZUVsZW1lbnQnKSxcbiAgfTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHlDb21tYW5kKGAvd2RhL2VsZW1lbnQvJHtlbGVtZW50SWR9L3JvdGF0ZWAsICdQT1NUJywgcGFyYW1zKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q29vcmRpbmF0ZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb29yZGluYXRlcyAoZ2VzdHVyZSkge1xuICAvLyBkZWZhdWx0c1xuICBsZXQgY29vcmRpbmF0ZXMgPSB7eDogMCwgeTogMCwgYXJlT2Zmc2V0czogZmFsc2V9O1xuXG4gIGxldCBvcHRpb25YID0gbnVsbDtcbiAgaWYgKGdlc3R1cmUub3B0aW9ucy54KSB7XG4gICAgb3B0aW9uWCA9IHJlcXVpcmVGbG9hdFBhcmFtZXRlcigneCcsIGdlc3R1cmUub3B0aW9ucy54LCAnZ2V0Q29vcmRpbmF0ZXMnKTtcbiAgfVxuICBsZXQgb3B0aW9uWSA9IG51bGw7XG4gIGlmIChnZXN0dXJlLm9wdGlvbnMueSkge1xuICAgIG9wdGlvblkgPSByZXF1aXJlRmxvYXRQYXJhbWV0ZXIoJ3knLCBnZXN0dXJlLm9wdGlvbnMueSwgJ2dldENvb3JkaW5hdGVzJyk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IHRoZSBlbGVtZW50IGNvb3JkaW5hdGVzLlxuICBjb25zdCBlbGVtZW50SWQgPSB0b0VsZW1lbnRJZChnZXN0dXJlLm9wdGlvbnMpO1xuICBpZiAoZWxlbWVudElkKSB7XG4gICAgbGV0IHJlY3QgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRSZWN0KGVsZW1lbnRJZCk7XG4gICAgbGV0IHBvcyA9IHt4OiByZWN0LngsIHk6IHJlY3QueX07XG4gICAgbGV0IHNpemUgPSB7dzogcmVjdC53aWR0aCwgaDogcmVjdC5oZWlnaHR9O1xuXG4gICAgLy8gZGVmYXVsdHNcbiAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgLy8gZ2V0IHRoZSByZWFsIG9mZnNldHNcbiAgICBpZiAob3B0aW9uWCB8fCBvcHRpb25ZKSB7XG4gICAgICBvZmZzZXRYID0gKG9wdGlvblggfHwgMCk7XG4gICAgICBvZmZzZXRZID0gKG9wdGlvblkgfHwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldFggPSAoc2l6ZS53IC8gMik7XG4gICAgICBvZmZzZXRZID0gKHNpemUuaCAvIDIpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHRoZSBvZmZzZXRzXG4gICAgY29vcmRpbmF0ZXMueCA9IHBvcy54ICsgb2Zmc2V0WDtcbiAgICBjb29yZGluYXRlcy55ID0gcG9zLnkgKyBvZmZzZXRZO1xuICB9IGVsc2Uge1xuICAgIC8vIG1vdmVUbyBjb29yZGluYXRlcyBhcmUgcGFzc2VkIGluIGFzIG9mZnNldHNcbiAgICBjb29yZGluYXRlcy5hcmVPZmZzZXRzID0gKGdlc3R1cmUuYWN0aW9uID09PSAnbW92ZVRvJyk7XG4gICAgY29vcmRpbmF0ZXMueCA9IChvcHRpb25YIHx8IDApO1xuICAgIGNvb3JkaW5hdGVzLnkgPSAob3B0aW9uWSB8fCAwKTtcbiAgfVxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59O1xuXG5oZWxwZXJzLmFwcGx5TW92ZVRvT2Zmc2V0ID0gZnVuY3Rpb24gYXBwbHlNb3ZlVG9PZmZzZXQgKGZpcnN0Q29vcmRpbmF0ZXMsIHNlY29uZENvb3JkaW5hdGVzKSB7XG4gIGlmIChzZWNvbmRDb29yZGluYXRlcy5hcmVPZmZzZXRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGZpcnN0Q29vcmRpbmF0ZXMueCArIHNlY29uZENvb3JkaW5hdGVzLngsXG4gICAgICB5OiBmaXJzdENvb3JkaW5hdGVzLnkgKyBzZWNvbmRDb29yZGluYXRlcy55LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlY29uZENvb3JkaW5hdGVzO1xuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGhlbHBlcnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGV4dGVuc2lvbnMsIGhlbHBlcnMsIGNvbW1hbmRzLCBnZXN0dXJlc0NoYWluVG9TdHJpbmcgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZXN0dXJlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
package/lib/commands/element.js
CHANGED
|
@@ -40,7 +40,7 @@ commands.getName = async function getName (el) {
|
|
|
40
40
|
el = util.unwrapElement(el);
|
|
41
41
|
if (this.isWebContext()) {
|
|
42
42
|
const atomsElement = this.useAtomsElement(el);
|
|
43
|
-
const script = 'return arguments[0].tagName';
|
|
43
|
+
const script = 'return arguments[0].tagName.toLowerCase()';
|
|
44
44
|
return await this.executeAtom('execute_script', [script, [atomsElement]]);
|
|
45
45
|
}
|
|
46
46
|
|
package/lib/commands/gesture.js
CHANGED
|
@@ -6,6 +6,19 @@ import log from '../logger';
|
|
|
6
6
|
|
|
7
7
|
const helpers = {}, extensions = {}, commands = {};
|
|
8
8
|
|
|
9
|
+
function toElementId (opts = {}) {
|
|
10
|
+
if (opts.element) {
|
|
11
|
+
log.info(`The 'element' argument name is deprecated. Consider using 'elementId' instead`);
|
|
12
|
+
}
|
|
13
|
+
const el = opts.elementId || opts.element;
|
|
14
|
+
return el ? util.unwrapElement(el) : null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function toElementOrApplicationId (driver, opts = {}) {
|
|
18
|
+
return toElementId(opts)
|
|
19
|
+
|| util.unwrapElement(await driver.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false));
|
|
20
|
+
}
|
|
21
|
+
|
|
9
22
|
commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
|
|
10
23
|
el = util.unwrapElement(el);
|
|
11
24
|
|
|
@@ -20,7 +33,7 @@ commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
|
|
|
20
33
|
let relCoords = {x: xoffset, y: yoffset};
|
|
21
34
|
await this.executeAtom('move_mouse', [atomsElement, relCoords]);
|
|
22
35
|
} else {
|
|
23
|
-
if (_.
|
|
36
|
+
if (_.isNil(el)) {
|
|
24
37
|
if (!this.curCoords) {
|
|
25
38
|
throw new errors.UnknownException(
|
|
26
39
|
'Current cursor position unknown, please use moveTo with an element the first time.');
|
|
@@ -41,22 +54,22 @@ commands.moveTo = async function moveTo (el, xoffset = 0, yoffset = 0) {
|
|
|
41
54
|
|
|
42
55
|
function requireFloatParameter (paramName, paramValue, methodName) {
|
|
43
56
|
if (_.isUndefined(paramValue)) {
|
|
44
|
-
|
|
57
|
+
throw new errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
|
|
45
58
|
}
|
|
46
59
|
const result = parseFloat(paramValue);
|
|
47
60
|
if (isNaN(result)) {
|
|
48
|
-
|
|
61
|
+
throw new errors.InvalidArgumentError(`"${paramName}" parameter should be a valid number. "${paramValue}" is given instead`);
|
|
49
62
|
}
|
|
50
63
|
return result;
|
|
51
64
|
}
|
|
52
65
|
|
|
53
66
|
function requireIntParameter (paramName, paramValue, methodName) {
|
|
54
67
|
if (_.isUndefined(paramValue)) {
|
|
55
|
-
|
|
68
|
+
throw new errors.InvalidArgumentError(`"${paramName}" parameter is mandatory for "${methodName}" call`);
|
|
56
69
|
}
|
|
57
70
|
const result = parseInt(paramValue, 10);
|
|
58
71
|
if (isNaN(result)) {
|
|
59
|
-
|
|
72
|
+
throw new errors.InvalidArgumentError(`"${paramName}" parameter should be a valid integer. "${paramValue}" is given instead`);
|
|
60
73
|
}
|
|
61
74
|
return result;
|
|
62
75
|
}
|
|
@@ -164,12 +177,9 @@ commands.nativeClick = async function nativeClick (el) {
|
|
|
164
177
|
*/
|
|
165
178
|
|
|
166
179
|
helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
|
|
167
|
-
if (!opts.element) {
|
|
168
|
-
opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
|
|
169
|
-
}
|
|
170
180
|
// WDA supports four scrolling strategies: predication based on name, direction,
|
|
171
181
|
// predicateString, and toVisible, in that order. Swiping requires direction.
|
|
172
|
-
|
|
182
|
+
const params = {};
|
|
173
183
|
if (opts.name && !swipe) {
|
|
174
184
|
params.name = opts.name;
|
|
175
185
|
} else if (opts.direction) {
|
|
@@ -183,10 +193,10 @@ helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
|
|
|
183
193
|
} else if (opts.toVisible && !swipe) {
|
|
184
194
|
params.toVisible = opts.toVisible;
|
|
185
195
|
} else {
|
|
186
|
-
|
|
196
|
+
const msg = swipe
|
|
187
197
|
? 'Mobile swipe requires direction'
|
|
188
198
|
: 'Mobile scroll supports the following strategies: name, direction, predicateString, and toVisible. Specify one of these';
|
|
189
|
-
|
|
199
|
+
throw new errors.InvalidArgumentError(msg);
|
|
190
200
|
}
|
|
191
201
|
|
|
192
202
|
// we can also optionally pass a distance which appears to be a ratio of
|
|
@@ -195,8 +205,8 @@ helpers.mobileScroll = async function mobileScroll (opts = {}, swipe = false) {
|
|
|
195
205
|
params.distance = opts.distance;
|
|
196
206
|
}
|
|
197
207
|
|
|
198
|
-
|
|
199
|
-
|
|
208
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
209
|
+
const endpoint = `/wda/element/${elementId}/${swipe ? 'swipe' : 'scroll'}`;
|
|
200
210
|
return await this.proxyCommand(endpoint, 'POST', params);
|
|
201
211
|
};
|
|
202
212
|
|
|
@@ -205,22 +215,19 @@ helpers.mobileSwipe = async function mobileSwipe (opts = {}) {
|
|
|
205
215
|
};
|
|
206
216
|
|
|
207
217
|
helpers.mobilePinch = async function mobilePinch (opts = {}) {
|
|
208
|
-
if (!opts.element) {
|
|
209
|
-
opts.element = await this.findNativeElementOrElements(`class name`, `XCUIElementTypeApplication`, false);
|
|
210
|
-
}
|
|
211
218
|
const params = {
|
|
212
219
|
scale: requireFloatParameter('scale', opts.scale, 'pinch'),
|
|
213
220
|
velocity: requireFloatParameter('velocity', opts.velocity, 'pinch')
|
|
214
221
|
};
|
|
215
|
-
const
|
|
216
|
-
return await this.proxyCommand(`/wda/element/${
|
|
222
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
223
|
+
return await this.proxyCommand(`/wda/element/${elementId}/pinch`, 'POST', params);
|
|
217
224
|
};
|
|
218
225
|
|
|
219
226
|
helpers.mobileDoubleTap = async function mobileDoubleTap (opts = {}) {
|
|
220
|
-
|
|
227
|
+
const elementId = toElementId(opts);
|
|
228
|
+
if (elementId) {
|
|
221
229
|
// Double tap element
|
|
222
|
-
|
|
223
|
-
return await this.proxyCommand(`/wda/element/${el}/doubleTap`, 'POST');
|
|
230
|
+
return await this.proxyCommand(`/wda/element/${elementId}/doubleTap`, 'POST');
|
|
224
231
|
}
|
|
225
232
|
// Double tap coordinates
|
|
226
233
|
const params = {
|
|
@@ -231,21 +238,18 @@ helpers.mobileDoubleTap = async function mobileDoubleTap (opts = {}) {
|
|
|
231
238
|
};
|
|
232
239
|
|
|
233
240
|
helpers.mobileTwoFingerTap = async function mobileTwoFingerTap (opts = {}) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
const el = util.unwrapElement(opts.element);
|
|
238
|
-
return await this.proxyCommand(`/wda/element/${el}/twoFingerTap`, 'POST');
|
|
241
|
+
const elementId = await toElementOrApplicationId(this, opts);
|
|
242
|
+
return await this.proxyCommand(`/wda/element/${elementId}/twoFingerTap`, 'POST');
|
|
239
243
|
};
|
|
240
244
|
|
|
241
245
|
helpers.mobileTouchAndHold = async function mobileTouchAndHold (opts = {}) {
|
|
242
|
-
|
|
246
|
+
const params = {
|
|
243
247
|
duration: requireFloatParameter('duration', opts.duration, 'touchAndHold')
|
|
244
248
|
};
|
|
245
|
-
|
|
249
|
+
const elementId = toElementId(opts);
|
|
250
|
+
if (elementId) {
|
|
246
251
|
// Long tap element
|
|
247
|
-
|
|
248
|
-
return await this.proxyCommand(`/wda/element/${el}/touchAndHold`, 'POST', params);
|
|
252
|
+
return await this.proxyCommand(`/wda/element/${elementId}/touchAndHold`, 'POST', params);
|
|
249
253
|
}
|
|
250
254
|
// Long tap coordinates
|
|
251
255
|
params.x = requireFloatParameter('x', opts.x, 'touchAndHold');
|
|
@@ -258,8 +262,8 @@ helpers.mobileTap = async function mobileTap (opts = {}) {
|
|
|
258
262
|
x: requireFloatParameter('x', opts.x, 'tap'),
|
|
259
263
|
y: requireFloatParameter('y', opts.y, 'tap')
|
|
260
264
|
};
|
|
261
|
-
const
|
|
262
|
-
return await this.proxyCommand(`/wda/tap/${
|
|
265
|
+
const elementId = toElementId(opts) || '0';
|
|
266
|
+
return await this.proxyCommand(`/wda/tap/${elementId}`, 'POST', params);
|
|
263
267
|
};
|
|
264
268
|
|
|
265
269
|
helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration (opts = {}) {
|
|
@@ -270,58 +274,55 @@ helpers.mobileDragFromToForDuration = async function mobileDragFromToForDuration
|
|
|
270
274
|
toX: requireFloatParameter('toX', opts.toX, 'dragFromToForDuration'),
|
|
271
275
|
toY: requireFloatParameter('toY', opts.toY, 'dragFromToForDuration')
|
|
272
276
|
};
|
|
273
|
-
|
|
277
|
+
const elementId = toElementId(opts);
|
|
278
|
+
return elementId
|
|
274
279
|
// Drag element
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
// Drag coordinates
|
|
279
|
-
return await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
|
|
280
|
+
? await this.proxyCommand(`/wda/element/${elementId}/dragfromtoforduration`, 'POST', params)
|
|
281
|
+
// Drag coordinates
|
|
282
|
+
: await this.proxyCommand('/wda/dragfromtoforduration', 'POST', params);
|
|
280
283
|
};
|
|
281
284
|
|
|
282
285
|
helpers.mobileTapWithNumberOfTaps = async function mobileTapWithNumberOfTaps (opts = {}) {
|
|
283
|
-
|
|
284
|
-
|
|
286
|
+
const elementId = toElementId(opts);
|
|
287
|
+
if (!elementId) {
|
|
288
|
+
throw new errors.InvalidArgumentError('Element id is expected to be set for tapWithNumberOfTaps method');
|
|
285
289
|
}
|
|
286
290
|
const params = {
|
|
287
291
|
numberOfTaps: requireIntParameter('numberOfTaps', opts.numberOfTaps, 'tapWithNumberOfTaps'),
|
|
288
292
|
numberOfTouches: requireIntParameter('numberOfTouches', opts.numberOfTouches, 'tapWithNumberOfTaps'),
|
|
289
293
|
};
|
|
290
|
-
|
|
291
|
-
return await this.proxyCommand(`/wda/element/${el}/tapWithNumberOfTaps`, 'POST', params);
|
|
294
|
+
return await this.proxyCommand(`/wda/element/${elementId}/tapWithNumberOfTaps`, 'POST', params);
|
|
292
295
|
};
|
|
293
296
|
|
|
294
297
|
helpers.mobileSelectPickerWheelValue = async function mobileSelectPickerWheelValue (opts = {}) {
|
|
295
|
-
|
|
296
|
-
|
|
298
|
+
const elementId = toElementId(opts);
|
|
299
|
+
if (!elementId) {
|
|
300
|
+
throw new errors.InvalidArgumentError('Element id is expected to be set for selectPickerWheelValue method');
|
|
297
301
|
}
|
|
298
302
|
if (!_.isString(opts.order) || !['next', 'previous'].includes(opts.order.toLowerCase())) {
|
|
299
|
-
|
|
300
|
-
|
|
303
|
+
throw new errors.InvalidArgumentError(`The mandatory 'order' parameter is expected to be equal either to 'next' or 'previous'. ` +
|
|
304
|
+
`'${opts.order}' is given instead`);
|
|
301
305
|
}
|
|
302
|
-
const el = util.unwrapElement(opts.element);
|
|
303
306
|
const params = {order: opts.order};
|
|
304
307
|
if (opts.offset) {
|
|
305
308
|
params.offset = requireFloatParameter('offset', opts.offset, 'selectPickerWheelValue');
|
|
306
309
|
}
|
|
307
|
-
return await this.proxyCommand(`/wda/pickerwheel/${
|
|
310
|
+
return await this.proxyCommand(`/wda/pickerwheel/${elementId}/select`, 'POST', params);
|
|
308
311
|
};
|
|
309
312
|
|
|
310
313
|
helpers.mobileRotateElement = async function mobileRotateElement (opts = {}) {
|
|
311
|
-
|
|
312
|
-
|
|
314
|
+
const elementId = toElementId(opts);
|
|
315
|
+
if (!elementId) {
|
|
316
|
+
throw new errors.InvalidArgumentError('Element id is expected to be set for rotateElement method');
|
|
313
317
|
}
|
|
314
|
-
const el = util.unwrapElement(opts.element);
|
|
315
318
|
const params = {
|
|
316
319
|
rotation: requireFloatParameter('rotation', opts.rotation, 'rotateElement'),
|
|
317
320
|
velocity: requireFloatParameter('velocity', opts.velocity, 'rotateElement'),
|
|
318
321
|
};
|
|
319
|
-
return await this.proxyCommand(`/wda/element/${
|
|
322
|
+
return await this.proxyCommand(`/wda/element/${elementId}/rotate`, 'POST', params);
|
|
320
323
|
};
|
|
321
324
|
|
|
322
325
|
helpers.getCoordinates = async function getCoordinates (gesture) {
|
|
323
|
-
let el = gesture.options.element;
|
|
324
|
-
|
|
325
326
|
// defaults
|
|
326
327
|
let coordinates = {x: 0, y: 0, areOffsets: false};
|
|
327
328
|
|
|
@@ -335,8 +336,9 @@ helpers.getCoordinates = async function getCoordinates (gesture) {
|
|
|
335
336
|
}
|
|
336
337
|
|
|
337
338
|
// figure out the element coordinates.
|
|
338
|
-
|
|
339
|
-
|
|
339
|
+
const elementId = toElementId(gesture.options);
|
|
340
|
+
if (elementId) {
|
|
341
|
+
let rect = await this.getElementRect(elementId);
|
|
340
342
|
let pos = {x: rect.x, y: rect.y};
|
|
341
343
|
let size = {w: rect.width, h: rect.height};
|
|
342
344
|
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"xcuitest",
|
|
9
9
|
"xctest"
|
|
10
10
|
],
|
|
11
|
-
"version": "3.46.
|
|
11
|
+
"version": "3.46.1",
|
|
12
12
|
"author": "appium",
|
|
13
13
|
"license": "Apache-2.0",
|
|
14
14
|
"repository": {
|
|
@@ -27,7 +27,10 @@
|
|
|
27
27
|
"platformNames": [
|
|
28
28
|
"iOS"
|
|
29
29
|
],
|
|
30
|
-
"mainClass": "XCUITestDriver"
|
|
30
|
+
"mainClass": "XCUITestDriver",
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build-wda": "./node_modules/appium-webdriveragent/Scripts/build-webdriveragent.js"
|
|
33
|
+
}
|
|
31
34
|
},
|
|
32
35
|
"main": "./build/index.js",
|
|
33
36
|
"bin": {},
|
|
@@ -114,7 +117,7 @@
|
|
|
114
117
|
"pngjs": "^6.0.0",
|
|
115
118
|
"pre-commit": "^1.1.3",
|
|
116
119
|
"semantic-release": "^17.1.2",
|
|
117
|
-
"sinon": "^
|
|
120
|
+
"sinon": "^11.0.0",
|
|
118
121
|
"wd": "^1.5.0"
|
|
119
122
|
}
|
|
120
123
|
}
|