@awesome-cordova-plugins/wifi-wizard-2
Advanced tools
Comparing version 5.36.0 to 5.36.1
@@ -22,3 +22,2 @@ import { AwesomeCordovaNativePlugin } from '@awesome-cordova-plugins/core'; | ||
* This project is a fork of the WifiWizard plugin with fixes and updates, as well as patches taken from the Cordova Network Manager plugin. | ||
* | ||
* @usage | ||
@@ -51,3 +50,3 @@ * ```typescript | ||
* | ||
* **Example inside async function** | ||
* Example inside async function** | ||
* ```typescript | ||
@@ -60,3 +59,3 @@ * async function example(){ | ||
* | ||
* **Example inside standard non-async function** | ||
* Example inside standard non-async function** | ||
* ```typescript | ||
@@ -70,3 +69,3 @@ * function example(){ | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -113,3 +112,3 @@ * - `TIMEOUT_WAITING_FOR_SCAN` on timeout waiting for scan 10 seconds + | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -134,3 +133,3 @@ * | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -159,3 +158,3 @@ * - `DISCONNECT_NET_REMOVE_ERROR` Android returned error when removing wifi configuration | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -172,3 +171,3 @@ * - `AUTH_TYPE_NOT_SUPPORTED` - Invalid auth type specified | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -193,3 +192,3 @@ * - `UNABLE_TO_REMOVE` Android returned failure in removing network | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -237,3 +236,3 @@ * - `STARTSCAN_FAILED` Android returned failure in starting scan | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -439,2 +438,3 @@ * - `ERROR_SETWIFIENABLED` wifi state does not match call (enable or disable) | ||
* Connect to network on iOS device | ||
* | ||
* @param ssid | ||
@@ -447,2 +447,3 @@ * @param ssidPassword Password if connecting to WPA/WPA2 network (omit or use false to connect to open network) | ||
* Disconnect from SSID on iOS device | ||
* | ||
* @param ssid | ||
@@ -454,2 +455,3 @@ * @returns {Promise} | ||
* Add wifi network configuration | ||
* | ||
* @param wifiConfig Must be object created by formatWifiConfig() | ||
@@ -461,2 +463,3 @@ * @returns {Promise<any>} | ||
* Remove wifi network configuration | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -474,2 +477,3 @@ * @returns {Promise<any>} | ||
* @param {string} [password=] | ||
* @param password | ||
* @param {string} [algorithm=NONE] - WPA, WPA (for WPA2), WEP or NONE (NONE by default) | ||
@@ -491,2 +495,3 @@ * @returns {Promise<any>} | ||
* Enable Network | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -500,2 +505,3 @@ * @param {boolean} [bindAll=false] - Whether or not to bind all network requests to this wifi network | ||
* Disable Network | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -507,2 +513,3 @@ * @returns {Promise<any>} | ||
* Reconnect to the currently active access point, even if we are already connected. | ||
* | ||
* @returns {Promise<any>} | ||
@@ -513,2 +520,3 @@ */ | ||
* Reconnect to the currently active access point, if we are currently disconnected. | ||
* | ||
* @returns {Promise<any>} | ||
@@ -519,2 +527,3 @@ */ | ||
* Returns currently configured networks | ||
* | ||
* @returns {Promise<any>} | ||
@@ -525,2 +534,3 @@ */ | ||
* Start network scan and return results | ||
* | ||
* @param options | ||
@@ -532,2 +542,3 @@ * @returns {Promise<any>} | ||
* Start wifi network scan (results can be retrieved with getScanResults) | ||
* | ||
* @returns {Promise<any>} | ||
@@ -538,2 +549,3 @@ */ | ||
* Get wifi scan results (must call startScan first, or just use scan()) | ||
* | ||
* @param options | ||
@@ -545,2 +557,3 @@ * @returns {Promise<any>} | ||
* Check if WiFi is enabled | ||
* | ||
* @returns {Promise<any>} | ||
@@ -551,2 +564,3 @@ */ | ||
* Enable or Disable WiFi | ||
* | ||
* @param enabled | ||
@@ -558,2 +572,3 @@ * @returns {Promise<any>} | ||
* Enable WiFi | ||
* | ||
* @returns {Promise<any>} | ||
@@ -564,2 +579,3 @@ */ | ||
* Disable WiFi | ||
* | ||
* @returns {Promise<any>} | ||
@@ -570,2 +586,3 @@ */ | ||
* Unbind Network | ||
* | ||
* @returns {Promise<any>} | ||
@@ -576,2 +593,3 @@ */ | ||
* Bind Network | ||
* | ||
* @returns {Promise<any>} | ||
@@ -582,2 +600,3 @@ */ | ||
* Get Wifi Router IP from DHCP | ||
* | ||
* @returns {Promise<any>} | ||
@@ -588,2 +607,3 @@ */ | ||
* Get Wifi IP | ||
* | ||
* @returns {Promise<any>} | ||
@@ -596,2 +616,3 @@ */ | ||
* This method returns a JSON object similar to: { "ip": "0.0.0.0", "subnet": "0.0.0.0" } | ||
* | ||
* @returns {Promise<any>} | ||
@@ -602,2 +623,3 @@ */ | ||
* Get Network ID from SSID | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -609,2 +631,3 @@ * @returns {Promise<any>} | ||
* Get currently connected network ID | ||
* | ||
* @returns {Promise<any>} | ||
@@ -615,2 +638,3 @@ */ | ||
* Get currently connected network SSID | ||
* | ||
* @returns {Promise<any>} | ||
@@ -621,2 +645,3 @@ */ | ||
* Get currently connected network BSSID/MAC | ||
* | ||
* @returns {Promise<any>} | ||
@@ -627,2 +652,3 @@ */ | ||
* Check if current WiFi connection has connection to the internet | ||
* | ||
* @returns {Promise<any>} | ||
@@ -633,2 +659,3 @@ */ | ||
* Check if we can ping current WiFi router IP address | ||
* | ||
* @returns {Promise<any>} | ||
@@ -639,2 +666,3 @@ */ | ||
* Check if we can connect via HTTP current WiFi router IP address | ||
* | ||
* @returns {Promise<any>} | ||
@@ -645,2 +673,3 @@ */ | ||
* Check if current WiFi connection can connect to internet (checks connection to google.com) | ||
* | ||
* @returns {Promise<any>} | ||
@@ -660,2 +689,3 @@ */ | ||
* Format WiFi configuration for Android Devices | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -670,2 +700,3 @@ * @param {string} [password] | ||
* Format WPA WiFi configuration for Android Devices | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -679,2 +710,3 @@ * @param {string} password | ||
* Format WiFi SSID String | ||
* | ||
* @param ssid | ||
@@ -686,2 +718,3 @@ * @returns {*} | ||
* Synchronous Sleep/Timeout `await this.timeout()` | ||
* | ||
* @param delay the amount of time to wait (default 2 seconds) | ||
@@ -688,0 +721,0 @@ */ |
@@ -65,2 +65,2 @@ var __extends = (this && this.__extends) || (function () { | ||
export { WifiWizard2 }; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL3BsdWdpbnMvd2lmaS13aXphcmQtMi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxnRUFBd0UsTUFBTSwrQkFBK0IsQ0FBQzs7SUFxYnBGLCtCQUEwQjs7OztJQVd6RCx1Q0FBaUIsYUFBQyxJQUFZLEVBQUUsWUFBb0I7SUFhcEQsMENBQW9CLGFBQUMsSUFBWTtJQVlqQyx5QkFBRyxhQUFDLFVBQXNCO0lBWTFCLDRCQUFNLGFBQUMsSUFBcUI7SUFtQjVCLDZCQUFPLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLFFBQWlCLEVBQUUsU0FBa0I7SUFpQnZGLGdDQUFVLGFBQUMsSUFBcUI7SUFlaEMsNEJBQU0sYUFBQyxJQUFxQixFQUFFLE9BQWlCLEVBQUUsaUJBQTJCO0lBYTVFLDZCQUFPLGFBQUMsSUFBcUI7SUFZN0IsaUNBQVc7SUFZWCwrQkFBUztJQVdULGtDQUFZO0lBWVosMEJBQUksYUFBQyxPQUF5QjtJQVc5QiwrQkFBUztJQVlULG9DQUFjLGFBQUMsT0FBK0I7SUFXOUMsbUNBQWE7SUFhYixvQ0FBYyxhQUFDLE9BQWdCO0lBWS9CLGdDQUFVO0lBWVYsaUNBQVc7SUFXWCxrQ0FBWTtJQVdaLGdDQUFVO0lBV1YscUNBQWU7SUFXZiwrQkFBUztJQWFULG1DQUFhO0lBWWIsc0NBQWdCLGFBQUMsSUFBcUI7SUFXdEMsMkNBQXFCO0lBV3JCLHNDQUFnQjtJQVdoQix1Q0FBaUI7SUFXakIsMkNBQXFCO0lBV3JCLHVDQUFpQjtJQVdqQix3Q0FBa0I7SUFXbEIsMENBQW9CO0lBZXBCLHVDQUFpQjtJQWFqQixzQ0FBZ0IsYUFDZCxJQUFxQixFQUNyQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixZQUFxQjtJQWF2QixxQ0FBZSxhQUFDLElBQXFCLEVBQUUsUUFBZ0IsRUFBRSxZQUFxQjtJQVU5RSxzQ0FBZ0IsYUFBQyxJQUFxQjtJQVN0Qyw2QkFBTyxhQUFDLEtBQWM7Ozs7OztzQkE5MkJ4QjtFQXNiaUMsMEJBQTBCO1NBQTlDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3Jkb3ZhLCBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSwgQXdlc29tZUNvcmRvdmFOYXRpdmVQbHVnaW4sIFBsdWdpbiB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBXaWZpQ29uZmlnIHtcbiAgU1NJRDogc3RyaW5nO1xuICBpc0hpZGRlblNTSUQ6IGJvb2xlYW47XG4gIGF1dGg6IHtcbiAgICBhbGdvcml0aG06IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaWZpU2NhblJlc3VsdHNPcHRpb25zIHtcbiAgbnVtTGV2ZWxzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lmaVNjYW5PcHRpb25zIGV4dGVuZHMgV2lmaVNjYW5SZXN1bHRzT3B0aW9ucyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBAbmFtZSBXaWZpV2l6YXJkMlxuICogQGRlc2NyaXB0aW9uXG4gKiBXaWZpV2l6YXJkMiBlbmFibGVzIFdpZmkgbWFuYWdlbWVudCBmb3IgYm90aCBBbmRyb2lkIGFuZCBpT1MgYXBwbGljYXRpb25zIHdpdGhpbiBDb3Jkb3ZhL1Bob25lZ2FwIHByb2plY3RzLlxuICpcbiAqIFRoaXMgcHJvamVjdCBpcyBhIGZvcmsgb2YgdGhlIFdpZmlXaXphcmQgcGx1Z2luIHdpdGggZml4ZXMgYW5kIHVwZGF0ZXMsIGFzIHdlbGwgYXMgcGF0Y2hlcyB0YWtlbiBmcm9tIHRoZSBDb3Jkb3ZhIE5ldHdvcmsgTWFuYWdlciBwbHVnaW4uXG4gKlxuICogQHVzYWdlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBXaWZpV2l6YXJkMiB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy93aWZpLXdpemFyZC0yL25neCc7XG4gKlxuICpcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgd2lmaVdpemFyZDI6IFdpZmlXaXphcmQyKSB7IH1cbiAqXG4gKlxuICogIyBHbG9iYWwgRnVuY3Rpb25zXG4gKiAgVGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGJvdGggQW5kcm9pZCBhbmQgaU9TIGFwcGxpY2F0aW9uc1xuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZFNTSUQoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBjb25uZWN0ZWQgbmV0d29yayBTU0lEIChvbmx5IGlmIGNvbm5lY3RlZCkgaW4gc3VjY2VzcyBjYWxsYmFjaywgb3RoZXJ3aXNlIGZhaWwgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgKGlmIG5vdCBjb25uZWN0ZWQgb3IgdW5hYmxlIHRvIHJldHJpZXZlKVxuICogIC0gVGhpcyBkb2VzICoqTk9UKiogcmV0dXJuIHRoZSBCU1NJRCBpZiB1bmFibGUgdG8gb2J0YWluIFNTSUQgKGxpa2Ugb3JpZ2luYWwgV2lmaVdpemFyZCBkaWQpXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZ2V0Q29ubmVjdGVkQlNTSUQoKVxuICogIGBgYFxuICogIC0gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IEJTU0lEIChtYWMpIGlzIHJldHVybmVkXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnRpbWVvdXQoZGVsYXkpXG4gKiAgYGBgXG4gKiAgLSBgZGVsYXlgIHNob3VsZCBiZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheVxuICogIC0gSGVscGVyIGFzeW5jIHRpbWVvdXQgZGVsYXksIGBkZWxheWAgaXMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgMjAwMG1zID0gMiBzZWNvbmRzXG4gKiAgLSBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2UgYWZ0ZXIgdGhlIGRlbGF5LCBpdCB3aWxsIG5ldmVyIHJlamVjdCBvciB0aHJvdyBhbiBlcnJvclxuICpcbiAqICAqKkV4YW1wbGUgaW5zaWRlIGFzeW5jIGZ1bmN0aW9uKipcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgYXN5bmMgZnVuY3Rpb24gZXhhbXBsZSgpe1xuICogICAgIGF3YWl0IHRoaXMud2lmaVdpemFyZDIudGltZW91dCg0MDAwKTtcbiAqICAgICAvLyBkbyBzb21ldGhpbmcgYWZ0ZXIgNCBzZWNvbmRzXG4gKiB9XG4gKiAgYGBgXG4gKlxuICogICoqRXhhbXBsZSBpbnNpZGUgc3RhbmRhcmQgbm9uLWFzeW5jIGZ1bmN0aW9uKipcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgZnVuY3Rpb24gZXhhbXBsZSgpe1xuICogICAgIHRoaXMud2lmaVdpemFyZDIudGltZW91dCg0MDAwKS50aGVuKCBmdW5jdGlvbigpe1xuICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgYWZ0ZXIgd2FpdGluZyA0IHNlY29uZHNcbiAqICAgICB9KTpcbiAqIH1cbiAqICBgYGBcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVElNRU9VVF9XQUlUSU5HX0ZPUl9TQ0FOYCBvbiB0aW1lb3V0IHdhaXRpbmcgZm9yIHNjYW4gMTAgc2Vjb25kcyArXG4gKiAgLSBgU0NBTl9GQUlMRURgIGlmIHVuYWJsZSB0byBzdGFydCBzY2FuXG4gKlxuICogICMgaU9TIEZ1bmN0aW9uc1xuICogIEZvciBmdW5jdGlvbmFsaXR5LCB5b3UgbmVlZCB0byBub3RlIHRoZSBmb2xsb3dpbmc6XG4gKiAgLSBDb25uZWN0L0Rpc2Nvbm5lY3Qgb25seSB3b3JrcyBmb3IgaU9TMTErXG4gKiAgLSBDYW4ndCBydW4gaW4gdGhlIHNpbXVsYXRvciBzbyB5b3UgbmVlZCB0byBhdHRhY2ggYW4gYWN0dWFsIGRldmljZSB3aGVuIGJ1aWxkaW5nIHdpdGggeENvZGVcbiAqICAtIFdpbGwgZW5zdXJlICdIb3RzcG90Q29uZmlndXJhdGlvbicgYW5kICdOZXR3b3JrRXh0ZW5zaW9ucycgY2FwYWJpbGl0aWVzIGFyZSBhZGRlZCB0byB5b3VyIHhDb2RlIHByb2plY3RcbiAqICAtIFRvIGNvbm5lY3QgdG8gb3BlbiBuZXR3b3JrIG9taXQgYHNzaWRQYXNzd29yZGAgb3IgY2FsbCB3aXRoIGBmYWxzZWBcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuaU9TQ29ubmVjdE5ldHdvcmsoc3NpZCwgc3NpZFBhc3N3b3JkKVxuICogIGBgYFxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlPU0Rpc2Nvbm5lY3ROZXR3b3JrKHNzaWQpXG4gKiAgYGBgXG4gKlxuICogICMgQW5kcm9pZCBGdW5jdGlvbnNcbiAqICAtICoqV2lmaVdpemFyZDIqKiAqd2lsbCBhdXRvbWFnaWNhbGx5IHRyeSB0byBlbmFibGUgV2lGaSBpZiBpdCdzIGRpc2FibGVkIHdoZW4gY2FsbGluZyBhbnkgYW5kcm9pZCByZWxhdGVkIG1ldGhvZHMgdGhhdCByZXF1aXJlIFdpRmkgdG8gYmUgZW5hYmxlZCpcbiAqXG4gKiAgIyMgQ29ubmVjdCB2cyBFbmFibGVcbiAqICBXaGVuIHdyaXRpbmcgQW5kcm9pZCBKYXZhIGNvZGUsIHRoZXJlIGlzIG5vIGBjb25uZWN0YCBtZXRob2RzLCB5b3UgYmFzaWNhbGx5IGVpdGhlciBgZW5hYmxlYCBvciBgZGlzYWJsZWAgYSBuZXR3b3JrLiBJbiB0aGUgb3JpZ2luYWwgdmVyc2lvbnMgb2YgV2lmaVdpemFyZCB0aGUgYGNvbm5lY3RgIG1ldGhvZCB3b3VsZCBiYXNpY2FsbHkganVzdCBjYWxsIGBlbmFibGVgIGluIEFuZHJvaWQuXG4gKiAgSSBoYXZlIGNoYW5nZWQgdGhlIHdheSB0aGlzIHdvcmtzIGluIFdpZmlXaXphcmQyIHZlcnNpb24gMy4wLjArLCBjb252ZXJ0aW5nIGl0IHRvIGEgaGVscGVyIG1ldGhvZCB0byBlbGltaW5hdGUgaGF2aW5nIHRvIGNhbGwgYGZvcm1hdFdpZmlDb25maWdgIHRoZW4gYGFkZGAgYW5kIHRoZW4gYGVuYWJsZWAgLi4uIHRoZSBgY29ubmVjdGAgbWV0aG9kIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgY2FsbCBgZm9ybWF0V2lmaUNvbmZpZ2AsIHRoZW4gY2FsbCBgYWRkYCB0byBlaXRoZXIgYWRkIG9yIHVwZGF0ZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uLCBhbmQgdGhlbiBjYWxsIGBlbmFibGVgLlxuICogIElmIHRoZSBjb25uZWN0IG1ldGhvZCBpcyB1bmFibGUgdG8gdXBkYXRlIGV4aXN0aW5nIG5ldHdvcmsgY29uZmlndXJhdGlvbiAoYWRkZWQgYnkgdXNlciBvciBvdGhlciBhcHBzKSwgYnV0IHRoZXJlIGlzIGEgdmFsaWQgbmV0d29yayBJRCwgaXQgd2lsbCBzdGlsbCBhdHRlbXB0IHRvIGVuYWJsZSB0aGF0IG5ldHdvcmsgSUQuXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmNvbm5lY3Qoc3NpZCwgYmluZEFsbCwgcGFzc3dvcmQsIGFsZ29yaXRobSwgaXNIaWRkZW5TU0lEKVxuICogIGBgYFxuICogIC0gYHNzaWRgIHNob3VsZCBiZSB0aGUgU1NJRCB0byBjb25uZWN0IHRvICpyZXF1aXJlZCpcbiAqICAtIGBiaW5kQWxsYCBzaG91bGQgYmUgc2V0IHRvIGB0cnVlYCB0byB0ZWxsIEFuZHJvaWQgdG8gcm91dGUgYWxsIGNvbm5lY3Rpb25zIGZyb20geW91ciBBbmRyb2lkIGFwcCwgdGhyb3VnaCB0aGUgd2lmaSBjb25uZWN0aW9uIChkZWZhdWx0IGlzIGBmYWxzZWApICpvcHRpb25hbCpcbiAqICAtIFNlZSBgV2lmaVdpemFyZDIuZW5hYmxlYCBmb3IgbW9yZSBkZXRhaWxzIHJlZ2FyZGluZyBgYmluZEFsbGAgZmVhdHVyZVxuICogIC0gYGFsZ29yaXRobWAgYW5kIGBwYXNzd29yZGAgaXMgbm90IHJlcXVpcmVkIGlmIGNvbm5lY3RpbmcgdG8gYW4gb3BlbiBuZXR3b3JrXG4gKiAgLSBDdXJyZW50bHkgYFdQQWAgYW5kIGBXRVBgIGFyZSBvbmx5IHN1cHBvcnRlZCBhbGdvcml0aG1zXG4gKiAgLSBGb3IgYFdQQTJgIGp1c3QgcGFzcyBgV1BBYCBhcyB0aGUgYWxnb3JpdGhtXG4gKiAgLSBTZXQgYGlzSGlkZGVuU1NJRGAgdG8gYHRydWVgIGlmIHRoZSBuZXR3b3JrIHlvdSdyZSBjb25uZWN0aW5nIHRvIGlzIGhpZGRlblxuICogIC0gVGhlc2UgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYGZvcm1hdFdpZmlDb25maWdgXG4gKiAgLSBUaGlzIG1ldGhvZCBlc3NlbnRpYWxseSBjYWxscyBgZm9ybWF0V2lmaUNvbmZpZ2AgdGhlbiBgYWRkYCB0aGVuIGBlbmFibGVgXG4gKiAgLSBJZiB1bmFibGUgdG8gdXBkYXRlIG5ldHdvcmsgY29uZmlndXJhdGlvbiAod2FzIGFkZGVkIGJ5IHVzZXIgb3Igb3RoZXIgYXBwKSwgYnV0IGEgdmFsaWQgbmV0d29yayBJRCBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgYXR0ZW1wdCB0byBlbmFibGUgdGhlIG5ldHdvcmtcbiAqICAtIFByb21pc2Ugd2lsbCBub3QgYmUgcmV0dXJuZWQgdW50aWwgbWV0aG9kIGhhcyB2ZXJpZmllZCB0aGF0IGNvbm5lY3Rpb24gdG8gV2lGaSB3YXMgaW4gY29tcGxldGVkIHN0YXRlICh3YWl0cyB1cCB0byA2MCBzZWNvbmRzKVxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqXG4gKiAgLSBgQ09OTkVDVF9GQUlMRURfVElNRU9VVGAgdW5hYmxlIHRvIHZlcmlmeSBjb25uZWN0aW9uLCB0aW1lZCBvdXQgYWZ0ZXIgNjAgc2Vjb25kc1xuICogIC0gYElOVkFMSURfTkVUV09SS19JRF9UT19DT05ORUNUYCBVbmFibGUgdG8gY29ubmVjdCBiYXNlZCBvbiBnZW5lcmF0ZWQgd2lmaSBjb25maWdcbiAqICAtIGBJTlRFUlBVVF9FWENFUFRfV0hJTEVfQ09OTkVDVElOR2AgSW50ZXJ1cHQgZXhjZXB0aW9uIHdoaWxlIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25cbiAqXG4gKlxuICpcbiAqICAjIyBEaXNjb25uZWN0IHZzIERpc2FibGVcbiAqICBTYW1lIGFzIGFib3ZlIGZvciBDb25uZWN0IHZzIEVuYWJsZSwgZXhjZXB0IGluIHRoaXMgc2l0dWF0aW9uLCBgZGlzY29ubmVjdGAgd2lsbCBmaXJzdCBkaXNhYmxlIHRoZSBuZXR3b3JrLCBhbmQgdGhlbiBhdHRlbXB0IHRvIHJlbW92ZSBpdCAoaWYgU1NJRCBpcyBwYXNzZWQpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmRpc2Nvbm5lY3Qoc3NpZClcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBjYW4gZWl0aGVyIGJlIGFuIFNTSUQgKHN0cmluZykgb3IgYSBuZXR3b3JrIElEIChpbnRlZ2VyKVxuICogIC0gYHNzaWRgIGlzICoqT1BUSU9OQUwqKiAuLiBpZiBub3QgcGFzc2VkLCB3aWxsIGRpc2Nvbm5lY3QgY3VycmVudCBXaUZpIChhbG1vc3QgYWxsIEFuZHJvaWQgdmVyc2lvbnMgbm93IHdpbGwganVzdCBhdXRvbWF0aWNhbGx5IHJlY29ubmVjdCB0byBsYXN0IHdpZmkgYWZ0ZXIgZGlzY29ubmVjdGluZylcbiAqICAtIElmIGBzc2lkYCBpcyBwcm92aWRlZCwgdGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGBkaXNhYmxlYCBhbmQgdGhlbiBgcmVtb3ZlYCB0aGUgbmV0d29ya1xuICogIC0gSWYgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24sIHVzZSBgZGlzYWJsZWAgaW5zdGVhZFxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBESVNDT05ORUNUX05FVF9SRU1PVkVfRVJST1JgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZW1vdmluZyB3aWZpIGNvbmZpZ3VyYXRpb25cbiAqICAtIGBESVNDT05ORUNUX05FVF9ESVNBQkxFX0VSUk9SYCBVbmFibGUgdG8gY29ubmVjdCBiYXNlZCBvbiBnZW5lcmF0ZWQgd2lmaSBjb25maWdcbiAqICAtIGBESVNDT05ORUNUX05FVF9JRF9OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCB0byBkaXNjb25uZWN0L3JlbW92ZSAoZnJvbSBwYXNzZWQgU1NJRClcbiAqICAtIGBFUlJPUl9ESVNDT05ORUNUYCAtIEFuZHJvaWQgZXJyb3IgZGlzY29ubmVjdGluZyB3aWZpIChvbmx5IHdoZW4gU1NJRCBpcyBub3QgcGFzc2VkKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5mb3JtYXRXaWZpQ29uZmlnKHNzaWQsIHBhc3N3b3JkLCBhbGdvcml0aG0sIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIGBhbGdvcml0aG1gIGFuZCBgcGFzc3dvcmRgIGlzIG5vdCByZXF1aXJlZCBpZiBjb25uZWN0aW5nIHRvIGFuIG9wZW4gbmV0d29ya1xuICogIC0gQ3VycmVudGx5IGBXUEFgIGFuZCBgV0VQYCBhcmUgb25seSBzdXBwb3J0ZWQgYWxnb3JpdGhtc1xuICogIC0gRm9yIGBXUEEyYCBqdXN0IHBhc3MgYFdQQWAgYXMgdGhlIGFsZ29yaXRobVxuICogIC0gU2V0IGBpc0hpZGRlblNTSURgIHRvIGB0cnVlYCBpZiB0aGUgbmV0d29yayB5b3UncmUgY29ubmVjdGluZyB0byBpcyBoaWRkZW5cbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5mb3JtYXRXUEFDb25maWcoc3NpZCwgcGFzc3dvcmQsIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIFRoaXMgaXMganVzdCBhIGhlbHBlciBtZXRob2QgdGhhdCBjYWxscyBgV2lmaVdpemFyZDIuZm9ybWF0V2lmaUNvbmZpZyggc3NpZCwgcGFzc3dvcmQsICdXUEEnLCBpc0hpZGRlblNTSUQgKTtgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmFkZCh3aWZpKVxuICogIGBgYFxuICogIC0gYHdpZmlgIG11c3QgYmUgYW4gb2JqZWN0IGZvcm1hdHRlZCBieSBgZm9ybWF0V2lmaUNvbmZpZ2AsIHRoaXMgKiptdXN0KiogYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBgZW5hYmxlYFxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBBVVRIX1RZUEVfTk9UX1NVUFBPUlRFRGAgLSBJbnZhbGlkIGF1dGggdHlwZSBzcGVjaWZpZWRcbiAqICAtIGBFUlJPUl9BRERJTkdfTkVUV09SS2AgLSBBbmRyb2lkIHJldHVybmVkIGAtMWAgc3BlY2lmeWluZyBlcnJvciBhZGRpbmcgbmV0d29ya1xuICogIC0gYEVSUk9SX1VQREFUSU5HX05FVFdPUktgIC0gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IGFuIGV4aXN0aW5nIG5ldHdvcmsgSUQgd2FzIGZvdW5kLCBhbmQgdW5hYmxlIHRvIHVwZGF0ZSBpdFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZW1vdmUoc3NpZClcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBjYW4gZWl0aGVyIGJlIGFuIFNTSUQgKHN0cmluZykgb3IgYSBuZXR3b3JrIElEIChpbnRlZ2VyKVxuICogIC0gUGxlYXNlIG5vdGUsIG1vc3QgbmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCB3aWxsIG9ubHkgYWxsb3cgd2lmaSB0byBiZSByZW1vdmVkIGlmIGNyZWF0ZWQgYnkgeW91ciBhcHBsaWNhdGlvblxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBVTkFCTEVfVE9fUkVNT1ZFYCBBbmRyb2lkIHJldHVybmVkIGZhaWx1cmUgaW4gcmVtb3ZpbmcgbmV0d29ya1xuICogIC0gYFJFTU9WRV9ORVRXT1JLX05PVF9GT1VORGAgVW5hYmxlIHRvIGRldGVybWluZSBuZXR3b3JrIElEIGZyb20gcGFzc2VkIFNTSURcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmxpc3ROZXR3b3JrcygpXG4gKiAgYGBgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnNjYW4oW29wdGlvbnNdKVxuICogIGBgYFxuICogIC0gU2FtZSBhcyBjYWxsaW5nIGBzdGFydFNjYW5gIGFuZCB0aGVuIGBnZXRTY2FuUmVzdWx0c2AsIGV4Y2VwdCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciB0aGUgc2NhbiBjb21wbGV0ZXMgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnN0YXJ0U2NhbigpXG4gKiAgYGBgXG4gKiAgLSBJdCBpcyByZWNvbW1lbmRlZCB0byBqdXN0IHVzZSB0aGUgYHNjYW5gIG1ldGhvZCBpbnN0ZWFkIG9mIGBzdGFydFNjYW5gXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFNUQVJUU0NBTl9GQUlMRURgIEFuZHJvaWQgcmV0dXJuZWQgZmFpbHVyZSBpbiBzdGFydGluZyBzY2FuXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRTY2FuUmVzdWx0cyhbb3B0aW9uc10pXG4gKiAgYGBgXG4gKiAgLSBgZ2V0U2NhblJlc3VsdHNgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGBzdGFydFNjYW5gIChpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYHNjYW5gIGluc3RlYWQgYXMgdGhpcyBzdGFydHMgdGhlIHNjYW4sIHRoZW4gcmV0dXJucyB0aGUgcmVzdWx0cylcbiAqICAtIGBbb3B0aW9uc11gIGlzIG9wdGlvbmFsLCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc3BlY2lmeSwganVzdCBwYXNzIGBzdWNjZXNzYCBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIsIGFuZCBgZmFpbGAgY2FsbGJhY2sgYXMgc2Vjb25kIHBhcmFtZXRlclxuICogIC0gUmV0cmlldmVzIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIG5ldHdvcmtzIGFzIGFuIGFycmF5IG9mIG9iamVjdHMgYW5kIHBhc3NlcyB0aGVtIHRvIHRoZSBmdW5jdGlvbiBsaXN0SGFuZGxlci4gVGhlIGZvcm1hdCBvZiB0aGUgYXJyYXkgaXM6XG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIG5ldHdvcmtzID0gW1xuICogIHsgICBcImxldmVsXCI6IHNpZ25hbF9sZXZlbCwgLy8gcmF3IFJTU0kgdmFsdWVcbiAqICAgICAgICAgXCJTU0lEXCI6IHNzaWQsIC8vIFNTSUQgYXMgc3RyaW5nLCB3aXRoIGVzY2FwZWQgZG91YmxlIHF1b3RlczogXCJcXFwic3NpZCBuYW1lXFxcIlwiXG4gKiAgICAgICAgIFwiQlNTSURcIjogYnNzaWQgLy8gTUFDIGFkZHJlc3Mgb2YgV2lGaSByb3V0ZXIgYXMgc3RyaW5nXG4gKiAgICAgICAgIFwiZnJlcXVlbmN5XCI6IGZyZXF1ZW5jeSBvZiB0aGUgYWNjZXNzIHBvaW50IGNoYW5uZWwgaW4gTUh6XG4gKiAgICAgICAgIFwiY2FwYWJpbGl0aWVzXCI6IGNhcGFiaWxpdGllcyAvLyBEZXNjcmliZXMgdGhlIGF1dGhlbnRpY2F0aW9uLCBrZXkgbWFuYWdlbWVudCwgYW5kIGVuY3J5cHRpb24gc2NoZW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGFjY2VzcyBwb2ludC5cbiAqICAgICAgICAgXCJ0aW1lc3RhbXBcIjogdGltZXN0YW1wIC8vIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBzY2FuIHdhcyBjb21wbGV0ZWRcbiAqICAgICAgICAgXCJjaGFubmVsV2lkdGhcIjpcbiAqICAgICAgICAgXCJjZW50ZXJGcmVxMFwiOlxuICogICAgICAgICBcImNlbnRlckZyZXExXCI6XG4gKiAgICAgfVxuICogIF1cbiAqICBgYGBcbiAqICAtIGBjaGFubmVsV2lkdGhgIGBjZW50ZXJGcmVxMGAgYW5kIGBjZW50ZXJGcmVxMWAgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIEFQSSA+IDIzIChNYXJzaG1hbGxvdyksIGFueSBvbGRlciBBUEkgd2lsbCByZXR1cm4gbnVsbCBmb3IgdGhlc2UgdmFsdWVzXG4gKlxuICogIEFuIG9wdGlvbnMgb2JqZWN0IG1heSBiZSBwYXNzZWQuIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIG9wdGlvbiBpcyBgbnVtTGV2ZWxzYCwgYW5kIGl0IGhhcyB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOlxuICpcbiAqICAtIGlmIGAobiA9PSB0cnVlIHx8IG4gPCAyKWAsIGAqLmdldFNjYW5SZXN1bHRzKHtudW1MZXZlbHM6IG59KWAgd2lsbCByZXR1cm4gZGF0YSBhcyBiZWZvcmUsIHNwbGl0IGluIDUgbGV2ZWxzO1xuICogIC0gaWYgYChuID4gMSlgLCBgKi5nZXRTY2FuUmVzdWx0cyh7bnVtTGV2ZWxzOiBufSlgIHdpbGwgY2FsY3VsYXRlIHRoZSBzaWduYWwgbGV2ZWwsIHNwbGl0IGluIG4gbGV2ZWxzO1xuICogIC0gaWYgYChuID09IGZhbHNlKWAsIGAqLmdldFNjYW5SZXN1bHRzKHtudW1MZXZlbHM6IG59KWAgd2lsbCB1c2UgdGhlIHJhdyBzaWduYWwgbGV2ZWw7XG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlzV2lmaUVuYWJsZWQoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBib29sZWFuIHZhbHVlIG9mIHdoZXRoZXIgV2lmaSBpcyBlbmFibGVkIG9yIG5vdFxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnNldFdpZmlFbmFibGVkKGVuYWJsZWQpXG4gKiAgYGBgXG4gKiAgLSBQYXNzIGB0cnVlYCBmb3IgYGVuYWJsZWRgIHBhcmFtZXRlciB0byBzZXQgV2lmaSBlbmFibGVkXG4gKiAgLSBZb3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCBXaUZpIGVuYWJsZWQgdG8gY2FsbCBvdGhlciBtZXRob2RzIHRoYXQgcmVxdWlyZSB3aWZpIGVuYWJsZWQuICBUaGlzIHBsdWdpbiB3aWxsIGF1dG9tYWdpY2FsbHkgZW5hYmxlIFdpRmkgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgcmVxdWlyZXMgV2lGaSB0byBiZSBlbmFibGVkLlxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9TRVRXSUZJRU5BQkxFRGAgd2lmaSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBjYWxsIChlbmFibGUgb3IgZGlzYWJsZSlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZ2V0Q29ubmVjdGVkTmV0d29ya0lEKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEIGluIHN1Y2Nlc3MgY2FsbGJhY2sgKG9ubHkgaWYgY29ubmVjdGVkKSwgb3RoZXJ3aXNlIGZhaWwgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgR0VUX0NPTk5FQ1RFRF9ORVRfSURfRVJST1JgIFVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEIChtYXkgbm90IGJlIGNvbm5lY3RlZClcbiAqXG4gKiAgIyMgTmV3IHRvIDMuMS4xK1xuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlc2V0QmluZEFsbCgpXG4gKiAgYGBgXG4gKiAgLSBEaXNhYmxlIGJpbmRBbGwgdG8gV2lGaSBuZXR3b3JrIHdpdGhvdXQgZGlzY29ubmVjdGluZyBmcm9tIFdpRmlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuc2V0QmluZEFsbCgpXG4gKiAgYGBgXG4gKiAgLSBFbmFibGUgYmluZEFsbCB0byBXaUZpIG5ldHdvcmsgd2l0aG91dCBkaXNjb25uZWN0aW5nIGZyb20gV2lGaVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jYW5Db25uZWN0VG9JbnRlcm5ldCgpXG4gKiAgYGBgXG4gKlxuICogIC0gUmV0dXJucyBib29sZWFuLCB0cnVlIG9yIGZhbHNlLCBpZiBkZXZpY2UgaXMgYWJsZSB0byBjb25uZWN0IHRvIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20gdmlhIEhUVFAgY29ubmVjdGlvbiAoc2luY2UgcGluZyBpcyB1bnJlbGlhYmxlKVxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBJZiB5b3UgY2FsbGVkIGBjb25uZWN0YCBvciBgZW5hYmxlYCBhbmQgcGFzc2VkIGB0cnVlYCBmb3IgYGJpbmRBbGxgLCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZm9yY2UgdGhlIHBpbmcgdGhyb3VnaCB3aWZpIGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgZGlkIG5vdCBwYXNzIGB0cnVlYCAob3IgcGFzc2VkIGBmYWxzZWApIGZvciBgYmluZEFsbGAsIGFuZCB0aGUgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24sIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIHVzZSBjZWxsIGNvbm5lY3Rpb24gdG8gcGluZyAoZHVlIHRvIEFuZHJvaWQgdXNpbmcgY2VsbCBjb25uZWN0aW9uIHdoZW4gd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0KSBbTW9yZSBEZXRhaWxzXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jYW5Db25uZWN0VG9Sb3V0ZXIoKVxuICogIGBgYFxuICogIC0gQXMgYGNhblBpbmdXaWZpUm91dGVyYCBpcyBub3RvcmlvdXNseSB1bnJlbGlhYmxlLCB0aGlzIG1ldGhvZCB1c2VzIEhUVFAgY29ubmVjdGlvbiB0byB0ZXN0IGlmIGFibGUgdG8gY29ubmVjdCB0byByb3V0ZXIgKGFzIG1vc3Qgcm91dGVycyBzaG91bGQgaGF2ZSB3ZWIgc2VydmVyIHJ1bm5pbmcgb24gcG9ydCA4MClcbiAqICAtIFVua25vd24gZXJyb3JzIHdpbGwgc3RpbGwgYmUgdGhyb3duIGxpa2UgYWxsIG90aGVyIGFzeW5jIGZ1bmN0aW9uc1xuICogIC0gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHRoYXQgeW91ciBBbmRyb2lkIGFwcCBpcyBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHByaXZhdGUgbmV0d29yayBhZnRlciBjb25uZWN0aW5nIHRvIFdpRmlcbiAqICAtIFRoaXMgd2FzIGFkZGVkIGZvciB0ZXN0aW5nIHRoZSBgYmluZEFsbGAgZmVhdHVyZSB0byBzdXBwb3J0IGlzc3VlcyB3aXRoIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSBub3Qgcm91dGluZyBjYWxscyB0aHJvdWdoIFdpRmkgaWYgV2lGaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24gW1NlZSBBbmRyb2lkIEJsb2ddKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqICAtIEF0dGVtcHRzIHRvIGNvbm5lY3Qgcm91dGVyIElQIEhUVFAgc2VydmVyIG9uIHBvcnQgODAgKGV4YW1wbGU6IGBodHRwOi8vMTkyLjE2OC4wLjEvYCB3aGVyZSBgMTkyLjE2OC4wLjFgIGlzIHRoZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIElQIGFkZHJlc3MpXG4gKlxuICogICMjIE5ldyB0byAzLjAuMCtcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5pc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gcGluZyA4LjguOC44XG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIElmIHlvdSBjYWxsZWQgYGNvbm5lY3RgIG9yIGBlbmFibGVgIGFuZCBwYXNzZWQgYHRydWVgIGZvciBgYmluZEFsbGAsIHlvdXIgYXBwbGljYXRpb24gd2lsbCBmb3JjZSB0aGUgcGluZyB0aHJvdWdoIHdpZmkgY29ubmVjdGlvbi5cbiAqICAtIElmIHlvdSBkaWQgbm90IHBhc3MgYHRydWVgIChvciBwYXNzZWQgYGZhbHNlYCkgZm9yIGBiaW5kQWxsYCwgYW5kIHRoZSB3aWZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgY29ubmVjdGlvbiwgQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIHdpbGwgdXNlIGNlbGwgY29ubmVjdGlvbiB0byBwaW5nIChkdWUgdG8gQW5kcm9pZCB1c2luZyBjZWxsIGNvbm5lY3Rpb24gd2hlbiB3aWZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQpIFtNb3JlIERldGFpbHNdKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuUGluZ1dpZmlSb3V0ZXIoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gcGluZyB0aGUgY29ubmVjdGVkIFdpRmkgcm91dGVyIElQIChvYnRhaW5lZCBmcm9tIERIQ1AgaW5mbylcbiAqICAtIFZlcnNpb24gMy4xLjErIHVzZXMgSFRUUCBjb25uZWN0aW9uIHRvIHRlc3QgaWYgYWJsZSB0byBjb25uZWN0IHRvIHJvdXRlciAoYXMgcGluZyBwcmV2aW91cyBkaWQgbm90IHdvcmspXG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgQW5kcm9pZCBhcHAgaXMgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBwcml2YXRlIG5ldHdvcmsgYWZ0ZXIgY29ubmVjdGluZyB0byBXaUZpXG4gKiAgLSBUaGlzIHdhcyBhZGRlZCBmb3IgdGVzdGluZyB0aGUgYGJpbmRBbGxgIGZlYXR1cmUgdG8gc3VwcG9ydCBpc3N1ZXMgd2l0aCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgbm90IHJvdXRpbmcgY2FsbHMgdGhyb3VnaCBXaUZpIGlmIFdpRmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uIFtTZWUgQW5kcm9pZCBCbG9nXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmVuYWJsZVdpZmkoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNhYmxlV2lmaSgpXG4gKiAgYGBgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlJUCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIElQdjQgYWRkcmVzcyBvZiBjdXJyZW50bHkgY29ubmVjdGVkIFdpRmksIG9yIHJlamVjdHMgcHJvbWlzZSBpZiBJUCBub3QgZm91bmQgb3Igd2lmaSBub3QgY29ubmVjdGVkXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlSb3V0ZXJJUCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIElQdjQgV2lGaSByb3V0ZXIgSVAgZnJvbSBjdXJyZW50bHkgY29ubmVjdGVkIFdpRmksIG9yIHJlamVjdHMgcHJvbWlzZSBpZiB1bmFibGUgdG8gZGV0ZXJtaW5lLCBvciB3aWZpIG5vdCBjb25uZWN0ZWRcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgTk9fVkFMSURfSVBfSURFTlRJRklFRGAgaWYgdW5hYmxlIHRvIGRldGVybWluZSBhIHZhbGlkIElQIChpcCByZXR1cm5lZCBmcm9tIGRldmljZSBpcyBgMC4wLjAuMGApXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlJUEluZm8oKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBhIEpTT04gb2JqZWN0IHdpdGggSVB2NCBhZGRyZXNzIGFuZCBzdWJuZXQgYHtcImlwXCI6IFwiMTkyLjE2OC4xLjJcIiwgXCJzdWJuZXRcIjogXCIyNTUuMjU1LjI1NS4wXCIgfWAgb3IgcmVqZWN0ZWQgcHJvbWlzZSBpZiBub3QgZm91bmQgb3Igbm90IGNvbm5lY3RlZFxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYE5PX1ZBTElEX0lQX0lERU5USUZJRURgIGlmIHVuYWJsZSB0byBkZXRlcm1pbmUgYSB2YWxpZCBJUCAoaXAgcmV0dXJuZWQgZnJvbSBkZXZpY2UgaXMgYDAuMC4wLjBgKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZWNvbm5lY3QoKVxuICogIGBgYFxuICogIC0gUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgKippZiB3ZSBhcmUgY3VycmVudGx5IGRpc2Nvbm5lY3RlZC4qKlxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9SRUNPTk5FQ1RgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZWNvbm5lY3RpbmdcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVhc3NvY2lhdGUoKVxuICogIGBgYFxuICogIC0gUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgKipldmVuIGlmIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4qKlxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9SRUFTU09DSUFURWAgQW5kcm9pZCByZXR1cm5lZCBlcnJvciB3aGVuIHJlYXNzb2NpYXRpbmdcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFNTSUROZXR3b3JrSUQoc3NpZClcbiAqICBgYGBcbiAqICAtIEdldCBBbmRyb2lkIE5ldHdvcmsgSUQgZnJvbSBwYXNzZWQgU1NJRFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNhYmxlKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIERpc2FibGUgdGhlIHBhc3NlZCBTU0lEIG5ldHdvcmtcbiAqICAtIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBuZXdlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIHdpbGwgb25seSBhbGxvdyB5b3UgdG8gZGlzYWJsZSBuZXR3b3JrcyBjcmVhdGVkIGJ5IHlvdXIgYXBwbGljYXRpb25cbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVU5BQkxFX1RPX0RJU0FCTEVgIEFuZHJvaWQgcmV0dXJuZWQgZmFpbHVyZSBpbiBkaXNhYmxpbmcgbmV0d29ya1xuICogIC0gYERJU0FCTEVfTkVUV09SS19OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCBmcm9tIHBhc3NlZCBTU0lEIHRvIGRpc2FibGVcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlcXVlc3RQZXJtaXNzaW9uKClcbiAqICBgYGBcbiAqICAtIFJlcXVlc3QgYEFDQ0VTU19GSU5FX0xPQ0FUSU9OYCBwZXJtc3Npb25cbiAqICAtIFRoaXMgQW5kcm9pZCBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkIHRvIHJ1biBgc2NhbmAsIGBzdGFydFN0YXJ0YCBhbmQgYGdldFNjYW5SZXN1bHRzYFxuICogIC0gWW91IGNhbiByZXF1ZXN0IHBlcm1pc3Npb24gYnkgcnVubmluZyB0aGlzIGZ1bmN0aW9uIG1hbnVhbGx5LCBvciBXaWZpV2l6YXJkMiB3aWxsIGF1dG9tYWdpY2FsbHkgcmVxdWVzdCBwZXJtaXNzaW9uIHdoZW4gb25lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgaXMgY2FsbGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFBFUk1JU1NJT05fREVOSUVEYCB1c2VyIGRlbmllZCBwZXJtaXNzaW9uIG9uIGRldmljZVxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZW5hYmxlKHNzaWQsIGJpbmRBbGwsIHdhaXRGb3JDb25uZWN0aW9uKVxuICogIGBgYFxuICogIC0gYHNzaWRgIGNhbiBlaXRoZXIgYmUgYW4gU1NJRCAoc3RyaW5nKSBvciBhIG5ldHdvcmsgSUQgKGludGVnZXIpXG4gKiAgLSBgYmluZEFsbGAgc2hvdWxkIGJlIHNldCB0byBgdHJ1ZWAgdG8gdGVsbCBBbmRyb2lkIHRvIHJvdXRlIGFsbCBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAsIHRocm91Z2ggdGhlIHdpZmkgY29ubmVjdGlvblxuICogIC0gQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIHdpbGwgbm90IHJvdXRlIGNvbm5lY3Rpb25zIHRvIHRoZSBXaUZpIGRldmljZSBpZiBpdCBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24uICBQYXNzaW5nIGB0cnVlYCB0byBgYmluZEFsbGAgd2lsbCBmb3JjZSBBbmRyb2lkIHRvIHJvdXRlIGNvbm5lY3Rpb25zIGZyb20geW91ciBBbmRyb2lkIGFwcCB0aHJvdWdoIFdpZmksIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuZXQgY29ubmVjdGlvbi5cbiAqICAtIElmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIGNvbm5lY3RpbmcgdG8gYSBsb2NhbCBJUCB0aHJvdWdoIFdpRmkgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGludGVybmV0LCB0cnkgZW5hYmxpbmcgYGJpbmRBbGxgIGFuZCB0aGlzIHNob3VsZCBmaXggdGhlIHByb2JsZW0uXG4gKiAgLSBEdXJpbmcgbXkgdGVzdGluZywgc29tZSB2ZXJzaW9ucyBvZiBBbmRyb2lkICg1LjAgLSA3LjEuMikgd291bGQgc3RpbGwgcm91dGUgY29ubmVjdGlvbnMgdGhyb3VnaCBXaUZpIHdpdGhvdXQgaW50ZXJuZXQsIGJ1dCBpdCB3YXMgcmFuZG9tIHRoYXQgc29tZSB2ZXJzaW9ucyB3b3VsZCBhbmQgd291bGQgbm90IHdvcmsuXG4gKiAgLSBUZXN0aW5nIEFuZHJvaWQgT3JlbysgKDguMC4wKykgaWYgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0LCAxMDAlIG9mIHRoZSB0aW1lIGl0IHdvdWxkIE5PVCByb3V0ZSBjb25uZWN0aW9ucyB0aHJvdWdoIFdpRmksIHNvIHlvdSAqbXVzdCogZW5hYmxlIHRoaXMgZm9yIE9yZW8gb3IgbmV3ZXIgdG8gcm91dGUgY29ubmVjdGlvbnMgZnJvbSB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2ggd2lmaSB3aXRob3V0IGludGVybmV0LlxuICogIC0gV2hlbiBgYmluZEFsbGAgaXMgZW5hYmxlZCwgKkFMTCogY29ubmVjdGlvbnMgZnJvbSB5b3VyIGFwcCB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIFdpRmksIHVudGlsIHlvdSBjYWxsIGBkaXNjb25uZWN0YCBvciBgZGlzYWJsZWBcbiAqICAtIFNlZSB0aGUgR29vZ2xlIEFuZHJvaWQgQmxvZyBmb3IgW01vcmUgRGV0YWlsc10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICogIC0gVGhpcyBmZWF0dXJlICpPTkxZKiB3b3JrcyBmb3IgQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspLCBpZiBkZXZpY2UgaXMgcnVubmluZyBBUEkgb2xkZXIgdGhhbiAyMSwgYGJpbmRhbGxgIHdpbGwgYmUgaWdub3JlZCAoYXMgQVBJIG9sZGVyIHRoYW4gMjEgZG9lcyB0aGlzIGJ5IGRlZmF1bHQpXG4gKiAgLSBFbmFibGUgdGhlIHBhc3NlZCBTU0lEIG5ldHdvcmtcbiAqICAtIFlvdSAqKk1VU1QqKiBjYWxsIGBXaWZpV2l6YXJkMi5hZGQod2lmaSlgIGJlZm9yZSBjYWxsaW5nIGBlbmFibGVgIGFzIHRoZSB3aWZpIGNvbmZpZ3VyYXRpb24gbXVzdCBleGlzdCBiZWZvcmUgeW91IGNhbiBlbmFibGUgaXQgKG9yIHByZXZpb3VzbHkgdXNlZCBgY29ubmVjdGAgd2l0aG91dCBjYWxsaW5nIGBkaXNjb25uZWN0YClcbiAqICAtIFRoaXMgbWV0aG9kIGRvZXMgTk9UIHdhaXQgb3IgdmVyaWZ5IGNvbm5lY3Rpb24gdG8gd2lmaSBuZXR3b3JrLCBwYXNzIGB0cnVlYCB0byBgd2FpdEZvckNvbm5lY3Rpb25gIHRvIG9ubHkgcmV0dXJuIHByb21pc2Ugb25jZSBjb25uZWN0aW9uIGlzIHZlcmlmaWVkIGluIENPTVBMRVRFRCBzdGF0ZSB0byBzcGVjaWZpYyBgc3NpZGBcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgYFVOQUJMRV9UT19FTkFCTEVgIC0gQW5kcm9pZCByZXR1cm5lZCBgLTFgIHNpZ25pZnlpbmcgZmFpbHVyZSBlbmFibGluZ1xuICpcbiAqICAjIEluc3RhbGxhdGlvblxuICpcbiAqICAjIyBNYXN0ZXJcbiAqXG4gKiAgUnVuIGBgYGNvcmRvdmEgcGx1Z2luIGFkZCBodHRwczovL2dpdGh1Yi5jb20vdHJpcGZsZXgvd2lmaXdpemFyZDJgYGBcbiAqXG4gKiAgVG8gaW5zdGFsbCBmcm9tIHRoZSBtYXN0ZXIgYnJhbmNoIChsYXRlc3Qgb24gR2l0SHViKVxuICpcbiAqICBUbyBpbnN0YWxsIGEgc3BlY2lmaWMgYnJhbmNoIChhZGQgYCN0YWdgIHJlcGxhY2luZyBgdGFnYCB3aXRoIHRhZyBmcm9tIHRoaXMgcmVwbywgZXhhbXBsZTpcbiAqICBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L3dpZml3aXphcmQyI3YzLjEuMWBgYFxuICpcbiAqICBGaW5kIGF2YWlsYWJsZSB0YWdzIGhlcmU6XG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L1dpZmlXaXphcmQyL3RhZ3NcbiAqXG4gKlxuICogIElmIHlvdSBhcmUgd2FudGluZyB0byBoYXZlIHRoZSBsYXRlc3QgYW5kIGdyZWF0ZXN0IHN0YWJsZSB2ZXJzaW9uLCB0aGVuIHJ1biB0aGUgJ1JlbGVhc2VzJyBjb21tYW5kIGJlbG93LlxuICpcbiAqICAjIyBSZWxlYXNlc1xuICogIFJ1biBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJgYGBcbiAqXG4gKiAgIyMgTWV0ZW9yXG4gKiAgVG8gaW5zdGFsbCBhbmQgdXNlIHRoaXMgcGx1Z2luIGluIGEgTWV0ZW9yIHByb2plY3QsIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIGV4YWN0IHZlcnNpb24gZnJvbSBOUE0gcmVwb3NpdG9yeTpcbiAqICBbaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyKVxuICpcbiAqICBBcyBvZiBBcHJpbCA0dGggMjAxOSwgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIDMuMS4xOlxuICpcbiAqICBgYGBtZXRlb3IgYWRkIGNvcmRvdmE6Y29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJAMy4xLjFgYGBcbiAqXG4gKiAgIyBFcnJvcnMvUmVqZWN0aW9uc1xuICogIE1ldGhvZHMgbm93IHJldHVybiBmb3JtYXR0ZWQgc3RyaW5nIGVycm9ycyBhcyBkZXRhaWxlZCBiZWxvdywgaW5zdGVhZCBvZiByZXR1cm5pbmcgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcy4gIFRoaXMgYWxsb3dzIHlvdSB0byBjaGVjayB5b3Vyc2VsZiB3aGF0IHNwZWNpZmljIGVycm9yIHdhcyByZXR1cm5lZCwgYW5kIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqICBJbiBhbiB1cGNvbWluZyByZWxlYXNlIEkgbWF5IGFkZCBlYXN5IHdheXMgdG8gb3ZlcnJpZGUgZ2VuZXJpYyBtZXNzYWdlcywgb3Igc2V0IHlvdXIgb3duLCBidXQgZm9yIG5vdywgZXJyb3JzIHJldHVybmVkIGNhbiBiZSBmb3VuZCBiZWxvdyBlYWNoIG1ldGhvZC9mdW5jdGlvbi5cbiAqXG4gKiAgIyMgR2VuZXJpYyAqKlRocm93biBFcnJvcnMqKlxuICogIGBXSUZJX05PVF9FTkFCTEVEYFxuICogIGBgYFxuICovXG5AUGx1Z2luKHtcbiAgcGx1Z2luTmFtZTogJ1dpZmlXaXphcmQyJyxcbiAgcGx1Z2luOiAnY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDInLFxuICBwbHVnaW5SZWY6ICdXaWZpV2l6YXJkMicsXG4gIHJlcG86ICdodHRwczovL2dpdGh1Yi5jb20vdHJpcGZsZXgvV2lmaVdpemFyZDInLFxuICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2lmaVdpemFyZDIgZXh0ZW5kcyBBd2Vzb21lQ29yZG92YU5hdGl2ZVBsdWdpbiB7XG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIG5ldHdvcmsgb24gaU9TIGRldmljZVxuICAgKiBAcGFyYW0gc3NpZFxuICAgKiBAcGFyYW0gc3NpZFBhc3N3b3JkICAgICAgUGFzc3dvcmQgaWYgY29ubmVjdGluZyB0byBXUEEvV1BBMiBuZXR3b3JrIChvbWl0IG9yIHVzZSBmYWxzZSB0byBjb25uZWN0IHRvIG9wZW4gbmV0d29yaylcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydpT1MnXSxcbiAgfSlcbiAgaU9TQ29ubmVjdE5ldHdvcmsoc3NpZDogc3RyaW5nLCBzc2lkUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3QgZnJvbSBTU0lEIG9uIGlPUyBkZXZpY2VcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydpT1MnXSxcbiAgfSlcbiAgaU9TRGlzY29ubmVjdE5ldHdvcmsoc3NpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQWRkIHdpZmkgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB3aWZpQ29uZmlnICBNdXN0IGJlIG9iamVjdCBjcmVhdGVkIGJ5IGZvcm1hdFdpZmlDb25maWcoKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgYWRkKHdpZmlDb25maWc6IFdpZmlDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgd2lmaSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHJlbW92ZShzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IG5ldHdvcmsgd2l0aCBzcGVjaWZpZWQgU1NJRFxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0IGFkZCB0aGUgd2lmaSBjb25maWd1cmF0aW9uLCB0aGVuIGVuYWJsZSB0aGUgbmV0d29yaywgcmV0dXJuaW5nIHByb21pc2Ugd2hlbiBjb25uZWN0aW9uIGlzIHZlcmlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtiaW5kQWxsPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIGJpbmQgYWxsIGNvbm5lY3Rpb25zIGZyb20gYXBwLCB0aHJvdWdoIFdpRmkgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkPV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGdvcml0aG09Tk9ORV0gLSBXUEEsIFdQQSAoZm9yIFdQQTIpLCBXRVAgb3IgTk9ORSAoTk9ORSBieSBkZWZhdWx0KVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBjb25uZWN0KHNzaWQ6IHN0cmluZyB8IG51bWJlciwgYmluZEFsbD86IGJvb2xlYW4sIHBhc3N3b3JkPzogc3RyaW5nLCBhbGdvcml0aG0/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IChjdXJyZW50IGlmIFNTSUQgbm90IHN1cHBsaWVkKVxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCwgaWYgcGFzc2VkIGFuIFNTSUQsIHdpbGwgZmlyc3QgZGlzYWJsZSB0aGUgbmV0d29yaywgYW5kIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIGRldmljZS4gIFRvIG9ubHkgXCJkaXNjb25uZWN0XCIgKGllIGRpc2FibGUgaW4gYW5kcm9pZCksXG4gICAqIGNhbGwgV2lmaVdpemFyZDIuZGlzYWJsZSgpIGluc3RlYWQgb2YgZGlzY29ubmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZD1hbGxdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGRpc2Nvbm5lY3Qoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIE5ldHdvcmtcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYmluZEFsbD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0byBiaW5kIGFsbCBuZXR3b3JrIHJlcXVlc3RzIHRvIHRoaXMgd2lmaSBuZXR3b3JrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dhaXRGb3JDb25uZWN0aW9uPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIHdhaXQgYmVmb3JlIHJlc29sdmluZyBwcm9taXNlIHVudGlsIGNvbm5lY3Rpb24gdG8gd2lmaSBpcyB2ZXJpZmllZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBlbmFibGUoc3NpZDogc3RyaW5nIHwgbnVtYmVyLCBiaW5kQWxsPzogYm9vbGVhbiwgd2FpdEZvckNvbm5lY3Rpb24/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBOZXR3b3JrXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGRpc2FibGUoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgZXZlbiBpZiB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIHJlYXNzb2NpYXRlKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsIGlmIHdlIGFyZSBjdXJyZW50bHkgZGlzY29ubmVjdGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICByZWNvbm5lY3QoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50bHkgY29uZmlndXJlZCBuZXR3b3Jrc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgbGlzdE5ldHdvcmtzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG5ldHdvcmsgc2NhbiBhbmQgcmV0dXJuIHJlc3VsdHNcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHNjYW4ob3B0aW9ucz86IFdpZmlTY2FuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHdpZmkgbmV0d29yayBzY2FuIChyZXN1bHRzIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBnZXRTY2FuUmVzdWx0cylcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHN0YXJ0U2NhbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2lmaSBzY2FuIHJlc3VsdHMgKG11c3QgY2FsbCBzdGFydFNjYW4gZmlyc3QsIG9yIGp1c3QgdXNlIHNjYW4oKSlcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFNjYW5SZXN1bHRzKG9wdGlvbnM6IFdpZmlTY2FuUmVzdWx0c09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBXaUZpIGlzIGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGlzV2lmaUVuYWJsZWQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIG9yIERpc2FibGUgV2lGaVxuICAgKiBAcGFyYW0gZW5hYmxlZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBzZXRXaWZpRW5hYmxlZChlbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIFdpRmlcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZW5hYmxlV2lmaSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIFdpRmlcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZGlzYWJsZVdpZmkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVW5iaW5kIE5ldHdvcmtcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHJlc2V0QmluZEFsbCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIE5ldHdvcmtcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHNldEJpbmRBbGwoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IFdpZmkgUm91dGVyIElQIGZyb20gREhDUFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0V2lmaVJvdXRlcklQKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBXaWZpIElQXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRXaWZpSVAoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IFdpZmkgSVAgYW5kIFN1Ym5ldCBBZGRyZXNzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBKU09OIG9iamVjdCBzaW1pbGFyIHRvOiB7IFwiaXBcIjogXCIwLjAuMC4wXCIsIFwic3VibmV0XCI6IFwiMC4wLjAuMFwiIH1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFdpZmlJUEluZm8oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IE5ldHdvcmsgSUQgZnJvbSBTU0lEXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRTU0lETmV0d29ya0lEKHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsgSURcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldENvbm5lY3RlZE5ldHdvcmtJRCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIFNTSURcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldENvbm5lY3RlZFNTSUQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBCU1NJRC9NQUNcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldENvbm5lY3RlZEJTU0lEKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgV2lGaSBjb25uZWN0aW9uIGhhcyBjb25uZWN0aW9uIHRvIHRoZSBpbnRlcm5ldFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgaXNDb25uZWN0ZWRUb0ludGVybmV0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHdlIGNhbiBwaW5nIGN1cnJlbnQgV2lGaSByb3V0ZXIgSVAgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgY2FuUGluZ1dpZmlSb3V0ZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QgdmlhIEhUVFAgY3VycmVudCBXaUZpIHJvdXRlciBJUCBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBjYW5Db25uZWN0VG9Sb3V0ZXIoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBXaUZpIGNvbm5lY3Rpb24gY2FuIGNvbm5lY3QgdG8gaW50ZXJuZXQgKGNoZWNrcyBjb25uZWN0aW9uIHRvIGdvb2dsZS5jb20pXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBjYW5Db25uZWN0VG9JbnRlcm5ldCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IEFDQ0VTU19GSU5FX0xPQ0FUSU9OIHBlcm1pc3Npb25cbiAgICpcbiAgICogVGhpcyBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkIGJ5IEFuZHJvaWQgdG8gcmV0dXJuIHNjYW4gcmVzdWx0cywgeW91IGNhbiBtYW51YWxseSByZXF1ZXN0IGl0IHByaW9yIHRvIHJ1bm5pbmcgYHNjYW5gXG4gICAqIG9yIHRoaXMgcGx1Z2luIHdpbGwgYXV0b21hdGljYWxseSBkbyBpdCB3aGVuIHRoZSBzY2FuIGlzIHJhbi5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHJlcXVlc3RQZXJtaXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBXaUZpIGNvbmZpZ3VyYXRpb24gZm9yIEFuZHJvaWQgRGV2aWNlc1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsZ29yaXRobV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbaXNIaWRkZW5TU0lEXVxuICAgKiBAcmV0dXJucyB7V2lmaUNvbmZpZ3xib29sZWFufVxuICAgKi9cbiAgQENvcmRvdmFGdW5jdGlvbk92ZXJyaWRlKClcbiAgZm9ybWF0V2lmaUNvbmZpZyhcbiAgICBzc2lkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBhbGdvcml0aG06IHN0cmluZyxcbiAgICBpc0hpZGRlblNTSUQ6IGJvb2xlYW5cbiAgKTogV2lmaUNvbmZpZyB8IGJvb2xlYW4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgV1BBIFdpRmkgY29uZmlndXJhdGlvbiBmb3IgQW5kcm9pZCBEZXZpY2VzXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSGlkZGVuU1NJRFxuICAgKiBAcmV0dXJucyB7V2lmaUNvbmZpZ3xib29sZWFufVxuICAgKi9cbiAgQENvcmRvdmFGdW5jdGlvbk92ZXJyaWRlKClcbiAgZm9ybWF0V1BBQ29uZmlnKHNzaWQ6IHN0cmluZyB8IG51bWJlciwgcGFzc3dvcmQ6IHN0cmluZywgaXNIaWRkZW5TU0lEOiBib29sZWFuKTogV2lmaUNvbmZpZyB8IGJvb2xlYW4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgV2lGaSBTU0lEIFN0cmluZ1xuICAgKiBAcGFyYW0gc3NpZFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIGZvcm1hdFdpZmlTdHJpbmcoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgU2xlZXAvVGltZW91dCBgYXdhaXQgdGhpcy50aW1lb3V0KClgXG4gICAqIEBwYXJhbSBkZWxheSAgdGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgKGRlZmF1bHQgMiBzZWNvbmRzKVxuICAgKi9cbiAgQENvcmRvdmFGdW5jdGlvbk92ZXJyaWRlKClcbiAgdGltZW91dChkZWxheT86IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL3BsdWdpbnMvd2lmaS13aXphcmQtMi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxnRUFBd0UsTUFBTSwrQkFBK0IsQ0FBQzs7SUFvYnBGLCtCQUEwQjs7OztJQVl6RCx1Q0FBaUIsYUFBQyxJQUFZLEVBQUUsWUFBb0I7SUFjcEQsMENBQW9CLGFBQUMsSUFBWTtJQWFqQyx5QkFBRyxhQUFDLFVBQXNCO0lBYTFCLDRCQUFNLGFBQUMsSUFBcUI7SUFvQjVCLDZCQUFPLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLFFBQWlCLEVBQUUsU0FBa0I7SUFpQnZGLGdDQUFVLGFBQUMsSUFBcUI7SUFnQmhDLDRCQUFNLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLGlCQUEyQjtJQWM1RSw2QkFBTyxhQUFDLElBQXFCO0lBYTdCLGlDQUFXO0lBYVgsK0JBQVM7SUFZVCxrQ0FBWTtJQWFaLDBCQUFJLGFBQUMsT0FBeUI7SUFZOUIsK0JBQVM7SUFhVCxvQ0FBYyxhQUFDLE9BQStCO0lBWTlDLG1DQUFhO0lBY2Isb0NBQWMsYUFBQyxPQUFnQjtJQWEvQixnQ0FBVTtJQWFWLGlDQUFXO0lBWVgsa0NBQVk7SUFZWixnQ0FBVTtJQVlWLHFDQUFlO0lBWWYsK0JBQVM7SUFjVCxtQ0FBYTtJQWFiLHNDQUFnQixhQUFDLElBQXFCO0lBWXRDLDJDQUFxQjtJQVlyQixzQ0FBZ0I7SUFZaEIsdUNBQWlCO0lBWWpCLDJDQUFxQjtJQVlyQix1Q0FBaUI7SUFZakIsd0NBQWtCO0lBWWxCLDBDQUFvQjtJQWVwQix1Q0FBaUI7SUFjakIsc0NBQWdCLGFBQ2QsSUFBcUIsRUFDckIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsWUFBcUI7SUFjdkIscUNBQWUsYUFBQyxJQUFxQixFQUFFLFFBQWdCLEVBQUUsWUFBcUI7SUFXOUUsc0NBQWdCLGFBQUMsSUFBcUI7SUFVdEMsNkJBQU8sYUFBQyxLQUFjOzs7Ozs7c0JBLzRCeEI7RUFxYmlDLDBCQUEwQjtTQUE5QyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZG92YSwgQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUsIEF3ZXNvbWVDb3Jkb3ZhTmF0aXZlUGx1Z2luLCBQbHVnaW4gfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lmaUNvbmZpZyB7XG4gIFNTSUQ6IHN0cmluZztcbiAgaXNIaWRkZW5TU0lEOiBib29sZWFuO1xuICBhdXRoOiB7XG4gICAgYWxnb3JpdGhtOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lmaVNjYW5SZXN1bHRzT3B0aW9ucyB7XG4gIG51bUxldmVsczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpZmlTY2FuT3B0aW9ucyBleHRlbmRzIFdpZmlTY2FuUmVzdWx0c09wdGlvbnMge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQG5hbWUgV2lmaVdpemFyZDJcbiAqIEBkZXNjcmlwdGlvblxuICogV2lmaVdpemFyZDIgZW5hYmxlcyBXaWZpIG1hbmFnZW1lbnQgZm9yIGJvdGggQW5kcm9pZCBhbmQgaU9TIGFwcGxpY2F0aW9ucyB3aXRoaW4gQ29yZG92YS9QaG9uZWdhcCBwcm9qZWN0cy5cbiAqXG4gKiBUaGlzIHByb2plY3QgaXMgYSBmb3JrIG9mIHRoZSBXaWZpV2l6YXJkIHBsdWdpbiB3aXRoIGZpeGVzIGFuZCB1cGRhdGVzLCBhcyB3ZWxsIGFzIHBhdGNoZXMgdGFrZW4gZnJvbSB0aGUgQ29yZG92YSBOZXR3b3JrIE1hbmFnZXIgcGx1Z2luLlxuICogQHVzYWdlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBXaWZpV2l6YXJkMiB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy93aWZpLXdpemFyZC0yL25neCc7XG4gKlxuICpcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgd2lmaVdpemFyZDI6IFdpZmlXaXphcmQyKSB7IH1cbiAqXG4gKlxuICogIyBHbG9iYWwgRnVuY3Rpb25zXG4gKiAgVGhlc2UgYXJlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGJvdGggQW5kcm9pZCBhbmQgaU9TIGFwcGxpY2F0aW9uc1xuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZFNTSUQoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBjb25uZWN0ZWQgbmV0d29yayBTU0lEIChvbmx5IGlmIGNvbm5lY3RlZCkgaW4gc3VjY2VzcyBjYWxsYmFjaywgb3RoZXJ3aXNlIGZhaWwgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgKGlmIG5vdCBjb25uZWN0ZWQgb3IgdW5hYmxlIHRvIHJldHJpZXZlKVxuICogIC0gVGhpcyBkb2VzICoqTk9UKiogcmV0dXJuIHRoZSBCU1NJRCBpZiB1bmFibGUgdG8gb2J0YWluIFNTSUQgKGxpa2Ugb3JpZ2luYWwgV2lmaVdpemFyZCBkaWQpXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZ2V0Q29ubmVjdGVkQlNTSUQoKVxuICogIGBgYFxuICogIC0gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IEJTU0lEIChtYWMpIGlzIHJldHVybmVkXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnRpbWVvdXQoZGVsYXkpXG4gKiAgYGBgXG4gKiAgLSBgZGVsYXlgIHNob3VsZCBiZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBkZWxheVxuICogIC0gSGVscGVyIGFzeW5jIHRpbWVvdXQgZGVsYXksIGBkZWxheWAgaXMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgMjAwMG1zID0gMiBzZWNvbmRzXG4gKiAgLSBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2UgYWZ0ZXIgdGhlIGRlbGF5LCBpdCB3aWxsIG5ldmVyIHJlamVjdCBvciB0aHJvdyBhbiBlcnJvclxuICpcbiAqICBFeGFtcGxlIGluc2lkZSBhc3luYyBmdW5jdGlvbioqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIGFzeW5jIGZ1bmN0aW9uIGV4YW1wbGUoKXtcbiAqICAgICBhd2FpdCB0aGlzLndpZmlXaXphcmQyLnRpbWVvdXQoNDAwMCk7XG4gKiAgICAgLy8gZG8gc29tZXRoaW5nIGFmdGVyIDQgc2Vjb25kc1xuICogfVxuICogIGBgYFxuICpcbiAqICBFeGFtcGxlIGluc2lkZSBzdGFuZGFyZCBub24tYXN5bmMgZnVuY3Rpb24qKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICBmdW5jdGlvbiBleGFtcGxlKCl7XG4gKiAgICAgdGhpcy53aWZpV2l6YXJkMi50aW1lb3V0KDQwMDApLnRoZW4oIGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyBhZnRlciB3YWl0aW5nIDQgc2Vjb25kc1xuICogICAgIH0pOlxuICogfVxuICogIGBgYFxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVElNRU9VVF9XQUlUSU5HX0ZPUl9TQ0FOYCBvbiB0aW1lb3V0IHdhaXRpbmcgZm9yIHNjYW4gMTAgc2Vjb25kcyArXG4gKiAgLSBgU0NBTl9GQUlMRURgIGlmIHVuYWJsZSB0byBzdGFydCBzY2FuXG4gKlxuICogICMgaU9TIEZ1bmN0aW9uc1xuICogIEZvciBmdW5jdGlvbmFsaXR5LCB5b3UgbmVlZCB0byBub3RlIHRoZSBmb2xsb3dpbmc6XG4gKiAgLSBDb25uZWN0L0Rpc2Nvbm5lY3Qgb25seSB3b3JrcyBmb3IgaU9TMTErXG4gKiAgLSBDYW4ndCBydW4gaW4gdGhlIHNpbXVsYXRvciBzbyB5b3UgbmVlZCB0byBhdHRhY2ggYW4gYWN0dWFsIGRldmljZSB3aGVuIGJ1aWxkaW5nIHdpdGggeENvZGVcbiAqICAtIFdpbGwgZW5zdXJlICdIb3RzcG90Q29uZmlndXJhdGlvbicgYW5kICdOZXR3b3JrRXh0ZW5zaW9ucycgY2FwYWJpbGl0aWVzIGFyZSBhZGRlZCB0byB5b3VyIHhDb2RlIHByb2plY3RcbiAqICAtIFRvIGNvbm5lY3QgdG8gb3BlbiBuZXR3b3JrIG9taXQgYHNzaWRQYXNzd29yZGAgb3IgY2FsbCB3aXRoIGBmYWxzZWBcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuaU9TQ29ubmVjdE5ldHdvcmsoc3NpZCwgc3NpZFBhc3N3b3JkKVxuICogIGBgYFxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlPU0Rpc2Nvbm5lY3ROZXR3b3JrKHNzaWQpXG4gKiAgYGBgXG4gKlxuICogICMgQW5kcm9pZCBGdW5jdGlvbnNcbiAqICAtICoqV2lmaVdpemFyZDIqKiAqd2lsbCBhdXRvbWFnaWNhbGx5IHRyeSB0byBlbmFibGUgV2lGaSBpZiBpdCdzIGRpc2FibGVkIHdoZW4gY2FsbGluZyBhbnkgYW5kcm9pZCByZWxhdGVkIG1ldGhvZHMgdGhhdCByZXF1aXJlIFdpRmkgdG8gYmUgZW5hYmxlZCpcbiAqXG4gKiAgIyMgQ29ubmVjdCB2cyBFbmFibGVcbiAqICBXaGVuIHdyaXRpbmcgQW5kcm9pZCBKYXZhIGNvZGUsIHRoZXJlIGlzIG5vIGBjb25uZWN0YCBtZXRob2RzLCB5b3UgYmFzaWNhbGx5IGVpdGhlciBgZW5hYmxlYCBvciBgZGlzYWJsZWAgYSBuZXR3b3JrLiBJbiB0aGUgb3JpZ2luYWwgdmVyc2lvbnMgb2YgV2lmaVdpemFyZCB0aGUgYGNvbm5lY3RgIG1ldGhvZCB3b3VsZCBiYXNpY2FsbHkganVzdCBjYWxsIGBlbmFibGVgIGluIEFuZHJvaWQuXG4gKiAgSSBoYXZlIGNoYW5nZWQgdGhlIHdheSB0aGlzIHdvcmtzIGluIFdpZmlXaXphcmQyIHZlcnNpb24gMy4wLjArLCBjb252ZXJ0aW5nIGl0IHRvIGEgaGVscGVyIG1ldGhvZCB0byBlbGltaW5hdGUgaGF2aW5nIHRvIGNhbGwgYGZvcm1hdFdpZmlDb25maWdgIHRoZW4gYGFkZGAgYW5kIHRoZW4gYGVuYWJsZWAgLi4uIHRoZSBgY29ubmVjdGAgbWV0aG9kIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgY2FsbCBgZm9ybWF0V2lmaUNvbmZpZ2AsIHRoZW4gY2FsbCBgYWRkYCB0byBlaXRoZXIgYWRkIG9yIHVwZGF0ZSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uLCBhbmQgdGhlbiBjYWxsIGBlbmFibGVgLlxuICogIElmIHRoZSBjb25uZWN0IG1ldGhvZCBpcyB1bmFibGUgdG8gdXBkYXRlIGV4aXN0aW5nIG5ldHdvcmsgY29uZmlndXJhdGlvbiAoYWRkZWQgYnkgdXNlciBvciBvdGhlciBhcHBzKSwgYnV0IHRoZXJlIGlzIGEgdmFsaWQgbmV0d29yayBJRCwgaXQgd2lsbCBzdGlsbCBhdHRlbXB0IHRvIGVuYWJsZSB0aGF0IG5ldHdvcmsgSUQuXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmNvbm5lY3Qoc3NpZCwgYmluZEFsbCwgcGFzc3dvcmQsIGFsZ29yaXRobSwgaXNIaWRkZW5TU0lEKVxuICogIGBgYFxuICogIC0gYHNzaWRgIHNob3VsZCBiZSB0aGUgU1NJRCB0byBjb25uZWN0IHRvICpyZXF1aXJlZCpcbiAqICAtIGBiaW5kQWxsYCBzaG91bGQgYmUgc2V0IHRvIGB0cnVlYCB0byB0ZWxsIEFuZHJvaWQgdG8gcm91dGUgYWxsIGNvbm5lY3Rpb25zIGZyb20geW91ciBBbmRyb2lkIGFwcCwgdGhyb3VnaCB0aGUgd2lmaSBjb25uZWN0aW9uIChkZWZhdWx0IGlzIGBmYWxzZWApICpvcHRpb25hbCpcbiAqICAtIFNlZSBgV2lmaVdpemFyZDIuZW5hYmxlYCBmb3IgbW9yZSBkZXRhaWxzIHJlZ2FyZGluZyBgYmluZEFsbGAgZmVhdHVyZVxuICogIC0gYGFsZ29yaXRobWAgYW5kIGBwYXNzd29yZGAgaXMgbm90IHJlcXVpcmVkIGlmIGNvbm5lY3RpbmcgdG8gYW4gb3BlbiBuZXR3b3JrXG4gKiAgLSBDdXJyZW50bHkgYFdQQWAgYW5kIGBXRVBgIGFyZSBvbmx5IHN1cHBvcnRlZCBhbGdvcml0aG1zXG4gKiAgLSBGb3IgYFdQQTJgIGp1c3QgcGFzcyBgV1BBYCBhcyB0aGUgYWxnb3JpdGhtXG4gKiAgLSBTZXQgYGlzSGlkZGVuU1NJRGAgdG8gYHRydWVgIGlmIHRoZSBuZXR3b3JrIHlvdSdyZSBjb25uZWN0aW5nIHRvIGlzIGhpZGRlblxuICogIC0gVGhlc2UgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYGZvcm1hdFdpZmlDb25maWdgXG4gKiAgLSBUaGlzIG1ldGhvZCBlc3NlbnRpYWxseSBjYWxscyBgZm9ybWF0V2lmaUNvbmZpZ2AgdGhlbiBgYWRkYCB0aGVuIGBlbmFibGVgXG4gKiAgLSBJZiB1bmFibGUgdG8gdXBkYXRlIG5ldHdvcmsgY29uZmlndXJhdGlvbiAod2FzIGFkZGVkIGJ5IHVzZXIgb3Igb3RoZXIgYXBwKSwgYnV0IGEgdmFsaWQgbmV0d29yayBJRCBleGlzdHMsIHRoaXMgbWV0aG9kIHdpbGwgc3RpbGwgYXR0ZW1wdCB0byBlbmFibGUgdGhlIG5ldHdvcmtcbiAqICAtIFByb21pc2Ugd2lsbCBub3QgYmUgcmV0dXJuZWQgdW50aWwgbWV0aG9kIGhhcyB2ZXJpZmllZCB0aGF0IGNvbm5lY3Rpb24gdG8gV2lGaSB3YXMgaW4gY29tcGxldGVkIHN0YXRlICh3YWl0cyB1cCB0byA2MCBzZWNvbmRzKVxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKlxuICogIC0gYENPTk5FQ1RfRkFJTEVEX1RJTUVPVVRgIHVuYWJsZSB0byB2ZXJpZnkgY29ubmVjdGlvbiwgdGltZWQgb3V0IGFmdGVyIDYwIHNlY29uZHNcbiAqICAtIGBJTlZBTElEX05FVFdPUktfSURfVE9fQ09OTkVDVGAgVW5hYmxlIHRvIGNvbm5lY3QgYmFzZWQgb24gZ2VuZXJhdGVkIHdpZmkgY29uZmlnXG4gKiAgLSBgSU5URVJQVVRfRVhDRVBUX1dISUxFX0NPTk5FQ1RJTkdgIEludGVydXB0IGV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIGZvciBjb25uZWN0aW9uXG4gKlxuICpcbiAqXG4gKiAgIyMgRGlzY29ubmVjdCB2cyBEaXNhYmxlXG4gKiAgU2FtZSBhcyBhYm92ZSBmb3IgQ29ubmVjdCB2cyBFbmFibGUsIGV4Y2VwdCBpbiB0aGlzIHNpdHVhdGlvbiwgYGRpc2Nvbm5lY3RgIHdpbGwgZmlyc3QgZGlzYWJsZSB0aGUgbmV0d29yaywgYW5kIHRoZW4gYXR0ZW1wdCB0byByZW1vdmUgaXQgKGlmIFNTSUQgaXMgcGFzc2VkKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNjb25uZWN0KHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIGBzc2lkYCBpcyAqKk9QVElPTkFMKiogLi4gaWYgbm90IHBhc3NlZCwgd2lsbCBkaXNjb25uZWN0IGN1cnJlbnQgV2lGaSAoYWxtb3N0IGFsbCBBbmRyb2lkIHZlcnNpb25zIG5vdyB3aWxsIGp1c3QgYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gbGFzdCB3aWZpIGFmdGVyIGRpc2Nvbm5lY3RpbmcpXG4gKiAgLSBJZiBgc3NpZGAgaXMgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHdpbGwgZmlyc3QgYXR0ZW1wdCB0byBgZGlzYWJsZWAgYW5kIHRoZW4gYHJlbW92ZWAgdGhlIG5ldHdvcmtcbiAqICAtIElmIHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgbmV0d29yayBjb25maWd1cmF0aW9uLCB1c2UgYGRpc2FibGVgIGluc3RlYWRcbiAqXG4gKiAgVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYERJU0NPTk5FQ1RfTkVUX1JFTU9WRV9FUlJPUmAgQW5kcm9pZCByZXR1cm5lZCBlcnJvciB3aGVuIHJlbW92aW5nIHdpZmkgY29uZmlndXJhdGlvblxuICogIC0gYERJU0NPTk5FQ1RfTkVUX0RJU0FCTEVfRVJST1JgIFVuYWJsZSB0byBjb25uZWN0IGJhc2VkIG9uIGdlbmVyYXRlZCB3aWZpIGNvbmZpZ1xuICogIC0gYERJU0NPTk5FQ1RfTkVUX0lEX05PVF9GT1VORGAgVW5hYmxlIHRvIGRldGVybWluZSBuZXR3b3JrIElEIHRvIGRpc2Nvbm5lY3QvcmVtb3ZlIChmcm9tIHBhc3NlZCBTU0lEKVxuICogIC0gYEVSUk9SX0RJU0NPTk5FQ1RgIC0gQW5kcm9pZCBlcnJvciBkaXNjb25uZWN0aW5nIHdpZmkgKG9ubHkgd2hlbiBTU0lEIGlzIG5vdCBwYXNzZWQpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmZvcm1hdFdpZmlDb25maWcoc3NpZCwgcGFzc3dvcmQsIGFsZ29yaXRobSwgaXNIaWRkZW5TU0lEKVxuICogIGBgYFxuICogIC0gYGFsZ29yaXRobWAgYW5kIGBwYXNzd29yZGAgaXMgbm90IHJlcXVpcmVkIGlmIGNvbm5lY3RpbmcgdG8gYW4gb3BlbiBuZXR3b3JrXG4gKiAgLSBDdXJyZW50bHkgYFdQQWAgYW5kIGBXRVBgIGFyZSBvbmx5IHN1cHBvcnRlZCBhbGdvcml0aG1zXG4gKiAgLSBGb3IgYFdQQTJgIGp1c3QgcGFzcyBgV1BBYCBhcyB0aGUgYWxnb3JpdGhtXG4gKiAgLSBTZXQgYGlzSGlkZGVuU1NJRGAgdG8gYHRydWVgIGlmIHRoZSBuZXR3b3JrIHlvdSdyZSBjb25uZWN0aW5nIHRvIGlzIGhpZGRlblxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmZvcm1hdFdQQUNvbmZpZyhzc2lkLCBwYXNzd29yZCwgaXNIaWRkZW5TU0lEKVxuICogIGBgYFxuICogIC0gVGhpcyBpcyBqdXN0IGEgaGVscGVyIG1ldGhvZCB0aGF0IGNhbGxzIGBXaWZpV2l6YXJkMi5mb3JtYXRXaWZpQ29uZmlnKCBzc2lkLCBwYXNzd29yZCwgJ1dQQScsIGlzSGlkZGVuU1NJRCApO2BcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuYWRkKHdpZmkpXG4gKiAgYGBgXG4gKiAgLSBgd2lmaWAgbXVzdCBiZSBhbiBvYmplY3QgZm9ybWF0dGVkIGJ5IGBmb3JtYXRXaWZpQ29uZmlnYCwgdGhpcyAqKm11c3QqKiBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIGBlbmFibGVgXG4gKlxuICogIFRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBBVVRIX1RZUEVfTk9UX1NVUFBPUlRFRGAgLSBJbnZhbGlkIGF1dGggdHlwZSBzcGVjaWZpZWRcbiAqICAtIGBFUlJPUl9BRERJTkdfTkVUV09SS2AgLSBBbmRyb2lkIHJldHVybmVkIGAtMWAgc3BlY2lmeWluZyBlcnJvciBhZGRpbmcgbmV0d29ya1xuICogIC0gYEVSUk9SX1VQREFUSU5HX05FVFdPUktgIC0gU2FtZSBhcyBhYm92ZSwgZXhjZXB0IGFuIGV4aXN0aW5nIG5ldHdvcmsgSUQgd2FzIGZvdW5kLCBhbmQgdW5hYmxlIHRvIHVwZGF0ZSBpdFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZW1vdmUoc3NpZClcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBjYW4gZWl0aGVyIGJlIGFuIFNTSUQgKHN0cmluZykgb3IgYSBuZXR3b3JrIElEIChpbnRlZ2VyKVxuICogIC0gUGxlYXNlIG5vdGUsIG1vc3QgbmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCB3aWxsIG9ubHkgYWxsb3cgd2lmaSB0byBiZSByZW1vdmVkIGlmIGNyZWF0ZWQgYnkgeW91ciBhcHBsaWNhdGlvblxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVU5BQkxFX1RPX1JFTU9WRWAgQW5kcm9pZCByZXR1cm5lZCBmYWlsdXJlIGluIHJlbW92aW5nIG5ldHdvcmtcbiAqICAtIGBSRU1PVkVfTkVUV09SS19OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCBmcm9tIHBhc3NlZCBTU0lEXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5saXN0TmV0d29ya3MoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5zY2FuKFtvcHRpb25zXSlcbiAqICBgYGBcbiAqICAtIFNhbWUgYXMgY2FsbGluZyBgc3RhcnRTY2FuYCBhbmQgdGhlbiBgZ2V0U2NhblJlc3VsdHNgLCBleGNlcHQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJlc29sdmUgdGhlIHByb21pc2UgYWZ0ZXIgdGhlIHNjYW4gY29tcGxldGVzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5zdGFydFNjYW4oKVxuICogIGBgYFxuICogIC0gSXQgaXMgcmVjb21tZW5kZWQgdG8ganVzdCB1c2UgdGhlIGBzY2FuYCBtZXRob2QgaW5zdGVhZCBvZiBgc3RhcnRTY2FuYFxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgU1RBUlRTQ0FOX0ZBSUxFRGAgQW5kcm9pZCByZXR1cm5lZCBmYWlsdXJlIGluIHN0YXJ0aW5nIHNjYW5cbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFNjYW5SZXN1bHRzKFtvcHRpb25zXSlcbiAqICBgYGBcbiAqICAtIGBnZXRTY2FuUmVzdWx0c2Agc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgYHN0YXJ0U2NhbmAgKGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgc2NhbmAgaW5zdGVhZCBhcyB0aGlzIHN0YXJ0cyB0aGUgc2NhbiwgdGhlbiByZXR1cm5zIHRoZSByZXN1bHRzKVxuICogIC0gYFtvcHRpb25zXWAgaXMgb3B0aW9uYWwsIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzcGVjaWZ5LCBqdXN0IHBhc3MgYHN1Y2Nlc3NgIGNhbGxiYWNrIGFzIGZpcnN0IHBhcmFtZXRlciwgYW5kIGBmYWlsYCBjYWxsYmFjayBhcyBzZWNvbmQgcGFyYW1ldGVyXG4gKiAgLSBSZXRyaWV2ZXMgYSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgbmV0d29ya3MgYXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlIGZ1bmN0aW9uIGxpc3RIYW5kbGVyLiBUaGUgZm9ybWF0IG9mIHRoZSBhcnJheSBpczpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgbmV0d29ya3MgPSBbXG4gKiAgeyAgIFwibGV2ZWxcIjogc2lnbmFsX2xldmVsLCAvLyByYXcgUlNTSSB2YWx1ZVxuICogICAgICAgICBcIlNTSURcIjogc3NpZCwgLy8gU1NJRCBhcyBzdHJpbmcsIHdpdGggZXNjYXBlZCBkb3VibGUgcXVvdGVzOiBcIlxcXCJzc2lkIG5hbWVcXFwiXCJcbiAqICAgICAgICAgXCJCU1NJRFwiOiBic3NpZCAvLyBNQUMgYWRkcmVzcyBvZiBXaUZpIHJvdXRlciBhcyBzdHJpbmdcbiAqICAgICAgICAgXCJmcmVxdWVuY3lcIjogZnJlcXVlbmN5IG9mIHRoZSBhY2Nlc3MgcG9pbnQgY2hhbm5lbCBpbiBNSHpcbiAqICAgICAgICAgXCJjYXBhYmlsaXRpZXNcIjogY2FwYWJpbGl0aWVzIC8vIERlc2NyaWJlcyB0aGUgYXV0aGVudGljYXRpb24sIGtleSBtYW5hZ2VtZW50LCBhbmQgZW5jcnlwdGlvbiBzY2hlbWVzIHN1cHBvcnRlZCBieSB0aGUgYWNjZXNzIHBvaW50LlxuICogICAgICAgICBcInRpbWVzdGFtcFwiOiB0aW1lc3RhbXAgLy8gdGltZXN0YW1wIG9mIHdoZW4gdGhlIHNjYW4gd2FzIGNvbXBsZXRlZFxuICogICAgICAgICBcImNoYW5uZWxXaWR0aFwiOlxuICogICAgICAgICBcImNlbnRlckZyZXEwXCI6XG4gKiAgICAgICAgIFwiY2VudGVyRnJlcTFcIjpcbiAqICAgICB9XG4gKiAgXVxuICogIGBgYFxuICogIC0gYGNoYW5uZWxXaWR0aGAgYGNlbnRlckZyZXEwYCBhbmQgYGNlbnRlckZyZXExYCBhcmUgb25seSBzdXBwb3J0ZWQgb24gQVBJID4gMjMgKE1hcnNobWFsbG93KSwgYW55IG9sZGVyIEFQSSB3aWxsIHJldHVybiBudWxsIGZvciB0aGVzZSB2YWx1ZXNcbiAqXG4gKiAgQW4gb3B0aW9ucyBvYmplY3QgbWF5IGJlIHBhc3NlZC4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgb3B0aW9uIGlzIGBudW1MZXZlbHNgLCBhbmQgaXQgaGFzIHRoZSBmb2xsb3dpbmcgYmVoYXZpb3I6XG4gKlxuICogIC0gaWYgYChuID09IHRydWUgfHwgbiA8IDIpYCwgYCouZ2V0U2NhblJlc3VsdHMoe251bUxldmVsczogbn0pYCB3aWxsIHJldHVybiBkYXRhIGFzIGJlZm9yZSwgc3BsaXQgaW4gNSBsZXZlbHM7XG4gKiAgLSBpZiBgKG4gPiAxKWAsIGAqLmdldFNjYW5SZXN1bHRzKHtudW1MZXZlbHM6IG59KWAgd2lsbCBjYWxjdWxhdGUgdGhlIHNpZ25hbCBsZXZlbCwgc3BsaXQgaW4gbiBsZXZlbHM7XG4gKiAgLSBpZiBgKG4gPT0gZmFsc2UpYCwgYCouZ2V0U2NhblJlc3VsdHMoe251bUxldmVsczogbn0pYCB3aWxsIHVzZSB0aGUgcmF3IHNpZ25hbCBsZXZlbDtcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuaXNXaWZpRW5hYmxlZCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgb2Ygd2hldGhlciBXaWZpIGlzIGVuYWJsZWQgb3Igbm90XG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuc2V0V2lmaUVuYWJsZWQoZW5hYmxlZClcbiAqICBgYGBcbiAqICAtIFBhc3MgYHRydWVgIGZvciBgZW5hYmxlZGAgcGFyYW1ldGVyIHRvIHNldCBXaWZpIGVuYWJsZWRcbiAqICAtIFlvdSBkbyBub3QgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gc2V0IFdpRmkgZW5hYmxlZCB0byBjYWxsIG90aGVyIG1ldGhvZHMgdGhhdCByZXF1aXJlIHdpZmkgZW5hYmxlZC4gIFRoaXMgcGx1Z2luIHdpbGwgYXV0b21hZ2ljYWxseSBlbmFibGUgV2lGaSBpZiBhIG1ldGhvZCBpcyBjYWxsZWQgdGhhdCByZXF1aXJlcyBXaUZpIHRvIGJlIGVuYWJsZWQuXG4gKlxuICogIFRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9TRVRXSUZJRU5BQkxFRGAgd2lmaSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBjYWxsIChlbmFibGUgb3IgZGlzYWJsZSlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZ2V0Q29ubmVjdGVkTmV0d29ya0lEKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEIGluIHN1Y2Nlc3MgY2FsbGJhY2sgKG9ubHkgaWYgY29ubmVjdGVkKSwgb3RoZXJ3aXNlIGZhaWwgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWRcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgR0VUX0NPTk5FQ1RFRF9ORVRfSURfRVJST1JgIFVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEIChtYXkgbm90IGJlIGNvbm5lY3RlZClcbiAqXG4gKiAgIyMgTmV3IHRvIDMuMS4xK1xuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlc2V0QmluZEFsbCgpXG4gKiAgYGBgXG4gKiAgLSBEaXNhYmxlIGJpbmRBbGwgdG8gV2lGaSBuZXR3b3JrIHdpdGhvdXQgZGlzY29ubmVjdGluZyBmcm9tIFdpRmlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuc2V0QmluZEFsbCgpXG4gKiAgYGBgXG4gKiAgLSBFbmFibGUgYmluZEFsbCB0byBXaUZpIG5ldHdvcmsgd2l0aG91dCBkaXNjb25uZWN0aW5nIGZyb20gV2lGaVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jYW5Db25uZWN0VG9JbnRlcm5ldCgpXG4gKiAgYGBgXG4gKlxuICogIC0gUmV0dXJucyBib29sZWFuLCB0cnVlIG9yIGZhbHNlLCBpZiBkZXZpY2UgaXMgYWJsZSB0byBjb25uZWN0IHRvIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20gdmlhIEhUVFAgY29ubmVjdGlvbiAoc2luY2UgcGluZyBpcyB1bnJlbGlhYmxlKVxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBJZiB5b3UgY2FsbGVkIGBjb25uZWN0YCBvciBgZW5hYmxlYCBhbmQgcGFzc2VkIGB0cnVlYCBmb3IgYGJpbmRBbGxgLCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZm9yY2UgdGhlIHBpbmcgdGhyb3VnaCB3aWZpIGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgZGlkIG5vdCBwYXNzIGB0cnVlYCAob3IgcGFzc2VkIGBmYWxzZWApIGZvciBgYmluZEFsbGAsIGFuZCB0aGUgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24sIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIHVzZSBjZWxsIGNvbm5lY3Rpb24gdG8gcGluZyAoZHVlIHRvIEFuZHJvaWQgdXNpbmcgY2VsbCBjb25uZWN0aW9uIHdoZW4gd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0KSBbTW9yZSBEZXRhaWxzXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jYW5Db25uZWN0VG9Sb3V0ZXIoKVxuICogIGBgYFxuICogIC0gQXMgYGNhblBpbmdXaWZpUm91dGVyYCBpcyBub3RvcmlvdXNseSB1bnJlbGlhYmxlLCB0aGlzIG1ldGhvZCB1c2VzIEhUVFAgY29ubmVjdGlvbiB0byB0ZXN0IGlmIGFibGUgdG8gY29ubmVjdCB0byByb3V0ZXIgKGFzIG1vc3Qgcm91dGVycyBzaG91bGQgaGF2ZSB3ZWIgc2VydmVyIHJ1bm5pbmcgb24gcG9ydCA4MClcbiAqICAtIFVua25vd24gZXJyb3JzIHdpbGwgc3RpbGwgYmUgdGhyb3duIGxpa2UgYWxsIG90aGVyIGFzeW5jIGZ1bmN0aW9uc1xuICogIC0gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHRoYXQgeW91ciBBbmRyb2lkIGFwcCBpcyBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHByaXZhdGUgbmV0d29yayBhZnRlciBjb25uZWN0aW5nIHRvIFdpRmlcbiAqICAtIFRoaXMgd2FzIGFkZGVkIGZvciB0ZXN0aW5nIHRoZSBgYmluZEFsbGAgZmVhdHVyZSB0byBzdXBwb3J0IGlzc3VlcyB3aXRoIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSBub3Qgcm91dGluZyBjYWxscyB0aHJvdWdoIFdpRmkgaWYgV2lGaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24gW1NlZSBBbmRyb2lkIEJsb2ddKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqICAtIEF0dGVtcHRzIHRvIGNvbm5lY3Qgcm91dGVyIElQIEhUVFAgc2VydmVyIG9uIHBvcnQgODAgKGV4YW1wbGU6IGBodHRwOi8vMTkyLjE2OC4wLjEvYCB3aGVyZSBgMTkyLjE2OC4wLjFgIGlzIHRoZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIElQIGFkZHJlc3MpXG4gKlxuICogICMjIE5ldyB0byAzLjAuMCtcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5pc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gcGluZyA4LjguOC44XG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIElmIHlvdSBjYWxsZWQgYGNvbm5lY3RgIG9yIGBlbmFibGVgIGFuZCBwYXNzZWQgYHRydWVgIGZvciBgYmluZEFsbGAsIHlvdXIgYXBwbGljYXRpb24gd2lsbCBmb3JjZSB0aGUgcGluZyB0aHJvdWdoIHdpZmkgY29ubmVjdGlvbi5cbiAqICAtIElmIHlvdSBkaWQgbm90IHBhc3MgYHRydWVgIChvciBwYXNzZWQgYGZhbHNlYCkgZm9yIGBiaW5kQWxsYCwgYW5kIHRoZSB3aWZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgY29ubmVjdGlvbiwgQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIHdpbGwgdXNlIGNlbGwgY29ubmVjdGlvbiB0byBwaW5nIChkdWUgdG8gQW5kcm9pZCB1c2luZyBjZWxsIGNvbm5lY3Rpb24gd2hlbiB3aWZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQpIFtNb3JlIERldGFpbHNdKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuUGluZ1dpZmlSb3V0ZXIoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gcGluZyB0aGUgY29ubmVjdGVkIFdpRmkgcm91dGVyIElQIChvYnRhaW5lZCBmcm9tIERIQ1AgaW5mbylcbiAqICAtIFZlcnNpb24gMy4xLjErIHVzZXMgSFRUUCBjb25uZWN0aW9uIHRvIHRlc3QgaWYgYWJsZSB0byBjb25uZWN0IHRvIHJvdXRlciAoYXMgcGluZyBwcmV2aW91cyBkaWQgbm90IHdvcmspXG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgQW5kcm9pZCBhcHAgaXMgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBwcml2YXRlIG5ldHdvcmsgYWZ0ZXIgY29ubmVjdGluZyB0byBXaUZpXG4gKiAgLSBUaGlzIHdhcyBhZGRlZCBmb3IgdGVzdGluZyB0aGUgYGJpbmRBbGxgIGZlYXR1cmUgdG8gc3VwcG9ydCBpc3N1ZXMgd2l0aCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgbm90IHJvdXRpbmcgY2FsbHMgdGhyb3VnaCBXaUZpIGlmIFdpRmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uIFtTZWUgQW5kcm9pZCBCbG9nXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmVuYWJsZVdpZmkoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNhYmxlV2lmaSgpXG4gKiAgYGBgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlJUCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIElQdjQgYWRkcmVzcyBvZiBjdXJyZW50bHkgY29ubmVjdGVkIFdpRmksIG9yIHJlamVjdHMgcHJvbWlzZSBpZiBJUCBub3QgZm91bmQgb3Igd2lmaSBub3QgY29ubmVjdGVkXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlSb3V0ZXJJUCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIElQdjQgV2lGaSByb3V0ZXIgSVAgZnJvbSBjdXJyZW50bHkgY29ubmVjdGVkIFdpRmksIG9yIHJlamVjdHMgcHJvbWlzZSBpZiB1bmFibGUgdG8gZGV0ZXJtaW5lLCBvciB3aWZpIG5vdCBjb25uZWN0ZWRcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgTk9fVkFMSURfSVBfSURFTlRJRklFRGAgaWYgdW5hYmxlIHRvIGRldGVybWluZSBhIHZhbGlkIElQIChpcCByZXR1cm5lZCBmcm9tIGRldmljZSBpcyBgMC4wLjAuMGApXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFdpZmlJUEluZm8oKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBhIEpTT04gb2JqZWN0IHdpdGggSVB2NCBhZGRyZXNzIGFuZCBzdWJuZXQgYHtcImlwXCI6IFwiMTkyLjE2OC4xLjJcIiwgXCJzdWJuZXRcIjogXCIyNTUuMjU1LjI1NS4wXCIgfWAgb3IgcmVqZWN0ZWQgcHJvbWlzZSBpZiBub3QgZm91bmQgb3Igbm90IGNvbm5lY3RlZFxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYE5PX1ZBTElEX0lQX0lERU5USUZJRURgIGlmIHVuYWJsZSB0byBkZXRlcm1pbmUgYSB2YWxpZCBJUCAoaXAgcmV0dXJuZWQgZnJvbSBkZXZpY2UgaXMgYDAuMC4wLjBgKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZWNvbm5lY3QoKVxuICogIGBgYFxuICogIC0gUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgKippZiB3ZSBhcmUgY3VycmVudGx5IGRpc2Nvbm5lY3RlZC4qKlxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9SRUNPTk5FQ1RgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZWNvbm5lY3RpbmdcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVhc3NvY2lhdGUoKVxuICogIGBgYFxuICogIC0gUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgKipldmVuIGlmIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4qKlxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBFUlJPUl9SRUFTU09DSUFURWAgQW5kcm9pZCByZXR1cm5lZCBlcnJvciB3aGVuIHJlYXNzb2NpYXRpbmdcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldFNTSUROZXR3b3JrSUQoc3NpZClcbiAqICBgYGBcbiAqICAtIEdldCBBbmRyb2lkIE5ldHdvcmsgSUQgZnJvbSBwYXNzZWQgU1NJRFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNhYmxlKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIERpc2FibGUgdGhlIHBhc3NlZCBTU0lEIG5ldHdvcmtcbiAqICAtIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBuZXdlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIHdpbGwgb25seSBhbGxvdyB5b3UgdG8gZGlzYWJsZSBuZXR3b3JrcyBjcmVhdGVkIGJ5IHlvdXIgYXBwbGljYXRpb25cbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVU5BQkxFX1RPX0RJU0FCTEVgIEFuZHJvaWQgcmV0dXJuZWQgZmFpbHVyZSBpbiBkaXNhYmxpbmcgbmV0d29ya1xuICogIC0gYERJU0FCTEVfTkVUV09SS19OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCBmcm9tIHBhc3NlZCBTU0lEIHRvIGRpc2FibGVcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlcXVlc3RQZXJtaXNzaW9uKClcbiAqICBgYGBcbiAqICAtIFJlcXVlc3QgYEFDQ0VTU19GSU5FX0xPQ0FUSU9OYCBwZXJtc3Npb25cbiAqICAtIFRoaXMgQW5kcm9pZCBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkIHRvIHJ1biBgc2NhbmAsIGBzdGFydFN0YXJ0YCBhbmQgYGdldFNjYW5SZXN1bHRzYFxuICogIC0gWW91IGNhbiByZXF1ZXN0IHBlcm1pc3Npb24gYnkgcnVubmluZyB0aGlzIGZ1bmN0aW9uIG1hbnVhbGx5LCBvciBXaWZpV2l6YXJkMiB3aWxsIGF1dG9tYWdpY2FsbHkgcmVxdWVzdCBwZXJtaXNzaW9uIHdoZW4gb25lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgaXMgY2FsbGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFBFUk1JU1NJT05fREVOSUVEYCB1c2VyIGRlbmllZCBwZXJtaXNzaW9uIG9uIGRldmljZVxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZW5hYmxlKHNzaWQsIGJpbmRBbGwsIHdhaXRGb3JDb25uZWN0aW9uKVxuICogIGBgYFxuICogIC0gYHNzaWRgIGNhbiBlaXRoZXIgYmUgYW4gU1NJRCAoc3RyaW5nKSBvciBhIG5ldHdvcmsgSUQgKGludGVnZXIpXG4gKiAgLSBgYmluZEFsbGAgc2hvdWxkIGJlIHNldCB0byBgdHJ1ZWAgdG8gdGVsbCBBbmRyb2lkIHRvIHJvdXRlIGFsbCBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAsIHRocm91Z2ggdGhlIHdpZmkgY29ubmVjdGlvblxuICogIC0gQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIHdpbGwgbm90IHJvdXRlIGNvbm5lY3Rpb25zIHRvIHRoZSBXaUZpIGRldmljZSBpZiBpdCBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24uICBQYXNzaW5nIGB0cnVlYCB0byBgYmluZEFsbGAgd2lsbCBmb3JjZSBBbmRyb2lkIHRvIHJvdXRlIGNvbm5lY3Rpb25zIGZyb20geW91ciBBbmRyb2lkIGFwcCB0aHJvdWdoIFdpZmksIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuZXQgY29ubmVjdGlvbi5cbiAqICAtIElmIHlvdSBhcmUgaGF2aW5nIHByb2JsZW1zIGNvbm5lY3RpbmcgdG8gYSBsb2NhbCBJUCB0aHJvdWdoIFdpRmkgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGludGVybmV0LCB0cnkgZW5hYmxpbmcgYGJpbmRBbGxgIGFuZCB0aGlzIHNob3VsZCBmaXggdGhlIHByb2JsZW0uXG4gKiAgLSBEdXJpbmcgbXkgdGVzdGluZywgc29tZSB2ZXJzaW9ucyBvZiBBbmRyb2lkICg1LjAgLSA3LjEuMikgd291bGQgc3RpbGwgcm91dGUgY29ubmVjdGlvbnMgdGhyb3VnaCBXaUZpIHdpdGhvdXQgaW50ZXJuZXQsIGJ1dCBpdCB3YXMgcmFuZG9tIHRoYXQgc29tZSB2ZXJzaW9ucyB3b3VsZCBhbmQgd291bGQgbm90IHdvcmsuXG4gKiAgLSBUZXN0aW5nIEFuZHJvaWQgT3JlbysgKDguMC4wKykgaWYgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0LCAxMDAlIG9mIHRoZSB0aW1lIGl0IHdvdWxkIE5PVCByb3V0ZSBjb25uZWN0aW9ucyB0aHJvdWdoIFdpRmksIHNvIHlvdSAqbXVzdCogZW5hYmxlIHRoaXMgZm9yIE9yZW8gb3IgbmV3ZXIgdG8gcm91dGUgY29ubmVjdGlvbnMgZnJvbSB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2ggd2lmaSB3aXRob3V0IGludGVybmV0LlxuICogIC0gV2hlbiBgYmluZEFsbGAgaXMgZW5hYmxlZCwgKkFMTCogY29ubmVjdGlvbnMgZnJvbSB5b3VyIGFwcCB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIFdpRmksIHVudGlsIHlvdSBjYWxsIGBkaXNjb25uZWN0YCBvciBgZGlzYWJsZWBcbiAqICAtIFNlZSB0aGUgR29vZ2xlIEFuZHJvaWQgQmxvZyBmb3IgW01vcmUgRGV0YWlsc10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICogIC0gVGhpcyBmZWF0dXJlICpPTkxZKiB3b3JrcyBmb3IgQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspLCBpZiBkZXZpY2UgaXMgcnVubmluZyBBUEkgb2xkZXIgdGhhbiAyMSwgYGJpbmRhbGxgIHdpbGwgYmUgaWdub3JlZCAoYXMgQVBJIG9sZGVyIHRoYW4gMjEgZG9lcyB0aGlzIGJ5IGRlZmF1bHQpXG4gKiAgLSBFbmFibGUgdGhlIHBhc3NlZCBTU0lEIG5ldHdvcmtcbiAqICAtIFlvdSAqKk1VU1QqKiBjYWxsIGBXaWZpV2l6YXJkMi5hZGQod2lmaSlgIGJlZm9yZSBjYWxsaW5nIGBlbmFibGVgIGFzIHRoZSB3aWZpIGNvbmZpZ3VyYXRpb24gbXVzdCBleGlzdCBiZWZvcmUgeW91IGNhbiBlbmFibGUgaXQgKG9yIHByZXZpb3VzbHkgdXNlZCBgY29ubmVjdGAgd2l0aG91dCBjYWxsaW5nIGBkaXNjb25uZWN0YClcbiAqICAtIFRoaXMgbWV0aG9kIGRvZXMgTk9UIHdhaXQgb3IgdmVyaWZ5IGNvbm5lY3Rpb24gdG8gd2lmaSBuZXR3b3JrLCBwYXNzIGB0cnVlYCB0byBgd2FpdEZvckNvbm5lY3Rpb25gIHRvIG9ubHkgcmV0dXJuIHByb21pc2Ugb25jZSBjb25uZWN0aW9uIGlzIHZlcmlmaWVkIGluIENPTVBMRVRFRCBzdGF0ZSB0byBzcGVjaWZpYyBgc3NpZGBcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgYFVOQUJMRV9UT19FTkFCTEVgIC0gQW5kcm9pZCByZXR1cm5lZCBgLTFgIHNpZ25pZnlpbmcgZmFpbHVyZSBlbmFibGluZ1xuICpcbiAqICAjIEluc3RhbGxhdGlvblxuICpcbiAqICAjIyBNYXN0ZXJcbiAqXG4gKiAgUnVuIGBgYGNvcmRvdmEgcGx1Z2luIGFkZCBodHRwczovL2dpdGh1Yi5jb20vdHJpcGZsZXgvd2lmaXdpemFyZDJgYGBcbiAqXG4gKiAgVG8gaW5zdGFsbCBmcm9tIHRoZSBtYXN0ZXIgYnJhbmNoIChsYXRlc3Qgb24gR2l0SHViKVxuICpcbiAqICBUbyBpbnN0YWxsIGEgc3BlY2lmaWMgYnJhbmNoIChhZGQgYCN0YWdgIHJlcGxhY2luZyBgdGFnYCB3aXRoIHRhZyBmcm9tIHRoaXMgcmVwbywgZXhhbXBsZTpcbiAqICBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L3dpZml3aXphcmQyI3YzLjEuMWBgYFxuICpcbiAqICBGaW5kIGF2YWlsYWJsZSB0YWdzIGhlcmU6XG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L1dpZmlXaXphcmQyL3RhZ3NcbiAqXG4gKlxuICogIElmIHlvdSBhcmUgd2FudGluZyB0byBoYXZlIHRoZSBsYXRlc3QgYW5kIGdyZWF0ZXN0IHN0YWJsZSB2ZXJzaW9uLCB0aGVuIHJ1biB0aGUgJ1JlbGVhc2VzJyBjb21tYW5kIGJlbG93LlxuICpcbiAqICAjIyBSZWxlYXNlc1xuICogIFJ1biBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJgYGBcbiAqXG4gKiAgIyMgTWV0ZW9yXG4gKiAgVG8gaW5zdGFsbCBhbmQgdXNlIHRoaXMgcGx1Z2luIGluIGEgTWV0ZW9yIHByb2plY3QsIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIGV4YWN0IHZlcnNpb24gZnJvbSBOUE0gcmVwb3NpdG9yeTpcbiAqICBbaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyKVxuICpcbiAqICBBcyBvZiBBcHJpbCA0dGggMjAxOSwgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIDMuMS4xOlxuICpcbiAqICBgYGBtZXRlb3IgYWRkIGNvcmRvdmE6Y29yZG92YS1wbHVnaW4td2lmaXdpemFyZDJAMy4xLjFgYGBcbiAqXG4gKiAgIyBFcnJvcnMvUmVqZWN0aW9uc1xuICogIE1ldGhvZHMgbm93IHJldHVybiBmb3JtYXR0ZWQgc3RyaW5nIGVycm9ycyBhcyBkZXRhaWxlZCBiZWxvdywgaW5zdGVhZCBvZiByZXR1cm5pbmcgZ2VuZXJpYyBlcnJvciBtZXNzYWdlcy4gIFRoaXMgYWxsb3dzIHlvdSB0byBjaGVjayB5b3Vyc2VsZiB3aGF0IHNwZWNpZmljIGVycm9yIHdhcyByZXR1cm5lZCwgYW5kIGN1c3RvbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqICBJbiBhbiB1cGNvbWluZyByZWxlYXNlIEkgbWF5IGFkZCBlYXN5IHdheXMgdG8gb3ZlcnJpZGUgZ2VuZXJpYyBtZXNzYWdlcywgb3Igc2V0IHlvdXIgb3duLCBidXQgZm9yIG5vdywgZXJyb3JzIHJldHVybmVkIGNhbiBiZSBmb3VuZCBiZWxvdyBlYWNoIG1ldGhvZC9mdW5jdGlvbi5cbiAqXG4gKiAgIyMgR2VuZXJpYyAqKlRocm93biBFcnJvcnMqKlxuICogIGBXSUZJX05PVF9FTkFCTEVEYFxuICogIGBgYFxuICovXG5AUGx1Z2luKHtcbiAgcGx1Z2luTmFtZTogJ1dpZmlXaXphcmQyJyxcbiAgcGx1Z2luOiAnY29yZG92YS1wbHVnaW4td2lmaXdpemFyZDInLFxuICBwbHVnaW5SZWY6ICdXaWZpV2l6YXJkMicsXG4gIHJlcG86ICdodHRwczovL2dpdGh1Yi5jb20vdHJpcGZsZXgvV2lmaVdpemFyZDInLFxuICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCcsICdpT1MnXSxcbn0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2lmaVdpemFyZDIgZXh0ZW5kcyBBd2Vzb21lQ29yZG92YU5hdGl2ZVBsdWdpbiB7XG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIG5ldHdvcmsgb24gaU9TIGRldmljZVxuICAgKlxuICAgKiBAcGFyYW0gc3NpZFxuICAgKiBAcGFyYW0gc3NpZFBhc3N3b3JkICAgICAgUGFzc3dvcmQgaWYgY29ubmVjdGluZyB0byBXUEEvV1BBMiBuZXR3b3JrIChvbWl0IG9yIHVzZSBmYWxzZSB0byBjb25uZWN0IHRvIG9wZW4gbmV0d29yaylcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydpT1MnXSxcbiAgfSlcbiAgaU9TQ29ubmVjdE5ldHdvcmsoc3NpZDogc3RyaW5nLCBzc2lkUGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3QgZnJvbSBTU0lEIG9uIGlPUyBkZXZpY2VcbiAgICpcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydpT1MnXSxcbiAgfSlcbiAgaU9TRGlzY29ubmVjdE5ldHdvcmsoc3NpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQWRkIHdpZmkgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB3aWZpQ29uZmlnICBNdXN0IGJlIG9iamVjdCBjcmVhdGVkIGJ5IGZvcm1hdFdpZmlDb25maWcoKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgYWRkKHdpZmlDb25maWc6IFdpZmlDb25maWcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgd2lmaSBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIHJlbW92ZShzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IG5ldHdvcmsgd2l0aCBzcGVjaWZpZWQgU1NJRFxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGZpcnN0IGFkZCB0aGUgd2lmaSBjb25maWd1cmF0aW9uLCB0aGVuIGVuYWJsZSB0aGUgbmV0d29yaywgcmV0dXJuaW5nIHByb21pc2Ugd2hlbiBjb25uZWN0aW9uIGlzIHZlcmlmaWVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtiaW5kQWxsPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIGJpbmQgYWxsIGNvbm5lY3Rpb25zIGZyb20gYXBwLCB0aHJvdWdoIFdpRmkgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bhc3N3b3JkPV1cbiAgICogQHBhcmFtIHBhc3N3b3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxnb3JpdGhtPU5PTkVdIC0gV1BBLCBXUEEgKGZvciBXUEEyKSwgV0VQIG9yIE5PTkUgKE5PTkUgYnkgZGVmYXVsdClcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgY29ubmVjdChzc2lkOiBzdHJpbmcgfCBudW1iZXIsIGJpbmRBbGw/OiBib29sZWFuLCBwYXNzd29yZD86IHN0cmluZywgYWxnb3JpdGhtPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdCAoY3VycmVudCBpZiBTU0lEIG5vdCBzdXBwbGllZClcbiAgICpcbiAgICogVGhpcyBtZXRob2QsIGlmIHBhc3NlZCBhbiBTU0lELCB3aWxsIGZpcnN0IGRpc2FibGUgdGhlIG5ldHdvcmssIGFuZCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBkZXZpY2UuICBUbyBvbmx5IFwiZGlzY29ubmVjdFwiIChpZSBkaXNhYmxlIGluIGFuZHJvaWQpLFxuICAgKiBjYWxsIFdpZmlXaXphcmQyLmRpc2FibGUoKSBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWQ9YWxsXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBkaXNjb25uZWN0KHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBOZXR3b3JrXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JpbmRBbGw9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdG8gYmluZCBhbGwgbmV0d29yayByZXF1ZXN0cyB0byB0aGlzIHdpZmkgbmV0d29ya1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3YWl0Rm9yQ29ubmVjdGlvbj1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0byB3YWl0IGJlZm9yZSByZXNvbHZpbmcgcHJvbWlzZSB1bnRpbCBjb25uZWN0aW9uIHRvIHdpZmkgaXMgdmVyaWZpZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZW5hYmxlKHNzaWQ6IHN0cmluZyB8IG51bWJlciwgYmluZEFsbD86IGJvb2xlYW4sIHdhaXRGb3JDb25uZWN0aW9uPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgTmV0d29ya1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBkaXNhYmxlKHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsIGV2ZW4gaWYgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICByZWFzc29jaWF0ZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3QgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgYWNjZXNzIHBvaW50LCBpZiB3ZSBhcmUgY3VycmVudGx5IGRpc2Nvbm5lY3RlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgcmVjb25uZWN0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudGx5IGNvbmZpZ3VyZWQgbmV0d29ya3NcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGxpc3ROZXR3b3JrcygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBuZXR3b3JrIHNjYW4gYW5kIHJldHVybiByZXN1bHRzXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzY2FuKG9wdGlvbnM/OiBXaWZpU2Nhbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB3aWZpIG5ldHdvcmsgc2NhbiAocmVzdWx0cyBjYW4gYmUgcmV0cmlldmVkIHdpdGggZ2V0U2NhblJlc3VsdHMpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzdGFydFNjYW4oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdpZmkgc2NhbiByZXN1bHRzIChtdXN0IGNhbGwgc3RhcnRTY2FuIGZpcnN0LCBvciBqdXN0IHVzZSBzY2FuKCkpXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRTY2FuUmVzdWx0cyhvcHRpb25zOiBXaWZpU2NhblJlc3VsdHNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgV2lGaSBpcyBlbmFibGVkXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBpc1dpZmlFbmFibGVkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBEaXNhYmxlIFdpRmlcbiAgICpcbiAgICogQHBhcmFtIGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgc2V0V2lmaUVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBXaUZpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGVuYWJsZVdpZmkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBXaUZpXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGRpc2FibGVXaWZpKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBOZXR3b3JrXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZXNldEJpbmRBbGwoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQmluZCBOZXR3b3JrXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzZXRCaW5kQWxsKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBXaWZpIFJvdXRlciBJUCBmcm9tIERIQ1BcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFdpZmlSb3V0ZXJJUCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgV2lmaSBJUFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0V2lmaUlQKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBXaWZpIElQIGFuZCBTdWJuZXQgQWRkcmVzc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgSlNPTiBvYmplY3Qgc2ltaWxhciB0bzogeyBcImlwXCI6IFwiMC4wLjAuMFwiLCBcInN1Ym5ldFwiOiBcIjAuMC4wLjBcIiB9XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRXaWZpSVBJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBOZXR3b3JrIElEIGZyb20gU1NJRFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0U1NJRE5ldHdvcmtJRChzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWROZXR3b3JrSUQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBTU0lEXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWRTU0lEKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsgQlNTSUQvTUFDXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWRCU1NJRCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IFdpRmkgY29ubmVjdGlvbiBoYXMgY29ubmVjdGlvbiB0byB0aGUgaW50ZXJuZXRcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGlzQ29ubmVjdGVkVG9JbnRlcm5ldCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSBjYW4gcGluZyBjdXJyZW50IFdpRmkgcm91dGVyIElQIGFkZHJlc3NcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGNhblBpbmdXaWZpUm91dGVyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0IHZpYSBIVFRQIGN1cnJlbnQgV2lGaSByb3V0ZXIgSVAgYWRkcmVzc1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgY2FuQ29ubmVjdFRvUm91dGVyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgV2lGaSBjb25uZWN0aW9uIGNhbiBjb25uZWN0IHRvIGludGVybmV0IChjaGVja3MgY29ubmVjdGlvbiB0byBnb29nbGUuY29tKVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgY2FuQ29ubmVjdFRvSW50ZXJuZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBBQ0NFU1NfRklORV9MT0NBVElPTiBwZXJtaXNzaW9uXG4gICAqXG4gICAqIFRoaXMgcGVybWlzc2lvbiBpcyByZXF1aXJlZCBieSBBbmRyb2lkIHRvIHJldHVybiBzY2FuIHJlc3VsdHMsIHlvdSBjYW4gbWFudWFsbHkgcmVxdWVzdCBpdCBwcmlvciB0byBydW5uaW5nIGBzY2FuYFxuICAgKiBvciB0aGlzIHBsdWdpbiB3aWxsIGF1dG9tYXRpY2FsbHkgZG8gaXQgd2hlbiB0aGUgc2NhbiBpcyByYW4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZXF1ZXN0UGVybWlzc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgV2lGaSBjb25maWd1cmF0aW9uIGZvciBBbmRyb2lkIERldmljZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzd29yZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGdvcml0aG1dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSGlkZGVuU1NJRF1cbiAgICogQHJldHVybnMge1dpZmlDb25maWd8Ym9vbGVhbn1cbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIGZvcm1hdFdpZmlDb25maWcoXG4gICAgc3NpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYWxnb3JpdGhtOiBzdHJpbmcsXG4gICAgaXNIaWRkZW5TU0lEOiBib29sZWFuXG4gICk6IFdpZmlDb25maWcgfCBib29sZWFuIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IFdQQSBXaUZpIGNvbmZpZ3VyYXRpb24gZm9yIEFuZHJvaWQgRGV2aWNlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmRcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0hpZGRlblNTSURcbiAgICogQHJldHVybnMge1dpZmlDb25maWd8Ym9vbGVhbn1cbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIGZvcm1hdFdQQUNvbmZpZyhzc2lkOiBzdHJpbmcgfCBudW1iZXIsIHBhc3N3b3JkOiBzdHJpbmcsIGlzSGlkZGVuU1NJRDogYm9vbGVhbik6IFdpZmlDb25maWcgfCBib29sZWFuIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IFdpRmkgU1NJRCBTdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBAQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUoKVxuICBmb3JtYXRXaWZpU3RyaW5nKHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIFNsZWVwL1RpbWVvdXQgYGF3YWl0IHRoaXMudGltZW91dCgpYFxuICAgKlxuICAgKiBAcGFyYW0gZGVsYXkgIHRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IChkZWZhdWx0IDIgc2Vjb25kcylcbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIHRpbWVvdXQoZGVsYXk/OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxufVxuIl19 |
@@ -22,3 +22,2 @@ import { AwesomeCordovaNativePlugin } from '@awesome-cordova-plugins/core'; | ||
* This project is a fork of the WifiWizard plugin with fixes and updates, as well as patches taken from the Cordova Network Manager plugin. | ||
* | ||
* @usage | ||
@@ -51,3 +50,3 @@ * ```typescript | ||
* | ||
* **Example inside async function** | ||
* Example inside async function** | ||
* ```typescript | ||
@@ -60,3 +59,3 @@ * async function example(){ | ||
* | ||
* **Example inside standard non-async function** | ||
* Example inside standard non-async function** | ||
* ```typescript | ||
@@ -70,3 +69,3 @@ * function example(){ | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -113,3 +112,3 @@ * - `TIMEOUT_WAITING_FOR_SCAN` on timeout waiting for scan 10 seconds + | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -134,3 +133,3 @@ * | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -159,3 +158,3 @@ * - `DISCONNECT_NET_REMOVE_ERROR` Android returned error when removing wifi configuration | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -172,3 +171,3 @@ * - `AUTH_TYPE_NOT_SUPPORTED` - Invalid auth type specified | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -193,3 +192,3 @@ * - `UNABLE_TO_REMOVE` Android returned failure in removing network | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -237,3 +236,3 @@ * - `STARTSCAN_FAILED` Android returned failure in starting scan | ||
* | ||
* **Thrown Errors** | ||
* Thrown Errors** | ||
* | ||
@@ -439,2 +438,3 @@ * - `ERROR_SETWIFIENABLED` wifi state does not match call (enable or disable) | ||
* Connect to network on iOS device | ||
* | ||
* @param ssid | ||
@@ -447,2 +447,3 @@ * @param ssidPassword Password if connecting to WPA/WPA2 network (omit or use false to connect to open network) | ||
* Disconnect from SSID on iOS device | ||
* | ||
* @param ssid | ||
@@ -454,2 +455,3 @@ * @returns {Promise} | ||
* Add wifi network configuration | ||
* | ||
* @param wifiConfig Must be object created by formatWifiConfig() | ||
@@ -461,2 +463,3 @@ * @returns {Promise<any>} | ||
* Remove wifi network configuration | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -474,2 +477,3 @@ * @returns {Promise<any>} | ||
* @param {string} [password=] | ||
* @param password | ||
* @param {string} [algorithm=NONE] - WPA, WPA (for WPA2), WEP or NONE (NONE by default) | ||
@@ -491,2 +495,3 @@ * @returns {Promise<any>} | ||
* Enable Network | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -500,2 +505,3 @@ * @param {boolean} [bindAll=false] - Whether or not to bind all network requests to this wifi network | ||
* Disable Network | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -507,2 +513,3 @@ * @returns {Promise<any>} | ||
* Reconnect to the currently active access point, even if we are already connected. | ||
* | ||
* @returns {Promise<any>} | ||
@@ -513,2 +520,3 @@ */ | ||
* Reconnect to the currently active access point, if we are currently disconnected. | ||
* | ||
* @returns {Promise<any>} | ||
@@ -519,2 +527,3 @@ */ | ||
* Returns currently configured networks | ||
* | ||
* @returns {Promise<any>} | ||
@@ -525,2 +534,3 @@ */ | ||
* Start network scan and return results | ||
* | ||
* @param options | ||
@@ -532,2 +542,3 @@ * @returns {Promise<any>} | ||
* Start wifi network scan (results can be retrieved with getScanResults) | ||
* | ||
* @returns {Promise<any>} | ||
@@ -538,2 +549,3 @@ */ | ||
* Get wifi scan results (must call startScan first, or just use scan()) | ||
* | ||
* @param options | ||
@@ -545,2 +557,3 @@ * @returns {Promise<any>} | ||
* Check if WiFi is enabled | ||
* | ||
* @returns {Promise<any>} | ||
@@ -551,2 +564,3 @@ */ | ||
* Enable or Disable WiFi | ||
* | ||
* @param enabled | ||
@@ -558,2 +572,3 @@ * @returns {Promise<any>} | ||
* Enable WiFi | ||
* | ||
* @returns {Promise<any>} | ||
@@ -564,2 +579,3 @@ */ | ||
* Disable WiFi | ||
* | ||
* @returns {Promise<any>} | ||
@@ -570,2 +586,3 @@ */ | ||
* Unbind Network | ||
* | ||
* @returns {Promise<any>} | ||
@@ -576,2 +593,3 @@ */ | ||
* Bind Network | ||
* | ||
* @returns {Promise<any>} | ||
@@ -582,2 +600,3 @@ */ | ||
* Get Wifi Router IP from DHCP | ||
* | ||
* @returns {Promise<any>} | ||
@@ -588,2 +607,3 @@ */ | ||
* Get Wifi IP | ||
* | ||
* @returns {Promise<any>} | ||
@@ -596,2 +616,3 @@ */ | ||
* This method returns a JSON object similar to: { "ip": "0.0.0.0", "subnet": "0.0.0.0" } | ||
* | ||
* @returns {Promise<any>} | ||
@@ -602,2 +623,3 @@ */ | ||
* Get Network ID from SSID | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -609,2 +631,3 @@ * @returns {Promise<any>} | ||
* Get currently connected network ID | ||
* | ||
* @returns {Promise<any>} | ||
@@ -615,2 +638,3 @@ */ | ||
* Get currently connected network SSID | ||
* | ||
* @returns {Promise<any>} | ||
@@ -621,2 +645,3 @@ */ | ||
* Get currently connected network BSSID/MAC | ||
* | ||
* @returns {Promise<any>} | ||
@@ -627,2 +652,3 @@ */ | ||
* Check if current WiFi connection has connection to the internet | ||
* | ||
* @returns {Promise<any>} | ||
@@ -633,2 +659,3 @@ */ | ||
* Check if we can ping current WiFi router IP address | ||
* | ||
* @returns {Promise<any>} | ||
@@ -639,2 +666,3 @@ */ | ||
* Check if we can connect via HTTP current WiFi router IP address | ||
* | ||
* @returns {Promise<any>} | ||
@@ -645,2 +673,3 @@ */ | ||
* Check if current WiFi connection can connect to internet (checks connection to google.com) | ||
* | ||
* @returns {Promise<any>} | ||
@@ -660,2 +689,3 @@ */ | ||
* Format WiFi configuration for Android Devices | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -670,2 +700,3 @@ * @param {string} [password] | ||
* Format WPA WiFi configuration for Android Devices | ||
* | ||
* @param {string|number} [ssid] | ||
@@ -679,2 +710,3 @@ * @param {string} password | ||
* Format WiFi SSID String | ||
* | ||
* @param ssid | ||
@@ -686,2 +718,3 @@ * @returns {*} | ||
* Synchronous Sleep/Timeout `await this.timeout()` | ||
* | ||
* @param delay the amount of time to wait (default 2 seconds) | ||
@@ -688,0 +721,0 @@ */ |
@@ -56,2 +56,2 @@ import { __extends } from "tslib"; | ||
export { WifiWizard2 }; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL3BsdWdpbnMvd2lmaS13aXphcmQtMi9uZ3gvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxnRUFBd0UsTUFBTSwrQkFBK0IsQ0FBQzs7SUFxYnBGLCtCQUEwQjs7OztJQVd6RCx1Q0FBaUIsYUFBQyxJQUFZLEVBQUUsWUFBb0I7SUFhcEQsMENBQW9CLGFBQUMsSUFBWTtJQVlqQyx5QkFBRyxhQUFDLFVBQXNCO0lBWTFCLDRCQUFNLGFBQUMsSUFBcUI7SUFtQjVCLDZCQUFPLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLFFBQWlCLEVBQUUsU0FBa0I7SUFpQnZGLGdDQUFVLGFBQUMsSUFBcUI7SUFlaEMsNEJBQU0sYUFBQyxJQUFxQixFQUFFLE9BQWlCLEVBQUUsaUJBQTJCO0lBYTVFLDZCQUFPLGFBQUMsSUFBcUI7SUFZN0IsaUNBQVc7SUFZWCwrQkFBUztJQVdULGtDQUFZO0lBWVosMEJBQUksYUFBQyxPQUF5QjtJQVc5QiwrQkFBUztJQVlULG9DQUFjLGFBQUMsT0FBK0I7SUFXOUMsbUNBQWE7SUFhYixvQ0FBYyxhQUFDLE9BQWdCO0lBWS9CLGdDQUFVO0lBWVYsaUNBQVc7SUFXWCxrQ0FBWTtJQVdaLGdDQUFVO0lBV1YscUNBQWU7SUFXZiwrQkFBUztJQWFULG1DQUFhO0lBWWIsc0NBQWdCLGFBQUMsSUFBcUI7SUFXdEMsMkNBQXFCO0lBV3JCLHNDQUFnQjtJQVdoQix1Q0FBaUI7SUFXakIsMkNBQXFCO0lBV3JCLHVDQUFpQjtJQVdqQix3Q0FBa0I7SUFXbEIsMENBQW9CO0lBZXBCLHVDQUFpQjtJQWFqQixzQ0FBZ0IsYUFDZCxJQUFxQixFQUNyQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixZQUFxQjtJQWF2QixxQ0FBZSxhQUFDLElBQXFCLEVBQUUsUUFBZ0IsRUFBRSxZQUFxQjtJQVU5RSxzQ0FBZ0IsYUFBQyxJQUFxQjtJQVN0Qyw2QkFBTyxhQUFDLEtBQWM7Ozs7Ozs7Z0JBemJ2QixVQUFVOztzQkFyYlg7RUFzYmlDLDBCQUEwQjtTQUE5QyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZG92YSwgQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUsIEF3ZXNvbWVDb3Jkb3ZhTmF0aXZlUGx1Z2luLCBQbHVnaW4gfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lmaUNvbmZpZyB7XG4gIFNTSUQ6IHN0cmluZztcbiAgaXNIaWRkZW5TU0lEOiBib29sZWFuO1xuICBhdXRoOiB7XG4gICAgYWxnb3JpdGhtOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lmaVNjYW5SZXN1bHRzT3B0aW9ucyB7XG4gIG51bUxldmVsczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpZmlTY2FuT3B0aW9ucyBleHRlbmRzIFdpZmlTY2FuUmVzdWx0c09wdGlvbnMge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQG5hbWUgV2lmaVdpemFyZDJcbiAqIEBkZXNjcmlwdGlvblxuICogV2lmaVdpemFyZDIgZW5hYmxlcyBXaWZpIG1hbmFnZW1lbnQgZm9yIGJvdGggQW5kcm9pZCBhbmQgaU9TIGFwcGxpY2F0aW9ucyB3aXRoaW4gQ29yZG92YS9QaG9uZWdhcCBwcm9qZWN0cy5cbiAqXG4gKiBUaGlzIHByb2plY3QgaXMgYSBmb3JrIG9mIHRoZSBXaWZpV2l6YXJkIHBsdWdpbiB3aXRoIGZpeGVzIGFuZCB1cGRhdGVzLCBhcyB3ZWxsIGFzIHBhdGNoZXMgdGFrZW4gZnJvbSB0aGUgQ29yZG92YSBOZXR3b3JrIE1hbmFnZXIgcGx1Z2luLlxuICpcbiAqIEB1c2FnZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgV2lmaVdpemFyZDIgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvd2lmaS13aXphcmQtMi9uZ3gnO1xuICpcbiAqXG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIHdpZmlXaXphcmQyOiBXaWZpV2l6YXJkMikgeyB9XG4gKlxuICpcbiAqICMgR2xvYmFsIEZ1bmN0aW9uc1xuICogIFRoZXNlIGFyZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSBib3RoIEFuZHJvaWQgYW5kIGlPUyBhcHBsaWNhdGlvbnNcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRDb25uZWN0ZWRTU0lEKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgY29ubmVjdGVkIG5ldHdvcmsgU1NJRCAob25seSBpZiBjb25uZWN0ZWQpIGluIHN1Y2Nlc3MgY2FsbGJhY2ssIG90aGVyd2lzZSBmYWlsIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIChpZiBub3QgY29ubmVjdGVkIG9yIHVuYWJsZSB0byByZXRyaWV2ZSlcbiAqICAtIFRoaXMgZG9lcyAqKk5PVCoqIHJldHVybiB0aGUgQlNTSUQgaWYgdW5hYmxlIHRvIG9idGFpbiBTU0lEIChsaWtlIG9yaWdpbmFsIFdpZmlXaXphcmQgZGlkKVxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZEJTU0lEKClcbiAqICBgYGBcbiAqICAtIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBCU1NJRCAobWFjKSBpcyByZXR1cm5lZFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi50aW1lb3V0KGRlbGF5KVxuICogIGBgYFxuICogIC0gYGRlbGF5YCBzaG91bGQgYmUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXlcbiAqICAtIEhlbHBlciBhc3luYyB0aW1lb3V0IGRlbGF5LCBgZGVsYXlgIGlzIG9wdGlvbmFsLCBkZWZhdWx0IGlzIDIwMDBtcyA9IDIgc2Vjb25kc1xuICogIC0gVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlIGFmdGVyIHRoZSBkZWxheSwgaXQgd2lsbCBuZXZlciByZWplY3Qgb3IgdGhyb3cgYW4gZXJyb3JcbiAqXG4gKiAgKipFeGFtcGxlIGluc2lkZSBhc3luYyBmdW5jdGlvbioqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIGFzeW5jIGZ1bmN0aW9uIGV4YW1wbGUoKXtcbiAqICAgICBhd2FpdCB0aGlzLndpZmlXaXphcmQyLnRpbWVvdXQoNDAwMCk7XG4gKiAgICAgLy8gZG8gc29tZXRoaW5nIGFmdGVyIDQgc2Vjb25kc1xuICogfVxuICogIGBgYFxuICpcbiAqICAqKkV4YW1wbGUgaW5zaWRlIHN0YW5kYXJkIG5vbi1hc3luYyBmdW5jdGlvbioqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIGZ1bmN0aW9uIGV4YW1wbGUoKXtcbiAqICAgICB0aGlzLndpZmlXaXphcmQyLnRpbWVvdXQoNDAwMCkudGhlbiggZnVuY3Rpb24oKXtcbiAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGFmdGVyIHdhaXRpbmcgNCBzZWNvbmRzXG4gKiAgICAgfSk6XG4gKiB9XG4gKiAgYGBgXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFRJTUVPVVRfV0FJVElOR19GT1JfU0NBTmAgb24gdGltZW91dCB3YWl0aW5nIGZvciBzY2FuIDEwIHNlY29uZHMgK1xuICogIC0gYFNDQU5fRkFJTEVEYCBpZiB1bmFibGUgdG8gc3RhcnQgc2NhblxuICpcbiAqICAjIGlPUyBGdW5jdGlvbnNcbiAqICBGb3IgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG8gbm90ZSB0aGUgZm9sbG93aW5nOlxuICogIC0gQ29ubmVjdC9EaXNjb25uZWN0IG9ubHkgd29ya3MgZm9yIGlPUzExK1xuICogIC0gQ2FuJ3QgcnVuIGluIHRoZSBzaW11bGF0b3Igc28geW91IG5lZWQgdG8gYXR0YWNoIGFuIGFjdHVhbCBkZXZpY2Ugd2hlbiBidWlsZGluZyB3aXRoIHhDb2RlXG4gKiAgLSBXaWxsIGVuc3VyZSAnSG90c3BvdENvbmZpZ3VyYXRpb24nIGFuZCAnTmV0d29ya0V4dGVuc2lvbnMnIGNhcGFiaWxpdGllcyBhcmUgYWRkZWQgdG8geW91ciB4Q29kZSBwcm9qZWN0XG4gKiAgLSBUbyBjb25uZWN0IHRvIG9wZW4gbmV0d29yayBvbWl0IGBzc2lkUGFzc3dvcmRgIG9yIGNhbGwgd2l0aCBgZmFsc2VgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlPU0Nvbm5lY3ROZXR3b3JrKHNzaWQsIHNzaWRQYXNzd29yZClcbiAqICBgYGBcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5pT1NEaXNjb25uZWN0TmV0d29yayhzc2lkKVxuICogIGBgYFxuICpcbiAqICAjIEFuZHJvaWQgRnVuY3Rpb25zXG4gKiAgLSAqKldpZmlXaXphcmQyKiogKndpbGwgYXV0b21hZ2ljYWxseSB0cnkgdG8gZW5hYmxlIFdpRmkgaWYgaXQncyBkaXNhYmxlZCB3aGVuIGNhbGxpbmcgYW55IGFuZHJvaWQgcmVsYXRlZCBtZXRob2RzIHRoYXQgcmVxdWlyZSBXaUZpIHRvIGJlIGVuYWJsZWQqXG4gKlxuICogICMjIENvbm5lY3QgdnMgRW5hYmxlXG4gKiAgV2hlbiB3cml0aW5nIEFuZHJvaWQgSmF2YSBjb2RlLCB0aGVyZSBpcyBubyBgY29ubmVjdGAgbWV0aG9kcywgeW91IGJhc2ljYWxseSBlaXRoZXIgYGVuYWJsZWAgb3IgYGRpc2FibGVgIGEgbmV0d29yay4gSW4gdGhlIG9yaWdpbmFsIHZlcnNpb25zIG9mIFdpZmlXaXphcmQgdGhlIGBjb25uZWN0YCBtZXRob2Qgd291bGQgYmFzaWNhbGx5IGp1c3QgY2FsbCBgZW5hYmxlYCBpbiBBbmRyb2lkLlxuICogIEkgaGF2ZSBjaGFuZ2VkIHRoZSB3YXkgdGhpcyB3b3JrcyBpbiBXaWZpV2l6YXJkMiB2ZXJzaW9uIDMuMC4wKywgY29udmVydGluZyBpdCB0byBhIGhlbHBlciBtZXRob2QgdG8gZWxpbWluYXRlIGhhdmluZyB0byBjYWxsIGBmb3JtYXRXaWZpQ29uZmlnYCB0aGVuIGBhZGRgIGFuZCB0aGVuIGBlbmFibGVgIC4uLiB0aGUgYGNvbm5lY3RgIG1ldGhvZCB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGwgYGZvcm1hdFdpZmlDb25maWdgLCB0aGVuIGNhbGwgYGFkZGAgdG8gZWl0aGVyIGFkZCBvciB1cGRhdGUgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiwgYW5kIHRoZW4gY2FsbCBgZW5hYmxlYC5cbiAqICBJZiB0aGUgY29ubmVjdCBtZXRob2QgaXMgdW5hYmxlIHRvIHVwZGF0ZSBleGlzdGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKGFkZGVkIGJ5IHVzZXIgb3Igb3RoZXIgYXBwcyksIGJ1dCB0aGVyZSBpcyBhIHZhbGlkIG5ldHdvcmsgSUQsIGl0IHdpbGwgc3RpbGwgYXR0ZW1wdCB0byBlbmFibGUgdGhhdCBuZXR3b3JrIElELlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jb25uZWN0KHNzaWQsIGJpbmRBbGwsIHBhc3N3b3JkLCBhbGdvcml0aG0sIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBzaG91bGQgYmUgdGhlIFNTSUQgdG8gY29ubmVjdCB0byAqcmVxdWlyZWQqXG4gKiAgLSBgYmluZEFsbGAgc2hvdWxkIGJlIHNldCB0byBgdHJ1ZWAgdG8gdGVsbCBBbmRyb2lkIHRvIHJvdXRlIGFsbCBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAsIHRocm91Z2ggdGhlIHdpZmkgY29ubmVjdGlvbiAoZGVmYXVsdCBpcyBgZmFsc2VgKSAqb3B0aW9uYWwqXG4gKiAgLSBTZWUgYFdpZmlXaXphcmQyLmVuYWJsZWAgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYGJpbmRBbGxgIGZlYXR1cmVcbiAqICAtIGBhbGdvcml0aG1gIGFuZCBgcGFzc3dvcmRgIGlzIG5vdCByZXF1aXJlZCBpZiBjb25uZWN0aW5nIHRvIGFuIG9wZW4gbmV0d29ya1xuICogIC0gQ3VycmVudGx5IGBXUEFgIGFuZCBgV0VQYCBhcmUgb25seSBzdXBwb3J0ZWQgYWxnb3JpdGhtc1xuICogIC0gRm9yIGBXUEEyYCBqdXN0IHBhc3MgYFdQQWAgYXMgdGhlIGFsZ29yaXRobVxuICogIC0gU2V0IGBpc0hpZGRlblNTSURgIHRvIGB0cnVlYCBpZiB0aGUgbmV0d29yayB5b3UncmUgY29ubmVjdGluZyB0byBpcyBoaWRkZW5cbiAqICAtIFRoZXNlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIGBmb3JtYXRXaWZpQ29uZmlnYFxuICogIC0gVGhpcyBtZXRob2QgZXNzZW50aWFsbHkgY2FsbHMgYGZvcm1hdFdpZmlDb25maWdgIHRoZW4gYGFkZGAgdGhlbiBgZW5hYmxlYFxuICogIC0gSWYgdW5hYmxlIHRvIHVwZGF0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKHdhcyBhZGRlZCBieSB1c2VyIG9yIG90aGVyIGFwcCksIGJ1dCBhIHZhbGlkIG5ldHdvcmsgSUQgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIHN0aWxsIGF0dGVtcHQgdG8gZW5hYmxlIHRoZSBuZXR3b3JrXG4gKiAgLSBQcm9taXNlIHdpbGwgbm90IGJlIHJldHVybmVkIHVudGlsIG1ldGhvZCBoYXMgdmVyaWZpZWQgdGhhdCBjb25uZWN0aW9uIHRvIFdpRmkgd2FzIGluIGNvbXBsZXRlZCBzdGF0ZSAod2FpdHMgdXAgdG8gNjAgc2Vjb25kcylcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKlxuICogIC0gYENPTk5FQ1RfRkFJTEVEX1RJTUVPVVRgIHVuYWJsZSB0byB2ZXJpZnkgY29ubmVjdGlvbiwgdGltZWQgb3V0IGFmdGVyIDYwIHNlY29uZHNcbiAqICAtIGBJTlZBTElEX05FVFdPUktfSURfVE9fQ09OTkVDVGAgVW5hYmxlIHRvIGNvbm5lY3QgYmFzZWQgb24gZ2VuZXJhdGVkIHdpZmkgY29uZmlnXG4gKiAgLSBgSU5URVJQVVRfRVhDRVBUX1dISUxFX0NPTk5FQ1RJTkdgIEludGVydXB0IGV4Y2VwdGlvbiB3aGlsZSB3YWl0aW5nIGZvciBjb25uZWN0aW9uXG4gKlxuICpcbiAqXG4gKiAgIyMgRGlzY29ubmVjdCB2cyBEaXNhYmxlXG4gKiAgU2FtZSBhcyBhYm92ZSBmb3IgQ29ubmVjdCB2cyBFbmFibGUsIGV4Y2VwdCBpbiB0aGlzIHNpdHVhdGlvbiwgYGRpc2Nvbm5lY3RgIHdpbGwgZmlyc3QgZGlzYWJsZSB0aGUgbmV0d29yaywgYW5kIHRoZW4gYXR0ZW1wdCB0byByZW1vdmUgaXQgKGlmIFNTSUQgaXMgcGFzc2VkKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5kaXNjb25uZWN0KHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIGBzc2lkYCBpcyAqKk9QVElPTkFMKiogLi4gaWYgbm90IHBhc3NlZCwgd2lsbCBkaXNjb25uZWN0IGN1cnJlbnQgV2lGaSAoYWxtb3N0IGFsbCBBbmRyb2lkIHZlcnNpb25zIG5vdyB3aWxsIGp1c3QgYXV0b21hdGljYWxseSByZWNvbm5lY3QgdG8gbGFzdCB3aWZpIGFmdGVyIGRpc2Nvbm5lY3RpbmcpXG4gKiAgLSBJZiBgc3NpZGAgaXMgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIHdpbGwgZmlyc3QgYXR0ZW1wdCB0byBgZGlzYWJsZWAgYW5kIHRoZW4gYHJlbW92ZWAgdGhlIG5ldHdvcmtcbiAqICAtIElmIHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgbmV0d29yayBjb25maWd1cmF0aW9uLCB1c2UgYGRpc2FibGVgIGluc3RlYWRcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRElTQ09OTkVDVF9ORVRfUkVNT1ZFX0VSUk9SYCBBbmRyb2lkIHJldHVybmVkIGVycm9yIHdoZW4gcmVtb3Zpbmcgd2lmaSBjb25maWd1cmF0aW9uXG4gKiAgLSBgRElTQ09OTkVDVF9ORVRfRElTQUJMRV9FUlJPUmAgVW5hYmxlIHRvIGNvbm5lY3QgYmFzZWQgb24gZ2VuZXJhdGVkIHdpZmkgY29uZmlnXG4gKiAgLSBgRElTQ09OTkVDVF9ORVRfSURfTk9UX0ZPVU5EYCBVbmFibGUgdG8gZGV0ZXJtaW5lIG5ldHdvcmsgSUQgdG8gZGlzY29ubmVjdC9yZW1vdmUgKGZyb20gcGFzc2VkIFNTSUQpXG4gKiAgLSBgRVJST1JfRElTQ09OTkVDVGAgLSBBbmRyb2lkIGVycm9yIGRpc2Nvbm5lY3Rpbmcgd2lmaSAob25seSB3aGVuIFNTSUQgaXMgbm90IHBhc3NlZClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZm9ybWF0V2lmaUNvbmZpZyhzc2lkLCBwYXNzd29yZCwgYWxnb3JpdGhtLCBpc0hpZGRlblNTSUQpXG4gKiAgYGBgXG4gKiAgLSBgYWxnb3JpdGhtYCBhbmQgYHBhc3N3b3JkYCBpcyBub3QgcmVxdWlyZWQgaWYgY29ubmVjdGluZyB0byBhbiBvcGVuIG5ldHdvcmtcbiAqICAtIEN1cnJlbnRseSBgV1BBYCBhbmQgYFdFUGAgYXJlIG9ubHkgc3VwcG9ydGVkIGFsZ29yaXRobXNcbiAqICAtIEZvciBgV1BBMmAganVzdCBwYXNzIGBXUEFgIGFzIHRoZSBhbGdvcml0aG1cbiAqICAtIFNldCBgaXNIaWRkZW5TU0lEYCB0byBgdHJ1ZWAgaWYgdGhlIG5ldHdvcmsgeW91J3JlIGNvbm5lY3RpbmcgdG8gaXMgaGlkZGVuXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZm9ybWF0V1BBQ29uZmlnKHNzaWQsIHBhc3N3b3JkLCBpc0hpZGRlblNTSUQpXG4gKiAgYGBgXG4gKiAgLSBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgbWV0aG9kIHRoYXQgY2FsbHMgYFdpZmlXaXphcmQyLmZvcm1hdFdpZmlDb25maWcoIHNzaWQsIHBhc3N3b3JkLCAnV1BBJywgaXNIaWRkZW5TU0lEICk7YFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5hZGQod2lmaSlcbiAqICBgYGBcbiAqICAtIGB3aWZpYCBtdXN0IGJlIGFuIG9iamVjdCBmb3JtYXR0ZWQgYnkgYGZvcm1hdFdpZmlDb25maWdgLCB0aGlzICoqbXVzdCoqIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgYGVuYWJsZWBcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgQVVUSF9UWVBFX05PVF9TVVBQT1JURURgIC0gSW52YWxpZCBhdXRoIHR5cGUgc3BlY2lmaWVkXG4gKiAgLSBgRVJST1JfQURESU5HX05FVFdPUktgIC0gQW5kcm9pZCByZXR1cm5lZCBgLTFgIHNwZWNpZnlpbmcgZXJyb3IgYWRkaW5nIG5ldHdvcmtcbiAqICAtIGBFUlJPUl9VUERBVElOR19ORVRXT1JLYCAtIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBhbiBleGlzdGluZyBuZXR3b3JrIElEIHdhcyBmb3VuZCwgYW5kIHVuYWJsZSB0byB1cGRhdGUgaXRcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVtb3ZlKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIFBsZWFzZSBub3RlLCBtb3N0IG5ld2VyIHZlcnNpb25zIG9mIEFuZHJvaWQgd2lsbCBvbmx5IGFsbG93IHdpZmkgdG8gYmUgcmVtb3ZlZCBpZiBjcmVhdGVkIGJ5IHlvdXIgYXBwbGljYXRpb25cbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgVU5BQkxFX1RPX1JFTU9WRWAgQW5kcm9pZCByZXR1cm5lZCBmYWlsdXJlIGluIHJlbW92aW5nIG5ldHdvcmtcbiAqICAtIGBSRU1PVkVfTkVUV09SS19OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCBmcm9tIHBhc3NlZCBTU0lEXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5saXN0TmV0d29ya3MoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5zY2FuKFtvcHRpb25zXSlcbiAqICBgYGBcbiAqICAtIFNhbWUgYXMgY2FsbGluZyBgc3RhcnRTY2FuYCBhbmQgdGhlbiBgZ2V0U2NhblJlc3VsdHNgLCBleGNlcHQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJlc29sdmUgdGhlIHByb21pc2UgYWZ0ZXIgdGhlIHNjYW4gY29tcGxldGVzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzLlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5zdGFydFNjYW4oKVxuICogIGBgYFxuICogIC0gSXQgaXMgcmVjb21tZW5kZWQgdG8ganVzdCB1c2UgdGhlIGBzY2FuYCBtZXRob2QgaW5zdGVhZCBvZiBgc3RhcnRTY2FuYFxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBTVEFSVFNDQU5fRkFJTEVEYCBBbmRyb2lkIHJldHVybmVkIGZhaWx1cmUgaW4gc3RhcnRpbmcgc2NhblxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZ2V0U2NhblJlc3VsdHMoW29wdGlvbnNdKVxuICogIGBgYFxuICogIC0gYGdldFNjYW5SZXN1bHRzYCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgY2FsbGluZyBgc3RhcnRTY2FuYCAoaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBzY2FuYCBpbnN0ZWFkIGFzIHRoaXMgc3RhcnRzIHRoZSBzY2FuLCB0aGVuIHJldHVybnMgdGhlIHJlc3VsdHMpXG4gKiAgLSBgW29wdGlvbnNdYCBpcyBvcHRpb25hbCwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNwZWNpZnksIGp1c3QgcGFzcyBgc3VjY2Vzc2AgY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyLCBhbmQgYGZhaWxgIGNhbGxiYWNrIGFzIHNlY29uZCBwYXJhbWV0ZXJcbiAqICAtIFJldHJpZXZlcyBhIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBuZXR3b3JrcyBhcyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCBwYXNzZXMgdGhlbSB0byB0aGUgZnVuY3Rpb24gbGlzdEhhbmRsZXIuIFRoZSBmb3JtYXQgb2YgdGhlIGFycmF5IGlzOlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICBuZXR3b3JrcyA9IFtcbiAqICB7ICAgXCJsZXZlbFwiOiBzaWduYWxfbGV2ZWwsIC8vIHJhdyBSU1NJIHZhbHVlXG4gKiAgICAgICAgIFwiU1NJRFwiOiBzc2lkLCAvLyBTU0lEIGFzIHN0cmluZywgd2l0aCBlc2NhcGVkIGRvdWJsZSBxdW90ZXM6IFwiXFxcInNzaWQgbmFtZVxcXCJcIlxuICogICAgICAgICBcIkJTU0lEXCI6IGJzc2lkIC8vIE1BQyBhZGRyZXNzIG9mIFdpRmkgcm91dGVyIGFzIHN0cmluZ1xuICogICAgICAgICBcImZyZXF1ZW5jeVwiOiBmcmVxdWVuY3kgb2YgdGhlIGFjY2VzcyBwb2ludCBjaGFubmVsIGluIE1IelxuICogICAgICAgICBcImNhcGFiaWxpdGllc1wiOiBjYXBhYmlsaXRpZXMgLy8gRGVzY3JpYmVzIHRoZSBhdXRoZW50aWNhdGlvbiwga2V5IG1hbmFnZW1lbnQsIGFuZCBlbmNyeXB0aW9uIHNjaGVtZXMgc3VwcG9ydGVkIGJ5IHRoZSBhY2Nlc3MgcG9pbnQuXG4gKiAgICAgICAgIFwidGltZXN0YW1wXCI6IHRpbWVzdGFtcCAvLyB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgc2NhbiB3YXMgY29tcGxldGVkXG4gKiAgICAgICAgIFwiY2hhbm5lbFdpZHRoXCI6XG4gKiAgICAgICAgIFwiY2VudGVyRnJlcTBcIjpcbiAqICAgICAgICAgXCJjZW50ZXJGcmVxMVwiOlxuICogICAgIH1cbiAqICBdXG4gKiAgYGBgXG4gKiAgLSBgY2hhbm5lbFdpZHRoYCBgY2VudGVyRnJlcTBgIGFuZCBgY2VudGVyRnJlcTFgIGFyZSBvbmx5IHN1cHBvcnRlZCBvbiBBUEkgPiAyMyAoTWFyc2htYWxsb3cpLCBhbnkgb2xkZXIgQVBJIHdpbGwgcmV0dXJuIG51bGwgZm9yIHRoZXNlIHZhbHVlc1xuICpcbiAqICBBbiBvcHRpb25zIG9iamVjdCBtYXkgYmUgcGFzc2VkLiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb24gaXMgYG51bUxldmVsc2AsIGFuZCBpdCBoYXMgdGhlIGZvbGxvd2luZyBiZWhhdmlvcjpcbiAqXG4gKiAgLSBpZiBgKG4gPT0gdHJ1ZSB8fCBuIDwgMilgLCBgKi5nZXRTY2FuUmVzdWx0cyh7bnVtTGV2ZWxzOiBufSlgIHdpbGwgcmV0dXJuIGRhdGEgYXMgYmVmb3JlLCBzcGxpdCBpbiA1IGxldmVscztcbiAqICAtIGlmIGAobiA+IDEpYCwgYCouZ2V0U2NhblJlc3VsdHMoe251bUxldmVsczogbn0pYCB3aWxsIGNhbGN1bGF0ZSB0aGUgc2lnbmFsIGxldmVsLCBzcGxpdCBpbiBuIGxldmVscztcbiAqICAtIGlmIGAobiA9PSBmYWxzZSlgLCBgKi5nZXRTY2FuUmVzdWx0cyh7bnVtTGV2ZWxzOiBufSlgIHdpbGwgdXNlIHRoZSByYXcgc2lnbmFsIGxldmVsO1xuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5pc1dpZmlFbmFibGVkKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgYm9vbGVhbiB2YWx1ZSBvZiB3aGV0aGVyIFdpZmkgaXMgZW5hYmxlZCBvciBub3RcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5zZXRXaWZpRW5hYmxlZChlbmFibGVkKVxuICogIGBgYFxuICogIC0gUGFzcyBgdHJ1ZWAgZm9yIGBlbmFibGVkYCBwYXJhbWV0ZXIgdG8gc2V0IFdpZmkgZW5hYmxlZFxuICogIC0gWW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZXQgV2lGaSBlbmFibGVkIHRvIGNhbGwgb3RoZXIgbWV0aG9kcyB0aGF0IHJlcXVpcmUgd2lmaSBlbmFibGVkLiAgVGhpcyBwbHVnaW4gd2lsbCBhdXRvbWFnaWNhbGx5IGVuYWJsZSBXaUZpIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IHJlcXVpcmVzIFdpRmkgdG8gYmUgZW5hYmxlZC5cbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfU0VUV0lGSUVOQUJMRURgIHdpZmkgc3RhdGUgZG9lcyBub3QgbWF0Y2ggY2FsbCAoZW5hYmxlIG9yIGRpc2FibGUpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZE5ldHdvcmtJRCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBJRCBpbiBzdWNjZXNzIGNhbGxiYWNrIChvbmx5IGlmIGNvbm5lY3RlZCksIG90aGVyd2lzZSBmYWlsIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYEdFVF9DT05ORUNURURfTkVUX0lEX0VSUk9SYCBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBJRCAobWF5IG5vdCBiZSBjb25uZWN0ZWQpXG4gKlxuICogICMjIE5ldyB0byAzLjEuMStcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZXNldEJpbmRBbGwoKVxuICogIGBgYFxuICogIC0gRGlzYWJsZSBiaW5kQWxsIHRvIFdpRmkgbmV0d29yayB3aXRob3V0IGRpc2Nvbm5lY3RpbmcgZnJvbSBXaUZpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnNldEJpbmRBbGwoKVxuICogIGBgYFxuICogIC0gRW5hYmxlIGJpbmRBbGwgdG8gV2lGaSBuZXR3b3JrIHdpdGhvdXQgZGlzY29ubmVjdGluZyBmcm9tIFdpRmlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuQ29ubmVjdFRvSW50ZXJuZXQoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gY29ubmVjdCB0byBodHRwczovL3d3dy5nb29nbGUuY29tIHZpYSBIVFRQIGNvbm5lY3Rpb24gKHNpbmNlIHBpbmcgaXMgdW5yZWxpYWJsZSlcbiAqICAtIFVua25vd24gZXJyb3JzIHdpbGwgc3RpbGwgYmUgdGhyb3duIGxpa2UgYWxsIG90aGVyIGFzeW5jIGZ1bmN0aW9uc1xuICogIC0gSWYgeW91IGNhbGxlZCBgY29ubmVjdGAgb3IgYGVuYWJsZWAgYW5kIHBhc3NlZCBgdHJ1ZWAgZm9yIGBiaW5kQWxsYCwgeW91ciBhcHBsaWNhdGlvbiB3aWxsIGZvcmNlIHRoZSBwaW5nIHRocm91Z2ggd2lmaSBjb25uZWN0aW9uLlxuICogIC0gSWYgeW91IGRpZCBub3QgcGFzcyBgdHJ1ZWAgKG9yIHBhc3NlZCBgZmFsc2VgKSBmb3IgYGJpbmRBbGxgLCBhbmQgdGhlIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uLCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgd2lsbCB1c2UgY2VsbCBjb25uZWN0aW9uIHRvIHBpbmcgKGR1ZSB0byBBbmRyb2lkIHVzaW5nIGNlbGwgY29ubmVjdGlvbiB3aGVuIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCkgW01vcmUgRGV0YWlsc10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuQ29ubmVjdFRvUm91dGVyKClcbiAqICBgYGBcbiAqICAtIEFzIGBjYW5QaW5nV2lmaVJvdXRlcmAgaXMgbm90b3Jpb3VzbHkgdW5yZWxpYWJsZSwgdGhpcyBtZXRob2QgdXNlcyBIVFRQIGNvbm5lY3Rpb24gdG8gdGVzdCBpZiBhYmxlIHRvIGNvbm5lY3QgdG8gcm91dGVyIChhcyBtb3N0IHJvdXRlcnMgc2hvdWxkIGhhdmUgd2ViIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgODApXG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgQW5kcm9pZCBhcHAgaXMgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBwcml2YXRlIG5ldHdvcmsgYWZ0ZXIgY29ubmVjdGluZyB0byBXaUZpXG4gKiAgLSBUaGlzIHdhcyBhZGRlZCBmb3IgdGVzdGluZyB0aGUgYGJpbmRBbGxgIGZlYXR1cmUgdG8gc3VwcG9ydCBpc3N1ZXMgd2l0aCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgbm90IHJvdXRpbmcgY2FsbHMgdGhyb3VnaCBXaUZpIGlmIFdpRmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uIFtTZWUgQW5kcm9pZCBCbG9nXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKiAgLSBBdHRlbXB0cyB0byBjb25uZWN0IHJvdXRlciBJUCBIVFRQIHNlcnZlciBvbiBwb3J0IDgwIChleGFtcGxlOiBgaHR0cDovLzE5Mi4xNjguMC4xL2Agd2hlcmUgYDE5Mi4xNjguMC4xYCBpcyB0aGUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBJUCBhZGRyZXNzKVxuICpcbiAqICAjIyBOZXcgdG8gMy4wLjArXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuaXNDb25uZWN0ZWRUb0ludGVybmV0KClcbiAqICBgYGBcbiAqXG4gKiAgLSBSZXR1cm5zIGJvb2xlYW4sIHRydWUgb3IgZmFsc2UsIGlmIGRldmljZSBpcyBhYmxlIHRvIHBpbmcgOC44LjguOFxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBJZiB5b3UgY2FsbGVkIGBjb25uZWN0YCBvciBgZW5hYmxlYCBhbmQgcGFzc2VkIGB0cnVlYCBmb3IgYGJpbmRBbGxgLCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZm9yY2UgdGhlIHBpbmcgdGhyb3VnaCB3aWZpIGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgZGlkIG5vdCBwYXNzIGB0cnVlYCAob3IgcGFzc2VkIGBmYWxzZWApIGZvciBgYmluZEFsbGAsIGFuZCB0aGUgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24sIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIHVzZSBjZWxsIGNvbm5lY3Rpb24gdG8gcGluZyAoZHVlIHRvIEFuZHJvaWQgdXNpbmcgY2VsbCBjb25uZWN0aW9uIHdoZW4gd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0KSBbTW9yZSBEZXRhaWxzXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmNhblBpbmdXaWZpUm91dGVyKClcbiAqICBgYGBcbiAqXG4gKiAgLSBSZXR1cm5zIGJvb2xlYW4sIHRydWUgb3IgZmFsc2UsIGlmIGRldmljZSBpcyBhYmxlIHRvIHBpbmcgdGhlIGNvbm5lY3RlZCBXaUZpIHJvdXRlciBJUCAob2J0YWluZWQgZnJvbSBESENQIGluZm8pXG4gKiAgLSBWZXJzaW9uIDMuMS4xKyB1c2VzIEhUVFAgY29ubmVjdGlvbiB0byB0ZXN0IGlmIGFibGUgdG8gY29ubmVjdCB0byByb3V0ZXIgKGFzIHBpbmcgcHJldmlvdXMgZGlkIG5vdCB3b3JrKVxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIEFuZHJvaWQgYXBwIGlzIGFibGUgdG8gY29ubmVjdCB0byB0aGUgcHJpdmF0ZSBuZXR3b3JrIGFmdGVyIGNvbm5lY3RpbmcgdG8gV2lGaVxuICogIC0gVGhpcyB3YXMgYWRkZWQgZm9yIHRlc3RpbmcgdGhlIGBiaW5kQWxsYCBmZWF0dXJlIHRvIHN1cHBvcnQgaXNzdWVzIHdpdGggQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIG5vdCByb3V0aW5nIGNhbGxzIHRocm91Z2ggV2lGaSBpZiBXaUZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgY29ubmVjdGlvbiBbU2VlIEFuZHJvaWQgQmxvZ10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5lbmFibGVXaWZpKClcbiAqICBgYGBcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZGlzYWJsZVdpZmkoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpSVAoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBJUHY0IGFkZHJlc3Mgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBXaUZpLCBvciByZWplY3RzIHByb21pc2UgaWYgSVAgbm90IGZvdW5kIG9yIHdpZmkgbm90IGNvbm5lY3RlZFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpUm91dGVySVAoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBJUHY0IFdpRmkgcm91dGVyIElQIGZyb20gY3VycmVudGx5IGNvbm5lY3RlZCBXaUZpLCBvciByZWplY3RzIHByb21pc2UgaWYgdW5hYmxlIHRvIGRldGVybWluZSwgb3Igd2lmaSBub3QgY29ubmVjdGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYE5PX1ZBTElEX0lQX0lERU5USUZJRURgIGlmIHVuYWJsZSB0byBkZXRlcm1pbmUgYSB2YWxpZCBJUCAoaXAgcmV0dXJuZWQgZnJvbSBkZXZpY2UgaXMgYDAuMC4wLjBgKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpSVBJbmZvKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgYSBKU09OIG9iamVjdCB3aXRoIElQdjQgYWRkcmVzcyBhbmQgc3VibmV0IGB7XCJpcFwiOiBcIjE5Mi4xNjguMS4yXCIsIFwic3VibmV0XCI6IFwiMjU1LjI1NS4yNTUuMFwiIH1gIG9yIHJlamVjdGVkIHByb21pc2UgaWYgbm90IGZvdW5kIG9yIG5vdCBjb25uZWN0ZWRcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBOT19WQUxJRF9JUF9JREVOVElGSUVEYCBpZiB1bmFibGUgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSVAgKGlwIHJldHVybmVkIGZyb20gZGV2aWNlIGlzIGAwLjAuMC4wYClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVjb25uZWN0KClcbiAqICBgYGBcbiAqICAtIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsICoqaWYgd2UgYXJlIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQuKipcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfUkVDT05ORUNUYCBBbmRyb2lkIHJldHVybmVkIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlYXNzb2NpYXRlKClcbiAqICBgYGBcbiAqICAtIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsICoqZXZlbiBpZiB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQuKipcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfUkVBU1NPQ0lBVEVgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZWFzc29jaWF0aW5nXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRTU0lETmV0d29ya0lEKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBHZXQgQW5kcm9pZCBOZXR3b3JrIElEIGZyb20gcGFzc2VkIFNTSURcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZGlzYWJsZShzc2lkKVxuICogIGBgYFxuICogIC0gYHNzaWRgIGNhbiBlaXRoZXIgYmUgYW4gU1NJRCAoc3RyaW5nKSBvciBhIG5ldHdvcmsgSUQgKGludGVnZXIpXG4gKiAgLSBEaXNhYmxlIHRoZSBwYXNzZWQgU1NJRCBuZXR3b3JrXG4gKiAgLSBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCB3aWxsIG9ubHkgYWxsb3cgeW91IHRvIGRpc2FibGUgbmV0d29ya3MgY3JlYXRlZCBieSB5b3VyIGFwcGxpY2F0aW9uXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFVOQUJMRV9UT19ESVNBQkxFYCBBbmRyb2lkIHJldHVybmVkIGZhaWx1cmUgaW4gZGlzYWJsaW5nIG5ldHdvcmtcbiAqICAtIGBESVNBQkxFX05FVFdPUktfTk9UX0ZPVU5EYCBVbmFibGUgdG8gZGV0ZXJtaW5lIG5ldHdvcmsgSUQgZnJvbSBwYXNzZWQgU1NJRCB0byBkaXNhYmxlXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZXF1ZXN0UGVybWlzc2lvbigpXG4gKiAgYGBgXG4gKiAgLSBSZXF1ZXN0IGBBQ0NFU1NfRklORV9MT0NBVElPTmAgcGVybXNzaW9uXG4gKiAgLSBUaGlzIEFuZHJvaWQgcGVybWlzc2lvbiBpcyByZXF1aXJlZCB0byBydW4gYHNjYW5gLCBgc3RhcnRTdGFydGAgYW5kIGBnZXRTY2FuUmVzdWx0c2BcbiAqICAtIFlvdSBjYW4gcmVxdWVzdCBwZXJtaXNzaW9uIGJ5IHJ1bm5pbmcgdGhpcyBmdW5jdGlvbiBtYW51YWxseSwgb3IgV2lmaVdpemFyZDIgd2lsbCBhdXRvbWFnaWNhbGx5IHJlcXVlc3QgcGVybWlzc2lvbiB3aGVuIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIGlzIGNhbGxlZFxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBQRVJNSVNTSU9OX0RFTklFRGAgdXNlciBkZW5pZWQgcGVybWlzc2lvbiBvbiBkZXZpY2VcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmVuYWJsZShzc2lkLCBiaW5kQWxsLCB3YWl0Rm9yQ29ubmVjdGlvbilcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBjYW4gZWl0aGVyIGJlIGFuIFNTSUQgKHN0cmluZykgb3IgYSBuZXR3b3JrIElEIChpbnRlZ2VyKVxuICogIC0gYGJpbmRBbGxgIHNob3VsZCBiZSBzZXQgdG8gYHRydWVgIHRvIHRlbGwgQW5kcm9pZCB0byByb3V0ZSBhbGwgY29ubmVjdGlvbnMgZnJvbSB5b3VyIEFuZHJvaWQgYXBwLCB0aHJvdWdoIHRoZSB3aWZpIGNvbm5lY3Rpb25cbiAqICAtIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIG5vdCByb3V0ZSBjb25uZWN0aW9ucyB0byB0aGUgV2lGaSBkZXZpY2UgaWYgaXQgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uLiAgUGFzc2luZyBgdHJ1ZWAgdG8gYGJpbmRBbGxgIHdpbGwgZm9yY2UgQW5kcm9pZCB0byByb3V0ZSBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAgdGhyb3VnaCBXaWZpLCByZWdhcmRsZXNzIG9mIGludGVybmV0IGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyBjb25uZWN0aW5nIHRvIGEgbG9jYWwgSVAgdGhyb3VnaCBXaUZpIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCwgdHJ5IGVuYWJsaW5nIGBiaW5kQWxsYCBhbmQgdGhpcyBzaG91bGQgZml4IHRoZSBwcm9ibGVtLlxuICogIC0gRHVyaW5nIG15IHRlc3RpbmcsIHNvbWUgdmVyc2lvbnMgb2YgQW5kcm9pZCAoNS4wIC0gNy4xLjIpIHdvdWxkIHN0aWxsIHJvdXRlIGNvbm5lY3Rpb25zIHRocm91Z2ggV2lGaSB3aXRob3V0IGludGVybmV0LCBidXQgaXQgd2FzIHJhbmRvbSB0aGF0IHNvbWUgdmVyc2lvbnMgd291bGQgYW5kIHdvdWxkIG5vdCB3b3JrLlxuICogIC0gVGVzdGluZyBBbmRyb2lkIE9yZW8rICg4LjAuMCspIGlmIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCwgMTAwJSBvZiB0aGUgdGltZSBpdCB3b3VsZCBOT1Qgcm91dGUgY29ubmVjdGlvbnMgdGhyb3VnaCBXaUZpLCBzbyB5b3UgKm11c3QqIGVuYWJsZSB0aGlzIGZvciBPcmVvIG9yIG5ld2VyIHRvIHJvdXRlIGNvbm5lY3Rpb25zIGZyb20geW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIHdpZmkgd2l0aG91dCBpbnRlcm5ldC5cbiAqICAtIFdoZW4gYGJpbmRBbGxgIGlzIGVuYWJsZWQsICpBTEwqIGNvbm5lY3Rpb25zIGZyb20geW91ciBhcHAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCBXaUZpLCB1bnRpbCB5b3UgY2FsbCBgZGlzY29ubmVjdGAgb3IgYGRpc2FibGVgXG4gKiAgLSBTZWUgdGhlIEdvb2dsZSBBbmRyb2lkIEJsb2cgZm9yIFtNb3JlIERldGFpbHNdKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqICAtIFRoaXMgZmVhdHVyZSAqT05MWSogd29ya3MgZm9yIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSwgaWYgZGV2aWNlIGlzIHJ1bm5pbmcgQVBJIG9sZGVyIHRoYW4gMjEsIGBiaW5kYWxsYCB3aWxsIGJlIGlnbm9yZWQgKGFzIEFQSSBvbGRlciB0aGFuIDIxIGRvZXMgdGhpcyBieSBkZWZhdWx0KVxuICogIC0gRW5hYmxlIHRoZSBwYXNzZWQgU1NJRCBuZXR3b3JrXG4gKiAgLSBZb3UgKipNVVNUKiogY2FsbCBgV2lmaVdpemFyZDIuYWRkKHdpZmkpYCBiZWZvcmUgY2FsbGluZyBgZW5hYmxlYCBhcyB0aGUgd2lmaSBjb25maWd1cmF0aW9uIG11c3QgZXhpc3QgYmVmb3JlIHlvdSBjYW4gZW5hYmxlIGl0IChvciBwcmV2aW91c2x5IHVzZWQgYGNvbm5lY3RgIHdpdGhvdXQgY2FsbGluZyBgZGlzY29ubmVjdGApXG4gKiAgLSBUaGlzIG1ldGhvZCBkb2VzIE5PVCB3YWl0IG9yIHZlcmlmeSBjb25uZWN0aW9uIHRvIHdpZmkgbmV0d29yaywgcGFzcyBgdHJ1ZWAgdG8gYHdhaXRGb3JDb25uZWN0aW9uYCB0byBvbmx5IHJldHVybiBwcm9taXNlIG9uY2UgY29ubmVjdGlvbiBpcyB2ZXJpZmllZCBpbiBDT01QTEVURUQgc3RhdGUgdG8gc3BlY2lmaWMgYHNzaWRgXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIGBVTkFCTEVfVE9fRU5BQkxFYCAtIEFuZHJvaWQgcmV0dXJuZWQgYC0xYCBzaWduaWZ5aW5nIGZhaWx1cmUgZW5hYmxpbmdcbiAqXG4gKiAgIyBJbnN0YWxsYXRpb25cbiAqXG4gKiAgIyMgTWFzdGVyXG4gKlxuICogIFJ1biBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L3dpZml3aXphcmQyYGBgXG4gKlxuICogIFRvIGluc3RhbGwgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaCAobGF0ZXN0IG9uIEdpdEh1YilcbiAqXG4gKiAgVG8gaW5zdGFsbCBhIHNwZWNpZmljIGJyYW5jaCAoYWRkIGAjdGFnYCByZXBsYWNpbmcgYHRhZ2Agd2l0aCB0YWcgZnJvbSB0aGlzIHJlcG8sIGV4YW1wbGU6XG4gKiAgYGBgY29yZG92YSBwbHVnaW4gYWRkIGh0dHBzOi8vZ2l0aHViLmNvbS90cmlwZmxleC93aWZpd2l6YXJkMiN2My4xLjFgYGBcbiAqXG4gKiAgRmluZCBhdmFpbGFibGUgdGFncyBoZXJlOlxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS90cmlwZmxleC9XaWZpV2l6YXJkMi90YWdzXG4gKlxuICpcbiAqICBJZiB5b3UgYXJlIHdhbnRpbmcgdG8gaGF2ZSB0aGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBzdGFibGUgdmVyc2lvbiwgdGhlbiBydW4gdGhlICdSZWxlYXNlcycgY29tbWFuZCBiZWxvdy5cbiAqXG4gKiAgIyMgUmVsZWFzZXNcbiAqICBSdW4gYGBgY29yZG92YSBwbHVnaW4gYWRkIGNvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyYGBgXG4gKlxuICogICMjIE1ldGVvclxuICogIFRvIGluc3RhbGwgYW5kIHVzZSB0aGlzIHBsdWdpbiBpbiBhIE1ldGVvciBwcm9qZWN0LCB5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBleGFjdCB2ZXJzaW9uIGZyb20gTlBNIHJlcG9zaXRvcnk6XG4gKiAgW2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jb3Jkb3ZhLXBsdWdpbi13aWZpd2l6YXJkMilcbiAqXG4gKiAgQXMgb2YgQXByaWwgNHRoIDIwMTksIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyAzLjEuMTpcbiAqXG4gKiAgYGBgbWV0ZW9yIGFkZCBjb3Jkb3ZhOmNvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyQDMuMS4xYGBgXG4gKlxuICogICMgRXJyb3JzL1JlamVjdGlvbnNcbiAqICBNZXRob2RzIG5vdyByZXR1cm4gZm9ybWF0dGVkIHN0cmluZyBlcnJvcnMgYXMgZGV0YWlsZWQgYmVsb3csIGluc3RlYWQgb2YgcmV0dXJuaW5nIGdlbmVyaWMgZXJyb3IgbWVzc2FnZXMuICBUaGlzIGFsbG93cyB5b3UgdG8gY2hlY2sgeW91cnNlbGYgd2hhdCBzcGVjaWZpYyBlcnJvciB3YXMgcmV0dXJuZWQsIGFuZCBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAgSW4gYW4gdXBjb21pbmcgcmVsZWFzZSBJIG1heSBhZGQgZWFzeSB3YXlzIHRvIG92ZXJyaWRlIGdlbmVyaWMgbWVzc2FnZXMsIG9yIHNldCB5b3VyIG93biwgYnV0IGZvciBub3csIGVycm9ycyByZXR1cm5lZCBjYW4gYmUgZm91bmQgYmVsb3cgZWFjaCBtZXRob2QvZnVuY3Rpb24uXG4gKlxuICogICMjIEdlbmVyaWMgKipUaHJvd24gRXJyb3JzKipcbiAqICBgV0lGSV9OT1RfRU5BQkxFRGBcbiAqICBgYGBcbiAqL1xuQFBsdWdpbih7XG4gIHBsdWdpbk5hbWU6ICdXaWZpV2l6YXJkMicsXG4gIHBsdWdpbjogJ2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyJyxcbiAgcGx1Z2luUmVmOiAnV2lmaVdpemFyZDInLFxuICByZXBvOiAnaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L1dpZmlXaXphcmQyJyxcbiAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10sXG59KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdpZmlXaXphcmQyIGV4dGVuZHMgQXdlc29tZUNvcmRvdmFOYXRpdmVQbHVnaW4ge1xuICAvKipcbiAgICogQ29ubmVjdCB0byBuZXR3b3JrIG9uIGlPUyBkZXZpY2VcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHBhcmFtIHNzaWRQYXNzd29yZCAgICAgIFBhc3N3b3JkIGlmIGNvbm5lY3RpbmcgdG8gV1BBL1dQQTIgbmV0d29yayAob21pdCBvciB1c2UgZmFsc2UgdG8gY29ubmVjdCB0byBvcGVuIG5ldHdvcmspXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnaU9TJ10sXG4gIH0pXG4gIGlPU0Nvbm5lY3ROZXR3b3JrKHNzaWQ6IHN0cmluZywgc3NpZFBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IGZyb20gU1NJRCBvbiBpT1MgZGV2aWNlXG4gICAqIEBwYXJhbSBzc2lkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnaU9TJ10sXG4gIH0pXG4gIGlPU0Rpc2Nvbm5lY3ROZXR3b3JrKHNzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB3aWZpIG5ldHdvcmsgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gd2lmaUNvbmZpZyAgTXVzdCBiZSBvYmplY3QgY3JlYXRlZCBieSBmb3JtYXRXaWZpQ29uZmlnKClcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGFkZCh3aWZpQ29uZmlnOiBXaWZpQ29uZmlnKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHdpZmkgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZW1vdmUoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBuZXR3b3JrIHdpdGggc3BlY2lmaWVkIFNTSURcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBhZGQgdGhlIHdpZmkgY29uZmlndXJhdGlvbiwgdGhlbiBlbmFibGUgdGhlIG5ldHdvcmssIHJldHVybmluZyBwcm9taXNlIHdoZW4gY29ubmVjdGlvbiBpcyB2ZXJpZmllZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYmluZEFsbD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0byBiaW5kIGFsbCBjb25uZWN0aW9ucyBmcm9tIGFwcCwgdGhyb3VnaCBXaUZpIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzd29yZD1dXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxnb3JpdGhtPU5PTkVdIC0gV1BBLCBXUEEgKGZvciBXUEEyKSwgV0VQIG9yIE5PTkUgKE5PTkUgYnkgZGVmYXVsdClcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgY29ubmVjdChzc2lkOiBzdHJpbmcgfCBudW1iZXIsIGJpbmRBbGw/OiBib29sZWFuLCBwYXNzd29yZD86IHN0cmluZywgYWxnb3JpdGhtPzogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdCAoY3VycmVudCBpZiBTU0lEIG5vdCBzdXBwbGllZClcbiAgICpcbiAgICogVGhpcyBtZXRob2QsIGlmIHBhc3NlZCBhbiBTU0lELCB3aWxsIGZpcnN0IGRpc2FibGUgdGhlIG5ldHdvcmssIGFuZCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBkZXZpY2UuICBUbyBvbmx5IFwiZGlzY29ubmVjdFwiIChpZSBkaXNhYmxlIGluIGFuZHJvaWQpLFxuICAgKiBjYWxsIFdpZmlXaXphcmQyLmRpc2FibGUoKSBpbnN0ZWFkIG9mIGRpc2Nvbm5lY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWQ9YWxsXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBkaXNjb25uZWN0KHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBOZXR3b3JrXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JpbmRBbGw9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdG8gYmluZCBhbGwgbmV0d29yayByZXF1ZXN0cyB0byB0aGlzIHdpZmkgbmV0d29ya1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3YWl0Rm9yQ29ubmVjdGlvbj1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0byB3YWl0IGJlZm9yZSByZXNvbHZpbmcgcHJvbWlzZSB1bnRpbCBjb25uZWN0aW9uIHRvIHdpZmkgaXMgdmVyaWZpZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZW5hYmxlKHNzaWQ6IHN0cmluZyB8IG51bWJlciwgYmluZEFsbD86IGJvb2xlYW4sIHdhaXRGb3JDb25uZWN0aW9uPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgTmV0d29ya1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBkaXNhYmxlKHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsIGV2ZW4gaWYgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICByZWFzc29jaWF0ZSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3QgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgYWNjZXNzIHBvaW50LCBpZiB3ZSBhcmUgY3VycmVudGx5IGRpc2Nvbm5lY3RlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgcmVjb25uZWN0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudGx5IGNvbmZpZ3VyZWQgbmV0d29ya3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGxpc3ROZXR3b3JrcygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBuZXR3b3JrIHNjYW4gYW5kIHJldHVybiByZXN1bHRzXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzY2FuKG9wdGlvbnM/OiBXaWZpU2Nhbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB3aWZpIG5ldHdvcmsgc2NhbiAocmVzdWx0cyBjYW4gYmUgcmV0cmlldmVkIHdpdGggZ2V0U2NhblJlc3VsdHMpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzdGFydFNjYW4oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdpZmkgc2NhbiByZXN1bHRzIChtdXN0IGNhbGwgc3RhcnRTY2FuIGZpcnN0LCBvciBqdXN0IHVzZSBzY2FuKCkpXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRTY2FuUmVzdWx0cyhvcHRpb25zOiBXaWZpU2NhblJlc3VsdHNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgV2lGaSBpcyBlbmFibGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBpc1dpZmlFbmFibGVkKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBEaXNhYmxlIFdpRmlcbiAgICogQHBhcmFtIGVuYWJsZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgc2V0V2lmaUVuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBXaUZpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGVuYWJsZVdpZmkoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBXaUZpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGRpc2FibGVXaWZpKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBOZXR3b3JrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZXNldEJpbmRBbGwoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQmluZCBOZXR3b3JrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBzZXRCaW5kQWxsKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBXaWZpIFJvdXRlciBJUCBmcm9tIERIQ1BcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFdpZmlSb3V0ZXJJUCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgV2lmaSBJUFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0V2lmaUlQKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBXaWZpIElQIGFuZCBTdWJuZXQgQWRkcmVzc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgSlNPTiBvYmplY3Qgc2ltaWxhciB0bzogeyBcImlwXCI6IFwiMC4wLjAuMFwiLCBcInN1Ym5ldFwiOiBcIjAuMC4wLjBcIiB9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRXaWZpSVBJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBOZXR3b3JrIElEIGZyb20gU1NJRFxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0U1NJRE5ldHdvcmtJRChzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIElEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWROZXR3b3JrSUQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBTU0lEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWRTU0lEKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsgQlNTSUQvTUFDXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRDb25uZWN0ZWRCU1NJRCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IFdpRmkgY29ubmVjdGlvbiBoYXMgY29ubmVjdGlvbiB0byB0aGUgaW50ZXJuZXRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGlzQ29ubmVjdGVkVG9JbnRlcm5ldCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSBjYW4gcGluZyBjdXJyZW50IFdpRmkgcm91dGVyIElQIGFkZHJlc3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGNhblBpbmdXaWZpUm91dGVyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0IHZpYSBIVFRQIGN1cnJlbnQgV2lGaSByb3V0ZXIgSVAgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgY2FuQ29ubmVjdFRvUm91dGVyKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgV2lGaSBjb25uZWN0aW9uIGNhbiBjb25uZWN0IHRvIGludGVybmV0IChjaGVja3MgY29ubmVjdGlvbiB0byBnb29nbGUuY29tKVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgY2FuQ29ubmVjdFRvSW50ZXJuZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBBQ0NFU1NfRklORV9MT0NBVElPTiBwZXJtaXNzaW9uXG4gICAqXG4gICAqIFRoaXMgcGVybWlzc2lvbiBpcyByZXF1aXJlZCBieSBBbmRyb2lkIHRvIHJldHVybiBzY2FuIHJlc3VsdHMsIHlvdSBjYW4gbWFudWFsbHkgcmVxdWVzdCBpdCBwcmlvciB0byBydW5uaW5nIGBzY2FuYFxuICAgKiBvciB0aGlzIHBsdWdpbiB3aWxsIGF1dG9tYXRpY2FsbHkgZG8gaXQgd2hlbiB0aGUgc2NhbiBpcyByYW4uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZXF1ZXN0UGVybWlzc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgV2lGaSBjb25maWd1cmF0aW9uIGZvciBBbmRyb2lkIERldmljZXNcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzd29yZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGdvcml0aG1dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSGlkZGVuU1NJRF1cbiAgICogQHJldHVybnMge1dpZmlDb25maWd8Ym9vbGVhbn1cbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIGZvcm1hdFdpZmlDb25maWcoXG4gICAgc3NpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgYWxnb3JpdGhtOiBzdHJpbmcsXG4gICAgaXNIaWRkZW5TU0lEOiBib29sZWFuXG4gICk6IFdpZmlDb25maWcgfCBib29sZWFuIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IFdQQSBXaUZpIGNvbmZpZ3VyYXRpb24gZm9yIEFuZHJvaWQgRGV2aWNlc1xuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmRcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0hpZGRlblNTSURcbiAgICogQHJldHVybnMge1dpZmlDb25maWd8Ym9vbGVhbn1cbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIGZvcm1hdFdQQUNvbmZpZyhzc2lkOiBzdHJpbmcgfCBudW1iZXIsIHBhc3N3b3JkOiBzdHJpbmcsIGlzSGlkZGVuU1NJRDogYm9vbGVhbik6IFdpZmlDb25maWcgfCBib29sZWFuIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IFdpRmkgU1NJRCBTdHJpbmdcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBAQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUoKVxuICBmb3JtYXRXaWZpU3RyaW5nKHNzaWQ6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIFNsZWVwL1RpbWVvdXQgYGF3YWl0IHRoaXMudGltZW91dCgpYFxuICAgKiBAcGFyYW0gZGVsYXkgIHRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IChkZWZhdWx0IDIgc2Vjb25kcylcbiAgICovXG4gIEBDb3Jkb3ZhRnVuY3Rpb25PdmVycmlkZSgpXG4gIHRpbWVvdXQoZGVsYXk/OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxufVxuIl19 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL3BsdWdpbnMvd2lmaS13aXphcmQtMi9uZ3gvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxnRUFBd0UsTUFBTSwrQkFBK0IsQ0FBQzs7SUFvYnBGLCtCQUEwQjs7OztJQVl6RCx1Q0FBaUIsYUFBQyxJQUFZLEVBQUUsWUFBb0I7SUFjcEQsMENBQW9CLGFBQUMsSUFBWTtJQWFqQyx5QkFBRyxhQUFDLFVBQXNCO0lBYTFCLDRCQUFNLGFBQUMsSUFBcUI7SUFvQjVCLDZCQUFPLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLFFBQWlCLEVBQUUsU0FBa0I7SUFpQnZGLGdDQUFVLGFBQUMsSUFBcUI7SUFnQmhDLDRCQUFNLGFBQUMsSUFBcUIsRUFBRSxPQUFpQixFQUFFLGlCQUEyQjtJQWM1RSw2QkFBTyxhQUFDLElBQXFCO0lBYTdCLGlDQUFXO0lBYVgsK0JBQVM7SUFZVCxrQ0FBWTtJQWFaLDBCQUFJLGFBQUMsT0FBeUI7SUFZOUIsK0JBQVM7SUFhVCxvQ0FBYyxhQUFDLE9BQStCO0lBWTlDLG1DQUFhO0lBY2Isb0NBQWMsYUFBQyxPQUFnQjtJQWEvQixnQ0FBVTtJQWFWLGlDQUFXO0lBWVgsa0NBQVk7SUFZWixnQ0FBVTtJQVlWLHFDQUFlO0lBWWYsK0JBQVM7SUFjVCxtQ0FBYTtJQWFiLHNDQUFnQixhQUFDLElBQXFCO0lBWXRDLDJDQUFxQjtJQVlyQixzQ0FBZ0I7SUFZaEIsdUNBQWlCO0lBWWpCLDJDQUFxQjtJQVlyQix1Q0FBaUI7SUFZakIsd0NBQWtCO0lBWWxCLDBDQUFvQjtJQWVwQix1Q0FBaUI7SUFjakIsc0NBQWdCLGFBQ2QsSUFBcUIsRUFDckIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsWUFBcUI7SUFjdkIscUNBQWUsYUFBQyxJQUFxQixFQUFFLFFBQWdCLEVBQUUsWUFBcUI7SUFXOUUsc0NBQWdCLGFBQUMsSUFBcUI7SUFVdEMsNkJBQU8sYUFBQyxLQUFjOzs7Ozs7O2dCQTNkdkIsVUFBVTs7c0JBcGJYO0VBcWJpQywwQkFBMEI7U0FBOUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcmRvdmEsIENvcmRvdmFGdW5jdGlvbk92ZXJyaWRlLCBBd2Vzb21lQ29yZG92YU5hdGl2ZVBsdWdpbiwgUGx1Z2luIH0gZnJvbSAnQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpZmlDb25maWcge1xuICBTU0lEOiBzdHJpbmc7XG4gIGlzSGlkZGVuU1NJRDogYm9vbGVhbjtcbiAgYXV0aDoge1xuICAgIGFsZ29yaXRobTogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpZmlTY2FuUmVzdWx0c09wdGlvbnMge1xuICBudW1MZXZlbHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaWZpU2Nhbk9wdGlvbnMgZXh0ZW5kcyBXaWZpU2NhblJlc3VsdHNPcHRpb25zIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEBuYW1lIFdpZmlXaXphcmQyXG4gKiBAZGVzY3JpcHRpb25cbiAqIFdpZmlXaXphcmQyIGVuYWJsZXMgV2lmaSBtYW5hZ2VtZW50IGZvciBib3RoIEFuZHJvaWQgYW5kIGlPUyBhcHBsaWNhdGlvbnMgd2l0aGluIENvcmRvdmEvUGhvbmVnYXAgcHJvamVjdHMuXG4gKlxuICogVGhpcyBwcm9qZWN0IGlzIGEgZm9yayBvZiB0aGUgV2lmaVdpemFyZCBwbHVnaW4gd2l0aCBmaXhlcyBhbmQgdXBkYXRlcywgYXMgd2VsbCBhcyBwYXRjaGVzIHRha2VuIGZyb20gdGhlIENvcmRvdmEgTmV0d29yayBNYW5hZ2VyIHBsdWdpbi5cbiAqIEB1c2FnZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgV2lmaVdpemFyZDIgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvd2lmaS13aXphcmQtMi9uZ3gnO1xuICpcbiAqXG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIHdpZmlXaXphcmQyOiBXaWZpV2l6YXJkMikgeyB9XG4gKlxuICpcbiAqICMgR2xvYmFsIEZ1bmN0aW9uc1xuICogIFRoZXNlIGFyZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSBib3RoIEFuZHJvaWQgYW5kIGlPUyBhcHBsaWNhdGlvbnNcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRDb25uZWN0ZWRTU0lEKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgY29ubmVjdGVkIG5ldHdvcmsgU1NJRCAob25seSBpZiBjb25uZWN0ZWQpIGluIHN1Y2Nlc3MgY2FsbGJhY2ssIG90aGVyd2lzZSBmYWlsIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIChpZiBub3QgY29ubmVjdGVkIG9yIHVuYWJsZSB0byByZXRyaWV2ZSlcbiAqICAtIFRoaXMgZG9lcyAqKk5PVCoqIHJldHVybiB0aGUgQlNTSUQgaWYgdW5hYmxlIHRvIG9idGFpbiBTU0lEIChsaWtlIG9yaWdpbmFsIFdpZmlXaXphcmQgZGlkKVxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZEJTU0lEKClcbiAqICBgYGBcbiAqICAtIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBCU1NJRCAobWFjKSBpcyByZXR1cm5lZFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi50aW1lb3V0KGRlbGF5KVxuICogIGBgYFxuICogIC0gYGRlbGF5YCBzaG91bGQgYmUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gZGVsYXlcbiAqICAtIEhlbHBlciBhc3luYyB0aW1lb3V0IGRlbGF5LCBgZGVsYXlgIGlzIG9wdGlvbmFsLCBkZWZhdWx0IGlzIDIwMDBtcyA9IDIgc2Vjb25kc1xuICogIC0gVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYSByZXNvbHZlZCBwcm9taXNlIGFmdGVyIHRoZSBkZWxheSwgaXQgd2lsbCBuZXZlciByZWplY3Qgb3IgdGhyb3cgYW4gZXJyb3JcbiAqXG4gKiAgRXhhbXBsZSBpbnNpZGUgYXN5bmMgZnVuY3Rpb24qKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICBhc3luYyBmdW5jdGlvbiBleGFtcGxlKCl7XG4gKiAgICAgYXdhaXQgdGhpcy53aWZpV2l6YXJkMi50aW1lb3V0KDQwMDApO1xuICogICAgIC8vIGRvIHNvbWV0aGluZyBhZnRlciA0IHNlY29uZHNcbiAqIH1cbiAqICBgYGBcbiAqXG4gKiAgRXhhbXBsZSBpbnNpZGUgc3RhbmRhcmQgbm9uLWFzeW5jIGZ1bmN0aW9uKipcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgZnVuY3Rpb24gZXhhbXBsZSgpe1xuICogICAgIHRoaXMud2lmaVdpemFyZDIudGltZW91dCg0MDAwKS50aGVuKCBmdW5jdGlvbigpe1xuICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgYWZ0ZXIgd2FpdGluZyA0IHNlY29uZHNcbiAqICAgICB9KTpcbiAqIH1cbiAqICBgYGBcbiAqXG4gKiAgVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFRJTUVPVVRfV0FJVElOR19GT1JfU0NBTmAgb24gdGltZW91dCB3YWl0aW5nIGZvciBzY2FuIDEwIHNlY29uZHMgK1xuICogIC0gYFNDQU5fRkFJTEVEYCBpZiB1bmFibGUgdG8gc3RhcnQgc2NhblxuICpcbiAqICAjIGlPUyBGdW5jdGlvbnNcbiAqICBGb3IgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG8gbm90ZSB0aGUgZm9sbG93aW5nOlxuICogIC0gQ29ubmVjdC9EaXNjb25uZWN0IG9ubHkgd29ya3MgZm9yIGlPUzExK1xuICogIC0gQ2FuJ3QgcnVuIGluIHRoZSBzaW11bGF0b3Igc28geW91IG5lZWQgdG8gYXR0YWNoIGFuIGFjdHVhbCBkZXZpY2Ugd2hlbiBidWlsZGluZyB3aXRoIHhDb2RlXG4gKiAgLSBXaWxsIGVuc3VyZSAnSG90c3BvdENvbmZpZ3VyYXRpb24nIGFuZCAnTmV0d29ya0V4dGVuc2lvbnMnIGNhcGFiaWxpdGllcyBhcmUgYWRkZWQgdG8geW91ciB4Q29kZSBwcm9qZWN0XG4gKiAgLSBUbyBjb25uZWN0IHRvIG9wZW4gbmV0d29yayBvbWl0IGBzc2lkUGFzc3dvcmRgIG9yIGNhbGwgd2l0aCBgZmFsc2VgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlPU0Nvbm5lY3ROZXR3b3JrKHNzaWQsIHNzaWRQYXNzd29yZClcbiAqICBgYGBcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5pT1NEaXNjb25uZWN0TmV0d29yayhzc2lkKVxuICogIGBgYFxuICpcbiAqICAjIEFuZHJvaWQgRnVuY3Rpb25zXG4gKiAgLSAqKldpZmlXaXphcmQyKiogKndpbGwgYXV0b21hZ2ljYWxseSB0cnkgdG8gZW5hYmxlIFdpRmkgaWYgaXQncyBkaXNhYmxlZCB3aGVuIGNhbGxpbmcgYW55IGFuZHJvaWQgcmVsYXRlZCBtZXRob2RzIHRoYXQgcmVxdWlyZSBXaUZpIHRvIGJlIGVuYWJsZWQqXG4gKlxuICogICMjIENvbm5lY3QgdnMgRW5hYmxlXG4gKiAgV2hlbiB3cml0aW5nIEFuZHJvaWQgSmF2YSBjb2RlLCB0aGVyZSBpcyBubyBgY29ubmVjdGAgbWV0aG9kcywgeW91IGJhc2ljYWxseSBlaXRoZXIgYGVuYWJsZWAgb3IgYGRpc2FibGVgIGEgbmV0d29yay4gSW4gdGhlIG9yaWdpbmFsIHZlcnNpb25zIG9mIFdpZmlXaXphcmQgdGhlIGBjb25uZWN0YCBtZXRob2Qgd291bGQgYmFzaWNhbGx5IGp1c3QgY2FsbCBgZW5hYmxlYCBpbiBBbmRyb2lkLlxuICogIEkgaGF2ZSBjaGFuZ2VkIHRoZSB3YXkgdGhpcyB3b3JrcyBpbiBXaWZpV2l6YXJkMiB2ZXJzaW9uIDMuMC4wKywgY29udmVydGluZyBpdCB0byBhIGhlbHBlciBtZXRob2QgdG8gZWxpbWluYXRlIGhhdmluZyB0byBjYWxsIGBmb3JtYXRXaWZpQ29uZmlnYCB0aGVuIGBhZGRgIGFuZCB0aGVuIGBlbmFibGVgIC4uLiB0aGUgYGNvbm5lY3RgIG1ldGhvZCB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGwgYGZvcm1hdFdpZmlDb25maWdgLCB0aGVuIGNhbGwgYGFkZGAgdG8gZWl0aGVyIGFkZCBvciB1cGRhdGUgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiwgYW5kIHRoZW4gY2FsbCBgZW5hYmxlYC5cbiAqICBJZiB0aGUgY29ubmVjdCBtZXRob2QgaXMgdW5hYmxlIHRvIHVwZGF0ZSBleGlzdGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKGFkZGVkIGJ5IHVzZXIgb3Igb3RoZXIgYXBwcyksIGJ1dCB0aGVyZSBpcyBhIHZhbGlkIG5ldHdvcmsgSUQsIGl0IHdpbGwgc3RpbGwgYXR0ZW1wdCB0byBlbmFibGUgdGhhdCBuZXR3b3JrIElELlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5jb25uZWN0KHNzaWQsIGJpbmRBbGwsIHBhc3N3b3JkLCBhbGdvcml0aG0sIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBzaG91bGQgYmUgdGhlIFNTSUQgdG8gY29ubmVjdCB0byAqcmVxdWlyZWQqXG4gKiAgLSBgYmluZEFsbGAgc2hvdWxkIGJlIHNldCB0byBgdHJ1ZWAgdG8gdGVsbCBBbmRyb2lkIHRvIHJvdXRlIGFsbCBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAsIHRocm91Z2ggdGhlIHdpZmkgY29ubmVjdGlvbiAoZGVmYXVsdCBpcyBgZmFsc2VgKSAqb3B0aW9uYWwqXG4gKiAgLSBTZWUgYFdpZmlXaXphcmQyLmVuYWJsZWAgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYGJpbmRBbGxgIGZlYXR1cmVcbiAqICAtIGBhbGdvcml0aG1gIGFuZCBgcGFzc3dvcmRgIGlzIG5vdCByZXF1aXJlZCBpZiBjb25uZWN0aW5nIHRvIGFuIG9wZW4gbmV0d29ya1xuICogIC0gQ3VycmVudGx5IGBXUEFgIGFuZCBgV0VQYCBhcmUgb25seSBzdXBwb3J0ZWQgYWxnb3JpdGhtc1xuICogIC0gRm9yIGBXUEEyYCBqdXN0IHBhc3MgYFdQQWAgYXMgdGhlIGFsZ29yaXRobVxuICogIC0gU2V0IGBpc0hpZGRlblNTSURgIHRvIGB0cnVlYCBpZiB0aGUgbmV0d29yayB5b3UncmUgY29ubmVjdGluZyB0byBpcyBoaWRkZW5cbiAqICAtIFRoZXNlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIGBmb3JtYXRXaWZpQ29uZmlnYFxuICogIC0gVGhpcyBtZXRob2QgZXNzZW50aWFsbHkgY2FsbHMgYGZvcm1hdFdpZmlDb25maWdgIHRoZW4gYGFkZGAgdGhlbiBgZW5hYmxlYFxuICogIC0gSWYgdW5hYmxlIHRvIHVwZGF0ZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gKHdhcyBhZGRlZCBieSB1c2VyIG9yIG90aGVyIGFwcCksIGJ1dCBhIHZhbGlkIG5ldHdvcmsgSUQgZXhpc3RzLCB0aGlzIG1ldGhvZCB3aWxsIHN0aWxsIGF0dGVtcHQgdG8gZW5hYmxlIHRoZSBuZXR3b3JrXG4gKiAgLSBQcm9taXNlIHdpbGwgbm90IGJlIHJldHVybmVkIHVudGlsIG1ldGhvZCBoYXMgdmVyaWZpZWQgdGhhdCBjb25uZWN0aW9uIHRvIFdpRmkgd2FzIGluIGNvbXBsZXRlZCBzdGF0ZSAod2FpdHMgdXAgdG8gNjAgc2Vjb25kcylcbiAqXG4gKiAgVGhyb3duIEVycm9ycyoqXG4gKlxuICpcbiAqICAtIGBDT05ORUNUX0ZBSUxFRF9USU1FT1VUYCB1bmFibGUgdG8gdmVyaWZ5IGNvbm5lY3Rpb24sIHRpbWVkIG91dCBhZnRlciA2MCBzZWNvbmRzXG4gKiAgLSBgSU5WQUxJRF9ORVRXT1JLX0lEX1RPX0NPTk5FQ1RgIFVuYWJsZSB0byBjb25uZWN0IGJhc2VkIG9uIGdlbmVyYXRlZCB3aWZpIGNvbmZpZ1xuICogIC0gYElOVEVSUFVUX0VYQ0VQVF9XSElMRV9DT05ORUNUSU5HYCBJbnRlcnVwdCBleGNlcHRpb24gd2hpbGUgd2FpdGluZyBmb3IgY29ubmVjdGlvblxuICpcbiAqXG4gKlxuICogICMjIERpc2Nvbm5lY3QgdnMgRGlzYWJsZVxuICogIFNhbWUgYXMgYWJvdmUgZm9yIENvbm5lY3QgdnMgRW5hYmxlLCBleGNlcHQgaW4gdGhpcyBzaXR1YXRpb24sIGBkaXNjb25uZWN0YCB3aWxsIGZpcnN0IGRpc2FibGUgdGhlIG5ldHdvcmssIGFuZCB0aGVuIGF0dGVtcHQgdG8gcmVtb3ZlIGl0IChpZiBTU0lEIGlzIHBhc3NlZClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZGlzY29ubmVjdChzc2lkKVxuICogIGBgYFxuICogIC0gYHNzaWRgIGNhbiBlaXRoZXIgYmUgYW4gU1NJRCAoc3RyaW5nKSBvciBhIG5ldHdvcmsgSUQgKGludGVnZXIpXG4gKiAgLSBgc3NpZGAgaXMgKipPUFRJT05BTCoqIC4uIGlmIG5vdCBwYXNzZWQsIHdpbGwgZGlzY29ubmVjdCBjdXJyZW50IFdpRmkgKGFsbW9zdCBhbGwgQW5kcm9pZCB2ZXJzaW9ucyBub3cgd2lsbCBqdXN0IGF1dG9tYXRpY2FsbHkgcmVjb25uZWN0IHRvIGxhc3Qgd2lmaSBhZnRlciBkaXNjb25uZWN0aW5nKVxuICogIC0gSWYgYHNzaWRgIGlzIHByb3ZpZGVkLCB0aGlzIG1ldGhvZCB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gYGRpc2FibGVgIGFuZCB0aGVuIGByZW1vdmVgIHRoZSBuZXR3b3JrXG4gKiAgLSBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIG5ldHdvcmsgY29uZmlndXJhdGlvbiwgdXNlIGBkaXNhYmxlYCBpbnN0ZWFkXG4gKlxuICogIFRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBESVNDT05ORUNUX05FVF9SRU1PVkVfRVJST1JgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZW1vdmluZyB3aWZpIGNvbmZpZ3VyYXRpb25cbiAqICAtIGBESVNDT05ORUNUX05FVF9ESVNBQkxFX0VSUk9SYCBVbmFibGUgdG8gY29ubmVjdCBiYXNlZCBvbiBnZW5lcmF0ZWQgd2lmaSBjb25maWdcbiAqICAtIGBESVNDT05ORUNUX05FVF9JRF9OT1RfRk9VTkRgIFVuYWJsZSB0byBkZXRlcm1pbmUgbmV0d29yayBJRCB0byBkaXNjb25uZWN0L3JlbW92ZSAoZnJvbSBwYXNzZWQgU1NJRClcbiAqICAtIGBFUlJPUl9ESVNDT05ORUNUYCAtIEFuZHJvaWQgZXJyb3IgZGlzY29ubmVjdGluZyB3aWZpIChvbmx5IHdoZW4gU1NJRCBpcyBub3QgcGFzc2VkKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5mb3JtYXRXaWZpQ29uZmlnKHNzaWQsIHBhc3N3b3JkLCBhbGdvcml0aG0sIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIGBhbGdvcml0aG1gIGFuZCBgcGFzc3dvcmRgIGlzIG5vdCByZXF1aXJlZCBpZiBjb25uZWN0aW5nIHRvIGFuIG9wZW4gbmV0d29ya1xuICogIC0gQ3VycmVudGx5IGBXUEFgIGFuZCBgV0VQYCBhcmUgb25seSBzdXBwb3J0ZWQgYWxnb3JpdGhtc1xuICogIC0gRm9yIGBXUEEyYCBqdXN0IHBhc3MgYFdQQWAgYXMgdGhlIGFsZ29yaXRobVxuICogIC0gU2V0IGBpc0hpZGRlblNTSURgIHRvIGB0cnVlYCBpZiB0aGUgbmV0d29yayB5b3UncmUgY29ubmVjdGluZyB0byBpcyBoaWRkZW5cbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5mb3JtYXRXUEFDb25maWcoc3NpZCwgcGFzc3dvcmQsIGlzSGlkZGVuU1NJRClcbiAqICBgYGBcbiAqICAtIFRoaXMgaXMganVzdCBhIGhlbHBlciBtZXRob2QgdGhhdCBjYWxscyBgV2lmaVdpemFyZDIuZm9ybWF0V2lmaUNvbmZpZyggc3NpZCwgcGFzc3dvcmQsICdXUEEnLCBpc0hpZGRlblNTSUQgKTtgXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmFkZCh3aWZpKVxuICogIGBgYFxuICogIC0gYHdpZmlgIG11c3QgYmUgYW4gb2JqZWN0IGZvcm1hdHRlZCBieSBgZm9ybWF0V2lmaUNvbmZpZ2AsIHRoaXMgKiptdXN0KiogYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBgZW5hYmxlYFxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgQVVUSF9UWVBFX05PVF9TVVBQT1JURURgIC0gSW52YWxpZCBhdXRoIHR5cGUgc3BlY2lmaWVkXG4gKiAgLSBgRVJST1JfQURESU5HX05FVFdPUktgIC0gQW5kcm9pZCByZXR1cm5lZCBgLTFgIHNwZWNpZnlpbmcgZXJyb3IgYWRkaW5nIG5ldHdvcmtcbiAqICAtIGBFUlJPUl9VUERBVElOR19ORVRXT1JLYCAtIFNhbWUgYXMgYWJvdmUsIGV4Y2VwdCBhbiBleGlzdGluZyBuZXR3b3JrIElEIHdhcyBmb3VuZCwgYW5kIHVuYWJsZSB0byB1cGRhdGUgaXRcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVtb3ZlKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBgc3NpZGAgY2FuIGVpdGhlciBiZSBhbiBTU0lEIChzdHJpbmcpIG9yIGEgbmV0d29yayBJRCAoaW50ZWdlcilcbiAqICAtIFBsZWFzZSBub3RlLCBtb3N0IG5ld2VyIHZlcnNpb25zIG9mIEFuZHJvaWQgd2lsbCBvbmx5IGFsbG93IHdpZmkgdG8gYmUgcmVtb3ZlZCBpZiBjcmVhdGVkIGJ5IHlvdXIgYXBwbGljYXRpb25cbiAqXG4gKiAgVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFVOQUJMRV9UT19SRU1PVkVgIEFuZHJvaWQgcmV0dXJuZWQgZmFpbHVyZSBpbiByZW1vdmluZyBuZXR3b3JrXG4gKiAgLSBgUkVNT1ZFX05FVFdPUktfTk9UX0ZPVU5EYCBVbmFibGUgdG8gZGV0ZXJtaW5lIG5ldHdvcmsgSUQgZnJvbSBwYXNzZWQgU1NJRFxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIubGlzdE5ldHdvcmtzKClcbiAqICBgYGBcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuc2Nhbihbb3B0aW9uc10pXG4gKiAgYGBgXG4gKiAgLSBTYW1lIGFzIGNhbGxpbmcgYHN0YXJ0U2NhbmAgYW5kIHRoZW4gYGdldFNjYW5SZXN1bHRzYCwgZXhjZXB0IHRoaXMgbWV0aG9kIHdpbGwgb25seSByZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHRoZSBzY2FuIGNvbXBsZXRlcyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy5cbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuc3RhcnRTY2FuKClcbiAqICBgYGBcbiAqICAtIEl0IGlzIHJlY29tbWVuZGVkIHRvIGp1c3QgdXNlIHRoZSBgc2NhbmAgbWV0aG9kIGluc3RlYWQgb2YgYHN0YXJ0U2NhbmBcbiAqXG4gKiAgVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFNUQVJUU0NBTl9GQUlMRURgIEFuZHJvaWQgcmV0dXJuZWQgZmFpbHVyZSBpbiBzdGFydGluZyBzY2FuXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRTY2FuUmVzdWx0cyhbb3B0aW9uc10pXG4gKiAgYGBgXG4gKiAgLSBgZ2V0U2NhblJlc3VsdHNgIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGBzdGFydFNjYW5gIChpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYHNjYW5gIGluc3RlYWQgYXMgdGhpcyBzdGFydHMgdGhlIHNjYW4sIHRoZW4gcmV0dXJucyB0aGUgcmVzdWx0cylcbiAqICAtIGBbb3B0aW9uc11gIGlzIG9wdGlvbmFsLCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc3BlY2lmeSwganVzdCBwYXNzIGBzdWNjZXNzYCBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXIsIGFuZCBgZmFpbGAgY2FsbGJhY2sgYXMgc2Vjb25kIHBhcmFtZXRlclxuICogIC0gUmV0cmlldmVzIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIG5ldHdvcmtzIGFzIGFuIGFycmF5IG9mIG9iamVjdHMgYW5kIHBhc3NlcyB0aGVtIHRvIHRoZSBmdW5jdGlvbiBsaXN0SGFuZGxlci4gVGhlIGZvcm1hdCBvZiB0aGUgYXJyYXkgaXM6XG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIG5ldHdvcmtzID0gW1xuICogIHsgICBcImxldmVsXCI6IHNpZ25hbF9sZXZlbCwgLy8gcmF3IFJTU0kgdmFsdWVcbiAqICAgICAgICAgXCJTU0lEXCI6IHNzaWQsIC8vIFNTSUQgYXMgc3RyaW5nLCB3aXRoIGVzY2FwZWQgZG91YmxlIHF1b3RlczogXCJcXFwic3NpZCBuYW1lXFxcIlwiXG4gKiAgICAgICAgIFwiQlNTSURcIjogYnNzaWQgLy8gTUFDIGFkZHJlc3Mgb2YgV2lGaSByb3V0ZXIgYXMgc3RyaW5nXG4gKiAgICAgICAgIFwiZnJlcXVlbmN5XCI6IGZyZXF1ZW5jeSBvZiB0aGUgYWNjZXNzIHBvaW50IGNoYW5uZWwgaW4gTUh6XG4gKiAgICAgICAgIFwiY2FwYWJpbGl0aWVzXCI6IGNhcGFiaWxpdGllcyAvLyBEZXNjcmliZXMgdGhlIGF1dGhlbnRpY2F0aW9uLCBrZXkgbWFuYWdlbWVudCwgYW5kIGVuY3J5cHRpb24gc2NoZW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGFjY2VzcyBwb2ludC5cbiAqICAgICAgICAgXCJ0aW1lc3RhbXBcIjogdGltZXN0YW1wIC8vIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBzY2FuIHdhcyBjb21wbGV0ZWRcbiAqICAgICAgICAgXCJjaGFubmVsV2lkdGhcIjpcbiAqICAgICAgICAgXCJjZW50ZXJGcmVxMFwiOlxuICogICAgICAgICBcImNlbnRlckZyZXExXCI6XG4gKiAgICAgfVxuICogIF1cbiAqICBgYGBcbiAqICAtIGBjaGFubmVsV2lkdGhgIGBjZW50ZXJGcmVxMGAgYW5kIGBjZW50ZXJGcmVxMWAgYXJlIG9ubHkgc3VwcG9ydGVkIG9uIEFQSSA+IDIzIChNYXJzaG1hbGxvdyksIGFueSBvbGRlciBBUEkgd2lsbCByZXR1cm4gbnVsbCBmb3IgdGhlc2UgdmFsdWVzXG4gKlxuICogIEFuIG9wdGlvbnMgb2JqZWN0IG1heSBiZSBwYXNzZWQuIEN1cnJlbnRseSwgdGhlIG9ubHkgc3VwcG9ydGVkIG9wdGlvbiBpcyBgbnVtTGV2ZWxzYCwgYW5kIGl0IGhhcyB0aGUgZm9sbG93aW5nIGJlaGF2aW9yOlxuICpcbiAqICAtIGlmIGAobiA9PSB0cnVlIHx8IG4gPCAyKWAsIGAqLmdldFNjYW5SZXN1bHRzKHtudW1MZXZlbHM6IG59KWAgd2lsbCByZXR1cm4gZGF0YSBhcyBiZWZvcmUsIHNwbGl0IGluIDUgbGV2ZWxzO1xuICogIC0gaWYgYChuID4gMSlgLCBgKi5nZXRTY2FuUmVzdWx0cyh7bnVtTGV2ZWxzOiBufSlgIHdpbGwgY2FsY3VsYXRlIHRoZSBzaWduYWwgbGV2ZWwsIHNwbGl0IGluIG4gbGV2ZWxzO1xuICogIC0gaWYgYChuID09IGZhbHNlKWAsIGAqLmdldFNjYW5SZXN1bHRzKHtudW1MZXZlbHM6IG59KWAgd2lsbCB1c2UgdGhlIHJhdyBzaWduYWwgbGV2ZWw7XG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmlzV2lmaUVuYWJsZWQoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBib29sZWFuIHZhbHVlIG9mIHdoZXRoZXIgV2lmaSBpcyBlbmFibGVkIG9yIG5vdFxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnNldFdpZmlFbmFibGVkKGVuYWJsZWQpXG4gKiAgYGBgXG4gKiAgLSBQYXNzIGB0cnVlYCBmb3IgYGVuYWJsZWRgIHBhcmFtZXRlciB0byBzZXQgV2lmaSBlbmFibGVkXG4gKiAgLSBZb3UgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCBXaUZpIGVuYWJsZWQgdG8gY2FsbCBvdGhlciBtZXRob2RzIHRoYXQgcmVxdWlyZSB3aWZpIGVuYWJsZWQuICBUaGlzIHBsdWdpbiB3aWxsIGF1dG9tYWdpY2FsbHkgZW5hYmxlIFdpRmkgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgcmVxdWlyZXMgV2lGaSB0byBiZSBlbmFibGVkLlxuICpcbiAqICBUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfU0VUV0lGSUVOQUJMRURgIHdpZmkgc3RhdGUgZG9lcyBub3QgbWF0Y2ggY2FsbCAoZW5hYmxlIG9yIGRpc2FibGUpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmdldENvbm5lY3RlZE5ldHdvcmtJRCgpXG4gKiAgYGBgXG4gKiAgLSBSZXR1cm5zIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBJRCBpbiBzdWNjZXNzIGNhbGxiYWNrIChvbmx5IGlmIGNvbm5lY3RlZCksIG90aGVyd2lzZSBmYWlsIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYEdFVF9DT05ORUNURURfTkVUX0lEX0VSUk9SYCBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBJRCAobWF5IG5vdCBiZSBjb25uZWN0ZWQpXG4gKlxuICogICMjIE5ldyB0byAzLjEuMStcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZXNldEJpbmRBbGwoKVxuICogIGBgYFxuICogIC0gRGlzYWJsZSBiaW5kQWxsIHRvIFdpRmkgbmV0d29yayB3aXRob3V0IGRpc2Nvbm5lY3RpbmcgZnJvbSBXaUZpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnNldEJpbmRBbGwoKVxuICogIGBgYFxuICogIC0gRW5hYmxlIGJpbmRBbGwgdG8gV2lGaSBuZXR3b3JrIHdpdGhvdXQgZGlzY29ubmVjdGluZyBmcm9tIFdpRmlcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuQ29ubmVjdFRvSW50ZXJuZXQoKVxuICogIGBgYFxuICpcbiAqICAtIFJldHVybnMgYm9vbGVhbiwgdHJ1ZSBvciBmYWxzZSwgaWYgZGV2aWNlIGlzIGFibGUgdG8gY29ubmVjdCB0byBodHRwczovL3d3dy5nb29nbGUuY29tIHZpYSBIVFRQIGNvbm5lY3Rpb24gKHNpbmNlIHBpbmcgaXMgdW5yZWxpYWJsZSlcbiAqICAtIFVua25vd24gZXJyb3JzIHdpbGwgc3RpbGwgYmUgdGhyb3duIGxpa2UgYWxsIG90aGVyIGFzeW5jIGZ1bmN0aW9uc1xuICogIC0gSWYgeW91IGNhbGxlZCBgY29ubmVjdGAgb3IgYGVuYWJsZWAgYW5kIHBhc3NlZCBgdHJ1ZWAgZm9yIGBiaW5kQWxsYCwgeW91ciBhcHBsaWNhdGlvbiB3aWxsIGZvcmNlIHRoZSBwaW5nIHRocm91Z2ggd2lmaSBjb25uZWN0aW9uLlxuICogIC0gSWYgeW91IGRpZCBub3QgcGFzcyBgdHJ1ZWAgKG9yIHBhc3NlZCBgZmFsc2VgKSBmb3IgYGJpbmRBbGxgLCBhbmQgdGhlIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uLCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgd2lsbCB1c2UgY2VsbCBjb25uZWN0aW9uIHRvIHBpbmcgKGR1ZSB0byBBbmRyb2lkIHVzaW5nIGNlbGwgY29ubmVjdGlvbiB3aGVuIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCkgW01vcmUgRGV0YWlsc10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICpcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuY2FuQ29ubmVjdFRvUm91dGVyKClcbiAqICBgYGBcbiAqICAtIEFzIGBjYW5QaW5nV2lmaVJvdXRlcmAgaXMgbm90b3Jpb3VzbHkgdW5yZWxpYWJsZSwgdGhpcyBtZXRob2QgdXNlcyBIVFRQIGNvbm5lY3Rpb24gdG8gdGVzdCBpZiBhYmxlIHRvIGNvbm5lY3QgdG8gcm91dGVyIChhcyBtb3N0IHJvdXRlcnMgc2hvdWxkIGhhdmUgd2ViIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgODApXG4gKiAgLSBVbmtub3duIGVycm9ycyB3aWxsIHN0aWxsIGJlIHRocm93biBsaWtlIGFsbCBvdGhlciBhc3luYyBmdW5jdGlvbnNcbiAqICAtIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgQW5kcm9pZCBhcHAgaXMgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBwcml2YXRlIG5ldHdvcmsgYWZ0ZXIgY29ubmVjdGluZyB0byBXaUZpXG4gKiAgLSBUaGlzIHdhcyBhZGRlZCBmb3IgdGVzdGluZyB0aGUgYGJpbmRBbGxgIGZlYXR1cmUgdG8gc3VwcG9ydCBpc3N1ZXMgd2l0aCBBbmRyb2lkIExvbGxpcG9wKyAoQVBJIDIxKykgbm90IHJvdXRpbmcgY2FsbHMgdGhyb3VnaCBXaUZpIGlmIFdpRmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uIFtTZWUgQW5kcm9pZCBCbG9nXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKiAgLSBBdHRlbXB0cyB0byBjb25uZWN0IHJvdXRlciBJUCBIVFRQIHNlcnZlciBvbiBwb3J0IDgwIChleGFtcGxlOiBgaHR0cDovLzE5Mi4xNjguMC4xL2Agd2hlcmUgYDE5Mi4xNjguMC4xYCBpcyB0aGUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBJUCBhZGRyZXNzKVxuICpcbiAqICAjIyBOZXcgdG8gMy4wLjArXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuaXNDb25uZWN0ZWRUb0ludGVybmV0KClcbiAqICBgYGBcbiAqXG4gKiAgLSBSZXR1cm5zIGJvb2xlYW4sIHRydWUgb3IgZmFsc2UsIGlmIGRldmljZSBpcyBhYmxlIHRvIHBpbmcgOC44LjguOFxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBJZiB5b3UgY2FsbGVkIGBjb25uZWN0YCBvciBgZW5hYmxlYCBhbmQgcGFzc2VkIGB0cnVlYCBmb3IgYGJpbmRBbGxgLCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZm9yY2UgdGhlIHBpbmcgdGhyb3VnaCB3aWZpIGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgZGlkIG5vdCBwYXNzIGB0cnVlYCAob3IgcGFzc2VkIGBmYWxzZWApIGZvciBgYmluZEFsbGAsIGFuZCB0aGUgd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0IGNvbm5lY3Rpb24sIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIHVzZSBjZWxsIGNvbm5lY3Rpb24gdG8gcGluZyAoZHVlIHRvIEFuZHJvaWQgdXNpbmcgY2VsbCBjb25uZWN0aW9uIHdoZW4gd2lmaSBkb2VzIG5vdCBoYXZlIGludGVybmV0KSBbTW9yZSBEZXRhaWxzXShodHRwczovL2FuZHJvaWQtZGV2ZWxvcGVycy5nb29nbGVibG9nLmNvbS8yMDE2LzA3L2Nvbm5lY3RpbmcteW91ci1hcHAtdG8td2ktZmktZGV2aWNlLmh0bWwpXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmNhblBpbmdXaWZpUm91dGVyKClcbiAqICBgYGBcbiAqXG4gKiAgLSBSZXR1cm5zIGJvb2xlYW4sIHRydWUgb3IgZmFsc2UsIGlmIGRldmljZSBpcyBhYmxlIHRvIHBpbmcgdGhlIGNvbm5lY3RlZCBXaUZpIHJvdXRlciBJUCAob2J0YWluZWQgZnJvbSBESENQIGluZm8pXG4gKiAgLSBWZXJzaW9uIDMuMS4xKyB1c2VzIEhUVFAgY29ubmVjdGlvbiB0byB0ZXN0IGlmIGFibGUgdG8gY29ubmVjdCB0byByb3V0ZXIgKGFzIHBpbmcgcHJldmlvdXMgZGlkIG5vdCB3b3JrKVxuICogIC0gVW5rbm93biBlcnJvcnMgd2lsbCBzdGlsbCBiZSB0aHJvd24gbGlrZSBhbGwgb3RoZXIgYXN5bmMgZnVuY3Rpb25zXG4gKiAgLSBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIEFuZHJvaWQgYXBwIGlzIGFibGUgdG8gY29ubmVjdCB0byB0aGUgcHJpdmF0ZSBuZXR3b3JrIGFmdGVyIGNvbm5lY3RpbmcgdG8gV2lGaVxuICogIC0gVGhpcyB3YXMgYWRkZWQgZm9yIHRlc3RpbmcgdGhlIGBiaW5kQWxsYCBmZWF0dXJlIHRvIHN1cHBvcnQgaXNzdWVzIHdpdGggQW5kcm9pZCBMb2xsaXBvcCsgKEFQSSAyMSspIG5vdCByb3V0aW5nIGNhbGxzIHRocm91Z2ggV2lGaSBpZiBXaUZpIGRvZXMgbm90IGhhdmUgaW50ZXJuZXQgY29ubmVjdGlvbiBbU2VlIEFuZHJvaWQgQmxvZ10oaHR0cHM6Ly9hbmRyb2lkLWRldmVsb3BlcnMuZ29vZ2xlYmxvZy5jb20vMjAxNi8wNy9jb25uZWN0aW5nLXlvdXItYXBwLXRvLXdpLWZpLWRldmljZS5odG1sKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5lbmFibGVXaWZpKClcbiAqICBgYGBcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZGlzYWJsZVdpZmkoKVxuICogIGBgYFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpSVAoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBJUHY0IGFkZHJlc3Mgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBXaUZpLCBvciByZWplY3RzIHByb21pc2UgaWYgSVAgbm90IGZvdW5kIG9yIHdpZmkgbm90IGNvbm5lY3RlZFxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpUm91dGVySVAoKVxuICogIGBgYFxuICogIC0gUmV0dXJucyBJUHY0IFdpRmkgcm91dGVyIElQIGZyb20gY3VycmVudGx5IGNvbm5lY3RlZCBXaUZpLCBvciByZWplY3RzIHByb21pc2UgaWYgdW5hYmxlIHRvIGRldGVybWluZSwgb3Igd2lmaSBub3QgY29ubmVjdGVkXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYE5PX1ZBTElEX0lQX0lERU5USUZJRURgIGlmIHVuYWJsZSB0byBkZXRlcm1pbmUgYSB2YWxpZCBJUCAoaXAgcmV0dXJuZWQgZnJvbSBkZXZpY2UgaXMgYDAuMC4wLjBgKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRXaWZpSVBJbmZvKClcbiAqICBgYGBcbiAqICAtIFJldHVybnMgYSBKU09OIG9iamVjdCB3aXRoIElQdjQgYWRkcmVzcyBhbmQgc3VibmV0IGB7XCJpcFwiOiBcIjE5Mi4xNjguMS4yXCIsIFwic3VibmV0XCI6IFwiMjU1LjI1NS4yNTUuMFwiIH1gIG9yIHJlamVjdGVkIHByb21pc2UgaWYgbm90IGZvdW5kIG9yIG5vdCBjb25uZWN0ZWRcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBOT19WQUxJRF9JUF9JREVOVElGSUVEYCBpZiB1bmFibGUgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSVAgKGlwIHJldHVybmVkIGZyb20gZGV2aWNlIGlzIGAwLjAuMC4wYClcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIucmVjb25uZWN0KClcbiAqICBgYGBcbiAqICAtIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsICoqaWYgd2UgYXJlIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQuKipcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfUkVDT05ORUNUYCBBbmRyb2lkIHJldHVybmVkIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLnJlYXNzb2NpYXRlKClcbiAqICBgYGBcbiAqICAtIFJlY29ubmVjdCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBhY2Nlc3MgcG9pbnQsICoqZXZlbiBpZiB3ZSBhcmUgYWxyZWFkeSBjb25uZWN0ZWQuKipcbiAqXG4gKiAgKipUaHJvd24gRXJyb3JzKipcbiAqXG4gKiAgLSBgRVJST1JfUkVBU1NPQ0lBVEVgIEFuZHJvaWQgcmV0dXJuZWQgZXJyb3Igd2hlbiByZWFzc29jaWF0aW5nXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5nZXRTU0lETmV0d29ya0lEKHNzaWQpXG4gKiAgYGBgXG4gKiAgLSBHZXQgQW5kcm9pZCBOZXR3b3JrIElEIGZyb20gcGFzc2VkIFNTSURcbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogIHRoaXMud2lmaVdpemFyZDIuZGlzYWJsZShzc2lkKVxuICogIGBgYFxuICogIC0gYHNzaWRgIGNhbiBlaXRoZXIgYmUgYW4gU1NJRCAoc3RyaW5nKSBvciBhIG5ldHdvcmsgSUQgKGludGVnZXIpXG4gKiAgLSBEaXNhYmxlIHRoZSBwYXNzZWQgU1NJRCBuZXR3b3JrXG4gKiAgLSBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCB3aWxsIG9ubHkgYWxsb3cgeW91IHRvIGRpc2FibGUgbmV0d29ya3MgY3JlYXRlZCBieSB5b3VyIGFwcGxpY2F0aW9uXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIC0gYFVOQUJMRV9UT19ESVNBQkxFYCBBbmRyb2lkIHJldHVybmVkIGZhaWx1cmUgaW4gZGlzYWJsaW5nIG5ldHdvcmtcbiAqICAtIGBESVNBQkxFX05FVFdPUktfTk9UX0ZPVU5EYCBVbmFibGUgdG8gZGV0ZXJtaW5lIG5ldHdvcmsgSUQgZnJvbSBwYXNzZWQgU1NJRCB0byBkaXNhYmxlXG4gKlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiAgdGhpcy53aWZpV2l6YXJkMi5yZXF1ZXN0UGVybWlzc2lvbigpXG4gKiAgYGBgXG4gKiAgLSBSZXF1ZXN0IGBBQ0NFU1NfRklORV9MT0NBVElPTmAgcGVybXNzaW9uXG4gKiAgLSBUaGlzIEFuZHJvaWQgcGVybWlzc2lvbiBpcyByZXF1aXJlZCB0byBydW4gYHNjYW5gLCBgc3RhcnRTdGFydGAgYW5kIGBnZXRTY2FuUmVzdWx0c2BcbiAqICAtIFlvdSBjYW4gcmVxdWVzdCBwZXJtaXNzaW9uIGJ5IHJ1bm5pbmcgdGhpcyBmdW5jdGlvbiBtYW51YWxseSwgb3IgV2lmaVdpemFyZDIgd2lsbCBhdXRvbWFnaWNhbGx5IHJlcXVlc3QgcGVybWlzc2lvbiB3aGVuIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIGlzIGNhbGxlZFxuICpcbiAqICAqKlRocm93biBFcnJvcnMqKlxuICpcbiAqICAtIGBQRVJNSVNTSU9OX0RFTklFRGAgdXNlciBkZW5pZWQgcGVybWlzc2lvbiBvbiBkZXZpY2VcbiAqXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqICB0aGlzLndpZmlXaXphcmQyLmVuYWJsZShzc2lkLCBiaW5kQWxsLCB3YWl0Rm9yQ29ubmVjdGlvbilcbiAqICBgYGBcbiAqICAtIGBzc2lkYCBjYW4gZWl0aGVyIGJlIGFuIFNTSUQgKHN0cmluZykgb3IgYSBuZXR3b3JrIElEIChpbnRlZ2VyKVxuICogIC0gYGJpbmRBbGxgIHNob3VsZCBiZSBzZXQgdG8gYHRydWVgIHRvIHRlbGwgQW5kcm9pZCB0byByb3V0ZSBhbGwgY29ubmVjdGlvbnMgZnJvbSB5b3VyIEFuZHJvaWQgYXBwLCB0aHJvdWdoIHRoZSB3aWZpIGNvbm5lY3Rpb25cbiAqICAtIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSB3aWxsIG5vdCByb3V0ZSBjb25uZWN0aW9ucyB0byB0aGUgV2lGaSBkZXZpY2UgaWYgaXQgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aW9uLiAgUGFzc2luZyBgdHJ1ZWAgdG8gYGJpbmRBbGxgIHdpbGwgZm9yY2UgQW5kcm9pZCB0byByb3V0ZSBjb25uZWN0aW9ucyBmcm9tIHlvdXIgQW5kcm9pZCBhcHAgdGhyb3VnaCBXaWZpLCByZWdhcmRsZXNzIG9mIGludGVybmV0IGNvbm5lY3Rpb24uXG4gKiAgLSBJZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyBjb25uZWN0aW5nIHRvIGEgbG9jYWwgSVAgdGhyb3VnaCBXaUZpIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCwgdHJ5IGVuYWJsaW5nIGBiaW5kQWxsYCBhbmQgdGhpcyBzaG91bGQgZml4IHRoZSBwcm9ibGVtLlxuICogIC0gRHVyaW5nIG15IHRlc3RpbmcsIHNvbWUgdmVyc2lvbnMgb2YgQW5kcm9pZCAoNS4wIC0gNy4xLjIpIHdvdWxkIHN0aWxsIHJvdXRlIGNvbm5lY3Rpb25zIHRocm91Z2ggV2lGaSB3aXRob3V0IGludGVybmV0LCBidXQgaXQgd2FzIHJhbmRvbSB0aGF0IHNvbWUgdmVyc2lvbnMgd291bGQgYW5kIHdvdWxkIG5vdCB3b3JrLlxuICogIC0gVGVzdGluZyBBbmRyb2lkIE9yZW8rICg4LjAuMCspIGlmIHdpZmkgZG9lcyBub3QgaGF2ZSBpbnRlcm5ldCwgMTAwJSBvZiB0aGUgdGltZSBpdCB3b3VsZCBOT1Qgcm91dGUgY29ubmVjdGlvbnMgdGhyb3VnaCBXaUZpLCBzbyB5b3UgKm11c3QqIGVuYWJsZSB0aGlzIGZvciBPcmVvIG9yIG5ld2VyIHRvIHJvdXRlIGNvbm5lY3Rpb25zIGZyb20geW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIHdpZmkgd2l0aG91dCBpbnRlcm5ldC5cbiAqICAtIFdoZW4gYGJpbmRBbGxgIGlzIGVuYWJsZWQsICpBTEwqIGNvbm5lY3Rpb25zIGZyb20geW91ciBhcHAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCBXaUZpLCB1bnRpbCB5b3UgY2FsbCBgZGlzY29ubmVjdGAgb3IgYGRpc2FibGVgXG4gKiAgLSBTZWUgdGhlIEdvb2dsZSBBbmRyb2lkIEJsb2cgZm9yIFtNb3JlIERldGFpbHNdKGh0dHBzOi8vYW5kcm9pZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMTYvMDcvY29ubmVjdGluZy15b3VyLWFwcC10by13aS1maS1kZXZpY2UuaHRtbClcbiAqICAtIFRoaXMgZmVhdHVyZSAqT05MWSogd29ya3MgZm9yIEFuZHJvaWQgTG9sbGlwb3ArIChBUEkgMjErKSwgaWYgZGV2aWNlIGlzIHJ1bm5pbmcgQVBJIG9sZGVyIHRoYW4gMjEsIGBiaW5kYWxsYCB3aWxsIGJlIGlnbm9yZWQgKGFzIEFQSSBvbGRlciB0aGFuIDIxIGRvZXMgdGhpcyBieSBkZWZhdWx0KVxuICogIC0gRW5hYmxlIHRoZSBwYXNzZWQgU1NJRCBuZXR3b3JrXG4gKiAgLSBZb3UgKipNVVNUKiogY2FsbCBgV2lmaVdpemFyZDIuYWRkKHdpZmkpYCBiZWZvcmUgY2FsbGluZyBgZW5hYmxlYCBhcyB0aGUgd2lmaSBjb25maWd1cmF0aW9uIG11c3QgZXhpc3QgYmVmb3JlIHlvdSBjYW4gZW5hYmxlIGl0IChvciBwcmV2aW91c2x5IHVzZWQgYGNvbm5lY3RgIHdpdGhvdXQgY2FsbGluZyBgZGlzY29ubmVjdGApXG4gKiAgLSBUaGlzIG1ldGhvZCBkb2VzIE5PVCB3YWl0IG9yIHZlcmlmeSBjb25uZWN0aW9uIHRvIHdpZmkgbmV0d29yaywgcGFzcyBgdHJ1ZWAgdG8gYHdhaXRGb3JDb25uZWN0aW9uYCB0byBvbmx5IHJldHVybiBwcm9taXNlIG9uY2UgY29ubmVjdGlvbiBpcyB2ZXJpZmllZCBpbiBDT01QTEVURUQgc3RhdGUgdG8gc3BlY2lmaWMgYHNzaWRgXG4gKlxuICogICoqVGhyb3duIEVycm9ycyoqXG4gKlxuICogIGBVTkFCTEVfVE9fRU5BQkxFYCAtIEFuZHJvaWQgcmV0dXJuZWQgYC0xYCBzaWduaWZ5aW5nIGZhaWx1cmUgZW5hYmxpbmdcbiAqXG4gKiAgIyBJbnN0YWxsYXRpb25cbiAqXG4gKiAgIyMgTWFzdGVyXG4gKlxuICogIFJ1biBgYGBjb3Jkb3ZhIHBsdWdpbiBhZGQgaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L3dpZml3aXphcmQyYGBgXG4gKlxuICogIFRvIGluc3RhbGwgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaCAobGF0ZXN0IG9uIEdpdEh1YilcbiAqXG4gKiAgVG8gaW5zdGFsbCBhIHNwZWNpZmljIGJyYW5jaCAoYWRkIGAjdGFnYCByZXBsYWNpbmcgYHRhZ2Agd2l0aCB0YWcgZnJvbSB0aGlzIHJlcG8sIGV4YW1wbGU6XG4gKiAgYGBgY29yZG92YSBwbHVnaW4gYWRkIGh0dHBzOi8vZ2l0aHViLmNvbS90cmlwZmxleC93aWZpd2l6YXJkMiN2My4xLjFgYGBcbiAqXG4gKiAgRmluZCBhdmFpbGFibGUgdGFncyBoZXJlOlxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS90cmlwZmxleC9XaWZpV2l6YXJkMi90YWdzXG4gKlxuICpcbiAqICBJZiB5b3UgYXJlIHdhbnRpbmcgdG8gaGF2ZSB0aGUgbGF0ZXN0IGFuZCBncmVhdGVzdCBzdGFibGUgdmVyc2lvbiwgdGhlbiBydW4gdGhlICdSZWxlYXNlcycgY29tbWFuZCBiZWxvdy5cbiAqXG4gKiAgIyMgUmVsZWFzZXNcbiAqICBSdW4gYGBgY29yZG92YSBwbHVnaW4gYWRkIGNvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyYGBgXG4gKlxuICogICMjIE1ldGVvclxuICogIFRvIGluc3RhbGwgYW5kIHVzZSB0aGlzIHBsdWdpbiBpbiBhIE1ldGVvciBwcm9qZWN0LCB5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBleGFjdCB2ZXJzaW9uIGZyb20gTlBNIHJlcG9zaXRvcnk6XG4gKiAgW2h0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jb3Jkb3ZhLXBsdWdpbi13aWZpd2l6YXJkMilcbiAqXG4gKiAgQXMgb2YgQXByaWwgNHRoIDIwMTksIHRoZSBsYXRlc3QgdmVyc2lvbiBpcyAzLjEuMTpcbiAqXG4gKiAgYGBgbWV0ZW9yIGFkZCBjb3Jkb3ZhOmNvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyQDMuMS4xYGBgXG4gKlxuICogICMgRXJyb3JzL1JlamVjdGlvbnNcbiAqICBNZXRob2RzIG5vdyByZXR1cm4gZm9ybWF0dGVkIHN0cmluZyBlcnJvcnMgYXMgZGV0YWlsZWQgYmVsb3csIGluc3RlYWQgb2YgcmV0dXJuaW5nIGdlbmVyaWMgZXJyb3IgbWVzc2FnZXMuICBUaGlzIGFsbG93cyB5b3UgdG8gY2hlY2sgeW91cnNlbGYgd2hhdCBzcGVjaWZpYyBlcnJvciB3YXMgcmV0dXJuZWQsIGFuZCBjdXN0b21pemUgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAgSW4gYW4gdXBjb21pbmcgcmVsZWFzZSBJIG1heSBhZGQgZWFzeSB3YXlzIHRvIG92ZXJyaWRlIGdlbmVyaWMgbWVzc2FnZXMsIG9yIHNldCB5b3VyIG93biwgYnV0IGZvciBub3csIGVycm9ycyByZXR1cm5lZCBjYW4gYmUgZm91bmQgYmVsb3cgZWFjaCBtZXRob2QvZnVuY3Rpb24uXG4gKlxuICogICMjIEdlbmVyaWMgKipUaHJvd24gRXJyb3JzKipcbiAqICBgV0lGSV9OT1RfRU5BQkxFRGBcbiAqICBgYGBcbiAqL1xuQFBsdWdpbih7XG4gIHBsdWdpbk5hbWU6ICdXaWZpV2l6YXJkMicsXG4gIHBsdWdpbjogJ2NvcmRvdmEtcGx1Z2luLXdpZml3aXphcmQyJyxcbiAgcGx1Z2luUmVmOiAnV2lmaVdpemFyZDInLFxuICByZXBvOiAnaHR0cHM6Ly9naXRodWIuY29tL3RyaXBmbGV4L1dpZmlXaXphcmQyJyxcbiAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnLCAnaU9TJ10sXG59KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdpZmlXaXphcmQyIGV4dGVuZHMgQXdlc29tZUNvcmRvdmFOYXRpdmVQbHVnaW4ge1xuICAvKipcbiAgICogQ29ubmVjdCB0byBuZXR3b3JrIG9uIGlPUyBkZXZpY2VcbiAgICpcbiAgICogQHBhcmFtIHNzaWRcbiAgICogQHBhcmFtIHNzaWRQYXNzd29yZCAgICAgIFBhc3N3b3JkIGlmIGNvbm5lY3RpbmcgdG8gV1BBL1dQQTIgbmV0d29yayAob21pdCBvciB1c2UgZmFsc2UgdG8gY29ubmVjdCB0byBvcGVuIG5ldHdvcmspXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnaU9TJ10sXG4gIH0pXG4gIGlPU0Nvbm5lY3ROZXR3b3JrKHNzaWQ6IHN0cmluZywgc3NpZFBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0IGZyb20gU1NJRCBvbiBpT1MgZGV2aWNlXG4gICAqXG4gICAqIEBwYXJhbSBzc2lkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnaU9TJ10sXG4gIH0pXG4gIGlPU0Rpc2Nvbm5lY3ROZXR3b3JrKHNzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB3aWZpIG5ldHdvcmsgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gd2lmaUNvbmZpZyAgTXVzdCBiZSBvYmplY3QgY3JlYXRlZCBieSBmb3JtYXRXaWZpQ29uZmlnKClcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGFkZCh3aWZpQ29uZmlnOiBXaWZpQ29uZmlnKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHdpZmkgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICByZW1vdmUoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBuZXR3b3JrIHdpdGggc3BlY2lmaWVkIFNTSURcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBhZGQgdGhlIHdpZmkgY29uZmlndXJhdGlvbiwgdGhlbiBlbmFibGUgdGhlIG5ldHdvcmssIHJldHVybmluZyBwcm9taXNlIHdoZW4gY29ubmVjdGlvbiBpcyB2ZXJpZmllZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtib29sZWFufSBbYmluZEFsbD1mYWxzZV0gLSBXaGV0aGVyIG9yIG5vdCB0byBiaW5kIGFsbCBjb25uZWN0aW9ucyBmcm9tIGFwcCwgdGhyb3VnaCBXaUZpIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXNzd29yZD1dXG4gICAqIEBwYXJhbSBwYXNzd29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsZ29yaXRobT1OT05FXSAtIFdQQSwgV1BBIChmb3IgV1BBMiksIFdFUCBvciBOT05FIChOT05FIGJ5IGRlZmF1bHQpXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGNvbm5lY3Qoc3NpZDogc3RyaW5nIHwgbnVtYmVyLCBiaW5kQWxsPzogYm9vbGVhbiwgcGFzc3dvcmQ/OiBzdHJpbmcsIGFsZ29yaXRobT86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3QgKGN1cnJlbnQgaWYgU1NJRCBub3Qgc3VwcGxpZWQpXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kLCBpZiBwYXNzZWQgYW4gU1NJRCwgd2lsbCBmaXJzdCBkaXNhYmxlIHRoZSBuZXR3b3JrLCBhbmQgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgZGV2aWNlLiAgVG8gb25seSBcImRpc2Nvbm5lY3RcIiAoaWUgZGlzYWJsZSBpbiBhbmRyb2lkKSxcbiAgICogY2FsbCBXaWZpV2l6YXJkMi5kaXNhYmxlKCkgaW5zdGVhZCBvZiBkaXNjb25uZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkPWFsbF1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZGlzY29ubmVjdChzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgTmV0d29ya1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtzc2lkXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtiaW5kQWxsPWZhbHNlXSAtIFdoZXRoZXIgb3Igbm90IHRvIGJpbmQgYWxsIG5ldHdvcmsgcmVxdWVzdHMgdG8gdGhpcyB3aWZpIG5ldHdvcmtcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2FpdEZvckNvbm5lY3Rpb249ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nIHByb21pc2UgdW50aWwgY29ubmVjdGlvbiB0byB3aWZpIGlzIHZlcmlmaWVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIGVuYWJsZShzc2lkOiBzdHJpbmcgfCBudW1iZXIsIGJpbmRBbGw/OiBib29sZWFuLCB3YWl0Rm9yQ29ubmVjdGlvbj86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIE5ldHdvcmtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgZGlzYWJsZShzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbm5lY3QgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgYWNjZXNzIHBvaW50LCBldmVuIGlmIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gICAgcGxhdGZvcm1zOiBbJ0FuZHJvaWQnXSxcbiAgfSlcbiAgcmVhc3NvY2lhdGUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVjb25uZWN0IHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjY2VzcyBwb2ludCwgaWYgd2UgYXJlIGN1cnJlbnRseSBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIHJlY29ubmVjdCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnRseSBjb25maWd1cmVkIG5ldHdvcmtzXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBsaXN0TmV0d29ya3MoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgbmV0d29yayBzY2FuIGFuZCByZXR1cm4gcmVzdWx0c1xuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgc2NhbihvcHRpb25zPzogV2lmaVNjYW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgd2lmaSBuZXR3b3JrIHNjYW4gKHJlc3VsdHMgY2FuIGJlIHJldHJpZXZlZCB3aXRoIGdldFNjYW5SZXN1bHRzKVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgc3RhcnRTY2FuKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3aWZpIHNjYW4gcmVzdWx0cyAobXVzdCBjYWxsIHN0YXJ0U2NhbiBmaXJzdCwgb3IganVzdCB1c2Ugc2NhbigpKVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0U2NhblJlc3VsdHMob3B0aW9uczogV2lmaVNjYW5SZXN1bHRzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFdpRmkgaXMgZW5hYmxlZFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgaXNXaWZpRW5hYmxlZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgRGlzYWJsZSBXaUZpXG4gICAqXG4gICAqIEBwYXJhbSBlbmFibGVkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICAgIHBsYXRmb3JtczogWydBbmRyb2lkJ10sXG4gIH0pXG4gIHNldFdpZmlFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgV2lGaVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBlbmFibGVXaWZpKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgV2lGaVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgICBwbGF0Zm9ybXM6IFsnQW5kcm9pZCddLFxuICB9KVxuICBkaXNhYmxlV2lmaSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmQgTmV0d29ya1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgcmVzZXRCaW5kQWxsKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgTmV0d29ya1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgc2V0QmluZEFsbCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgV2lmaSBSb3V0ZXIgSVAgZnJvbSBESENQXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBnZXRXaWZpUm91dGVySVAoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IFdpZmkgSVBcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFdpZmlJUCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgV2lmaSBJUCBhbmQgU3VibmV0IEFkZHJlc3NcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIEpTT04gb2JqZWN0IHNpbWlsYXIgdG86IHsgXCJpcFwiOiBcIjAuMC4wLjBcIiwgXCJzdWJuZXRcIjogXCIwLjAuMC4wXCIgfVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0V2lmaUlQSW5mbygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTmV0d29yayBJRCBmcm9tIFNTSURcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGdldFNTSUROZXR3b3JrSUQoc3NpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnRseSBjb25uZWN0ZWQgbmV0d29yayBJRFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0Q29ubmVjdGVkTmV0d29ya0lEKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgY29ubmVjdGVkIG5ldHdvcmsgU1NJRFxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0Q29ubmVjdGVkU1NJRCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudGx5IGNvbm5lY3RlZCBuZXR3b3JrIEJTU0lEL01BQ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgZ2V0Q29ubmVjdGVkQlNTSUQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBXaUZpIGNvbm5lY3Rpb24gaGFzIGNvbm5lY3Rpb24gdG8gdGhlIGludGVybmV0XG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBpc0Nvbm5lY3RlZFRvSW50ZXJuZXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgd2UgY2FuIHBpbmcgY3VycmVudCBXaUZpIHJvdXRlciBJUCBhZGRyZXNzXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBAQ29yZG92YSh7XG4gICAgb3RoZXJQcm9taXNlOiB0cnVlLFxuICB9KVxuICBjYW5QaW5nV2lmaVJvdXRlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB2aWEgSFRUUCBjdXJyZW50IFdpRmkgcm91dGVyIElQIGFkZHJlc3NcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGNhbkNvbm5lY3RUb1JvdXRlcigpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50IFdpRmkgY29ubmVjdGlvbiBjYW4gY29ubmVjdCB0byBpbnRlcm5ldCAoY2hlY2tzIGNvbm5lY3Rpb24gdG8gZ29vZ2xlLmNvbSlcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIEBDb3Jkb3ZhKHtcbiAgICBvdGhlclByb21pc2U6IHRydWUsXG4gIH0pXG4gIGNhbkNvbm5lY3RUb0ludGVybmV0KCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgQUNDRVNTX0ZJTkVfTE9DQVRJT04gcGVybWlzc2lvblxuICAgKlxuICAgKiBUaGlzIHBlcm1pc3Npb24gaXMgcmVxdWlyZWQgYnkgQW5kcm9pZCB0byByZXR1cm4gc2NhbiByZXN1bHRzLCB5b3UgY2FuIG1hbnVhbGx5IHJlcXVlc3QgaXQgcHJpb3IgdG8gcnVubmluZyBgc2NhbmBcbiAgICogb3IgdGhpcyBwbHVnaW4gd2lsbCBhdXRvbWF0aWNhbGx5IGRvIGl0IHdoZW4gdGhlIHNjYW4gaXMgcmFuLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgQENvcmRvdmEoe1xuICAgIG90aGVyUHJvbWlzZTogdHJ1ZSxcbiAgfSlcbiAgcmVxdWVzdFBlcm1pc3Npb24oKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IFdpRmkgY29uZmlndXJhdGlvbiBmb3IgQW5kcm9pZCBEZXZpY2VzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW3NzaWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFzc3dvcmRdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxnb3JpdGhtXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0hpZGRlblNTSURdXG4gICAqIEByZXR1cm5zIHtXaWZpQ29uZmlnfGJvb2xlYW59XG4gICAqL1xuICBAQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUoKVxuICBmb3JtYXRXaWZpQ29uZmlnKFxuICAgIHNzaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIGFsZ29yaXRobTogc3RyaW5nLFxuICAgIGlzSGlkZGVuU1NJRDogYm9vbGVhblxuICApOiBXaWZpQ29uZmlnIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBXUEEgV2lGaSBjb25maWd1cmF0aW9uIGZvciBBbmRyb2lkIERldmljZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbc3NpZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNIaWRkZW5TU0lEXG4gICAqIEByZXR1cm5zIHtXaWZpQ29uZmlnfGJvb2xlYW59XG4gICAqL1xuICBAQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUoKVxuICBmb3JtYXRXUEFDb25maWcoc3NpZDogc3RyaW5nIHwgbnVtYmVyLCBwYXNzd29yZDogc3RyaW5nLCBpc0hpZGRlblNTSUQ6IGJvb2xlYW4pOiBXaWZpQ29uZmlnIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBXaUZpIFNTSUQgU3RyaW5nXG4gICAqXG4gICAqIEBwYXJhbSBzc2lkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgQENvcmRvdmFGdW5jdGlvbk92ZXJyaWRlKClcbiAgZm9ybWF0V2lmaVN0cmluZyhzc2lkOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBTbGVlcC9UaW1lb3V0IGBhd2FpdCB0aGlzLnRpbWVvdXQoKWBcbiAgICpcbiAgICogQHBhcmFtIGRlbGF5ICB0aGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCAoZGVmYXVsdCAyIHNlY29uZHMpXG4gICAqL1xuICBAQ29yZG92YUZ1bmN0aW9uT3ZlcnJpZGUoKVxuICB0aW1lb3V0KGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiJdfQ== |
@@ -1,1 +0,1 @@ | ||
[{"__symbolic":"module","version":4,"metadata":{"WifiConfig":{"__symbolic":"interface"},"WifiScanResultsOptions":{"__symbolic":"interface"},"WifiScanOptions":{"__symbolic":"interface"},"WifiWizard2":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@awesome-cordova-plugins/core","name":"AwesomeCordovaNativePlugin","line":438,"character":33},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":437,"character":1}}],"members":{"iOSConnectNetwork":[{"__symbolic":"method"}],"iOSDisconnectNetwork":[{"__symbolic":"method"}],"add":[{"__symbolic":"method"}],"remove":[{"__symbolic":"method"}],"connect":[{"__symbolic":"method"}],"disconnect":[{"__symbolic":"method"}],"enable":[{"__symbolic":"method"}],"disable":[{"__symbolic":"method"}],"reassociate":[{"__symbolic":"method"}],"reconnect":[{"__symbolic":"method"}],"listNetworks":[{"__symbolic":"method"}],"scan":[{"__symbolic":"method"}],"startScan":[{"__symbolic":"method"}],"getScanResults":[{"__symbolic":"method"}],"isWifiEnabled":[{"__symbolic":"method"}],"setWifiEnabled":[{"__symbolic":"method"}],"enableWifi":[{"__symbolic":"method"}],"disableWifi":[{"__symbolic":"method"}],"resetBindAll":[{"__symbolic":"method"}],"setBindAll":[{"__symbolic":"method"}],"getWifiRouterIP":[{"__symbolic":"method"}],"getWifiIP":[{"__symbolic":"method"}],"getWifiIPInfo":[{"__symbolic":"method"}],"getSSIDNetworkID":[{"__symbolic":"method"}],"getConnectedNetworkID":[{"__symbolic":"method"}],"getConnectedSSID":[{"__symbolic":"method"}],"getConnectedBSSID":[{"__symbolic":"method"}],"isConnectedToInternet":[{"__symbolic":"method"}],"canPingWifiRouter":[{"__symbolic":"method"}],"canConnectToRouter":[{"__symbolic":"method"}],"canConnectToInternet":[{"__symbolic":"method"}],"requestPermission":[{"__symbolic":"method"}],"formatWifiConfig":[{"__symbolic":"method"}],"formatWPAConfig":[{"__symbolic":"method"}],"formatWifiString":[{"__symbolic":"method"}],"timeout":[{"__symbolic":"method"}]}}}}] | ||
[{"__symbolic":"module","version":4,"metadata":{"WifiConfig":{"__symbolic":"interface"},"WifiScanResultsOptions":{"__symbolic":"interface"},"WifiScanOptions":{"__symbolic":"interface"},"WifiWizard2":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@awesome-cordova-plugins/core","name":"AwesomeCordovaNativePlugin","line":437,"character":33},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":436,"character":1}}],"members":{"iOSConnectNetwork":[{"__symbolic":"method"}],"iOSDisconnectNetwork":[{"__symbolic":"method"}],"add":[{"__symbolic":"method"}],"remove":[{"__symbolic":"method"}],"connect":[{"__symbolic":"method"}],"disconnect":[{"__symbolic":"method"}],"enable":[{"__symbolic":"method"}],"disable":[{"__symbolic":"method"}],"reassociate":[{"__symbolic":"method"}],"reconnect":[{"__symbolic":"method"}],"listNetworks":[{"__symbolic":"method"}],"scan":[{"__symbolic":"method"}],"startScan":[{"__symbolic":"method"}],"getScanResults":[{"__symbolic":"method"}],"isWifiEnabled":[{"__symbolic":"method"}],"setWifiEnabled":[{"__symbolic":"method"}],"enableWifi":[{"__symbolic":"method"}],"disableWifi":[{"__symbolic":"method"}],"resetBindAll":[{"__symbolic":"method"}],"setBindAll":[{"__symbolic":"method"}],"getWifiRouterIP":[{"__symbolic":"method"}],"getWifiIP":[{"__symbolic":"method"}],"getWifiIPInfo":[{"__symbolic":"method"}],"getSSIDNetworkID":[{"__symbolic":"method"}],"getConnectedNetworkID":[{"__symbolic":"method"}],"getConnectedSSID":[{"__symbolic":"method"}],"getConnectedBSSID":[{"__symbolic":"method"}],"isConnectedToInternet":[{"__symbolic":"method"}],"canPingWifiRouter":[{"__symbolic":"method"}],"canConnectToRouter":[{"__symbolic":"method"}],"canConnectToInternet":[{"__symbolic":"method"}],"requestPermission":[{"__symbolic":"method"}],"formatWifiConfig":[{"__symbolic":"method"}],"formatWPAConfig":[{"__symbolic":"method"}],"formatWifiString":[{"__symbolic":"method"}],"timeout":[{"__symbolic":"method"}]}}}}] |
@@ -1,1 +0,1 @@ | ||
{"description":"Awesome Cordova Plugins - Native plugins for ionic apps","main":"bundle.js","module":"index.js","typings":"index.d.ts","author":"ionic","license":"MIT","repository":{"type":"git","url":"https://github.com/danielsogl/awesome-cordova-plugins.git"},"name":"@awesome-cordova-plugins/wifi-wizard-2","dependencies":{"@types/cordova":"latest"},"peerDependencies":{"rxjs":"^5.5.0 || ^6.5.0","@awesome-cordova-plugins/core":"^5.1.0"},"version":"5.36.0"} | ||
{"description":"Awesome Cordova Plugins - Native plugins for ionic apps","main":"bundle.js","module":"index.js","typings":"index.d.ts","author":"ionic","license":"MIT","repository":{"type":"git","url":"https://github.com/danielsogl/awesome-cordova-plugins.git"},"name":"@awesome-cordova-plugins/wifi-wizard-2","dependencies":{"@types/cordova":"latest"},"peerDependencies":{"rxjs":"^5.5.0 || ^7.3.0","@awesome-cordova-plugins/core":"^5.1.0"},"version":"5.36.1"} |
@@ -1,1 +0,1 @@ | ||
{"description":"Awesome Cordova Plugins - Native plugins for ionic apps","main":"bundle.js","module":"index.js","typings":"index.d.ts","author":"ionic","license":"MIT","repository":{"type":"git","url":"https://github.com/danielsogl/awesome-cordova-plugins.git"},"name":"@awesome-cordova-plugins/wifi-wizard-2","dependencies":{"@types/cordova":"latest"},"peerDependencies":{"rxjs":"^5.5.0 || ^6.5.0","@awesome-cordova-plugins/core":"^5.1.0"},"version":"5.36.0"} | ||
{"description":"Awesome Cordova Plugins - Native plugins for ionic apps","main":"bundle.js","module":"index.js","typings":"index.d.ts","author":"ionic","license":"MIT","repository":{"type":"git","url":"https://github.com/danielsogl/awesome-cordova-plugins.git"},"name":"@awesome-cordova-plugins/wifi-wizard-2","dependencies":{"@types/cordova":"latest"},"peerDependencies":{"rxjs":"^5.5.0 || ^7.3.0","@awesome-cordova-plugins/core":"^5.1.0"},"version":"5.36.1"} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
165051
1548
8
2
0