appium-xcuitest-driver 4.10.3 → 4.11.0

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 CHANGED
@@ -871,6 +871,45 @@ Name | Type | Required | Description | Example
871
871
  --- | --- | --- | --- | ---
872
872
  text | string | yes | The actual command that will be passed to Siri service | Hello Siri
873
873
 
874
+ ### mobile: pullFile
875
+
876
+ Pulls a remote file from the device.
877
+
878
+ #### Arguments
879
+
880
+ Name | Type | Required | Description | Example
881
+ --- | --- | --- | --- | ---
882
+ remotePath | string | yes | The path to an existing remote file on the device. This variable can be prefixed with bundle id, so then the file will be pulled from the corresponding application container instead of the default media folder. Use `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>` format to pull a file from an application container of the given type. The only supported container type for real devices is `documents`. You could use [listApps](#mobile-listapps) extension to check whether this container is available for the particluar app. Containers available for Simulators: `app`, `data`, `groups`, `<A specific App Group container>`. Eventually the whole Simulator file system is [available](https://stackoverflow.com/questions/6480607/is-there-any-way-to-see-the-file-system-on-the-ios-simulator) directly from Finder, so you may pull any file from there by providing a path to it relatively to Simulator's file system root. If the file with the given name does not exist an exception will be thrown. | @com.mycompany.myapp:documents/myfile.txt
883
+
884
+ #### Returned Result
885
+
886
+ Base64-encoded string, which represents the content of the remote file.
887
+
888
+ ### mobile: pushFile
889
+
890
+ Pushes a local file to the device.
891
+
892
+ #### Arguments
893
+
894
+ Name | Type | Required | Description | Example
895
+ --- | --- | --- | --- | ---
896
+ remotePath | string | yes | The path on the device to where the payload should be written. The value format is similar to the one used in [pullFile](#mobile-pullfile) extension. If the file with the same name already exists then it will be silently overridden. | @com.mycompany.myapp:documents/myfile.txt
897
+ payload | string | yes | Base64-encoded content of the file to be pushed. | QXBwaXVt
898
+
899
+ ### mobile: pullFolder
900
+
901
+ Pulls a remote folder from the device.
902
+
903
+ #### Arguments
904
+
905
+ Name | Type | Required | Description | Example
906
+ --- | --- | --- | --- | ---
907
+ remotePath | string | yes | Same as for [pullFile](#mobile-pullfile) extension, but should be pointing to a remote folder | @com.mycompany.myapp:documents/myfolder/
908
+
909
+ #### Returned Result
910
+
911
+ Base64-encoded string, which represents the zipped content of the remote folder.
912
+
874
913
  ### mobile: deleteFile
875
914
 
876
915
  Deletes the given file from the device under test.
@@ -879,7 +918,7 @@ Deletes the given file from the device under test.
879
918
 
880
919
  Name | Type | Required | Description | Example
881
920
  --- | --- | --- | --- | ---
882
- remotePath | string | yes | The path to an existing remote file on the device. This variable can be prefixed with bundle id, so then the file will be deleted from the corresponding application container instead of the default media folder. Use `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>` format to delete a file or a folder from an application container of the given type. The only supported container type is 'documents'. If the container type is not set explicitly for a bundle id, then the default application container is going to be mounted (aka --container ifuse argument) e.g. If `@com.myapp.bla:documents/111.png` is provided, `On My iPhone/<app name>` in Files app will be mounted to the host machine. `@com.myapp.bla:documents/` means `On My iPhone/<app name>`. | @com.mycompany.myapp:documents/myfile.txt
921
+ remotePath | string | yes | Same as for [pullFile](#mobile-pullfile) extension | @com.mycompany.myapp:documents/myfile.txt
883
922
 
884
923
  ### mobile: deleteFolder
885
924
 
@@ -1400,7 +1439,7 @@ Get all condition inducer configuration profiles
1400
1439
 
1401
1440
  #### Returned Result
1402
1441
 
1403
- The response looks like
1442
+ The response looks like
1404
1443
 
1405
1444
  ```
1406
1445
  [{
@@ -1429,7 +1468,7 @@ The response looks like
1429
1468
 
1430
1469
  ### mobile: disableConditionInducer
1431
1470
 
1432
- Disable device condition inducer.
1471
+ Disable device condition inducer.
1433
1472
 
1434
1473
  Usually a persistent connection is maintained after enable the condition inducer, and this method is only valid for this connection.
1435
1474
 
@@ -113,6 +113,9 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
113
113
  getAppearance: 'mobileGetAppearance',
114
114
  setAppearance: 'mobileSetAppearance',
115
115
  siriCommand: 'mobileSiriCommand',
116
+ pushFile: 'mobilePushFile',
117
+ pullFile: 'mobilePullFile',
118
+ pullFolder: 'mobilePullFolder',
116
119
  deleteFile: 'mobileDeleteFile',
117
120
  deleteFolder: 'mobileDeleteFolder',
118
121
  startAudioRecording: 'startAudioRecording',
@@ -142,4 +145,4 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
142
145
 
143
146
  var _default = extensions;
144
147
  exports.default = _default;
145
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwicmVjZWl2ZUFzeW5jUmVzcG9uc2UiLCJzdGF0dXMiLCJ2YWx1ZSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInV0aWwiLCJoYXNWYWx1ZSIsImFzeW5jUHJvbWlzZSIsIndhcm4iLCJyZWplY3QiLCJlcnJvckZyb21Db2RlIiwibWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsImVycm9yIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwicmVzb2x2ZSIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJpc0FycmF5IiwiaXNXZWJDb250ZXh0IiwiY29udmVydEVsZW1lbnRzRm9yQXRvbXMiLCJyZXN1bHQiLCJleGVjdXRlQXRvbSIsImNhY2hlV2ViRWxlbWVudHMiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZXhlY3V0ZUFzeW5jIiwiYXN5bmNXYWl0TXMiLCJwcm9taXNlIiwicmVtb3RlIiwiZXhlY3V0ZUF0b21Bc3luYyIsImN1cldlYkZyYW1lcyIsIndhaXRGb3JBdG9tIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJjb21tYW5kTWFwIiwidGFwIiwic2Nyb2xsIiwic2VsZWN0UGlja2VyV2hlZWxWYWx1ZSIsInN3aXBlIiwicGluY2giLCJkb3VibGVUYXAiLCJ0d29GaW5nZXJUYXAiLCJ0YXBXaXRoTnVtYmVyT2ZUYXBzIiwidG91Y2hBbmRIb2xkIiwiZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwicm90YXRlRWxlbWVudCIsImZvcmNlUHJlc3MiLCJzY3JvbGxUb0VsZW1lbnQiLCJhbGVydCIsInNldFBhc3RlYm9hcmQiLCJnZXRQYXN0ZWJvYXJkIiwic291cmNlIiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsQXBwIiwiaXNBcHBJbnN0YWxsZWQiLCJyZW1vdmVBcHAiLCJsYXVuY2hBcHAiLCJ0ZXJtaW5hdGVBcHAiLCJraWxsQXBwIiwicXVlcnlBcHBTdGF0ZSIsImFjdGl2YXRlQXBwIiwibGlzdEFwcHMiLCJ2aWV3cG9ydFNjcmVlbnNob3QiLCJ2aWV3cG9ydFJlY3QiLCJzdGFydFBlcmZSZWNvcmQiLCJzdG9wUGVyZlJlY29yZCIsImluc3RhbGxDZXJ0aWZpY2F0ZSIsImxpc3RDZXJ0aWZpY2F0ZXMiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJhY3RpdmVBcHBJbmZvIiwiZGV2aWNlU2NyZWVuSW5mbyIsInByZXNzQnV0dG9uIiwiZW5yb2xsQmlvbWV0cmljIiwic2VuZEJpb21ldHJpY01hdGNoIiwiaXNCaW9tZXRyaWNFbnJvbGxlZCIsImNsZWFyS2V5Y2hhaW5zIiwiZ2V0UGVybWlzc2lvbiIsInNldFBlcm1pc3Npb24iLCJyZXNldFBlcm1pc3Npb24iLCJnZXRBcHBlYXJhbmNlIiwic2V0QXBwZWFyYW5jZSIsInNpcmlDb21tYW5kIiwiZGVsZXRlRmlsZSIsImRlbGV0ZUZvbGRlciIsInN0YXJ0QXVkaW9SZWNvcmRpbmciLCJzdG9wQXVkaW9SZWNvcmRpbmciLCJydW5YQ1Rlc3QiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwibGlzdFhDVGVzdEJ1bmRsZXMiLCJsaXN0WENUZXN0c0luVGVzdEJ1bmRsZSIsInB1c2hOb3RpZmljYXRpb24iLCJleHBlY3ROb3RpZmljYXRpb24iLCJwZXJmb3JtSW9IaWRFdmVudCIsImNvbmZpZ3VyZUxvY2FsaXphdGlvbiIsInJlc2V0TG9jYXRpb25TZXJ2aWNlIiwic3RhcnRQY2FwIiwic3RvcFBjYXAiLCJsaXN0Q29uZGl0aW9uSW5kdWNlcnMiLCJlbmFibGVDb25kaXRpb25JbmR1Y2VyIiwiZGlzYWJsZUNvbmRpdGlvbkluZHVjZXIiLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsImpvaW4iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZXhlY3V0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBlcnJvckZyb21Db2RlLCBlcnJvckZyb21XM0NKc29uQ29kZVxufSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5yZWNlaXZlQXN5bmNSZXNwb25zZSA9IGFzeW5jIGZ1bmN0aW9uIHJlY2VpdmVBc3luY1Jlc3BvbnNlIChzdGF0dXMsIHZhbHVlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICB0aGlzLmxvZy5kZWJ1ZyhgUmVjZWl2ZWQgYXN5bmMgcmVzcG9uc2U6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUodGhpcy5hc3luY1Byb21pc2UpKSB7XG4gICAgdGhpcy5sb2cud2FybihgUmVjZWl2ZWQgYXN5bmMgcmVzcG9uc2Ugd2hlbiB3ZSB3ZXJlIG5vdCBleHBlY3Rpbmcgb25lISBgICtcbiAgICAgIGBSZXNwb25zZSB3YXM6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN0YXR1cykgJiYgc3RhdHVzICE9PSAwKSB7XG4gICAgLy8gTUpTT05XUFxuICAgIHJldHVybiB0aGlzLmFzeW5jUHJvbWlzZS5yZWplY3QoZXJyb3JGcm9tQ29kZShzdGF0dXMsIHZhbHVlLm1lc3NhZ2UpKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUoc3RhdHVzKSAmJiB2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlLmVycm9yKSkge1xuICAgIC8vIFczQ1xuICAgIHJldHVybiB0aGlzLmFzeW5jUHJvbWlzZS5yZWplY3QoZXJyb3JGcm9tVzNDSnNvbkNvZGUodmFsdWUuZXJyb3IsIHZhbHVlLm1lc3NhZ2UsIHZhbHVlLnN0YWNrdHJhY2UpKTtcbiAgfVxuICByZXR1cm4gdGhpcy5hc3luY1Byb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKHNjcmlwdC5tYXRjaCgvXm1vYmlsZTovKSkge1xuICAgIHNjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKC9ebW9iaWxlOi8sICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vYmlsZShzY3JpcHQsIF8uaXNBcnJheShhcmdzKSA/IGFyZ3NbMF0gOiBhcmdzKTtcbiAgfSBlbHNlIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgYXJncyA9IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJncyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBhcmdzXSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhyZXN1bHQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVBc3luYyA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBc3luYyAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXJncyA9IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJncyk7XG4gIHRoaXMuYXN5bmNXYWl0TXMgPSB0aGlzLmFzeW5jV2FpdE1zIHx8IDA7XG4gIGNvbnN0IHByb21pc2UgPSB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbUFzeW5jKCdleGVjdXRlX2FzeW5jX3NjcmlwdCcsIFtcbiAgICBzY3JpcHQsIGFyZ3MsIHRoaXMuYXN5bmNXYWl0TXNcbiAgXSwgdGhpcy5jdXJXZWJGcmFtZXMpO1xuICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSkpO1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGNvbW1hbmRNYXAgPSB7XG4gICAgLy9yZWdpb24gZ2VzdHVyZXMgc3VwcG9ydFxuICAgIHRhcDogJ21vYmlsZVRhcCcsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICBzZWxlY3RQaWNrZXJXaGVlbFZhbHVlOiAnbW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZScsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2Njgtc3dpcGVsZWZ0P2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3NC1zd2lwZXJpZ2h0P2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2Ny1zd2lwZXVwP2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2NC1zd2lwZWRvd24/bGFuZ3VhZ2U9b2JqY1xuICAgIHN3aXBlOiAnbW9iaWxlU3dpcGUnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY5LXBpbmNod2l0aHNjYWxlP2xhbmd1YWdlPW9iamNcbiAgICBwaW5jaDogJ21vYmlsZVBpbmNoJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3My1kb3VibGV0YXA/bGFuZ3VhZ2U9b2JqY1xuICAgIGRvdWJsZVRhcDogJ21vYmlsZURvdWJsZVRhcCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzUtdHdvZmluZ2VydGFwP2xhbmd1YWdlPW9iamNcbiAgICB0d29GaW5nZXJUYXA6ICdtb2JpbGVUd29GaW5nZXJUYXAnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjcxLXRhcHdpdGhudW1iZXJvZnRhcHM/bGFuZ3VhZ2U9b2JqY1xuICAgIHRhcFdpdGhOdW1iZXJPZlRhcHM6ICdtb2JpbGVUYXBXaXRoTnVtYmVyT2ZUYXBzJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2My1wcmVzc2ZvcmR1cmF0aW9uP2xhbmd1YWdlPW9iamNcbiAgICB0b3VjaEFuZEhvbGQ6ICdtb2JpbGVUb3VjaEFuZEhvbGQnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjcwLXByZXNzZm9yZHVyYXRpb24/bGFuZ3VhZ2U9b2JqY1xuICAgIGRyYWdGcm9tVG9Gb3JEdXJhdGlvbjogJ21vYmlsZURyYWdGcm9tVG9Gb3JEdXJhdGlvbicsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NjUtcm90YXRlP2xhbmd1YWdlPW9iamNcbiAgICByb3RhdGVFbGVtZW50OiAnbW9iaWxlUm90YXRlRWxlbWVudCcsXG4gICAgZm9yY2VQcmVzczogJ21vYmlsZUZvcmNlUHJlc3MnLFxuICAgIHNjcm9sbFRvRWxlbWVudDogJ21vYmlsZVNjcm9sbFRvRWxlbWVudCcsXG5cbiAgICAvL2VuZHJlZ2lvbiBnZXN0dXJlcyBzdXBwb3J0XG4gICAgYWxlcnQ6ICdtb2JpbGVIYW5kbGVBbGVydCcsXG5cbiAgICBzZXRQYXN0ZWJvYXJkOiAnbW9iaWxlU2V0UGFzdGVib2FyZCcsXG4gICAgZ2V0UGFzdGVib2FyZDogJ21vYmlsZUdldFBhc3RlYm9hcmQnLFxuXG4gICAgc291cmNlOiAnbW9iaWxlR2V0U291cmNlJyxcbiAgICBnZXRDb250ZXh0czogJ21vYmlsZUdldENvbnRleHRzJyxcblxuICAgIC8vcmVnaW9uIG11bHRpcGxlIGFwcHMgbWFuYWdlbWVudFxuICAgIGluc3RhbGxBcHA6ICdtb2JpbGVJbnN0YWxsQXBwJyxcbiAgICBpc0FwcEluc3RhbGxlZDogJ21vYmlsZUlzQXBwSW5zdGFsbGVkJyxcbiAgICByZW1vdmVBcHA6ICdtb2JpbGVSZW1vdmVBcHAnLFxuICAgIGxhdW5jaEFwcDogJ21vYmlsZUxhdW5jaEFwcCcsXG4gICAgdGVybWluYXRlQXBwOiAnbW9iaWxlVGVybWluYXRlQXBwJyxcbiAgICBraWxsQXBwOiAnbW9iaWxlS2lsbEFwcCcsXG4gICAgcXVlcnlBcHBTdGF0ZTogJ21vYmlsZVF1ZXJ5QXBwU3RhdGUnLFxuICAgIGFjdGl2YXRlQXBwOiAnbW9iaWxlQWN0aXZhdGVBcHAnLFxuICAgIGxpc3RBcHBzOiAnbW9iaWxlTGlzdEFwcHMnLFxuICAgIC8vZW5kcmVnaW9uIG11bHRpcGxlIGFwcHMgbWFuYWdlbWVudFxuXG4gICAgdmlld3BvcnRTY3JlZW5zaG90OiAnZ2V0Vmlld3BvcnRTY3JlZW5zaG90JyxcbiAgICB2aWV3cG9ydFJlY3Q6ICdnZXRWaWV3cG9ydFJlY3QnLFxuXG4gICAgc3RhcnRQZXJmUmVjb3JkOiAnbW9iaWxlU3RhcnRQZXJmUmVjb3JkJyxcbiAgICBzdG9wUGVyZlJlY29yZDogJ21vYmlsZVN0b3BQZXJmUmVjb3JkJyxcblxuICAgIGluc3RhbGxDZXJ0aWZpY2F0ZTogJ21vYmlsZUluc3RhbGxDZXJ0aWZpY2F0ZScsXG4gICAgbGlzdENlcnRpZmljYXRlczogJ21vYmlsZUxpc3RDZXJ0aWZpY2F0ZXMnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGJhdHRlcnlJbmZvOiAnbW9iaWxlR2V0QmF0dGVyeUluZm8nLFxuICAgIGRldmljZUluZm86ICdtb2JpbGVHZXREZXZpY2VJbmZvJyxcbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG4gICAgYWN0aXZlQXBwSW5mbzogJ21vYmlsZUdldEFjdGl2ZUFwcEluZm8nLFxuICAgIGRldmljZVNjcmVlbkluZm86ICdnZXRTY3JlZW5JbmZvJyxcblxuICAgIHByZXNzQnV0dG9uOiAnbW9iaWxlUHJlc3NCdXR0b24nLFxuXG4gICAgZW5yb2xsQmlvbWV0cmljOiAnbW9iaWxlRW5yb2xsQmlvbWV0cmljJyxcbiAgICBzZW5kQmlvbWV0cmljTWF0Y2g6ICdtb2JpbGVTZW5kQmlvbWV0cmljTWF0Y2gnLFxuICAgIGlzQmlvbWV0cmljRW5yb2xsZWQ6ICdtb2JpbGVJc0Jpb21ldHJpY0Vucm9sbGVkJyxcblxuICAgIGNsZWFyS2V5Y2hhaW5zOiAnbW9iaWxlQ2xlYXJLZXljaGFpbnMnLFxuXG4gICAgZ2V0UGVybWlzc2lvbjogJ21vYmlsZUdldFBlcm1pc3Npb24nLFxuICAgIHNldFBlcm1pc3Npb246ICdtb2JpbGVTZXRQZXJtaXNzaW9ucycsXG4gICAgcmVzZXRQZXJtaXNzaW9uOiAnbW9iaWxlUmVzZXRQZXJtaXNzaW9uJyxcblxuICAgIGdldEFwcGVhcmFuY2U6ICdtb2JpbGVHZXRBcHBlYXJhbmNlJyxcbiAgICBzZXRBcHBlYXJhbmNlOiAnbW9iaWxlU2V0QXBwZWFyYW5jZScsXG5cbiAgICBzaXJpQ29tbWFuZDogJ21vYmlsZVNpcmlDb21tYW5kJyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcbiAgICBkZWxldGVGb2xkZXI6ICdtb2JpbGVEZWxldGVGb2xkZXInLFxuXG4gICAgc3RhcnRBdWRpb1JlY29yZGluZzogJ3N0YXJ0QXVkaW9SZWNvcmRpbmcnLFxuICAgIHN0b3BBdWRpb1JlY29yZGluZzogJ3N0b3BBdWRpb1JlY29yZGluZycsXG5cbiAgICAvLyBYQ1Rlc3RcbiAgICBydW5YQ1Rlc3Q6ICdtb2JpbGVSdW5YQ1Rlc3QnLFxuICAgIGluc3RhbGxYQ1Rlc3RCdW5kbGU6ICdtb2JpbGVJbnN0YWxsWENUZXN0QnVuZGxlJyxcbiAgICBsaXN0WENUZXN0QnVuZGxlczogJ21vYmlsZUxpc3RYQ1Rlc3RCdW5kbGVzJyxcbiAgICBsaXN0WENUZXN0c0luVGVzdEJ1bmRsZTogJ21vYmlsZUxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlJyxcblxuICAgIHB1c2hOb3RpZmljYXRpb246ICdtb2JpbGVQdXNoTm90aWZpY2F0aW9uJyxcbiAgICBleHBlY3ROb3RpZmljYXRpb246ICdtb2JpbGVFeHBlY3ROb3RpZmljYXRpb24nLFxuXG4gICAgcGVyZm9ybUlvSGlkRXZlbnQ6ICdtb2JpbGVQZXJmb3JtSW9IaWRFdmVudCcsXG5cbiAgICBjb25maWd1cmVMb2NhbGl6YXRpb246ICdtb2JpbGVDb25maWd1cmVMb2NhbGl6YXRpb24nLFxuXG4gICAgcmVzZXRMb2NhdGlvblNlcnZpY2U6ICdtb2JpbGVSZXNldExvY2F0aW9uU2VydmljZScsXG5cbiAgICBzdGFydFBjYXA6ICdtb2JpbGVTdGFydFBjYXAnLFxuICAgIHN0b3BQY2FwOiAnbW9iaWxlU3RvcFBjYXAnLFxuICAgIGxpc3RDb25kaXRpb25JbmR1Y2VyczogJ21vYmlsZUxpc3RDb25kaXRpb25JbmR1Y2VycycsXG4gICAgZW5hYmxlQ29uZGl0aW9uSW5kdWNlcjogJ21vYmlsZUVuYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuICAgIGRpc2FibGVDb25kaXRpb25JbmR1Y2VyOiAnbW9iaWxlRGlzYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuICB9O1xuXG4gIGlmICghXy5oYXMoY29tbWFuZE1hcCwgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgJyR7bW9iaWxlQ29tbWFuZH0nLiBPbmx5ICR7Xy5rZXlzKGNvbW1hbmRNYXApLmpvaW4oJywgJyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbY29tbWFuZE1hcFttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxFQUFuQjs7QUFFQUEsVUFBVSxDQUFDQyxvQkFBWCxHQUFrQyxlQUFlQSxvQkFBZixDQUFxQ0MsTUFBckMsRUFBNkNDLEtBQTdDLEVBQW9EO0VBQ3BGLEtBQUtDLEdBQUwsQ0FBU0MsS0FBVCxDQUFnQiw0QkFBMkJDLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixLQUFmLENBQXNCLEVBQWpFOztFQUNBLElBQUksQ0FBQ0ssYUFBQSxDQUFLQyxRQUFMLENBQWMsS0FBS0MsWUFBbkIsQ0FBTCxFQUF1QztJQUNyQyxLQUFLTixHQUFMLENBQVNPLElBQVQsQ0FBZSwwREFBRCxHQUNYLGlCQUFnQkwsSUFBSSxDQUFDQyxTQUFMLENBQWVKLEtBQWYsQ0FBc0IsRUFEekM7SUFFQTtFQUNEOztFQUVELElBQUlLLGFBQUEsQ0FBS0MsUUFBTCxDQUFjUCxNQUFkLEtBQXlCQSxNQUFNLEtBQUssQ0FBeEMsRUFBMkM7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
148
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleHRlbnNpb25zIiwicmVjZWl2ZUFzeW5jUmVzcG9uc2UiLCJzdGF0dXMiLCJ2YWx1ZSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInV0aWwiLCJoYXNWYWx1ZSIsImFzeW5jUHJvbWlzZSIsIndhcm4iLCJyZWplY3QiLCJlcnJvckZyb21Db2RlIiwibWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsImVycm9yIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwicmVzb2x2ZSIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJpc0FycmF5IiwiaXNXZWJDb250ZXh0IiwiY29udmVydEVsZW1lbnRzRm9yQXRvbXMiLCJyZXN1bHQiLCJleGVjdXRlQXRvbSIsImNhY2hlV2ViRWxlbWVudHMiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZXhlY3V0ZUFzeW5jIiwiYXN5bmNXYWl0TXMiLCJwcm9taXNlIiwicmVtb3RlIiwiZXhlY3V0ZUF0b21Bc3luYyIsImN1cldlYkZyYW1lcyIsIndhaXRGb3JBdG9tIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJjb21tYW5kTWFwIiwidGFwIiwic2Nyb2xsIiwic2VsZWN0UGlja2VyV2hlZWxWYWx1ZSIsInN3aXBlIiwicGluY2giLCJkb3VibGVUYXAiLCJ0d29GaW5nZXJUYXAiLCJ0YXBXaXRoTnVtYmVyT2ZUYXBzIiwidG91Y2hBbmRIb2xkIiwiZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwicm90YXRlRWxlbWVudCIsImZvcmNlUHJlc3MiLCJzY3JvbGxUb0VsZW1lbnQiLCJhbGVydCIsInNldFBhc3RlYm9hcmQiLCJnZXRQYXN0ZWJvYXJkIiwic291cmNlIiwiZ2V0Q29udGV4dHMiLCJpbnN0YWxsQXBwIiwiaXNBcHBJbnN0YWxsZWQiLCJyZW1vdmVBcHAiLCJsYXVuY2hBcHAiLCJ0ZXJtaW5hdGVBcHAiLCJraWxsQXBwIiwicXVlcnlBcHBTdGF0ZSIsImFjdGl2YXRlQXBwIiwibGlzdEFwcHMiLCJ2aWV3cG9ydFNjcmVlbnNob3QiLCJ2aWV3cG9ydFJlY3QiLCJzdGFydFBlcmZSZWNvcmQiLCJzdG9wUGVyZlJlY29yZCIsImluc3RhbGxDZXJ0aWZpY2F0ZSIsImxpc3RDZXJ0aWZpY2F0ZXMiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJhY3RpdmVBcHBJbmZvIiwiZGV2aWNlU2NyZWVuSW5mbyIsInByZXNzQnV0dG9uIiwiZW5yb2xsQmlvbWV0cmljIiwic2VuZEJpb21ldHJpY01hdGNoIiwiaXNCaW9tZXRyaWNFbnJvbGxlZCIsImNsZWFyS2V5Y2hhaW5zIiwiZ2V0UGVybWlzc2lvbiIsInNldFBlcm1pc3Npb24iLCJyZXNldFBlcm1pc3Npb24iLCJnZXRBcHBlYXJhbmNlIiwic2V0QXBwZWFyYW5jZSIsInNpcmlDb21tYW5kIiwicHVzaEZpbGUiLCJwdWxsRmlsZSIsInB1bGxGb2xkZXIiLCJkZWxldGVGaWxlIiwiZGVsZXRlRm9sZGVyIiwic3RhcnRBdWRpb1JlY29yZGluZyIsInN0b3BBdWRpb1JlY29yZGluZyIsInJ1blhDVGVzdCIsImluc3RhbGxYQ1Rlc3RCdW5kbGUiLCJsaXN0WENUZXN0QnVuZGxlcyIsImxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlIiwicHVzaE5vdGlmaWNhdGlvbiIsImV4cGVjdE5vdGlmaWNhdGlvbiIsInBlcmZvcm1Jb0hpZEV2ZW50IiwiY29uZmlndXJlTG9jYWxpemF0aW9uIiwicmVzZXRMb2NhdGlvblNlcnZpY2UiLCJzdGFydFBjYXAiLCJzdG9wUGNhcCIsImxpc3RDb25kaXRpb25JbmR1Y2VycyIsImVuYWJsZUNvbmRpdGlvbkluZHVjZXIiLCJkaXNhYmxlQ29uZGl0aW9uSW5kdWNlciIsImhhcyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIiwiam9pbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBlcnJvcnMsIGVycm9yRnJvbUNvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlXG59IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG5leHRlbnNpb25zLnJlY2VpdmVBc3luY1Jlc3BvbnNlID0gYXN5bmMgZnVuY3Rpb24gcmVjZWl2ZUFzeW5jUmVzcG9uc2UgKHN0YXR1cywgdmFsdWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIHRoaXMubG9nLmRlYnVnKGBSZWNlaXZlZCBhc3luYyByZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gIGlmICghdXRpbC5oYXNWYWx1ZSh0aGlzLmFzeW5jUHJvbWlzZSkpIHtcbiAgICB0aGlzLmxvZy53YXJuKGBSZWNlaXZlZCBhc3luYyByZXNwb25zZSB3aGVuIHdlIHdlcmUgbm90IGV4cGVjdGluZyBvbmUhIGAgK1xuICAgICAgYFJlc3BvbnNlIHdhczogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHV0aWwuaGFzVmFsdWUoc3RhdHVzKSAmJiBzdGF0dXMgIT09IDApIHtcbiAgICAvLyBNSlNPTldQXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNQcm9taXNlLnJlamVjdChlcnJvckZyb21Db2RlKHN0YXR1cywgdmFsdWUubWVzc2FnZSkpO1xuICB9XG4gIGlmICghdXRpbC5oYXNWYWx1ZShzdGF0dXMpICYmIHZhbHVlICYmIF8uaXNTdHJpbmcodmFsdWUuZXJyb3IpKSB7XG4gICAgLy8gVzNDXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNQcm9taXNlLnJlamVjdChlcnJvckZyb21XM0NKc29uQ29kZSh2YWx1ZS5lcnJvciwgdmFsdWUubWVzc2FnZSwgdmFsdWUuc3RhY2t0cmFjZSkpO1xuICB9XG4gIHJldHVybiB0aGlzLmFzeW5jUHJvbWlzZS5yZXNvbHZlKHZhbHVlKTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUgKHNjcmlwdCwgYXJncykge1xuICBpZiAoc2NyaXB0Lm1hdGNoKC9ebW9iaWxlOi8pKSB7XG4gICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL15tb2JpbGU6LywgJycpLnRyaW0oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTW9iaWxlKHNjcmlwdCwgXy5pc0FycmF5KGFyZ3MpID8gYXJnc1swXSA6IGFyZ3MpO1xuICB9IGVsc2UgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICBhcmdzID0gdGhpcy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyhhcmdzKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBdG9tKCdleGVjdXRlX3NjcmlwdCcsIFtzY3JpcHQsIGFyZ3NdKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZUFzeW5jID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKCF0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhcmdzID0gdGhpcy5jb252ZXJ0RWxlbWVudHNGb3JBdG9tcyhhcmdzKTtcbiAgdGhpcy5hc3luY1dhaXRNcyA9IHRoaXMuYXN5bmNXYWl0TXMgfHwgMDtcbiAgY29uc3QgcHJvbWlzZSA9IHRoaXMucmVtb3RlLmV4ZWN1dGVBdG9tQXN5bmMoJ2V4ZWN1dGVfYXN5bmNfc2NyaXB0JywgW1xuICAgIHNjcmlwdCwgYXJncywgdGhpcy5hc3luY1dhaXRNc1xuICBdLCB0aGlzLmN1cldlYkZyYW1lcyk7XG4gIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMoYXdhaXQgdGhpcy53YWl0Rm9yQXRvbShwcm9taXNlKSk7XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlTW9iaWxlIChtb2JpbGVDb21tYW5kLCBvcHRzID0ge30pIHtcbiAgY29uc3QgY29tbWFuZE1hcCA9IHtcbiAgICAvL3JlZ2lvbiBnZXN0dXJlcyBzdXBwb3J0XG4gICAgdGFwOiAnbW9iaWxlVGFwJyxcbiAgICBzY3JvbGw6ICdtb2JpbGVTY3JvbGwnLFxuICAgIHNlbGVjdFBpY2tlcldoZWVsVmFsdWU6ICdtb2JpbGVTZWxlY3RQaWNrZXJXaGVlbFZhbHVlJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2OC1zd2lwZWxlZnQ/bGFuZ3VhZ2U9b2JqY1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4Njc0LXN3aXBlcmlnaHQ/bGFuZ3VhZ2U9b2JqY1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY3LXN3aXBldXA/bGFuZ3VhZ2U9b2JqY1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY0LXN3aXBlZG93bj9sYW5ndWFnZT1vYmpjXG4gICAgc3dpcGU6ICdtb2JpbGVTd2lwZScsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NjktcGluY2h3aXRoc2NhbGU/bGFuZ3VhZ2U9b2JqY1xuICAgIHBpbmNoOiAnbW9iaWxlUGluY2gnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjczLWRvdWJsZXRhcD9sYW5ndWFnZT1vYmpjXG4gICAgZG91YmxlVGFwOiAnbW9iaWxlRG91YmxlVGFwJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3NS10d29maW5nZXJ0YXA/bGFuZ3VhZ2U9b2JqY1xuICAgIHR3b0ZpbmdlclRhcDogJ21vYmlsZVR3b0ZpbmdlclRhcCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzEtdGFwd2l0aG51bWJlcm9mdGFwcz9sYW5ndWFnZT1vYmpjXG4gICAgdGFwV2l0aE51bWJlck9mVGFwczogJ21vYmlsZVRhcFdpdGhOdW1iZXJPZlRhcHMnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjYzLXByZXNzZm9yZHVyYXRpb24/bGFuZ3VhZ2U9b2JqY1xuICAgIHRvdWNoQW5kSG9sZDogJ21vYmlsZVRvdWNoQW5kSG9sZCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzAtcHJlc3Nmb3JkdXJhdGlvbj9sYW5ndWFnZT1vYmpjXG4gICAgZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uOiAnbW9iaWxlRHJhZ0Zyb21Ub0ZvckR1cmF0aW9uJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2NS1yb3RhdGU/bGFuZ3VhZ2U9b2JqY1xuICAgIHJvdGF0ZUVsZW1lbnQ6ICdtb2JpbGVSb3RhdGVFbGVtZW50JyxcbiAgICBmb3JjZVByZXNzOiAnbW9iaWxlRm9yY2VQcmVzcycsXG4gICAgc2Nyb2xsVG9FbGVtZW50OiAnbW9iaWxlU2Nyb2xsVG9FbGVtZW50JyxcblxuICAgIC8vZW5kcmVnaW9uIGdlc3R1cmVzIHN1cHBvcnRcbiAgICBhbGVydDogJ21vYmlsZUhhbmRsZUFsZXJ0JyxcblxuICAgIHNldFBhc3RlYm9hcmQ6ICdtb2JpbGVTZXRQYXN0ZWJvYXJkJyxcbiAgICBnZXRQYXN0ZWJvYXJkOiAnbW9iaWxlR2V0UGFzdGVib2FyZCcsXG5cbiAgICBzb3VyY2U6ICdtb2JpbGVHZXRTb3VyY2UnLFxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgLy9yZWdpb24gbXVsdGlwbGUgYXBwcyBtYW5hZ2VtZW50XG4gICAgaW5zdGFsbEFwcDogJ21vYmlsZUluc3RhbGxBcHAnLFxuICAgIGlzQXBwSW5zdGFsbGVkOiAnbW9iaWxlSXNBcHBJbnN0YWxsZWQnLFxuICAgIHJlbW92ZUFwcDogJ21vYmlsZVJlbW92ZUFwcCcsXG4gICAgbGF1bmNoQXBwOiAnbW9iaWxlTGF1bmNoQXBwJyxcbiAgICB0ZXJtaW5hdGVBcHA6ICdtb2JpbGVUZXJtaW5hdGVBcHAnLFxuICAgIGtpbGxBcHA6ICdtb2JpbGVLaWxsQXBwJyxcbiAgICBxdWVyeUFwcFN0YXRlOiAnbW9iaWxlUXVlcnlBcHBTdGF0ZScsXG4gICAgYWN0aXZhdGVBcHA6ICdtb2JpbGVBY3RpdmF0ZUFwcCcsXG4gICAgbGlzdEFwcHM6ICdtb2JpbGVMaXN0QXBwcycsXG4gICAgLy9lbmRyZWdpb24gbXVsdGlwbGUgYXBwcyBtYW5hZ2VtZW50XG5cbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdnZXRWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ2dldFZpZXdwb3J0UmVjdCcsXG5cbiAgICBzdGFydFBlcmZSZWNvcmQ6ICdtb2JpbGVTdGFydFBlcmZSZWNvcmQnLFxuICAgIHN0b3BQZXJmUmVjb3JkOiAnbW9iaWxlU3RvcFBlcmZSZWNvcmQnLFxuXG4gICAgaW5zdGFsbENlcnRpZmljYXRlOiAnbW9iaWxlSW5zdGFsbENlcnRpZmljYXRlJyxcbiAgICBsaXN0Q2VydGlmaWNhdGVzOiAnbW9iaWxlTGlzdENlcnRpZmljYXRlcycsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcbiAgICBhY3RpdmVBcHBJbmZvOiAnbW9iaWxlR2V0QWN0aXZlQXBwSW5mbycsXG4gICAgZGV2aWNlU2NyZWVuSW5mbzogJ2dldFNjcmVlbkluZm8nLFxuXG4gICAgcHJlc3NCdXR0b246ICdtb2JpbGVQcmVzc0J1dHRvbicsXG5cbiAgICBlbnJvbGxCaW9tZXRyaWM6ICdtb2JpbGVFbnJvbGxCaW9tZXRyaWMnLFxuICAgIHNlbmRCaW9tZXRyaWNNYXRjaDogJ21vYmlsZVNlbmRCaW9tZXRyaWNNYXRjaCcsXG4gICAgaXNCaW9tZXRyaWNFbnJvbGxlZDogJ21vYmlsZUlzQmlvbWV0cmljRW5yb2xsZWQnLFxuXG4gICAgY2xlYXJLZXljaGFpbnM6ICdtb2JpbGVDbGVhcktleWNoYWlucycsXG5cbiAgICBnZXRQZXJtaXNzaW9uOiAnbW9iaWxlR2V0UGVybWlzc2lvbicsXG4gICAgc2V0UGVybWlzc2lvbjogJ21vYmlsZVNldFBlcm1pc3Npb25zJyxcbiAgICByZXNldFBlcm1pc3Npb246ICdtb2JpbGVSZXNldFBlcm1pc3Npb24nLFxuXG4gICAgZ2V0QXBwZWFyYW5jZTogJ21vYmlsZUdldEFwcGVhcmFuY2UnLFxuICAgIHNldEFwcGVhcmFuY2U6ICdtb2JpbGVTZXRBcHBlYXJhbmNlJyxcblxuICAgIHNpcmlDb21tYW5kOiAnbW9iaWxlU2lyaUNvbW1hbmQnLFxuXG4gICAgcHVzaEZpbGU6ICdtb2JpbGVQdXNoRmlsZScsXG4gICAgcHVsbEZpbGU6ICdtb2JpbGVQdWxsRmlsZScsXG4gICAgcHVsbEZvbGRlcjogJ21vYmlsZVB1bGxGb2xkZXInLFxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcbiAgICBkZWxldGVGb2xkZXI6ICdtb2JpbGVEZWxldGVGb2xkZXInLFxuXG4gICAgc3RhcnRBdWRpb1JlY29yZGluZzogJ3N0YXJ0QXVkaW9SZWNvcmRpbmcnLFxuICAgIHN0b3BBdWRpb1JlY29yZGluZzogJ3N0b3BBdWRpb1JlY29yZGluZycsXG5cbiAgICAvLyBYQ1Rlc3RcbiAgICBydW5YQ1Rlc3Q6ICdtb2JpbGVSdW5YQ1Rlc3QnLFxuICAgIGluc3RhbGxYQ1Rlc3RCdW5kbGU6ICdtb2JpbGVJbnN0YWxsWENUZXN0QnVuZGxlJyxcbiAgICBsaXN0WENUZXN0QnVuZGxlczogJ21vYmlsZUxpc3RYQ1Rlc3RCdW5kbGVzJyxcbiAgICBsaXN0WENUZXN0c0luVGVzdEJ1bmRsZTogJ21vYmlsZUxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlJyxcblxuICAgIHB1c2hOb3RpZmljYXRpb246ICdtb2JpbGVQdXNoTm90aWZpY2F0aW9uJyxcbiAgICBleHBlY3ROb3RpZmljYXRpb246ICdtb2JpbGVFeHBlY3ROb3RpZmljYXRpb24nLFxuXG4gICAgcGVyZm9ybUlvSGlkRXZlbnQ6ICdtb2JpbGVQZXJmb3JtSW9IaWRFdmVudCcsXG5cbiAgICBjb25maWd1cmVMb2NhbGl6YXRpb246ICdtb2JpbGVDb25maWd1cmVMb2NhbGl6YXRpb24nLFxuXG4gICAgcmVzZXRMb2NhdGlvblNlcnZpY2U6ICdtb2JpbGVSZXNldExvY2F0aW9uU2VydmljZScsXG5cbiAgICBzdGFydFBjYXA6ICdtb2JpbGVTdGFydFBjYXAnLFxuICAgIHN0b3BQY2FwOiAnbW9iaWxlU3RvcFBjYXAnLFxuICAgIGxpc3RDb25kaXRpb25JbmR1Y2VyczogJ21vYmlsZUxpc3RDb25kaXRpb25JbmR1Y2VycycsXG4gICAgZW5hYmxlQ29uZGl0aW9uSW5kdWNlcjogJ21vYmlsZUVuYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuICAgIGRpc2FibGVDb25kaXRpb25JbmR1Y2VyOiAnbW9iaWxlRGlzYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuICB9O1xuXG4gIGlmICghXy5oYXMoY29tbWFuZE1hcCwgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgJyR7bW9iaWxlQ29tbWFuZH0nLiBPbmx5ICR7Xy5rZXlzKGNvbW1hbmRNYXApLmpvaW4oJywgJyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbY29tbWFuZE1hcFttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxFQUFuQjs7QUFFQUEsVUFBVSxDQUFDQyxvQkFBWCxHQUFrQyxlQUFlQSxvQkFBZixDQUFxQ0MsTUFBckMsRUFBNkNDLEtBQTdDLEVBQW9EO0VBQ3BGLEtBQUtDLEdBQUwsQ0FBU0MsS0FBVCxDQUFnQiw0QkFBMkJDLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixLQUFmLENBQXNCLEVBQWpFOztFQUNBLElBQUksQ0FBQ0ssYUFBQSxDQUFLQyxRQUFMLENBQWMsS0FBS0MsWUFBbkIsQ0FBTCxFQUF1QztJQUNyQyxLQUFLTixHQUFMLENBQVNPLElBQVQsQ0FB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
@@ -24,6 +24,8 @@ var _iosFsHelpers = require("../ios-fs-helpers");
24
24
 
25
25
  var _driver = require("appium/driver");
26
26
 
27
+ var _utils = require("../utils");
28
+
27
29
  const CONTAINER_PATH_MARKER = '@';
28
30
  const CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.*)`);
29
31
  const CONTAINER_TYPE_SEPARATOR = ':';
@@ -282,6 +284,14 @@ commands.pushFile = async function pushFile(remotePath, base64Data) {
282
284
  return this.isSimulator() ? await pushFileToSimulator(this.opts.device, remotePath, base64Data) : await pushFileToRealDevice(this.opts.device, remotePath, base64Data);
283
285
  };
284
286
 
287
+ commands.mobilePushFile = async function mobilePushFile(opts = {}) {
288
+ const {
289
+ remotePath,
290
+ payload
291
+ } = (0, _utils.requireArgs)(['remotePath', 'payload'], opts);
292
+ return await this.pushFile(remotePath, payload);
293
+ };
294
+
285
295
  commands.pullFile = async function pullFile(remotePath) {
286
296
  if (remotePath.endsWith('/')) {
287
297
  throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` + `'${remotePath}' is given instead`);
@@ -290,10 +300,17 @@ commands.pullFile = async function pullFile(remotePath) {
290
300
  return this.isSimulator() ? await pullFromSimulator(this.opts.device, remotePath, true) : await pullFromRealDevice(this.opts.device, remotePath, true);
291
301
  };
292
302
 
303
+ commands.mobilePullFile = async function mobilePullFile(opts = {}) {
304
+ const {
305
+ remotePath
306
+ } = (0, _utils.requireArgs)('remotePath', opts);
307
+ return await this.pullFile(remotePath);
308
+ };
309
+
293
310
  commands.mobileDeleteFolder = async function mobileDeleteFolder(opts = {}) {
294
311
  let {
295
312
  remotePath
296
- } = opts;
313
+ } = (0, _utils.requireArgs)('remotePath', opts);
297
314
 
298
315
  if (!remotePath.endsWith('/')) {
299
316
  remotePath = `${remotePath}/`;
@@ -305,7 +322,7 @@ commands.mobileDeleteFolder = async function mobileDeleteFolder(opts = {}) {
305
322
  commands.mobileDeleteFile = async function mobileDeleteFile(opts = {}) {
306
323
  const {
307
324
  remotePath
308
- } = opts;
325
+ } = (0, _utils.requireArgs)('remotePath', opts);
309
326
 
310
327
  if (remotePath.endsWith('/')) {
311
328
  throw new _driver.errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` + `'${remotePath}' is given instead`);
@@ -322,6 +339,13 @@ commands.pullFolder = async function pullFolder(remotePath) {
322
339
  return this.isSimulator() ? await pullFromSimulator(this.opts.device, remotePath, false) : await pullFromRealDevice(this.opts.device, remotePath, false);
323
340
  };
324
341
 
342
+ commands.mobilePullFolder = async function mobilePullFolder(opts = {}) {
343
+ const {
344
+ remotePath
345
+ } = (0, _utils.requireArgs)('remotePath', opts);
346
+ return await this.pullFolder(remotePath);
347
+ };
348
+
325
349
  var _default = commands;
326
350
  exports.default = _default;
327
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQ09OVEFJTkVSX1RZUEVfU0VQQVJBVE9SIiwiQ09OVEFJTkVSX0RPQ1VNRU5UU19QQVRIIiwiT0JKRUNUX05PVF9GT1VORF9FUlJPUl9NRVNTQUdFIiwiY29tbWFuZHMiLCJ2ZXJpZnlJc1N1YlBhdGgiLCJvcmlnaW5hbFBhdGgiLCJyb290Iiwibm9ybWFsaXplZFJvb3QiLCJwYXRoIiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJkaXJuYW1lIiwic3RhcnRzV2l0aCIsIkVycm9yIiwiY3JlYXRlQWZjQ2xpZW50IiwidWRpZCIsImJ1bmRsZUlkIiwiY29udGFpbmVyVHlwZSIsInNlcnZpY2VzIiwic3RhcnRBZmNTZXJ2aWNlIiwic2VydmljZSIsInN0YXJ0SG91c2VBcnJlc3RTZXJ2aWNlIiwiaXNEb2N1bWVudHNDb250YWluZXIiLCJ2ZW5kRG9jdW1lbnRzIiwidmVuZENvbnRhaW5lciIsIl8iLCJ0b0xvd2VyIiwiY3JlYXRlU2VydmljZSIsInJlbW90ZVBhdGgiLCJ0ZXN0IiwicGF0aEluQ29udGFpbmVyIiwicGFyc2VDb250YWluZXJQYXRoIiwicmVsYXRpdmVQYXRoIiwiam9pbiIsImNvbnRhaW5lclJvb3RTdXBwbGllciIsIm1hdGNoIiwiZXhlYyIsInR5cGVTZXBhcmF0b3JQb3MiLCJpbmRleE9mIiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibG9nIiwiZGVidWciLCJpc05pbCIsImNvbnRhaW5lclJvb3QiLCJpc0Z1bmN0aW9uIiwicG9zaXgiLCJyZXNvbHZlIiwicHVzaEZpbGVUb1NpbXVsYXRvciIsImRldmljZSIsImJhc2U2NERhdGEiLCJidWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiZHN0UGF0aCIsImFwcEJ1bmRsZSIsInNpbWN0bCIsImdldEFwcENvbnRhaW5lciIsImluZm8iLCJmcyIsImV4aXN0cyIsIm1rZGlycCIsIndyaXRlRmlsZSIsImRzdEZvbGRlciIsInRlbXBEaXIiLCJvcGVuRGlyIiwiYmFzZW5hbWUiLCJhZGRNZWRpYSIsInJpbXJhZiIsInB1c2hGaWxlVG9SZWFsRGV2aWNlIiwicHVzaEZpbGUiLCJlIiwic3RhY2siLCJtZXNzYWdlIiwiY2xvc2UiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJpc1NpbXVsYXRvciIsImRlbGV0ZUZyb21TaW11bGF0b3IiLCJkZWxldGVGcm9tUmVhbERldmljZSIsInB1bGxGcm9tU2ltdWxhdG9yIiwiaXNGaWxlIiwicGF0aE9uU2VydmVyIiwic2ltUm9vdCIsImdldERpciIsImVycm9yQW5kVGhyb3ciLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInRvU3RyaW5nIiwicHVsbEZyb21SZWFsRGV2aWNlIiwiZmlsZUluZm8iLCJnZXRGaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJkZWxldGVEaXJlY3RvcnkiLCJpbmNsdWRlcyIsImVuZHNXaXRoIiwiaXNBcnJheSIsIm9wdHMiLCJtb2JpbGVEZWxldGVGb2xkZXIiLCJtb2JpbGVEZWxldGVGaWxlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtbW92ZW1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB0ZW1wRGlyLCBta2RpcnAsIHppcCwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgc2VydmljZXMgfSBmcm9tICdhcHBpdW0taW9zLWRldmljZSc7XG5pbXBvcnQgeyBwdWxsRmlsZSwgcHVsbEZvbGRlciwgcHVzaEZpbGUgfSBmcm9tICcuLi9pb3MtZnMtaGVscGVycyc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgQ09OVEFJTkVSX1BBVEhfTUFSS0VSID0gJ0AnO1xuLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9QTGRCMEcvMlxuY29uc3QgQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke0NPTlRBSU5FUl9QQVRIX01BUktFUn0oW14vXSspLyguKilgKTtcbmNvbnN0IENPTlRBSU5FUl9UWVBFX1NFUEFSQVRPUiA9ICc6JztcbmNvbnN0IENPTlRBSU5FUl9ET0NVTUVOVFNfUEFUSCA9ICdEb2N1bWVudHMnO1xuY29uc3QgT0JKRUNUX05PVF9GT1VORF9FUlJPUl9NRVNTQUdFID0gJ09CSkVDVF9OT1RfRk9VTkQnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5mdW5jdGlvbiB2ZXJpZnlJc1N1YlBhdGggKG9yaWdpbmFsUGF0aCwgcm9vdCkge1xuICBjb25zdCBub3JtYWxpemVkUm9vdCA9IHBhdGgubm9ybWFsaXplKHJvb3QpO1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKHBhdGguZGlybmFtZShvcmlnaW5hbFBhdGgpKTtcbiAgLy8gSWYgb3JpZ2luYWxQYXRoIGlzIHJvb3QsIGAvYCwgb3JpZ2luYWxQYXRoIHNob3VsZCBlcXVhbCB0byBub3JtYWxpemVkUm9vdFxuICBpZiAobm9ybWFsaXplZFJvb3QgIT09IG9yaWdpbmFsUGF0aCAmJiAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUm9vdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25vcm1hbGl6ZWRQYXRofScgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzdWJwYXRoIG9mICcke25vcm1hbGl6ZWRSb290fSdgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBZmNDbGllbnQgKHVkaWQsIGJ1bmRsZUlkLCBjb250YWluZXJUeXBlKSB7XG4gIGlmICghYnVuZGxlSWQpIHtcbiAgICByZXR1cm4gYXdhaXQgc2VydmljZXMuc3RhcnRBZmNTZXJ2aWNlKHVkaWQpO1xuICB9XG4gIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCBzZXJ2aWNlcy5zdGFydEhvdXNlQXJyZXN0U2VydmljZSh1ZGlkKTtcbiAgcmV0dXJuIGlzRG9jdW1lbnRzQ29udGFpbmVyKGNvbnRhaW5lclR5cGUpXG4gICAgPyBhd2FpdCBzZXJ2aWNlLnZlbmREb2N1bWVudHMoYnVuZGxlSWQpXG4gICAgOiBhd2FpdCBzZXJ2aWNlLnZlbmRDb250YWluZXIoYnVuZGxlSWQpO1xufVxuXG5mdW5jdGlvbiBpc0RvY3VtZW50c0NvbnRhaW5lciAoY29udGFpbmVyVHlwZSkge1xuICByZXR1cm4gXy50b0xvd2VyKGNvbnRhaW5lclR5cGUpID09PSBfLnRvTG93ZXIoQ09OVEFJTkVSX0RPQ1VNRU5UU19QQVRIKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmljZSAodWRpZCwgcmVtb3RlUGF0aCkge1xuICBpZiAoQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi50ZXN0KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge2J1bmRsZUlkLCBwYXRoSW5Db250YWluZXIsIGNvbnRhaW5lclR5cGV9ID0gYXdhaXQgcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCBjcmVhdGVBZmNDbGllbnQodWRpZCwgYnVuZGxlSWQsIGNvbnRhaW5lclR5cGUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzRG9jdW1lbnRzQ29udGFpbmVyKGNvbnRhaW5lclR5cGUpXG4gICAgICA/IHBhdGguam9pbihDT05UQUlORVJfRE9DVU1FTlRTX1BBVEgsIHBhdGhJbkNvbnRhaW5lcilcbiAgICAgIDogcGF0aEluQ29udGFpbmVyO1xuICAgIHJldHVybiB7c2VydmljZSwgcmVsYXRpdmVQYXRofTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgY3JlYXRlQWZjQ2xpZW50KHVkaWQpO1xuICAgIHJldHVybiB7c2VydmljZSwgcmVsYXRpdmVQYXRoOiByZW1vdGVQYXRofTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvbnRhaW5lck9iamVjdFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBidW5kbGVJZCAtIFRoZSBwYXJzZWQgYnVuZGxlIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoSW5Db250YWluZXIgLSBUaGUgYWJzb2x1dGUgZnVsbCBwYXRoIG9mIHRoZSBpdGVtIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBjb250YWluZXJUeXBlIC0gVGhlIGNvbnRhaW5lciB0eXBlXG4gKi9cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBwYXRoIGFuZCB0aGUgYnVuZGxlIGlkZW50aWZpZXIgZnJvbSB0aGUgZ2l2ZW4gcGF0aCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBnaXZlbiBwYXRoIHN0cmluZy4gVGhlIHN0cmluZyBzaG91bGRcbiAqIG1hdGNoIGBDT05UQUlORVJfUEFUSF9QQVRURVJOYCByZWdleHAsIG90aGVyd2lzZSBhbiBlcnJvciBpcyBnb2luZ1xuICogdG8gYmUgdGhyb3duLiBBIHZhbGlkIHN0cmluZyBleGFtcGxlOiBgQGJ1bmRsZS5pZGVudGlmaWVyOmNvbnRhaW5lcl90eXBlL3JlbGF0aXZlX3BhdGhfaW5fY29udGFpbmVyYFxuICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGNvbnRhaW5lclJvb3RTdXBwbGllciAtIEVpdGhlciBhIHN0cmluZywgdGhhdCBjb250YWluc1xuICogZnVsbCBwYXRoIHRvIHRoZSBtb3VudCByb290IGZvciByZWFsIGRldmljZXMgb3IgYSBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyB0d28gcGFyYW1ldGVyc1xuICogKGJ1bmRsZSBpZGVudGlmaWVyIGFuZCBvcHRpb25hbCBjb250YWluZXIgdHlwZSkgYW5kIHJldHVybnMgZnVsbCBwYXRoIHRvIGNvbnRhaW5lclxuICogcm9vdCBmb2xkZXIgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCBmb3IgU2ltdWxhdG9yXG4gKiBAcmV0dXJucyB7Q29udGFpbmVyT2JqZWN0fVxuICovXG5hc3luYyBmdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgsIGNvbnRhaW5lclJvb3RTdXBwbGllcikge1xuICBjb25zdCBtYXRjaCA9IENPTlRBSU5FUl9QQVRIX1BBVFRFUk4uZXhlYyhyZW1vdGVQYXRoKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwYWNrYWdlIGlkZW50aWZpZXIgYCArXG4gICAgICBgc3RhcnRzIHdpdGggJyR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfScgYW5kIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBgICtcbiAgICAgIGByZWxhdGl2ZSBwYXRoIHdpdGggYSBzaW5nbGUgc2xhc2guICcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgbGV0IFssIGJ1bmRsZUlkLCByZWxhdGl2ZVBhdGhdID0gbWF0Y2g7XG4gIGxldCBjb250YWluZXJUeXBlID0gbnVsbDtcbiAgY29uc3QgdHlwZVNlcGFyYXRvclBvcyA9IGJ1bmRsZUlkLmluZGV4T2YoQ09OVEFJTkVSX1RZUEVfU0VQQVJBVE9SKTtcbiAgLy8gV2Ugb25seSBjb25zaWRlciBjb250YWluZXIgdHlwZSBleGlzdHMgaWYgaXRzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gemVyb1xuICAvLyBub3QgY291bnRpbmcgdGhlIGNvbG9uXG4gIGlmICh0eXBlU2VwYXJhdG9yUG9zID4gMCAmJiB0eXBlU2VwYXJhdG9yUG9zIDwgYnVuZGxlSWQubGVuZ3RoIC0gMSkge1xuICAgIGNvbnRhaW5lclR5cGUgPSBidW5kbGVJZC5zdWJzdHJpbmcodHlwZVNlcGFyYXRvclBvcyArIDEpO1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkIGNvbnRhaW5lciB0eXBlOiAke2NvbnRhaW5lclR5cGV9YCk7XG4gICAgYnVuZGxlSWQgPSBidW5kbGVJZC5zdWJzdHJpbmcoMCwgdHlwZVNlcGFyYXRvclBvcyk7XG4gIH1cbiAgaWYgKF8uaXNOaWwoY29udGFpbmVyUm9vdFN1cHBsaWVyKSkge1xuICAgIGNvbnN0IHBhdGhJbkNvbnRhaW5lciA9IHJlbGF0aXZlUGF0aDtcbiAgICByZXR1cm4geyBidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyLCBjb250YWluZXJUeXBlIH07XG4gIH1cbiAgY29uc3QgY29udGFpbmVyUm9vdCA9IF8uaXNGdW5jdGlvbihjb250YWluZXJSb290U3VwcGxpZXIpXG4gICAgPyBhd2FpdCBjb250YWluZXJSb290U3VwcGxpZXIoYnVuZGxlSWQsIGNvbnRhaW5lclR5cGUpXG4gICAgOiBjb250YWluZXJSb290U3VwcGxpZXI7XG4gIGNvbnN0IHBhdGhJbkNvbnRhaW5lciA9IHBhdGgucG9zaXgucmVzb2x2ZShjb250YWluZXJSb290LCByZWxhdGl2ZVBhdGgpO1xuICB2ZXJpZnlJc1N1YlBhdGgocGF0aEluQ29udGFpbmVyLCBjb250YWluZXJSb290KTtcbiAgcmV0dXJuIHtidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyLCBjb250YWluZXJUeXBlfTtcbn1cblxuLyoqXG4gKiBTYXZlIHRoZSBnaXZlbiBiYXNlNjQgZGF0YSBjaHVuayBhcyBhIGJpbmFyeSBmaWxlIG9uIHRoZSBTaW11bGF0b3IgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGV2aWNlIC0gVGhlIGRldmljZSBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGB1ZGlkYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHJlbW90ZSBwYXRoIG9uIHRoZSBkZXZpY2UuIFRoaXMgdmFyaWFibGUgY2FuIGJlIHByZWZpeGVkIHdpdGhcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlIGlkLCBzbyB0aGVuIHRoZSBmaWxlIHdpbGwgYmUgdXBsb2FkZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29udGFpbmVyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgbWVkaWEgZm9sZGVyLCBmb3IgZXhhbXBsZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQGNvbS5teWFwcC5ibGE6ZGF0YS9SZWxhdGl2ZVBhdGhJbkNvbnRhaW5lci8xMTEucG5nJy4gVGhlICdAJyBjaGFyYWN0ZXIgYXQgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgYXJndW1lbnQgaXMgbWFuZGF0b3J5IGluIHN1Y2ggY2FzZS4gVGhlIGNvbG9uIGF0IHRoZSBlbmQgb2YgYnVuZGxlIGlkZW50aWZpZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb3B0aW9uYWwgYW5kIGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbnRhaW5lciB0eXBlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZSB2YWx1ZXMgdGhlcmUgYXJlICdhcHAnLCAnZGF0YScsICdncm91cHMnLCAnPEEgc3BlY2lmaWMgQXBwIEdyb3VwIGNvbnRhaW5lcj4nLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAnYXBwJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJlbGF0aXZlIGZvbGRlciBwYXRoIGlzIGlnbm9yZWQgaWYgdGhlIGZpbGUgaXMgZ29pbmcgdG8gYmUgdXBsb2FkZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRlZmF1bHQgbWVkaWEgZm9sZGVyIGFuZCBvbmx5IHRoZSBmaWxlIG5hbWUgaXMgY29uc2lkZXJlZCBpbXBvcnRhbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSAtIEJhc2UtNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRmlsZVRvU2ltdWxhdG9yIChkZXZpY2UsIHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpIHtcbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0RGF0YSwgJ2Jhc2U2NCcpO1xuICBpZiAoQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi50ZXN0KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge2J1bmRsZUlkLCBwYXRoSW5Db250YWluZXI6IGRzdFBhdGh9ID0gYXdhaXQgcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgsXG4gICAgICBhc3luYyAoYXBwQnVuZGxlLCBjb250YWluZXJUeXBlKSA9PiBhd2FpdCBkZXZpY2Uuc2ltY3RsLmdldEFwcENvbnRhaW5lcihhcHBCdW5kbGUsIGNvbnRhaW5lclR5cGUpKTtcbiAgICBsb2cuaW5mbyhgUGFyc2VkIGJ1bmRsZSBpZGVudGlmaWVyICcke2J1bmRsZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIGAgK1xuICAgICAgYFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7ZHN0UGF0aH0nYCk7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGF0aC5kaXJuYW1lKGRzdFBhdGgpKSkge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZGVzdGluYXRpb24gZm9sZGVyICcke3BhdGguZGlybmFtZShkc3RQYXRoKX0nIGRvZXMgbm90IGV4aXN0LiBDcmVhdGluZy4uLmApO1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZShkc3RQYXRoKSk7XG4gICAgfVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkc3RQYXRoLCBidWZmZXIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBkc3RGb2xkZXIgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGgucmVzb2x2ZShkc3RGb2xkZXIsIHBhdGguYmFzZW5hbWUocmVtb3RlUGF0aCkpO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShkc3RQYXRoLCBidWZmZXIpO1xuICAgIGF3YWl0IGRldmljZS5zaW1jdGwuYWRkTWVkaWEoZHN0UGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKGRzdEZvbGRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTYXZlIHRoZSBnaXZlbiBiYXNlNjQgZGF0YSBjaHVuayBhcyBhIGJpbmFyeSBmaWxlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGV2aWNlIC0gVGhlIGRldmljZSBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGB1ZGlkYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHJlbW90ZSBwYXRoIG9uIHRoZSBkZXZpY2UuIFRoaXMgdmFyaWFibGUgY2FuIGJlIHByZWZpeGVkIHdpdGhcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlIGlkLCBzbyB0aGVuIHRoZSBmaWxlIHdpbGwgYmUgdXBsb2FkZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29udGFpbmVyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgbWVkaWEgZm9sZGVyLiBVc2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDxhcHBfYnVuZGxlX2lkPjo8b3B0aW9uYWxfY29udGFpbmVyX3R5cGU+LzxwYXRoX3RvX3RoZV9maWxlX29yX2ZvbGRlcl9pbnNpZGVfY29udGFpbmVyPlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgdG8gcHVsbCBhIGZpbGUgb3IgYSBmb2xkZXIgZnJvbSBhbiBhcHBsaWNhdGlvbiBjb250YWluZXIgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvbmx5IHN1cHBvcnRlZCBjb250YWluZXIgdHlwZSBpcyAnZG9jdW1lbnRzJy4gSWYgdGhlIGNvbnRhaW5lciB0eXBlIGlzIG5vdCBzZXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRseSBmb3IgYSBidW5kbGUgaWQsIHRoZW4gdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIGlzIGdvaW5nIHRvIGJlIG1vdW50ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFrYSAtLWNvbnRhaW5lciBpZnVzZSBhcmd1bWVudClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBJZiBgQGNvbS5teWFwcC5ibGE6ZG9jdW1lbnRzLzExMS5wbmdgIGlzIHByb3ZpZGVkLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbiBNeSBpUGhvbmUvPGFwcCBuYW1lPmAgaW4gRmlsZXMgYXBwIHdpbGwgYmUgbW91bnRlZCBpbiB0aGUgaG9zdCBtYWNoaW5lLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NCBlbmNvZGVkIGAxMTEucG5nYCB3aWxsIGJlIHB1c2hlZCBpbnRvIGBPbiBNeSBpUGhvbmUvPGFwcCBuYW1lPi8xMTEucG5nYFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGJhc2U2NCBkZWNvZGVkIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0RGF0YSAtIEJhc2UtNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdXNoRmlsZVRvUmVhbERldmljZSAoZGV2aWNlLCByZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGNvbnN0IHtzZXJ2aWNlLCByZWxhdGl2ZVBhdGh9ID0gYXdhaXQgY3JlYXRlU2VydmljZShkZXZpY2UudWRpZCwgcmVtb3RlUGF0aCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcHVzaEZpbGUoc2VydmljZSwgcmVsYXRpdmVQYXRoLCBiYXNlNjREYXRhKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwdXNoIHRoZSBmaWxlIHRvICcke3JlbW90ZVBhdGh9Jy4gIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXJ2aWNlLmNsb3NlKCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChkZXZpY2UsIHJlbW90ZVBhdGgsIGlzU2ltdWxhdG9yKSB7XG4gIHJldHVybiBpc1NpbXVsYXRvclxuICAgID8gYXdhaXQgZGVsZXRlRnJvbVNpbXVsYXRvcihkZXZpY2UsIHJlbW90ZVBhdGgpXG4gICAgOiBhd2FpdCBkZWxldGVGcm9tUmVhbERldmljZShkZXZpY2UsIHJlbW90ZVBhdGgpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29udGVudCBvZiBnaXZlbiBmaWxlIG9yIGZvbGRlciBmcm9tIGlPUyBTaW11bGF0b3IgYW5kIHJldHVybiBpdCBhcyBiYXNlLTY0IGVuY29kZWQgc3RyaW5nLlxuICogRm9sZGVyIGNvbnRlbnQgaXMgcmVjdXJzaXZlbHkgcGFja2VkIGludG8gYSB6aXAgYXJjaGl2ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGV2aWNlIC0gVGhlIGRldmljZSBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGB1ZGlkYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gYSBmaWxlIG9yIGEgZm9sZGVyLCB3aGljaCBleGlzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyIG9uIFNpbXVsYXRvci4gVXNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8YXBwX2J1bmRsZV9pZD46PG9wdGlvbmFsX2NvbnRhaW5lcl90eXBlPi88cGF0aF90b190aGVfZmlsZV9vcl9mb2xkZXJfaW5zaWRlX2NvbnRhaW5lcj5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHRvIHB1bGwgYSBmaWxlIG9yIGEgZm9sZGVyIGZyb20gYW4gYXBwbGljYXRpb24gY29udGFpbmVyIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZSBjb250YWluZXIgdHlwZXMgYXJlICdhcHAnLCAnZGF0YScsICdncm91cHMnLCAnPEEgc3BlY2lmaWMgQXBwIEdyb3VwIGNvbnRhaW5lcj4nLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlIGlzICdhcHAnLlxuICogQHBhcmFtIHtib29sZWFufSBpc0ZpbGUgLSBXaGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpdGVtIGlzIGEgZmlsZSBvciBhIGZvbGRlclxuICogQHJldHVybnMge3N0cmluZ30gQmFzZS02NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGcm9tU2ltdWxhdG9yIChkZXZpY2UsIHJlbW90ZVBhdGgsIGlzRmlsZSkge1xuICBsZXQgcGF0aE9uU2VydmVyO1xuICBpZiAoQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi50ZXN0KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge2J1bmRsZUlkLCBwYXRoSW5Db250YWluZXI6IGRzdFBhdGh9ID0gYXdhaXQgcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgsXG4gICAgICBhc3luYyAoYXBwQnVuZGxlLCBjb250YWluZXJUeXBlKSA9PiBhd2FpdCBkZXZpY2Uuc2ltY3RsLmdldEFwcENvbnRhaW5lcihhcHBCdW5kbGUsIGNvbnRhaW5lclR5cGUpKTtcbiAgICBsb2cuaW5mbyhgUGFyc2VkIGJ1bmRsZSBpZGVudGlmaWVyICcke2J1bmRsZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIGAgK1xuICAgICAgYFdpbGwgZ2V0IHRoZSBkYXRhIGZyb20gJyR7ZHN0UGF0aH0nYCk7XG4gICAgcGF0aE9uU2VydmVyID0gZHN0UGF0aDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzaW1Sb290ID0gZGV2aWNlLmdldERpcigpO1xuICAgIHBhdGhPblNlcnZlciA9IHBhdGgucG9zaXguam9pbihzaW1Sb290LCByZW1vdGVQYXRoKTtcbiAgICB2ZXJpZnlJc1N1YlBhdGgocGF0aE9uU2VydmVyLCBzaW1Sb290KTtcbiAgICBsb2cuaW5mbyhgR290IHRoZSBmdWxsIGl0ZW0gcGF0aDogJHtwYXRoT25TZXJ2ZXJ9YCk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocGF0aE9uU2VydmVyKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgcmVtb3RlICR7aXNGaWxlID8gJ2ZpbGUnIDogJ2ZvbGRlcid9IGF0ICcke3BhdGhPblNlcnZlcn0nIGRvZXMgbm90IGV4aXN0YCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gaXNGaWxlXG4gICAgPyBhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQocGF0aE9uU2VydmVyKVxuICAgIDogYXdhaXQgemlwLnRvSW5NZW1vcnlaaXAocGF0aE9uU2VydmVyLCB7ZW5jb2RlVG9CYXNlNjQ6IHRydWV9KTtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY29udGVudCBvZiBnaXZlbiBmaWxlIG9yIGZvbGRlciBmcm9tIHRoZSByZWFsIGRldmljZSB1bmRlciB0ZXN0IGFuZCByZXR1cm4gaXQgYXMgYmFzZS02NCBlbmNvZGVkIHN0cmluZy5cbiAqIEZvbGRlciBjb250ZW50IGlzIHJlY3Vyc2l2ZWx5IHBhY2tlZCBpbnRvIGEgemlwIGFyY2hpdmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRldmljZSAtIFRoZSBkZXZpY2Ugb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBgdWRpZGAgcHJvcGVydHkgY29udGFpbmluZyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBkZXZpY2UgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHJlbW90ZSBmaWxlIG9uIHRoZSBkZXZpY2UuIFRoaXMgdmFyaWFibGUgY2FuIGJlIHByZWZpeGVkIHdpdGhcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlIGlkLCBzbyB0aGVuIHRoZSBmaWxlIHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG1lZGlhIGZvbGRlci4gVXNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8YXBwX2J1bmRsZV9pZD46PG9wdGlvbmFsX2NvbnRhaW5lcl90eXBlPi88cGF0aF90b190aGVfZmlsZV9vcl9mb2xkZXJfaW5zaWRlX2NvbnRhaW5lcj5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHRvIHB1bGwgYSBmaWxlIG9yIGEgZm9sZGVyIGZyb20gYW4gYXBwbGljYXRpb24gY29udGFpbmVyIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb25seSBzdXBwb3J0ZWQgY29udGFpbmVyIHR5cGUgaXMgJ2RvY3VtZW50cycuIElmIHRoZSBjb250YWluZXIgdHlwZSBpcyBub3Qgc2V0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0bHkgZm9yIGEgYnVuZGxlIGlkLCB0aGVuIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIGNvbnRhaW5lciBpcyBnb2luZyB0byBiZSBtb3VudGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChha2EgLS1jb250YWluZXIgaWZ1c2UgYXJndW1lbnQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gSWYgYEBjb20ubXlhcHAuYmxhOmRvY3VtZW50cy8xMTEucG5nYCBpcyBwcm92aWRlZCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgT24gTXkgaVBob25lLzxhcHAgbmFtZT5gIGluIEZpbGVzIGFwcCB3aWxsIGJlIG1vdW50ZWQgaW4gdGhlIGhvc3QgbWFjaGluZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgT24gTXkgaVBob25lLzxhcHAgbmFtZT4vMTExLnBuZ2Agd2lsIGJlIHB1bGxlZCBpbnRvIHRoZSBtb3VudGVkIGhvc3QgbWFjaGluZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBBcHBpdW0gcmV0dXJucyB0aGUgZGF0YSBhcyBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgdG8gY2xpZW50LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBAY29tLm15YXBwLmJsYTpkb2N1bWVudHMvYCBtZWFucyBgT24gTXkgaVBob25lLzxhcHAgbmFtZT5gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0ZpbGUgLSBXaGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpdGVtIGlzIGEgZmlsZSBvciBhIGZvbGRlclxuICogQHJldHVybiB7c3RyaW5nfSBCYXNlLTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgcmVtb3RlIGZpbGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVsbEZyb21SZWFsRGV2aWNlIChkZXZpY2UsIHJlbW90ZVBhdGgsIGlzRmlsZSkge1xuICBjb25zdCB7c2VydmljZSwgcmVsYXRpdmVQYXRofSA9IGF3YWl0IGNyZWF0ZVNlcnZpY2UoZGV2aWNlLnVkaWQsIHJlbW90ZVBhdGgpO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVJbmZvID0gYXdhaXQgc2VydmljZS5nZXRGaWxlSW5mbyhyZWxhdGl2ZVBhdGgpO1xuICAgIGlmIChpc0ZpbGUgJiYgZmlsZUluZm8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcmVxdWVzdGVkIHBhdGggaXMgbm90IGEgZmlsZS4gUGF0aDogJyR7cmVtb3RlUGF0aH0nYCk7XG4gICAgfVxuICAgIGlmICghaXNGaWxlICYmICFmaWxlSW5mby5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZXF1ZXN0ZWQgcGF0aCBpcyBub3QgYSBmb2xkZXIuIFBhdGg6ICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWxlSW5mby5pc0ZpbGUoKVxuICAgICAgPyAoYXdhaXQgcHVsbEZpbGUoc2VydmljZSwgcmVsYXRpdmVQYXRoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICA6IChhd2FpdCBwdWxsRm9sZGVyKHNlcnZpY2UsIHJlbGF0aXZlUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBmaWxlIG9yIGZvbGRlciBmcm9tIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGV2aWNlIC0gVGhlIGRldmljZSBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGB1ZGlkYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gYSBmaWxlIG9yIGEgZm9sZGVyLCB3aGljaCBleGlzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyIG9uIFNpbXVsYXRvci4gVXNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8YXBwX2J1bmRsZV9pZD46PG9wdGlvbmFsX2NvbnRhaW5lcl90eXBlPi88cGF0aF90b190aGVfZmlsZV9vcl9mb2xkZXJfaW5zaWRlX2NvbnRhaW5lcj5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHRvIHB1bGwgYSBmaWxlIG9yIGEgZm9sZGVyIGZyb20gYW4gYXBwbGljYXRpb24gY29udGFpbmVyIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZSBjb250YWluZXIgdHlwZXMgYXJlICdhcHAnLCAnZGF0YScsICdncm91cHMnLCAnPEEgc3BlY2lmaWMgQXBwIEdyb3VwIGNvbnRhaW5lcj4nLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlIGlzICdhcHAnLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVGcm9tU2ltdWxhdG9yIChkZXZpY2UsIHJlbW90ZVBhdGgpIHtcbiAgbGV0IHBhdGhPblNlcnZlcjtcbiAgaWYgKENPTlRBSU5FUl9QQVRIX1BBVFRFUk4udGVzdChyZW1vdGVQYXRoKSkge1xuICAgIGNvbnN0IHtidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyOiBkc3RQYXRofSA9IGF3YWl0IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoLFxuICAgICAgYXN5bmMgKGFwcEJ1bmRsZSwgY29udGFpbmVyVHlwZSkgPT4gYXdhaXQgZGV2aWNlLnNpbWN0bC5nZXRBcHBDb250YWluZXIoYXBwQnVuZGxlLCBjb250YWluZXJUeXBlKSk7XG4gICAgbG9nLmluZm8oYFBhcnNlZCBidW5kbGUgaWRlbnRpZmllciAnJHtidW5kbGVJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgIGAnJHtkc3RQYXRofScgd2lsbCBiZSBkZWxldGVkYCk7XG4gICAgcGF0aE9uU2VydmVyID0gZHN0UGF0aDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzaW1Sb290ID0gZGV2aWNlLmdldERpcigpO1xuICAgIHBhdGhPblNlcnZlciA9IHBhdGgucG9zaXguam9pbihzaW1Sb290LCByZW1vdGVQYXRoKTtcbiAgICB2ZXJpZnlJc1N1YlBhdGgocGF0aE9uU2VydmVyLCBzaW1Sb290KTtcbiAgICBsb2cuaW5mbyhgR290IHRoZSBmdWxsIHBhdGg6ICR7cGF0aE9uU2VydmVyfWApO1xuICB9XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBhdGhPblNlcnZlcikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgcmVtb3RlIHBhdGggYXQgJyR7cGF0aE9uU2VydmVyfScgZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxuICBhd2FpdCBmcy5yaW1yYWYocGF0aE9uU2VydmVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGZpbGUgb3IgZm9sZGVyIGZyb20gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXZpY2UgLSBUaGUgZGV2aWNlIG9iamVjdCwgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgYHVkaWRgIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgZGV2aWNlIElELlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byBhbiBleGlzdGluZyByZW1vdGUgZmlsZSBvbiB0aGUgZGV2aWNlLiBUaGlzIHZhcmlhYmxlIGNhbiBiZSBwcmVmaXhlZCB3aXRoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSBpZCwgc28gdGhlbiB0aGUgZmlsZSB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjb250YWluZXIgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBtZWRpYSBmb2xkZXIuIFVzZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPGFwcF9idW5kbGVfaWQ+OjxvcHRpb25hbF9jb250YWluZXJfdHlwZT4vPHBhdGhfdG9fdGhlX2ZpbGVfb3JfZm9sZGVyX2luc2lkZV9jb250YWluZXI+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCB0byBwdWxsIGEgZmlsZSBvciBhIGZvbGRlciBmcm9tIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG9ubHkgc3VwcG9ydGVkIGNvbnRhaW5lciB0eXBlIGlzICdkb2N1bWVudHMnLiBJZiB0aGUgY29udGFpbmVyIHR5cGUgaXMgbm90IHNldFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5IGZvciBhIGJ1bmRsZSBpZCwgdGhlbiB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250YWluZXIgaXMgZ29pbmcgdG8gYmUgbW91bnRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWthIC0tY29udGFpbmVyIGlmdXNlIGFyZ3VtZW50KVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIElmIGBAY29tLm15YXBwLmJsYTpkb2N1bWVudHMvMTExLnBuZ2AgaXMgcHJvdmlkZWQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+YCBpbiBGaWxlcyBhcHAgd2lsbCBiZSBtb3VudGVkIGluIHRoZSBob3N0IG1hY2hpbmUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+LzExMS5wbmdgIHdpbCBiZSBwdWxsZWQgaW50byB0aGUgbW91bnRlZCBob3N0IG1hY2hpbmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQXBwaXVtIHJldHVybnMgdGhlIGRhdGEgYXMgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHRvIGNsaWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQGNvbS5teWFwcC5ibGE6ZG9jdW1lbnRzL2AgbWVhbnMgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+YC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRnJvbVJlYWxEZXZpY2UgKGRldmljZSwgcmVtb3RlUGF0aCkge1xuICBjb25zdCB7IHNlcnZpY2UsIHJlbGF0aXZlUGF0aCB9ID0gYXdhaXQgY3JlYXRlU2VydmljZShkZXZpY2UudWRpZCwgcmVtb3RlUGF0aCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVEaXJlY3RvcnkocmVsYXRpdmVQYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoT0JKRUNUX05PVF9GT1VORF9FUlJPUl9NRVNTQUdFKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICcke3JlbW90ZVBhdGh9JyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZGV2aWNlYCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH0gZmluYWxseSB7XG4gICAgc2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cbmNvbW1hbmRzLnB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVzaEZpbGUgKHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiB0aGlzLmlzU2ltdWxhdG9yKClcbiAgICA/IGF3YWl0IHB1c2hGaWxlVG9TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgYmFzZTY0RGF0YSlcbiAgICA6IGF3YWl0IHB1c2hGaWxlVG9SZWFsRGV2aWNlKHRoaXMub3B0cy5kZXZpY2UsIHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpO1xufTtcblxuY29tbWFuZHMucHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdWxsRmlsZSAocmVtb3RlUGF0aCkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSXQgaXMgZXhwZWN0ZWQgdGhhdCByZW1vdGUgcGF0aCBwb2ludHMgdG8gYSBmaWxlIGFuZCBub3QgdG8gYSBmb2xkZXIuIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaXNTaW11bGF0b3IoKVxuICAgID8gYXdhaXQgcHVsbEZyb21TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgdHJ1ZSlcbiAgICA6IGF3YWl0IHB1bGxGcm9tUmVhbERldmljZSh0aGlzLm9wdHMuZGV2aWNlLCByZW1vdGVQYXRoLCB0cnVlKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURlbGV0ZUZvbGRlciAob3B0cyA9IHt9KSB7XG4gIGxldCB7cmVtb3RlUGF0aH0gPSBvcHRzO1xuICBpZiAoIXJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHJlbW90ZVBhdGggPSBgJHtyZW1vdGVQYXRofS9gO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgdGhpcy5pc1NpbXVsYXRvcigpKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgdGhpcy5pc1NpbXVsYXRvcigpKTtcbn07XG5cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGlmICghcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgcmVtb3RlUGF0aCA9IGAke3JlbW90ZVBhdGh9L2A7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaXNTaW11bGF0b3IoKVxuICAgID8gYXdhaXQgcHVsbEZyb21TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgZmFsc2UpXG4gICAgOiBhd2FpdCBwdWxsRnJvbVJlYWxEZXZpY2UodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgZmFsc2UpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMsIC8qIGZvciB0ZXN0aW5nICovIHBhcnNlQ29udGFpbmVyUGF0aCB9O1xuZXhwb3J0IGRlZmF1bHQg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
351
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT05UQUlORVJfUEFUSF9NQVJLRVIiLCJDT05UQUlORVJfUEFUSF9QQVRURVJOIiwiUmVnRXhwIiwiQ09OVEFJTkVSX1RZUEVfU0VQQVJBVE9SIiwiQ09OVEFJTkVSX0RPQ1VNRU5UU19QQVRIIiwiT0JKRUNUX05PVF9GT1VORF9FUlJPUl9NRVNTQUdFIiwiY29tbWFuZHMiLCJ2ZXJpZnlJc1N1YlBhdGgiLCJvcmlnaW5hbFBhdGgiLCJyb290Iiwibm9ybWFsaXplZFJvb3QiLCJwYXRoIiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJkaXJuYW1lIiwic3RhcnRzV2l0aCIsIkVycm9yIiwiY3JlYXRlQWZjQ2xpZW50IiwidWRpZCIsImJ1bmRsZUlkIiwiY29udGFpbmVyVHlwZSIsInNlcnZpY2VzIiwic3RhcnRBZmNTZXJ2aWNlIiwic2VydmljZSIsInN0YXJ0SG91c2VBcnJlc3RTZXJ2aWNlIiwiaXNEb2N1bWVudHNDb250YWluZXIiLCJ2ZW5kRG9jdW1lbnRzIiwidmVuZENvbnRhaW5lciIsIl8iLCJ0b0xvd2VyIiwiY3JlYXRlU2VydmljZSIsInJlbW90ZVBhdGgiLCJ0ZXN0IiwicGF0aEluQ29udGFpbmVyIiwicGFyc2VDb250YWluZXJQYXRoIiwicmVsYXRpdmVQYXRoIiwiam9pbiIsImNvbnRhaW5lclJvb3RTdXBwbGllciIsIm1hdGNoIiwiZXhlYyIsInR5cGVTZXBhcmF0b3JQb3MiLCJpbmRleE9mIiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibG9nIiwiZGVidWciLCJpc05pbCIsImNvbnRhaW5lclJvb3QiLCJpc0Z1bmN0aW9uIiwicG9zaXgiLCJyZXNvbHZlIiwicHVzaEZpbGVUb1NpbXVsYXRvciIsImRldmljZSIsImJhc2U2NERhdGEiLCJidWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiZHN0UGF0aCIsImFwcEJ1bmRsZSIsInNpbWN0bCIsImdldEFwcENvbnRhaW5lciIsImluZm8iLCJmcyIsImV4aXN0cyIsIm1rZGlycCIsIndyaXRlRmlsZSIsImRzdEZvbGRlciIsInRlbXBEaXIiLCJvcGVuRGlyIiwiYmFzZW5hbWUiLCJhZGRNZWRpYSIsInJpbXJhZiIsInB1c2hGaWxlVG9SZWFsRGV2aWNlIiwicHVzaEZpbGUiLCJlIiwic3RhY2siLCJtZXNzYWdlIiwiY2xvc2UiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJpc1NpbXVsYXRvciIsImRlbGV0ZUZyb21TaW11bGF0b3IiLCJkZWxldGVGcm9tUmVhbERldmljZSIsInB1bGxGcm9tU2ltdWxhdG9yIiwiaXNGaWxlIiwicGF0aE9uU2VydmVyIiwic2ltUm9vdCIsImdldERpciIsImVycm9yQW5kVGhyb3ciLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInRvU3RyaW5nIiwicHVsbEZyb21SZWFsRGV2aWNlIiwiZmlsZUluZm8iLCJnZXRGaWxlSW5mbyIsImlzRGlyZWN0b3J5IiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJkZWxldGVEaXJlY3RvcnkiLCJpbmNsdWRlcyIsImVuZHNXaXRoIiwiaXNBcnJheSIsIm9wdHMiLCJtb2JpbGVQdXNoRmlsZSIsInBheWxvYWQiLCJyZXF1aXJlQXJncyIsIm1vYmlsZVB1bGxGaWxlIiwibW9iaWxlRGVsZXRlRm9sZGVyIiwibW9iaWxlRGVsZXRlRmlsZSIsIm1vYmlsZVB1bGxGb2xkZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZmlsZS1tb3ZlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIG1rZGlycCwgemlwLCB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBzZXJ2aWNlcyB9IGZyb20gJ2FwcGl1bS1pb3MtZGV2aWNlJztcbmltcG9ydCB7IHB1bGxGaWxlLCBwdWxsRm9sZGVyLCBwdXNoRmlsZSB9IGZyb20gJy4uL2lvcy1mcy1oZWxwZXJzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IENPTlRBSU5FUl9QQVRIX01BUktFUiA9ICdAJztcbi8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvUExkQjBHLzJcbmNvbnN0IENPTlRBSU5FUl9QQVRIX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtDT05UQUlORVJfUEFUSF9NQVJLRVJ9KFteL10rKS8oLiopYCk7XG5jb25zdCBDT05UQUlORVJfVFlQRV9TRVBBUkFUT1IgPSAnOic7XG5jb25zdCBDT05UQUlORVJfRE9DVU1FTlRTX1BBVEggPSAnRG9jdW1lbnRzJztcbmNvbnN0IE9CSkVDVF9OT1RfRk9VTkRfRVJST1JfTUVTU0FHRSA9ICdPQkpFQ1RfTk9UX0ZPVU5EJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuZnVuY3Rpb24gdmVyaWZ5SXNTdWJQYXRoIChvcmlnaW5hbFBhdGgsIHJvb3QpIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJvb3QgPSBwYXRoLm5vcm1hbGl6ZShyb290KTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShwYXRoLmRpcm5hbWUob3JpZ2luYWxQYXRoKSk7XG4gIC8vIElmIG9yaWdpbmFsUGF0aCBpcyByb290LCBgL2AsIG9yaWdpbmFsUGF0aCBzaG91bGQgZXF1YWwgdG8gbm9ybWFsaXplZFJvb3RcbiAgaWYgKG5vcm1hbGl6ZWRSb290ICE9PSBvcmlnaW5hbFBhdGggJiYgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtub3JtYWxpemVkUGF0aH0nIGlzIGV4cGVjdGVkIHRvIGJlIGEgc3VicGF0aCBvZiAnJHtub3JtYWxpemVkUm9vdH0nYCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQWZjQ2xpZW50ICh1ZGlkLCBidW5kbGVJZCwgY29udGFpbmVyVHlwZSkge1xuICBpZiAoIWJ1bmRsZUlkKSB7XG4gICAgcmV0dXJuIGF3YWl0IHNlcnZpY2VzLnN0YXJ0QWZjU2VydmljZSh1ZGlkKTtcbiAgfVxuICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgc2VydmljZXMuc3RhcnRIb3VzZUFycmVzdFNlcnZpY2UodWRpZCk7XG4gIHJldHVybiBpc0RvY3VtZW50c0NvbnRhaW5lcihjb250YWluZXJUeXBlKVxuICAgID8gYXdhaXQgc2VydmljZS52ZW5kRG9jdW1lbnRzKGJ1bmRsZUlkKVxuICAgIDogYXdhaXQgc2VydmljZS52ZW5kQ29udGFpbmVyKGJ1bmRsZUlkKTtcbn1cblxuZnVuY3Rpb24gaXNEb2N1bWVudHNDb250YWluZXIgKGNvbnRhaW5lclR5cGUpIHtcbiAgcmV0dXJuIF8udG9Mb3dlcihjb250YWluZXJUeXBlKSA9PT0gXy50b0xvd2VyKENPTlRBSU5FUl9ET0NVTUVOVFNfUEFUSCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2UgKHVkaWQsIHJlbW90ZVBhdGgpIHtcbiAgaWYgKENPTlRBSU5FUl9QQVRIX1BBVFRFUk4udGVzdChyZW1vdGVQYXRoKSkge1xuICAgIGNvbnN0IHtidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyLCBjb250YWluZXJUeXBlfSA9IGF3YWl0IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgY3JlYXRlQWZjQ2xpZW50KHVkaWQsIGJ1bmRsZUlkLCBjb250YWluZXJUeXBlKTtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc0RvY3VtZW50c0NvbnRhaW5lcihjb250YWluZXJUeXBlKVxuICAgICAgPyBwYXRoLmpvaW4oQ09OVEFJTkVSX0RPQ1VNRU5UU19QQVRILCBwYXRoSW5Db250YWluZXIpXG4gICAgICA6IHBhdGhJbkNvbnRhaW5lcjtcbiAgICByZXR1cm4ge3NlcnZpY2UsIHJlbGF0aXZlUGF0aH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2VydmljZSA9IGF3YWl0IGNyZWF0ZUFmY0NsaWVudCh1ZGlkKTtcbiAgICByZXR1cm4ge3NlcnZpY2UsIHJlbGF0aXZlUGF0aDogcmVtb3RlUGF0aH07XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb250YWluZXJPYmplY3RcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWQgLSBUaGUgcGFyc2VkIGJ1bmRsZSBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aEluQ29udGFpbmVyIC0gVGhlIGFic29sdXRlIGZ1bGwgcGF0aCBvZiB0aGUgaXRlbSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gY29udGFpbmVyVHlwZSAtIFRoZSBjb250YWluZXIgdHlwZVxuICovXG5cbi8qKlxuICogUGFyc2VzIHRoZSBhY3R1YWwgcGF0aCBhbmQgdGhlIGJ1bmRsZSBpZGVudGlmaWVyIGZyb20gdGhlIGdpdmVuIHBhdGggc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgZ2l2ZW4gcGF0aCBzdHJpbmcuIFRoZSBzdHJpbmcgc2hvdWxkXG4gKiBtYXRjaCBgQ09OVEFJTkVSX1BBVEhfUEFUVEVSTmAgcmVnZXhwLCBvdGhlcndpc2UgYW4gZXJyb3IgaXMgZ29pbmdcbiAqIHRvIGJlIHRocm93bi4gQSB2YWxpZCBzdHJpbmcgZXhhbXBsZTogYEBidW5kbGUuaWRlbnRpZmllcjpjb250YWluZXJfdHlwZS9yZWxhdGl2ZV9wYXRoX2luX2NvbnRhaW5lcmBcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBjb250YWluZXJSb290U3VwcGxpZXIgLSBFaXRoZXIgYSBzdHJpbmcsIHRoYXQgY29udGFpbnNcbiAqIGZ1bGwgcGF0aCB0byB0aGUgbW91bnQgcm9vdCBmb3IgcmVhbCBkZXZpY2VzIG9yIGEgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnNcbiAqIChidW5kbGUgaWRlbnRpZmllciBhbmQgb3B0aW9uYWwgY29udGFpbmVyIHR5cGUpIGFuZCByZXR1cm5zIGZ1bGwgcGF0aCB0byBjb250YWluZXJcbiAqIHJvb3QgZm9sZGVyIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgZm9yIFNpbXVsYXRvclxuICogQHJldHVybnMge0NvbnRhaW5lck9iamVjdH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VDb250YWluZXJQYXRoIChyZW1vdGVQYXRoLCBjb250YWluZXJSb290U3VwcGxpZXIpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcGFja2FnZSBpZGVudGlmaWVyIGAgK1xuICAgICAgYHN0YXJ0cyB3aXRoICcke0NPTlRBSU5FUl9QQVRIX01BUktFUn0nIGFuZCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgYCArXG4gICAgICBgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc2luZ2xlIHNsYXNoLiAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCBbLCBidW5kbGVJZCwgcmVsYXRpdmVQYXRoXSA9IG1hdGNoO1xuICBsZXQgY29udGFpbmVyVHlwZSA9IG51bGw7XG4gIGNvbnN0IHR5cGVTZXBhcmF0b3JQb3MgPSBidW5kbGVJZC5pbmRleE9mKENPTlRBSU5FUl9UWVBFX1NFUEFSQVRPUik7XG4gIC8vIFdlIG9ubHkgY29uc2lkZXIgY29udGFpbmVyIHR5cGUgZXhpc3RzIGlmIGl0cyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgLy8gbm90IGNvdW50aW5nIHRoZSBjb2xvblxuICBpZiAodHlwZVNlcGFyYXRvclBvcyA+IDAgJiYgdHlwZVNlcGFyYXRvclBvcyA8IGJ1bmRsZUlkLmxlbmd0aCAtIDEpIHtcbiAgICBjb250YWluZXJUeXBlID0gYnVuZGxlSWQuc3Vic3RyaW5nKHR5cGVTZXBhcmF0b3JQb3MgKyAxKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCBjb250YWluZXIgdHlwZTogJHtjb250YWluZXJUeXBlfWApO1xuICAgIGJ1bmRsZUlkID0gYnVuZGxlSWQuc3Vic3RyaW5nKDAsIHR5cGVTZXBhcmF0b3JQb3MpO1xuICB9XG4gIGlmIChfLmlzTmlsKGNvbnRhaW5lclJvb3RTdXBwbGllcikpIHtcbiAgICBjb25zdCBwYXRoSW5Db250YWluZXIgPSByZWxhdGl2ZVBhdGg7XG4gICAgcmV0dXJuIHsgYnVuZGxlSWQsIHBhdGhJbkNvbnRhaW5lciwgY29udGFpbmVyVHlwZSB9O1xuICB9XG4gIGNvbnN0IGNvbnRhaW5lclJvb3QgPSBfLmlzRnVuY3Rpb24oY29udGFpbmVyUm9vdFN1cHBsaWVyKVxuICAgID8gYXdhaXQgY29udGFpbmVyUm9vdFN1cHBsaWVyKGJ1bmRsZUlkLCBjb250YWluZXJUeXBlKVxuICAgIDogY29udGFpbmVyUm9vdFN1cHBsaWVyO1xuICBjb25zdCBwYXRoSW5Db250YWluZXIgPSBwYXRoLnBvc2l4LnJlc29sdmUoY29udGFpbmVyUm9vdCwgcmVsYXRpdmVQYXRoKTtcbiAgdmVyaWZ5SXNTdWJQYXRoKHBhdGhJbkNvbnRhaW5lciwgY29udGFpbmVyUm9vdCk7XG4gIHJldHVybiB7YnVuZGxlSWQsIHBhdGhJbkNvbnRhaW5lciwgY29udGFpbmVyVHlwZX07XG59XG5cbi8qKlxuICogU2F2ZSB0aGUgZ2l2ZW4gYmFzZTY0IGRhdGEgY2h1bmsgYXMgYSBiaW5hcnkgZmlsZSBvbiB0aGUgU2ltdWxhdG9yIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRldmljZSAtIFRoZSBkZXZpY2Ugb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBgdWRpZGAgcHJvcGVydHkgY29udGFpbmluZyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBkZXZpY2UgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSByZW1vdGUgcGF0aCBvbiB0aGUgZGV2aWNlLiBUaGlzIHZhcmlhYmxlIGNhbiBiZSBwcmVmaXhlZCB3aXRoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSBpZCwgc28gdGhlbiB0aGUgZmlsZSB3aWxsIGJlIHVwbG9hZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG1lZGlhIGZvbGRlciwgZm9yIGV4YW1wbGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Bjb20ubXlhcHAuYmxhOmRhdGEvUmVsYXRpdmVQYXRoSW5Db250YWluZXIvMTExLnBuZycuIFRoZSAnQCcgY2hhcmFjdGVyIGF0IHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGFyZ3VtZW50IGlzIG1hbmRhdG9yeSBpbiBzdWNoIGNhc2UuIFRoZSBjb2xvbiBhdCB0aGUgZW5kIG9mIGJ1bmRsZSBpZGVudGlmaWVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9wdGlvbmFsIGFuZCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSBjb250YWluZXIgdHlwZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgdmFsdWVzIHRoZXJlIGFyZSAnYXBwJywgJ2RhdGEnLCAnZ3JvdXBzJywgJzxBIHNwZWNpZmljIEFwcCBHcm91cCBjb250YWluZXI+Jy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ2FwcCcuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWxhdGl2ZSBmb2xkZXIgcGF0aCBpcyBpZ25vcmVkIGlmIHRoZSBmaWxlIGlzIGdvaW5nIHRvIGJlIHVwbG9hZGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkZWZhdWx0IG1lZGlhIGZvbGRlciBhbmQgb25seSB0aGUgZmlsZSBuYW1lIGlzIGNvbnNpZGVyZWQgaW1wb3J0YW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgLSBCYXNlLTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVzaEZpbGVUb1NpbXVsYXRvciAoZGV2aWNlLCByZW1vdGVQYXRoLCBiYXNlNjREYXRhKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsICdiYXNlNjQnKTtcbiAgaWYgKENPTlRBSU5FUl9QQVRIX1BBVFRFUk4udGVzdChyZW1vdGVQYXRoKSkge1xuICAgIGNvbnN0IHtidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyOiBkc3RQYXRofSA9IGF3YWl0IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoLFxuICAgICAgYXN5bmMgKGFwcEJ1bmRsZSwgY29udGFpbmVyVHlwZSkgPT4gYXdhaXQgZGV2aWNlLnNpbWN0bC5nZXRBcHBDb250YWluZXIoYXBwQnVuZGxlLCBjb250YWluZXJUeXBlKSk7XG4gICAgbG9nLmluZm8oYFBhcnNlZCBidW5kbGUgaWRlbnRpZmllciAnJHtidW5kbGVJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgIGBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke2RzdFBhdGh9J2ApO1xuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKHBhdGguZGlybmFtZShkc3RQYXRoKSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlIGRlc3RpbmF0aW9uIGZvbGRlciAnJHtwYXRoLmRpcm5hbWUoZHN0UGF0aCl9JyBkb2VzIG5vdCBleGlzdC4gQ3JlYXRpbmcuLi5gKTtcbiAgICAgIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUoZHN0UGF0aCkpO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZHN0UGF0aCwgYnVmZmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZHN0Rm9sZGVyID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZHN0Rm9sZGVyLCBwYXRoLmJhc2VuYW1lKHJlbW90ZVBhdGgpKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZHN0UGF0aCwgYnVmZmVyKTtcbiAgICBhd2FpdCBkZXZpY2Uuc2ltY3RsLmFkZE1lZGlhKGRzdFBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihkc3RGb2xkZXIpO1xuICB9XG59XG5cbi8qKlxuICogU2F2ZSB0aGUgZ2l2ZW4gYmFzZTY0IGRhdGEgY2h1bmsgYXMgYSBiaW5hcnkgZmlsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRldmljZSAtIFRoZSBkZXZpY2Ugb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBgdWRpZGAgcHJvcGVydHkgY29udGFpbmluZyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBkZXZpY2UgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSByZW1vdGUgcGF0aCBvbiB0aGUgZGV2aWNlLiBUaGlzIHZhcmlhYmxlIGNhbiBiZSBwcmVmaXhlZCB3aXRoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSBpZCwgc28gdGhlbiB0aGUgZmlsZSB3aWxsIGJlIHVwbG9hZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG1lZGlhIGZvbGRlci4gVXNlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8YXBwX2J1bmRsZV9pZD46PG9wdGlvbmFsX2NvbnRhaW5lcl90eXBlPi88cGF0aF90b190aGVfZmlsZV9vcl9mb2xkZXJfaW5zaWRlX2NvbnRhaW5lcj5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IHRvIHB1bGwgYSBmaWxlIG9yIGEgZm9sZGVyIGZyb20gYW4gYXBwbGljYXRpb24gY29udGFpbmVyIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb25seSBzdXBwb3J0ZWQgY29udGFpbmVyIHR5cGUgaXMgJ2RvY3VtZW50cycuIElmIHRoZSBjb250YWluZXIgdHlwZSBpcyBub3Qgc2V0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0bHkgZm9yIGEgYnVuZGxlIGlkLCB0aGVuIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIGNvbnRhaW5lciBpcyBnb2luZyB0byBiZSBtb3VudGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChha2EgLS1jb250YWluZXIgaWZ1c2UgYXJndW1lbnQpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZy4gSWYgYEBjb20ubXlhcHAuYmxhOmRvY3VtZW50cy8xMTEucG5nYCBpcyBwcm92aWRlZCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgT24gTXkgaVBob25lLzxhcHAgbmFtZT5gIGluIEZpbGVzIGFwcCB3aWxsIGJlIG1vdW50ZWQgaW4gdGhlIGhvc3QgbWFjaGluZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlNjQgZW5jb2RlZCBgMTExLnBuZ2Agd2lsbCBiZSBwdXNoZWQgaW50byBgT24gTXkgaVBob25lLzxhcHAgbmFtZT4vMTExLnBuZ2BcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBiYXNlNjQgZGVjb2RlZCBkYXRhLlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgLSBCYXNlLTY0IGVuY29kZWQgY29udGVudCBvZiB0aGUgZmlsZSB0byBiZSB1cGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHVzaEZpbGVUb1JlYWxEZXZpY2UgKGRldmljZSwgcmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBjb25zdCB7c2VydmljZSwgcmVsYXRpdmVQYXRofSA9IGF3YWl0IGNyZWF0ZVNlcnZpY2UoZGV2aWNlLnVkaWQsIHJlbW90ZVBhdGgpO1xuICB0cnkge1xuICAgIGF3YWl0IHB1c2hGaWxlKHNlcnZpY2UsIHJlbGF0aXZlUGF0aCwgYmFzZTY0RGF0YSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHVzaCB0aGUgZmlsZSB0byAnJHtyZW1vdGVQYXRofScuICBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2VydmljZS5jbG9zZSgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZpbGVPckZvbGRlciAoZGV2aWNlLCByZW1vdGVQYXRoLCBpc1NpbXVsYXRvcikge1xuICByZXR1cm4gaXNTaW11bGF0b3JcbiAgICA/IGF3YWl0IGRlbGV0ZUZyb21TaW11bGF0b3IoZGV2aWNlLCByZW1vdGVQYXRoKVxuICAgIDogYXdhaXQgZGVsZXRlRnJvbVJlYWxEZXZpY2UoZGV2aWNlLCByZW1vdGVQYXRoKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNvbnRlbnQgb2YgZ2l2ZW4gZmlsZSBvciBmb2xkZXIgZnJvbSBpT1MgU2ltdWxhdG9yIGFuZCByZXR1cm4gaXQgYXMgYmFzZS02NCBlbmNvZGVkIHN0cmluZy5cbiAqIEZvbGRlciBjb250ZW50IGlzIHJlY3Vyc2l2ZWx5IHBhY2tlZCBpbnRvIGEgemlwIGFyY2hpdmUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRldmljZSAtIFRoZSBkZXZpY2Ugb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBgdWRpZGAgcHJvcGVydHkgY29udGFpbmluZyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBkZXZpY2UgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBwYXRoIHRvIGEgZmlsZSBvciBhIGZvbGRlciwgd2hpY2ggZXhpc3RzIGluIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvbiBTaW11bGF0b3IuIFVzZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPGFwcF9idW5kbGVfaWQ+OjxvcHRpb25hbF9jb250YWluZXJfdHlwZT4vPHBhdGhfdG9fdGhlX2ZpbGVfb3JfZm9sZGVyX2luc2lkZV9jb250YWluZXI+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCB0byBwdWxsIGEgZmlsZSBvciBhIGZvbGRlciBmcm9tIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgY29udGFpbmVyIHR5cGVzIGFyZSAnYXBwJywgJ2RhdGEnLCAnZ3JvdXBzJywgJzxBIHNwZWNpZmljIEFwcCBHcm91cCBjb250YWluZXI+Jy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZSBpcyAnYXBwJy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGaWxlIC0gV2hldGhlciB0aGUgZGVzdGluYXRpb24gaXRlbSBpcyBhIGZpbGUgb3IgYSBmb2xkZXJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2UtNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwdWxsRnJvbVNpbXVsYXRvciAoZGV2aWNlLCByZW1vdGVQYXRoLCBpc0ZpbGUpIHtcbiAgbGV0IHBhdGhPblNlcnZlcjtcbiAgaWYgKENPTlRBSU5FUl9QQVRIX1BBVFRFUk4udGVzdChyZW1vdGVQYXRoKSkge1xuICAgIGNvbnN0IHtidW5kbGVJZCwgcGF0aEluQ29udGFpbmVyOiBkc3RQYXRofSA9IGF3YWl0IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoLFxuICAgICAgYXN5bmMgKGFwcEJ1bmRsZSwgY29udGFpbmVyVHlwZSkgPT4gYXdhaXQgZGV2aWNlLnNpbWN0bC5nZXRBcHBDb250YWluZXIoYXBwQnVuZGxlLCBjb250YWluZXJUeXBlKSk7XG4gICAgbG9nLmluZm8oYFBhcnNlZCBidW5kbGUgaWRlbnRpZmllciAnJHtidW5kbGVJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBgICtcbiAgICAgIGBXaWxsIGdldCB0aGUgZGF0YSBmcm9tICcke2RzdFBhdGh9J2ApO1xuICAgIHBhdGhPblNlcnZlciA9IGRzdFBhdGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2ltUm9vdCA9IGRldmljZS5nZXREaXIoKTtcbiAgICBwYXRoT25TZXJ2ZXIgPSBwYXRoLnBvc2l4LmpvaW4oc2ltUm9vdCwgcmVtb3RlUGF0aCk7XG4gICAgdmVyaWZ5SXNTdWJQYXRoKHBhdGhPblNlcnZlciwgc2ltUm9vdCk7XG4gICAgbG9nLmluZm8oYEdvdCB0aGUgZnVsbCBpdGVtIHBhdGg6ICR7cGF0aE9uU2VydmVyfWApO1xuICB9XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBhdGhPblNlcnZlcikpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIHJlbW90ZSAke2lzRmlsZSA/ICdmaWxlJyA6ICdmb2xkZXInfSBhdCAnJHtwYXRoT25TZXJ2ZXJ9JyBkb2VzIG5vdCBleGlzdGApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGlzRmlsZVxuICAgID8gYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KHBhdGhPblNlcnZlcilcbiAgICA6IGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHBhdGhPblNlcnZlciwge2VuY29kZVRvQmFzZTY0OiB0cnVlfSk7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNvbnRlbnQgb2YgZ2l2ZW4gZmlsZSBvciBmb2xkZXIgZnJvbSB0aGUgcmVhbCBkZXZpY2UgdW5kZXIgdGVzdCBhbmQgcmV0dXJuIGl0IGFzIGJhc2UtNjQgZW5jb2RlZCBzdHJpbmcuXG4gKiBGb2xkZXIgY29udGVudCBpcyByZWN1cnNpdmVseSBwYWNrZWQgaW50byBhIHppcCBhcmNoaXZlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXZpY2UgLSBUaGUgZGV2aWNlIG9iamVjdCwgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgYHVkaWRgIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgZGV2aWNlIElELlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byBhbiBleGlzdGluZyByZW1vdGUgZmlsZSBvbiB0aGUgZGV2aWNlLiBUaGlzIHZhcmlhYmxlIGNhbiBiZSBwcmVmaXhlZCB3aXRoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSBpZCwgc28gdGhlbiB0aGUgZmlsZSB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjb250YWluZXIgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBtZWRpYSBmb2xkZXIuIFVzZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPGFwcF9idW5kbGVfaWQ+OjxvcHRpb25hbF9jb250YWluZXJfdHlwZT4vPHBhdGhfdG9fdGhlX2ZpbGVfb3JfZm9sZGVyX2luc2lkZV9jb250YWluZXI+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCB0byBwdWxsIGEgZmlsZSBvciBhIGZvbGRlciBmcm9tIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG9ubHkgc3VwcG9ydGVkIGNvbnRhaW5lciB0eXBlIGlzICdkb2N1bWVudHMnLiBJZiB0aGUgY29udGFpbmVyIHR5cGUgaXMgbm90IHNldFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdGx5IGZvciBhIGJ1bmRsZSBpZCwgdGhlbiB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250YWluZXIgaXMgZ29pbmcgdG8gYmUgbW91bnRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWthIC0tY29udGFpbmVyIGlmdXNlIGFyZ3VtZW50KVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIElmIGBAY29tLm15YXBwLmJsYTpkb2N1bWVudHMvMTExLnBuZ2AgaXMgcHJvdmlkZWQsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+YCBpbiBGaWxlcyBhcHAgd2lsbCBiZSBtb3VudGVkIGluIHRoZSBob3N0IG1hY2hpbmUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+LzExMS5wbmdgIHdpbCBiZSBwdWxsZWQgaW50byB0aGUgbW91bnRlZCBob3N0IG1hY2hpbmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQXBwaXVtIHJldHVybnMgdGhlIGRhdGEgYXMgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHRvIGNsaWVudC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQGNvbS5teWFwcC5ibGE6ZG9jdW1lbnRzL2AgbWVhbnMgYE9uIE15IGlQaG9uZS88YXBwIG5hbWU+YC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNGaWxlIC0gV2hldGhlciB0aGUgZGVzdGluYXRpb24gaXRlbSBpcyBhIGZpbGUgb3IgYSBmb2xkZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gQmFzZS02NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHJlbW90ZSBmaWxlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1bGxGcm9tUmVhbERldmljZSAoZGV2aWNlLCByZW1vdGVQYXRoLCBpc0ZpbGUpIHtcbiAgY29uc3Qge3NlcnZpY2UsIHJlbGF0aXZlUGF0aH0gPSBhd2FpdCBjcmVhdGVTZXJ2aWNlKGRldmljZS51ZGlkLCByZW1vdGVQYXRoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHNlcnZpY2UuZ2V0RmlsZUluZm8ocmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoaXNGaWxlICYmIGZpbGVJbmZvLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJlcXVlc3RlZCBwYXRoIGlzIG5vdCBhIGZpbGUuIFBhdGg6ICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIH1cbiAgICBpZiAoIWlzRmlsZSAmJiAhZmlsZUluZm8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcmVxdWVzdGVkIHBhdGggaXMgbm90IGEgZm9sZGVyLiBQYXRoOiAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZUluZm8uaXNGaWxlKClcbiAgICAgID8gKGF3YWl0IHB1bGxGaWxlKHNlcnZpY2UsIHJlbGF0aXZlUGF0aCkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgOiAoYXdhaXQgcHVsbEZvbGRlcihzZXJ2aWNlLCByZWxhdGl2ZVBhdGgpKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNlcnZpY2UuY2xvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgZmlsZSBvciBmb2xkZXIgZnJvbSB0aGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRldmljZSAtIFRoZSBkZXZpY2Ugb2JqZWN0LCB3aGljaCByZXByZXNlbnRzIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBgdWRpZGAgcHJvcGVydHkgY29udGFpbmluZyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBkZXZpY2UgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBwYXRoIHRvIGEgZmlsZSBvciBhIGZvbGRlciwgd2hpY2ggZXhpc3RzIGluIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvbiBTaW11bGF0b3IuIFVzZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPGFwcF9idW5kbGVfaWQ+OjxvcHRpb25hbF9jb250YWluZXJfdHlwZT4vPHBhdGhfdG9fdGhlX2ZpbGVfb3JfZm9sZGVyX2luc2lkZV9jb250YWluZXI+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCB0byBwdWxsIGEgZmlsZSBvciBhIGZvbGRlciBmcm9tIGFuIGFwcGxpY2F0aW9uIGNvbnRhaW5lciBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGUgY29udGFpbmVyIHR5cGVzIGFyZSAnYXBwJywgJ2RhdGEnLCAnZ3JvdXBzJywgJzxBIHNwZWNpZmljIEFwcCBHcm91cCBjb250YWluZXI+Jy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZSBpcyAnYXBwJy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRnJvbVNpbXVsYXRvciAoZGV2aWNlLCByZW1vdGVQYXRoKSB7XG4gIGxldCBwYXRoT25TZXJ2ZXI7XG4gIGlmIChDT05UQUlORVJfUEFUSF9QQVRURVJOLnRlc3QocmVtb3RlUGF0aCkpIHtcbiAgICBjb25zdCB7YnVuZGxlSWQsIHBhdGhJbkNvbnRhaW5lcjogZHN0UGF0aH0gPSBhd2FpdCBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCxcbiAgICAgIGFzeW5jIChhcHBCdW5kbGUsIGNvbnRhaW5lclR5cGUpID0+IGF3YWl0IGRldmljZS5zaW1jdGwuZ2V0QXBwQ29udGFpbmVyKGFwcEJ1bmRsZSwgY29udGFpbmVyVHlwZSkpO1xuICAgIGxvZy5pbmZvKGBQYXJzZWQgYnVuZGxlIGlkZW50aWZpZXIgJyR7YnVuZGxlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gYCArXG4gICAgICBgJyR7ZHN0UGF0aH0nIHdpbGwgYmUgZGVsZXRlZGApO1xuICAgIHBhdGhPblNlcnZlciA9IGRzdFBhdGg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2ltUm9vdCA9IGRldmljZS5nZXREaXIoKTtcbiAgICBwYXRoT25TZXJ2ZXIgPSBwYXRoLnBvc2l4LmpvaW4oc2ltUm9vdCwgcmVtb3RlUGF0aCk7XG4gICAgdmVyaWZ5SXNTdWJQYXRoKHBhdGhPblNlcnZlciwgc2ltUm9vdCk7XG4gICAgbG9nLmluZm8oYEdvdCB0aGUgZnVsbCBwYXRoOiAke3BhdGhPblNlcnZlcn1gKTtcbiAgfVxuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhwYXRoT25TZXJ2ZXIpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlIHJlbW90ZSBwYXRoIGF0ICcke3BhdGhPblNlcnZlcn0nIGRvZXMgbm90IGV4aXN0YCk7XG4gIH1cbiAgYXdhaXQgZnMucmltcmFmKHBhdGhPblNlcnZlcik7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBmaWxlIG9yIGZvbGRlciBmcm9tIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGV2aWNlIC0gVGhlIGRldmljZSBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGB1ZGlkYCBwcm9wZXJ0eSBjb250YWluaW5nIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGRldmljZSBJRC5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gYW4gZXhpc3RpbmcgcmVtb3RlIGZpbGUgb24gdGhlIGRldmljZS4gVGhpcyB2YXJpYWJsZSBjYW4gYmUgcHJlZml4ZWQgd2l0aFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUgaWQsIHNvIHRoZW4gdGhlIGZpbGUgd2lsbCBiZSBkb3dubG9hZGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY29udGFpbmVyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgbWVkaWEgZm9sZGVyLiBVc2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDxhcHBfYnVuZGxlX2lkPjo8b3B0aW9uYWxfY29udGFpbmVyX3R5cGU+LzxwYXRoX3RvX3RoZV9maWxlX29yX2ZvbGRlcl9pbnNpZGVfY29udGFpbmVyPlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgdG8gcHVsbCBhIGZpbGUgb3IgYSBmb2xkZXIgZnJvbSBhbiBhcHBsaWNhdGlvbiBjb250YWluZXIgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvbmx5IHN1cHBvcnRlZCBjb250YWluZXIgdHlwZSBpcyAnZG9jdW1lbnRzJy4gSWYgdGhlIGNvbnRhaW5lciB0eXBlIGlzIG5vdCBzZXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRseSBmb3IgYSBidW5kbGUgaWQsIHRoZW4gdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIGlzIGdvaW5nIHRvIGJlIG1vdW50ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFrYSAtLWNvbnRhaW5lciBpZnVzZSBhcmd1bWVudClcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiBJZiBgQGNvbS5teWFwcC5ibGE6ZG9jdW1lbnRzLzExMS5wbmdgIGlzIHByb3ZpZGVkLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbiBNeSBpUGhvbmUvPGFwcCBuYW1lPmAgaW4gRmlsZXMgYXBwIHdpbGwgYmUgbW91bnRlZCBpbiB0aGUgaG9zdCBtYWNoaW5lLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBPbiBNeSBpUGhvbmUvPGFwcCBuYW1lPi8xMTEucG5nYCB3aWwgYmUgcHVsbGVkIGludG8gdGhlIG1vdW50ZWQgaG9zdCBtYWNoaW5lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEFwcGl1bSByZXR1cm5zIHRoZSBkYXRhIGFzIGJhc2U2NC1lbmNvZGVkIHN0cmluZyB0byBjbGllbnQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEBjb20ubXlhcHAuYmxhOmRvY3VtZW50cy9gIG1lYW5zIGBPbiBNeSBpUGhvbmUvPGFwcCBuYW1lPmAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUZyb21SZWFsRGV2aWNlIChkZXZpY2UsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgeyBzZXJ2aWNlLCByZWxhdGl2ZVBhdGggfSA9IGF3YWl0IGNyZWF0ZVNlcnZpY2UoZGV2aWNlLnVkaWQsIHJlbW90ZVBhdGgpO1xuICB0cnkge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlRGlyZWN0b3J5KHJlbGF0aXZlUGF0aCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKE9CSkVDVF9OT1RfRk9VTkRfRVJST1JfTUVTU0FHRSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHtyZW1vdGVQYXRofScgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRldmljZWApO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9IGZpbmFsbHkge1xuICAgIHNlcnZpY2UuY2xvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFB1c2hlcyB0aGUgZ2l2ZW4gZGF0YSB0byBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZSBvclxuICogYSBmaWxlIGluc2lkZSBhIHBhY2thZ2UgYnVuZGxlLiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBvblxuICogYHB1c2hGaWxlVG9SZWFsRGV2aWNlYCBhbmQgYHB1c2hGaWxlVG9TaW11bGF0b3JgIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gKiBvbiBhY2NlcHRhYmxlIHZhbHVlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjREYXRhIEJhc2U2NCBlbmNvZGVkIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGVcbiAqIHJlbW90ZSBmaWxlLiBUaGUgcmVtb3RlIGZpbGUgd2lsbCBiZSBzaWxlbnRseSBvdmVycmlkZGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBwdXNoaW5nIHRoZSBkYXRhXG4gKi9cbmNvbW1hbmRzLnB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVzaEZpbGUgKHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIHJldHVybiB0aGlzLmlzU2ltdWxhdG9yKClcbiAgICA/IGF3YWl0IHB1c2hGaWxlVG9TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgYmFzZTY0RGF0YSlcbiAgICA6IGF3YWl0IHB1c2hGaWxlVG9SZWFsRGV2aWNlKHRoaXMub3B0cy5kZXZpY2UsIHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRmlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFuIGFwcCBidW5kbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF5bG9hZCBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBmaWxlIHRvIGJlIHB1c2hlZC5cbiAqL1xuXG4vKipcbiAqIFB1c2hlcyB0aGUgZ2l2ZW4gZGF0YSB0byBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtQdXNoRmlsZU9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdXNoRmlsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcmVtb3RlUGF0aCwgcGF5bG9hZCB9ID0gcmVxdWlyZUFyZ3MoWydyZW1vdGVQYXRoJywgJ3BheWxvYWQnXSwgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnB1c2hGaWxlKHJlbW90ZVBhdGgsIHBheWxvYWQpO1xufTtcblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgcHVsbEZyb21SZWFsRGV2aWNlYCBhbmQgYHB1bGxGcm9tU2ltdWxhdG9yYFxuICogdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gYWNjZXB0YWJsZSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBwdWxsZWQgZmlsZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwdWxsIG9wZXJhdGlvbiBmYWlsZWRcbiAqL1xuY29tbWFuZHMucHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdWxsRmlsZSAocmVtb3RlUGF0aCkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgSXQgaXMgZXhwZWN0ZWQgdGhhdCByZW1vdGUgcGF0aCBwb2ludHMgdG8gYSBmaWxlIGFuZCBub3QgdG8gYSBmb2xkZXIuIGAgK1xuICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaXNTaW11bGF0b3IoKVxuICAgID8gYXdhaXQgcHVsbEZyb21TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgdHJ1ZSlcbiAgICA6IGF3YWl0IHB1bGxGcm9tUmVhbERldmljZSh0aGlzLm9wdHMuZGV2aWNlLCByZW1vdGVQYXRoLCB0cnVlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUHVsbEZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgcHVsbEZyb21SZWFsRGV2aWNlYCBhbmQgYHB1bGxGcm9tU2ltdWxhdG9yYFxuICogdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gYWNjZXB0YWJsZSB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1bGxGaWxlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgaW4gYHB1bGxGaWxlYFxuICovXG5jb21tYW5kcy5tb2JpbGVQdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1bGxGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShyZW1vdGVQYXRoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGVsZXRlRm9sZGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgcHVsbEZyb21SZWFsRGV2aWNlYCBhbmQgYHB1bGxGcm9tU2ltdWxhdG9yYFxuICogdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gYWNjZXB0YWJsZSB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBEZWxldGUgYSByZW1vdGUgZm9sZGVyIGZyb20gdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZvbGRlck9wdGlvbnN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVsZXRlRm9sZGVyID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRGVsZXRlRm9sZGVyIChvcHRzID0ge30pIHtcbiAgbGV0IHsgcmVtb3RlUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ3JlbW90ZVBhdGgnLCBvcHRzKTtcbiAgaWYgKCFyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICByZW1vdGVQYXRoID0gYCR7cmVtb3RlUGF0aH0vYDtcbiAgfVxuICByZXR1cm4gYXdhaXQgZGVsZXRlRmlsZU9yRm9sZGVyKHRoaXMub3B0cy5kZXZpY2UsIHJlbW90ZVBhdGgsIHRoaXMuaXNTaW11bGF0b3IoKSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlbGV0ZUZpbGVPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgcHVsbEZyb21SZWFsRGV2aWNlYCBhbmQgYHB1bGxGcm9tU2ltdWxhdG9yYFxuICogdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gYWNjZXB0YWJsZSB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBEZWxldGUgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtEZWxldGVGaWxlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVEZWxldGVGaWxlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRGVsZXRlRmlsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcmVtb3RlUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ3JlbW90ZVBhdGgnLCBvcHRzKTtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCBkZWxldGVGaWxlT3JGb2xkZXIodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgdGhpcy5pc1NpbXVsYXRvcigpKTtcbn07XG5cbi8qKlxuICogUHVsbHMgdGhlIHdob2xlIGZvbGRlciBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byBhIGZvbGRlciBvbiB0aGVcbiAqIHJlbW90ZSBkZXZpY2Ugb3IgYSBmb2xkZXIgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZVxuICogQHJldHVybnMge3N0cmluZ30gWmlwcGVkIGFuZCBiYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGdldHRpbmcgdGhlIGZvbGRlciBjb250ZW50XG4gKi9cbmNvbW1hbmRzLnB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBwdWxsRm9sZGVyIChyZW1vdGVQYXRoKSB7XG4gIGlmICghcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgcmVtb3RlUGF0aCA9IGAke3JlbW90ZVBhdGh9L2A7XG4gIH1cbiAgcmV0dXJuIHRoaXMuaXNTaW11bGF0b3IoKVxuICAgID8gYXdhaXQgcHVsbEZyb21TaW11bGF0b3IodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgZmFsc2UpXG4gICAgOiBhd2FpdCBwdWxsRnJvbVJlYWxEZXZpY2UodGhpcy5vcHRzLmRldmljZSwgcmVtb3RlUGF0aCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWxsRm9sZGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlci5cbiAqL1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtQdWxsRm9sZGVyT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGb2xkZXJgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRm9sZGVyIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRm9sZGVyKHJlbW90ZVBhdGgpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMsIC8qIGZvciB0ZXN0aW5nICovIHBhcnNlQ29udGFpbmVyUGF0aCB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHFCQUFxQixHQUFHLEdBQTlCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsSUFBSUMsTUFBSixDQUFZLElBQUdGLHFCQUFzQixjQUFyQyxDQUEvQjtBQUNBLE1BQU1HLHdCQUF3QixHQUFHLEdBQWpDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsV0FBakM7QUFDQSxNQUFNQyw4QkFBOEIsR0FBRyxrQkFBdkM7QUFFQSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7OztBQUVBLFNBQVNDLGVBQVQsQ0FBMEJDLFlBQTFCLEVBQXdDQyxJQUF4QyxFQUE4QztFQUM1QyxNQUFNQyxjQUFjLEdBQUdDLGFBQUEsQ0FBS0MsU0FBTCxDQUFlSCxJQUFmLENBQXZCOztFQUNBLE1BQU1JLGNBQWMsR0FBR0YsYUFBQSxDQUFLQyxTQUFMLENBQWVELGFBQUEsQ0FBS0csT0FBTCxDQUFhTixZQUFiLENBQWYsQ0FBdkI7O0VBRUEsSUFBSUUsY0FBYyxLQUFLRixZQUFu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
@@ -21,6 +21,7 @@ exports.normalizeCommandTimeouts = normalizeCommandTimeouts;
21
21
  exports.normalizePlatformVersion = normalizePlatformVersion;
22
22
  exports.printUser = printUser;
23
23
  exports.removeAllSessionWebSocketHandlers = removeAllSessionWebSocketHandlers;
24
+ exports.requireArgs = requireArgs;
24
25
  exports.translateDeviceName = translateDeviceName;
25
26
 
26
27
  require("source-map-support/register");
@@ -49,6 +50,8 @@ var _os = _interopRequireDefault(require("os"));
49
50
 
50
51
  var _semver = _interopRequireDefault(require("semver"));
51
52
 
53
+ var _driver = require("appium/driver");
54
+
52
55
  const DEFAULT_TIMEOUT_KEY = 'default';
53
56
  exports.DEFAULT_TIMEOUT_KEY = DEFAULT_TIMEOUT_KEY;
54
57
  const XCTEST_LOG_FILES_PATTERNS = [/^Session-WebDriverAgentRunner.*\.log$/i, /^StandardOutputAndStandardError\.txt$/i];
@@ -431,4 +434,14 @@ function normalizePlatformVersion(originalVersion) {
431
434
 
432
435
  return `${normalizedVersion.major}.${normalizedVersion.minor}`;
433
436
  }
434
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1RJTUVPVVRfS0VZIiwiWENURVNUX0xPR19GSUxFU19QQVRURVJOUyIsIlhDVEVTVF9MT0dTX0NBQ0hFX0ZPTERFUl9QUkVGSVgiLCJkZXRlY3RVZGlkIiwibG9nIiwiZGVidWciLCJ1ZGlkcyIsInV0aWxpdGllcyIsImdldENvbm5lY3RlZERldmljZXMiLCJfIiwiaXNFbXB0eSIsIkVycm9yIiwidWRpZCIsImxhc3QiLCJsZW5ndGgiLCJ3YXJuIiwiam9pbiIsImdldEFuZENoZWNrWGNvZGVWZXJzaW9uIiwidmVyc2lvbiIsInhjb2RlIiwiZ2V0VmVyc2lvbiIsImVyciIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwidmVyc2lvbkZsb2F0IiwidmVyc2lvblN0cmluZyIsImdldEFuZENoZWNrSW9zU2RrVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldEdlbmVyaWNTaW11bGF0b3JGb3JJb3NWZXJzaW9uIiwicGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlTmFtZSIsImdlbmVyaWNTaW11bGF0b3JzIiwiaW9zR2VuZXJpY1NpbXVsYXRvcnMiLCJyZXN1bHQiLCJjb21wYXJlVmVyc2lvbnMiLCJzaW1PbmUiLCJzaW1Ud28iLCJ1dGlsIiwicGxhdGZvcm1WZXJzaW9uRnJvbUxpc3QiLCJpb3NTaW11bGF0b3IiLCJzb3J0IiwidHJhbnNsYXRlRGV2aWNlTmFtZSIsImRldmljZU5hbWVUcmFuc2xhdGVkIiwidG9Mb3dlckNhc2UiLCJ0cmltIiwiY2xlYXJMb2dzIiwibG9jYXRpb25zIiwiY2xlYW51cFByb21pc2VzIiwibG9jYXRpb24iLCJmcyIsImV4aXN0cyIsInB1c2giLCJzaXplIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwiaWduIiwicmltcmFmIiwiQiIsImFsbCIsImRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMiLCJNYXAiLCJtYXJrU3lzdGVtRmlsZXNGb3JDbGVhbnVwIiwid2RhIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJsb2dzUm9vdCIsInBhdGgiLCJyZXNvbHZlIiwibWFya2Vyc0NvdW50IiwiaGFzIiwiZ2V0Iiwic2V0IiwiY2xlYXJTeXN0ZW1GaWxlcyIsImluZm8iLCJnbG9iUGF0dGVybiIsIm9zIiwidG1wZGlyIiwiZHN0Rm9sZGVycyIsImdsb2IiLCJkc3RGb2xkZXIiLCJzY2hlZHVsZWRGaWxlc0NvdW50Iiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXIiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwic29tZSIsInAiLCJ0ZXN0IiwidW5saW5rIiwiY2F0Y2giLCJlIiwiZmluYWxseSIsInBsdXJhbGl6ZSIsImNoZWNrQXBwUHJlc2VudCIsImFwcCIsImdldERyaXZlckluZm8iLCJzdGF0IiwiX19kaXJuYW1lIiwiYnVpbHQiLCJtdGltZSIsImdldFRpbWUiLCJwa2ciLCJyZXF1aXJlIiwiX19maWxlbmFtZSIsImluY2x1ZGVzIiwibm9ybWFsaXplQ29tbWFuZFRpbWVvdXRzIiwidmFsdWUiLCJpc05hTiIsInRvSW50ZWdlciIsIkpTT04iLCJwYXJzZSIsImlzUGxhaW5PYmplY3QiLCJjbWQiLCJ0aW1lb3V0IiwidG9QYWlycyIsImlzSW50ZWdlciIsInByaW50VXNlciIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsImlzRnVuY3Rpb24iLCJmaWx0ZXIiLCJ4IiwiZW5jb2RlQmFzZTY0T3JVcGxvYWQiLCJsb2NhbFBhdGgiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwidXNlciIsInBhc3MiLCJtZXRob2QiLCJoZWFkZXJzIiwiZmlsZUZpZWxkTmFtZSIsImZvcm1GaWVsZHMiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJnZXRXZWJTb2NrZXRIYW5kbGVycyIsImFjdGl2ZUhhbmRsZXJzIiwicGF0aG5hbWUiLCJrZXlzIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsImlzTG9jYWxIb3N0IiwidXJsU3RyaW5nIiwiaG9zdG5hbWUiLCJ1cmwiLCJub3JtYWxpemVQbGF0Zm9ybVZlcnNpb24iLCJvcmlnaW5hbFZlcnNpb24iLCJub3JtYWxpemVkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsIm1ham9yIiwibWlub3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgdXRpbGl0aWVzIH0gZnJvbSAnYXBwaXVtLWlvcy1kZXZpY2UnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG5ldCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeGNvZGUgZnJvbSAnYXBwaXVtLXhjb2RlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBpb3NHZW5lcmljU2ltdWxhdG9ycyBmcm9tICcuL2lvcy1nZW5lcmljLXNpbXVsYXRvcnMnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfS0VZID0gJ2RlZmF1bHQnO1xuY29uc3QgWENURVNUX0xPR19GSUxFU19QQVRURVJOUyA9IFtcbiAgL15TZXNzaW9uLVdlYkRyaXZlckFnZW50UnVubmVyLipcXC5sb2ckL2ksXG4gIC9eU3RhbmRhcmRPdXRwdXRBbmRTdGFuZGFyZEVycm9yXFwudHh0JC9pLFxuXTtcbmNvbnN0IFhDVEVTVF9MT0dTX0NBQ0hFX0ZPTERFUl9QUkVGSVggPSAnY29tLmFwcGxlLmR0LlhDVGVzdCc7XG5cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0VWRpZCAoKSB7XG4gIGxvZy5kZWJ1ZygnQXV0by1kZXRlY3RpbmcgcmVhbCBkZXZpY2UgdWRpZC4uLicpO1xuICBjb25zdCB1ZGlkcyA9IGF3YWl0IHV0aWxpdGllcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gIGlmIChfLmlzRW1wdHkodWRpZHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBob3N0Jyk7XG4gIH1cbiAgY29uc3QgdWRpZCA9IF8ubGFzdCh1ZGlkcyk7XG4gIGlmICh1ZGlkcy5sZW5ndGggPiAxKSB7XG4gICAgbG9nLndhcm4oYE11bHRpcGxlIGRldmljZXMgZm91bmQ6ICR7dWRpZHMuam9pbignLCAnKX1gKTtcbiAgICBsb2cud2FybihgQ2hvb3NpbmcgJyR7dWRpZH0nLiBJZiB0aGlzIGlzIHdyb25nLCBtYW51YWxseSBzZXQgd2l0aCAndWRpZCcgZGVzaXJlZCBjYXBhYmlsaXR5YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBEZXRlY3RlZCByZWFsIGRldmljZSB1ZGlkOiAnJHt1ZGlkfSdgKTtcbiAgcmV0dXJuIHVkaWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFuZENoZWNrWGNvZGVWZXJzaW9uICgpIHtcbiAgbGV0IHZlcnNpb247XG4gIHRyeSB7XG4gICAgdmVyc2lvbiA9IGF3YWl0IHhjb2RlLmdldFZlcnNpb24odHJ1ZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5kZWJ1ZyhlcnIpO1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZGV0ZXJtaW5lIFhjb2RlIHZlcnNpb246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICAvLyB3ZSBkbyBub3Qgc3VwcG9ydCBYY29kZXMgPCA3LjMsXG4gIGlmICh2ZXJzaW9uLnZlcnNpb25GbG9hdCA8IDcuMykge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBYY29kZSB2ZXJzaW9uICcke3ZlcnNpb24udmVyc2lvblN0cmluZ30nLiBTdXBwb3J0IGZvciBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgWGNvZGUgJHt2ZXJzaW9uLnZlcnNpb25TdHJpbmd9IGlzIG5vdCBzdXBwb3J0ZWQuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBQbGVhc2UgdXBncmFkZSB0byB2ZXJzaW9uIDcuMyBvciBoaWdoZXJgKTtcbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kQ2hlY2tJb3NTZGtWZXJzaW9uICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgeGNvZGUuZ2V0TWF4SU9TU0RLKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZGV0ZXJtaW5lIGlPUyBTREsgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZ2VuZXJpYyBzaW11bGF0b3IgZm9yIGEgZ2l2ZW4gSU9TIHZlcnNpb24gYW5kIGRldmljZSB0eXBlIChpUGhvbmUsIGlQYWQpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwbGF0Zm9ybVZlcnNpb24gSU9TIHZlcnNpb24uIGUuZy4pIDEzLjBcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VOYW1lIFR5cGUgb2YgSU9TIGRldmljZS4gQ2FuIGJlIGlQaG9uZSwgaVBhZCAocG9zc2libHkgbW9yZSBpbiB0aGUgZnV0dXJlKVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmc/fSBHZW5lcmljIGlQaG9uZSBvciBpUGFkIHNpbXVsYXRvciAoaWYgYXBwbGljYWJsZSlcbiAqL1xuZnVuY3Rpb24gZ2V0R2VuZXJpY1NpbXVsYXRvckZvcklvc1ZlcnNpb24gKHBsYXRmb3JtVmVyc2lvbiwgZGV2aWNlTmFtZSkge1xuICBjb25zdCBnZW5lcmljU2ltdWxhdG9ycyA9IGlvc0dlbmVyaWNTaW11bGF0b3JzW2RldmljZU5hbWVdO1xuICBpZiAoIWdlbmVyaWNTaW11bGF0b3JzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBGaW5kIHRoZSBoaWdoZXN0IGlPUyB2ZXJzaW9uIGluIHRoZSBsaXN0IHRoYXQgaXMgYmVsb3cgdGhlIHByb3ZpZGVkIHZlcnNpb25cbiAgbGV0IHJlc3VsdCA9IG51bGw7XG4gIGNvbnN0IGNvbXBhcmVWZXJzaW9ucyA9IChbc2ltT25lXSwgW3NpbVR3b10pID0+IHV0aWwuY29tcGFyZVZlcnNpb25zKHNpbU9uZSwgJzwnLCBzaW1Ud28pID8gLTEgOiAxO1xuICBmb3IgKGNvbnN0IFtwbGF0Zm9ybVZlcnNpb25Gcm9tTGlzdCwgaW9zU2ltdWxhdG9yXSBvZiBnZW5lcmljU2ltdWxhdG9ycy5zb3J0KGNvbXBhcmVWZXJzaW9ucykpIHtcbiAgICBpZiAodXRpbC5jb21wYXJlVmVyc2lvbnMocGxhdGZvcm1WZXJzaW9uRnJvbUxpc3QsICc+JywgcGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdCA9IGlvc1NpbXVsYXRvcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVEZXZpY2VOYW1lIChwbGF0Zm9ybVZlcnNpb24sIGRldmljZU5hbWUpIHtcbiAgaWYgKCFkZXZpY2VOYW1lKSB7XG4gICAgcmV0dXJuIGRldmljZU5hbWU7XG4gIH1cbiAgY29uc3QgZGV2aWNlTmFtZVRyYW5zbGF0ZWQgPSBnZXRHZW5lcmljU2ltdWxhdG9yRm9ySW9zVmVyc2lvbihwbGF0Zm9ybVZlcnNpb24sIGAke2RldmljZU5hbWV9YC50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XG4gIGlmICghZGV2aWNlTmFtZVRyYW5zbGF0ZWQpIHtcbiAgICByZXR1cm4gZGV2aWNlTmFtZTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgQ2hhbmdpbmcgZGV2aWNlTmFtZSBmcm9tICcke2RldmljZU5hbWV9JyB0byAnJHtkZXZpY2VOYW1lVHJhbnNsYXRlZH0nYCk7XG4gIHJldHVybiBkZXZpY2VOYW1lVHJhbnNsYXRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2dzIChsb2NhdGlvbnMpIHtcbiAgbG9nLmRlYnVnKCdDbGVhcmluZyBsb2cgZmlsZXMnKTtcbiAgY29uc3QgY2xlYW51cFByb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgbG9jYXRpb24gb2YgbG9jYXRpb25zKSB7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMobG9jYXRpb24pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjbGVhbnVwUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHNpemU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2R1JywgWyctc2gnLCBsb2NhdGlvbl0pO1xuICAgICAgICBzaXplID0gc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxzKy8pWzBdO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBEZWxldGluZyAnJHtsb2NhdGlvbn0nLiAke3NpemUgPyBgRnJlZWluZyAke3NpemV9LmAgOiAnJ31gKTtcbiAgICAgICAgYXdhaXQgZnMucmltcmFmKGxvY2F0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cud2FybihgVW5hYmxlIHRvIGRlbGV0ZSAnJHtsb2NhdGlvbn0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGNsZWFudXBQcm9taXNlcykpIHtcbiAgICBhd2FpdCBCLmFsbChjbGVhbnVwUHJvbWlzZXMpO1xuICB9XG4gIGxvZy5kZWJ1ZygnRmluaXNoZWQgY2xlYXJpbmcgbG9nIGZpbGVzJyk7XG59XG5cbi8vIFRoaXMgbWFwIGNvbnRhaW5zIGRlcml2ZWQgZGF0YSBsb2dzIGZvbGRlcnMgYXMga2V5c1xuLy8gYW5kIHZhbHVlcyBhcmUgdGhlIGNvdW50IG9mIHRpbWVzIHRoZSBwYXJ0aWN1bGFyXG4vLyBmb2xkZXIgaGFzIGJlZW4gc2NoZWR1bGVkIGZvciByZW1vdmFsXG5jb25zdCBkZXJpdmVkRGF0YUNsZWFudXBNYXJrZXJzID0gbmV3IE1hcCgpO1xuXG5hc3luYyBmdW5jdGlvbiBtYXJrU3lzdGVtRmlsZXNGb3JDbGVhbnVwICh3ZGEpIHtcbiAgaWYgKCF3ZGEgfHwgIWF3YWl0IHdkYS5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCgpKSB7XG4gICAgbG9nLndhcm4oJ05vIFdlYkRyaXZlckFnZW50IGRlcml2ZWQgZGF0YSBhdmFpbGFibGUsIHNvIHVuYWJsZSB0byBtYXJrIHN5c3RlbSBmaWxlcyBmb3IgY2xlYW51cCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxvZ3NSb290ID0gcGF0aC5yZXNvbHZlKGF3YWl0IHdkYS5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCgpLCAnTG9ncycpO1xuICBsZXQgbWFya2Vyc0NvdW50ID0gMDtcbiAgaWYgKGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuaGFzKGxvZ3NSb290KSkge1xuICAgIG1hcmtlcnNDb3VudCA9IGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuZ2V0KGxvZ3NSb290KTtcbiAgfVxuICBkZXJpdmVkRGF0YUNsZWFudXBNYXJrZXJzLnNldChsb2dzUm9vdCwgKyttYXJrZXJzQ291bnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhclN5c3RlbUZpbGVzICh3ZGEpIHtcbiAgLy8gb25seSB3YW50IHRvIGNsZWFyIHRoZSBzeXN0ZW0gZmlsZXMgZm9yIHRoZSBwYXJ0aWN1bGFyIFdEQSB4Y29kZSBydW5cbiAgaWYgKCF3ZGEgfHwgIWF3YWl0IHdkYS5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCgpKSB7XG4gICAgbG9nLndhcm4oJ05vIFdlYkRyaXZlckFnZW50IGRlcml2ZWQgZGF0YSBhdmFpbGFibGUsIHNvIHVuYWJsZSB0byBjbGVhciBzeXN0ZW0gZmlsZXMnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBsb2dzUm9vdCA9IHBhdGgucmVzb2x2ZShhd2FpdCB3ZGEucmV0cmlldmVEZXJpdmVkRGF0YVBhdGgoKSwgJ0xvZ3MnKTtcbiAgaWYgKGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuaGFzKGxvZ3NSb290KSkge1xuICAgIGxldCBtYXJrZXJzQ291bnQgPSBkZXJpdmVkRGF0YUNsZWFudXBNYXJrZXJzLmdldChsb2dzUm9vdCk7XG4gICAgZGVyaXZlZERhdGFDbGVhbnVwTWFya2Vycy5zZXQobG9nc1Jvb3QsIC0tbWFya2Vyc0NvdW50KTtcbiAgICBpZiAobWFya2Vyc0NvdW50ID4gMCkge1xuICAgICAgbG9nLmluZm8oYE5vdCBjbGVhbmluZyAnJHtsb2dzUm9vdH0nIGZvbGRlciwgYmVjYXVzZSB0aGUgb3RoZXIgc2Vzc2lvbiBkb2VzIG5vdCBleHBlY3QgaXQgdG8gYmUgY2xlYW5lZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBkZXJpdmVkRGF0YUNsZWFudXBNYXJrZXJzLnNldChsb2dzUm9vdCwgMCk7XG5cbiAgLy8gQ2xlYW5pbmcgdXAgYmlnIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IFhDVGVzdDogaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzk0MTBcbiAgY29uc3QgZ2xvYlBhdHRlcm4gPSBgJHtvcy50bXBkaXIoKX0vJHtYQ1RFU1RfTE9HU19DQUNIRV9GT0xERVJfUFJFRklYfSovYDtcbiAgY29uc3QgZHN0Rm9sZGVycyA9IGF3YWl0IGZzLmdsb2IoZ2xvYlBhdHRlcm4pO1xuICBpZiAoXy5pc0VtcHR5KGRzdEZvbGRlcnMpKSB7XG4gICAgbG9nLmRlYnVnKGBEaWQgbm90IGZpbmQgdGhlIHRlbXBvcmFyeSBYQ1Rlc3QgbG9ncyByb290IGF0ICcke2dsb2JQYXR0ZXJufSdgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBwZXJmb3JtIHRoZSBjbGVhbnVwIGFzeW5jaHJvbm91c2x5XG4gICAgZm9yIChjb25zdCBkc3RGb2xkZXIgb2YgZHN0Rm9sZGVycykge1xuICAgICAgbGV0IHNjaGVkdWxlZEZpbGVzQ291bnQgPSAwO1xuICAgICAgQi5yZXNvbHZlKGZzLndhbGtEaXIoZHN0Rm9sZGVyLCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyKSA9PiB7XG4gICAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoaXRlbVBhdGgpO1xuICAgICAgICBpZiAoIVhDVEVTVF9MT0dfRklMRVNfUEFUVEVSTlMuc29tZSgocCkgPT4gcC50ZXN0KGZpbGVOYW1lKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWxldGUgdGhlIGZpbGUgYXN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgICAgZnMudW5saW5rKGl0ZW1QYXRoKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZy5pbmZvKGUubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2hlZHVsZWRGaWxlc0NvdW50Kys7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG4gICAgICB9KSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmIChzY2hlZHVsZWRGaWxlc0NvdW50ID4gMCkge1xuICAgICAgICAgIGxvZy5pbmZvKGBTY2hlZHVsZWQgJHtzY2hlZHVsZWRGaWxlc0NvdW50fSB0ZW1wb3JhcnkgWENUZXN0IGxvZyBgICtcbiAgICAgICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdmaWxlJywgc2NoZWR1bGVkRmlsZXNDb3VudCl9IGZvciBjbGVhbnVwIGluICcke2RzdEZvbGRlcn0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZy5pbmZvKGUubWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBTdGFydGVkIGJhY2tncm91bmQgWENUZXN0IGxvZ3MgY2xlYW51cCBpbiAnJHtkc3RGb2xkZXJzfSdgKTtcbiAgfVxuXG4gIGlmIChhd2FpdCBmcy5leGlzdHMobG9nc1Jvb3QpKSB7XG4gICAgbG9nLmluZm8oYENsZWFuaW5nIHRlc3QgbG9ncyBpbiAnJHtsb2dzUm9vdH0nIGZvbGRlcmApO1xuICAgIGF3YWl0IGNsZWFyTG9ncyhbbG9nc1Jvb3RdKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmluZm8oYFRoZXJlIGlzIG5vICR7bG9nc1Jvb3R9IGZvbGRlciwgc28gbm90IGNsZWFuaW5nIGZpbGVzYCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrQXBwUHJlc2VudCAoYXBwKSB7XG4gIGxvZy5kZWJ1ZyhgQ2hlY2tpbmcgd2hldGhlciBhcHAgJyR7YXBwfScgaXMgYWN0dWFsbHkgcHJlc2VudCBvbiBmaWxlIHN5c3RlbWApO1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IGZpbmQgYXBwIGF0ICcke2FwcH0nYCk7XG4gIH1cbiAgbG9nLmRlYnVnKCdBcHAgaXMgcHJlc2VudCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREcml2ZXJJbmZvICgpIHtcbiAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJykpO1xuICBjb25zdCBidWlsdCA9IHN0YXQubXRpbWUuZ2V0VGltZSgpO1xuXG4gIC8vIGdldCB0aGUgcGFja2FnZS5qc29uIGFuZCB0aGUgdmVyc2lvbiBmcm9tIGl0XG4gIGNvbnN0IHBrZyA9IHJlcXVpcmUoX19maWxlbmFtZS5pbmNsdWRlcygnYnVpbGQvbGliL3V0aWxzJykgPyAnLi4vLi4vcGFja2FnZS5qc29uJyA6ICcuLi9wYWNrYWdlLmpzb24nKTtcbiAgY29uc3QgdmVyc2lvbiA9IHBrZy52ZXJzaW9uO1xuXG4gIHJldHVybiB7XG4gICAgYnVpbHQsXG4gICAgdmVyc2lvbixcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbWFuZFRpbWVvdXRzICh2YWx1ZSkge1xuICAvLyBUaGUgdmFsdWUgaXMgbm9ybWFsaXplZCBhbHJlYWR5XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IHt9O1xuICAvLyBVc2UgYXMgZGVmYXVsdCB0aW1lb3V0IGZvciBhbGwgY29tbWFuZHMgaWYgYSBzaW5nbGUgaW50ZWdlciB2YWx1ZSBpcyBwcm92aWRlZFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJlc3VsdFtERUZBVUxUX1RJTUVPVVRfS0VZXSA9IF8udG9JbnRlZ2VyKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSlNPTiBvYmplY3QgaGFzIGJlZW4gcHJvdmlkZWQuIExldCdzIHBhcnNlIGl0XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QocmVzdWx0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgXCJjb21tYW5kVGltZW91dHNcIiBjYXBhYmlsaXR5IHNob3VsZCBiZSBhIHZhbGlkIEpTT04gb2JqZWN0LiBcIiR7dmFsdWV9XCIgd2FzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBmb3IgKGxldCBbY21kLCB0aW1lb3V0XSBvZiBfLnRvUGFpcnMocmVzdWx0KSkge1xuICAgIGlmICghXy5pc0ludGVnZXIodGltZW91dCkgfHwgdGltZW91dCA8PSAwKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIHRpbWVvdXQgZm9yIFwiJHtjbWR9XCIgc2hvdWxkIGJlIGEgdmFsaWQgbmF0dXJhbCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBcIiR7dGltZW91dH1cIiB3YXMgZ2l2ZW4gaW5zdGVhZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmludFVzZXIgKCkge1xuICB0cnkge1xuICAgIGxldCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3dob2FtaScpO1xuICAgIGxvZy5kZWJ1ZyhgQ3VycmVudCB1c2VyOiAnJHtzdGRvdXQudHJpbSgpfSdgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGBVbmFibGUgdG8gZ2V0IHVzZXJuYW1lIHJ1bm5pbmcgc2VydmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBJRHMgb2YgcHJvY2Vzc2VzIGxpc3RlbmluZyBvbiB0aGUgcGFydGljdWxhciBzeXN0ZW0gcG9ydC5cbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwbHkgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlXG4gKiBwcm9jZXNzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBvcnQgLSBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZmlsdGVyaW5nRnVuYyAtIE9wdGlvbmFsIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXMgY29tbWFuZCBsaW5lIHN0cmluZyBvZiB0aGUgcGFydGljdWxhciBwcm9jZXNzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyBvbiBnaXZlbiBwb3J0LCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUvZXhjbHVkZSB0aGUgY29ycmVzcG9uZGluZyBQSURcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIGlkcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0xpc3RlbmluZ09uUG9ydCAocG9ydCwgZmlsdGVyaW5nRnVuYyA9IG51bGwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIHRyeSB7XG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIE1hYyBPUyBYIEVsIENhcGl0YW5cbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWBdKTtcbiAgICByZXN1bHQucHVzaCguLi4oc3Rkb3V0LnRyaW0oKS5zcGxpdCgvXFxuKy8pKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFfLmlzRnVuY3Rpb24oZmlsdGVyaW5nRnVuYykpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiBhd2FpdCBCLmZpbHRlcihyZXN1bHQsIGFzeW5jICh4KSA9PiB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdwcycsIFsnLXAnLCB4LCAnLW8nLCAnY29tbWFuZCddKTtcbiAgICByZXR1cm4gYXdhaXQgZmlsdGVyaW5nRnVuYyhzdGRvdXQpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVcGxvYWRPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2VyIC0gVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXNzIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWV0aG9kIC0gVGhlIGh0dHAgbXVsdGlwYXJ0IHVwbG9hZCBtZXRob2QgbmFtZS4gVGhlICdQVVQnIG9uZSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKi9cblxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGdpdmVuIGxvY2FsIGZpbGUgdG8gYmFzZTY0IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgc3RyaW5nXG4gKiBvciB1cGxvYWRzIGl0IHRvIGEgcmVtb3RlIHNlcnZlciB1c2luZyBodHRwL2h0dHBzIG9yIGZ0cCBwcm90b2NvbHNcbiAqIGlmIGByZW1vdGVQYXRoYCBpcyBzZXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIHBhdGggdG8gYW4gZXhpc3RpbmcgbG9jYWwgZmlsZVxuICogQHBhcmFtIHs/c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHJlbW90ZSBsb2NhdGlvbiwgd2hlcmVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZSBzaG91bGQgYmUgdXBsb2FkZWRcbiAqIEBwYXJhbSB7P1VwbG9hZE9wdGlvbnN9IHVwbG9hZE9wdGlvbnMgLSBTZXQgb2YgdXBsb2FkIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHVwbG9hZCB3YXMgc3VjY2Vzc2Z1bCBvclxuICogYmFzZTY0LWVuY29kZWQgZmlsZSByZXByZXNlbnRhdGlvbiBpZiBgcmVtb3RlUGF0aGAgaXMgZmFsc3lcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5jb2RlQmFzZTY0T3JVcGxvYWQgKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCA9IG51bGwsIHVwbG9hZE9wdGlvbnMgPSB7fSkge1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhsb2NhbFBhdGgpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBmaWxlIGF0ICcke2xvY2FsUGF0aH0nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChsb2NhbFBhdGgpO1xuICAgIGxvZy5kZWJ1ZyhgVGhlIHNpemUgb2YgdGhlIGZpbGUgaXMgJHt1dGlsLnRvUmVhZGFibGVTaXplU3RyaW5nKHNpemUpfWApO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCB7dXNlciwgcGFzcywgbWV0aG9kLCBoZWFkZXJzLCBmaWxlRmllbGROYW1lLCBmb3JtRmllbGRzfSA9IHVwbG9hZE9wdGlvbnM7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBtZXRob2QgfHwgJ1BVVCcsXG4gICAgaGVhZGVycyxcbiAgICBmaWxlRmllbGROYW1lLFxuICAgIGZvcm1GaWVsZHMsXG4gIH07XG4gIGlmICh1c2VyICYmIHBhc3MpIHtcbiAgICBvcHRpb25zLmF1dGggPSB7dXNlciwgcGFzc307XG4gIH1cbiAgYXdhaXQgbmV0LnVwbG9hZEZpbGUobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFN0b3BzIGFuZCByZW1vdmVzIGFsbCB3ZWIgc29ja2V0IGhhbmRsZXJzIHRoYXQgYXJlIGxpc3RlbmluZ1xuICogaW4gc2NvcGUgb2YgdGhlIGN1cnJlY3Qgc2Vzc2lvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2VydmVyIC0gVGhlIGluc3RhbmNlIG9mIE5vZGVKcyBIVFRQIHNlcnZlcixcbiAqIHdoaWNoIGhvc3RzIEFwcGl1bVxuICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZCAtIFRoZSBpZCBvZiB0aGUgY3VycmVudCBzZXNzaW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyAoc2VydmVyLCBzZXNzaW9uSWQpIHtcbiAgaWYgKCFzZXJ2ZXIgfHwgIV8uaXNGdW5jdGlvbihzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlSGFuZGxlcnMgPSBhd2FpdCBzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoc2Vzc2lvbklkKTtcbiAgZm9yIChjb25zdCBwYXRobmFtZSBvZiBfLmtleXMoYWN0aXZlSGFuZGxlcnMpKSB7XG4gICAgYXdhaXQgc2VydmVyLnJlbW92ZVdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB1cmxTdHJpbmcgaXMgbG9jYWxob3N0XG4gKiBAcGFyYW0gez9zdHJpbmd9IHVybFN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiB0cnVlIGlmIHRoZSB1cmxTdHJpbmcgaXMgbG9jYWxob3N0XG4gKi9cbmZ1bmN0aW9uIGlzTG9jYWxIb3N0ICh1cmxTdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7aG9zdG5hbWV9ID0gdXJsLnBhcnNlKHVybFN0cmluZyk7XG4gICAgcmV0dXJuIFsnbG9jYWxob3N0JywgJzEyNy4wLjAuMScsICc6OjEnLCAnOjpmZmZmOjEyNy4wLjAuMSddLmluY2x1ZGVzKGhvc3RuYW1lKTtcbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgbG9nLndhcm4oYCcke3VybFN0cmluZ30nIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSB2YWxpZCBVUkxgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBwbGF0Zm9ybVZlcnNpb24gdG8gYSB2YWxpZCBpT1MgdmVyc2lvbiBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3JpZ2luYWxWZXJzaW9uIC0gTG9vc2UgdmVyc2lvbiBudW1iZXIsIHRoYXQgY2FuIGJlIHBhcnNlZCBieSBzZW12ZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gaU9TIHZlcnNpb24gbnVtYmVyIGluIDxtYWpvcj4uPG1pbm9yPiBmb3JtYXRcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgdmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQbGF0Zm9ybVZlcnNpb24gKG9yaWdpbmFsVmVyc2lvbikge1xuICBjb25zdCBub3JtYWxpemVkVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3JpZ2luYWxWZXJzaW9uKTtcbiAgaWYgKCFub3JtYWxpemVkVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBsYXRmb3JtIHZlcnNpb24gJyR7b3JpZ2luYWxWZXJzaW9ufScgc2hvdWxkIGJlIGEgdmFsaWQgdmVyc2lvbiBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gYCR7bm9ybWFsaXplZFZlcnNpb24ubWFqb3J9LiR7bm9ybWFsaXplZFZlcnNpb24ubWlub3J9YDtcbn1cblxuXG5leHBvcnQge1xuICBkZXRlY3RVZGlkLCBnZXRBbmRDaGVja1hjb2RlVmVyc2lvbiwgZ2V0QW5kQ2hlY2tJb3NTZGtWZXJzaW9uLFxuICBjaGVja0FwcFByZXNlbnQsIGdldERyaXZlckluZm8sXG4gIGNsZWFyU3lzdGVtRmlsZXMsIHRyYW5zbGF0ZURldmljZU5hbWUsIG5vcm1hbGl6ZUNvbW1hbmRUaW1lb3V0cyxcbiAgREVGQVVMVF9USU1FT1VUX0tFWSwgbWFya1N5c3RlbUZpbGVzRm9yQ2xlYW51cCwgcHJpbnRVc2VyLFxuICBnZXRQSURzTGlzdGVuaW5nT25Qb3J0LCBlbmNvZGVCYXNlNjRPclVwbG9hZCwgcmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzLFxuICBpc0xvY2FsSG9zdCwgbm9ybWFsaXplUGxhdGZvcm1WZXJzaW9uLCBjbGVhckxvZ3MsXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxtQkFBbUIsR0FBRyxTQUE1Qjs7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxDQUNoQyx3Q0FEZ0MsRUFFaEMsd0NBRmdDLENBQWxDO0FBSUEsTUFBTUMsK0JBQStCLEdBQUcscUJBQXhDOztBQUdBLGVBQWVDLFVBQWYsR0FBNkI7RUFDM0JDLGVBQUEsQ0FBSUMsS0FBSixDQUFVLG9DQUFWOztFQUNBLE1BQU1DLEtB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
437
+
438
+ function requireArgs(argNames, opts = {}) {
439
+ for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
440
+ if (!_lodash.default.has(opts, argName)) {
441
+ throw new _driver.errors.InvalidArgumentError(`'${argName}' argument must be provided`);
442
+ }
443
+ }
444
+
445
+ return opts;
446
+ }
447
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1RJTUVPVVRfS0VZIiwiWENURVNUX0xPR19GSUxFU19QQVRURVJOUyIsIlhDVEVTVF9MT0dTX0NBQ0hFX0ZPTERFUl9QUkVGSVgiLCJkZXRlY3RVZGlkIiwibG9nIiwiZGVidWciLCJ1ZGlkcyIsInV0aWxpdGllcyIsImdldENvbm5lY3RlZERldmljZXMiLCJfIiwiaXNFbXB0eSIsIkVycm9yIiwidWRpZCIsImxhc3QiLCJsZW5ndGgiLCJ3YXJuIiwiam9pbiIsImdldEFuZENoZWNrWGNvZGVWZXJzaW9uIiwidmVyc2lvbiIsInhjb2RlIiwiZ2V0VmVyc2lvbiIsImVyciIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwidmVyc2lvbkZsb2F0IiwidmVyc2lvblN0cmluZyIsImdldEFuZENoZWNrSW9zU2RrVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldEdlbmVyaWNTaW11bGF0b3JGb3JJb3NWZXJzaW9uIiwicGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlTmFtZSIsImdlbmVyaWNTaW11bGF0b3JzIiwiaW9zR2VuZXJpY1NpbXVsYXRvcnMiLCJyZXN1bHQiLCJjb21wYXJlVmVyc2lvbnMiLCJzaW1PbmUiLCJzaW1Ud28iLCJ1dGlsIiwicGxhdGZvcm1WZXJzaW9uRnJvbUxpc3QiLCJpb3NTaW11bGF0b3IiLCJzb3J0IiwidHJhbnNsYXRlRGV2aWNlTmFtZSIsImRldmljZU5hbWVUcmFuc2xhdGVkIiwidG9Mb3dlckNhc2UiLCJ0cmltIiwiY2xlYXJMb2dzIiwibG9jYXRpb25zIiwiY2xlYW51cFByb21pc2VzIiwibG9jYXRpb24iLCJmcyIsImV4aXN0cyIsInB1c2giLCJzaXplIiwic3Rkb3V0IiwiZXhlYyIsInNwbGl0IiwiaWduIiwicmltcmFmIiwiQiIsImFsbCIsImRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMiLCJNYXAiLCJtYXJrU3lzdGVtRmlsZXNGb3JDbGVhbnVwIiwid2RhIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJsb2dzUm9vdCIsInBhdGgiLCJyZXNvbHZlIiwibWFya2Vyc0NvdW50IiwiaGFzIiwiZ2V0Iiwic2V0IiwiY2xlYXJTeXN0ZW1GaWxlcyIsImluZm8iLCJnbG9iUGF0dGVybiIsIm9zIiwidG1wZGlyIiwiZHN0Rm9sZGVycyIsImdsb2IiLCJkc3RGb2xkZXIiLCJzY2hlZHVsZWRGaWxlc0NvdW50Iiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXIiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwic29tZSIsInAiLCJ0ZXN0IiwidW5saW5rIiwiY2F0Y2giLCJlIiwiZmluYWxseSIsInBsdXJhbGl6ZSIsImNoZWNrQXBwUHJlc2VudCIsImFwcCIsImdldERyaXZlckluZm8iLCJzdGF0IiwiX19kaXJuYW1lIiwiYnVpbHQiLCJtdGltZSIsImdldFRpbWUiLCJwa2ciLCJyZXF1aXJlIiwiX19maWxlbmFtZSIsImluY2x1ZGVzIiwibm9ybWFsaXplQ29tbWFuZFRpbWVvdXRzIiwidmFsdWUiLCJpc05hTiIsInRvSW50ZWdlciIsIkpTT04iLCJwYXJzZSIsImlzUGxhaW5PYmplY3QiLCJjbWQiLCJ0aW1lb3V0IiwidG9QYWlycyIsImlzSW50ZWdlciIsInByaW50VXNlciIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJwb3J0IiwiZmlsdGVyaW5nRnVuYyIsImlzRnVuY3Rpb24iLCJmaWx0ZXIiLCJ4IiwiZW5jb2RlQmFzZTY0T3JVcGxvYWQiLCJsb2NhbFBhdGgiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwidXNlciIsInBhc3MiLCJtZXRob2QiLCJoZWFkZXJzIiwiZmlsZUZpZWxkTmFtZSIsImZvcm1GaWVsZHMiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJnZXRXZWJTb2NrZXRIYW5kbGVycyIsImFjdGl2ZUhhbmRsZXJzIiwicGF0aG5hbWUiLCJrZXlzIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsImlzTG9jYWxIb3N0IiwidXJsU3RyaW5nIiwiaG9zdG5hbWUiLCJ1cmwiLCJub3JtYWxpemVQbGF0Zm9ybVZlcnNpb24iLCJvcmlnaW5hbFZlcnNpb24iLCJub3JtYWxpemVkVmVyc2lvbiIsInNlbXZlciIsImNvZXJjZSIsIm1ham9yIiwibWlub3IiLCJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJpc0FycmF5IiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgdXRpbGl0aWVzIH0gZnJvbSAnYXBwaXVtLWlvcy1kZXZpY2UnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIG5ldCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeGNvZGUgZnJvbSAnYXBwaXVtLXhjb2RlJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBpb3NHZW5lcmljU2ltdWxhdG9ycyBmcm9tICcuL2lvcy1nZW5lcmljLXNpbXVsYXRvcnMnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVF9LRVkgPSAnZGVmYXVsdCc7XG5jb25zdCBYQ1RFU1RfTE9HX0ZJTEVTX1BBVFRFUk5TID0gW1xuICAvXlNlc3Npb24tV2ViRHJpdmVyQWdlbnRSdW5uZXIuKlxcLmxvZyQvaSxcbiAgL15TdGFuZGFyZE91dHB1dEFuZFN0YW5kYXJkRXJyb3JcXC50eHQkL2ksXG5dO1xuY29uc3QgWENURVNUX0xPR1NfQ0FDSEVfRk9MREVSX1BSRUZJWCA9ICdjb20uYXBwbGUuZHQuWENUZXN0JztcblxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RVZGlkICgpIHtcbiAgbG9nLmRlYnVnKCdBdXRvLWRldGVjdGluZyByZWFsIGRldmljZSB1ZGlkLi4uJyk7XG4gIGNvbnN0IHVkaWRzID0gYXdhaXQgdXRpbGl0aWVzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgaWYgKF8uaXNFbXB0eSh1ZGlkcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRldmljZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGhvc3QnKTtcbiAgfVxuICBjb25zdCB1ZGlkID0gXy5sYXN0KHVkaWRzKTtcbiAgaWYgKHVkaWRzLmxlbmd0aCA+IDEpIHtcbiAgICBsb2cud2FybihgTXVsdGlwbGUgZGV2aWNlcyBmb3VuZDogJHt1ZGlkcy5qb2luKCcsICcpfWApO1xuICAgIGxvZy53YXJuKGBDaG9vc2luZyAnJHt1ZGlkfScuIElmIHRoaXMgaXMgd3JvbmcsIG1hbnVhbGx5IHNldCB3aXRoICd1ZGlkJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgfVxuICBsb2cuZGVidWcoYERldGVjdGVkIHJlYWwgZGV2aWNlIHVkaWQ6ICcke3VkaWR9J2ApO1xuICByZXR1cm4gdWRpZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kQ2hlY2tYY29kZVZlcnNpb24gKCkge1xuICBsZXQgdmVyc2lvbjtcbiAgdHJ5IHtcbiAgICB2ZXJzaW9uID0gYXdhaXQgeGNvZGUuZ2V0VmVyc2lvbih0cnVlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmRlYnVnKGVycik7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBkZXRlcm1pbmUgWGNvZGUgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIC8vIHdlIGRvIG5vdCBzdXBwb3J0IFhjb2RlcyA8IDcuMyxcbiAgaWYgKHZlcnNpb24udmVyc2lvbkZsb2F0IDwgNy4zKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFhjb2RlIHZlcnNpb24gJyR7dmVyc2lvbi52ZXJzaW9uU3RyaW5nfScuIFN1cHBvcnQgZm9yIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBYY29kZSAke3ZlcnNpb24udmVyc2lvblN0cmluZ30gaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYFBsZWFzZSB1cGdyYWRlIHRvIHZlcnNpb24gNy4zIG9yIGhpZ2hlcmApO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRDaGVja0lvc1Nka1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB4Y29kZS5nZXRNYXhJT1NTREsoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBkZXRlcm1pbmUgaU9TIFNESyB2ZXJzaW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBnZW5lcmljIHNpbXVsYXRvciBmb3IgYSBnaXZlbiBJT1MgdmVyc2lvbiBhbmQgZGV2aWNlIHR5cGUgKGlQaG9uZSwgaVBhZClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBsYXRmb3JtVmVyc2lvbiBJT1MgdmVyc2lvbi4gZS5nLikgMTMuMFxuICogQHBhcmFtIHtzdHJpbmd9IGRldmljZU5hbWUgVHlwZSBvZiBJT1MgZGV2aWNlLiBDYW4gYmUgaVBob25lLCBpUGFkIChwb3NzaWJseSBtb3JlIGluIHRoZSBmdXR1cmUpXG4gKlxuICogQHJldHVybnMge3N0cmluZz99IEdlbmVyaWMgaVBob25lIG9yIGlQYWQgc2ltdWxhdG9yIChpZiBhcHBsaWNhYmxlKVxuICovXG5mdW5jdGlvbiBnZXRHZW5lcmljU2ltdWxhdG9yRm9ySW9zVmVyc2lvbiAocGxhdGZvcm1WZXJzaW9uLCBkZXZpY2VOYW1lKSB7XG4gIGNvbnN0IGdlbmVyaWNTaW11bGF0b3JzID0gaW9zR2VuZXJpY1NpbXVsYXRvcnNbZGV2aWNlTmFtZV07XG4gIGlmICghZ2VuZXJpY1NpbXVsYXRvcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGhpZ2hlc3QgaU9TIHZlcnNpb24gaW4gdGhlIGxpc3QgdGhhdCBpcyBiZWxvdyB0aGUgcHJvdmlkZWQgdmVyc2lvblxuICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgY29uc3QgY29tcGFyZVZlcnNpb25zID0gKFtzaW1PbmVdLCBbc2ltVHdvXSkgPT4gdXRpbC5jb21wYXJlVmVyc2lvbnMoc2ltT25lLCAnPCcsIHNpbVR3bykgPyAtMSA6IDE7XG4gIGZvciAoY29uc3QgW3BsYXRmb3JtVmVyc2lvbkZyb21MaXN0LCBpb3NTaW11bGF0b3JdIG9mIGdlbmVyaWNTaW11bGF0b3JzLnNvcnQoY29tcGFyZVZlcnNpb25zKSkge1xuICAgIGlmICh1dGlsLmNvbXBhcmVWZXJzaW9ucyhwbGF0Zm9ybVZlcnNpb25Gcm9tTGlzdCwgJz4nLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmVzdWx0ID0gaW9zU2ltdWxhdG9yO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZURldmljZU5hbWUgKHBsYXRmb3JtVmVyc2lvbiwgZGV2aWNlTmFtZSkge1xuICBpZiAoIWRldmljZU5hbWUpIHtcbiAgICByZXR1cm4gZGV2aWNlTmFtZTtcbiAgfVxuICBjb25zdCBkZXZpY2VOYW1lVHJhbnNsYXRlZCA9IGdldEdlbmVyaWNTaW11bGF0b3JGb3JJb3NWZXJzaW9uKHBsYXRmb3JtVmVyc2lvbiwgYCR7ZGV2aWNlTmFtZX1gLnRvTG93ZXJDYXNlKCkudHJpbSgpKTtcbiAgaWYgKCFkZXZpY2VOYW1lVHJhbnNsYXRlZCkge1xuICAgIHJldHVybiBkZXZpY2VOYW1lO1xuICB9XG5cbiAgbG9nLmRlYnVnKGBDaGFuZ2luZyBkZXZpY2VOYW1lIGZyb20gJyR7ZGV2aWNlTmFtZX0nIHRvICcke2RldmljZU5hbWVUcmFuc2xhdGVkfSdgKTtcbiAgcmV0dXJuIGRldmljZU5hbWVUcmFuc2xhdGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhckxvZ3MgKGxvY2F0aW9ucykge1xuICBsb2cuZGVidWcoJ0NsZWFyaW5nIGxvZyBmaWxlcycpO1xuICBjb25zdCBjbGVhbnVwUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiBsb2NhdGlvbnMpIHtcbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNsZWFudXBQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgc2l6ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnZHUnLCBbJy1zaCcsIGxvY2F0aW9uXSk7XG4gICAgICAgIHNpemUgPSBzdGRvdXQudHJpbSgpLnNwbGl0KC9cXHMrLylbMF07XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYERlbGV0aW5nICcke2xvY2F0aW9ufScuICR7c2l6ZSA/IGBGcmVlaW5nICR7c2l6ZX0uYCA6ICcnfWApO1xuICAgICAgICBhd2FpdCBmcy5yaW1yYWYobG9jYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gZGVsZXRlICcke2xvY2F0aW9ufSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY2xlYW51cFByb21pc2VzKSkge1xuICAgIGF3YWl0IEIuYWxsKGNsZWFudXBQcm9taXNlcyk7XG4gIH1cbiAgbG9nLmRlYnVnKCdGaW5pc2hlZCBjbGVhcmluZyBsb2cgZmlsZXMnKTtcbn1cblxuLy8gVGhpcyBtYXAgY29udGFpbnMgZGVyaXZlZCBkYXRhIGxvZ3MgZm9sZGVycyBhcyBrZXlzXG4vLyBhbmQgdmFsdWVzIGFyZSB0aGUgY291bnQgb2YgdGltZXMgdGhlIHBhcnRpY3VsYXJcbi8vIGZvbGRlciBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIHJlbW92YWxcbmNvbnN0IGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMgPSBuZXcgTWFwKCk7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hcmtTeXN0ZW1GaWxlc0ZvckNsZWFudXAgKHdkYSkge1xuICBpZiAoIXdkYSB8fCAhYXdhaXQgd2RhLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCkpIHtcbiAgICBsb2cud2FybignTm8gV2ViRHJpdmVyQWdlbnQgZGVyaXZlZCBkYXRhIGF2YWlsYWJsZSwgc28gdW5hYmxlIHRvIG1hcmsgc3lzdGVtIGZpbGVzIGZvciBjbGVhbnVwJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbG9nc1Jvb3QgPSBwYXRoLnJlc29sdmUoYXdhaXQgd2RhLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCksICdMb2dzJyk7XG4gIGxldCBtYXJrZXJzQ291bnQgPSAwO1xuICBpZiAoZGVyaXZlZERhdGFDbGVhbnVwTWFya2Vycy5oYXMobG9nc1Jvb3QpKSB7XG4gICAgbWFya2Vyc0NvdW50ID0gZGVyaXZlZERhdGFDbGVhbnVwTWFya2Vycy5nZXQobG9nc1Jvb3QpO1xuICB9XG4gIGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuc2V0KGxvZ3NSb290LCArK21hcmtlcnNDb3VudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFyU3lzdGVtRmlsZXMgKHdkYSkge1xuICAvLyBvbmx5IHdhbnQgdG8gY2xlYXIgdGhlIHN5c3RlbSBmaWxlcyBmb3IgdGhlIHBhcnRpY3VsYXIgV0RBIHhjb2RlIHJ1blxuICBpZiAoIXdkYSB8fCAhYXdhaXQgd2RhLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCkpIHtcbiAgICBsb2cud2FybignTm8gV2ViRHJpdmVyQWdlbnQgZGVyaXZlZCBkYXRhIGF2YWlsYWJsZSwgc28gdW5hYmxlIHRvIGNsZWFyIHN5c3RlbSBmaWxlcycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxvZ3NSb290ID0gcGF0aC5yZXNvbHZlKGF3YWl0IHdkYS5yZXRyaWV2ZURlcml2ZWREYXRhUGF0aCgpLCAnTG9ncycpO1xuICBpZiAoZGVyaXZlZERhdGFDbGVhbnVwTWFya2Vycy5oYXMobG9nc1Jvb3QpKSB7XG4gICAgbGV0IG1hcmtlcnNDb3VudCA9IGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuZ2V0KGxvZ3NSb290KTtcbiAgICBkZXJpdmVkRGF0YUNsZWFudXBNYXJrZXJzLnNldChsb2dzUm9vdCwgLS1tYXJrZXJzQ291bnQpO1xuICAgIGlmIChtYXJrZXJzQ291bnQgPiAwKSB7XG4gICAgICBsb2cuaW5mbyhgTm90IGNsZWFuaW5nICcke2xvZ3NSb290fScgZm9sZGVyLCBiZWNhdXNlIHRoZSBvdGhlciBzZXNzaW9uIGRvZXMgbm90IGV4cGVjdCBpdCB0byBiZSBjbGVhbmVkYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGRlcml2ZWREYXRhQ2xlYW51cE1hcmtlcnMuc2V0KGxvZ3NSb290LCAwKTtcblxuICAvLyBDbGVhbmluZyB1cCBiaWcgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgYnkgWENUZXN0OiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvOTQxMFxuICBjb25zdCBnbG9iUGF0dGVybiA9IGAke29zLnRtcGRpcigpfS8ke1hDVEVTVF9MT0dTX0NBQ0hFX0ZPTERFUl9QUkVGSVh9Ki9gO1xuICBjb25zdCBkc3RGb2xkZXJzID0gYXdhaXQgZnMuZ2xvYihnbG9iUGF0dGVybik7XG4gIGlmIChfLmlzRW1wdHkoZHN0Rm9sZGVycykpIHtcbiAgICBsb2cuZGVidWcoYERpZCBub3QgZmluZCB0aGUgdGVtcG9yYXJ5IFhDVGVzdCBsb2dzIHJvb3QgYXQgJyR7Z2xvYlBhdHRlcm59J2ApO1xuICB9IGVsc2Uge1xuICAgIC8vIHBlcmZvcm0gdGhlIGNsZWFudXAgYXN5bmNocm9ub3VzbHlcbiAgICBmb3IgKGNvbnN0IGRzdEZvbGRlciBvZiBkc3RGb2xkZXJzKSB7XG4gICAgICBsZXQgc2NoZWR1bGVkRmlsZXNDb3VudCA9IDA7XG4gICAgICBCLnJlc29sdmUoZnMud2Fsa0Rpcihkc3RGb2xkZXIsIHRydWUsIChpdGVtUGF0aCwgaXNEaXIpID0+IHtcbiAgICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShpdGVtUGF0aCk7XG4gICAgICAgIGlmICghWENURVNUX0xPR19GSUxFU19QQVRURVJOUy5zb21lKChwKSA9PiBwLnRlc3QoZmlsZU5hbWUpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlbGV0ZSB0aGUgZmlsZSBhc3luY2hyb25vdXNseVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgICAgICBmcy51bmxpbmsoaXRlbVBhdGgpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgbG9nLmluZm8oZS5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNjaGVkdWxlZEZpbGVzQ291bnQrKztcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cbiAgICAgIH0pKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgaWYgKHNjaGVkdWxlZEZpbGVzQ291bnQgPiAwKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNjaGVkdWxlZCAke3NjaGVkdWxlZEZpbGVzQ291bnR9IHRlbXBvcmFyeSBYQ1Rlc3QgbG9nIGAgK1xuICAgICAgICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2ZpbGUnLCBzY2hlZHVsZWRGaWxlc0NvdW50KX0gZm9yIGNsZWFudXAgaW4gJyR7ZHN0Rm9sZGVyfSdgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuICAgICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nLmluZm8oZS5tZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFN0YXJ0ZWQgYmFja2dyb3VuZCBYQ1Rlc3QgbG9ncyBjbGVhbnVwIGluICcke2RzdEZvbGRlcnN9J2ApO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2dzUm9vdCkpIHtcbiAgICBsb2cuaW5mbyhgQ2xlYW5pbmcgdGVzdCBsb2dzIGluICcke2xvZ3NSb290fScgZm9sZGVyYCk7XG4gICAgYXdhaXQgY2xlYXJMb2dzKFtsb2dzUm9vdF0pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuaW5mbyhgVGhlcmUgaXMgbm8gJHtsb2dzUm9vdH0gZm9sZGVyLCBzbyBub3QgY2xlYW5pbmcgZmlsZXNgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBcHBQcmVzZW50IChhcHApIHtcbiAgbG9nLmRlYnVnKGBDaGVja2luZyB3aGV0aGVyIGFwcCAnJHthcHB9JyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIGZpbGUgc3lzdGVtYCk7XG4gIGlmICghKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgZmluZCBhcHAgYXQgJyR7YXBwfSdgKTtcbiAgfVxuICBsb2cuZGVidWcoJ0FwcCBpcyBwcmVzZW50Jyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldERyaXZlckluZm8gKCkge1xuICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nKSk7XG4gIGNvbnN0IGJ1aWx0ID0gc3RhdC5tdGltZS5nZXRUaW1lKCk7XG5cbiAgLy8gZ2V0IHRoZSBwYWNrYWdlLmpzb24gYW5kIHRoZSB2ZXJzaW9uIGZyb20gaXRcbiAgY29uc3QgcGtnID0gcmVxdWlyZShfX2ZpbGVuYW1lLmluY2x1ZGVzKCdidWlsZC9saWIvdXRpbHMnKSA/ICcuLi8uLi9wYWNrYWdlLmpzb24nIDogJy4uL3BhY2thZ2UuanNvbicpO1xuICBjb25zdCB2ZXJzaW9uID0gcGtnLnZlcnNpb247XG5cbiAgcmV0dXJuIHtcbiAgICBidWlsdCxcbiAgICB2ZXJzaW9uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21tYW5kVGltZW91dHMgKHZhbHVlKSB7XG4gIC8vIFRoZSB2YWx1ZSBpcyBub3JtYWxpemVkIGFscmVhZHlcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0ge307XG4gIC8vIFVzZSBhcyBkZWZhdWx0IHRpbWVvdXQgZm9yIGFsbCBjb21tYW5kcyBpZiBhIHNpbmdsZSBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkXG4gIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgcmVzdWx0W0RFRkFVTFRfVElNRU9VVF9LRVldID0gXy50b0ludGVnZXIodmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBKU09OIG9iamVjdCBoYXMgYmVlbiBwcm92aWRlZC4gTGV0J3MgcGFyc2UgaXRcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBcImNvbW1hbmRUaW1lb3V0c1wiIGNhcGFiaWxpdHkgc2hvdWxkIGJlIGEgdmFsaWQgSlNPTiBvYmplY3QuIFwiJHt2YWx1ZX1cIiB3YXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGZvciAobGV0IFtjbWQsIHRpbWVvdXRdIG9mIF8udG9QYWlycyhyZXN1bHQpKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcih0aW1lb3V0KSB8fCB0aW1lb3V0IDw9IDApIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgdGltZW91dCBmb3IgXCIke2NtZH1cIiBzaG91bGQgYmUgYSB2YWxpZCBuYXR1cmFsIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIFwiJHt0aW1lb3V0fVwiIHdhcyBnaXZlbiBpbnN0ZWFkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50VXNlciAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnd2hvYW1pJyk7XG4gICAgbG9nLmRlYnVnKGBDdXJyZW50IHVzZXI6ICcke3N0ZG91dC50cmltKCl9J2ApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZGVidWcoYFVuYWJsZSB0byBnZXQgdXNlcm5hbWUgcnVubmluZyBzZXJ2ZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIElEcyBvZiBwcm9jZXNzZXMgbGlzdGVuaW5nIG9uIHRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBwb3J0LlxuICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBhZGRpdGlvbmFsIGZpbHRlcmluZyBiYXNlZCBvbiB0aGVcbiAqIHByb2Nlc3MgY29tbWFuZCBsaW5lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcG9ydCAtIFRoZSBwb3J0IG51bWJlci5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBmaWx0ZXJpbmdGdW5jIC0gT3B0aW9uYWwgbGFtYmRhIGZ1bmN0aW9uLCB3aGljaFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcyBjb21tYW5kIGxpbmUgc3RyaW5nIG9mIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3NcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGdpdmVuIHBvcnQsIGFuZCBpcyBleHBlY3RlZCB0byByZXR1cm5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5jbHVkZS9leGNsdWRlIHRoZSBjb3JyZXNwb25kaW5nIFBJRFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSByZXN1bHRpbmcgYXJyYXkuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gLSB0aGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgaWRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRQSURzTGlzdGVuaW5nT25Qb3J0IChwb3J0LCBmaWx0ZXJpbmdGdW5jID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIG9ubHkgd29ya3Mgc2luY2UgTWFjIE9TIFggRWwgQ2FwaXRhblxuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YF0pO1xuICAgIHJlc3VsdC5wdXNoKC4uLihzdGRvdXQudHJpbSgpLnNwbGl0KC9cXG4rLykpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIV8uaXNGdW5jdGlvbihmaWx0ZXJpbmdGdW5jKSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IEIuZmlsdGVyKHJlc3VsdCwgYXN5bmMgKHgpID0+IHtcbiAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoJ3BzJywgWyctcCcsIHgsICctbycsICdjb21tYW5kJ10pO1xuICAgIHJldHVybiBhd2FpdCBmaWx0ZXJpbmdGdW5jKHN0ZG91dCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVwbG9hZE9wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHVzZXIgLSBUaGUgbmFtZSBvZiB0aGUgdXNlciBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi4gT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhc3MgLSBUaGUgcGFzc3dvcmQgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBtZXRob2QgLSBUaGUgaHR0cCBtdWx0aXBhcnQgdXBsb2FkIG1ldGhvZCBuYW1lLiBUaGUgJ1BVVCcgb25lIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGhlYWRlcnMgLSBBZGRpdGlvbmFsIGhlYWRlcnMgbWFwcGluZyBmb3IgbXVsdGlwYXJ0IGh0dHAocykgdXBsb2Fkc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBmaWxlRmllbGROYW1lIFtmaWxlXSAtIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGZpZWxkLCB3aGVyZSB0aGUgZmlsZSBjb250ZW50IEJMT0Igc2hvdWxkIGJlIHN0b3JlZCBmb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P09iamVjdHxBcnJheTxQYWlyPn0gZm9ybUZpZWxkcyAtIEFkZGl0aW9uYWwgZm9ybSBmaWVsZHMgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqL1xuXG5cbi8qKlxuICogRW5jb2RlcyB0aGUgZ2l2ZW4gbG9jYWwgZmlsZSB0byBiYXNlNjQgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBzdHJpbmdcbiAqIG9yIHVwbG9hZHMgaXQgdG8gYSByZW1vdGUgc2VydmVyIHVzaW5nIGh0dHAvaHR0cHMgb3IgZnRwIHByb3RvY29sc1xuICogaWYgYHJlbW90ZVBhdGhgIGlzIHNldFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgcGF0aCB0byBhbiBleGlzdGluZyBsb2NhbCBmaWxlXG4gKiBAcGFyYW0gez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlIHNob3VsZCBiZSB1cGxvYWRlZFxuICogQHBhcmFtIHs/VXBsb2FkT3B0aW9uc30gdXBsb2FkT3B0aW9ucyAtIFNldCBvZiB1cGxvYWQgb3B0aW9uc1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgdXBsb2FkIHdhcyBzdWNjZXNzZnVsIG9yXG4gKiBiYXNlNjQtZW5jb2RlZCBmaWxlIHJlcHJlc2VudGF0aW9uIGlmIGByZW1vdGVQYXRoYCBpcyBmYWxzeVxuICovXG5hc3luYyBmdW5jdGlvbiBlbmNvZGVCYXNlNjRPclVwbG9hZCAobG9jYWxQYXRoLCByZW1vdGVQYXRoID0gbnVsbCwgdXBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGxvY2FsUGF0aCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGZpbGUgYXQgJyR7bG9jYWxQYXRofScgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGVgKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KGxvY2FsUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBpcyAke3V0aWwudG9SZWFkYWJsZVNpemVTdHJpbmcoc2l6ZSl9YCk7XG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQobG9jYWxQYXRoKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNvbnN0IHt1c2VyLCBwYXNzLCBtZXRob2QsIGhlYWRlcnMsIGZpbGVGaWVsZE5hbWUsIGZvcm1GaWVsZHN9ID0gdXBsb2FkT3B0aW9ucztcbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBtZXRob2Q6IG1ldGhvZCB8fCAnUFVUJyxcbiAgICBoZWFkZXJzLFxuICAgIGZpbGVGaWVsZE5hbWUsXG4gICAgZm9ybUZpZWxkcyxcbiAgfTtcbiAgaWYgKHVzZXIgJiYgcGFzcykge1xuICAgIG9wdGlvbnMuYXV0aCA9IHt1c2VyLCBwYXNzfTtcbiAgfVxuICBhd2FpdCBuZXQudXBsb2FkRmlsZShsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIG9wdGlvbnMpO1xuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogU3RvcHMgYW5kIHJlbW92ZXMgYWxsIHdlYiBzb2NrZXQgaGFuZGxlcnMgdGhhdCBhcmUgbGlzdGVuaW5nXG4gKiBpbiBzY29wZSBvZiB0aGUgY3VycmVjdCBzZXNzaW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXJ2ZXIgLSBUaGUgaW5zdGFuY2Ugb2YgTm9kZUpzIEhUVFAgc2VydmVyLFxuICogd2hpY2ggaG9zdHMgQXBwaXVtXG4gKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbklkIC0gVGhlIGlkIG9mIHRoZSBjdXJyZW50IHNlc3Npb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIChzZXJ2ZXIsIHNlc3Npb25JZCkge1xuICBpZiAoIXNlcnZlciB8fCAhXy5pc0Z1bmN0aW9uKHNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhY3RpdmVIYW5kbGVycyA9IGF3YWl0IHNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhzZXNzaW9uSWQpO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIF8ua2V5cyhhY3RpdmVIYW5kbGVycykpIHtcbiAgICBhd2FpdCBzZXJ2ZXIucmVtb3ZlV2ViU29ja2V0SGFuZGxlcihwYXRobmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVybFN0cmluZyBpcyBsb2NhbGhvc3RcbiAqIEBwYXJhbSB7P3N0cmluZ30gdXJsU3RyaW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJuIHRydWUgaWYgdGhlIHVybFN0cmluZyBpcyBsb2NhbGhvc3RcbiAqL1xuZnVuY3Rpb24gaXNMb2NhbEhvc3QgKHVybFN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHtob3N0bmFtZX0gPSB1cmwucGFyc2UodXJsU3RyaW5nKTtcbiAgICByZXR1cm4gWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MScsICc6OmZmZmY6MTI3LjAuMC4xJ10uaW5jbHVkZXMoaG9zdG5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICBsb2cud2FybihgJyR7dXJsU3RyaW5nfScgY2Fubm90IGJlIHBhcnNlZCBhcyBhIHZhbGlkIFVSTGApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBsYXRmb3JtVmVyc2lvbiB0byBhIHZhbGlkIGlPUyB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmlnaW5hbFZlcnNpb24gLSBMb29zZSB2ZXJzaW9uIG51bWJlciwgdGhhdCBjYW4gYmUgcGFyc2VkIGJ5IHNlbXZlclxuICogQHJldHVybiB7c3RyaW5nfSBpT1MgdmVyc2lvbiBudW1iZXIgaW4gPG1ham9yPi48bWlub3I+IGZvcm1hdFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSB2ZXJzaW9uIG51bWJlciBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBsYXRmb3JtVmVyc2lvbiAob3JpZ2luYWxWZXJzaW9uKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShvcmlnaW5hbFZlcnNpb24pO1xuICBpZiAoIW5vcm1hbGl6ZWRWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGxhdGZvcm0gdmVyc2lvbiAnJHtvcmlnaW5hbFZlcnNpb259JyBzaG91bGQgYmUgYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiBgJHtub3JtYWxpemVkVmVyc2lvbi5tYWpvcn0uJHtub3JtYWxpemVkVmVyc2lvbi5taW5vcn1gO1xufVxuXG4vKipcbiAgKiBBc3NlcnQgdGhlIHByZXNlbmNlIG9mIHBhcnRpY3VsYXIga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0XG4gICpcbiAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyB0aGUgb2JqZWN0IHRvIGNoZWNrXG4gICogQHJldHVybnMge09iamVjdH0gdGhlIHNhbWUgZ2l2ZW4gb2JqZWN0XG4gICovXG5mdW5jdGlvbiByZXF1aXJlQXJncyAoYXJnTmFtZXMsIG9wdHMgPSB7fSkge1xuICBmb3IgKGNvbnN0IGFyZ05hbWUgb2YgKF8uaXNBcnJheShhcmdOYW1lcykgPyBhcmdOYW1lcyA6IFthcmdOYW1lc10pKSB7XG4gICAgaWYgKCFfLmhhcyhvcHRzLCBhcmdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJyR7YXJnTmFtZX0nIGFyZ3VtZW50IG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59XG5cblxuZXhwb3J0IHtcbiAgZGV0ZWN0VWRpZCwgZ2V0QW5kQ2hlY2tYY29kZVZlcnNpb24sIGdldEFuZENoZWNrSW9zU2RrVmVyc2lvbixcbiAgY2hlY2tBcHBQcmVzZW50LCBnZXREcml2ZXJJbmZvLFxuICBjbGVhclN5c3RlbUZpbGVzLCB0cmFuc2xhdGVEZXZpY2VOYW1lLCBub3JtYWxpemVDb21tYW5kVGltZW91dHMsXG4gIERFRkFVTFRfVElNRU9VVF9LRVksIG1hcmtTeXN0ZW1GaWxlc0ZvckNsZWFudXAsIHByaW50VXNlcixcbiAgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgZW5jb2RlQmFzZTY0T3JVcGxvYWQsIHJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyxcbiAgaXNMb2NhbEhvc3QsIG5vcm1hbGl6ZVBsYXRmb3JtVmVyc2lvbiwgY2xlYXJMb2dzLCByZXF1aXJlQXJnc1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLG1CQUFtQixHQUFHLFNBQTVCOztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLENBQ2hDLHdDQURnQyxFQUVoQyx3Q0FGZ0MsQ0FBbEM7QUFJQSxNQUFNQywrQkFBK0IsR0FBRyxxQkFBeEM7O0FBR0EsZUFBZUMsVUFBZixHQUE2QjtFQUMzQkMsZUFBQSxDQUFJQyxLQUFKLENBQVUsb0NBQVY7O0VBQ0EsTUFBTUMsS0FBSyxHQUFHLE1BQU1DLDBCQUFBLENBQVVDLG1CQUFWLEVBQXBCOztFQUNBLElBQUlDLGVBQUEsQ0FBRUMsT0FBRixDQUFVSixLQUFWLENBQUosRUFBc0I7SUFDcEIsTUFBTSxJQUFJSyxLQUFKLENBQVUsb0NBQVYsQ0FBTjtFQUNEOztFQUNELE1BQU1DLElBQUksR0FBR0gsZUFBQSxDQUFFSSxJQUFGLENBQU9QLEtBQVAsQ0FBYjs7RUFDQSxJQUFJQSxLQUFLLENBQUNRLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtJQUNwQlYsZUFBQSxDQUFJVyxJQUFKLENBQVUsMkJBQTBCVCxLQUFLLENBQUNVLElBQU4sQ0FBVyxJQUFYLENBQWlCLEVBQXJEOztJQUNBWixlQUFBLENBQUlXLElBQUosQ0FBVSxhQUFZSCxJQUFLLGtFQUEzQjtFQUNEOztFQUNEUixlQUFBLENBQUlDLEtBQUosQ0FBVywrQkFBOEJPLElBQUssR0FBOUM7O0VBQ0EsT0FBT0EsSUFBUDtBQUNEOztBQUVELGVBQWVLLHVCQUFmLEdBQTBDO0VBQ3hDLElBQUlDLE9BQUo7O0VBQ0EsSUFBSTtJQUNGQSxPQUFPLEdBQUcsTUFBTUMsb0JBQUEsQ0FBTUMsVUFBTixDQUFpQixJQUFqQixDQUFoQjtFQUNELENBRkQsQ0FFRSxPQUFPQyxHQUFQLEVBQVk7SUFDWmpCLGVBQUEsQ0FBSUMsS0FBSixDQUFVZ0IsR0FBVjs7SUFDQWpCLGVBQUEsQ0FBSWtCLGFBQUosQ0FBbUIsc0NBQXFDRCxHQUFHLENBQUNFLE9BQVEsRUFBcEU7RUFDRDs7RUFHRCxJQUFJTCxPQUFPLENBQUNNLFlBQVIsR0FBdUIsR0FBM0IsRUFBZ0M7SUFDOUJwQixlQUFBLENBQUlrQixhQUFKLENBQW1CLGtCQUFpQkosT0FBTyxDQUFDTyxhQUFjLGlCQUF4QyxHQUNDLFNBQVFQLE9BQU8sQ0FBQ08sYUFBYyxxQkFEL0IsR0FFQyx5Q0FGbkI7RUFHRDs7RUFDRCxPQUFPUCxPQUFQO0FBQ0Q7O0FBRUQsZUFBZVEsd0JBQWYsR0FBMkM7RUFDekMsSUFBSTtJQUNGLE9BQU8sTUFBTVAsb0JBQUEsQ0FBTVEsWUFBTixFQUFiO0VBQ0QsQ0FGRCxDQUVFLE9BQU9OLEdBQVAsRUFBWTtJQUNaakIsZUFBQSxDQUFJa0IsYUFBSixDQUFtQix3Q0FBdUNELEdBQUcsQ0FBQ0UsT0FBUSxFQUF0RTtFQUNEO0FBQ0Y7O0FBVUQsU0FBU0ssZ0NBQVQsQ0FBMkNDLGVBQTNDLEVBQTREQyxVQUE1RCxFQUF3RTtFQUN0RSxNQUFNQyxpQkFBaUIsR0FBR0MsNkJBQUEsQ0FBcUJGLFVBQXJCLENBQTFCOztFQUNBLElBQUksQ0FBQ0MsaUJBQUwsRUFBd0I7SUFDdEIsT0FBTyxJQUFQO0VBQ0Q7O0VBR0QsSUFBSUUsTUFBTSxHQUFHLElBQWI7O0VBQ0EsTUFBTUMsZUFBZSxHQUFHLENBQUMsQ0FBQ0MsTUFBRCxDQUFELEVBQVcsQ0FBQ0MsTUFBRCxDQUFYLEtBQXdCQyxhQUFBLENBQUtILGVBQUwsQ0FBcUJDLE1BQXJCLEVBQTZCLEdBQTdCLEVBQWtDQyxNQUFsQyxJQUE0QyxDQUFDLENBQTdDLEdBQWlELENBQWpHOztFQUNBLEtBQUssTUFBTSxDQUFDRSx1QkFBRCxFQUEwQkMsWUFBMUIsQ0FBWCxJQUFzRFIsaUJBQWlCLENBQUNTLElBQWxCLENBQXVCTixlQUF2QixDQUF0RCxFQUErRjtJQUM3RixJQUFJRyxhQUFBLENBQUtILGVBQUwsQ0FBcUJJLHVCQUFyQixFQUE4QyxHQUE5QyxFQUFtRFQsZUFBbkQsQ0FBSixFQUF5RTtNQUN2RTtJQUNEOztJQUNESSxNQUFNLEdBQUdNLFlBQVQ7RUFDRDs7RUFDRCxPQUFPTixNQUFQO0FBQ0Q7O0FBRUQsU0FBU1EsbUJBQVQsQ0FBOEJaLGVBQTlCLEVBQStDQyxVQUEvQyxFQUEyRDtFQUN6RCxJQUFJLENBQUNBLFVBQUwsRUFBaUI7SUFDZixPQUFPQSxVQUFQO0VBQ0Q7O0VBQ0QsTUFBTVksb0JBQW9CLEdBQUdkLGdDQUFnQyxDQUFDQyxlQUFELEVBQW1CLEdBQUVDLFVBQVcsRUFBZCxDQUFnQmEsV0FBaEIsR0FBOEJDLElBQTlCLEVBQWxCLENBQTdEOztFQUNBLElBQUksQ0FBQ0Ysb0JBQUwsRUFBMkI7SUFDekIsT0FBT1osVUFBUDtFQUNEOztFQUVEMUIsZUFBQSxDQUFJQyxLQUFKLENBQVcsNkJBQTRCeUIsVUFBVyxTQUFRWSxvQkFBcUIsR0FBL0U7O0VBQ0EsT0FBT0Esb0JBQVA7QUFDRDs7QUFFRCxlQUFlRyxTQUFmLENBQTBCQyxTQUExQixFQUFxQztFQUNuQzFDLGVBQUEsQ0FBSUMsS0FBSixDQUFVLG9CQUFWOztFQUNBLE1BQU0wQyxlQUFlLEdBQUcsRUFBeEI7O0VBQ0EsS0FBSyxNQUFNQyxRQUFYLElBQXVCRixTQUF2QixFQUFrQztJQUNoQyxJQUFJLEVBQUMsTUFBTUcsV0FBQSxDQUFHQyxNQUFILENBQVVGLFFBQVYsQ0FBUCxDQUFKLEVBQWdDO01BQzlCO0lBQ0Q7O0lBRURELGVBQWUsQ0FBQ0ksSUFBaEIsQ0FBcUIsQ0FBQyxZQUFZO01BQ2hDLElBQUlDLElBQUo7O01BQ0EsSUFBSTtRQUNGLE1BQU07VUFBQ0M7UUFBRCxJQUFXLE1BQU0sSUFBQUMsa0JBQUEsRUFBSyxJQUFMLEVBQVcsQ0FBQyxLQUFELEVBQVFOLFFBQVIsQ0FBWCxDQUF2QjtRQUNBSSxJQUFJLEdBQUdDLE1BQU0sQ0FBQ1QsSUFBUCxHQUFjVyxLQUFkLENBQW9CLEtBQXBCLEVBQTJCLENBQTNCLENBQVA7TUFDRCxDQUhELENBR0UsT0FBT0MsR0FBUCxFQUFZLENBQUU7O01BQ2hCLElBQUk7UUFDRnBELGVBQUEsQ0FBSUMsS0FBSixDQUFXLGFBQVkyQyxRQUFTLE1BQUtJLElBQUksR0FBSSxXQUFVQSxJQUFLLEdBQW5CLEdBQXdCLEVBQUcsRUFBcEU7O1FBQ0EsTUFBTUgsV0FBQSxDQUFHUSxNQUFILENBQVVULFFBQVYsQ0FBTjtNQUNELENBSEQsQ0FHRSxPQUFPM0IsR0FBUCxFQUFZO1FBQ1pqQixlQUFBLENBQUlXLElBQUosQ0FBVSxxQkFBb0JpQyxRQUFTLE1BQUszQixHQUFHLENBQUNFLE9BQVEsRUFBeEQ7TUFDRDtJQUNGLENBWm9CLEdBQXJCO0VBYUQ7O0VBQ0QsSUFBSSxDQUFDZCxlQUFBLENBQUVDLE9BQUYsQ0FBVXFDLGVBQVYsQ0FBTCxFQUFpQztJQUMvQixNQUFNVyxpQkFBQSxDQUFFQyxHQUFGLENBQU1aLGVBQU4sQ0FBTjtFQUNEOztFQUNEM0MsZUFBQSxDQUFJQyxLQUFKLENBQVUsNkJBQVY7QUFDRDs7QUFLRCxNQUFNdUQseUJBQXlCLEdBQUcsSUFBSUMsR0FBSixFQUFsQzs7QUFFQSxlQUFlQyx5QkFBZixDQUEwQ0MsR0FBMUMsRUFBK0M7RUFDN0MsSUFBSSxDQUFDQSxHQUFELElBQVEsRUFBQyxNQUFNQSxHQUFHLENBQUNDLHVCQUFKLEVBQVAsQ0FBWixFQUFrRDtJQUNoRDVELGVBQUEsQ0FBSVcsSUFBSixDQUFTLHNGQUFUOztJQUNBO0VBQ0Q7O0VBRUQsTUFBTWtELFFBQVEsR0FBR0MsYUFBQSxDQUFLQyxPQUFMLENBQWEsTUFBTUosR0FBRyxDQUFDQyx1QkFBSixFQUFuQixFQUFrRCxNQUFsRCxDQUFqQjs7RUFDQSxJQUFJSSxZQUFZLEdBQUcsQ0FBbkI7O0VBQ0EsSUFBSVIseUJBQXlCLENBQUNTLEdBQTFCLENBQThCSixRQUE5QixDQUFKLEVBQTZDO0lBQzNDRyxZQUFZLEdBQUdSLHlCQUF5QixDQUFDVSxHQUExQixDQUE4QkwsUUFBOUIsQ0FBZjtFQUNEOztFQUNETCx5QkFBeUIsQ0FBQ1csR0FBMUIsQ0FBOEJOLFFBQTlCLEVBQXdDLEVBQUVHLFlBQTFDO0FBQ0Q7O0FBRUQsZUFBZUksZ0JBQWYsQ0FBaUNULEdBQWpDLEVBQXNDO0VBRXBDLElBQUksQ0FBQ0EsR0FBRCxJQUFRLEVBQUMsTUFBTUEsR0FBRyxDQUFDQyx1QkFBSixFQUFQLENBQVosRUFBa0Q7SUFDaEQ1RCxlQUFBLENBQUlXLElBQUosQ0FBUywyRUFBVDs7SUFDQTtFQUNEOztFQUVELE1BQU1rRCxRQUFRLEdBQUdDLGFBQUEsQ0FBS0MsT0FBTCxDQUFhLE1BQU1KLEdBQUcsQ0FBQ0MsdUJBQUosRUFBbkIsRUFBa0QsTUFBbEQsQ0FBakI7O0VBQ0EsSUFBSUoseUJBQXlCLENBQUNTLEdBQTFCLENBQThCSixRQUE5QixDQUFKLEVBQTZDO0lBQzNDLElBQUlHLFlBQVksR0FBR1IseUJBQXlCLENBQUNVLEdBQTFCLENBQThCTCxRQUE5QixDQUFuQjtJQUNBTCx5QkFBeUIsQ0FBQ1csR0FBMUIsQ0FBOEJOLFFBQTlCLEVBQXdDLEVBQUVHLFlBQTFDOztJQUNBLElBQUlBLFlBQVksR0FBRyxDQUFuQixFQUFzQjtNQUNwQmhFLGVBQUEsQ0FBSXFFLElBQUosQ0FBVSxpQkFBZ0JSLFFBQVMsc0VBQW5DOztNQUNBO0lBQ0Q7RUFDRjs7RUFDREwseUJBQXlCLENBQUNXLEdBQTFCLENBQThCTixRQUE5QixFQUF3QyxDQUF4QztFQUdBLE1BQU1TLFdBQVcsR0FBSSxHQUFFQyxXQUFBLENBQUdDLE1BQUgsRUFBWSxJQUFHMUUsK0JBQWdDLElBQXRFO0VBQ0EsTUFBTTJFLFVBQVUsR0FBRyxNQUFNNUIsV0FBQSxDQUFHNkIsSUFBSCxDQUFRSixXQUFSLENBQXpCOztFQUNBLElBQUlqRSxlQUFBLENBQUVDLE9BQUYsQ0FBVW1FLFVBQVYsQ0FBSixFQUEyQjtJQUN6QnpFLGVBQUEsQ0FBSUMsS0FBSixDQUFXLG1EQUFrRHFFLFdBQVksR0FBekU7RUFDRCxDQUZELE1BRU87SUFFTCxLQUFLLE1BQU1LLFNBQVgsSUFBd0JGLFVBQXhCLEVBQW9DO01BQ2xDLElBQUlHLG1CQUFtQixHQUFHLENBQTFCOztNQUNBdEIsaUJBQUEsQ0FBRVMsT0FBRixDQUFVbEIsV0FBQSxDQUFHZ0MsT0FBSCxDQUFXRixTQUFYLEVBQXNCLElBQXRCLEVBQTRCLENBQUNHLFFBQUQsRUFBV0MsS0FBWCxLQUFxQjtRQUN6RCxJQUFJQSxLQUFKLEVBQVc7VUFDVDtRQUNEOztRQUNELE1BQU1DLFFBQVEsR0FBR2xCLGFBQUEsQ0FBS21CLFFBQUwsQ0FBY0gsUUFBZCxDQUFqQjs7UUFDQSxJQUFJLENBQUNqRix5QkFBeUIsQ0FBQ3FGLElBQTFCLENBQWdDQyxDQUFELElBQU9BLENBQUMsQ0FBQ0MsSUFBRixDQUFPSixRQUFQLENBQXRDLENBQUwsRUFBOEQ7VUFDNUQ7UUFDRDs7UUFJRG5DLFdBQUEsQ0FBR3dDLE1BQUgsQ0FBVVAsUUFBVixFQUFvQlEsS0FBcEIsQ0FBMkJDLENBQUQsSUFBTztVQUMvQnZGLGVBQUEsQ0FBSXFFLElBQUosQ0FBU2tCLENBQUMsQ0FBQ3BFLE9BQVg7UUFDRCxDQUZEOztRQUdBeUQsbUJBQW1CO01BRXBCLENBaEJTLENBQVYsRUFnQklZLE9BaEJKLENBZ0JZLE1BQU07UUFDaEIsSUFBSVosbUJBQW1CLEdBQUcsQ0FBMUIsRUFBNkI7VUFDM0I1RSxlQUFBLENBQUlxRSxJQUFKLENBQVUsYUFBWU8sbUJBQW9CLHdCQUFqQyxHQUNOLEdBQUUzQyxhQUFBLENBQUt3RCxTQUFMLENBQWUsTUFBZixFQUF1QmIsbUJBQXZCLENBQTRDLG9CQUFtQkQsU0FBVSxHQUQ5RTtRQUVEO01BRUYsQ0F0QkQsRUFzQkdXLEtBdEJILENBc0JVQyxDQUFELElBQU87UUFDZHZGLGVBQUEsQ0FBSXFFLElBQUosQ0FBU2tCLENBQUMsQ0FBQ3BFLE9BQVg7TUFDRCxDQXhCRDtJQXlCRDs7SUFDRG5CLGVBQUEsQ0FBSUMsS0FBSixDQUFXLDhDQUE2Q3dFLFVBQVcsR0FBbkU7RUFDRDs7RUFFRCxJQUFJLE1BQU01QixXQUFBLENBQUdDLE1BQUgsQ0FBVWUsUUFBVixDQUFWLEVBQStCO0lBQzdCN0QsZUFBQSxDQUFJcUUsSUFBSixDQUFVLDBCQUF5QlIsUUFBUyxVQUE1Qzs7SUFDQSxNQUFNcEIsU0FBUyxDQUFDLENBQUNvQixRQUFELENBQUQsQ0FBZjtJQUNBO0VBQ0Q7O0VBQ0Q3RCxlQUFBLENBQUlxRSxJQUFKLENBQVUsZUFBY1IsUUFBUyxnQ0FBakM7QUFDRDs7QUFFRCxlQUFlNkIsZUFBZixDQUFnQ0MsR0FBaEMsRUFBcUM7RUFDbkMzRixlQUFBLENBQUlDLEtBQUosQ0FBVyx5QkFBd0IwRixHQUFJLHNDQUF2Qzs7RUFDQSxJQUFJLEVBQUUsTUFBTTlDLFdBQUEsQ0FBR0MsTUFBSCxDQUFVNkMsR0FBVixDQUFSLENBQUosRUFBNkI7SUFDM0IzRixlQUFBLENBQUlrQixhQUFKLENBQW1CLDBCQUF5QnlFLEdBQUksR0FBaEQ7RUFDRDs7RUFDRDNGLGVBQUEsQ0FBSUMsS0FBSixDQUFVLGdCQUFWO0FBQ0Q7O0FBRUQsZUFBZTJGLGFBQWYsR0FBZ0M7RUFDOUIsTUFBTUMsSUFBSSxHQUFHLE1BQU1oRCxXQUFBLENBQUdnRCxJQUFILENBQVEvQixhQUFBLENBQUtDLE9BQUwsQ0FBYStCLFNBQWIsRUFBd0IsSUFBeEIsQ0FBUixDQUFuQjtFQUNBLE1BQU1DLEtBQUssR0FBR0YsSUFBSSxDQUFDRyxLQUFMLENBQVdDLE9BQVgsRUFBZDs7RUFHQSxNQUFNQyxHQUFHLEdBQUdDLE9BQU8sQ0FBQ0MsVUFBVSxDQUFDQyxRQUFYLENBQW9CLGlCQUFwQixJQUF5QyxvQkFBekMsR0FBZ0UsaUJBQWpFLENBQW5COztFQUNBLE1BQU12RixPQUFPLEdBQUdvRixHQUFHLENBQUNwRixPQUFwQjtFQUVBLE9BQU87SUFDTGlGLEtBREs7SUFFTGpGO0VBRkssQ0FBUDtBQUlEOztBQUVELFNBQVN3Rix3QkFBVCxDQUFtQ0MsS0FBbkMsRUFBMEM7RUFFeEMsSUFBSSxPQUFPQSxLQUFQLEtBQWlCLFFBQXJCLEVBQStCO0lBQzdCLE9BQU9BLEtBQVA7RUFDRDs7RUFFRCxJQUFJMUUsTUFBTSxHQUFHLEVBQWI7O0VBRUEsSUFBSSxDQUFDMkUsS0FBSyxDQUFDRCxLQUFELENBQVYsRUFBbUI7SUFDakIxRSxNQUFNLENBQUNqQyxtQkFBRCxDQUFOLEdBQThCUyxlQUFBLENBQUVvRyxTQUFGLENBQVlGLEtBQVosQ0FBOUI7SUFDQSxPQUFPMUUsTUFBUDtFQUNEOztFQUdELElBQUk7SUFDRkEsTUFBTSxHQUFHNkUsSUFBSSxDQUFDQyxLQUFMLENBQVdKLEtBQVgsQ0FBVDs7SUFDQSxJQUFJLENBQUNsRyxlQUFBLENBQUV1RyxhQUFGLENBQWdCL0UsTUFBaEIsQ0FBTCxFQUE4QjtNQUM1QixNQUFNLElBQUl0QixLQUFKLEVBQU47SUFDRDtFQUNGLENBTEQsQ0FLRSxPQUFPVSxHQUFQLEVBQVk7SUFDWmpCLGVBQUEsQ0FBSWtCLGFBQUosQ0FBbUIsZ0VBQStEcUYsS0FBTSxxQkFBeEY7RUFDRDs7RUFDRCxLQUFLLElBQUksQ0FBQ00sR0FBRCxFQUFNQyxPQUFOLENBQVQsSUFBMkJ6RyxlQUFBLENBQUUwRyxPQUFGLENBQVVsRixNQUFWLENBQTNCLEVBQThDO0lBQzVDLElBQUksQ0FBQ3hCLGVBQUEsQ0FBRTJHLFNBQUYsQ0FBWUYsT0FBWixDQUFELElBQXlCQSxPQUFPLElBQUksQ0FBeEMsRUFBMkM7TUFDekM5RyxlQUFBLENBQUlrQixhQUFKLENBQW1CLG9CQUFtQjJGLEdBQUksd0RBQXVEQyxPQUFRLHFCQUF6RztJQUNEO0VBQ0Y7O0VBQ0QsT0FBT2pGLE1BQVA7QUFDRDs7QUFFRCxlQUFlb0YsU0FBZixHQUE0QjtFQUMxQixJQUFJO0lBQ0YsSUFBSTtNQUFDaEU7SUFBRCxJQUFXLE1BQU0sSUFBQUMsa0JBQUEsRUFBSyxRQUFMLENBQXJCOztJQUNBbEQsZUFBQSxDQUFJQyxLQUFKLENBQVcsa0JBQWlCZ0QsTUFBTSxDQUFDVCxJQUFQLEVBQWMsR0FBMUM7RUFDRCxDQUhELENBR0UsT0FBT3ZCLEdBQVAsRUFBWTtJQUNaakIsZUFBQSxDQUFJQyxLQUFKLENBQVcsMENBQXlDZ0IsR0FBRyxDQUFDRSxPQUFRLEVBQWhFO0VBQ0Q7QUFDRjs7QUFlRCxlQUFlK0Ysc0JBQWYsQ0FBdUNDLElBQXZDLEVBQTZDQyxhQUFhLEdBQUcsSUFBN0QsRUFBbUU7RUFDakUsTUFBTXZGLE1BQU0sR0FBRyxFQUFmOztFQUNBLElBQUk7SUFFRixNQUFNO01BQUNvQjtJQUFELElBQVcsTUFBTSxJQUFBQyxrQkFBQSxFQUFLLE1BQUwsRUFBYSxDQUFDLEtBQUQsRUFBUyxPQUFNaUUsSUFBSyxFQUFwQixDQUFiLENBQXZCO0lBQ0F0RixNQUFNLENBQUNrQixJQUFQLENBQVksR0FBSUUsTUFBTSxDQUFDVCxJQUFQLEdBQWNXLEtBQWQsQ0FBb0IsS0FBcEIsQ0FBaEI7RUFDRCxDQUpELENBSUUsT0FBT29DLENBQVAsRUFBVTtJQUNWLE9BQU8xRCxNQUFQO0VBQ0Q7O0VBRUQsSUFBSSxDQUFDeEIsZUFBQSxDQUFFZ0gsVUFBRixDQUFhRCxhQUFiLENBQUwsRUFBa0M7SUFDaEMsT0FBT3ZGLE1BQVA7RUFDRDs7RUFDRCxPQUFPLE1BQU15QixpQkFBQSxDQUFFZ0UsTUFBRixDQUFTekYsTUFBVCxFQUFpQixNQUFPMEYsQ0FBUCxJQUFhO0lBQ3pDLE1BQU07TUFBQ3RFO0lBQUQsSUFBVyxNQUFNLElBQUFDLGtCQUFBLEVBQUssSUFBTCxFQUFXLENBQUMsSUFBRCxFQUFPcUUsQ0FBUCxFQUFVLElBQVYsRUFBZ0IsU0FBaEIsQ0FBWCxDQUF2QjtJQUNBLE9BQU8sTUFBTUgsYUFBYSxDQUFDbkUsTUFBRCxDQUExQjtFQUNELENBSFksQ0FBYjtBQUlEOztBQTRCRCxlQUFldUUsb0JBQWYsQ0FBcUNDLFNBQXJDLEVBQWdEQyxVQUFVLEdBQUcsSUFBN0QsRUFBbUVDLGFBQWEsR0FBRyxFQUFuRixFQUF1RjtFQUNyRixJQUFJLEVBQUMsTUFBTTlFLFdBQUEsQ0FBR0MsTUFBSCxDQUFVMkUsU0FBVixDQUFQLENBQUosRUFBaUM7SUFDL0J6SCxlQUFBLENBQUlrQixhQUFKLENBQW1CLGdCQUFldUcsU0FBVSx1Q0FBNUM7RUFDRDs7RUFFRCxJQUFJcEgsZUFBQSxDQUFFQyxPQUFGLENBQVVvSCxVQUFWLENBQUosRUFBMkI7SUFDekIsTUFBTTtNQUFDMUU7SUFBRCxJQUFTLE1BQU1ILFdBQUEsQ0FBR2dELElBQUgsQ0FBUTRCLFNBQVIsQ0FBckI7O0lBQ0F6SCxlQUFBLENBQUlDLEtBQUosQ0FBVywyQkFBMEJnQyxhQUFBLENBQUsyRixvQkFBTCxDQUEwQjVFLElBQTFCLENBQWdDLEVBQXJFOztJQUNBLE9BQU8sQ0FBQyxNQUFNZixhQUFBLENBQUs0RixnQkFBTCxDQUFzQkosU0FBdEIsQ0FBUCxFQUF5Q0ssUUFBekMsRUFBUDtFQUNEOztFQUVELE1BQU07SUFBQ0MsSUFBRDtJQUFPQyxJQUFQO0lBQWFDLE1BQWI7SUFBcUJDLE9BQXJCO0lBQThCQyxhQUE5QjtJQUE2Q0M7RUFBN0MsSUFBMkRULGFBQWpFO0VBQ0EsTUFBTVUsT0FBTyxHQUFHO0lBQ2RKLE1BQU0sRUFBRUEsTUFBTSxJQUFJLEtBREo7SUFFZEMsT0FGYztJQUdkQyxhQUhjO0lBSWRDO0VBSmMsQ0FBaEI7O0VBTUEsSUFBSUwsSUFBSSxJQUFJQyxJQUFaLEVBQWtCO0lBQ2hCSyxPQUFPLENBQUNDLElBQVIsR0FBZTtNQUFDUCxJQUFEO01BQU9DO0lBQVAsQ0FBZjtFQUNEOztFQUNELE1BQU1PLFlBQUEsQ0FBSUMsVUFBSixDQUFlZixTQUFmLEVBQTBCQyxVQUExQixFQUFzQ1csT0FBdEMsQ0FBTjtFQUNBLE9BQU8sRUFBUDtBQUNEOztBQVVELGVBQWVJLGlDQUFmLENBQWtEQyxNQUFsRCxFQUEwREMsU0FBMUQsRUFBcUU7RUFDbkUsSUFBSSxDQUFDRCxNQUFELElBQVcsQ0FBQ3JJLGVBQUEsQ0FBRWdILFVBQUYsQ0FBYXFCLE1BQU0sQ0FBQ0Usb0JBQXBCLENBQWhCLEVBQTJEO0lBQ3pEO0VBQ0Q7O0VBRUQsTUFBTUMsY0FBYyxHQUFHLE1BQU1ILE1BQU0sQ0FBQ0Usb0JBQVAsQ0FBNEJELFNBQTVCLENBQTdCOztFQUNBLEtBQUssTUFBTUcsUUFBWCxJQUF1QnpJLGVBQUEsQ0FBRTBJLElBQUYsQ0FBT0YsY0FBUCxDQUF2QixFQUErQztJQUM3QyxNQUFNSCxNQUFNLENBQUNNLHNCQUFQLENBQThCRixRQUE5QixDQUFOO0VBQ0Q7QUFDRjs7QUFPRCxTQUFTRyxXQUFULENBQXNCQyxTQUF0QixFQUFpQztFQUMvQixJQUFJO0lBQ0YsTUFBTTtNQUFDQztJQUFELElBQWFDLFlBQUEsQ0FBSXpDLEtBQUosQ0FBVXVDLFNBQVYsQ0FBbkI7O0lBQ0EsT0FBTyxDQUFDLFdBQUQsRUFBYyxXQUFkLEVBQTJCLEtBQTNCLEVBQWtDLGtCQUFsQyxFQUFzRDdDLFFBQXRELENBQStEOEMsUUFBL0QsQ0FBUDtFQUNELENBSEQsQ0FHRSxPQUFPL0YsR0FBUCxFQUFZO0lBQ1pwRCxlQUFBLENBQUlXLElBQUosQ0FBVSxJQUFHdUksU0FBVSxtQ0FBdkI7RUFDRDs7RUFDRCxPQUFPLEtBQVA7QUFDRDs7QUFTRCxTQUFTRyx3QkFBVCxDQUFtQ0MsZUFBbkMsRUFBb0Q7RUFDbEQsTUFBTUMsaUJBQWlCLEdBQUdDLGVBQUEsQ0FBT0MsTUFBUCxDQUFjSCxlQUFkLENBQTFCOztFQUNBLElBQUksQ0FBQ0MsaUJBQUwsRUFBd0I7SUFDdEIsTUFBTSxJQUFJaEosS0FBSixDQUFXLHlCQUF3QitJLGVBQWdCLG9DQUFuRCxDQUFOO0VBQ0Q7O0VBQ0QsT0FBUSxHQUFFQyxpQkFBaUIsQ0FBQ0csS0FBTSxJQUFHSCxpQkFBaUIsQ0FBQ0ksS0FBTSxFQUE3RDtBQUNEOztBQVNELFNBQVNDLFdBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDQyxJQUFJLEdBQUcsRUFBdkMsRUFBMkM7RUFDekMsS0FBSyxNQUFNQyxPQUFYLElBQXVCMUosZUFBQSxDQUFFMkosT0FBRixDQUFVSCxRQUFWLElBQXNCQSxRQUF0QixHQUFpQyxDQUFDQSxRQUFELENBQXhELEVBQXFFO0lBQ25FLElBQUksQ0FBQ3hKLGVBQUEsQ0FBRTRELEdBQUYsQ0FBTTZGLElBQU4sRUFBWUMsT0FBWixDQUFMLEVBQTJCO01BQ3pCLE1BQU0sSUFBSUUsY0FBQSxDQUFPQyxvQkFBWCxDQUFpQyxJQUFHSCxPQUFRLDZCQUE1QyxDQUFOO0lBQ0Q7RUFDRjs7RUFDRCxPQUFPRCxJQUFQO0FBQ0QifQ==
@@ -135,6 +135,9 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
135
135
 
136
136
  siriCommand: 'mobileSiriCommand',
137
137
 
138
+ pushFile: 'mobilePushFile',
139
+ pullFile: 'mobilePullFile',
140
+ pullFolder: 'mobilePullFolder',
138
141
  deleteFile: 'mobileDeleteFile',
139
142
  deleteFolder: 'mobileDeleteFolder',
140
143
 
@@ -5,6 +5,7 @@ import log from '../logger';
5
5
  import { services } from 'appium-ios-device';
6
6
  import { pullFile, pullFolder, pushFile } from '../ios-fs-helpers';
7
7
  import { errors } from 'appium/driver';
8
+ import { requireArgs } from '../utils';
8
9
 
9
10
  const CONTAINER_PATH_MARKER = '@';
10
11
  // https://regex101.com/r/PLdB0G/2
@@ -329,6 +330,17 @@ async function deleteFromRealDevice (device, remotePath) {
329
330
  }
330
331
  }
331
332
 
333
+ /**
334
+ * Pushes the given data to a file on the remote device
335
+ *
336
+ * @param {string} remotePath The full path to the remote file or
337
+ * a file inside a package bundle. Check the documentation on
338
+ * `pushFileToRealDevice` and `pushFileToSimulator` for more information
339
+ * on acceptable values.
340
+ * @param {string} base64Data Base64 encoded data to be written to the
341
+ * remote file. The remote file will be silently overridden if it already exists.
342
+ * @throws {Error} If there was an error while pushing the data
343
+ */
332
344
  commands.pushFile = async function pushFile (remotePath, base64Data) {
333
345
  if (remotePath.endsWith('/')) {
334
346
  throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +
@@ -344,6 +356,33 @@ commands.pushFile = async function pushFile (remotePath, base64Data) {
344
356
  : await pushFileToRealDevice(this.opts.device, remotePath, base64Data);
345
357
  };
346
358
 
359
+ /**
360
+ * @typedef {Object} PushFileOptions
361
+ * @property {string} remotePath The full path to the remote file
362
+ * or a specially formatted path, which points to an item inside an app bundle.
363
+ * @property {string} payload Base64-encoded content of the file to be pushed.
364
+ */
365
+
366
+ /**
367
+ * Pushes the given data to a file on the remote device.
368
+ *
369
+ * @param {PushFileOptions} opts
370
+ */
371
+ commands.mobilePushFile = async function mobilePushFile (opts = {}) {
372
+ const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);
373
+ return await this.pushFile(remotePath, payload);
374
+ };
375
+
376
+ /**
377
+ * Pulls a remote file from the device.
378
+ *
379
+ * @param {string} remotePath The full path to the remote file
380
+ * or a specially formatted path, which points to an item inside app bundle.
381
+ * See the documentation for `pullFromRealDevice` and `pullFromSimulator`
382
+ * to get more information on acceptable values.
383
+ * @returns {string} Base64 encoded content of the pulled file
384
+ * @throws {Error} If the pull operation failed
385
+ */
347
386
  commands.pullFile = async function pullFile (remotePath) {
348
387
  if (remotePath.endsWith('/')) {
349
388
  throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +
@@ -354,16 +393,61 @@ commands.pullFile = async function pullFile (remotePath) {
354
393
  : await pullFromRealDevice(this.opts.device, remotePath, true);
355
394
  };
356
395
 
396
+ /**
397
+ * @typedef {Object} PullFileOptions
398
+ * @property {string} remotePath The full path to the remote file
399
+ * or a specially formatted path, which points to an item inside app bundle.
400
+ * See the documentation for `pullFromRealDevice` and `pullFromSimulator`
401
+ * to get more information on acceptable values.
402
+ */
403
+
404
+ /**
405
+ * Pulls a remote file from the device.
406
+ *
407
+ * @param {PullFileOptions} opts
408
+ * @returns {string} The same as in `pullFile`
409
+ */
410
+ commands.mobilePullFile = async function mobilePullFile (opts = {}) {
411
+ const { remotePath } = requireArgs('remotePath', opts);
412
+ return await this.pullFile(remotePath);
413
+ };
414
+
415
+ /**
416
+ * @typedef {Object} DeleteFolderOptions
417
+ * @property {string} remotePath The full path to the remote folder
418
+ * or a specially formatted path, which points to an item inside app bundle.
419
+ * See the documentation for `pullFromRealDevice` and `pullFromSimulator`
420
+ * to get more information on acceptable values.
421
+ */
422
+
423
+ /**
424
+ * Delete a remote folder from the device.
425
+ *
426
+ * @param {DeleteFolderOptions} opts
427
+ */
357
428
  commands.mobileDeleteFolder = async function mobileDeleteFolder (opts = {}) {
358
- let {remotePath} = opts;
429
+ let { remotePath } = requireArgs('remotePath', opts);
359
430
  if (!remotePath.endsWith('/')) {
360
431
  remotePath = `${remotePath}/`;
361
432
  }
362
433
  return await deleteFileOrFolder(this.opts.device, remotePath, this.isSimulator());
363
434
  };
364
435
 
436
+ /**
437
+ * @typedef {Object} DeleteFileOptions
438
+ * @property {string} remotePath The full path to the remote file
439
+ * or a specially formatted path, which points to an item inside app bundle.
440
+ * See the documentation for `pullFromRealDevice` and `pullFromSimulator`
441
+ * to get more information on acceptable values.
442
+ */
443
+
444
+ /**
445
+ * Delete a remote file from the device.
446
+ *
447
+ * @param {DeleteFileOptions} opts
448
+ */
365
449
  commands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {
366
- const {remotePath} = opts;
450
+ const { remotePath } = requireArgs('remotePath', opts);
367
451
  if (remotePath.endsWith('/')) {
368
452
  throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +
369
453
  `'${remotePath}' is given instead`);
@@ -371,6 +455,14 @@ commands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {
371
455
  return await deleteFileOrFolder(this.opts.device, remotePath, this.isSimulator());
372
456
  };
373
457
 
458
+ /**
459
+ * Pulls the whole folder from the remote device
460
+ *
461
+ * @param {string} remotePath The full path to a folder on the
462
+ * remote device or a folder inside an application bundle
463
+ * @returns {string} Zipped and base64-encoded content of the folder
464
+ * @throws {Error} If there was a failure while getting the folder content
465
+ */
374
466
  commands.pullFolder = async function pullFolder (remotePath) {
375
467
  if (!remotePath.endsWith('/')) {
376
468
  remotePath = `${remotePath}/`;
@@ -380,5 +472,21 @@ commands.pullFolder = async function pullFolder (remotePath) {
380
472
  : await pullFromRealDevice(this.opts.device, remotePath, false);
381
473
  };
382
474
 
475
+ /**
476
+ * @typedef {Object} PullFolderOptions
477
+ * @property {string} remotePath The full path to the remote folder.
478
+ */
479
+
480
+ /**
481
+ * Pulls the whole folder from the device under test.
482
+ *
483
+ * @param {PullFolderOptions} opts
484
+ * @returns {string} The same as `pullFolder`
485
+ */
486
+ commands.mobilePullFolder = async function mobilePullFolder (opts = {}) {
487
+ const { remotePath } = requireArgs('remotePath', opts);
488
+ return await this.pullFolder(remotePath);
489
+ };
490
+
383
491
  export { commands, /* for testing */ parseContainerPath };
384
492
  export default commands;
package/lib/utils.js CHANGED
@@ -10,6 +10,7 @@ import iosGenericSimulators from './ios-generic-simulators';
10
10
  import url from 'url';
11
11
  import os from 'os';
12
12
  import semver from 'semver';
13
+ import { errors } from 'appium/driver';
13
14
 
14
15
 
15
16
  const DEFAULT_TIMEOUT_KEY = 'default';
@@ -404,6 +405,22 @@ function normalizePlatformVersion (originalVersion) {
404
405
  return `${normalizedVersion.major}.${normalizedVersion.minor}`;
405
406
  }
406
407
 
408
+ /**
409
+ * Assert the presence of particular keys in the given object
410
+ *
411
+ * @param {string|Array<string>} argNames one or more key names
412
+ * @param {Object} opts the object to check
413
+ * @returns {Object} the same given object
414
+ */
415
+ function requireArgs (argNames, opts = {}) {
416
+ for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {
417
+ if (!_.has(opts, argName)) {
418
+ throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);
419
+ }
420
+ }
421
+ return opts;
422
+ }
423
+
407
424
 
408
425
  export {
409
426
  detectUdid, getAndCheckXcodeVersion, getAndCheckIosSdkVersion,
@@ -411,5 +428,5 @@ export {
411
428
  clearSystemFiles, translateDeviceName, normalizeCommandTimeouts,
412
429
  DEFAULT_TIMEOUT_KEY, markSystemFilesForCleanup, printUser,
413
430
  getPIDsListeningOnPort, encodeBase64OrUpload, removeAllSessionWebSocketHandlers,
414
- isLocalHost, normalizePlatformVersion, clearLogs,
431
+ isLocalHost, normalizePlatformVersion, clearLogs, requireArgs
415
432
  };
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-xcuitest-driver",
3
- "version": "4.10.3",
3
+ "version": "4.11.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-xcuitest-driver",
9
- "version": "4.10.3",
9
+ "version": "4.11.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@babel/runtime": "^7.0.0",
@@ -109,6 +109,17 @@
109
109
  "npm": ">=8"
110
110
  }
111
111
  },
112
+ "node_modules/@appium/base-driver/node_modules/@babel/runtime": {
113
+ "version": "7.18.9",
114
+ "extraneous": true,
115
+ "license": "MIT",
116
+ "dependencies": {
117
+ "regenerator-runtime": "^0.13.4"
118
+ },
119
+ "engines": {
120
+ "node": ">=6.9.0"
121
+ }
122
+ },
112
123
  "node_modules/@appium/base-driver/node_modules/lru-cache": {
113
124
  "version": "7.13.2",
114
125
  "extraneous": true,
@@ -147,6 +158,17 @@
147
158
  "npm": ">=8"
148
159
  }
149
160
  },
161
+ "node_modules/@appium/docutils/node_modules/@babel/runtime": {
162
+ "version": "7.18.9",
163
+ "extraneous": true,
164
+ "license": "MIT",
165
+ "dependencies": {
166
+ "regenerator-runtime": "^0.13.4"
167
+ },
168
+ "engines": {
169
+ "node": ">=6.9.0"
170
+ }
171
+ },
150
172
  "node_modules/@appium/docutils/node_modules/teen_process": {
151
173
  "version": "1.16.0",
152
174
  "engines": [
@@ -244,6 +266,16 @@
244
266
  "npm": ">=8"
245
267
  }
246
268
  },
269
+ "node_modules/@appium/support/node_modules/@babel/runtime": {
270
+ "version": "7.18.9",
271
+ "license": "MIT",
272
+ "dependencies": {
273
+ "regenerator-runtime": "^0.13.4"
274
+ },
275
+ "engines": {
276
+ "node": ">=6.9.0"
277
+ }
278
+ },
247
279
  "node_modules/@appium/support/node_modules/teen_process": {
248
280
  "version": "1.16.0",
249
281
  "engines": [
@@ -288,6 +320,17 @@
288
320
  "appium": "^2.0.0-beta.35"
289
321
  }
290
322
  },
323
+ "node_modules/@appium/test-support/node_modules/@babel/runtime": {
324
+ "version": "7.18.9",
325
+ "dev": true,
326
+ "license": "MIT",
327
+ "dependencies": {
328
+ "regenerator-runtime": "^0.13.4"
329
+ },
330
+ "engines": {
331
+ "node": ">=6.9.0"
332
+ }
333
+ },
291
334
  "node_modules/@appium/test-support/node_modules/teen_process": {
292
335
  "version": "1.16.0",
293
336
  "dev": true,
@@ -349,7 +392,7 @@
349
392
  }
350
393
  },
351
394
  "node_modules/@babel/parser": {
352
- "version": "7.18.13",
395
+ "version": "7.19.0",
353
396
  "extraneous": true,
354
397
  "license": "MIT",
355
398
  "bin": {
@@ -360,7 +403,7 @@
360
403
  }
361
404
  },
362
405
  "node_modules/@babel/runtime": {
363
- "version": "7.18.9",
406
+ "version": "7.19.0",
364
407
  "license": "MIT",
365
408
  "dependencies": {
366
409
  "regenerator-runtime": "^0.13.4"
@@ -1006,10 +1049,6 @@
1006
1049
  "@types/node": "*"
1007
1050
  }
1008
1051
  },
1009
- "node_modules/@types/json-buffer": {
1010
- "version": "3.0.0",
1011
- "license": "MIT"
1012
- },
1013
1052
  "node_modules/@types/json-schema": {
1014
1053
  "version": "7.0.11",
1015
1054
  "license": "MIT"
@@ -1064,7 +1103,7 @@
1064
1103
  "license": "MIT"
1065
1104
  },
1066
1105
  "node_modules/@types/minimatch": {
1067
- "version": "5.1.1",
1106
+ "version": "5.1.2",
1068
1107
  "license": "MIT"
1069
1108
  },
1070
1109
  "node_modules/@types/mv": {
@@ -1079,7 +1118,7 @@
1079
1118
  }
1080
1119
  },
1081
1120
  "node_modules/@types/node": {
1082
- "version": "18.7.14",
1121
+ "version": "18.7.15",
1083
1122
  "license": "MIT"
1084
1123
  },
1085
1124
  "node_modules/@types/normalize-package-data": {
@@ -1271,7 +1310,7 @@
1271
1310
  }
1272
1311
  },
1273
1312
  "node_modules/appium-ios-device": {
1274
- "version": "2.4.4",
1313
+ "version": "2.4.5",
1275
1314
  "license": "Apache-2.0",
1276
1315
  "dependencies": {
1277
1316
  "@appium/support": "^2.55.3",
@@ -1283,13 +1322,20 @@
1283
1322
  "lodash": "^4.17.15",
1284
1323
  "semver": "^7.0.0",
1285
1324
  "source-map-support": "^0.x",
1286
- "uuid": "^8.3.2"
1325
+ "uuid": "^9.0.0"
1287
1326
  },
1288
1327
  "engines": {
1289
1328
  "node": ">=14",
1290
1329
  "npm": ">=8"
1291
1330
  }
1292
1331
  },
1332
+ "node_modules/appium-ios-device/node_modules/uuid": {
1333
+ "version": "9.0.0",
1334
+ "license": "MIT",
1335
+ "bin": {
1336
+ "uuid": "dist/bin/uuid"
1337
+ }
1338
+ },
1293
1339
  "node_modules/appium-ios-simulator": {
1294
1340
  "version": "4.1.4",
1295
1341
  "license": "Apache-2.0",
@@ -1902,17 +1948,6 @@
1902
1948
  "node": ">= 0.8"
1903
1949
  }
1904
1950
  },
1905
- "node_modules/compress-brotli": {
1906
- "version": "1.3.8",
1907
- "license": "MIT",
1908
- "dependencies": {
1909
- "@types/json-buffer": "~3.0.0",
1910
- "json-buffer": "~3.0.1"
1911
- },
1912
- "engines": {
1913
- "node": ">= 12"
1914
- }
1915
- },
1916
1951
  "node_modules/compress-commons": {
1917
1952
  "version": "4.1.1",
1918
1953
  "license": "MIT",
@@ -2208,7 +2243,7 @@
2208
2243
  }
2209
2244
  },
