UNPKG

homebridge-luxor

Version:

Homebridge Plug-in for the FX Luminaire (Luxor) lighting controller

172 lines 29.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZDC_Light = void 0; // var desiredHue = -1, // desiredSaturation = -1; // HomeKit calls Hue/Saturation independently but we need both of them // var desiredHueSatTimer; // timer to clear desired values if we don't get both const ZD_Light_1 = require("./ZD_Light"); class ZDC_Light extends ZD_Light_1.ZD_Light { constructor(platform, accessory) { super(platform, accessory); } setServices() { super.setServices(); this.service.getCharacteristic(this.platform.Characteristic.Saturation) .on('get', this.getSaturation.bind(this)) .on('set', this.setSaturation.bind(this)); this.service.getCharacteristic(this.platform.Characteristic.Hue) .on('get', this.getHue.bind(this)) .on('set', this.setHue.bind(this)); this.controller.registerCallback(this.accessory.UUID, this.context.type, this.context.groupNumber, this.platform.Characteristic.Hue, this.callbackHue.bind(this)); this.controller.registerCallback(this.accessory.UUID, this.context.type, this.context.groupNumber, this.platform.Characteristic.Saturation, this.callbackSat.bind(this)); } getHue(callback) { this.controller.GetColorAsync(this.context.color).then(colors => { this.context.hue = colors.Hue; // shouldn't need this // this.service.updateCharacteristic(this.platform.Characteristic.Hue, colors.Hue); // this.service.updateCharacteristic(this.platform.Characteristic.Saturation, colors.Sat); callback(null, this.context.hue); }).catch((err) => { this.log.error(`${this.accessory.displayName} getHue error: ${err}`); callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */, false); }); } ; setHue(desiredHue, callback) { this.desiredHue = desiredHue; this.hueCallback = callback; if (typeof this.satCallback !== 'undefined') setTimeout(() => { this.colorListSetCallbacks(); }, 100); } ; getSaturation(callback) { this.controller.GetColorAsync(this.context.color).then(colors => { this.context.saturation = colors.Sat; // shouldn't need this // this.service.updateCharacteristic(this.platform.Characteristic.Hue, colors.Hue); // this.service.updateCharacteristic(this.platform.Characteristic.Saturation, colors.Sat); callback(null, this.context.saturation); }).catch((err) => { this.log.error(`${this.accessory.displayName} getSaturation error: ${err}`); callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */, false); }); } ; setSaturation(desiredSaturation, callback) { this.desiredSaturation = desiredSaturation; this.satCallback = callback; if (typeof this.hueCallback !== 'undefined') setTimeout(() => { this.colorListSetCallbacks(); }, 200); } ; async colorListSet() { try { let status = await this.controller.ColorListSetAsync(this.context.color, this.desiredHue, this.desiredSaturation); if (status.Status > 0) { this.context.hue = this.desiredHue; this.context.saturation = this.desiredSaturation; this.desiredHue = undefined; this.desiredSaturation = undefined; } return status; } catch (err) { this.log.error(`${this.accessory.displayName} colorListSet error: ${err}`); } ; } colorListSetCallbacks() { this.colorListSet().then(() => { if (typeof this.satCallback === 'function') this.satCallback(null); this.satCallback = undefined; if (typeof this.hueCallback === 'function') this.hueCallback(null); this.hueCallback = undefined; }).catch((err) => { this.log.error(`${this.accessory.displayName} colorListSetCallbacks error: ${err}`); if (typeof this.satCallback === 'function') this.satCallback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */); this.satCallback = undefined; if (typeof this.hueCallback === 'function') this.hueCallback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */); this.hueCallback = undefined; }); } async groupListEditAsync(currentColor) { try { if (this.context.color === 0) return; // if the color paletto CXXX was change outside homebridge, but the user selects to set the color/brightness then make sure we assign the right color. var desiredColor = 250 - this.context.groupNumber + 1; if (currentColor !== desiredColor) { this.log.debug('%s color assignment was changed outside of HomeKit. Changing to %s', this.accessory.displayName, desiredColor); this.context.color = desiredColor; await this.controller.GroupListEditAsync(this.accessory.displayName, this.context.groupNumber, this.context.color); } return Promise.resolve(); } catch (err) { this.log.error(`${this.accessory.displayName} groupListEdit error: ${err}`); return Promise.reject(); } ; } ; // this method used for event handling async getCurrentStateAsync() { return new Promise(async (resolve, reject) => { try { let group = await this.controller.GetGroupAsync(this.context.groupNumber); this.context.brightness = group.Intensity; this.context.isOn = this.context.brightness > 0; if (this.context.independentColors) await this.groupListEditAsync(group.Color); else { this.context.color = group.Color; } let colors = await this.controller.GetColorAsync(this.context.color); if (colors.Hue !== this.context.hue || colors.Sat !== this.context.saturation) { this.desiredHue = colors.Hue; this.desiredSaturation = colors.Sat; await this.colorListSet(); } else { this.context.hue = colors.Hue; this.context.saturation = colors.Sat; } resolve(); } catch (err) { this.log.error(`${this.accessory.displayName} getCurrentStateAsync error: ${err}`); reject(err); } }); } setCharacteristics() { this.service.updateCharacteristic(this.platform.Characteristic.On, typeof this.context.isOn !== 'undefined' ? this.context.isOn : false); this.service.updateCharacteristic(this.platform.Characteristic.Brightness, typeof this.context.brightness !== 'undefined' ? this.context.brightness : 0); this.service.updateCharacteristic(this.platform.Characteristic.Hue, typeof this.context.hue !== 'undefined' ? this.context.hue : 0); this.service.updateCharacteristic(this.platform.Characteristic.Saturation, typeof this.context.saturation !== 'undefined' ? this.context.saturation : 0); } // this method used for callbacks callbackHue(hue) { if (hue !== this.context.hue && this.context.color !== 0) { this.context.hue = hue; // this.log.debug(`${this.accessory.displayName} updated hue to ${hue}.`); this.service.updateCharacteristic(this.platform.Characteristic.Hue, hue); } } ; callbackSat(saturation) { if (saturation !== this.context.saturation && this.context.color !== 0) { this.context.saturation = saturation; // this.log.debug(`${this.accessory.displayName} updated saturation to ${saturation}.`); this.service.updateCharacteristic(this.platform.Characteristic.Saturation, saturation); } } ; } exports.ZDC_Light = ZDC_Light; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWkRDX0xpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpZ2h0cy9aRENfTGlnaHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUJBQXVCO0FBQ3ZCLHFHQUFxRztBQUNyRyxnRkFBZ0Y7QUFDaEYseUNBQXNDO0FBTXRDLE1BQWEsU0FBVSxTQUFRLG1CQUFRO0lBS25DLFlBQVksUUFBdUIsRUFBRSxTQUE0QjtRQUM3RCxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1AsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO2FBQ2xFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDeEMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTlDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2FBQzNELEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEssSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3SyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQW1DO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDOUIsc0JBQXNCO1lBQ3RCLG1GQUFtRjtZQUNuRiwwRkFBMEY7WUFDMUYsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDcEUsUUFBUSw0Q0FBeUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQUEsQ0FBQztJQUVGLE1BQU0sQ0FBQyxVQUFrQixFQUFFLFFBQW1DO1FBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDO1FBQzVCLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVc7WUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUFBLENBQUM7SUFFRixhQUFhLENBQUMsUUFBbUM7UUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUNyQyxzQkFBc0I7WUFDdEIsbUZBQW1GO1lBQ25GLDBGQUEwRjtZQUMxRixRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUMzRSxRQUFRLDRDQUF5QyxLQUFLLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFBQSxDQUFDO0lBRUYsYUFBYSxDQUFDLGlCQUF5QixFQUFFLFFBQW1DO1FBQ3hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUM1QixJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFBQSxDQUFDO0lBRUYsS0FBSyxDQUFDLFlBQVk7UUFDZCxJQUFJO1lBQ0EsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDbEgsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQzthQUN0QztZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxHQUFHLEVBQUU7WUFDUixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyx3QkFBd0IsR0FBRyxFQUFFLENBQUMsQ0FBQTtTQUM3RTtRQUFBLENBQUM7SUFDTixDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzFCLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVU7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVO2dCQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxpQ0FBaUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUNuRixJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVO2dCQUFFLElBQUksQ0FBQyxXQUFXLDJDQUF3QyxDQUFDO1lBQ3JHLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVU7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsMkNBQXdDLENBQUM7WUFDckcsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFlBQW9CO1FBQ3pDLElBQUk7WUFDQSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLENBQUM7Z0JBQUUsT0FBTztZQUNyQyxzSkFBc0o7WUFDdEosSUFBSSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUN0RCxJQUFJLFlBQVksS0FBSyxZQUFZLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNoSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RIO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDNUI7UUFDRCxPQUFPLEdBQUcsRUFBRTtZQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQUMsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDeEc7UUFBQSxDQUFDO0lBQ04sQ0FBQztJQUFBLENBQUM7SUFFRixzQ0FBc0M7SUFDdEMsS0FBSyxDQUFDLG9CQUFvQjtRQUN0QixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDekMsSUFBSTtnQkFDQSxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtvQkFBRSxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzFFO29CQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7aUJBQUU7Z0JBQzFDLElBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDcEUsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7b0JBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7b0JBQ3BDLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2lCQUM3QjtxQkFDSTtvQkFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO29CQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4QztnQkFDRCxPQUFPLEVBQUUsQ0FBQzthQUNiO1lBQ0QsT0FBTyxHQUFHLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDLENBQUE7Z0JBQ2xGLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNmO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6SSxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pKLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3SixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLFdBQVcsQ0FBQyxHQUFXO1FBQ25CLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDdkIsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzVFO0lBQ0wsQ0FBQztJQUFBLENBQUM7SUFFRixXQUFXLENBQUMsVUFBa0I7UUFDMUIsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUNyQyx3RkFBd0Y7WUFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDMUY7SUFDTCxDQUFDO0lBQUEsQ0FBQztDQUNMO0FBaktELDhCQWlLQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8gdmFyIGRlc2lyZWRIdWUgPSAtMSxcbi8vICAgICBkZXNpcmVkU2F0dXJhdGlvbiA9IC0xOyAvLyBIb21lS2l0IGNhbGxzIEh1ZS9TYXR1cmF0aW9uIGluZGVwZW5kZW50bHkgYnV0IHdlIG5lZWQgYm90aCBvZiB0aGVtXG4vLyB2YXIgZGVzaXJlZEh1ZVNhdFRpbWVyOyAvLyB0aW1lciB0byBjbGVhciBkZXNpcmVkIHZhbHVlcyBpZiB3ZSBkb24ndCBnZXQgYm90aFxuaW1wb3J0IHsgWkRfTGlnaHQgfSBmcm9tICcuL1pEX0xpZ2h0JztcblxuaW1wb3J0IHsgU2VydmljZSwgUGxhdGZvcm1BY2Nlc3NvcnksIENoYXJhY3RlcmlzdGljVmFsdWUsIENoYXJhY3RlcmlzdGljU2V0Q2FsbGJhY2ssIENoYXJhY3RlcmlzdGljR2V0Q2FsbGJhY2ssIEhhcFN0YXR1c0Vycm9yLCBIQVBTdGF0dXMgfSBmcm9tICdob21lYnJpZGdlJztcbmltcG9ydCB7IElDb250ZXh0LCBMdXhvclBsYXRmb3JtIH0gZnJvbSAnLi4vTHV4b3JQbGF0Zm9ybSc7XG5pbXBvcnQgeyBJU3RhdHVzIH0gZnJvbSAnLi4vY29udHJvbGxlci9CYXNlQ29udHJvbGxlcic7XG5cbmV4cG9ydCBjbGFzcyBaRENfTGlnaHQgZXh0ZW5kcyBaRF9MaWdodCB7XG4gICAgcHJpdmF0ZSBkZXNpcmVkSHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBkZXNpcmVkU2F0dXJhdGlvbjogbnVtYmVyXG4gICAgcHJpdmF0ZSBodWVDYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNTZXRDYWxsYmFjaztcbiAgICBwcml2YXRlIHNhdENhbGxiYWNrOiBDaGFyYWN0ZXJpc3RpY1NldENhbGxiYWNrO1xuICAgIGNvbnN0cnVjdG9yKHBsYXRmb3JtOiBMdXhvclBsYXRmb3JtLCBhY2Nlc3Nvcnk6IFBsYXRmb3JtQWNjZXNzb3J5KSB7XG4gICAgICAgIHN1cGVyKHBsYXRmb3JtLCBhY2Nlc3NvcnkpO1xuICAgIH1cblxuICAgIHNldFNlcnZpY2VzKCkge1xuICAgICAgICBzdXBlci5zZXRTZXJ2aWNlcygpO1xuXG4gICAgICAgIHRoaXMuc2VydmljZS5nZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLlNhdHVyYXRpb24pXG4gICAgICAgICAgICAub24oJ2dldCcsIHRoaXMuZ2V0U2F0dXJhdGlvbi5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdzZXQnLCB0aGlzLnNldFNhdHVyYXRpb24uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdldENoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuSHVlKVxuICAgICAgICAgICAgLm9uKCdnZXQnLCB0aGlzLmdldEh1ZS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdzZXQnLCB0aGlzLnNldEh1ZS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmFjY2Vzc29yeS5VVUlELCB0aGlzLmNvbnRleHQudHlwZSwgdGhpcy5jb250ZXh0Lmdyb3VwTnVtYmVyLCB0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLkh1ZSwgdGhpcy5jYWxsYmFja0h1ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5hY2Nlc3NvcnkuVVVJRCwgdGhpcy5jb250ZXh0LnR5cGUsIHRoaXMuY29udGV4dC5ncm91cE51bWJlciwgdGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5TYXR1cmF0aW9uLCB0aGlzLmNhbGxiYWNrU2F0LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGdldEh1ZShjYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNHZXRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuR2V0Q29sb3JBc3luYyh0aGlzLmNvbnRleHQuY29sb3IpLnRoZW4oY29sb3JzID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5odWUgPSBjb2xvcnMuSHVlO1xuICAgICAgICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdGhpc1xuICAgICAgICAgICAgLy8gdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuSHVlLCBjb2xvcnMuSHVlKTtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLlNhdHVyYXRpb24sIGNvbG9ycy5TYXQpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5jb250ZXh0Lmh1ZSk7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBnZXRIdWUgZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgICAgICBjYWxsYmFjayhIQVBTdGF0dXMuTk9UX0FMTE9XRURfSU5fQ1VSUkVOVF9TVEFURSwgZmFsc2UpOyBcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEh1ZShkZXNpcmVkSHVlOiBudW1iZXIsIGNhbGxiYWNrOiBDaGFyYWN0ZXJpc3RpY1NldENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzaXJlZEh1ZSA9IGRlc2lyZWRIdWU7XG4gICAgICAgIHRoaXMuaHVlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNhdENhbGxiYWNrICE9PSAndW5kZWZpbmVkJykgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuY29sb3JMaXN0U2V0Q2FsbGJhY2tzKCkgfSwgMTAwKTtcbiAgICB9O1xuICAgIFxuICAgIGdldFNhdHVyYXRpb24oY2FsbGJhY2s6IENoYXJhY3RlcmlzdGljR2V0Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLkdldENvbG9yQXN5bmModGhpcy5jb250ZXh0LmNvbG9yKS50aGVuKGNvbG9ycyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F0dXJhdGlvbiA9IGNvbG9ycy5TYXQ7XG4gICAgICAgICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0aGlzXG4gICAgICAgICAgICAvLyB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5IdWUsIGNvbG9ycy5IdWUpO1xuICAgICAgICAgICAgLy8gdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuU2F0dXJhdGlvbiwgY29sb3JzLlNhdCk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLmNvbnRleHQuc2F0dXJhdGlvbik7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBnZXRTYXR1cmF0aW9uIGVycm9yOiAke2Vycn1gKVxuICAgICAgICAgICAgY2FsbGJhY2soSEFQU3RhdHVzLk5PVF9BTExPV0VEX0lOX0NVUlJFTlRfU1RBVEUsIGZhbHNlKTsgICBcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldFNhdHVyYXRpb24oZGVzaXJlZFNhdHVyYXRpb246IG51bWJlciwgY2FsbGJhY2s6IENoYXJhY3RlcmlzdGljU2V0Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXNpcmVkU2F0dXJhdGlvbiA9IGRlc2lyZWRTYXR1cmF0aW9uO1xuICAgICAgICB0aGlzLnNhdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5odWVDYWxsYmFjayAhPT0gJ3VuZGVmaW5lZCcpIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNvbG9yTGlzdFNldENhbGxiYWNrcygpIH0sIDIwMCk7XG4gICAgfTtcblxuICAgIGFzeW5jIGNvbG9yTGlzdFNldCgpOiBQcm9taXNlPElTdGF0dXM+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuQ29sb3JMaXN0U2V0QXN5bmModGhpcy5jb250ZXh0LmNvbG9yLCB0aGlzLmRlc2lyZWRIdWUsIHRoaXMuZGVzaXJlZFNhdHVyYXRpb24pO1xuICAgICAgICAgICAgaWYgKHN0YXR1cy5TdGF0dXMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Lmh1ZSA9IHRoaXMuZGVzaXJlZEh1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F0dXJhdGlvbiA9IHRoaXMuZGVzaXJlZFNhdHVyYXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5kZXNpcmVkSHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzaXJlZFNhdHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBjb2xvckxpc3RTZXQgZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29sb3JMaXN0U2V0Q2FsbGJhY2tzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbG9yTGlzdFNldCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNhdENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB0aGlzLnNhdENhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zYXRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5odWVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5odWVDYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIHRoaXMuaHVlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBjb2xvckxpc3RTZXRDYWxsYmFja3MgZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2F0Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHRoaXMuc2F0Q2FsbGJhY2soSEFQU3RhdHVzLk5PVF9BTExPV0VEX0lOX0NVUlJFTlRfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy5zYXRDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5odWVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5odWVDYWxsYmFjayhIQVBTdGF0dXMuTk9UX0FMTE9XRURfSU5fQ1VSUkVOVF9TVEFURSk7XG4gICAgICAgICAgICB0aGlzLmh1ZUNhbGxiYWNrID0gdW5kZWZpbmVkOyBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ3JvdXBMaXN0RWRpdEFzeW5jKGN1cnJlbnRDb2xvcjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICAvLyBpZiB0aGUgY29sb3IgcGFsZXR0byBDWFhYIHdhcyBjaGFuZ2Ugb3V0c2lkZSBob21lYnJpZGdlLCBidXQgdGhlIHVzZXIgc2VsZWN0cyB0byBzZXQgdGhlIGNvbG9yL2JyaWdodG5lc3MgdGhlbiBtYWtlIHN1cmUgd2UgYXNzaWduIHRoZSByaWdodCBjb2xvci5cbiAgICAgICAgICAgIHZhciBkZXNpcmVkQ29sb3IgPSAyNTAgLSB0aGlzLmNvbnRleHQuZ3JvdXBOdW1iZXIgKyAxO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2xvciAhPT0gZGVzaXJlZENvbG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoJyVzIGNvbG9yIGFzc2lnbm1lbnQgd2FzIGNoYW5nZWQgb3V0c2lkZSBvZiBIb21lS2l0LiAgQ2hhbmdpbmcgdG8gJXMnLCB0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZSwgZGVzaXJlZENvbG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuY29sb3IgPSBkZXNpcmVkQ29sb3I7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLkdyb3VwTGlzdEVkaXRBc3luYyh0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZSwgdGhpcy5jb250ZXh0Lmdyb3VwTnVtYmVyLCB0aGlzLmNvbnRleHQuY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBncm91cExpc3RFZGl0IGVycm9yOiAke2Vycn1gKTsgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8vIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgYXN5bmMgZ2V0Q3VycmVudFN0YXRlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGF3YWl0IHRoaXMuY29udHJvbGxlci5HZXRHcm91cEFzeW5jKHRoaXMuY29udGV4dC5ncm91cE51bWJlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJyaWdodG5lc3MgPSBncm91cC5JbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzT24gPSB0aGlzLmNvbnRleHQuYnJpZ2h0bmVzcyA+IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbmRlcGVuZGVudENvbG9ycykgYXdhaXQgdGhpcy5ncm91cExpc3RFZGl0QXN5bmMoZ3JvdXAuQ29sb3IpO1xuICAgICAgICAgICAgICAgIGVsc2UgeyB0aGlzLmNvbnRleHQuY29sb3IgPSBncm91cC5Db2xvcjsgfVxuICAgICAgICAgICAgICAgIGxldCBjb2xvcnMgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuR2V0Q29sb3JBc3luYyh0aGlzLmNvbnRleHQuY29sb3IpXG4gICAgICAgICAgICAgICAgaWYgKGNvbG9ycy5IdWUgIT09IHRoaXMuY29udGV4dC5odWUgfHwgY29sb3JzLlNhdCAhPT0gdGhpcy5jb250ZXh0LnNhdHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNpcmVkSHVlID0gY29sb3JzLkh1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNpcmVkU2F0dXJhdGlvbiA9IGNvbG9ycy5TYXQ7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sb3JMaXN0U2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaHVlID0gY29sb3JzLkh1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdHVyYXRpb24gPSBjb2xvcnMuU2F0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IGdldEN1cnJlbnRTdGF0ZUFzeW5jIGVycm9yOiAke2Vycn1gKVxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHNldENoYXJhY3RlcmlzdGljcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuT24sIHR5cGVvZiB0aGlzLmNvbnRleHQuaXNPbiAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmNvbnRleHQuaXNPbiA6IGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuQnJpZ2h0bmVzcywgdHlwZW9mIHRoaXMuY29udGV4dC5icmlnaHRuZXNzICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuY29udGV4dC5icmlnaHRuZXNzIDogMCk7XG4gICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLkh1ZSwgdHlwZW9mIHRoaXMuY29udGV4dC5odWUgIT09ICd1bmRlZmluZWQnID8gdGhpcy5jb250ZXh0Lmh1ZSA6IDApO1xuICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5TYXR1cmF0aW9uLCB0eXBlb2YgdGhpcy5jb250ZXh0LnNhdHVyYXRpb24gIT09ICd1bmRlZmluZWQnID8gdGhpcy5jb250ZXh0LnNhdHVyYXRpb24gOiAwKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG1ldGhvZCB1c2VkIGZvciBjYWxsYmFja3NcbiAgICBjYWxsYmFja0h1ZShodWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaHVlICE9PSB0aGlzLmNvbnRleHQuaHVlICYmIHRoaXMuY29udGV4dC5jb2xvciAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0Lmh1ZSA9IGh1ZTtcbiAgICAgICAgICAgIC8vIHRoaXMubG9nLmRlYnVnKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSB1cGRhdGVkIGh1ZSB0byAke2h1ZX0uYCk7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5IdWUsIGh1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIGNhbGxiYWNrU2F0KHNhdHVyYXRpb246IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoc2F0dXJhdGlvbiAhPT0gdGhpcy5jb250ZXh0LnNhdHVyYXRpb24gJiYgdGhpcy5jb250ZXh0LmNvbG9yICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F0dXJhdGlvbiA9IHNhdHVyYXRpb247XG4gICAgICAgICAgICAvLyB0aGlzLmxvZy5kZWJ1ZyhgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gdXBkYXRlZCBzYXR1cmF0aW9uIHRvICR7c2F0dXJhdGlvbn0uYCk7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5TYXR1cmF0aW9uLCBzYXR1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG59Il19