kwikid-components
Version:
KwikID's Components Library
179 lines • 20.8 kB
JavaScript
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 };
}
});
}
/**
* Request location permission
* @returns Promise resolving to an object with success status and optional error
*/
export function requestLocationPermission() {
return __awaiter(this, void 0, void 0, function* () {
try {
return yield new Promise((resolve) => {
navigator.geolocation.getCurrentPosition(() => resolve({ granted: true }), (error) => resolve({ granted: false, error }), { timeout: LOCATION_TIMEOUT, maximumAge: 0 });
});
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wZXJtaXNzaW9uLWNoZWNrZXIvcGVybWlzc2lvbi1jaGVja2VyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFjLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsK0JBQStCO0FBQy9CLE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsTUFBTSxTQUFTLEdBQ2IsU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFLLE1BQWMsQ0FBQyxLQUFLLENBQUM7SUFFbkUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzlCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxNQUFjLENBQUMsUUFBUSxFQUFFO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFnQiwyQkFBMkI7O1FBSS9DLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsb0VBQW9FO1lBQ3BFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDMUI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9B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SUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNoRTtRQUVELGlEQUFpRDtRQUNqRCxNQUFNLFVBQVUsR0FBRyxZQUFZO1lBQzdCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPO1lBQzNDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFFOUMsaUNBQWlDO1FBQ2pDLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixZQUFZLEdBQUcsMEJBQTBCLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO2dCQUFFLFlBQVksSUFBSSw4QkFBOEIsQ0FBQztZQUN6RSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Z0JBQUUsWUFBWSxJQUFJLDZCQUE2QixDQUFDO1NBQ3hFO1FBRUQsT0FBTztZQUNMLFdBQVcsRUFBRTtnQkFDWCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87Z0JBQzVCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSzthQUN6QjtZQUNELFVBQVUsRUFBRTtnQkFDVixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87Z0JBQzNCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSzthQUN4QjtZQUNELFVBQVU7WUFDVixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERldmljZVR5cGUsIExPQ0FUSU9OX1RJTUVPVVQgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLWNoZWNrZXIuY29uc3RhbnRzXCI7XG5cbi8vIFBsYXRmb3JtIGRldGVjdGlvbiB1dGlsaXRpZXNcbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3REZXZpY2VUeXBlKCk6IERldmljZVR5cGUge1xuICBjb25zdCB1c2VyQWdlbnQgPVxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvciB8fCAod2luZG93IGFzIGFueSkub3BlcmE7XG5cbiAgaWYgKC9hbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgcmV0dXJuIFwiYW5kcm9pZFwiO1xuICB9XG5cbiAgaWYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVzZXJBZ2VudCkgJiYgISh3aW5kb3cgYXMgYW55KS5NU1N0cmVhbSkge1xuICAgIHJldHVybiBcImlvc1wiO1xuICB9XG5cbiAgcmV0dXJuIFwid2luZG93c1wiO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgbWljcm9waG9uZSBwZXJtaXNzaW9uXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3Qgd2l0aCBzdWNjZXNzIHN0YXR1cyBhbmQgb3B0aW9uYWwgZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RNaWNyb3Bob25lUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAvLyBTdG9wIHRoZSBzdHJlYW0gaW1tZWRpYXRlbHkgYXMgd2Ugb25seSBuZWVkIHRvIGNvbmZpcm0gcGVybWlzc2lvblxuICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgICByZXR1cm4geyBncmFudGVkOiB0cnVlIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZ3JhbnRlZDogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGxvY2F0aW9uIHBlcm1pc3Npb25cbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBvcHRpb25hbCBlcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9uUGVybWlzc2lvbigpOiBQcm9taXNlPHtcbiAgZ3JhbnRlZDogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPHsgZ3JhbnRlZDogYm9vbGVhbjsgZXJyb3I/OiBhbnkgfT4oKHJlc29sdmUpID0+IHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgICgpID0+IHJlc29sdmUoeyBncmFudGVkOiB0cnVlIH0pLFxuICAgICAgICAoZXJyb3IpID0+IHJlc29sdmUoeyBncmFudGVkOiBmYWxzZSwgZXJyb3IgfSksXG4gICAgICAgIHsgdGltZW91dDogTE9DQVRJT05fVElNRU9VVCwgbWF4aW11bUFnZTogMCB9XG4gICAgICApO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGdyYW50ZWQ6IGZhbHNlLCBlcnJvciB9O1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaGFzIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIGNhbWVyYSBhdmFpbGFiaWxpdHkgaW5mb1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDYW1lcmFBdmFpbGFiaWxpdHkoKTogUHJvbWlzZTx7XG4gIGlzRnJvbnRDYW1lcmE6IGJvb2xlYW47XG4gIGlzQmFja0NhbWVyYTogYm9vbGVhbjtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGV2aWNlcyA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuICAgIGNvbnN0IHZpZGVvRGV2aWNlcyA9IGRldmljZXMuZmlsdGVyKFxuICAgICAgKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiXG4gICAgKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyB2aWRlbyBkZXZpY2VzXG4gICAgaWYgKHZpZGVvRGV2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IGZhbHNlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjYW1lcmEsIHdlIGFzc3VtZSBpdCdzIHRoZSBmcm9udCBjYW1lcmEgYnkgZGVmYXVsdFxuICAgIC8vIE1vcmUgc29waGlzdGljYXRlZCBjaGVja3MgY291bGQgaW5zcGVjdCBkZXZpY2UgbGFiZWxzIGlmIGF2YWlsYWJsZVxuICAgIGlmICh2aWRlb0RldmljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4geyBpc0Zyb250Q2FtZXJhOiB0cnVlLCBpc0JhY2tDYW1lcmE6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBjYW1lcmFzLCB3ZSBhc3N1bWUgdGhlcmUgYXJlIGJvdGggZnJvbnQgYW5kIGJhY2sgY2FtZXJhc1xuICAgIHJldHVybiB7IGlzRnJvbnRDYW1lcmE6IHRydWUsIGlzQmFja0NhbWVyYTogdHJ1ZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjaGVja2luZyBjYW1lcmEgYXZhaWxhYmlsaXR5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgaXNGcm9udENhbWVyYTogZmFsc2UsIGlzQmFja0NhbWVyYTogZmFsc2UsIGVycm9yIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyB0aGUgZnJvbnQgY2FtZXJhXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggZ3JhbnRlZCBzdGF0dXMgYW5kIG9wdGlvbmFsIHN0cmVhbS9lcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEZyb250Q2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBmcm9udCBjYW1lcmFcIik7XG4gIHRyeSB7XG4gICAgLy8gUmVxdWVzdCBmcm9udCBjYW1lcmEgc3RyZWFtXG4gICAgY29uc3QgZnJvbnRTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcInVzZXJcIiB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBmcm9udFN0cmVhbVxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkZyb250IGNhbWVyYSB0ZXN0IGZhaWxlZDpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiBmYWxzZSxcbiAgICAgIGVycm9yXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3RzIHRoZSBiYWNrIGNhbWVyYVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gcmVzdWx0IG9iamVjdCB3aXRoIGdyYW50ZWQgc3RhdHVzIGFuZCBvcHRpb25hbCBzdHJlYW0vZXJyb3JcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RCYWNrQ2FtZXJhKCk6IFByb21pc2U8e1xuICBncmFudGVkOiBib29sZWFuO1xuICBzdHJlYW0/OiBNZWRpYVN0cmVhbTtcbiAgZXJyb3I/OiBhbnk7XG59PiB7XG4gIGNvbnNvbGUubG9nKFwiVGVzdGluZyBiYWNrIGNhbWVyYVwiKTtcbiAgdHJ5IHtcbiAgICAvLyBSZXF1ZXN0IGJhY2sgY2FtZXJhIHN0cmVhbVxuICAgIGNvbnN0IGJhY2tTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiBcImVudmlyb25tZW50XCIgfVxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHN1Y2Nlc3NmdWxcIik7XG4gICAgLy8gVGhlIHN0cmVhbSBpcyByZXR1cm5lZCB0byBiZSBzdG9wcGVkIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdmVyaWZpY2F0aW9uIGlmIG5lZWRlZFxuICAgIHJldHVybiB7XG4gICAgICBncmFudGVkOiB0cnVlLFxuICAgICAgc3RyZWFtOiBiYWNrU3RyZWFtXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQmFjayBjYW1lcmEgdGVzdCBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ3JhbnRlZDogZmFsc2UsXG4gICAgICBlcnJvclxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0cyBib3RoIGZyb250IGFuZCBiYWNrIGNhbWVyYXNcbiAqIEBwYXJhbSBib3RoUmVxdWlyZWQgV2hldGhlciBib3RoIGNhbWVyYXMgYXJlIHJlcXVpcmVkIGZvciBzdWNjZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byByZXN1bHQgb2JqZWN0IHdpdGggc3RhdHVzIG9mIGJvdGggY2FtZXJhc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdEJvdGhDYW1lcmEoYm90aFJlcXVpcmVkID0gdHJ1ZSk6IFByb21pc2U8e1xuICBmcm9udENhbWVyYTogeyBncmFudGVkOiBib29sZWFuOyBlcnJvcj86IGFueSB9O1xuICBiYWNrQ2FtZXJhOiB7IGdyYW50ZWQ6IGJvb2xlYW47IGVycm9yPzogYW55IH07XG4gIGFsbEdyYW50ZWQ6IGJvb2xlYW47XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn0+IHtcbiAgY29uc29sZS5sb2coXCJUZXN0aW5nIGJvdGggY2FtZXJhc1wiKTtcblxuICAvLyBUZXN0IGZyb250IGNhbWVyYVxuICBjb25zdCBmcm9udFJlc3VsdCA9IGF3YWl0IHRlc3RGcm9udENhbWVyYSgpO1xuICBjb25zb2xlLmxvZyhcIkZyb250IGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgZnJvbnRSZXN1bHQuZ3JhbnRlZCk7XG5cbiAgLy8gU3RvcCBmcm9udCBjYW1lcmEgc3RyZWFtIHRvIGZyZWUgdGhlIGNhbWVyYSBiZWZvcmUgdGVzdGluZyB0aGUgYmFja1xuICBpZiAoZnJvbnRSZXN1bHQuc3RyZWFtKSB7XG4gICAgZnJvbnRSZXN1bHQuc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHRyYWNrKSA9PiB0cmFjay5zdG9wKCkpO1xuICB9XG5cbiAgLy8gVGVzdCBiYWNrIGNhbWVyYVxuICBjb25zdCBiYWNrUmVzdWx0ID0gYXdhaXQgdGVzdEJhY2tDYW1lcmEoKTtcbiAgY29uc29sZS5sb2coXCJCYWNrIGNhbWVyYSB0ZXN0IHJlc3VsdDpcIiwgYmFja1Jlc3VsdC5ncmFudGVkKTtcblxuICAvLyBTdG9wIGJhY2sgY2FtZXJhIHN0cmVhbVxuICBpZiAoYmFja1Jlc3VsdC5zdHJlYW0pIHtcbiAgICBiYWNrUmVzdWx0LnN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBvdmVyYWxsIHJlc3VsdCBiYXNlZCBvbiByZXF1aXJlbWVudHNcbiAgY29uc3QgYWxsR3JhbnRlZCA9IGJvdGhSZXF1aXJlZFxuICAgID8gZnJvbnRSZXN1bHQuZ3JhbnRlZCAmJiBiYWNrUmVzdWx0LmdyYW50ZWRcbiAgICA6IGZyb250UmVzdWx0LmdyYW50ZWQgfHwgYmFja1Jlc3VsdC5ncmFudGVkO1xuXG4gIC8vIENyZWF0ZSBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZFxuICBsZXQgZXJyb3JNZXNzYWdlO1xuICBpZiAoIWFsbEdyYW50ZWQpIHtcbiAgICBlcnJvck1lc3NhZ2UgPSBcIkNhbWVyYSBwZXJtaXNzaW9uIGlzc3VlOlwiO1xuICAgIGlmICghZnJvbnRSZXN1bHQuZ3JhbnRlZCkgZXJyb3JNZXNzYWdlICs9IFwiIEZyb250IGNhbWVyYSBub3QgYXZhaWxhYmxlLlwiO1xuICAgIGlmICghYmFja1Jlc3VsdC5ncmFudGVkKSBlcnJvck1lc3NhZ2UgKz0gXCIgQmFjayBjYW1lcmEgbm90IGF2YWlsYWJsZS5cIjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZnJvbnRDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGZyb250UmVzdWx0LmdyYW50ZWQsXG4gICAgICBlcnJvcjogZnJvbnRSZXN1bHQuZXJyb3JcbiAgICB9LFxuICAgIGJhY2tDYW1lcmE6IHtcbiAgICAgIGdyYW50ZWQ6IGJhY2tSZXN1bHQuZ3JhbnRlZCxcbiAgICAgIGVycm9yOiBiYWNrUmVzdWx0LmVycm9yXG4gICAgfSxcbiAgICBhbGxHcmFudGVkLFxuICAgIGVycm9yTWVzc2FnZVxuICB9O1xufVxuIl19