2210
2245
  "node_modules/es-abstract": {
2211
- "version": "1.20.1",
2246
+ "version": "1.20.2",
2212
2247
  "extraneous": true,
2213
2248
  "license": "MIT",
2214
2249
  "dependencies": {
@@ -2216,7 +2251,7 @@
2216
2251
  "es-to-primitive": "^1.2.1",
2217
2252
  "function-bind": "^1.1.1",
2218
2253
  "function.prototype.name": "^1.1.5",
2219
- "get-intrinsic": "^1.1.1",
2254
+ "get-intrinsic": "^1.1.2",
2220
2255
  "get-symbol-description": "^1.0.0",
2221
2256
  "has": "^1.0.3",
2222
2257
  "has-property-descriptors": "^1.0.0",
@@ -2228,9 +2263,9 @@
2228
2263
  "is-shared-array-buffer": "^1.0.2",
2229
2264
  "is-string": "^1.0.7",
2230
2265
  "is-weakref": "^1.0.2",
2231
- "object-inspect": "^1.12.0",
2266
+ "object-inspect": "^1.12.2",
2232
2267
  "object-keys": "^1.1.1",
2233
- "object.assign": "^4.1.2",
2268
+ "object.assign": "^4.1.4",
2234
2269
  "regexp.prototype.flags": "^1.4.3",
2235
2270
  "string.prototype.trimend": "^1.0.5",
2236
2271
  "string.prototype.trimstart": "^1.0.5",
@@ -3251,10 +3286,9 @@
3251
3286
  "license": "MIT"
3252
3287
  },
3253
3288
  "node_modules/keyv": {
3254
- "version": "4.4.1",
3289
+ "version": "4.5.0",
3255
3290
  "license": "MIT",
3256
3291
  "dependencies": {
3257
- "compress-brotli": "^1.3.8",
3258
3292
  "json-buffer": "3.0.1"
3259
3293
  }
3260
3294
  },
@@ -3534,7 +3568,7 @@
3534
3568
  }
