index.js 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. import { __decorate, __extends } from "tslib";
  2. import { Injectable } from '@angular/core';
  3. import { AwesomeCordovaNativePlugin, cordova, cordovaPropertyGet, cordovaPropertySet } from '@awesome-cordova-plugins/core';
  4. import * as i0 from "@angular/core";
  5. var Diagnostic = /** @class */ (function (_super) {
  6. __extends(Diagnostic, _super);
  7. function Diagnostic() {
  8. var _this = _super !== null && _super.apply(this, arguments) || this;
  9. _this.permission = {
  10. ACCEPT_HANDOVER: 'ACCEPT_HANDOVER',
  11. ACCESS_BACKGROUND_LOCATION: 'ACCESS_BACKGROUND_LOCATION',
  12. ACCESS_COARSE_LOCATION: 'ACCESS_COARSE_LOCATION',
  13. ACCESS_FINE_LOCATION: 'ACCESS_FINE_LOCATION',
  14. ACCESS_MEDIA_LOCATION: 'ACCESS_MEDIA_LOCATION',
  15. ACTIVITY_RECOGNITION: 'ACTIVITY_RECOGNITION',
  16. ADD_VOICEMAIL: 'ADD_VOICEMAIL',
  17. ANSWER_PHONE_CALLS: 'ANSWER_PHONE_CALLS',
  18. BLUETOOTH_ADVERTISE: 'BLUETOOTH_ADVERTISE',
  19. BLUETOOTH_CONNECT: 'BLUETOOTH_CONNECT',
  20. BLUETOOTH_SCAN: 'BLUETOOTH_SCAN',
  21. BODY_SENSORS: 'BODY_SENSORS',
  22. BODY_SENSORS_BACKGROUND: 'BODY_SENSORS_BACKGROUND',
  23. CALL_PHONE: 'CALL_PHONE',
  24. CAMERA: 'CAMERA',
  25. GET_ACCOUNTS: 'GET_ACCOUNTS',
  26. NEARBY_WIFI_DEVICES: 'NEARBY_WIFI_DEVICES',
  27. POST_NOTIFICATIONS: 'POST_NOTIFICATIONS',
  28. PROCESS_OUTGOING_CALLS: 'PROCESS_OUTGOING_CALLS',
  29. READ_CALENDAR: 'READ_CALENDAR',
  30. READ_CALL_LOG: 'READ_CALL_LOG',
  31. READ_CONTACTS: 'READ_CONTACTS',
  32. READ_EXTERNAL_STORAGE: 'READ_EXTERNAL_STORAGE',
  33. READ_MEDIA_AUDIO: 'READ_MEDIA_AUDIO',
  34. READ_MEDIA_IMAGES: 'READ_MEDIA_IMAGES',
  35. READ_MEDIA_VIDEO: 'READ_MEDIA_VIDEO',
  36. READ_PHONE_NUMBERS: 'READ_PHONE_NUMBERS',
  37. READ_PHONE_STATE: 'READ_PHONE_STATE',
  38. READ_SMS: 'READ_SMS',
  39. RECEIVE_MMS: 'RECEIVE_MMS',
  40. RECEIVE_SMS: 'RECEIVE_SMS',
  41. RECEIVE_WAP_PUSH: 'RECEIVE_WAP_PUSH',
  42. RECORD_AUDIO: 'RECORD_AUDIO',
  43. SEND_SMS: 'SEND_SMS',
  44. USE_SIP: 'USE_SIP',
  45. UWB_RANGING: 'UWB_RANGING',
  46. WRITE_CALENDAR: 'WRITE_CALENDAR',
  47. WRITE_CALL_LOG: 'WRITE_CALL_LOG',
  48. WRITE_CONTACTS: 'WRITE_CONTACTS',
  49. WRITE_EXTERNAL_STORAGE: 'WRITE_EXTERNAL_STORAGE',
  50. };
  51. _this.locationAuthorizationMode = {
  52. ALWAYS: 'always',
  53. WHEN_IN_USE: 'when_in_use',
  54. };
  55. /**
  56. * Location accuracy authorization
  57. */
  58. _this.locationAccuracyAuthorization = {
  59. FULL: 'full',
  60. REDUCED: 'reduced',
  61. };
  62. _this.permissionGroups = {
  63. CALENDAR: ['READ_CALENDAR', 'WRITE_CALENDAR'],
  64. CAMERA: ['CAMERA'],
  65. CONTACTS: ['READ_CONTACTS', 'WRITE_CONTACTS', 'GET_ACCOUNTS'],
  66. LOCATION: ['ACCESS_FINE_LOCATION', 'ACCESS_COARSE_LOCATION'],
  67. MICROPHONE: ['RECORD_AUDIO'],
  68. PHONE: [
  69. 'READ_PHONE_STATE',
  70. 'CALL_PHONE',
  71. 'ADD_VOICEMAIL',
  72. 'USE_SIP',
  73. 'PROCESS_OUTGOING_CALLS',
  74. 'READ_CALL_LOG',
  75. 'WRITE_CALL_LOG',
  76. ],
  77. SENSORS: ['BODY_SENSORS'],
  78. SMS: ['SEND_SMS', 'RECEIVE_SMS', 'READ_SMS', 'RECEIVE_WAP_PUSH', 'RECEIVE_MMS'],
  79. STORAGE: ['READ_EXTERNAL_STORAGE', 'WRITE_EXTERNAL_STORAGE'],
  80. NEARBY_DEVICES: ["BLUETOOTH_ADVERTISE", "BLUETOOTH_SCAN", "BLUETOOTH_CONNECT"],
  81. };
  82. _this.locationMode = {
  83. HIGH_ACCURACY: 'high_accuracy',
  84. DEVICE_ONLY: 'device_only',
  85. BATTERY_SAVING: 'battery_saving',
  86. LOCATION_OFF: 'location_off',
  87. };
  88. _this.bluetoothState = {
  89. UNKNOWN: 'unknown',
  90. RESETTING: 'resetting',
  91. UNSUPPORTED: 'unsupported',
  92. UNAUTHORIZED: 'unauthorized',
  93. POWERED_OFF: 'powered_off',
  94. POWERED_ON: 'powered_on',
  95. POWERING_OFF: 'powering_off',
  96. POWERING_ON: 'powering_on',
  97. };
  98. /**
  99. * Access to the photo library (iOS 14+)
  100. *
  101. * ADD_ONLY - can add to but not read from Photo Library
  102. * READ_WRITE - can both add to and read from Photo Library
  103. *
  104. */
  105. _this.photoLibraryAccessLevel = {
  106. ADD_ONLY: 'add_only',
  107. READ_WRITE: 'read_write',
  108. };
  109. return _this;
  110. }
  111. Diagnostic.prototype.isLocationAvailable = function () { return cordova(this, "isLocationAvailable", {}, arguments); };
  112. Diagnostic.prototype.isWifiAvailable = function () { return cordova(this, "isWifiAvailable", {}, arguments); };
  113. Diagnostic.prototype.isCameraAvailable = function (externalStorage) { return cordova(this, "isCameraAvailable", { "callbackOrder": "reverse" }, arguments); };
  114. Diagnostic.prototype.isBluetoothAvailable = function () { return cordova(this, "isBluetoothAvailable", {}, arguments); };
  115. Diagnostic.prototype.switchToLocationSettings = function () { return cordova(this, "switchToLocationSettings", { "sync": true, "platforms": ["Android", "Windows 10", "iOS"] }, arguments); };
  116. Diagnostic.prototype.switchToMobileDataSettings = function () { return cordova(this, "switchToMobileDataSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };
  117. Diagnostic.prototype.switchToBluetoothSettings = function () { return cordova(this, "switchToBluetoothSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };
  118. Diagnostic.prototype.switchToWifiSettings = function () { return cordova(this, "switchToWifiSettings", { "sync": true, "platforms": ["Android", "Windows 10"] }, arguments); };
  119. Diagnostic.prototype.isWifiEnabled = function () { return cordova(this, "isWifiEnabled", { "platforms": ["Android", "Windows 10"] }, arguments); };
  120. Diagnostic.prototype.setWifiState = function (state) { return cordova(this, "setWifiState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };
  121. Diagnostic.prototype.setBluetoothState = function (state) { return cordova(this, "setBluetoothState", { "callbackOrder": "reverse", "platforms": ["Android", "Windows 10"] }, arguments); };
  122. Diagnostic.prototype.enableDebug = function () { return cordova(this, "enableDebug", { "platforms": ["Android", "iOS"] }, arguments); };
  123. Diagnostic.prototype.isLocationEnabled = function () { return cordova(this, "isLocationEnabled", { "platforms": ["Android", "iOS"] }, arguments); };
  124. Diagnostic.prototype.isLocationAuthorized = function () { return cordova(this, "isLocationAuthorized", {}, arguments); };
  125. Diagnostic.prototype.getLocationAuthorizationStatus = function () { return cordova(this, "getLocationAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };
  126. Diagnostic.prototype.getLocationAuthorizationStatuses = function () { return cordova(this, "getLocationAuthorizationStatuses", { "platforms": ["Android", "iOS"] }, arguments); };
  127. Diagnostic.prototype.requestLocationAuthorization = function (mode, accuracy) { return cordova(this, "requestLocationAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };
  128. Diagnostic.prototype.isCameraPresent = function () { return cordova(this, "isCameraPresent", { "platforms": ["Android", "iOS"] }, arguments); };
  129. Diagnostic.prototype.isCameraAuthorized = function (externalStorage) { return cordova(this, "isCameraAuthorized", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };
  130. Diagnostic.prototype.getCameraAuthorizationStatus = function (externalStorage) { return cordova(this, "getCameraAuthorizationStatus", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };
  131. Diagnostic.prototype.requestCameraAuthorization = function (externalStorage) { return cordova(this, "requestCameraAuthorization", { "platforms": ["Android", "iOS"], "callbackOrder": "reverse" }, arguments); };
  132. Diagnostic.prototype.isMicrophoneAuthorized = function () { return cordova(this, "isMicrophoneAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };
  133. Diagnostic.prototype.getMicrophoneAuthorizationStatus = function () { return cordova(this, "getMicrophoneAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };
  134. Diagnostic.prototype.requestMicrophoneAuthorization = function () { return cordova(this, "requestMicrophoneAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };
  135. Diagnostic.prototype.isContactsAuthorized = function () { return cordova(this, "isContactsAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };
  136. Diagnostic.prototype.getContactsAuthorizationStatus = function () { return cordova(this, "getContactsAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };
  137. Diagnostic.prototype.requestContactsAuthorization = function () { return cordova(this, "requestContactsAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };
  138. Diagnostic.prototype.isCalendarAuthorized = function () { return cordova(this, "isCalendarAuthorized", { "platforms": ["Android", "iOS"] }, arguments); };
  139. Diagnostic.prototype.getCalendarAuthorizationStatus = function () { return cordova(this, "getCalendarAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };
  140. Diagnostic.prototype.requestCalendarAuthorization = function () { return cordova(this, "requestCalendarAuthorization", { "platforms": ["Android", "iOS"] }, arguments); };
  141. Diagnostic.prototype.switchToSettings = function () { return cordova(this, "switchToSettings", { "platforms": ["Android", "iOS"] }, arguments); };
  142. Diagnostic.prototype.getBluetoothState = function () { return cordova(this, "getBluetoothState", { "platforms": ["Android", "iOS"] }, arguments); };
  143. Diagnostic.prototype.registerBluetoothStateChangeHandler = function (handler) { return cordova(this, "registerBluetoothStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };
  144. Diagnostic.prototype.registerLocationStateChangeHandler = function (handler) { return cordova(this, "registerLocationStateChangeHandler", { "platforms": ["Android", "iOS"], "sync": true }, arguments); };
  145. Diagnostic.prototype.getArchitecture = function () { return cordova(this, "getArchitecture", { "platforms": ["Android", "iOS"] }, arguments); };
  146. Diagnostic.prototype.getCurrentBatteryLevel = function () { return cordova(this, "getCurrentBatteryLevel", { "platforms": ["Android", "iOS"] }, arguments); };
  147. Diagnostic.prototype.restart = function (cold) { return cordova(this, "restart", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };
  148. Diagnostic.prototype.isGpsLocationAvailable = function () { return cordova(this, "isGpsLocationAvailable", { "platforms": ["Android"] }, arguments); };
  149. Diagnostic.prototype.isGpsLocationEnabled = function () { return cordova(this, "isGpsLocationEnabled", { "platforms": ["Android"] }, arguments); };
  150. Diagnostic.prototype.isNetworkLocationAvailable = function () { return cordova(this, "isNetworkLocationAvailable", { "platforms": ["Android"] }, arguments); };
  151. Diagnostic.prototype.isNetworkLocationEnabled = function () { return cordova(this, "isNetworkLocationEnabled", { "platforms": ["Android"] }, arguments); };
  152. Diagnostic.prototype.isAirplaneModeEnabled = function () { return cordova(this, "isAirplaneModeEnabled", { "platforms": ["Android"] }, arguments); };
  153. Diagnostic.prototype.isMobileDataEnabled = function () { return cordova(this, "isMobileDataEnabled", { "platforms": ["Android"] }, arguments); };
  154. Diagnostic.prototype.getLocationMode = function () { return cordova(this, "getLocationMode", { "platforms": ["Android"] }, arguments); };
  155. Diagnostic.prototype.getDeviceOSVersion = function () { return cordova(this, "getDeviceOSVersion", { "platforms": ["Android"] }, arguments); };
  156. Diagnostic.prototype.getBuildOSVersion = function () { return cordova(this, "getBuildOSVersion", { "platforms": ["Android"] }, arguments); };
  157. Diagnostic.prototype.getPermissionAuthorizationStatus = function (permission) { return cordova(this, "getPermissionAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };
  158. Diagnostic.prototype.getPermissionsAuthorizationStatus = function (permissions) { return cordova(this, "getPermissionsAuthorizationStatus", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };
  159. Diagnostic.prototype.requestRuntimePermission = function (permission) { return cordova(this, "requestRuntimePermission", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };
  160. Diagnostic.prototype.requestRuntimePermissions = function (permissions) { return cordova(this, "requestRuntimePermissions", { "platforms": ["Android"], "callbackOrder": "reverse" }, arguments); };
  161. Diagnostic.prototype.isRequestingPermission = function () { return cordova(this, "isRequestingPermission", { "sync": true }, arguments); };
  162. Diagnostic.prototype.registerPermissionRequestCompleteHandler = function (handler) { return cordova(this, "registerPermissionRequestCompleteHandler", { "sync": true }, arguments); };
  163. Diagnostic.prototype.isBluetoothEnabled = function () { return cordova(this, "isBluetoothEnabled", { "platforms": ["Android"] }, arguments); };
  164. Diagnostic.prototype.hasBluetoothSupport = function () { return cordova(this, "hasBluetoothSupport", { "platforms": ["Android"] }, arguments); };
  165. Diagnostic.prototype.hasBluetoothLESupport = function () { return cordova(this, "hasBluetoothLESupport", { "platforms": ["Android"] }, arguments); };
  166. Diagnostic.prototype.hasBluetoothLEPeripheralSupport = function () { return cordova(this, "hasBluetoothLEPeripheralSupport", { "platforms": ["Android"] }, arguments); };
  167. Diagnostic.prototype.getBluetoothAuthorizationStatus = function () { return cordova(this, "getBluetoothAuthorizationStatus", { "platforms": ["Android", "iOS"] }, arguments); };
  168. Diagnostic.prototype.getBluetoothAuthorizationStatuses = function () { return cordova(this, "getBluetoothAuthorizationStatuses", { "platforms": ["Android"] }, arguments); };
  169. Diagnostic.prototype.isExternalStorageAuthorized = function () { return cordova(this, "isExternalStorageAuthorized", { "platforms": ["Android"] }, arguments); };
  170. Diagnostic.prototype.getExternalStorageAuthorizationStatus = function () { return cordova(this, "getExternalStorageAuthorizationStatus", { "platforms": ["Android"] }, arguments); };
  171. Diagnostic.prototype.requestExternalStorageAuthorization = function () { return cordova(this, "requestExternalStorageAuthorization", { "platforms": ["Android"] }, arguments); };
  172. Diagnostic.prototype.getExternalSdCardDetails = function () { return cordova(this, "getExternalSdCardDetails", { "platforms": ["Android"] }, arguments); };
  173. Diagnostic.prototype.switchToWirelessSettings = function () { return cordova(this, "switchToWirelessSettings", { "platforms": ["Android"], "sync": true }, arguments); };
  174. Diagnostic.prototype.switchToNFCSettings = function () { return cordova(this, "switchToNFCSettings", { "platforms": ["Android"], "sync": true }, arguments); };
  175. Diagnostic.prototype.isNFCPresent = function () { return cordova(this, "isNFCPresent", { "platforms": ["Android"] }, arguments); };
  176. Diagnostic.prototype.isNFCEnabled = function () { return cordova(this, "isNFCEnabled", { "platforms": ["Android"] }, arguments); };
  177. Diagnostic.prototype.isNFCAvailable = function () { return cordova(this, "isNFCAvailable", { "platforms": ["Android"] }, arguments); };
  178. Diagnostic.prototype.registerNFCStateChangeHandler = function (handler) { return cordova(this, "registerNFCStateChangeHandler", { "platforms": ["Android"], "sync": true }, arguments); };
  179. Diagnostic.prototype.isDataRoamingEnabled = function () { return cordova(this, "isDataRoamingEnabled", { "platforms": ["Android"] }, arguments); };
  180. Diagnostic.prototype.isADBModeEnabled = function () { return cordova(this, "isADBModeEnabled", { "platforms": ["Android"] }, arguments); };
  181. Diagnostic.prototype.isDeviceRooted = function () { return cordova(this, "isDeviceRooted", { "platforms": ["Android"] }, arguments); };
  182. Diagnostic.prototype.isCameraRollAuthorized = function (accessLevel) { return cordova(this, "isCameraRollAuthorized", { "platforms": ["iOS"], "callbackOrder": "reverse" }, arguments); };
  183. Diagnostic.prototype.getCameraRollAuthorizationStatus = function (accessLevel) { return cordova(this, "getCameraRollAuthorizationStatus", { "platforms": ["iOS"], "callbackOrder": "reverse" }, arguments); };
  184. Diagnostic.prototype.requestCameraRollAuthorization = function (accessLevel) { return cordova(this, "requestCameraRollAuthorization", { "platforms": ["iOS"], "callbackOrder": "reverse" }, arguments); };
  185. Diagnostic.prototype.presentLimitedLibraryPicker = function () { return cordova(this, "presentLimitedLibraryPicker", { "platforms": ["iOS"] }, arguments); };
  186. Diagnostic.prototype.isRemoteNotificationsEnabled = function () { return cordova(this, "isRemoteNotificationsEnabled", { "platforms": ["iOS", "Android"] }, arguments); };
  187. Diagnostic.prototype.isRegisteredForRemoteNotifications = function () { return cordova(this, "isRegisteredForRemoteNotifications", { "platforms": ["iOS"] }, arguments); };
  188. Diagnostic.prototype.getRemoteNotificationsAuthorizationStatus = function () { return cordova(this, "getRemoteNotificationsAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };
  189. Diagnostic.prototype.requestRemoteNotificationsAuthorization = function (types, omitRegistration) { return cordova(this, "requestRemoteNotificationsAuthorization", { "platforms": ["iOS"] }, arguments); };
  190. Diagnostic.prototype.getRemoteNotificationTypes = function () { return cordova(this, "getRemoteNotificationTypes", { "platforms": ["iOS"] }, arguments); };
  191. Diagnostic.prototype.isRemindersAuthorized = function () { return cordova(this, "isRemindersAuthorized", { "platforms": ["iOS"] }, arguments); };
  192. Diagnostic.prototype.getRemindersAuthorizationStatus = function () { return cordova(this, "getRemindersAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };
  193. Diagnostic.prototype.requestRemindersAuthorization = function () { return cordova(this, "requestRemindersAuthorization", { "platforms": ["iOS"] }, arguments); };
  194. Diagnostic.prototype.isBackgroundRefreshAuthorized = function () { return cordova(this, "isBackgroundRefreshAuthorized", { "platforms": ["iOS"] }, arguments); };
  195. Diagnostic.prototype.getBackgroundRefreshStatus = function () { return cordova(this, "getBackgroundRefreshStatus", { "platforms": ["iOS"] }, arguments); };
  196. Diagnostic.prototype.requestBluetoothAuthorization = function () { return cordova(this, "requestBluetoothAuthorization", { "platforms": ["iOS"] }, arguments); };
  197. Diagnostic.prototype.isMotionAvailable = function () { return cordova(this, "isMotionAvailable", { "platforms": ["iOS"] }, arguments); };
  198. Diagnostic.prototype.isMotionRequestOutcomeAvailable = function () { return cordova(this, "isMotionRequestOutcomeAvailable", { "platforms": ["iOS"] }, arguments); };
  199. Diagnostic.prototype.requestMotionAuthorization = function () { return cordova(this, "requestMotionAuthorization", { "platforms": ["iOS"] }, arguments); };
  200. Diagnostic.prototype.getMotionAuthorizationStatus = function () { return cordova(this, "getMotionAuthorizationStatus", { "platforms": ["iOS"] }, arguments); };
  201. Diagnostic.prototype.getLocationAccuracyAuthorization = function () { return cordova(this, "getLocationAccuracyAuthorization", { "platforms": ["iOS", "Android"] }, arguments); };
  202. Diagnostic.prototype.requestTemporaryFullAccuracyAuthorization = function (purpose) { return cordova(this, "requestTemporaryFullAccuracyAuthorization", { "platforms": ["iOS"] }, arguments); };
  203. Diagnostic.prototype.registerLocationAccuracyAuthorizationChangeHandler = function (handler) { return cordova(this, "registerLocationAccuracyAuthorizationChangeHandler", { "platforms": ["iOS"], "sync": true }, arguments); };
  204. Object.defineProperty(Diagnostic.prototype, "permissionStatus", {
  205. get: function () { return cordovaPropertyGet(this, "permissionStatus"); },
  206. set: function (value) { cordovaPropertySet(this, "permissionStatus", value); },
  207. enumerable: false,
  208. configurable: true
  209. });
  210. Object.defineProperty(Diagnostic.prototype, "NFCState", {
  211. get: function () { return cordovaPropertyGet(this, "NFCState"); },
  212. set: function (value) { cordovaPropertySet(this, "NFCState", value); },
  213. enumerable: false,
  214. configurable: true
  215. });
  216. Object.defineProperty(Diagnostic.prototype, "cpuArchitecture", {
  217. get: function () { return cordovaPropertyGet(this, "cpuArchitecture"); },
  218. set: function (value) { cordovaPropertySet(this, "cpuArchitecture", value); },
  219. enumerable: false,
  220. configurable: true
  221. });
  222. Object.defineProperty(Diagnostic.prototype, "remoteNotificationType", {
  223. get: function () { return cordovaPropertyGet(this, "remoteNotificationType"); },
  224. set: function (value) { cordovaPropertySet(this, "remoteNotificationType", value); },
  225. enumerable: false,
  226. configurable: true
  227. });
  228. Object.defineProperty(Diagnostic.prototype, "motionStatus", {
  229. get: function () { return cordovaPropertyGet(this, "motionStatus"); },
  230. set: function (value) { cordovaPropertySet(this, "motionStatus", value); },
  231. enumerable: false,
  232. configurable: true
  233. });
  234. Diagnostic.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Diagnostic, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
  235. Diagnostic.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Diagnostic });
  236. Diagnostic.pluginName = "Diagnostic";
  237. Diagnostic.plugin = "cordova.plugins.diagnostic";
  238. Diagnostic.pluginRef = "cordova.plugins.diagnostic";
  239. Diagnostic.repo = "https://github.com/dpa99c/cordova-diagnostic-plugin";
  240. Diagnostic.platforms = ["Android", "iOS", "Windows"];
  241. Diagnostic = __decorate([], Diagnostic);
  242. return Diagnostic;
  243. }(AwesomeCordovaNativePlugin));
  244. export { Diagnostic };
  245. i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Diagnostic, decorators: [{
  246. type: Injectable
  247. }], propDecorators: { permissionStatus: [], NFCState: [], cpuArchitecture: [], remoteNotificationType: [], motionStatus: [], isLocationAvailable: [], isWifiAvailable: [], isCameraAvailable: [], isBluetoothAvailable: [], switchToLocationSettings: [], switchToMobileDataSettings: [], switchToBluetoothSettings: [], switchToWifiSettings: [], isWifiEnabled: [], setWifiState: [], setBluetoothState: [], enableDebug: [], isLocationEnabled: [], isLocationAuthorized: [], getLocationAuthorizationStatus: [], getLocationAuthorizationStatuses: [], requestLocationAuthorization: [], isCameraPresent: [], isCameraAuthorized: [], getCameraAuthorizationStatus: [], requestCameraAuthorization: [], isMicrophoneAuthorized: [], getMicrophoneAuthorizationStatus: [], requestMicrophoneAuthorization: [], isContactsAuthorized: [], getContactsAuthorizationStatus: [], requestContactsAuthorization: [], isCalendarAuthorized: [], getCalendarAuthorizationStatus: [], requestCalendarAuthorization: [], switchToSettings: [], getBluetoothState: [], registerBluetoothStateChangeHandler: [], registerLocationStateChangeHandler: [], getArchitecture: [], getCurrentBatteryLevel: [], restart: [], isGpsLocationAvailable: [], isGpsLocationEnabled: [], isNetworkLocationAvailable: [], isNetworkLocationEnabled: [], isAirplaneModeEnabled: [], isMobileDataEnabled: [], getLocationMode: [], getDeviceOSVersion: [], getBuildOSVersion: [], getPermissionAuthorizationStatus: [], getPermissionsAuthorizationStatus: [], requestRuntimePermission: [], requestRuntimePermissions: [], isRequestingPermission: [], registerPermissionRequestCompleteHandler: [], isBluetoothEnabled: [], hasBluetoothSupport: [], hasBluetoothLESupport: [], hasBluetoothLEPeripheralSupport: [], getBluetoothAuthorizationStatus: [], getBluetoothAuthorizationStatuses: [], isExternalStorageAuthorized: [], getExternalStorageAuthorizationStatus: [], requestExternalStorageAuthorization: [], getExternalSdCardDetails: [], switchToWirelessSettings: [], switchToNFCSettings: [], isNFCPresent: [], isNFCEnabled: [], isNFCAvailable: [], registerNFCStateChangeHandler: [], isDataRoamingEnabled: [], isADBModeEnabled: [], isDeviceRooted: [], isCameraRollAuthorized: [], getCameraRollAuthorizationStatus: [], requestCameraRollAuthorization: [], presentLimitedLibraryPicker: [], isRemoteNotificationsEnabled: [], isRegisteredForRemoteNotifications: [], getRemoteNotificationsAuthorizationStatus: [], requestRemoteNotificationsAuthorization: [], getRemoteNotificationTypes: [], isRemindersAuthorized: [], getRemindersAuthorizationStatus: [], requestRemindersAuthorization: [], isBackgroundRefreshAuthorized: [], getBackgroundRefreshStatus: [], requestBluetoothAuthorization: [], isMotionAvailable: [], isMotionRequestOutcomeAvailable: [], requestMotionAuthorization: [], getMotionAuthorizationStatus: [], getLocationAccuracyAuthorization: [], requestTemporaryFullAccuracyAuthorization: [], registerLocationAccuracyAuthorizationChangeHandler: [] } });
  248. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL3BsdWdpbnMvZGlhZ25vc3RpYy9uZ3gvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTywrRUFBZ0UsTUFBTSwrQkFBK0IsQ0FBQzs7O0lBeUM3RSw4QkFBMEI7OztRQUN4RCxnQkFBVSxHQUFHO1lBQ1gsZUFBZSxFQUFFLGlCQUFpQjtZQUNsQywwQkFBMEIsRUFBRSw0QkFBNEI7WUFDeEQsc0JBQXNCLEVBQUUsd0JBQXdCO1lBQ2hELG9CQUFvQixFQUFFLHNCQUFzQjtZQUM1QyxxQkFBcUIsRUFBRSx1QkFBdUI7WUFDOUMsb0JBQW9CLEVBQUUsc0JBQXNCO1lBQzVDLGFBQWEsRUFBRSxlQUFlO1lBQzlCLGtCQUFrQixFQUFFLG9CQUFvQjtZQUN4QyxtQkFBbUIsRUFBRSxxQkFBcUI7WUFDMUMsaUJBQWlCLEVBQUUsbUJBQW1CO1lBQ3RDLGNBQWMsRUFBRSxnQkFBZ0I7WUFDaEMsWUFBWSxFQUFFLGNBQWM7WUFDNUIsdUJBQXVCLEVBQUUseUJBQXlCO1lBQ2xELFVBQVUsRUFBRSxZQUFZO1lBQ3hCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFlBQVksRUFBRSxjQUFjO1lBQzVCLG1CQUFtQixFQUFFLHFCQUFxQjtZQUMxQyxrQkFBa0IsRUFBRSxvQkFBb0I7WUFDeEMsc0JBQXNCLEVBQUUsd0JBQXdCO1lBQ2hELGFBQWEsRUFBRSxlQUFlO1lBQzlCLGFBQWEsRUFBRSxlQUFlO1lBQzlCLGFBQWEsRUFBRSxlQUFlO1lBQzlCLHFCQUFxQixFQUFFLHVCQUF1QjtZQUM5QyxnQkFBZ0IsRUFBRSxrQkFBa0I7WUFDcEMsaUJBQWlCLEVBQUUsbUJBQW1CO1lBQ3RDLGdCQUFnQixFQUFFLGtCQUFrQjtZQUNwQyxrQkFBa0IsRUFB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LDBCQUEwQixNQWExQix3QkFBd0IsTUFVeEIscUJBQXFCLE1BVXJCLG1CQUFtQixNQVVuQixlQUFlLE1BVWYsa0JBQWtCLE1BVWxCLGlCQUFpQixNQVlqQixnQ0FBZ0MsTUFZaEMsaUNBQWlDLE1BWWpDLHdCQUF3QixNQVl4Qix5QkFBeUIsTUFhekIsc0JBQXNCLE1BV3RCLHdDQUF3QyxNQVd4QyxrQkFBa0IsTUFVbEIsbUJBQW1CLE1BVW5CLHFCQUFxQixNQVVyQiwrQkFBK0IsTUFVL0IsK0JBQStCLE1BVy9CLGlDQUFpQyxNQVVqQywyQkFBMkIsTUFVM0IscUNBQXFDLE1BVXJDLG1DQUFtQyxNQWVuQyx3QkFBd0IsTUFXeEIsd0JBQXdCLE1BU3hCLG1CQUFtQixNQVFuQixZQUFZLE1BV1osWUFBWSxNQVdaLGNBQWMsTUFlZCw2QkFBNkIsTUFRN0Isb0JBQW9CLE1BVXBCLGdCQUFnQixNQVVoQixjQUFjLE1BbUJkLHNCQUFzQixNQWlCdEIsZ0NBQWdDLE1BbUJoQyw4QkFBOEIsTUFVOUIsMkJBQTJCLE1BVTNCLDRCQUE0QixNQVU1QixrQ0FBa0MsTUFXbEMseUNBQXlDLE1BWXpDLHVDQUF1QyxNQVd2QywwQkFBMEIsTUFVMUIscUJBQXFCLE1BVXJCLCtCQUErQixNQVUvQiw2QkFBNkIsTUFVN0IsNkJBQTZCLE1BVTdCLDBCQUEwQixNQVkxQiw2QkFBNkIsTUFVN0IsaUJBQWlCLE1BWWpCLCtCQUErQixNQVkvQiwwQkFBMEIsTUFZMUIsNEJBQTRCLE1BWTVCLGdDQUFnQyxNQWFoQyx5Q0FBeUMsTUFZekMsa0RBQWtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZG92YSwgQ29yZG92YVByb3BlcnR5LCBBd2Vzb21lQ29yZG92YU5hdGl2ZVBsdWdpbiwgUGx1Z2luIH0gZnJvbSAnQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL2NvcmUnO1xuXG4vKipcbiAqIEBuYW1lIERpYWdub3N0aWNcbiAqIEBkZXNjcmlwdGlvblxuICogQ2hlY2tzIHdoZXRoZXIgZGV2aWNlIGhhcmR3YXJlIGZlYXR1cmVzIGFyZSBlbmFibGVkIG9yIGF2YWlsYWJsZSB0byB0aGUgYXBwLCBlLmcuIGNhbWVyYSwgR1BTLCB3aWZpXG4gKiBAdXNhZ2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERpYWdub3N0aWMgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZGlhZ25vc3RpYy9uZ3gnO1xuICpcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhZ25vc3RpYzogRGlhZ25vc3RpYykgeyB9XG4gKlxuICogLi4uXG4gKlxuICogbGV0IHN1Y2Nlc3NDYWxsYmFjayA9IChpc0F2YWlsYWJsZSkgPT4geyBjb25zb2xlLmxvZygnSXMgYXZhaWxhYmxlPyAnICsgaXNBdmFpbGFibGUpOyB9XG4gKiBsZXQgZXJyb3JDYWxsYmFjayA9IChlKSA9PiBjb25zb2xlLmVycm9yKGUpO1xuICpcbiAqIHRoaXMuZGlhZ25vc3RpYy5pc0NhbWVyYUF2YWlsYWJsZSgpLnRoZW4oc3VjY2Vzc0NhbGxiYWNrKS5jYXRjaChlcnJvckNhbGxiYWNrKTtcbiAqXG4gKiB0aGlzLmRpYWdub3N0aWMuaXNCbHVldG9vdGhBdmFpbGFibGUoKS50aGVuKHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gKlxuICpcbiAqIHRoaXMuZGlhZ25vc3RpYy5nZXRCbHVldG9vdGhTdGF0ZSgpXG4gKiAgIC50aGVuKChzdGF0ZSkgPT4ge1xuICogICAgIGlmIChzdGF0ZSA9PSB0aGlzLmRpYWdub3N0aWMuYmx1ZXRvb3RoU3RhdGUuUE9XRVJFRF9PTil7XG4gKiAgICAgICAvLyBkbyBzb21ldGhpbmdcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgLy8gZG8gc29tZXRoaW5nIGVsc2VcbiAqICAgICB9XG4gKiAgIH0pLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihlKSk7XG4gKlxuICogYGBgXG4gKi9cbkBQbHVnaW4oe1xuICBwbHVnaW5OYW1lOiAnRGlhZ25vc3RpYycsXG4gIHBsdWdpbjogJ2NvcmRvdmEucGx1Z2lucy5kaWFnbm9zdGljJyxcbiAgcGx1Z2luUmVmOiAnY29yZG92YS5wbHVnaW5zLmRpYWdub3N0aWMnLFxuICByZXBvOiAnaHR0cHM6Ly9naXRodWIuY29tL2RwYTk5Yy9jb3Jkb3ZhLWRpYWdub3N0aWMtcGx1Z2luJyxcbiAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJywgJ1dpbmRvd3MnXSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpYyBleHRlbmRzIEF3ZXNvbWVDb3Jkb3ZhTmF0aXZlUGx1Z2luIHtcbiAgcGVybWlzc2lvbiA9IHtcbiAgICBBQ0NFUFRfSEFORE9WRVI6ICdBQ0NFUFRfSEFORE9WRVInLFxuICAgIEFDQ0VTU19CQUNLR1JPVU5EX0xPQ0FUSU9OOiAnQUNDRVNTX0JBQ0tHUk9VTkRfTE9DQVRJT04nLFxuICAgIEFDQ0VTU19DT0FSU0VfTE9DQVRJT046ICdBQ0NFU1NfQ09BUlNFX0xPQ0FUSU9OJyxcbiAgICBBQ0NFU1NfRklORV9MT0NBVElPTjogJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJyxcbiAgICBBQ0NFU1NfTUVESUFfTE9DQVRJT046ICdBQ0NFU1NfTUVESUFfTE9DQVRJT04nLFxuICAgIEFDVElWSVRZX1JFQ09HTklUSU9OOiAnQUNUSVZJVFlfUkVDT0dOSVRJT04nLFxuICAgIEFERF9WT0lDRU1BSUw6ICdBRERfVk9JQ0VNQUlMJyxcbiAgICBBTlNXRVJfUEhPTkVfQ0FMTFM6ICdBTlNXRVJfUEhPTkVfQ0FMTFMnLFxuICAgIEJMVUVUT09USF9BRFZFUlRJU0U6ICdCTFVFVE9PVEhfQURWRVJUSVNFJyxcbiAgICBCTFVFVE9PVEhfQ09OTkVDVDogJ0JMVUVUT09USF9DT05ORUNUJyxcbiAgICBCTFVFVE9PVEhfU0NBTjogJ0JMVUVUT09USF9TQ0FOJyxcbiAgICBCT0RZX1NFTlNPUlM6ICdCT0RZX1NFTlNPUlMnLFxuICAgIEJPRFlfU0VOU09SU19CQUNLR1JPVU5EOiAnQk9EWV9TRU5TT1JTX0JBQ0tHUk9VTkQnLFxuICAgIENBTExfUEhPTkU6ICdDQUxMX1BIT05FJyxcbiAgICBDQU1FUkE6ICdDQU1FUkEnLFxuICAgIEdFVF9BQ0NPVU5UUzogJ0dFVF9BQ0NPVU5UUycsXG4gICAgTkVBUkJZX1dJRklfREVWSUNFUzogJ05FQVJCWV9XSUZJX0RFVklDRVMnLFxuICAgIFBPU1RfTk9USUZJQ0FUSU9OUzogJ1BPU1RfTk9USUZJQ0FUSU9OUycsXG4gICAgUFJPQ0VTU19PVVRHT0lOR19DQUxMUzogJ1BST0NFU1NfT1VUR09JTkdfQ0FMTFMnLFxuICAgIFJFQURfQ0FMRU5EQVI6ICdSRUFEX0NBTEVOREFSJyxcbiAgICBSRUFEX0NBTExfTE9HOiAnUkVBRF9DQUxMX0xPRycsXG4gICAgUkVBRF9DT05UQUNUUzogJ1JFQURfQ09OVEFDVFMnLFxuICAgIFJFQURfRVhURVJOQUxfU1RPUkFHRTogJ1JFQURfRVhURVJOQUxfU1RPUkFHRScsXG4gICAgUkVBRF9NRURJQV9BVURJTzogJ1JFQURfTUVESUFfQVVESU8nLFxuICAgIFJFQURfTUVESUFfSU1BR0VTOiAnUkVBRF9NRURJQV9JTUFHRVMnLFxuICAgIFJFQURfTUVESUFfVklERU86ICdSRUFEX01FRElBX1ZJREVPJyxcbiAgICBSRUFEX1BIT05FX05VTUJFUlM6ICdSRUFEX1BIT05FX05VTUJFUlMnLFxuICAgIFJFQURfUEhPTkVfU1RBVEU6ICdSRUFEX1BIT05FX1NUQVRFJyxcbiAgICBSRUFEX1NNUzogJ1JFQURfU01TJyxcbiAgICBSRUNFSVZFX01NUzogJ1JFQ0VJVkVfTU1TJyxcbiAgICBSRUNFSVZFX1NNUzogJ1JFQ0VJVkVfU01TJyxcbiAgICBSRUNFSVZFX1dBUF9QVVNIOiAnUkVDRUlWRV9XQVBfUFVTSCcsXG4gICAgUkVDT1JEX0FVRElPOiAnUkVDT1JEX0FVRElPJyxcbiAgICBTRU5EX1NNUzogJ1NFTkRfU01TJyxcbiAgICBVU0VfU0lQOiAnVVNFX1NJUCcsXG4gICAgVVdCX1JBTkdJTkc6ICdVV0JfUkFOR0lORycsXG4gICAgV1JJVEVfQ0FMRU5EQVI6ICdXUklURV9DQUxFTkRBUicsXG4gICAgV1JJVEVfQ0FMTF9MT0c6ICdXUklURV9DQUxMX0xPRycsXG4gICAgV1JJVEVfQ09OVEFDVFM6ICdXUklURV9DT05UQUNUUycsXG4gICAgV1JJVEVfRVhURVJOQUxfU1RPUkFHRTogJ1dSSVRFX0VYVEVSTkFMX1NUT1JBR0UnLFxuICB9O1xuXG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICBwZXJtaXNzaW9uU3RhdHVzOiB7XG4gICAgR1JBTlRFRDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGNvcmRvdmEucGx1Z2lucy5kaWFnbm9zdGljQDUuMC4wIHVzZXMgREVOSUVEX09OQ0UgdG8gdW5pZnkgREVOSUVEKiBzdGF0dXNlcyBhY3Jvc3MgaU9TL0FuZHJvaWRcbiAgICAgKi9cbiAgICBERU5JRUQ6IHN0cmluZztcbiAgICBERU5JRURfT05DRTogc3RyaW5nO1xuICAgIE5PVF9SRVFVRVNURUQ6IHN0cmluZztcbiAgICBERU5JRURfQUxXQVlTOiBzdHJpbmc7XG4gICAgUkVTVFJJQ1RFRDogc3RyaW5nO1xuICAgIEdSQU5URURfV0hFTl9JTl9VU0U6IHN0cmluZztcbiAgICBFUEhFTUVSQUw6IHN0cmluZztcbiAgICBQUk9WSVNJT05BTDogc3RyaW5nO1xuICAgIExJTUlURUQ6IHN0cmluZztcbiAgfTtcblxuICBsb2NhdGlvbkF1dGhvcml6YXRpb25Nb2RlID0ge1xuICAgIEFMV0FZUzogJ2Fsd2F5cycsXG4gICAgV0hFTl9JTl9VU0U6ICd3aGVuX2luX3VzZScsXG4gIH07XG5cbiAgLyoqXG4gICAqIExvY2F0aW9uIGFjY3VyYWN5IGF1dGhvcml6YXRpb25cbiAgICovXG4gIGxvY2F0aW9uQWNjdXJhY3lBdXRob3JpemF0aW9uID0ge1xuICAgIEZVTEw6ICdmdWxsJyxcbiAgICBSRURVQ0VEOiAncmVkdWNlZCcsXG4gIH07XG5cbiAgcGVybWlzc2lvbkdyb3VwcyA9IHtcbiAgICBDQUxFTkRBUjogWydSRUFEX0NBTEVOREFSJywgJ1dSSVRFX0NBTEVOREFSJ10sXG4gICAgQ0FNRVJBOiBbJ0NBTUVSQSddLFxuICAgIENPTlRBQ1RTOiBbJ1JFQURfQ09OVEFDVFMnLCAnV1JJVEVfQ09OVEFDVFMnLCAnR0VUX0FDQ09VTlRTJ10sXG4gICAgTE9DQVRJT046IFsnQUNDRVNTX0ZJTkVfTE9DQVRJT04nLCAnQUNDRVNTX0NPQVJTRV9MT0NBVElPTiddLFxuICAgIE1JQ1JPUEhPTkU6IFsnUkVDT1JEX0FVRElPJ10sXG4gICAgUEhPTkU6IFtcbiAgICAgICdSRUFEX1BIT05FX1NUQVRFJyxcbiAgICAgICdDQUxMX1BIT05FJyxcbiAgICAgICdBRERfVk9JQ0VNQUlMJyxcbiAgICAgICdVU0VfU0lQJyxcbiAgICAgICdQUk9DRVNTX09VVEdPSU5HX0NBTExTJyxcbiAgICAgICdSRUFEX0NBTExfTE9HJyxcbiAgICAgICdXUklURV9DQUxMX0xPRycsXG4gICAgXSxcbiAgICBTRU5TT1JTOiBbJ0JPRFlfU0VOU09SUyddLFxuICAgIFNNUzogWydTRU5EX1NNUycsICdSRUNFSVZFX1NNUycsICdSRUFEX1NNUycsICdSRUNFSVZFX1dBUF9QVVNIJywgJ1JFQ0VJVkVfTU1TJ10sXG4gICAgU1RPUkFHRTogWydSRUFEX0VYVEVSTkFMX1NUT1JBR0UnLCAnV1JJVEVfRVhURVJOQUxfU1RPUkFHRSddLFxuICAgIE5FQVJCWV9ERVZJQ0VTOiBbXCJCTFVFVE9PVEhfQURWRVJUSVNFXCIsIFwiQkxVRVRPT1RIX1NDQU5cIiwgXCJCTFVFVE9PVEhfQ09OTkVDVFwiXSxcbiAgfTtcblxuICBsb2NhdGlvbk1vZGUgPSB7XG4gICAgSElHSF9BQ0NVUkFDWTogJ2hpZ2hfYWNjdXJhY3knLFxuICAgIERFVklDRV9PTkxZOiAnZGV2aWNlX29ubHknLFxuICAgIEJBVFRFUllfU0FWSU5HOiAnYmF0dGVyeV9zYXZpbmcnLFxuICAgIExPQ0FUSU9OX09GRjogJ2xvY2F0aW9uX29mZicsXG4gIH07XG5cbiAgYmx1ZXRvb3RoU3RhdGUgPSB7XG4gICAgVU5LTk9XTjogJ3Vua25vd24nLFxuICAgIFJFU0VUVElORzogJ3Jlc2V0dGluZycsIC8vIGlPU1xuICAgIFVOU1VQUE9SVEVEOiAndW5zdXBwb3J0ZWQnLCAvLyBpT1NcbiAgICBVTkFVVEhPUklaRUQ6ICd1bmF1dGhvcml6ZWQnLCAvLyBpT1NcbiAgICBQT1dFUkVEX09GRjogJ3Bvd2VyZWRfb2ZmJyxcbiAgICBQT1dFUkVEX09OOiAncG93ZXJlZF9vbicsXG4gICAgUE9XRVJJTkdfT0ZGOiAncG93ZXJpbmdfb2ZmJyxcbiAgICBQT1dFUklOR19PTjogJ3Bvd2VyaW5nX29uJyxcbiAgfTtcblxuICBAQ29yZG92YVByb3BlcnR5KClcbiAgTkZDU3RhdGU6IHtcbiAgICBVTktOT1dOOiBzdHJpbmc7XG4gICAgUE9XRVJFRF9PRkY6IHN0cmluZztcbiAgICBQT1dFUkVEX09OOiBzdHJpbmc7XG4gICAgUE9XRVJJTkdfT046IHN0cmluZztcbiAgICBQT1dFUklOR19PRkY6IHN0cmluZztcbiAgfTtcblxuICBAQ29yZG92YVByb3BlcnR5KClcbiAgY3B1QXJjaGl0ZWN0dXJlOiB7XG4gICAgICBNSVBTOiBzdHJpbmc7XG4gICAgICBNSVBTXzY0OiBzdHJpbmc7XG4gICAgICBVTktOT1dOOiBzdHJpbmc7XG4gICAgICBBUk12Njogc3RyaW5nO1xuICAgICAgQVJNdjc6IHN0cmluZztcbiAgICAgIEFSTXY4OiBzdHJpbmc7XG4gICAgICBYODY6IHN0cmluZztcbiAgICAgIFg4Nl82NDogc3RyaW5nO1xuICB9O1xuXG4gIEBDb3Jkb3ZhUHJvcGVydHkoKVxuICByZW1vdGVOb3RpZmljYXRpb25UeXBlOiB7XG4gICAgICBBTEVSVDogc3RyaW5nO1xuICAgICAgU09VTkQ6IHN0cmluZztcbiAgICAgIEJBREdFOiBzdHJpbmc7XG4gIH07XG5cbiAgQENvcmRvdmFQcm9wZXJ0eSgpXG4gIG1vdGlvblN0YXR1czoge1xuICAgIE5PVF9SRVFVRVNURUQ6IHN0cmluZztcbiAgICBHUkFOVEVEOiBzdHJpbmc7XG4gICAgREVOSUVEOiBzdHJpbmc7XG4gICAgUkVTVFJJQ1RFRDogc3RyaW5nO1xuICAgIE5PVF9BVkFJTEFCTEU6IHN0cmluZztcbiAgICBOT1RfREVURVJNSU5FRDogc3RyaW5nO1xuICAgIFVOS05PV046IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogQWNjZXNzIHRvIHRoZSBwaG90byBsaWJyYXJ5IChpT1MgMTQrKVxuICAgKlxuICAgKiBBRERfT05MWSAtIGNhbiBhZGQgdG8gYnV0IG5vdCByZWFkIGZyb20gUGhvdG8gTGlicmFyeVxuICAgKiBSRUFEX1dSSVRFIC0gY2FuIGJvdGggYWRkIHRvIGFuZCByZWFkIGZyb20gUGhvdG8gTGlicmFyeVxuICAgKlxuICAgKi9cbiAgcGhvdG9MaWJyYXJ5QWNjZXNzTGV2ZWwgPSB7XG4gICAgQUREX09OTFk6ICdhZGRfb25seScsXG4gICAgUkVBRF9XUklURTogJ3JlYWRfd3JpdGUnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYXBwIGlzIGFibGUgdG8gYWNjZXNzIGRldmljZSBsb2NhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKClcbiAgaXNMb2NhdGlvbkF2YWlsYWJsZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgV2lmaSBpcyBjb25uZWN0ZWQvZW5hYmxlZC4gT24gaU9TIHRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yayBieSBXaUZpLiBPbiBBbmRyb2lkIGFuZCBXaW5kb3dzIDEwIE1vYmlsZSB0aGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgV2lGaSBzZXR0aW5nIGlzIHNldCB0byBlbmFibGVkLlxuICAgKiBPbiBBbmRyb2lkIHRoaXMgcmVxdWlyZXMgcGVybWlzc2lvbi4gYDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPVwiYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19XSUZJX1NUQVRFXCIgLz5gXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSgpXG4gIGlzV2lmaUF2YWlsYWJsZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGRldmljZSBoYXMgYSBjYW1lcmEuIE9uIEFuZHJvaWQgdGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBoYXMgYSBjYW1lcmEuIE9uIGlPUyB0aGlzIHJldHVybnMgdHJ1ZSBpZiBib3RoIHRoZSBkZXZpY2UgaGFzIGEgY2FtZXJhIEFORCB0aGUgYXBwbGljYXRpb24gaXMgYXV0aG9yaXplZCB0byB1c2UgaXQuIE9uIFdpbmRvd3MgMTAgTW9iaWxlIHRoaXMgcmV0dXJucyB0cnVlIGlmIGJvdGggdGhlIGRldmljZSBoYXMgYSByZWFyLWZhY2luZyBjYW1lcmEgQU5EIHRoZVxuICAgKiBhcHBsaWNhdGlvbiBpcyBhdXRob3JpemVkIHRvIHVzZSBpdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXh0ZXJuYWxTdG9yYWdlXSBBbmRyb2lkIG9ubHk6IElmIHRydWUsIGNoZWNrcyBwZXJtaXNzaW9uIGZvciBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgaW4gYWRkaXRpb24gdG8gQ0FNRVJBIHJ1bi10aW1lIHBlcm1pc3Npb24uXG4gICAqICBjb3Jkb3ZhLXBsdWdpbi1jYW1lcmFAMi4yKyByZXF1aXJlcyBib3RoIG9mIHRoZXNlIHBlcm1pc3Npb25zLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgaXNDYW1lcmFBdmFpbGFibGUoZXh0ZXJuYWxTdG9yYWdlPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGV2aWNlIGhhcyBCbHVldG9vdGggY2FwYWJpbGl0aWVzIGFuZCBpZiBzbyB0aGF0IEJsdWV0b290aCBpcyBzd2l0Y2hlZCBvbiAoc2FtZSBvbiBBbmRyb2lkLCBpT1MgYW5kIFdpbmRvd3MgMTAgTW9iaWxlKVxuICAgKiBPbiBBbmRyb2lkIHRoaXMgcmVxdWlyZXMgcGVybWlzc2lvbiA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT1cImFuZHJvaWQucGVybWlzc2lvbi5CTFVFVE9PVEhcIiAvPlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBpc0JsdWV0b290aEF2YWlsYWJsZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyB0aGUgZGV2aWNlIGxvY2F0aW9uIHNldHRpbmdzIHRvIGFsbG93IHVzZXIgdG8gZW5hYmxlIGxvY2F0aW9uIHNlcnZpY2VzL2NoYW5nZSBsb2NhdGlvbiBtb2RlLlxuICAgKi9cbiAgQENvcmRvdmEoeyBzeW5jOiB0cnVlLCBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdXaW5kb3dzIDEwJywgJ2lPUyddIH0pXG4gIHN3aXRjaFRvTG9jYXRpb25TZXR0aW5ncygpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIG1vYmlsZSBzZXR0aW5ncyB0byBhbGxvdyB1c2VyIHRvIGVuYWJsZSBtb2JpbGUgZGF0YS5cbiAgICovXG4gIEBDb3Jkb3ZhKHsgc3luYzogdHJ1ZSwgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnV2luZG93cyAxMCddIH0pXG4gIHN3aXRjaFRvTW9iaWxlRGF0YVNldHRpbmdzKCk6IHZvaWQge31cblxuICAvKipcbiAgICogRGlzcGxheXMgQmx1ZXRvb3RoIHNldHRpbmdzIHRvIGFsbG93IHVzZXIgdG8gZW5hYmxlIEJsdWV0b290aC5cbiAgICovXG4gIEBDb3Jkb3ZhKHsgc3luYzogdHJ1ZSwgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnV2luZG93cyAxMCddIH0pXG4gIHN3aXRjaFRvQmx1ZXRvb3RoU2V0dGluZ3MoKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5cyBXaUZpIHNldHRpbmdzIHRvIGFsbG93IHVzZXIgdG8gZW5hYmxlIFdpRmkuXG4gICAqL1xuICBAQ29yZG92YSh7IHN5bmM6IHRydWUsIHBsYXRmb3JtczogWydBbmRyb2lkJywgJ1dpbmRvd3MgMTAnXSB9KVxuICBzd2l0Y2hUb1dpZmlTZXR0aW5ncygpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2lGaSBzZXR0aW5nIGlzIHNldCB0byBlbmFibGVkLCBhbmQgaXMgdGhlIHNhbWUgYXMgYGlzV2lmaUF2YWlsYWJsZSgpYFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnV2luZG93cyAxMCddIH0pXG4gIGlzV2lmaUVuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMvZGlzYWJsZXMgV2lGaSBvbiB0aGUgZGV2aWNlLlxuICAgKiBSZXF1aXJlcyBgQUNDRVNTX1dJRklfU1RBVEVgIGFuZCBgQ0hBTkdFX1dJRklfU1RBVEVgIHBlcm1pc3Npb25zIG9uIEFuZHJvaWRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScsIHBsYXRmb3JtczogWydBbmRyb2lkJywgJ1dpbmRvd3MgMTAnXSB9KVxuICBzZXRXaWZpU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzL2Rpc2FibGVzIEJsdWV0b290aCBvbiB0aGUgZGV2aWNlLlxuICAgKiBSZXF1aXJlcyBgQkxVRVRPT1RIYCBhbmQgYEJMVUVUT09USF9BRE1JTmAgcGVybWlzc2lvbnMgb24gQW5kcm9pZFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJywgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnV2luZG93cyAxMCddIH0pXG4gIHNldEJsdWV0b290aFN0YXRlKHN0YXRlOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuXG4gIC8vIEFORFJPSUQgQU5EIElPUyBPTkxZXG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgZGVidWcgbW9kZSwgd2hpY2ggbG9ncyBuYXRpdmUgcGx1Z2luIGRlYnVnIG1lc3NhZ2VzIHRvIHRoZSBuYXRpdmUgYW5kIEpTIGNvbnNvbGVzLlxuICAgKiBEZWJ1ZyBtb2RlIGlzIGluaXRpYWxseSBkaXNhYmxlZCBvbiBwbHVnaW4gaW5pdGlhbGlzYXRpb24uXG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddIH0pXG4gIGVuYWJsZURlYnVnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBzZXR0aW5nIGZvciBsb2NhdGlvbiBpcyBvbi4gT24gQW5kcm9pZCB0aGlzIHJldHVybnMgdHJ1ZSBpZiBMb2NhdGlvbiBNb2RlIGlzIHN3aXRjaGVkIG9uLiBPbiBpT1MgdGhpcyByZXR1cm5zIHRydWUgaWYgTG9jYXRpb24gU2VydmljZXMgaXMgc3dpdGNoZWQgb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBpc0xvY2F0aW9uRW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRob3JpemVkIHRvIHVzZSBsb2NhdGlvbi5cbiAgICogTm90ZSBmb3IgQW5kcm9pZDogdGhpcyBpcyBpbnRlbmRlZCBmb3IgQW5kcm9pZCA2IC8gQVBJIDIzIGFuZCBhYm92ZS4gQ2FsbGluZyBvbiBBbmRyb2lkIDUgLyBBUEkgMjIgYW5kIGJlbG93IHdpbGwgYWx3YXlzIHJldHVybiBHUkFOVEVEIHN0YXR1cyBhcyBwZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBncmFudGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoKVxuICBpc0xvY2F0aW9uQXV0aG9yaXplZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBnZXRMb2NhdGlvbkF1dGhvcml6YXRpb25TdGF0dXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5kaXZpZHVhbCBsb2NhdGlvbiBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgZWFjaCB0eXBlIG9mIGxvY2F0aW9uIGFjY2VzcyAoRklORSwgQ09BUlNFIGFuZCBCQUNLR1JPVU5EKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgZ2V0TG9jYXRpb25BdXRob3JpemF0aW9uU3RhdHVzZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKiBOb3RlIGZvciBBbmRyb2lkOiB0aGlzIGlzIGludGVuZGVkIGZvciBBbmRyb2lkIDYgLyBBUEkgMjMgYW5kIGFib3ZlLiBDYWxsaW5nIG9uIEFuZHJvaWQgNSAvIEFQSSAyMiBhbmQgYmVsb3cgd2lsbCBhbHdheXMgcmV0dXJuIEdSQU5URUQgc3RhdHVzIGFzIHBlcm1pc3Npb25zIGFyZSBhbHJlYWR5IGdyYW50ZWQgYXQgaW5zdGFsbGF0aW9uIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV0gbG9jYXRpb24gYXV0aG9yaXphdGlvbiBtb2RlOiBcImFsd2F5c1wiIG9yIFwid2hlbl9pbl91c2VcIi4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gXCJ3aGVuX2luX3VzZVwiLiAodGhpcy5sb2NhdGlvbkF1dGhvcml6YXRpb25Nb2RlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FjY3VyYWN5XSByZXF1ZXN0ZWQgbG9jYXRpb24gYWNjdXJhY3k6IFwiZnVsbFwiIG9yIFwicmVkdWNlZFwiLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBcImZ1bGxcIi4gKHRoaXMubG9jYXRpb25BY2N1cmFjeUF1dGhvcml6YXRpb24pXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgcmVxdWVzdExvY2F0aW9uQXV0aG9yaXphdGlvbihtb2RlPzogc3RyaW5nLCBhY2N1cmFjeT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBjYW1lcmEgaGFyZHdhcmUgaXMgcHJlc2VudCBvbiBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddIH0pXG4gIGlzQ2FtZXJhUHJlc2VudCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBjYW1lcmEuXG4gICAqIE5vdGUgZm9yIEFuZHJvaWQ6IHRoaXMgaXMgaW50ZW5kZWQgZm9yIEFuZHJvaWQgNiAvIEFQSSAyMyBhbmQgYWJvdmUuIENhbGxpbmcgb24gQW5kcm9pZCA1IC8gQVBJIDIyIGFuZCBiZWxvdyB3aWxsIGFsd2F5cyByZXR1cm4gVFJVRSBhcyBwZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBncmFudGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHRlcm5hbFN0b3JhZ2VdIEFuZHJvaWQgb25seTogSWYgdHJ1ZSwgY2hlY2tzIHBlcm1pc3Npb24gZm9yIFJFQURfRVhURVJOQUxfU1RPUkFHRSBpbiBhZGRpdGlvbiB0byBDQU1FUkEgcnVuLXRpbWUgcGVybWlzc2lvbi5cbiAgICogIGNvcmRvdmEtcGx1Z2luLWNhbWVyYUAyLjIrIHJlcXVpcmVzIGJvdGggb2YgdGhlc2UgcGVybWlzc2lvbnMuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgaXNDYW1lcmFBdXRob3JpemVkKGV4dGVybmFsU3RvcmFnZT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYW1lcmEgYXV0aG9yaXphdGlvbiBzdGF0dXMgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXh0ZXJuYWxTdG9yYWdlXSBBbmRyb2lkIG9ubHk6IElmIHRydWUsIGNoZWNrcyBwZXJtaXNzaW9uIGZvciBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgaW4gYWRkaXRpb24gdG8gQ0FNRVJBIHJ1bi10aW1lIHBlcm1pc3Npb24uXG4gICAqICBjb3Jkb3ZhLXBsdWdpbi1jYW1lcmFAMi4yKyByZXF1aXJlcyBib3RoIG9mIHRoZXNlIHBlcm1pc3Npb25zLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSwgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIGdldENhbWVyYUF1dGhvcml6YXRpb25TdGF0dXMoZXh0ZXJuYWxTdG9yYWdlPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGNhbWVyYSBhdXRob3JpemF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4dGVybmFsU3RvcmFnZV0gQW5kcm9pZCBvbmx5OiBJZiB0cnVlLCByZXF1ZXN0cyBwZXJtaXNzaW9uIGZvciBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgaW4gYWRkaXRpb24gdG8gQ0FNRVJBIHJ1bi10aW1lIHBlcm1pc3Npb24uXG4gICAqICBjb3Jkb3ZhLXBsdWdpbi1jYW1lcmFAMi4yKyByZXF1aXJlcyBib3RoIG9mIHRoZXNlIHBlcm1pc3Npb25zLiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSwgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIHJlcXVlc3RDYW1lcmFBdXRob3JpemF0aW9uKGV4dGVybmFsU3RvcmFnZT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBtaWNyb3Bob25lLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgaXNNaWNyb3Bob25lQXV0aG9yaXplZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWljcm9waG9uZSBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBnZXRNaWNyb3Bob25lQXV0aG9yaXphdGlvblN0YXR1cygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBtaWNyb3Bob25lIGF1dGhvcml6YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgcmVxdWVzdE1pY3JvcGhvbmVBdXRob3JpemF0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYXBwbGljYXRpb24gaXMgYXV0aG9yaXplZCB0byB1c2UgY29udGFjdHMgKGFkZHJlc3MgYm9vaykuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBpc0NvbnRhY3RzQXV0aG9yaXplZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29udGFjdHMgYXV0aG9yaXphdGlvbiBzdGF0dXMgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgZ2V0Q29udGFjdHNBdXRob3JpemF0aW9uU3RhdHVzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGNvbnRhY3RzIGF1dGhvcml6YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgcmVxdWVzdENvbnRhY3RzQXV0aG9yaXphdGlvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBjYWxlbmRhci5cbiAgICpcbiAgICogTm90ZXMgZm9yIEFuZHJvaWQ6XG4gICAqICAgLSBUaGlzIGlzIGludGVuZGVkIGZvciBBbmRyb2lkIDYgLyBBUEkgMjMgYW5kIGFib3ZlLiBDYWxsaW5nIG9uIEFuZHJvaWQgNSAvIEFQSSAyMiBhbmQgYmVsb3cgd2lsbCBhbHdheXMgcmV0dXJuIFRSVUUgYXMgcGVybWlzc2lvbnMgYXJlIGFscmVhZHkgZ3JhbnRlZCBhdCBpbnN0YWxsYXRpb24gdGltZS5cbiAgICpcbiAgICogTm90ZXMgZm9yIGlPUzpcbiAgICogICAtIFRoaXMgcmVsYXRlcyB0byBDYWxlbmRhciBFdmVudHMgKG5vdCBDYWxlbmRhciBSZW1pbmRlcnMpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBpc0NhbGVuZGFyQXV0aG9yaXplZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FsZW5kYXIgYXV0aG9yaXphdGlvbiBzdGF0dXMgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogTm90ZXMgZm9yIEFuZHJvaWQ6XG4gICAqICAgLSBUaGlzIGlzIGludGVuZGVkIGZvciBBbmRyb2lkIDYgLyBBUEkgMjMgYW5kIGFib3ZlLiBDYWxsaW5nIG9uIEFuZHJvaWQgNSAvIEFQSSAyMiBhbmQgYmVsb3cgd2lsbCBhbHdheXMgcmV0dXJuIGBHUkFOVEVEYCBzdGF0dXMgYXMgcGVybWlzc2lvbnMgYXJlIGFscmVhZHkgZ3JhbnRlZCBhdCBpbnN0YWxsYXRpb24gdGltZS5cbiAgICpcbiAgICogTm90ZXMgZm9yIGlPUzpcbiAgICogICAtIFRoaXMgcmVsYXRlcyB0byBDYWxlbmRhciBFdmVudHMgKG5vdCBDYWxlbmRhciBSZW1pbmRlcnMpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddIH0pXG4gIGdldENhbGVuZGFyQXV0aG9yaXphdGlvblN0YXR1cygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBjYWxlbmRhciBhdXRob3JpemF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIE5vdGVzIGZvciBpT1M6XG4gICAqICAgLSBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYgYXV0aG9yaXphdGlvbiBzdGF0dXMgaXMgTk9UX0RFVEVSTUlORUQuIENhbGxpbmcgaXQgd2hlbiBpbiBhbnkgb3RoZXIgc3RhdGUgd2lsbCBoYXZlIG5vIGVmZmVjdCBhbmQganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgYXV0aG9yaXphdGlvbiBzdGF0dXMuXG4gICAqICAgLSBUaGlzIHJlbGF0ZXMgdG8gQ2FsZW5kYXIgRXZlbnRzIChub3QgQ2FsZW5kYXIgUmVtaW5kZXJzKVxuICAgKlxuICAgKiBOb3RlcyBmb3IgQW5kcm9pZDpcbiAgICogICAtIFRoaXMgaXMgaW50ZW5kZWQgZm9yIEFuZHJvaWQgNiAvIEFQSSAyMyBhbmQgYWJvdmUuIENhbGxpbmcgb24gQW5kcm9pZCA1IC8gQVBJIDIyIGFuZCBiZWxvdyB3aWxsIGhhdmUgbm8gZWZmZWN0IGFzIHRoZSBwZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBncmFudGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLlxuICAgKiAgIC0gVGhpcyByZXF1ZXN0cyBwZXJtaXNzaW9uIGZvciBgUkVBRF9DQUxFTkRBUmAgcnVuLXRpbWUgcGVybWlzc2lvblxuICAgKiAgIC0gUmVxdWlyZWQgcGVybWlzc2lvbnMgbXVzdCBiZSBhZGRlZCB0byBgQW5kcm9pZE1hbmlmZXN0LnhtbGAgYXMgYXBwcm9wcmlhdGUgLSBzZWUgQW5kcm9pZCBwZXJtaXNzaW9uczogYFJFQURfQ0FMRU5EQVJgLCBgV1JJVEVfQ0FMRU5EQVJgXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddIH0pXG4gIHJlcXVlc3RDYWxlbmRhckF1dGhvcml6YXRpb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgc2V0dGluZ3MgcGFnZSBmb3IgdGhpcyBhcHAuXG4gICAqIE9uIEFuZHJvaWQsIHRoaXMgb3BlbnMgdGhlIFwiQXBwIEluZm9cIiBwYWdlIGluIHRoZSBTZXR0aW5ncyBhcHAuXG4gICAqIE9uIGlPUywgdGhpcyBvcGVucyB0aGUgYXBwIHNldHRpbmdzIHBhZ2UgaW4gdGhlIFNldHRpbmdzIGFwcC4gVGhpcyB3b3JrcyBvbmx5IG9uIGlPUyA4KyAtIGlPUyA3IGFuZCBiZWxvdyB3aWxsIGludm9rZSB0aGUgZXJyb3JDYWxsYmFjay5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgc3dpdGNoVG9TZXR0aW5ncygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBCbHVldG9vdGggb24gdGhlIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgZ2V0Qmx1ZXRvb3RoU3RhdGUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgaW4gQmx1ZXRvb3RoIHN0YXRlIG9jY3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSwgc3luYzogdHJ1ZSB9KVxuICByZWdpc3RlckJsdWV0b290aFN0YXRlQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge31cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgaW4gTG9jYXRpb24gc3RhdGUgb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddLCBzeW5jOiB0cnVlIH0pXG4gIHJlZ2lzdGVyTG9jYXRpb25TdGF0ZUNoYW5nZUhhbmRsZXIoaGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgQ1BVIGFyY2hpdGVjdHVyZSBvZiB0aGUgY3VycmVudCBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJywgJ2lPUyddIH0pXG4gIGdldEFyY2hpdGVjdHVyZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfSAgXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYmF0dGVyeSBsZXZlbCBvZiB0aGUgZGV2aWNlIGFzIGEgcGVyY2VudGFnZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10gfSlcbiAgZ2V0Q3VycmVudEJhdHRlcnlMZXZlbCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfSAgXG5cbiAgLy8gQU5EUk9JRCBPTkxZXG5cbiAgLyoqXG4gICAqIFJlc3RhcnRzIHRoZSBhcHBsaWNhdGlvbi5cbiAgICogQnkgZGVmYXVsdCwgYSBcIndhcm1cIiByZXN0YXJ0IHdpbGwgYmUgcGVyZm9ybWVkIGluIHdoaWNoIHRoZSBtYWluIENvcmRvdmEgYWN0aXZpdHkgaXMgaW1tZWRpYXRlbHkgcmVzdGFydGVkLCBjYXVzaW5nIHRoZSBXZWJ2aWV3IGluc3RhbmNlIHRvIGJlIHJlY3JlYXRlZC5cbiAgICogSG93ZXZlciwgaWYgdGhlIGBjb2xkYCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgXCJjb2xkXCIgcmVzdGFydGVkLCBtZWFuaW5nIGEgc3lzdGVtIGV4aXQgd2lsbCBiZSBwZXJmb3JtZWQsIGNhdXNpbmcgdGhlIGVudGlyZSBhcHBsaWNhdGlvbiB0byBiZSByZXN0YXJ0ZWQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZ1bGx5IHJlc2V0IHRoZSBuYXRpdmUgYXBwbGljYXRpb24gc3RhdGUgYnV0IHdpbGwgY2F1c2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJyaWVmbHkgZGlzYXBwZWFyIGFuZCByZS1hcHBlYXIuLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgcmVzdGFydChjb2xkOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgaGlnaC1hY2N1cmFjeSBsb2NhdGlvbnMgYXJlIGF2YWlsYWJsZSB0byB0aGUgYXBwIGZyb20gR1BTIGhhcmR3YXJlLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgTG9jYXRpb24gbW9kZSBpcyBlbmFibGVkIGFuZCBpcyBzZXQgdG8gXCJEZXZpY2Ugb25seVwiIG9yIFwiSGlnaCBhY2N1cmFjeVwiIEFORCBpZiB0aGUgYXBwIGlzIGF1dGhvcml6ZWQgdG8gdXNlIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc0dwc0xvY2F0aW9uQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbG9jYXRpb24gbW9kZSBpcyBzZXQgdG8gcmV0dXJuIGhpZ2gtYWNjdXJhY3kgbG9jYXRpb25zIGZyb20gR1BTIGhhcmR3YXJlLlxuICAgKiAgIFJldHVybnMgdHJ1ZSBpZiBMb2NhdGlvbiBtb2RlIGlzIGVuYWJsZWQgYW5kIGlzIHNldCB0byBlaXRoZXI6XG4gICAqICAgLSBEZXZpY2Ugb25seSA9IEdQUyBoYXJkd2FyZSBvbmx5IChoaWdoIGFjY3VyYWN5KVxuICAgKiAgIC0gSGlnaCBhY2N1cmFjeSA9IEdQUyBoYXJkd2FyZSwgbmV0d29yayB0cmlhbmd1bGF0aW9uIGFuZCBXaWZpIG5ldHdvcmsgSURzIChoaWdoIGFuZCBsb3cgYWNjdXJhY3kpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaXNHcHNMb2NhdGlvbkVuYWJsZWQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGxvdy1hY2N1cmFjeSBsb2NhdGlvbnMgYXJlIGF2YWlsYWJsZSB0byB0aGUgYXBwIGZyb20gbmV0d29yayB0cmlhbmd1bGF0aW9uL1dpRmkgYWNjZXNzIHBvaW50cy5cbiAgICogUmV0dXJucyB0cnVlIGlmIExvY2F0aW9uIG1vZGUgaXMgZW5hYmxlZCBhbmQgaXMgc2V0IHRvIFwiQmF0dGVyeSBzYXZpbmdcIiBvciBcIkhpZ2ggYWNjdXJhY3lcIiBBTkQgaWYgdGhlIGFwcCBpcyBhdXRob3JpemVkIHRvIHVzZSBsb2NhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc05ldHdvcmtMb2NhdGlvbkF2YWlsYWJsZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbG9jYXRpb24gbW9kZSBpcyBzZXQgdG8gcmV0dXJuIGxvdy1hY2N1cmFjeSBsb2NhdGlvbnMgZnJvbSBuZXR3b3JrIHRyaWFuZ3VsYXRpb24vV2lGaSBhY2Nlc3MgcG9pbnRzLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgTG9jYXRpb24gbW9kZSBpcyBlbmFibGVkIGFuZCBpcyBzZXQgdG8gZWl0aGVyOlxuICAgKiAgIC0gQmF0dGVyeSBzYXZpbmcgPSBuZXR3b3JrIHRyaWFuZ3VsYXRpb24gYW5kIFdpZmkgbmV0d29yayBJRHMgKGxvdyBhY2N1cmFjeSlcbiAgICogICAtIEhpZ2ggYWNjdXJhY3kgPSBHUFMgaGFyZHdhcmUsIG5ldHdvcmsgdHJpYW5ndWxhdGlvbiBhbmQgV2lmaSBuZXR3b3JrIElEcyAoaGlnaCBhbmQgbG93IGFjY3VyYWN5KVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGlzTmV0d29ya0xvY2F0aW9uRW5hYmxlZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkIG9uIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc0FpcnBsYW5lTW9kZUVuYWJsZWQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiogXG4gICAqIENoZWNrcyBpZiBtb2JpbGUgZGF0YSBpcyBlbmFibGVkIG9uIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc01vYmlsZURhdGFFbmFibGVkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbG9jYXRpb24gbW9kZSBzZXR0aW5nIGZvciB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGdldExvY2F0aW9uTW9kZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRldGFpbHMgb2YgdGhlIE9TIG9mIHRoZSBkZXZpY2Ugb24gd2hpY2ggdGhlIGFwcCBpcyBjdXJyZW50bHkgcnVubmluZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGdldERldmljZU9TVmVyc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRldGFpbHMgb2YgdGhlIFNESyBsZXZlbHMgdXNlZCB0byBidWlsZCB0aGUgYXBwLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGdldEJ1aWxkT1NWZXJzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYXV0aG9yaXphdGlvbiBzdGF0dXMgZm9yIGEgZ2l2ZW4gcGVybWlzc2lvbi5cbiAgICogTm90ZTogdGhpcyBpcyBpbnRlbmRlZCBmb3IgQW5kcm9pZCA2IC8gQVBJIDIzIGFuZCBhYm92ZS4gQ2FsbGluZyBvbiBBbmRyb2lkIDUgLyBBUEkgMjIgYW5kIGJlbG93IHdpbGwgYWx3YXlzIHJldHVybiBHUkFOVEVEIHN0YXR1cyBhcyBwZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBncmFudGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcGVybWlzc2lvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgZ2V0UGVybWlzc2lvbkF1dGhvcml6YXRpb25TdGF0dXMocGVybWlzc2lvbjogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgbXVsdGlwbGUgcGVybWlzc2lvbnMuXG4gICAqIE5vdGU6IHRoaXMgaXMgaW50ZW5kZWQgZm9yIEFuZHJvaWQgNiAvIEFQSSAyMyBhbmQgYWJvdmUuIENhbGxpbmcgb24gQW5kcm9pZCA1IC8gQVBJIDIyIGFuZCBiZWxvdyB3aWxsIGFsd2F5cyByZXR1cm4gR1JBTlRFRCBzdGF0dXMgYXMgcGVybWlzc2lvbnMgYXJlIGFscmVhZHkgZ3JhbnRlZCBhdCBpbnN0YWxsYXRpb24gdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHthbnlbXX0gcGVybWlzc2lvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSwgY2FsbGJhY2tPcmRlcjogJ3JldmVyc2UnIH0pXG4gIGdldFBlcm1pc3Npb25zQXV0aG9yaXphdGlvblN0YXR1cyhwZXJtaXNzaW9uczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhcHAgdG8gYmUgZ3JhbnRlZCBhdXRob3JpemF0aW9uIGZvciBhIHJ1bnRpbWUgcGVybWlzc2lvbi5cbiAgICogTm90ZTogdGhpcyBpcyBpbnRlbmRlZCBmb3IgQW5kcm9pZCA2IC8gQVBJIDIzIGFuZCBhYm92ZS4gQ2FsbGluZyBvbiBBbmRyb2lkIDUgLyBBUEkgMjIgYW5kIGJlbG93IHdpbGwgaGF2ZSBubyBlZmZlY3QgYXMgdGhlIHBlcm1pc3Npb25zIGFyZSBhbHJlYWR5IGdyYW50ZWQgYXQgaW5zdGFsbGF0aW9uIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBwZXJtaXNzaW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10sIGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICByZXF1ZXN0UnVudGltZVBlcm1pc3Npb24ocGVybWlzc2lvbjogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYXBwIHRvIGJlIGdyYW50ZWQgYXV0aG9yaXphdGlvbiBmb3IgbXVsdGlwbGUgcnVudGltZSBwZXJtaXNzaW9ucy5cbiAgICogTm90ZTogdGhpcyBpcyBpbnRlbmRlZCBmb3IgQW5kcm9pZCA2IC8gQVBJIDIzIGFuZCBhYm92ZS4gQ2FsbGluZyBvbiBBbmRyb2lkIDUgLyBBUEkgMjIgYW5kIGJlbG93IHdpbGwgYWx3YXlzIHJldHVybiBHUkFOVEVEIHN0YXR1cyBhcyBwZXJtaXNzaW9ucyBhcmUgYWxyZWFkeSBncmFudGVkIGF0IGluc3RhbGxhdGlvbiB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge2FueVtdfSBwZXJtaXNzaW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgcmVxdWVzdFJ1bnRpbWVQZXJtaXNzaW9ucyhwZXJtaXNzaW9uczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHBsdWdpbiBpcyBjdXJyZW50bHkgcmVxdWVzdGluZyBhIHJ1bnRpbWUgcGVybWlzc2lvbiB2aWEgdGhlIG5hdGl2ZSBBUEkuXG4gICAqIE5vdGUgdGhhdCBvbmx5IG9uZSByZXF1ZXN0IGNhbiBiZSBtYWRlIGNvbmN1cnJlbnRseSBiZWNhdXNlIHRoZSBuYXRpdmUgQVBJIGNhbm5vdCBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0cyxcbiAgICogc28gdGhlIHBsdWdpbiB3aWxsIGludm9rZSB0aGUgZXJyb3IgY2FsbGJhY2sgaWYgYXR0ZW1wdGluZyB0byBtYWtlIG1vcmUgdGhhbiBvbmUgc2ltdWx0YW5lb3VzIHJlcXVlc3QuXG4gICAqIE11bHRpcGxlIHBlcm1pc3Npb24gcmVxdWVzdHMgc2hvdWxkIGJlIGdyb3VwZWQgaW50byBhIHNpbmdsZSBjYWxsIHNpbmNlIHRoZSBuYXRpdmUgQVBJIGlzIHNldHVwIHRvIGhhbmRsZSBiYXRjaCByZXF1ZXN0cyBvZiBtdWx0aXBsZSBwZXJtaXNzaW9uIGdyb3Vwcy5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBAQ29yZG92YSh7IHN5bmM6IHRydWUgfSlcbiAgaXNSZXF1ZXN0aW5nUGVybWlzc2lvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBydW50aW1lIHBlcm1pc3Npb24gcmVxdWVzdCBoYXMgY29tcGxldGVkLlxuICAgKiBQYXNzIGluIGEgZmFsc3kgdmFsdWUgdG8gZGUtcmVnaXN0ZXIgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqL1xuICBAQ29yZG92YSh7IHN5bmM6IHRydWUgfSlcbiAgcmVnaXN0ZXJQZXJtaXNzaW9uUmVxdWVzdENvbXBsZXRlSGFuZGxlcihoYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGRldmljZSBzZXR0aW5nIGZvciBCbHVldG9vdGggaXMgc3dpdGNoZWQgb24uXG4gICAqIFRoaXMgcmVxdWlyZXMgYEJMVUVUT09USGAgcGVybWlzc2lvbiBvbiBBbmRyb2lkXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGlzQmx1ZXRvb3RoRW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaGFzIEJsdWV0b290aCBjYXBhYmlsaXRpZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGhhc0JsdWV0b290aFN1cHBvcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGV2aWNlIGhhcyBCbHVldG9vdGggTG93IEVuZXJneSAoTEUpIGNhcGFiaWxpdGllcy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaGFzQmx1ZXRvb3RoTEVTdXBwb3J0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBCbHVldG9vdGggTG93IEVuZXJneSAoTEUpIFBlcmlwaGVyYWwgbW9kZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaGFzQmx1ZXRvb3RoTEVQZXJpcGhlcmFsU3VwcG9ydCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQmx1ZXRvb3RoIGF1dGhvcml6YXRpb24gc3RhdHVzIG9mIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSB9KVxuICBnZXRCbHVldG9vdGhBdXRob3JpemF0aW9uU3RhdHVzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG4gIFxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaW5kaXZpZHVhbCBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgZWFjaCBCbHVldG9vdGggcnVuLXRpbWUgcGVybWlzc2lvbiBvbiBBbmRyb2lkIDEyKyAvIEFQSSAzMStcbiAgICogT24gQW5kcm9pZCAxMSAvIEFQSSAzMCBhbmQgYmVsb3csIGFsbCB3aWxsIGJlIHJldHVybmVkIGFzIEdSQU5URUQgaWYgdGhlIG1hbmlmZXN0IGhhcyBCTFVFVE9PVEggc2luY2UgdGhleSBhcmUgaW1wbGljaXRseSBncmFudGVkIGF0IGJ1aWxkLXRpbWUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgZ2V0Qmx1ZXRvb3RoQXV0aG9yaXphdGlvblN0YXR1c2VzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYXBwbGljYXRpb24gaXMgYXV0aG9yaXplZCB0byB1c2UgZXh0ZXJuYWwgc3RvcmFnZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaXNFeHRlcm5hbFN0b3JhZ2VBdXRob3JpemVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDUmV0dXJucyB0aGUgZXh0ZXJuYWwgc3RvcmFnZSBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBnZXRFeHRlcm5hbFN0b3JhZ2VBdXRob3JpemF0aW9uU3RhdHVzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGV4dGVybmFsIHN0b3JhZ2UgYXV0aG9yaXphdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIHJlcXVlc3RFeHRlcm5hbFN0b3JhZ2VBdXRob3JpemF0aW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZGV0YWlscyBvZiBleHRlcm5hbCBTRCBjYXJkKHMpOiBhYnNvbHV0ZSBwYXRoLCBpcyB3cml0YWJsZSwgZnJlZSBzcGFjZS5cbiAgICpcbiAgICogVGhlIGludGVudGlvbiBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gdGhlIGxvY2F0aW9uIGFuZCBkZXRhaWxzIG9mIHJlbW92YWJsZSBleHRlcm5hbCBTRCBjYXJkcy5cbiAgICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIFwiZXh0ZXJuYWwgZGlyZWN0b3JpZXNcIiByZXR1cm5lZCBieSBjb3Jkb3ZhLXBsdWdpbi1maWxlIHdoaWNoIHJldHVybiBtb3VudCBwb2ludHMgcmVsYXRpbmcgdG8gbm9uLXJlbW92YWJsZSAoaW50ZXJuYWwpIHN0b3JhZ2UuXG4gICAqXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBtZXRob2QgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcGE5OWMvY29yZG92YS1kaWFnbm9zdGljLXBsdWdpbiNnZXRleHRlcm5hbHNkY2FyZGRldGFpbHMpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgZ2V0RXh0ZXJuYWxTZENhcmREZXRhaWxzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSB3aXJlbGVzcyBzZXR0aW5ncyBwYWdlIGluIHRoZSBTZXR0aW5ncyBhcHAuIEFsbG93cyBjb25maWd1cmF0aW9uIG9mIHdpcmVsZXNzIGNvbnRyb2xzIHN1Y2ggYXMgV2ktRmksIEJsdWV0b290aCBhbmQgTW9iaWxlIG5ldHdvcmtzLlxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gICAgc3luYzogdHJ1ZSxcbiAgfSlcbiAgc3dpdGNoVG9XaXJlbGVzc1NldHRpbmdzKCk6IHZvaWQge31cblxuICAvKipcbiAgICogRGlzcGxheXMgTkZDIHNldHRpbmdzIHRvIGFsbG93IHVzZXIgdG8gZW5hYmxlIE5GQy5cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICAgIHN5bmM6IHRydWUsXG4gIH0pXG4gIHN3aXRjaFRvTkZDU2V0dGluZ3MoKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgTkZDIGhhcmR3YXJlIGlzIHByZXNlbnQgb24gZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc05GQ1ByZXNlbnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGV2aWNlIHNldHRpbmcgZm9yIE5GQyBpcyBzd2l0Y2hlZCBvbi5cbiAgICogTm90ZTogdGhpcyBvcGVyYXRpb24gZG9lcyBub3QgcmVxdWlyZSBORkMgcGVybWlzc2lvbiBpbiB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGlzTkZDRW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIE5GQyBpcyBhdmFpbGFibGUgdG8gdGhlIGFwcC4gUmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaGFzIE5GQyBjYXBhYmlsaXRpZXMgQU5EIGlmIE5GQyBzZXR0aW5nIGlzIHN3aXRjaGVkIG9uLlxuICAgKiBOb3RlOiB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCByZXF1aXJlIE5GQyBwZXJtaXNzaW9uIGluIHRoZSBtYW5pZmVzdC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSB9KVxuICBpc05GQ0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2UgaW4gTkZDIHN0YXRlIG9jY3Vycy4gUGFzcyBpbiBhIGZhbHN5IHZhbHVlIHRvIGRlLXJlZ2lzdGVyIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGVyIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIE5GQyBzdGF0ZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgICBzeW5jOiB0cnVlLFxuICB9KVxuICByZWdpc3Rlck5GQ1N0YXRlQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge31cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgZGF0YSByb2FtaW5nIHNldHRpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaXNEYXRhUm9hbWluZ0VuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGV2aWNlIHNldHRpbmcgZm9yIEFEQihkZWJ1ZykgaXMgc3dpdGNoZWQgb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddIH0pXG4gIGlzQURCTW9kZUVuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZGV2aWNlIGlzIHJvb3RlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydBbmRyb2lkJ10gfSlcbiAgaXNEZXZpY2VSb290ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSU9TIE9OTFlcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRob3JpemVkIHRvIHVzZSB0aGUgQ2FtZXJhIFJvbGwgaW4gUGhvdG9zIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIGFjY2Vzc0xldmVsIC0gKG9wdGlvbmFsKSBPbiBpT1MgMTQrLCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIGFjY2VzcyB0byB0aGUgcGhvdG8gbGlicmFyeSB0byBxdWVyeSBhcyBhIGNvbnN0YW50IGluIGNvcmRvdmEucGx1Z2lucy5kaWFnbm9zdGljLnBob3RvTGlicmFyeUFjY2Vzc0xldmVsYFxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOlxuICAgKiBBRERfT05MWSAtIGNhbiBhZGQgdG8gYnV0IG5vdCByZWFkIGZyb20gUGhvdG8gTGlicmFyeVxuICAgKiBSRUFEX1dSSVRFIC0gY2FuIGJvdGggYWRkIHRvIGFuZCByZWFkIGZyb20gUGhvdG8gTGlicmFyeVxuICAgKiBEZWZhdWx0cyB0byBBRERfT05MWSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqIEhhcyBubyBlZmZlY3Qgb24gaU9TIDEzIG9yIGJlbG93XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10sIGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICBpc0NhbWVyYVJvbGxBdXRob3JpemVkKGFjY2Vzc0xldmVsPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF1dGhvcml6YXRpb24gc3RhdHVzIGZvciB0aGUgYXBwbGljYXRpb24gdG8gdXNlIHRoZSBDYW1lcmEgUm9sbCBpbiBQaG90b3MgYXBwLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjZXNzTGV2ZWwgLSAob3B0aW9uYWwpIE9uIGlPUyAxNCssIHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgYWNjZXNzIHRvIHRoZSBwaG90byBsaWJyYXJ5IHRvIHF1ZXJ5IGFzIGEgY29uc3RhbnQgaW4gY29yZG92YS5wbHVnaW5zLmRpYWdub3N0aWMucGhvdG9MaWJyYXJ5QWNjZXNzTGV2ZWxgXG4gICAqIFBvc3NpYmxlIHZhbHVlcyBhcmU6XG4gICAqIEFERF9PTkxZIC0gY2FuIGFkZCB0byBidXQgbm90IHJlYWQgZnJvbSBQaG90byBMaWJyYXJ5XG4gICAqIFJFQURfV1JJVEUgLSBjYW4gYm90aCBhZGQgdG8gYW5kIHJlYWQgZnJvbSBQaG90byBMaWJyYXJ5XG4gICAqIERlZmF1bHRzIHRvIEFERF9PTkxZIGlmIG5vdCBzcGVjaWZpZWRcbiAgICogSGFzIG5vIGVmZmVjdCBvbiBpT1MgMTMgb3IgYmVsb3dcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ2lPUyddLCBjYWxsYmFja09yZGVyOiAncmV2ZXJzZScgfSlcbiAgZ2V0Q2FtZXJhUm9sbEF1dGhvcml6YXRpb25TdGF0dXMoYWNjZXNzTGV2ZWw/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBjYW1lcmEgcm9sbCBhdXRob3JpemF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBhdXRob3JpemF0aW9uIHN0YXR1cyBpcyBOT1RfUkVRVUVTVEVELlxuICAgKiBDYWxsaW5nIGl0IHdoZW4gaW4gYW55IG90aGVyIHN0YXRlIHdpbGwgaGF2ZSBubyBlZmZlY3QuXG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NMZXZlbCAtIChvcHRpb25hbCkgT24gaU9TIDE0Kywgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiBhY2Nlc3MgdG8gdGhlIHBob3RvIGxpYnJhcnkgdG8gcXVlcnkgYXMgYSBjb25zdGFudCBpbiBjb3Jkb3ZhLnBsdWdpbnMuZGlhZ25vc3RpYy5waG90b0xpYnJhcnlBY2Nlc3NMZXZlbGBcbiAgICogUG9zc2libGUgdmFsdWVzIGFyZTpcbiAgICogQUREX09OTFkgLSBjYW4gYWRkIHRvIGJ1dCBub3QgcmVhZCBmcm9tIFBob3RvIExpYnJhcnlcbiAgICogUkVBRF9XUklURSAtIGNhbiBib3RoIGFkZCB0byBhbmQgcmVhZCBmcm9tIFBob3RvIExpYnJhcnlcbiAgICogRGVmYXVsdHMgdG8gQUREX09OTFkgaWYgbm90IHNwZWNpZmllZFxuICAgKiBIYXMgbm8gZWZmZWN0IG9uIGlPUyAxMyBvciBiZWxvd1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10sIGNhbGxiYWNrT3JkZXI6ICdyZXZlcnNlJyB9KVxuICByZXF1ZXN0Q2FtZXJhUm9sbEF1dGhvcml6YXRpb24oYWNjZXNzTGV2ZWw/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gLyoqXG4gICAqIFByZXNlbnRzIGxpbWl0ZWQgbGlicmFyeSBwaWNrZXIgVUkgb24gaU9TIDE0K1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgcHJlc2VudExpbWl0ZWRMaWJyYXJ5UGlja2VyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiByZW1vdGUgKHB1c2gpIG5vdGlmaWNhdGlvbnMgYXJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJywgJ0FuZHJvaWQnXSB9KVxuICBpc1JlbW90ZU5vdGlmaWNhdGlvbnNFbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFwcCBpcyByZWdpc3RlcmVkIGZvciByZW1vdGUgKHB1c2gpIG5vdGlmaWNhdGlvbnMgb24gdGhlIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnXSB9KVxuICBpc1JlZ2lzdGVyZWRGb3JSZW1vdGVOb3RpZmljYXRpb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSBSZW1vdGUgTm90aWZpY2F0aW9ucy5cbiAgICogTm90ZTogV29ya3Mgb24gaU9TIDEwKyBvbmx5IChpT1MgOSBhbmQgYmVsb3cgd2lsbCBpbnZva2UgdGhlIGVycm9yIGNhbGxiYWNrKS5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ2lPUyddIH0pXG4gIGdldFJlbW90ZU5vdGlmaWNhdGlvbnNBdXRob3JpemF0aW9uU3RhdHVzKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHJlbWluZGVycyBhdXRob3JpemF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlc1xuICAgKiBAcGFyYW0gb21pdFJlZ2lzdHJhdGlvblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgcmVxdWVzdFJlbW90ZU5vdGlmaWNhdGlvbnNBdXRob3JpemF0aW9uKHR5cGVzPzogc3RyaW5nW10sIG9taXRSZWdpc3RyYXRpb24/OiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBjdXJyZW50IHNldHRpbmcgb2Ygbm90aWZpY2F0aW9uIHR5cGVzIGZvciB0aGUgYXBwIGluIHRoZSBTZXR0aW5ncyBhcHAuXG4gICAqIE5vdGU6IG9uIGlPUyA4KywgaWYgXCJBbGxvdyBOb3RpZmljYXRpb25zXCIgc3dpdGNoIGlzIE9GRiwgYWxsIHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQgYXMgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnXSB9KVxuICBnZXRSZW1vdGVOb3RpZmljYXRpb25UeXBlcygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGF1dGhvcml6ZWQgdG8gdXNlIHJlbWluZGVycy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnXSB9KVxuICBpc1JlbWluZGVyc0F1dGhvcml6ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlbWluZGVycyBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgZ2V0UmVtaW5kZXJzQXV0aG9yaXphdGlvblN0YXR1cygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyByZW1pbmRlcnMgYXV0aG9yaXphdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgcmVxdWVzdFJlbWluZGVyc0F1dGhvcml6YXRpb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBhdXRob3JpemVkIGZvciBiYWNrZ3JvdW5kIHJlZnJlc2guXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgaXNCYWNrZ3JvdW5kUmVmcmVzaEF1dGhvcml6ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJhY2tncm91bmQgcmVmcmVzaCBhdXRob3JpemF0aW9uIHN0YXR1cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgZ2V0QmFja2dyb3VuZFJlZnJlc2hTdGF0dXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgQmx1ZXRvb3RoIGF1dGhvcml6YXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogTGVhcm4gbW9yZSBhYm91dCB0aGlzIG1ldGhvZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2RwYTk5Yy9jb3Jkb3ZhLWRpYWdub3N0aWMtcGx1Z2luI3JlcXVlc3RibHVldG9vdGhhdXRob3JpemF0aW9uKVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgcmVxdWVzdEJsdWV0b290aEF1dGhvcml6YXRpb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIG1vdGlvbiB0cmFja2luZyBpcyBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ2lPUyddIH0pXG4gIGlzTW90aW9uQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgaXQncyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIG91dGNvbWUgb2YgYSBtb3Rpb24gYXV0aG9yaXphdGlvbiByZXF1ZXN0IG9uIHRoZSBjdXJyZW50IGRldmljZS5cbiAgICogVGhlcmUncyBubyBkaXJlY3Qgd2F5IHRvIGRldGVybWluZSBpZiBhdXRob3JpemF0aW9uIHdhcyBncmFudGVkIG9yIGRlbmllZCwgc28gdGhlIFBlZG9tZXRlciBBUEkgbXVzdCBiZSB1c2VkIHRvIGluZGlyZWN0bHkgZGV0ZXJtaW5lIHRoaXM6XG4gICAqIHRoZXJlZm9yZSwgaWYgdGhlIGRldmljZSBzdXBwb3J0cyBtb3Rpb24gdHJhY2tpbmcgYnV0IG5vdCBQZWRvbWV0ZXIgRXZlbnQgVHJhY2tpbmcsIHRoZSBvdXRjb21lIG9mIHJlcXVlc3RpbmcgbW90aW9uIGRldGVjdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnXSB9KVxuICBpc01vdGlvblJlcXVlc3RPdXRjb21lQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBtb3Rpb24gdHJhY2tpbmcgYXV0aG9yaXphdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBMZWFybiBtb3JlIGFib3V0IHRoaXMgbWV0aG9kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZHBhOTljL2NvcmRvdmEtZGlhZ25vc3RpYy1wbHVnaW4jcmVxdWVzdG1vdGlvbmF1dGhvcml6YXRpb24pXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnXSB9KVxuICByZXF1ZXN0TW90aW9uQXV0aG9yaXphdGlvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgbW90aW9uIGF1dGhvcml6YXRpb24gc3RhdHVzIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBtZXRob2QgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcGE5OWMvY29yZG92YS1kaWFnbm9zdGljLXBsdWdpbiNnZXRtb3Rpb25hdXRob3JpemF0aW9uc3RhdHVzKVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICAgKi9cbiAgQENvcmRvdmEoeyBwbGF0Zm9ybXM6IFsnaU9TJ10gfSlcbiAgZ2V0TW90aW9uQXV0aG9yaXphdGlvblN0YXR1cygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBhY2N1cmFjeSBhdXRob3JpemF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24gb24gaU9TIDE0KyBhbmQgQW5kcm9pZCAxMisuIE5vdGU6IGNhbGxpbmcgb24gaU9TIDwxNCBvciBBbmRyb2lkIDwxMiB3aWxsIGFsd2F5cyByZXR1cm4gY29yZG92YS5wbHVnaW5zLmRpYWdub3N0aWMubG9jYXRpb25BY2N1cmFjeUF1dGhvcml6YXRpb24uRlVMTFxuICAgKlxuICAgKiBMZWFybiBtb3JlIGFib3V0IHRoaXMgbWV0aG9kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZHBhOTljL2NvcmRvdmEtZGlhZ25vc3RpYy1wbHVnaW4jZ2V0bG9jYXRpb25hY2N1cmFjeWF1dGhvcml6YXRpb24pXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBAQ29yZG92YSh7IHBsYXRmb3JtczogWydpT1MnLCAnQW5kcm9pZCddIH0pXG4gIGdldExvY2F0aW9uQWNjdXJhY3lBdXRob3JpemF0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRlbXBvcmFyeSBhY2Nlc3MgdG8gZnVsbCBsb2NhdGlvbiBhY2N1cmFjeSBmb3IgdGhlIGFwcGxpY2F0aW9uIG9uIGlPUyAxNCsuXG4gICAqXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBtZXRob2QgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcGE5OWMvY29yZG92YS1kaWFnbm9zdGljLXBsdWdpbiNyZXF1ZXN0dGVtcG9yYXJ5ZnVsbGFjY3VyYWN5YXV0aG9yaXphdGlvbilcbiAgICpcbiAgICogQHBhcmFtIHB1cnBvc2VcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ2lPUyddIH0pXG4gIHJlcXVlc3RUZW1wb3JhcnlGdWxsQWNjdXJhY3lBdXRob3JpemF0aW9uKHB1cnBvc2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGluIGxvY2F0aW9uIGFjY3VyYWN5IGF1dGhvcml6YXRpb24gb2NjdXJzIG9uIGlPUyAxNCsuXG4gICAqXG4gICAqIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBtZXRob2QgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcGE5OWMvY29yZG92YS1kaWFnbm9zdGljLXBsdWdpbiNyZWdpc3RlckxvY2F0aW9uQWNjdXJhY3lBdXRob3JpemF0aW9uQ2hhbmdlSGFuZGxlcilcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJcbiAgICovXG4gIEBDb3Jkb3ZhKHsgcGxhdGZvcm1zOiBbJ2lPUyddLCBzeW5jOiB0cnVlIH0pXG4gIHJlZ2lzdGVyTG9jYXRpb25BY2N1cmFjeUF1dGhvcml6YXRpb25DaGFuZ2VIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uKTogdm9pZCB7fVxufVxuIl19