UNPKG

ng-cornerstone

Version:

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.git

135 lines 22.9 kB
import { metaData } from '@cornerstonejs/core'; export default function getPTImageIdInstanceMetadata(imageId) { const petSequenceModule = metaData.get('petIsotopeModule', imageId); const generalSeriesModule = metaData.get('generalSeriesModule', imageId); const patientStudyModule = metaData.get('patientStudyModule', imageId); const ptSeriesModule = metaData.get('petSeriesModule', imageId); const ptImageModule = metaData.get('petImageModule', imageId); if (!petSequenceModule) { throw new Error('petSequenceModule metadata is required'); } const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo; const { seriesDate, seriesTime, acquisitionDate, acquisitionTime } = generalSeriesModule; const { patientWeight } = patientStudyModule; const { correctedImage, units, decayCorrection } = ptSeriesModule; if (seriesDate === undefined || seriesTime === undefined || patientWeight === undefined || acquisitionDate === undefined || acquisitionTime === undefined || correctedImage === undefined || units === undefined || decayCorrection === undefined || radiopharmaceuticalInfo.radionuclideTotalDose === undefined || radiopharmaceuticalInfo.radionuclideHalfLife === undefined || (radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime === undefined && seriesDate === undefined && radiopharmaceuticalInfo.radiopharmaceuticalStartTime === undefined) // ) { throw new Error('required metadata are missing'); } const instanceMetadata = { CorrectedImage: correctedImage, Units: units, RadionuclideHalfLife: radiopharmaceuticalInfo.radionuclideHalfLife, RadionuclideTotalDose: radiopharmaceuticalInfo.radionuclideTotalDose, DecayCorrection: decayCorrection, PatientWeight: patientWeight, SeriesDate: seriesDate, SeriesTime: seriesTime, AcquisitionDate: acquisitionDate, AcquisitionTime: acquisitionTime, }; if (radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime && radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== undefined && typeof radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime === 'string') { instanceMetadata.RadiopharmaceuticalStartDateTime = radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime; } if (radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime && radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== undefined && typeof radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime !== 'string') { const dateString = convertInterfaceDateToString(radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime); instanceMetadata.RadiopharmaceuticalStartDateTime = dateString; } if (instanceMetadata.AcquisitionDate && instanceMetadata.AcquisitionDate !== undefined && typeof instanceMetadata.AcquisitionDate !== 'string') { const dateString = convertInterfaceDateToString(instanceMetadata.AcquisitionDate); instanceMetadata.AcquisitionDate = dateString; } if (instanceMetadata.SeriesDate && instanceMetadata.SeriesDate !== undefined && typeof instanceMetadata.SeriesDate !== 'string') { const dateString = convertInterfaceDateToString(instanceMetadata.SeriesDate); instanceMetadata.SeriesDate = dateString; } if (radiopharmaceuticalInfo.radiopharmaceuticalStartTime && radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== undefined && typeof radiopharmaceuticalInfo.radiopharmaceuticalStartTime === 'string') { instanceMetadata.RadiopharmaceuticalStartTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime; } if (radiopharmaceuticalInfo.radiopharmaceuticalStartTime && radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== undefined && typeof radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== 'string') { const timeString = convertInterfaceTimeToString(radiopharmaceuticalInfo.radiopharmaceuticalStartTime); instanceMetadata.RadiopharmaceuticalStartTime = timeString; } if (instanceMetadata.AcquisitionTime && instanceMetadata.AcquisitionTime !== undefined && typeof instanceMetadata.AcquisitionTime !== 'string') { const timeString = convertInterfaceTimeToString(instanceMetadata.AcquisitionTime); instanceMetadata.AcquisitionTime = timeString; } if (instanceMetadata.SeriesTime && instanceMetadata.SeriesTime !== undefined && typeof instanceMetadata.SeriesTime !== 'string') { const timeString = convertInterfaceTimeToString(instanceMetadata.SeriesTime); instanceMetadata.SeriesTime = timeString; } if (ptImageModule.frameReferenceTime && ptImageModule.frameReferenceTime !== undefined) { instanceMetadata.FrameReferenceTime = ptImageModule.frameReferenceTime; } if (ptImageModule.actualFrameDuration && ptImageModule.actualFrameDuration !== undefined) { instanceMetadata.ActualFrameDuration = ptImageModule.actualFrameDuration; } if (patientStudyModule.patientSex && patientStudyModule.patientSex !== undefined) { instanceMetadata.PatientSex = patientStudyModule.patientSex; } if (patientStudyModule.patientSize && patientStudyModule.patientSize !== undefined) { instanceMetadata.PatientSize = patientStudyModule.patientSize; } // Todo: add private tags // if ( // dicomMetaData['70531000'] || // dicomMetaData['70531000'] !== undefined || // dicomMetaData['70531009'] || // dicomMetaData['70531009'] !== undefined // ) { // const philipsPETPrivateGroup: PhilipsPETPrivateGroup = { // SUVScaleFactor: dicomMetaData['70531000'], // ActivityConcentrationScaleFactor: dicomMetaData['70531009'], // }; // instanceMetadata.PhilipsPETPrivateGroup = philipsPETPrivateGroup; // } // if (dicomMetaData['0009100d'] && dicomMetaData['0009100d'] !== undefined) { // instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d']; // } return instanceMetadata; } function convertInterfaceTimeToString(time) { const hours = `${time.hours || '00'}`.padStart(2, '0'); const minutes = `${time.minutes || '00'}`.padStart(2, '0'); const seconds = `${time.seconds || '00'}`.padStart(2, '0'); const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd(6, '0'); const timeString = `${hours}${minutes}${seconds}.${fractionalSeconds}`; return timeString; } function convertInterfaceDateToString(date) { const month = `${date.month}`.padStart(2, '0'); const day = `${date.day}`.padStart(2, '0'); const dateString = `${date.year}${month}${day}`; return dateString; } export { getPTImageIdInstanceMetadata }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0UFRJbWFnZUlkSW5zdGFuY2VNZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvcm5lcnN0b25lL3NyYy9saWIvY29yZS9wcm92aWRlci9nZXRQVEltYWdlSWRJbnN0YW5jZU1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcvQyxNQUFNLENBQUMsT0FBTyxVQUFVLDRCQUE0QixDQUFDLE9BQWU7SUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RSxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdkUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTlELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsTUFBTSx1QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQztJQUUxRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLEdBQUcsbUJBQW1CLENBQUM7SUFDekYsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLGtCQUFrQixDQUFDO0lBQzdDLE1BQU0sRUFBRSxj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QUcsR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQ3ZFLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLDRCQUE0QixDQUFDLElBQUk7SUFDeEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDaEQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWV0YURhdGEgfSBmcm9tICdAY29ybmVyc3RvbmVqcy9jb3JlJztcbmltcG9ydCB0eXBlIHsgSW5zdGFuY2VNZXRhZGF0YSB9IGZyb20gJ0Bjb3JuZXJzdG9uZWpzL2NhbGN1bGF0ZS1zdXYnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQVEltYWdlSWRJbnN0YW5jZU1ldGFkYXRhKGltYWdlSWQ6IHN0cmluZyk6IEluc3RhbmNlTWV0YWRhdGEge1xuICBjb25zdCBwZXRTZXF1ZW5jZU1vZHVsZSA9IG1ldGFEYXRhLmdldCgncGV0SXNvdG9wZU1vZHVsZScsIGltYWdlSWQpO1xuICBjb25zdCBnZW5lcmFsU2VyaWVzTW9kdWxlID0gbWV0YURhdGEuZ2V0KCdnZW5lcmFsU2VyaWVzTW9kdWxlJywgaW1hZ2VJZCk7XG4gIGNvbnN0IHBhdGllbnRTdHVkeU1vZHVsZSA9IG1ldGFEYXRhLmdldCgncGF0aWVudFN0dWR5TW9kdWxlJywgaW1hZ2VJZCk7XG5cbiAgY29uc3QgcHRTZXJpZXNNb2R1bGUgPSBtZXRhRGF0YS5nZXQoJ3BldFNlcmllc01vZHVsZScsIGltYWdlSWQpO1xuICBjb25zdCBwdEltYWdlTW9kdWxlID0gbWV0YURhdGEuZ2V0KCdwZXRJbWFnZU1vZHVsZScsIGltYWdlSWQpO1xuXG4gIGlmICghcGV0U2VxdWVuY2VNb2R1bGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BldFNlcXVlbmNlTW9kdWxlIG1ldGFkYXRhIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCByYWRpb3BoYXJtYWNldXRpY2FsSW5mbyA9IHBldFNlcXVlbmNlTW9kdWxlLnJhZGlvcGhhcm1hY2V1dGljYWxJbmZvO1xuXG4gIGNvbnN0IHsgc2VyaWVzRGF0ZSwgc2VyaWVzVGltZSwgYWNxdWlzaXRpb25EYXRlLCBhY3F1aXNpdGlvblRpbWUgfSA9IGdlbmVyYWxTZXJpZXNNb2R1bGU7XG4gIGNvbnN0IHsgcGF0aWVudFdlaWdodCB9ID0gcGF0aWVudFN0dWR5TW9kdWxlO1xuICBjb25zdCB7IGNvcnJlY3RlZEltYWdlLCB1bml0cywgZGVjYXlDb3JyZWN0aW9uIH0gPSBwdFNlcmllc01vZHVsZTtcblxuICBpZiAoXG4gICAgc2VyaWVzRGF0ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgc2VyaWVzVGltZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgcGF0aWVudFdlaWdodCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgYWNxdWlzaXRpb25EYXRlID09PSB1bmRlZmluZWQgfHxcbiAgICBhY3F1aXNpdGlvblRpbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgIGNvcnJlY3RlZEltYWdlID09PSB1bmRlZmluZWQgfHxcbiAgICB1bml0cyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgZGVjYXlDb3JyZWN0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb251Y2xpZGVUb3RhbERvc2UgPT09IHVuZGVmaW5lZCB8fFxuICAgIHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvbnVjbGlkZUhhbGZMaWZlID09PSB1bmRlZmluZWQgfHxcbiAgICAocmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0RGF0ZVRpbWUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VyaWVzRGF0ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnRUaW1lID09PSB1bmRlZmluZWQpXG4gICAgLy9cbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZCBtZXRhZGF0YSBhcmUgbWlzc2luZycpO1xuICB9XG5cbiAgY29uc3QgaW5zdGFuY2VNZXRhZGF0YTogSW5zdGFuY2VNZXRhZGF0YSA9IHtcbiAgICBDb3JyZWN0ZWRJbWFnZTogY29ycmVjdGVkSW1hZ2UsXG4gICAgVW5pdHM6IHVuaXRzLFxuICAgIFJhZGlvbnVjbGlkZUhhbGZMaWZlOiByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb251Y2xpZGVIYWxmTGlmZSxcbiAgICBSYWRpb251Y2xpZGVUb3RhbERvc2U6IHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvbnVjbGlkZVRvdGFsRG9zZSxcbiAgICBEZWNheUNvcnJlY3Rpb246IGRlY2F5Q29ycmVjdGlvbixcbiAgICBQYXRpZW50V2VpZ2h0OiBwYXRpZW50V2VpZ2h0LFxuICAgIFNlcmllc0RhdGU6IHNlcmllc0RhdGUsXG4gICAgU2VyaWVzVGltZTogc2VyaWVzVGltZSxcbiAgICBBY3F1aXNpdGlvbkRhdGU6IGFjcXVpc2l0aW9uRGF0ZSxcbiAgICBBY3F1aXNpdGlvblRpbWU6IGFjcXVpc2l0aW9uVGltZSxcbiAgfTtcblxuICBpZiAoXG4gICAgcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0RGF0ZVRpbWUgJiZcbiAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnREYXRlVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvcGhhcm1hY2V1dGljYWxTdGFydERhdGVUaW1lID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICBpbnN0YW5jZU1ldGFkYXRhLlJhZGlvcGhhcm1hY2V1dGljYWxTdGFydERhdGVUaW1lID0gcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0RGF0ZVRpbWU7XG4gIH1cblxuICBpZiAoXG4gICAgcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0RGF0ZVRpbWUgJiZcbiAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnREYXRlVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvcGhhcm1hY2V1dGljYWxTdGFydERhdGVUaW1lICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICBjb25zdCBkYXRlU3RyaW5nID0gY29udmVydEludGVyZmFjZURhdGVUb1N0cmluZyhyYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnREYXRlVGltZSk7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5SYWRpb3BoYXJtYWNldXRpY2FsU3RhcnREYXRlVGltZSA9IGRhdGVTdHJpbmc7XG4gIH1cblxuICBpZiAoXG4gICAgaW5zdGFuY2VNZXRhZGF0YS5BY3F1aXNpdGlvbkRhdGUgJiZcbiAgICBpbnN0YW5jZU1ldGFkYXRhLkFjcXVpc2l0aW9uRGF0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIGluc3RhbmNlTWV0YWRhdGEuQWNxdWlzaXRpb25EYXRlICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICBjb25zdCBkYXRlU3RyaW5nID0gY29udmVydEludGVyZmFjZURhdGVUb1N0cmluZyhpbnN0YW5jZU1ldGFkYXRhLkFjcXVpc2l0aW9uRGF0ZSk7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5BY3F1aXNpdGlvbkRhdGUgPSBkYXRlU3RyaW5nO1xuICB9XG5cbiAgaWYgKFxuICAgIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzRGF0ZSAmJlxuICAgIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzRGF0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzRGF0ZSAhPT0gJ3N0cmluZydcbiAgKSB7XG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IGNvbnZlcnRJbnRlcmZhY2VEYXRlVG9TdHJpbmcoaW5zdGFuY2VNZXRhZGF0YS5TZXJpZXNEYXRlKTtcbiAgICBpbnN0YW5jZU1ldGFkYXRhLlNlcmllc0RhdGUgPSBkYXRlU3RyaW5nO1xuICB9XG5cbiAgaWYgKFxuICAgIHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvcGhhcm1hY2V1dGljYWxTdGFydFRpbWUgJiZcbiAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnRUaW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICB0eXBlb2YgcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0VGltZSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5SYWRpb3BoYXJtYWNldXRpY2FsU3RhcnRUaW1lID0gcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0VGltZTtcbiAgfVxuXG4gIGlmIChcbiAgICByYWRpb3BoYXJtYWNldXRpY2FsSW5mby5yYWRpb3BoYXJtYWNldXRpY2FsU3RhcnRUaW1lICYmXG4gICAgcmFkaW9waGFybWFjZXV0aWNhbEluZm8ucmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0VGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvcGhhcm1hY2V1dGljYWxTdGFydFRpbWUgIT09ICdzdHJpbmcnXG4gICkge1xuICAgIGNvbnN0IHRpbWVTdHJpbmcgPSBjb252ZXJ0SW50ZXJmYWNlVGltZVRvU3RyaW5nKHJhZGlvcGhhcm1hY2V1dGljYWxJbmZvLnJhZGlvcGhhcm1hY2V1dGljYWxTdGFydFRpbWUpO1xuICAgIGluc3RhbmNlTWV0YWRhdGEuUmFkaW9waGFybWFjZXV0aWNhbFN0YXJ0VGltZSA9IHRpbWVTdHJpbmc7XG4gIH1cblxuICBpZiAoXG4gICAgaW5zdGFuY2VNZXRhZGF0YS5BY3F1aXNpdGlvblRpbWUgJiZcbiAgICBpbnN0YW5jZU1ldGFkYXRhLkFjcXVpc2l0aW9uVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIGluc3RhbmNlTWV0YWRhdGEuQWNxdWlzaXRpb25UaW1lICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gY29udmVydEludGVyZmFjZVRpbWVUb1N0cmluZyhpbnN0YW5jZU1ldGFkYXRhLkFjcXVpc2l0aW9uVGltZSk7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5BY3F1aXNpdGlvblRpbWUgPSB0aW1lU3RyaW5nO1xuICB9XG5cbiAgaWYgKFxuICAgIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzVGltZSAmJlxuICAgIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIGluc3RhbmNlTWV0YWRhdGEuU2VyaWVzVGltZSAhPT0gJ3N0cmluZydcbiAgKSB7XG4gICAgY29uc3QgdGltZVN0cmluZyA9IGNvbnZlcnRJbnRlcmZhY2VUaW1lVG9TdHJpbmcoaW5zdGFuY2VNZXRhZGF0YS5TZXJpZXNUaW1lKTtcbiAgICBpbnN0YW5jZU1ldGFkYXRhLlNlcmllc1RpbWUgPSB0aW1lU3RyaW5nO1xuICB9XG5cbiAgaWYgKHB0SW1hZ2VNb2R1bGUuZnJhbWVSZWZlcmVuY2VUaW1lICYmIHB0SW1hZ2VNb2R1bGUuZnJhbWVSZWZlcmVuY2VUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbnN0YW5jZU1ldGFkYXRhLkZyYW1lUmVmZXJlbmNlVGltZSA9IHB0SW1hZ2VNb2R1bGUuZnJhbWVSZWZlcmVuY2VUaW1lO1xuICB9XG5cbiAgaWYgKHB0SW1hZ2VNb2R1bGUuYWN0dWFsRnJhbWVEdXJhdGlvbiAmJiBwdEltYWdlTW9kdWxlLmFjdHVhbEZyYW1lRHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGluc3RhbmNlTWV0YWRhdGEuQWN0dWFsRnJhbWVEdXJhdGlvbiA9IHB0SW1hZ2VNb2R1bGUuYWN0dWFsRnJhbWVEdXJhdGlvbjtcbiAgfVxuXG4gIGlmIChwYXRpZW50U3R1ZHlNb2R1bGUucGF0aWVudFNleCAmJiBwYXRpZW50U3R1ZHlNb2R1bGUucGF0aWVudFNleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5QYXRpZW50U2V4ID0gcGF0aWVudFN0dWR5TW9kdWxlLnBhdGllbnRTZXg7XG4gIH1cblxuICBpZiAocGF0aWVudFN0dWR5TW9kdWxlLnBhdGllbnRTaXplICYmIHBhdGllbnRTdHVkeU1vZHVsZS5wYXRpZW50U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5zdGFuY2VNZXRhZGF0YS5QYXRpZW50U2l6ZSA9IHBhdGllbnRTdHVkeU1vZHVsZS5wYXRpZW50U2l6ZTtcbiAgfVxuXG4gIC8vIFRvZG86IGFkZCBwcml2YXRlIHRhZ3NcbiAgLy8gaWYgKFxuICAvLyAgIGRpY29tTWV0YURhdGFbJzcwNTMxMDAwJ10gfHxcbiAgLy8gICBkaWNvbU1ldGFEYXRhWyc3MDUzMTAwMCddICE9PSB1bmRlZmluZWQgfHxcbiAgLy8gICBkaWNvbU1ldGFEYXRhWyc3MDUzMTAwOSddIHx8XG4gIC8vICAgZGljb21NZXRhRGF0YVsnNzA1MzEwMDknXSAhPT0gdW5kZWZpbmVkXG4gIC8vICkge1xuICAvLyAgIGNvbnN0IHBoaWxpcHNQRVRQcml2YXRlR3JvdXA6IFBoaWxpcHNQRVRQcml2YXRlR3JvdXAgPSB7XG4gIC8vICAgICBTVVZTY2FsZUZhY3RvcjogZGljb21NZXRhRGF0YVsnNzA1MzEwMDAnXSxcbiAgLy8gICAgIEFjdGl2aXR5Q29uY2VudHJhdGlvblNjYWxlRmFjdG9yOiBkaWNvbU1ldGFEYXRhWyc3MDUzMTAwOSddLFxuICAvLyAgIH07XG4gIC8vICAgaW5zdGFuY2VNZXRhZGF0YS5QaGlsaXBzUEVUUHJpdmF0ZUdyb3VwID0gcGhpbGlwc1BFVFByaXZhdGVHcm91cDtcbiAgLy8gfVxuXG4gIC8vIGlmIChkaWNvbU1ldGFEYXRhWycwMDA5MTAwZCddICYmIGRpY29tTWV0YURhdGFbJzAwMDkxMDBkJ10gIT09IHVuZGVmaW5lZCkge1xuICAvLyAgIGluc3RhbmNlTWV0YWRhdGEuR0VQcml2YXRlUG9zdEluamVjdGlvbkRhdGVUaW1lID0gZGljb21NZXRhRGF0YVsnMDAwOTEwMGQnXTtcbiAgLy8gfVxuXG4gIHJldHVybiBpbnN0YW5jZU1ldGFkYXRhO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0SW50ZXJmYWNlVGltZVRvU3RyaW5nKHRpbWUpOiBzdHJpbmcge1xuICBjb25zdCBob3VycyA9IGAke3RpbWUuaG91cnMgfHwgJzAwJ31gLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBgJHt0aW1lLm1pbnV0ZXMgfHwgJzAwJ31gLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IHNlY29uZHMgPSBgJHt0aW1lLnNlY29uZHMgfHwgJzAwJ31gLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgY29uc3QgZnJhY3Rpb25hbFNlY29uZHMgPSBgJHt0aW1lLmZyYWN0aW9uYWxTZWNvbmRzIHx8ICcwMDAwMDAnfWAucGFkRW5kKDYsICcwJyk7XG5cbiAgY29uc3QgdGltZVN0cmluZyA9IGAke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9LiR7ZnJhY3Rpb25hbFNlY29uZHN9YDtcbiAgcmV0dXJuIHRpbWVTdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbnRlcmZhY2VEYXRlVG9TdHJpbmcoZGF0ZSk6IHN0cmluZyB7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5tb250aH1gLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZGF5fWAucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZGF0ZVN0cmluZyA9IGAke2RhdGUueWVhcn0ke21vbnRofSR7ZGF5fWA7XG4gIHJldHVybiBkYXRlU3RyaW5nO1xufVxuXG5leHBvcnQgeyBnZXRQVEltYWdlSWRJbnN0YW5jZU1ldGFkYXRhIH07XG4iXX0=