3535
3569
  },
3536
3570
  "node_modules/marked": {
3537
- "version": "4.0.19",
3571
+ "version": "4.1.0",
3538
3572
  "extraneous": true,
3539
3573
  "license": "MIT",
3540
3574
  "bin": {
@@ -4958,6 +4992,16 @@
4958
4992
  "npm": ">=6"
4959
4993
  }
4960
4994
  },
4995
+ "node_modules/teen_process/node_modules/@babel/runtime": {
4996
+ "version": "7.18.9",
4997
+ "license": "MIT",
4998
+ "dependencies": {
4999
+ "regenerator-runtime": "^0.13.4"
5000
+ },
5001
+ "engines": {
5002
+ "node": ">=6.9.0"
5003
+ }
5004
+ },
4961
5005
  "node_modules/text-hex": {
4962
5006
  "version": "1.0.0",
4963
5007
  "extraneous": true,
@@ -5457,6 +5501,13 @@
5457
5501
  "validate.js": "0.13.1"
5458
5502
  },
5459
5503
  "dependencies": {
5504
+ "@babel/runtime": {
5505
+ "version": "7.18.9",
5506
+ "extraneous": true,
5507
+ "requires": {
5508
+ "regenerator-runtime": "^0.13.4"
5509
+ }
5510
+ },
5460
5511
  "lru-cache": {
5461
5512
  "version": "7.13.2",
5462
5513
  "extraneous": true
@@ -5483,6 +5534,13 @@
5483
5534
  "teen_process": "1.16.0"
5484
5535
  },
5485
5536
  "dependencies": {
5537
+ "@babel/runtime": {
5538
+ "version": "7.18.9",
5539
+ "extraneous": true,
5540
+ "requires": {
5541
+ "regenerator-runtime": "^0.13.4"
5542
+ }
5543
+ },
5486
5544
  "teen_process": {
5487
5545
  "version": "1.16.0",
5488
5546
  "extraneous": true,
@@ -5568,6 +5626,12 @@
5568
5626
  "yauzl": "2.10.0"
5569
5627
  },
5570
5628
  "dependencies": {
5629
+ "@babel/runtime": {
5630
+ "version": "7.18.9",
5631
+ "requires": {
5632
+ "regenerator-runtime": "^0.13.4"
5633
+ }
5634
+ },
5571
5635
  "teen_process": {
5572
5636
  "version": "1.16.0",
5573
5637
  "requires": {
@@ -5598,6 +5662,13 @@
5598
5662
  "teen_process": "1.16.0"
5599
5663
  },
5600
5664
  "dependencies": {
5665
+ "@babel/runtime": {
5666
+ "version": "7.18.9",
5667
+ "dev": true,
5668
+ "requires": {
5669
+ "regenerator-runtime": "^0.13.4"
5670
+ }
5671
+ },
5601
5672
  "teen_process": {
5602
5673
  "version": "1.16.0",
5603
5674
  "dev": true,
@@ -5640,11 +5711,11 @@
5640
5711
  }
5641
5712
  },
5642
5713
  "@babel/parser": {
5643
- "version": "7.18.13",
5714
+ "version": "7.19.0",
5644
5715
  "extraneous": true
5645
5716
  },
5646
5717
  "@babel/runtime": {
5647
- "version": "7.18.9",
5718
+ "version": "7.19.0",
5648
5719
  "requires": {
5649
5720
  "regenerator-runtime": "^0.13.4"
5650
5721
  }
@@ -6090,9 +6161,6 @@
6090
6161
  "@types/node": "*"
6091
6162
  }
6092
6163
  },
6093
- "@types/json-buffer": {
6094
- "version": "3.0.0"
6095
- },
6096
6164
  "@types/json-schema": {
6097
6165
  "version": "7.0.11"
6098
6166
  },
@@ -6138,7 +6206,7 @@
6138
6206
  "version": "3.0.1"
6139
6207
  },
6140
6208
  "@types/minimatch": {
6141
- "version": "5.1.1"
6209
+ "version": "5.1.2"
6142
6210
  },
6143
6211
  "@types/mv": {
6144
6212
  "version": "2.1.2"
@@ -6150,7 +6218,7 @@
6150
6218
  }
6151
6219
  },
6152
6220
  "@types/node": {
6153
- "version": "18.7.14"
6221
+ "version": "18.7.15"
6154
6222
  },
6155
6223
  "@types/normalize-package-data": {
6156
6224
  "version": "2.4.1"
@@ -6282,7 +6350,7 @@
6282
6350
  }
6283
6351
  },
