UNPKG

kwikid-components

Version:
208 lines 24.4 kB
import { __awaiter } from "tslib"; import { LOCATION_TIMEOUT } from "./permission-checker.constants"; // Platform detection utilities export function detectDeviceType() { const userAgent = navigator.userAgent || navigator.vendor || window.opera; if (/android/i.test(userAgent)) { return "android"; } if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) { return "ios"; } return "windows"; } /** * Request microphone permission * @returns Promise resolving to an object with success status and optional error */ export function requestMicrophonePermission() { return __awaiter(this, void 0, void 0, function* () { try { const stream = yield navigator.mediaDevices.getUserMedia({ audio: true }); // Stop the stream immediately as we only need to confirm permission stream.getTracks().forEach((track) => track.stop()); return { granted: true }; } catch (error) { return { granted: false, error }; } }); } export function requestLocationPermission() { return __awaiter(this, void 0, void 0, function* () { try { if (!navigator.geolocation) { return { granted: false, error: "Geolocation not supported" }; } if ("permissions" in navigator) { try { const permission = yield navigator.permissions.query({ name: "geolocation" }); if (permission.state === "granted") { return { granted: true }; } if (permission.state === "denied") { return { granted: false, error: "Permission denied" }; } // If 'prompt', fall through to getCurrentPosition to trigger the popup } catch (permissionError) { console.warn("Permissions API failed:", permissionError); } } return yield new Promise((resolve) => { const timeoutId = setTimeout(() => { resolve({ granted: false, error: "Location request timeout" }); }, LOCATION_TIMEOUT); navigator.geolocation.getCurrentPosition((position) => { clearTimeout(timeoutId); resolve({ granted: true }); }, (error) => { clearTimeout(timeoutId); resolve({ granted: false, error }); }, { timeout: LOCATION_TIMEOUT, maximumAge: 0, enableHighAccuracy: false }); }); } catch (error) { return { granted: false, error }; } }); } /** * Checks if the device has both front and back cameras * @returns Promise that resolves to an object containing camera availability info */ export function checkCameraAvailability() { return __awaiter(this, void 0, void 0, function* () { try { const devices = yield navigator.mediaDevices.enumerateDevices(); const videoDevices = devices.filter((device) => device.kind === "videoinput"); // If there are no video devices if (videoDevices.length === 0) { return { isFrontCamera: false, isBackCamera: false }; } // If there's only one camera, we assume it's the front camera by default // More sophisticated checks could inspect device labels if available if (videoDevices.length === 1) { return { isFrontCamera: true, isBackCamera: false }; } // If there are at least two cameras, we assume there are both front and back cameras return { isFrontCamera: true, isBackCamera: true }; } catch (error) { console.error("Error checking camera availability:", error); return { isFrontCamera: false, isBackCamera: false, error }; } }); } /** * Tests the front camera * @returns Promise resolving to result object with granted status and optional stream/error */ export function testFrontCamera() { return __awaiter(this, void 0, void 0, function* () { console.log("Testing front camera"); try { // Request front camera stream const frontStream = yield navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" } }); console.log("Front camera test successful"); // The stream is returned to be stopped by the caller after verification if needed return { granted: true, stream: frontStream }; } catch (error) { console.error("Front camera test failed:", error); return { granted: false, error }; } }); } /** * Tests the back camera * @returns Promise resolving to result object with granted status and optional stream/error */ export function testBackCamera() { return __awaiter(this, void 0, void 0, function* () { console.log("Testing back camera"); try { // Request back camera stream const backStream = yield navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" } }); console.log("Back camera test successful"); // The stream is returned to be stopped by the caller after verification if needed return { granted: true, stream: backStream }; } catch (error) { console.error("Back camera test failed:", error); return { granted: false, error }; } }); } /** * Tests both front and back cameras * @param bothRequired Whether both cameras are required for success * @returns Promise resolving to result object with status of both cameras */ export function testBothCamera(bothRequired = true) { return __awaiter(this, void 0, void 0, function* () { console.log("Testing both cameras"); // Test front camera const frontResult = yield testFrontCamera(); console.log("Front camera test result:", frontResult.granted); // Stop front camera stream to free the camera before testing the back if (frontResult.stream) { frontResult.stream.getTracks().forEach((track) => track.stop()); } // Test back camera const backResult = yield testBackCamera(); console.log("Back camera test result:", backResult.granted); // Stop back camera stream if (backResult.stream) { backResult.stream.getTracks().forEach((track) => track.stop()); } // Determine overall result based on requirements const allGranted = bothRequired ? frontResult.granted && backResult.granted : frontResult.granted || backResult.granted; // Create error message if needed let errorMessage; if (!allGranted) { errorMessage = "Camera permission issue:"; if (!frontResult.granted) errorMessage += " Front camera not available."; if (!backResult.granted) errorMessage += " Back camera not available."; } return { frontCamera: { granted: frontResult.granted, error: frontResult.error }, backCamera: { granted: backResult.granted, error: backResult.error }, allGranted, errorMessage }; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsK0JBQStCO0FBQy9CLE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxTQUFTLEdBQ2IsU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFLLE1BQWMsQ0FBQyxLQUFLLENBQUM7SUFFbkUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzlCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxNQUFjLENBQUMsUUFBUSxFQUFFO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFnQiwyQkFBMkI7O1FBSS9DLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsb0VBQW9FO1lBQ3BFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztDQUFBO0FBRUQsTUFBTSxVQUFnQix5QkFBeUI7O1FBSTdDLElBQUk7WUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLENBQUM7YUFDL0Q7WUFFRCxJQUFJLGFBQWEsSUFBSSxTQUFTLEVBQUU7Z0JBQzlCLElBQUk7b0JBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzt3QkFDbkQsSUFBSSxFQUFFLGFBQWE7cUJBQ3BCLENBQUMsQ0FBQztvQkFFSCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO3dCQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUMxQjtvQkFFRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO3dCQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztxQkFDdkQ7b0JBRUQsdUVBQXVFO2lCQUN4RTtnQkFBQyxPQUFPLGVBQWUsRUFBRTtvQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxlQUFlLENBQUMsQ0FBQztpQkFDMUQ7YUFDRjtZQUVELE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBb0MsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDdEUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFFckIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDdEMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDWCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hCLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDUixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hCLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDckMsQ0FBQyxFQUNEO29CQUNFLE9BQU8sRUFBRSxnQkFBZ0I7b0JBQ3pCLFVBQVUsRUFBRSxDQUFDO29CQUNiLGtCQUFrQixFQUFFLEtBQUs7aUJBQzFCLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFnQix1QkFBdUI7O1FBSzNDLElBQUk7WUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUNqQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLENBQ3pDLENBQUM7WUFFRixnQ0FBZ0M7WUFDaEMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ3REO1lBRUQseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDckQ7WUFFRCxxRkFBcUY7WUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3BEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDN0Q7SUFDSCxDQUFDO0NBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLGVBQWU7O1FBS25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwQyxJQUFJO1lBQ0YsOEJBQThCO1lBQzlCLE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQzVELEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7YUFDOUIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzVDLGtGQUFrRjtZQUNsRixPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE1BQU0sRUFBRSxXQUFXO2FBQ3BCLENBQUM7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUs7YUFDTixDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLGNBQWM7O1FBS2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxJQUFJO1lBQ0YsNkJBQTZCO1lBQzdCLE1BQU0sVUFBVSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQzNELEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUU7YUFDckMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzNDLGtGQUFrRjtZQUNsRixPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE1BQU0sRUFBRSxVQUFVO2FBQ25CLENBQUM7U0FDSDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUs7YUFDTixDQUFDO1NBQ0g7SUFDSCxDQUFDO0NBQUE7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFnQixjQUFjLENBQUMsWUFBWSxHQUFHLElBQUk7O1FBTXRELE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVwQyxvQkFBb0I7UUFDcEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxlQUFlLEVBQUUsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RCxzRUFBc0U7UUFDdEUsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNqRTtRQUVELG1CQUFtQjtRQUNuQixNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVELDBCQUEwQjtRQUMxQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDckIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0sVUFBVSxHQUFHLFlBQVk7WUFDN0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU87WUFDM0MsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUU5QyxpQ0FBaUM7UUFDakMsSUFBSSxZQUFZLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLFlBQVksR0FBRywwQkFBMEIsQ0FBQztZQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87Z0JBQUUsWUFBWSxJQUFJLDhCQUE4QixDQUFDO1lBQ3pFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTztnQkFBRSxZQUFZLElBQUksNkJBQTZCLENBQUM7U0FDeEU7UUFFRCxPQUFPO1lBQ0wsV0FBVyxFQUFFO2dCQUNYLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDNUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2FBQ3pCO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztnQkFDM0IsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2FBQ3hCO1lBQ0QsVUFBVTtZQUNWLFlBQVk7U0FDYixDQUFDO0lBQ0osQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGV2aWNlVHlwZSwgTE9DQVRJT05fVElNRU9VVCB9IGZyb20gXCIuL3Blcm1pc3Npb24tY2hlY2tlci5jb25zdGFudHNcIjtcblxuLy8gUGxhdGZvcm0gZGV0ZWN0aW9uIHV0aWxpdGllc1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdERldmljZVR5cGUoKTogRGV2aWNlVHlwZSB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9XG4gICAgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8ICh3aW5kb3cgYXMgYW55KS5vcGVyYTtcblxuICBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICByZXR1cm4gXCJhbmRyb2lkXCI7XG4gIH1cblxuICBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSAmJiAhKHdpbmRvdyBhcyBhbnkpLk1TU3RyZWFtKSB7XG4gICAgcmV0dXJuIFwiaW9zXCI7XG4gIH1cblxuICByZXR1cm4gXCJ3aW5kb3dzXCI7XG59XG5cbi8qKlxuICogUmVxdWVzdCBtaWNyb3Bob25lIHBlcm1pc3Npb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdE1pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBlcnJvcj86IGFueTtcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgIC8vIFN0b3AgdGhlIHN0cmVhbSBpbW1lZGlhdGVseSBhcyB3ZSBvbmx5IG5lZWQgdG8gY29uZmlybSBwZXJtaXNzaW9uXG4gICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IHRydWUgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4geyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9uUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgaWYgKCFuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvcjogXCJHZW9sb2NhdGlvbiBub3Qgc3VwcG9ydGVkXCIgfTtcbiAgICB9XG5cbiAgICBpZiAoXCJwZXJtaXNzaW9uc1wiIGluIG5hdmlnYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IGF3YWl0IG5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJnZW9sb2NhdGlvblwiXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uLnN0YXRlID09PSBcImdyYW50ZWRcIikge1xuICAgICAgICAgIHJldHVybiB7IGdyYW50ZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJtaXNzaW9uLnN0YXRlID09PSBcImRlbmllZFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UsIGVycm9yOiBcIlBlcm1pc3Npb24gZGVuaWVkXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmICdwcm9tcHQnLCBmYWxsIHRocm91Z2ggdG8gZ2V0Q3VycmVudFBvc2l0aW9uIHRvIHRyaWdnZXIgdGhlIHBvcHVwXG4gICAgICB9IGNhdGNoIChwZXJtaXNzaW9uRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiUGVybWlzc2lvbnMgQVBJIGZhaWxlZDpcIiwgcGVybWlzc2lvbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8eyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9PigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3I6IFwiTG9jYXRpb24gcmVxdWVzdCB0aW1lb3V0XCIgfSk7XG4gICAgICB9LCBMT0NBVElPTl9USU1FT1VUKTtcblxuICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGdyYW50ZWQ6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0aW1lb3V0OiBMT0NBVElPTl9USU1FT1VULFxuICAgICAgICAgIG1heGltdW1BZ2U6IDAsXG4gICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvciB9O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaGFzIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIGNhbWVyYSBhdmFpbGFiaWxpdHkgaW5mb1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDYW1lcmFBdmFpbGFiaWxpdHkoKTogUHJvbWlzZTx7XG4gIGlzRnJvbnRDYW1lcmE6IGJvb2xlYW47XG4gIGlzQmFja0NhbWVyYTogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIGNvbnN0IHZpZGVvRGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKFxuICAgICAgKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiXG4gICAgKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB2aWRlbyBkZXZpY2VzXG4gICAgaWYgKHZpZGVvRGV2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IGZhbHNlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjYW1lcmEsIHdlIGFzc3VtZSBpdCdzIHRoZSBmcm9udCBjYW1lcmEgYnkgZGVmYXVsdFxuICAgIC8vIE1vcmUgc29waGlzdGljYXRlZCBjaGVja3MgY291bGQgaW5zcGVjdCBkZXZpY2UgbGFiZWxzIGlmIGF2YWlsYWJsZVxuICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4geyBpc0Zyb250Q2FtZXJhOiB0cnVlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBjYW1lcmFzLCB3ZSBhc3N1bWUgdGhlcmUgYXJlIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IHRydWUsIGlzQmFja0NhbWVyYTogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjaGVja2luZyBjYW1lcmEgYXZhaWxhYmlsaXR5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgaXNGcm9udENhbWVyYTogZmFsc2UsIGlzQmFja0NhbWVyYTogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZnJvbnQgY2FtZXJhXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggZ3JhbnRlZCBzdGF0dXMgYW5kIG9wdGlvbmFsIHN0cmVhbS9lcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEZyb250Q2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBmcm9udCBjYW1lcmFcIik7XG4gIHRyeSB7XG4gICAgLy8gUmVxdWVzdCBmcm9udCBjYW1lcmEgc3RyZWFtXG4gICAgY29uc3QgZnJvbnRTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcInVzZXJcIiB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBmcm9udFN0cmVhbVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkZyb250IGNhbWVyYSB0ZXN0IGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiBmYWxzZSxcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3RzIHRoZSBiYWNrIGNhbWVyYVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gcmVzdWx0IG9iamVjdCB3aXRoIGdyYW50ZWQgc3RhdHVzIGFuZCBvcHRpb25hbCBzdHJlYW0vZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RCYWNrQ2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBiYWNrIGNhbWVyYVwiKTtcbiAgdHJ5IHtcbiAgICAvLyBSZXF1ZXN0IGJhY2sgY2FtZXJhIHN0cmVhbVxuICAgIGNvbnN0IGJhY2tTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcImVudmlyb25tZW50XCIgfVxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBiYWNrU3RyZWFtXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQmFjayBjYW1lcmEgdGVzdCBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnRlZDogZmFsc2UsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyBib3RoIGZyb250IGFuZCBiYWNrIGNhbWVyYXNcbiAqIEBwYXJhbSBib3RoUmVxdWlyZWQgV2hldGhlciBib3RoIGNhbWVyYXMgYXJlIHJlcXVpcmVkIGZvciBzdWNjZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggc3RhdHVzIG9mIGJvdGggY2FtZXJhc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEJvdGhDYW1lcmEoYm90aFJlcXVpcmVkID0gdHJ1ZSk6IFByb21pc2U8e1xuICBmcm9udENhbWVyYTogeyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9O1xuICBiYWNrQ2FtZXJhOiB7IGdyYW50ZWQ6IGJvb2xlYW47IGVycm9yPzogYW55IH07XG4gIGFsbEdyYW50ZWQ6IGJvb2xlYW47XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn0+IHtcbiAgY29uc29sZS5sb2coXCJUZXN0aW5nIGJvdGggY2FtZXJhc1wiKTtcblxuICAvLyBUZXN0IGZyb250IGNhbWVyYVxuICBjb25zdCBmcm9udFJlc3VsdCA9IGF3YWl0IHRlc3RGcm9udENhbWVyYSgpO1xuICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgZnJvbnRSZXN1bHQuZ3JhbnRlZCk7XG5cbiAgLy8gU3RvcCBmcm9udCBjYW1lcmEgc3RyZWFtIHRvIGZyZWUgdGhlIGNhbWVyYSBiZWZvcmUgdGVzdGluZyB0aGUgYmFja1xuICBpZiAoZnJvbnRSZXN1bHQuc3RyZWFtKSB7XG4gICAgZnJvbnRSZXN1bHQuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICB9XG5cbiAgLy8gVGVzdCBiYWNrIGNhbWVyYVxuICBjb25zdCBiYWNrUmVzdWx0ID0gYXdhaXQgdGVzdEJhY2tDYW1lcmEoKTtcbiAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgYmFja1Jlc3VsdC5ncmFudGVkKTtcblxuICAvLyBTdG9wIGJhY2sgY2FtZXJhIHN0cmVhbVxuICBpZiAoYmFja1Jlc3VsdC5zdHJlYW0pIHtcbiAgICBiYWNrUmVzdWx0LnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBvdmVyYWxsIHJlc3VsdCBiYXNlZCBvbiByZXF1aXJlbWVudHNcbiAgY29uc3QgYWxsR3JhbnRlZCA9IGJvdGhSZXF1aXJlZFxuICAgID8gZnJvbnRSZXN1bHQuZ3JhbnRlZCAmJiBiYWNrUmVzdWx0LmdyYW50ZWRcbiAgICA6IGZyb250UmVzdWx0LmdyYW50ZWQgfHwgYmFja1Jlc3VsdC5ncmFudGVkO1xuXG4gIC8vIENyZWF0ZSBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZFxuICBsZXQgZXJyb3JNZXNzYWdlO1xuICBpZiAoIWFsbEdyYW50ZWQpIHtcbiAgICBlcnJvck1lc3NhZ2UgPSBcIkNhbWVyYSBwZXJtaXNzaW9uIGlzc3VlOlwiO1xuICAgIGlmICghZnJvbnRSZXN1bHQuZ3JhbnRlZCkgZXJyb3JNZXNzYWdlICs9IFwiIEZyb250IGNhbWVyYSBub3QgYXZhaWxhYmxlLlwiO1xuICAgIGlmICghYmFja1Jlc3VsdC5ncmFudGVkKSBlcnJvck1lc3NhZ2UgKz0gXCIgQmFjayBjYW1lcmEgbm90IGF2YWlsYWJsZS5cIjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbnRDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGZyb250UmVzdWx0LmdyYW50ZWQsXG4gICAgICBlcnJvcjogZnJvbnRSZXN1bHQuZXJyb3JcbiAgICB9LFxuICAgIGJhY2tDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGJhY2tSZXN1bHQuZ3JhbnRlZCxcbiAgICAgIGVycm9yOiBiYWNrUmVzdWx0LmVycm9yXG4gICAgfSxcbiAgICBhbGxHcmFudGVkLFxuICAgIGVycm9yTWVzc2FnZVxuICB9O1xufVxuIl19