@ultipa-graph/ultipa-driver
Version:
NodeJS SDK for Ultipa GQL
168 lines • 25.1 kB
JavaScript
;
/**
* Admin service handles administrative operations.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.AdminService = void 0;
const types_1 = require("../types");
const services_1 = require("../services");
const converters_1 = require("./converters");
/**
* Admin service for administrative operations.
*/
class AdminService {
ctx;
constructor(ctx) {
this.ctx = ctx;
}
/**
* Pre-allocate parser instances.
*/
async warmupParser(count) {
const metadata = this.ctx.getSessionMetadata();
await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'WarmupParser', { count }, metadata);
}
/**
* Return cache statistics.
*/
async getCacheStats(cacheType = types_1.CacheType.ALL) {
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetCacheStats', { cache_type: (0, converters_1.cacheTypeToProto)(cacheType) }, metadata);
return {
astStats: response.ast_stats
? {
hits: parseInt(response.ast_stats.hits || '0', 10),
misses: parseInt(response.ast_stats.misses || '0', 10),
evictions: parseInt(response.ast_stats.evictions || '0', 10),
entries: response.ast_stats.entries || 0,
hitRate: response.ast_stats.hit_rate || 0,
}
: undefined,
planStats: response.plan_stats
? {
size: response.plan_stats.size || 0,
capacity: response.plan_stats.capacity || 0,
hits: parseInt(response.plan_stats.hits || '0', 10),
misses: parseInt(response.plan_stats.misses || '0', 10),
hitRate: response.plan_stats.hit_rate || 0,
}
: undefined,
};
}
/**
* Clear the specified cache.
*/
async clearCache(cacheType = types_1.CacheType.ALL) {
const metadata = this.ctx.getSessionMetadata();
await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'ClearCache', { cache_type: (0, converters_1.cacheTypeToProto)(cacheType) }, metadata);
}
/**
* Return database statistics.
*/
async getStatistics(graphName = '') {
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetStatistics', { graph_name: graphName }, metadata);
const labelCounts = {};
const edgeLabelCounts = {};
if (response.label_counts) {
for (const [key, value] of Object.entries(response.label_counts)) {
labelCounts[key] = parseInt(value, 10);
}
}
if (response.edge_label_counts) {
for (const [key, value] of Object.entries(response.edge_label_counts)) {
edgeLabelCounts[key] = parseInt(value, 10);
}
}
return {
nodeCount: parseInt(response.node_count || '0', 10),
edgeCount: parseInt(response.edge_count || '0', 10),
labelCounts,
edgeLabelCounts,
};
}
/**
* Invalidate the RBAC permission cache.
*/
async invalidatePermissionCache(username = '') {
const metadata = this.ctx.getSessionMetadata();
await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'InvalidatePermissionCache', { username }, metadata);
}
/**
* Trigger manual compaction of the database storage.
*/
async compact() {
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'Compact', {}, metadata);
return {
success: response.success || false,
message: response.message || '',
};
}
/**
* Return system-level metrics (CPU, memory, disk I/O, storage, network).
*/
async getSystemMetrics() {
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'GetSystemMetrics', {}, metadata);
return {
cpu: response.cpu
? {
processPercent: response.cpu.process_percent || 0,
systemPercent: response.cpu.system_percent || 0,
numCores: response.cpu.num_cores || 0,
}
: undefined,
memory: response.memory
? {
processRss: parseInt(response.memory.process_rss || '0', 10),
heapAlloc: parseInt(response.memory.heap_alloc || '0', 10),
heapSys: parseInt(response.memory.heap_sys || '0', 10),
stackInUse: parseInt(response.memory.stack_in_use || '0', 10),
systemTotal: parseInt(response.memory.system_total || '0', 10),
systemAvailable: parseInt(response.memory.system_available || '0', 10),
systemUsed: parseInt(response.memory.system_used || '0', 10),
systemUsedPercent: response.memory.system_used_percent || 0,
}
: undefined,
diskIO: response.disk_io
? {
readBytes: parseInt(response.disk_io.read_bytes || '0', 10),
writeBytes: parseInt(response.disk_io.write_bytes || '0', 10),
readCount: parseInt(response.disk_io.read_count || '0', 10),
writeCount: parseInt(response.disk_io.write_count || '0', 10),
}
: undefined,
storage: response.storage
? {
dbPath: response.storage.db_path || '',
dbSizeBytes: parseInt(response.storage.db_size_bytes || '0', 10),
volumeTotal: parseInt(response.storage.volume_total || '0', 10),
volumeFree: parseInt(response.storage.volume_free || '0', 10),
volumeUsed: parseInt(response.storage.volume_used || '0', 10),
}
: undefined,
network: response.network
? {
bytesSent: parseInt(response.network.bytes_sent || '0', 10),
bytesRecv: parseInt(response.network.bytes_recv || '0', 10),
packetsSent: parseInt(response.network.packets_sent || '0', 10),
packetsRecv: parseInt(response.network.packets_recv || '0', 10),
}
: undefined,
};
}
/**
* Wait for the computing engine topology to be ready.
*/
async waitForComputeTopology(graphName, timeoutMs = 0) {
const metadata = this.ctx.getSessionMetadata();
const response = await (0, services_1.promisifyCall)(this.ctx.clients.adminService, 'WaitForComputeTopology', { graph_name: graphName, timeout_ms: timeoutMs }, metadata);
return {
ready: response.ready || false,
message: response.message || '',
};
}
}
exports.AdminService = AdminService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9hZG1pbi1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7O0FBR0gsb0NBQWtIO0FBQ2xILDBDQUE0QztBQUM1Qyw2Q0FBZ0Q7QUFFaEQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFDSDtJQUFwQixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtJQUFHLENBQUM7SUFFM0M7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWE7UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBQSx3QkFBYSxFQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLGNBQWMsRUFDZCxFQUFFLEtBQUssRUFBRSxFQUNULFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUF1QixpQkFBUyxDQUFDLEdBQUc7UUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQzdCLGVBQWUsRUFDZixFQUFFLFVBQVUsRUFBRSxJQUFBLDZCQUFnQixFQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQzNDLFFBQVEsQ0FDVCxDQUFDO1FBRUYsT0FBTztZQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDMUIsQ0FBQyxDQUFDO29CQUNFLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FB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QUFFLEVBQUUsQ0FBQztvQkFDM0QsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO29CQUMzRCxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQy9ELFdBQVcsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztpQkFDaEU7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWlCLEVBQUUsWUFBb0IsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQVEsTUFBTSxJQUFBLHdCQUFhLEVBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFDN0Isd0JBQXdCLEVBQ3hCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQ2hELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsT0FBTztZQUNMLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUs7WUFDOUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBNU1ELG9DQTRNQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWRtaW4gc2VydmljZSBoYW5kbGVzIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnMuXG4gKi9cblxuaW1wb3J0IHsgU2VydmljZUNvbnRleHQgfSBmcm9tICcuL3NlcnZpY2UtY29udGV4dCc7XG5pbXBvcnQgeyBDYWNoZVN0YXRzLCBDYWNoZVR5cGUsIFN0YXRpc3RpY3MsIENvbXBhY3RSZXN1bHQsIENvbXB1dGVUb3BvbG9neVJlc3VsdCwgU3lzdGVtTWV0cmljcyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByb21pc2lmeUNhbGwgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBjYWNoZVR5cGVUb1Byb3RvIH0gZnJvbSAnLi9jb252ZXJ0ZXJzJztcblxuLyoqXG4gKiBBZG1pbiBzZXJ2aWNlIGZvciBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgQWRtaW5TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdHg6IFNlcnZpY2VDb250ZXh0KSB7fVxuXG4gIC8qKlxuICAgKiBQcmUtYWxsb2NhdGUgcGFyc2VyIGluc3RhbmNlcy5cbiAgICovXG4gIGFzeW5jIHdhcm11cFBhcnNlcihjb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBhd2FpdCBwcm9taXNpZnlDYWxsKFxuICAgICAgdGhpcy5jdHguY2xpZW50cy5hZG1pblNlcnZpY2UsXG4gICAgICAnV2FybXVwUGFyc2VyJyxcbiAgICAgIHsgY291bnQgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTxDYWNoZVN0YXRzPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0dldENhY2hlU3RhdHMnLFxuICAgICAgeyBjYWNoZV90eXBlOiBjYWNoZVR5cGVUb1Byb3RvKGNhY2hlVHlwZSkgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhc3RTdGF0czogcmVzcG9uc2UuYXN0X3N0YXRzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaGl0czogcGFyc2VJbnQocmVzcG9uc2UuYXN0X3N0YXRzLmhpdHMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBtaXNzZXM6IHBhcnNlSW50KHJlc3BvbnNlLmFzdF9zdGF0cy5taXNzZXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBldmljdGlvbnM6IHBhcnNlSW50KHJlc3BvbnNlLmFzdF9zdGF0cy5ldmljdGlvbnMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBlbnRyaWVzOiByZXNwb25zZS5hc3Rfc3RhdHMuZW50cmllcyB8fCAwLFxuICAgICAgICAgICAgaGl0UmF0ZTogcmVzcG9uc2UuYXN0X3N0YXRzLmhpdF9yYXRlIHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBsYW5TdGF0czogcmVzcG9uc2UucGxhbl9zdGF0c1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNpemU6IHJlc3BvbnNlLnBsYW5fc3RhdHMuc2l6ZSB8fCAwLFxuICAgICAgICAgICAgY2FwYWNpdHk6IHJlc3BvbnNlLnBsYW5fc3RhdHMuY2FwYWNpdHkgfHwgMCxcbiAgICAgICAgICAgIGhpdHM6IHBhcnNlSW50KHJlc3BvbnNlLnBsYW5fc3RhdHMuaGl0cyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIG1pc3NlczogcGFyc2VJbnQocmVzcG9uc2UucGxhbl9zdGF0cy5taXNzZXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBoaXRSYXRlOiByZXNwb25zZS5wbGFuX3N0YXRzLmhpdF9yYXRlIHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzcGVjaWZpZWQgY2FjaGUuXG4gICAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0NsZWFyQ2FjaGUnLFxuICAgICAgeyBjYWNoZV90eXBlOiBjYWNoZVR5cGVUb1Byb3RvKGNhY2hlVHlwZSkgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZGF0YWJhc2Ugc3RhdGlzdGljcy5cbiAgICovXG4gIGFzeW5jIGdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8U3RhdGlzdGljcz4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdHZXRTdGF0aXN0aWNzJyxcbiAgICAgIHsgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lIH0sXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICBjb25zdCBsYWJlbENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGNvbnN0IGVkZ2VMYWJlbENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuXG4gICAgaWYgKHJlc3BvbnNlLmxhYmVsX2NvdW50cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzcG9uc2UubGFiZWxfY291bnRzKSkge1xuICAgICAgICBsYWJlbENvdW50c1trZXldID0gcGFyc2VJbnQodmFsdWUgYXMgc3RyaW5nLCAxMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmVkZ2VfbGFiZWxfY291bnRzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5lZGdlX2xhYmVsX2NvdW50cykpIHtcbiAgICAgICAgZWRnZUxhYmVsQ291bnRzW2tleV0gPSBwYXJzZUludCh2YWx1ZSBhcyBzdHJpbmcsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5ub2RlX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgZWRnZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5lZGdlX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgbGFiZWxDb3VudHMsXG4gICAgICBlZGdlTGFiZWxDb3VudHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUuXG4gICAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0ludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUnLFxuICAgICAgeyB1c2VybmFtZSB9LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgbWFudWFsIGNvbXBhY3Rpb24gb2YgdGhlIGRhdGFiYXNlIHN0b3JhZ2UuXG4gICAqL1xuICBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8Q29tcGFjdFJlc3VsdD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdDb21wYWN0JyxcbiAgICAgIHt9LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiByZXNwb25zZS5zdWNjZXNzIHx8IGZhbHNlLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzeXN0ZW0tbGV2ZWwgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGRpc2sgSS9PLCBzdG9yYWdlLCBuZXR3b3JrKS5cbiAgICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcbiAgICBjb25zdCByZXNwb25zZTogYW55ID0gYXdhaXQgcHJvbWlzaWZ5Q2FsbChcbiAgICAgIHRoaXMuY3R4LmNsaWVudHMuYWRtaW5TZXJ2aWNlLFxuICAgICAgJ0dldFN5c3RlbU1ldHJpY3MnLFxuICAgICAge30sXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3B1OiByZXNwb25zZS5jcHVcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9jZXNzUGVyY2VudDogcmVzcG9uc2UuY3B1LnByb2Nlc3NfcGVyY2VudCB8fCAwLFxuICAgICAgICAgICAgc3lzdGVtUGVyY2VudDogcmVzcG9uc2UuY3B1LnN5c3RlbV9wZXJjZW50IHx8IDAsXG4gICAgICAgICAgICBudW1Db3JlczogcmVzcG9uc2UuY3B1Lm51bV9jb3JlcyB8fCAwLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBtZW1vcnk6IHJlc3BvbnNlLm1lbW9yeVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb2Nlc3NSc3M6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5wcm9jZXNzX3JzcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIGhlYXBBbGxvYzogcGFyc2VJbnQocmVzcG9uc2UubWVtb3J5LmhlYXBfYWxsb2MgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBoZWFwU3lzOiBwYXJzZUludChyZXNwb25zZS5tZW1vcnkuaGVhcF9zeXMgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBzdGFja0luVXNlOiBwYXJzZUludChyZXNwb25zZS5tZW1vcnkuc3RhY2tfaW5fdXNlIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVG90YWw6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fdG90YWwgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBzeXN0ZW1BdmFpbGFibGU6IHBhcnNlSW50KHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fYXZhaWxhYmxlIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVXNlZDogcGFyc2VJbnQocmVzcG9uc2UubWVtb3J5LnN5c3RlbV91c2VkIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgc3lzdGVtVXNlZFBlcmNlbnQ6IHJlc3BvbnNlLm1lbW9yeS5zeXN0ZW1fdXNlZF9wZXJjZW50IHx8IDAsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRpc2tJTzogcmVzcG9uc2UuZGlza19pb1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJlYWRCeXRlczogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby5yZWFkX2J5dGVzIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgd3JpdGVCeXRlczogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby53cml0ZV9ieXRlcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHJlYWRDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby5yZWFkX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgICAgICAgd3JpdGVDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZGlza19pby53cml0ZV9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc3RvcmFnZTogcmVzcG9uc2Uuc3RvcmFnZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGRiUGF0aDogcmVzcG9uc2Uuc3RvcmFnZS5kYl9wYXRoIHx8ICcnLFxuICAgICAgICAgICAgZGJTaXplQnl0ZXM6IHBhcnNlSW50KHJlc3BvbnNlLnN0b3JhZ2UuZGJfc2l6ZV9ieXRlcyB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHZvbHVtZVRvdGFsOiBwYXJzZUludChyZXNwb25zZS5zdG9yYWdlLnZvbHVtZV90b3RhbCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHZvbHVtZUZyZWU6IHBhcnNlSW50KHJlc3BvbnNlLnN0b3JhZ2Uudm9sdW1lX2ZyZWUgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICB2b2x1bWVVc2VkOiBwYXJzZUludChyZXNwb25zZS5zdG9yYWdlLnZvbHVtZV91c2VkIHx8ICcwJywgMTApLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBuZXR3b3JrOiByZXNwb25zZS5uZXR3b3JrXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYnl0ZXNTZW50OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLmJ5dGVzX3NlbnQgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICBieXRlc1JlY3Y6IHBhcnNlSW50KHJlc3BvbnNlLm5ldHdvcmsuYnl0ZXNfcmVjdiB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHBhY2tldHNTZW50OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLnBhY2tldHNfc2VudCB8fCAnMCcsIDEwKSxcbiAgICAgICAgICAgIHBhY2tldHNSZWN2OiBwYXJzZUludChyZXNwb25zZS5uZXR3b3JrLnBhY2tldHNfcmVjdiB8fCAnMCcsIDEwKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkuXG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmFkbWluU2VydmljZSxcbiAgICAgICdXYWl0Rm9yQ29tcHV0ZVRvcG9sb2d5JyxcbiAgICAgIHsgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lLCB0aW1lb3V0X21zOiB0aW1lb3V0TXMgfSxcbiAgICAgIG1ldGFkYXRhXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVhZHk6IHJlc3BvbnNlLnJlYWR5IHx8IGZhbHNlLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSB8fCAnJyxcbiAgICB9O1xuICB9XG59XG4iXX0=