6284
6352
  "appium-ios-device": {
6285
- "version": "2.4.4",
6353
+ "version": "2.4.5",
6286
6354
  "requires": {
6287
6355
  "@appium/support": "^2.55.3",
6288
6356
  "@babel/runtime": "^7.0.0",
@@ -6293,7 +6361,12 @@
6293
6361
  "lodash": "^4.17.15",
6294
6362
  "semver": "^7.0.0",
6295
6363
  "source-map-support": "^0.x",
6296
- "uuid": "^8.3.2"
6364
+ "uuid": "^9.0.0"
6365
+ },
6366
+ "dependencies": {
6367
+ "uuid": {
6368
+ "version": "9.0.0"
6369
+ }
6297
6370
  }
6298
6371
  },
6299
6372
  "appium-ios-simulator": {
@@ -6706,13 +6779,6 @@
6706
6779
  "delayed-stream": "~1.0.0"
6707
6780
  }
6708
6781
  },
6709
- "compress-brotli": {
6710
- "version": "1.3.8",
6711
- "requires": {
6712
- "@types/json-buffer": "~3.0.0",
6713
- "json-buffer": "~3.0.1"
6714
- }
6715
- },
6716
6782
  "compress-commons": {
6717
6783
  "version": "4.1.1",
6718
6784
  "requires": {
@@ -6885,14 +6951,14 @@
6885
6951
  }
6886
6952
  },
