UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

80 lines 13.7 kB
export class PdfDocumentPropertiesExtractor { pdfDateStringRegex = new RegExp('^D:' + // Prefix (required) '(\\d{4})' + // Year (required) '(\\d{2})?' + // Month (optional) '(\\d{2})?' + // Day (optional) '(\\d{2})?' + // Hour (optional) '(\\d{2})?' + // Minute (optional) '(\\d{2})?' + // Second (optional) '([Z|+|-])?' + // Universal time relation (optional) '(\\d{2})?' + // Offset hour (optional) // tslint:disable-next-line: quotemark "'?" + // Splitting apostrophe (optional) '(\\d{2})?' + // Offset minute (optional) // tslint:disable-next-line: quotemark "'?" // Trailing apostrophe (optional) ); async getDocumentProperties(PDFViewerApplication) { const pdfDocument = PDFViewerApplication.pdfDocument; const result = {}; const md = await pdfDocument.getMetadata(); const info = md.info; result.author = info.Author; result.creationDate = this.toDateObject(info.CreationDate); result.creator = info.Creator; result.keywords = info.Keywords; result.linearized = info.IsLinearized; result.modificationDate = this.toDateObject(info.ModDate); result.pdfFormatVersion = info.PDFFormatVersion; result.producer = info.Producer; result.subject = info.Subject; result.title = info.Title; if (md['contentDispositionFilename']) { result.fileName = md['contentDispositionFilename']; } result.maybeFileSize = (await pdfDocument.getDownloadInfo()).length; return result; } /** shamelessly copied from pdf.js */ toDateObject(input) { // Optional fields that don't satisfy the requirements from the regular // expression (such as incorrect digit counts or numbers that are out of // range) will fall back the defaults from the specification. const matches = this.pdfDateStringRegex.exec(input); if (!matches) { return null; } // JavaScript's `Date` object expects the month to be between 0 and 11 // instead of 1 and 12, so we have to correct for that. const year = parseInt(matches[1], 10); let month = parseInt(matches[2], 10); month = month >= 1 && month <= 12 ? month - 1 : 0; let day = parseInt(matches[3], 10); day = day >= 1 && day <= 31 ? day : 1; let hour = parseInt(matches[4], 10); hour = hour >= 0 && hour <= 23 ? hour : 0; let minute = parseInt(matches[5], 10); minute = minute >= 0 && minute <= 59 ? minute : 0; let second = parseInt(matches[6], 10); second = second >= 0 && second <= 59 ? second : 0; const universalTimeRelation = matches[7] || 'Z'; let offsetHour = parseInt(matches[8], 10); offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; let offsetMinute = parseInt(matches[9], 10) || 0; offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; // Universal time relation 'Z' means that the local time is equal to the // universal time, whereas the relations '+'/'-' indicate that the local // time is later respectively earlier than the universal time. Every date // is normalized to universal time. if (universalTimeRelation === '-') { hour += offsetHour; minute += offsetMinute; } else if (universalTimeRelation === '+') { hour -= offsetHour; minute -= offsetMinute; } return new Date(Date.UTC(year, month, day, hour, minute, second)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRvY3VtZW50LXByb3BlcnRpZXMtZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1leHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE1BQU0sT0FBTyw4QkFBOEI7SUFDakMsa0JBQWtCLEdBQUcsSUFBSSxNQUFNLENBQ3JDLEtBQUssR0FBRyxvQkFBb0I7UUFDMUIsVUFBVSxHQUFHLGtCQUFrQjtRQUMvQixXQUFXLEdBQUcsbUJBQW1CO1FBQ2pDLFdBQVcsR0FBRyxpQkFBaUI7UUFDL0IsV0FBVyxHQUFHLGtCQUFrQjtRQUNoQyxXQUFXLEdBQUcsb0JBQW9CO1FBQ2xDLFdBQVcsR0FBRyxvQkFBb0I7UUFDbEMsWUFBWSxHQUFHLHFDQUFxQztRQUNwRCxXQUFXLEdBQUcseUJBQXlCO1FBQ3ZDLHNDQUFzQztRQUN0QyxJQUFJLEdBQUcsa0NBQWtDO1FBQ3pDLFdBQVcsR0FBRywyQkFBMkI7UUFDekMsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxpQ0FBaUM7S0FDekMsQ0FBQztJQUVLLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBMkM7UUFDNUUsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDO1FBRXJELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBc0IsQ0FBQztRQUV2QyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoRCxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDaEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDcEQ7UUFDRCxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsTUFBTSxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDcEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELHFDQUFxQztJQUM3QixZQUFZLENBQUMsS0FBbUI7UUFDdEMsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSw2REFBNkQ7UUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELHNFQUFzRTtRQUN0RSx1REFBdUQ7UUFDdkQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssR0FBRyxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUNoRCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLFVBQVUsR0FBRyxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxJQUFJLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLG1DQUFtQztRQUNuQyxJQUFJLHFCQUFxQixLQUFLLEdBQUcsRUFBRTtZQUNqQyxJQUFJLElBQUksVUFBVSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxZQUFZLENBQUM7U0FDeEI7YUFBTSxJQUFJLHFCQUFxQixLQUFLLEdBQUcsRUFBRTtZQUN4QyxJQUFJLElBQUksVUFBVSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxZQUFZLENBQUM7U0FDeEI7UUFFRCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbiB9IGZyb20gJy4vb3B0aW9ucy9wZGYtdmlld2VyLWFwcGxpY2F0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBQZGZEb2N1bWVudEluZm8ge1xuICBhdXRob3I/OiBzdHJpbmc7XG4gIGNyZWF0aW9uRGF0ZT86IERhdGU7XG4gIGNyZWF0b3I/OiBzdHJpbmc7XG5cbiAga2V5d29yZHM/OiBzdHJpbmc7XG4gIGxpbmVhcml6ZWQ/OiBib29sZWFuO1xuICBtYXliZUZpbGVTaXplPzogc3RyaW5nO1xuICBtb2RpZmljYXRpb25EYXRlPzogRGF0ZTtcbiAgcGRmRm9ybWF0VmVyc2lvbj86IHN0cmluZztcbiAgcHJvZHVjZXI/OiBzdHJpbmc7XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUGRmRG9jdW1lbnRQcm9wZXJ0aWVzRXh0cmFjdG9yIHtcbiAgcHJpdmF0ZSBwZGZEYXRlU3RyaW5nUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICdeRDonICsgLy8gUHJlZml4IChyZXF1aXJlZClcbiAgICAgICcoXFxcXGR7NH0pJyArIC8vIFllYXIgKHJlcXVpcmVkKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE1vbnRoIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBEYXkgKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIEhvdXIgKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE1pbnV0ZSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gU2Vjb25kIChvcHRpb25hbClcbiAgICAgICcoW1p8K3wtXSk/JyArIC8vIFVuaXZlcnNhbCB0aW1lIHJlbGF0aW9uIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBPZmZzZXQgaG91ciAob3B0aW9uYWwpXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgXCInP1wiICsgLy8gU3BsaXR0aW5nIGFwb3N0cm9waGUgKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE9mZnNldCBtaW51dGUgKG9wdGlvbmFsKVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBxdW90ZW1hcmtcbiAgICAgIFwiJz9cIiAvLyBUcmFpbGluZyBhcG9zdHJvcGhlIChvcHRpb25hbClcbiAgKTtcblxuICBwdWJsaWMgYXN5bmMgZ2V0RG9jdW1lbnRQcm9wZXJ0aWVzKFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHBkZkRvY3VtZW50ID0gUERGVmlld2VyQXBwbGljYXRpb24ucGRmRG9jdW1lbnQ7XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGNvbnN0IG1kID0gYXdhaXQgcGRmRG9jdW1lbnQuZ2V0TWV0YWRhdGEoKTtcbiAgICBjb25zdCBpbmZvID0gbWQuaW5mbyBhcyB1bmtub3duIGFzIGFueTtcblxuICAgIHJlc3VsdC5hdXRob3IgPSBpbmZvLkF1dGhvcjtcbiAgICByZXN1bHQuY3JlYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoaW5mby5DcmVhdGlvbkRhdGUpO1xuICAgIHJlc3VsdC5jcmVhdG9yID0gaW5mby5DcmVhdG9yO1xuICAgIHJlc3VsdC5rZXl3b3JkcyA9IGluZm8uS2V5d29yZHM7XG4gICAgcmVzdWx0LmxpbmVhcml6ZWQgPSBpbmZvLklzTGluZWFyaXplZDtcbiAgICByZXN1bHQubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMudG9EYXRlT2JqZWN0KGluZm8uTW9kRGF0ZSk7XG4gICAgcmVzdWx0LnBkZkZvcm1hdFZlcnNpb24gPSBpbmZvLlBERkZvcm1hdFZlcnNpb247XG4gICAgcmVzdWx0LnByb2R1Y2VyID0gaW5mby5Qcm9kdWNlcjtcbiAgICByZXN1bHQuc3ViamVjdCA9IGluZm8uU3ViamVjdDtcbiAgICByZXN1bHQudGl0bGUgPSBpbmZvLlRpdGxlO1xuICAgIGlmIChtZFsnY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUnXSkge1xuICAgICAgcmVzdWx0LmZpbGVOYW1lID0gbWRbJ2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lJ107XG4gICAgfVxuICAgIHJlc3VsdC5tYXliZUZpbGVTaXplID0gKGF3YWl0IHBkZkRvY3VtZW50LmdldERvd25sb2FkSW5mbygpKS5sZW5ndGg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBwZGYuanMgKi9cbiAgcHJpdmF0ZSB0b0RhdGVPYmplY3QoaW5wdXQ6IHN0cmluZyB8IGFueSk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBPcHRpb25hbCBmaWVsZHMgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgZnJvbSB0aGUgcmVndWxhclxuICAgIC8vIGV4cHJlc3Npb24gKHN1Y2ggYXMgaW5jb3JyZWN0IGRpZ2l0IGNvdW50cyBvciBudW1iZXJzIHRoYXQgYXJlIG91dCBvZlxuICAgIC8vIHJhbmdlKSB3aWxsIGZhbGwgYmFjayB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi5cbiAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5wZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBKYXZhU2NyaXB0J3MgYERhdGVgIG9iamVjdCBleHBlY3RzIHRoZSBtb250aCB0byBiZSBiZXR3ZWVuIDAgYW5kIDExXG4gICAgLy8gaW5zdGVhZCBvZiAxIGFuZCAxMiwgc28gd2UgaGF2ZSB0byBjb3JyZWN0IGZvciB0aGF0LlxuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG4gICAgbGV0IGRheSA9IHBhcnNlSW50KG1hdGNoZXNbM10sIDEwKTtcbiAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuICAgIGhvdXIgPSBob3VyID49IDAgJiYgaG91ciA8PSAyMyA/IGhvdXIgOiAwO1xuICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG4gICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcbiAgICBsZXQgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hlc1s2XSwgMTApO1xuICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG4gICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCAnWic7XG4gICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG4gICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG4gICAgbGV0IG9mZnNldE1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbOV0sIDEwKSB8fCAwO1xuICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG5cbiAgICAvLyBVbml2ZXJzYWwgdGltZSByZWxhdGlvbiAnWicgbWVhbnMgdGhhdCB0aGUgbG9jYWwgdGltZSBpcyBlcXVhbCB0byB0aGVcbiAgICAvLyB1bml2ZXJzYWwgdGltZSwgd2hlcmVhcyB0aGUgcmVsYXRpb25zICcrJy8nLScgaW5kaWNhdGUgdGhhdCB0aGUgbG9jYWxcbiAgICAvLyB0aW1lIGlzIGxhdGVyIHJlc3BlY3RpdmVseSBlYXJsaWVyIHRoYW4gdGhlIHVuaXZlcnNhbCB0aW1lLiBFdmVyeSBkYXRlXG4gICAgLy8gaXMgbm9ybWFsaXplZCB0byB1bml2ZXJzYWwgdGltZS5cbiAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSAnLScpIHtcbiAgICAgIGhvdXIgKz0gb2Zmc2V0SG91cjtcbiAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG4gICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICcrJykge1xuICAgICAgaG91ciAtPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpKTtcbiAgfVxufVxuIl19