@dlr-eoc/services-ogc
Version:
This module bundles our clients for OGC standards. E.g. parse OWS Context JSON, WMS, WMTS or WPS.
143 lines • 19.4 kB
JavaScript
/** This file contains functions (Type Guards) to test for types in owc-json.ts */
import { GeoJsonOffering, tmsOffering, xyzOffering } from './eoc-owc-json';
import { cswOffering, GeoTIFFOffering, GMLCOVOffering, GMLJP2Offering, gmlOffering, kmlOffering, wcsOffering, wfsOffering, wmsOffering, wmtsOffering } from './owc-json';
/**
* export types to create layers from Offerings
*/
export const GetMapOperationCode = 'GetMap';
export const GetFeatureOperationCode = 'GetFeature';
export const GetTileOperationCode = 'GetTile';
export const RESTOperationCode = 'REST';
export const GetCapabilitiesOperationCode = 'GetCapabilities';
export const DescribeFeatureTypeOperationCode = 'DescribeFeatureType';
export const GetFeatureInfoOperationCode = 'GetFeatureInfo';
function trueForAll(list, predicate) {
for (const entry of list) {
if (!predicate(entry)) {
return false;
}
}
return true;
}
export function isIOwsContext(object) {
let ISCONTEXT_1_0;
if (object?.properties?.links) {
ISCONTEXT_1_0 = object.properties.links.profiles.find(item => item.href === 'http://www.opengis.net/spec/owc-geojson/1.0/req/core');
}
if (!ISCONTEXT_1_0) {
console.error('this is not a valid OWS Context v1.0!');
return false;
}
else {
return true;
}
}
export function isIOwsResource(object) {
return 'id' in object && 'type' in object
&& 'properties' in object && isIOwsResourceProperties(object.properties);
}
export function isIOwsResourceProperties(object) {
return 'title' in object
&& 'updated' in object
&& (object.authors ? trueForAll(object.authors, isIOwsAuthor) : true)
&& (object.offerings ? trueForAll(object.offerings, isIOwsOffering) : true)
&& (object.categories ? trueForAll(object.categories, isIOwsCategory) : true);
}
export function isIOwsOffering(object) {
return 'code' in object
&& (object.operations ? trueForAll(object.operations, isIOwsOperation) : true)
&& (object.contents ? trueForAll(object.contents, isIOwsContent) : true)
&& (object.styles ? trueForAll(object.styles, isIOwsStyleSet) : true);
}
export function isIOwsGenerator(object) {
return 'title' in object
|| 'uri' in object
|| 'version' in object;
}
export function isIOwsAuthor(object) {
return 'name' in object
|| 'email' in object
|| 'uri' in object;
}
export function isIOwsCategory(object) {
return 'scheme' in object
|| 'term' in object
|| 'label' in object;
}
export function isIOwsLinks(object) {
return 'rel' in object;
}
export function isIOwsCreatorDisplay(object) {
return 'pixelWidth' in object
|| 'pixelHeight' in object
|| 'mmPerPixel' in object;
}
export function isIOwsOperation(object) {
return 'code' in object
&& 'method' in object
&& (object.request ? isIOwsContent(object.request) : true)
&& (object.result ? isIOwsContent(object.result) : true);
}
export function isIOwsRasterOperation(object) {
if (isIOwsOperation(object)) {
return [GetMapOperationCode, GetTileOperationCode, RESTOperationCode].includes(object.code);
}
else {
return false;
}
}
export function isIOwsVectorOperation(object) {
if (isIOwsOperation(object)) {
return [GetFeatureOperationCode].includes(object.code);
}
else {
return false;
}
}
export function isIOwsContent(object) {
return 'type' in object;
}
export function isIOwsStyleSet(object) {
return 'name' in object
&& 'title' in object;
}
export function isWmsOffering(str) {
return str === wmsOffering;
}
export function isWfsOffering(str) {
return str === wfsOffering;
}
export function isWpsOffering(str) {
return str === wcsOffering;
}
export function isCswOffering(str) {
return str === cswOffering;
}
export function isWmtsOffering(str) {
return str === wmtsOffering;
}
export function isGmlOffering(str) {
return str === gmlOffering;
}
export function isKmlOffering(str) {
return str === kmlOffering;
}
export function isGeoTIFFOffering(str) {
return str === GeoTIFFOffering;
}
export function isGMLJP2Offering(str) {
return str === GMLJP2Offering;
}
export function isGMLCOVOffering(str) {
return str === GMLCOVOffering;
}
export function isXyzOffering(str) {
return str === xyzOffering;
}
export function isGeoJsonOffering(str) {
return str === GeoJsonOffering;
}
export function isTMSOffering(str) {
return str === tmsOffering;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3djLWpzb24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2aWNlcy1vZ2Mvc3JjL2xpYi9vd2MvdHlwZXMvb3djLWpzb24udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0ZBQWtGO0FBRWxGLE9BQU8sRUFBZ0QsZUFBZSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsV0FBVyxFQUFnQixlQUFlLEVBQW9CLGNBQWMsRUFBbUIsY0FBYyxFQUFtQixXQUFXLEVBQW1NLFdBQVcsRUFBZ0IsV0FBVyxFQUFnQixXQUFXLEVBQWdCLFdBQVcsRUFBZ0IsWUFBWSxFQUFpQixNQUFNLFlBQVksQ0FBQztBQUduZjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQWlCLENBQUM7QUFHckQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsWUFBcUIsQ0FBQztBQUc3RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFrQixDQUFDO0FBR3ZELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQWUsQ0FBQztBQUlqRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxpQkFBMEIsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxxQkFBOEIsQ0FBQztBQUMvRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxnQkFBeUIsQ0FBQztBQUdyRSxTQUFTLFVBQVUsQ0FBQyxJQUFXLEVBQUUsU0FBOEI7SUFDN0QsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FB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QUFlLENBQUM7QUFDakMsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVztJQUN2QyxPQUFPLEdBQUcsS0FBSyxXQUFXLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIChUeXBlIEd1YXJkcykgdG8gdGVzdCBmb3IgdHlwZXMgaW4gb3djLWpzb24udHMgKi9cclxuXHJcbmltcG9ydCB7IFh5el9PZmZlcmluZywgR2VvSnNvbl9PZmZlcmluZywgVE1TX09mZmVyaW5nLCBHZW9Kc29uT2ZmZXJpbmcsIHRtc09mZmVyaW5nLCB4eXpPZmZlcmluZyB9IGZyb20gJy4vZW9jLW93Yy1qc29uJztcclxuaW1wb3J0IHsgY3N3T2ZmZXJpbmcsIENTV19PZmZlcmluZywgR2VvVElGRk9mZmVyaW5nLCBHZW9USUZGX09mZmVyaW5nLCBHTUxDT1ZPZmZlcmluZywgR01MQ09WX09mZmVyaW5nLCBHTUxKUDJPZmZlcmluZywgR01MSlAyX09mZmVyaW5nLCBnbWxPZmZlcmluZywgR01MX09mZmVyaW5nLCBJT3dzQXV0aG9yLCBJT3dzQ2F0ZWdvcnksIElPd3NDb250ZW50LCBJT3dzQ29udGV4dCwgSU93c0dlbmVyYXRvciwgSU93c0NyZWF0b3JEaXNwbGF5LCBJT3dzTGlua3MsIElPd3NPZmZlcmluZywgSU93c09wZXJhdGlvbiwgSU93c1Jlc291cmNlLCBJT3dzUmVzb3VyY2VQcm9wZXJ0aWVzLCBJT3dzU3R5bGVTZXQsIGttbE9mZmVyaW5nLCBLTUxfT2ZmZXJpbmcsIHdjc09mZmVyaW5nLCBXQ1NfT2ZmZXJpbmcsIHdmc09mZmVyaW5nLCBXRlNfT2ZmZXJpbmcsIHdtc09mZmVyaW5nLCBXTVNfT2ZmZXJpbmcsIHdtdHNPZmZlcmluZywgV01UU19PZmZlcmluZyB9IGZyb20gJy4vb3djLWpzb24nO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBleHBvcnQgdHlwZXMgdG8gY3JlYXRlIGxheWVycyBmcm9tIE9mZmVyaW5nc1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEdldE1hcE9wZXJhdGlvbkNvZGUgPSAnR2V0TWFwJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgV01TX0NvZGUgPSB0eXBlb2YgR2V0TWFwT3BlcmF0aW9uQ29kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBHZXRGZWF0dXJlT3BlcmF0aW9uQ29kZSA9ICdHZXRGZWF0dXJlJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgV0ZTX0NvZGUgPSB0eXBlb2YgR2V0RmVhdHVyZU9wZXJhdGlvbkNvZGU7XHJcblxyXG5leHBvcnQgY29uc3QgR2V0VGlsZU9wZXJhdGlvbkNvZGUgPSAnR2V0VGlsZScgYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFdNVFNfQ29kZSA9IHR5cGVvZiBHZXRUaWxlT3BlcmF0aW9uQ29kZTtcclxuXHJcbmV4cG9ydCBjb25zdCBSRVNUT3BlcmF0aW9uQ29kZSA9ICdSRVNUJyBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVE1TX0NvZGUgPSB0eXBlb2YgUkVTVE9wZXJhdGlvbkNvZGU7XHJcbmV4cG9ydCB0eXBlIFhZWl9Db2RlID0gdHlwZW9mIFJFU1RPcGVyYXRpb25Db2RlO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdldENhcGFiaWxpdGllc09wZXJhdGlvbkNvZGUgPSAnR2V0Q2FwYWJpbGl0aWVzJyBhcyBjb25zdDtcclxuZXhwb3J0IGNvbnN0IERlc2NyaWJlRmVhdHVyZVR5cGVPcGVyYXRpb25Db2RlID0gJ0Rlc2NyaWJlRmVhdHVyZVR5cGUnIGFzIGNvbnN0O1xyXG5leHBvcnQgY29uc3QgR2V0RmVhdHVyZUluZm9PcGVyYXRpb25Db2RlID0gJ0dldEZlYXR1cmVJbmZvJyBhcyBjb25zdDtcclxuXHJcblxyXG5mdW5jdGlvbiB0cnVlRm9yQWxsKGxpc3Q6IGFueVtdLCBwcmVkaWNhdGU6IChvOiBhbnkpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3QpIHtcclxuICAgIGlmICghcHJlZGljYXRlKGVudHJ5KSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ29udGV4dChvYmplY3Q6IElPd3NDb250ZXh0KTogb2JqZWN0IGlzIElPd3NDb250ZXh0IHtcclxuICBsZXQgSVNDT05URVhUXzFfMDtcclxuICBpZiAob2JqZWN0Py5wcm9wZXJ0aWVzPy5saW5rcykge1xyXG4gICAgSVNDT05URVhUXzFfMCA9IG9iamVjdC5wcm9wZXJ0aWVzLmxpbmtzLnByb2ZpbGVzLmZpbmQoaXRlbSA9PiBpdGVtLmhyZWYgPT09ICdodHRwOi8vd3d3Lm9wZW5naXMubmV0L3NwZWMvb3djLWdlb2pzb24vMS4wL3JlcS9jb3JlJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoIUlTQ09OVEVYVF8xXzApIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ3RoaXMgaXMgbm90IGEgdmFsaWQgT1dTIENvbnRleHQgdjEuMCEnKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmVzb3VyY2Uob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c1Jlc291cmNlIHtcclxuICByZXR1cm4gJ2lkJyBpbiBvYmplY3QgJiYgJ3R5cGUnIGluIG9iamVjdFxyXG4gICAgJiYgJ3Byb3BlcnRpZXMnIGluIG9iamVjdCAmJiBpc0lPd3NSZXNvdXJjZVByb3BlcnRpZXMob2JqZWN0LnByb3BlcnRpZXMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmVzb3VyY2VQcm9wZXJ0aWVzKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NSZXNvdXJjZVByb3BlcnRpZXMge1xyXG4gIHJldHVybiAndGl0bGUnIGluIG9iamVjdFxyXG4gICAgJiYgJ3VwZGF0ZWQnIGluIG9iamVjdFxyXG4gICAgJiYgKG9iamVjdC5hdXRob3JzID8gdHJ1ZUZvckFsbChvYmplY3QuYXV0aG9ycywgaXNJT3dzQXV0aG9yKSA6IHRydWUpXHJcbiAgICAmJiAob2JqZWN0Lm9mZmVyaW5ncyA/IHRydWVGb3JBbGwob2JqZWN0Lm9mZmVyaW5ncywgaXNJT3dzT2ZmZXJpbmcpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3QuY2F0ZWdvcmllcyA/IHRydWVGb3JBbGwob2JqZWN0LmNhdGVnb3JpZXMsIGlzSU93c0NhdGVnb3J5KSA6IHRydWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzT2ZmZXJpbmcob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c09mZmVyaW5nIHtcclxuICByZXR1cm4gJ2NvZGUnIGluIG9iamVjdFxyXG4gICAgJiYgKG9iamVjdC5vcGVyYXRpb25zID8gdHJ1ZUZvckFsbChvYmplY3Qub3BlcmF0aW9ucywgaXNJT3dzT3BlcmF0aW9uKSA6IHRydWUpXHJcbiAgICAmJiAob2JqZWN0LmNvbnRlbnRzID8gdHJ1ZUZvckFsbChvYmplY3QuY29udGVudHMsIGlzSU93c0NvbnRlbnQpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3Quc3R5bGVzID8gdHJ1ZUZvckFsbChvYmplY3Quc3R5bGVzLCBpc0lPd3NTdHlsZVNldCkgOiB0cnVlKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzR2VuZXJhdG9yKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NHZW5lcmF0b3Ige1xyXG4gIHJldHVybiAndGl0bGUnIGluIG9iamVjdFxyXG4gICAgfHwgJ3VyaScgaW4gb2JqZWN0XHJcbiAgICB8fCAndmVyc2lvbicgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQXV0aG9yKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NBdXRob3Ige1xyXG4gIHJldHVybiAnbmFtZScgaW4gb2JqZWN0XHJcbiAgICB8fCAnZW1haWwnIGluIG9iamVjdFxyXG4gICAgfHwgJ3VyaScgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ2F0ZWdvcnkob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c0NhdGVnb3J5IHtcclxuICByZXR1cm4gJ3NjaGVtZScgaW4gb2JqZWN0XHJcbiAgICB8fCAndGVybScgaW4gb2JqZWN0XHJcbiAgICB8fCAnbGFiZWwnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSU93c0xpbmtzKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NMaW5rcyB7XHJcbiAgcmV0dXJuICdyZWwnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSU93c0NyZWF0b3JEaXNwbGF5KG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NDcmVhdG9yRGlzcGxheSB7XHJcbiAgcmV0dXJuICdwaXhlbFdpZHRoJyBpbiBvYmplY3RcclxuICAgIHx8ICdwaXhlbEhlaWdodCcgaW4gb2JqZWN0XHJcbiAgICB8fCAnbW1QZXJQaXhlbCcgaW4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzT3BlcmF0aW9uKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NPcGVyYXRpb24ge1xyXG4gIHJldHVybiAnY29kZScgaW4gb2JqZWN0XHJcbiAgICAmJiAnbWV0aG9kJyBpbiBvYmplY3RcclxuICAgICYmIChvYmplY3QucmVxdWVzdCA/IGlzSU93c0NvbnRlbnQob2JqZWN0LnJlcXVlc3QpIDogdHJ1ZSlcclxuICAgICYmIChvYmplY3QucmVzdWx0ID8gaXNJT3dzQ29udGVudChvYmplY3QucmVzdWx0KSA6IHRydWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzUmFzdGVyT3BlcmF0aW9uKG9iamVjdDogYW55KTogb2JqZWN0IGlzIElPd3NPcGVyYXRpb24ge1xyXG4gIGlmIChpc0lPd3NPcGVyYXRpb24ob2JqZWN0KSkge1xyXG4gICAgcmV0dXJuIFtHZXRNYXBPcGVyYXRpb25Db2RlLCBHZXRUaWxlT3BlcmF0aW9uQ29kZSwgUkVTVE9wZXJhdGlvbkNvZGVdLmluY2x1ZGVzKG9iamVjdC5jb2RlIGFzIGFueSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0lPd3NWZWN0b3JPcGVyYXRpb24ob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgSU93c09wZXJhdGlvbiB7XHJcbiAgaWYgKGlzSU93c09wZXJhdGlvbihvYmplY3QpKSB7XHJcbiAgICByZXR1cm4gW0dldEZlYXR1cmVPcGVyYXRpb25Db2RlXS5pbmNsdWRlcyhvYmplY3QuY29kZSBhcyBhbnkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJT3dzQ29udGVudChvYmplY3Q6IGFueSk6IG9iamVjdCBpcyBJT3dzQ29udGVudCB7XHJcbiAgcmV0dXJuICd0eXBlJyBpbiBvYmplY3Q7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0lPd3NTdHlsZVNldChvYmplY3Q6IGFueSk6IG9iamVjdCBpcyBJT3dzU3R5bGVTZXQge1xyXG4gIHJldHVybiAnbmFtZScgaW4gb2JqZWN0XHJcbiAgICAmJiAndGl0bGUnIGluIG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzV21zT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgV01TX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSB3bXNPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXZnNPZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBXRlNfT2ZmZXJpbmcge1xyXG4gIHJldHVybiBzdHIgPT09IHdmc09mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc1dwc09mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIFdDU19PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gd2NzT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQ3N3T2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgQ1NXX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBjc3dPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNXbXRzT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgV01UU19PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gd210c09mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dtbE9mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIEdNTF9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gZ21sT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzS21sT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgS01MX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBrbWxPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9USUZGT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgR2VvVElGRl9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gR2VvVElGRk9mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dNTEpQMk9mZmVyaW5nKHN0cjogc3RyaW5nKTogc3RyIGlzIEdNTEpQMl9PZmZlcmluZyB7XHJcbiAgcmV0dXJuIHN0ciA9PT0gR01MSlAyT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzR01MQ09WT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgR01MQ09WX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBHTUxDT1ZPZmZlcmluZztcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gaXNYeXpPZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBYeXpfT2ZmZXJpbmcge1xyXG4gIHJldHVybiBzdHIgPT09IHh5ek9mZmVyaW5nO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0dlb0pzb25PZmZlcmluZyhzdHI6IHN0cmluZyk6IHN0ciBpcyBHZW9Kc29uX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSBHZW9Kc29uT2ZmZXJpbmc7XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVE1TT2ZmZXJpbmcoc3RyOiBzdHJpbmcpOiBzdHIgaXMgVE1TX09mZmVyaW5nIHtcclxuICByZXR1cm4gc3RyID09PSB0bXNPZmZlcmluZztcclxufVxyXG4iXX0=