6887
6953
  "es-abstract": {
6888
- "version": "1.20.1",
6954
+ "version": "1.20.2",
6889
6955
  "extraneous": true,
6890
6956
  "requires": {
6891
6957
  "call-bind": "^1.0.2",
6892
6958
  "es-to-primitive": "^1.2.1",
6893
6959
  "function-bind": "^1.1.1",
6894
6960
  "function.prototype.name": "^1.1.5",
6895
- "get-intrinsic": "^1.1.1",
6961
+ "get-intrinsic": "^1.1.2",
6896
6962
  "get-symbol-description": "^1.0.0",
6897
6963
  "has": "^1.0.3",
6898
6964
  "has-property-descriptors": "^1.0.0",
@@ -6904,9 +6970,9 @@
6904
6970
  "is-shared-array-buffer": "^1.0.2",
6905
6971
  "is-string": "^1.0.7",
6906
6972
  "is-weakref": "^1.0.2",
6907
- "object-inspect": "^1.12.0",
6973
+ "object-inspect": "^1.12.2",
6908
6974
  "object-keys": "^1.1.1",
6909
- "object.assign": "^4.1.2",
6975
+ "object.assign": "^4.1.4",
6910
6976
  "regexp.prototype.flags": "^1.4.3",
6911
6977
  "string.prototype.trimend": "^1.0.5",
6912
6978
  "string.prototype.trimstart": "^1.0.5",
@@ -7554,9 +7620,8 @@
7554
7620
  "dev": true
7555
7621
  },
7556
7622
  "keyv": {
7557
- "version": "4.4.1",
7623
+ "version": "4.5.0",
7558
7624
  "requires": {
7559
- "compress-brotli": "^1.3.8",
7560
7625
  "json-buffer": "3.0.1"
7561
7626
  }
7562
7627
  },
@@ -7753,7 +7818,7 @@
7753
7818
  "requires": {}
7754
7819
  },
7755
7820
  "marked": {
7756
- "version": "4.0.19",
7821
+ "version": "4.1.0",
7757
7822
  "extraneous": true
7758
7823
  },
7759
7824
  "mdurl": {
@@ -8684,6 +8749,14 @@
8684
8749
  "shell-quote": "1.7.3",
8685
8750
  "source-map-support": "0.5.21",
8686
8751
  "which": "2.0.2"
8752
+ },
8753
+ "dependencies": {
8754
+ "@babel/runtime": {
8755
+ "version": "7.18.9",
8756
+ "requires": {
8757
+ "regenerator-runtime": "^0.13.4"
8758
+ }
8759
+ }
8687
8760
  }
8688
8761
  },
8689
8762
  "text-hex": {
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "xcuitest",
9
9
  "xctest"
10
10
  ],
11
- "version": "4.10.3",
11
+ "version": "4.11.0",
12
12
  "author": "Appium Contributors",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {