@blueprintjs/core
Version:
Core styles & components
134 lines (132 loc) • 21.7 kB
JavaScript
/*
* Copyright 2016 Palantir Technologies, Inc. All rights reserved.
* Licensed under the BSD-3 License as modified (the “License”); you may obtain a copy
* of the license at https://github.com/palantir/blueprint/blob/master/LICENSE
* and https://github.com/palantir/blueprint/blob/master/PATENTS
*/
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var classNames = require("classnames");
var PureRender = require("pure-render-decorator");
var React = require("react");
var abstractComponent_1 = require("../../common/abstractComponent");
var Classes = require("../../common/classes");
var Keys = require("../../common/keys");
var utils_1 = require("../../common/utils");
// props that require number values, for validation
var NUMBER_PROPS = ["max", "min", "stepSize", "tickSize", "value"];
var Handle = (function (_super) {
__extends(Handle, _super);
function Handle() {
var _this = this;
_super.apply(this, arguments);
this.displayName = "Blueprint.SliderHandle";
this.state = {
isMoving: false,
};
this.refHandlers = {
handle: function (el) { return _this.handleElement = el; },
};
this.beginHandleMovement = function (event) {
document.addEventListener("mousemove", _this.handleHandleMovement);
document.addEventListener("mouseup", _this.endHandleMovement);
_this.setState({ isMoving: true });
_this.changeValue(_this.clientToValue(event.clientX));
};
this.endHandleMovement = function (event) {
_this.removeDocumentEventListeners();
_this.setState({ isMoving: false });
// not using changeValue because we want to invoke the handler regardless of current prop value
var onRelease = _this.props.onRelease;
var finalValue = _this.clamp(_this.clientToValue(event.clientX));
utils_1.safeInvoke(onRelease, finalValue);
};
this.handleHandleMovement = function (event) {
if (_this.state.isMoving && !_this.props.disabled) {
_this.changeValue(_this.clientToValue(event.clientX));
}
};
this.handleKeyDown = function (event) {
var _a = _this.props, stepSize = _a.stepSize, value = _a.value;
var which = event.which;
if (which === Keys.ARROW_DOWN || which === Keys.ARROW_LEFT) {
_this.changeValue(value - stepSize);
// this key event has been handled! prevent browser scroll on up/down
event.preventDefault();
}
else if (which === Keys.ARROW_UP || which === Keys.ARROW_RIGHT) {
_this.changeValue(value + stepSize);
event.preventDefault();
}
};
this.handleKeyUp = function (event) {
if ([Keys.ARROW_UP, Keys.ARROW_DOWN, Keys.ARROW_LEFT, Keys.ARROW_RIGHT].indexOf(event.which) >= 0) {
utils_1.safeInvoke(_this.props.onRelease, _this.props.value);
}
};
}
Handle.prototype.render = function () {
var _a = this.props, className = _a.className, disabled = _a.disabled, label = _a.label, min = _a.min, tickSize = _a.tickSize, value = _a.value;
var isMoving = this.state.isMoving;
// getBoundingClientRect().height includes border size as opposed to clientHeight
var handleSize = (this.handleElement == null ? 0 : this.handleElement.getBoundingClientRect().height);
return (React.createElement("span", {className: classNames(Classes.SLIDER_HANDLE, (_b = {}, _b[Classes.ACTIVE] = isMoving, _b), className), onKeyDown: disabled ? null : this.handleKeyDown, onKeyUp: disabled ? null : this.handleKeyUp, onMouseDown: disabled ? null : this.beginHandleMovement, ref: this.refHandlers.handle, style: { left: Math.round((value - min) * tickSize - handleSize / 2) }, tabIndex: 0}, label == null ? null : React.createElement("span", {className: Classes.SLIDER_LABEL}, label)));
var _b;
};
Handle.prototype.componentWillUnmount = function () {
this.removeDocumentEventListeners();
};
/** Convert client pixel to value between min and max. */
Handle.prototype.clientToValue = function (clientPixel) {
var _a = this.props, stepSize = _a.stepSize, tickSize = _a.tickSize, value = _a.value;
if (this.handleElement == null) {
return value;
}
var handleRect = this.handleElement.getBoundingClientRect();
var handleCenterPixel = handleRect.left + handleRect.width / 2;
var pixelDelta = clientPixel - handleCenterPixel;
// convert pixels to range value in increments of `stepSize`
var valueDelta = Math.round(pixelDelta / (tickSize * stepSize)) * stepSize;
return value + valueDelta;
};
Handle.prototype.validateProps = function (props) {
for (var _i = 0, NUMBER_PROPS_1 = NUMBER_PROPS; _i < NUMBER_PROPS_1.length; _i++) {
var prop = NUMBER_PROPS_1[_i];
if (typeof props[prop] !== "number") {
throw new Error("Handle requires number for " + prop + " prop");
}
}
};
/** Clamp value and invoke callback if it differs from current value */
Handle.prototype.changeValue = function (newValue, callback) {
if (callback === void 0) { callback = this.props.onChange; }
newValue = this.clamp(newValue);
if (!isNaN(newValue) && this.props.value !== newValue) {
utils_1.safeInvoke(callback, newValue);
}
};
/** Clamp value between min and max props */
Handle.prototype.clamp = function (value) {
return utils_1.clamp(value, this.props.min, this.props.max);
};
Handle.prototype.removeDocumentEventListeners = function () {
document.removeEventListener("mousemove", this.handleHandleMovement);
document.removeEventListener("mouseup", this.endHandleMovement);
};
Handle = __decorate([
PureRender
], Handle);
return Handle;
}(abstractComponent_1.AbstractComponent));
exports.Handle = Handle;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL3NsaWRlci9oYW5kbGUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHOzs7Ozs7Ozs7Ozs7O0FBRUgsSUFBWSxVQUFVLFdBQU0sWUFBWSxDQUFDLENBQUE7QUFDekMsSUFBWSxVQUFVLFdBQU0sdUJBQXVCLENBQUMsQ0FBQTtBQUNwRCxJQUFZLEtBQUssV0FBTSxPQUFPLENBQUMsQ0FBQTtBQUUvQixrQ0FBa0MsZ0NBQWdDLENBQUMsQ0FBQTtBQUNuRSxJQUFZLE9BQU8sV0FBTSxzQkFBc0IsQ0FBQyxDQUFBO0FBQ2hELElBQVksSUFBSSxXQUFNLG1CQUFtQixDQUFDLENBQUE7QUFFMUMsc0JBQWtDLG9CQUFvQixDQUFDLENBQUE7QUFtQnZELG1EQUFtRDtBQUNuRCxJQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUdyRTtJQUE0QiwwQkFBNkM7SUFBekU7UUFBQSxpQkFpSEM7UUFqSDJCLDhCQUE2QztRQUM5RCxnQkFBVyxHQUFHLHdCQUF3QixDQUFDO1FBQ3ZDLFVBQUssR0FBRztZQUNYLFFBQVEsRUFBRSxLQUFLO1NBQ2xCLENBQUM7UUFHTSxnQkFBVyxHQUFHO1lBQ2xCLE1BQU0sRUFBRSxVQUFDLEVBQW1CLElBQUssT0FBQSxLQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsRUFBdkIsQ0FBdUI7U0FDM0QsQ0FBQztRQXNDSyx3QkFBbUIsR0FBRyxVQUFDLEtBQWlEO1lBQzNFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsS0FBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM3RCxLQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7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LDZDQUE0QixHQUFwQztRQUNJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBakhMO1FBQUMsVUFBVTtjQUFBO0lBa0hYLGFBQUM7QUFBRCxDQWpIQSxBQWlIQyxDQWpIMkIscUNBQWlCLEdBaUg1QztBQWpIWSxjQUFNLFNBaUhsQixDQUFBIiwiZmlsZSI6ImNvbXBvbmVudHMvc2xpZGVyL2hhbmRsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QtMyBMaWNlbnNlIGFzIG1vZGlmaWVkICh0aGUg4oCcTGljZW5zZeKAnSk7IHlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKiBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL2JsdWVwcmludC9ibG9iL21hc3Rlci9QQVRFTlRTXG4gKi9cblxuaW1wb3J0ICogYXMgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0ICogYXMgUHVyZVJlbmRlciBmcm9tIFwicHVyZS1yZW5kZXItZGVjb3JhdG9yXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgQWJzdHJhY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL2Fic3RyYWN0Q29tcG9uZW50XCI7XG5pbXBvcnQgKiBhcyBDbGFzc2VzIGZyb20gXCIuLi8uLi9jb21tb24vY2xhc3Nlc1wiO1xuaW1wb3J0ICogYXMgS2V5cyBmcm9tIFwiLi4vLi4vY29tbW9uL2tleXNcIjtcbmltcG9ydCB7IElQcm9wcyB9IGZyb20gXCIuLi8uLi9jb21tb24vcHJvcHNcIjtcbmltcG9ydCB7IGNsYW1wLCBzYWZlSW52b2tlIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElIYW5kbGVQcm9wcyBleHRlbmRzIElQcm9wcyB7XG4gICAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAgIGxhYmVsOiBSZWFjdC5SZWFjdENoaWxkO1xuICAgIG1heDogbnVtYmVyO1xuICAgIG1pbjogbnVtYmVyO1xuICAgIG9uQ2hhbmdlPzogKG5ld1ZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgb25SZWxlYXNlPzogKG5ld1ZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc3RlcFNpemU6IG51bWJlcjtcbiAgICB0aWNrU2l6ZTogbnVtYmVyO1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhhbmRsZVN0YXRlIHtcbiAgICAvKiogd2hldGhlciBzbGlkZXIgaGFuZGxlIGlzIGN1cnJlbnRseSBiZWluZyBkcmFnZ2VkICovXG4gICAgaXNNb3Zpbmc/OiBib29sZWFuO1xufVxuXG4vLyBwcm9wcyB0aGF0IHJlcXVpcmUgbnVtYmVyIHZhbHVlcywgZm9yIHZhbGlkYXRpb25cbmNvbnN0IE5VTUJFUl9QUk9QUyA9IFtcIm1heFwiLCBcIm1pblwiLCBcInN0ZXBTaXplXCIsIFwidGlja1NpemVcIiwgXCJ2YWx1ZVwiXTtcblxuQFB1cmVSZW5kZXJcbmV4cG9ydCBjbGFzcyBIYW5kbGUgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudDxJSGFuZGxlUHJvcHMsIElIYW5kbGVTdGF0ZT4ge1xuICAgIHB1YmxpYyBkaXNwbGF5TmFtZSA9IFwiQmx1ZXByaW50LlNsaWRlckhhbmRsZVwiO1xuICAgIHB1YmxpYyBzdGF0ZSA9IHtcbiAgICAgICAgaXNNb3Zpbmc6IGZhbHNlLFxuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmVmSGFuZGxlcnMgPSB7XG4gICAgICAgIGhhbmRsZTogKGVsOiBIVE1MU3BhbkVsZW1lbnQpID0+IHRoaXMuaGFuZGxlRWxlbWVudCA9IGVsLFxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7IGNsYXNzTmFtZSwgZGlzYWJsZWQsIGxhYmVsLCBtaW4sIHRpY2tTaXplLCB2YWx1ZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgeyBpc01vdmluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgLy8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IGluY2x1ZGVzIGJvcmRlciBzaXplIGFzIG9wcG9zZWQgdG8gY2xpZW50SGVpZ2h0XG4gICAgICAgIGNvbnN0IGhhbmRsZVNpemUgPSAodGhpcy5oYW5kbGVFbGVtZW50ID09IG51bGwgPyAwIDogdGhpcy5oYW5kbGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhDbGFzc2VzLlNMSURFUl9IQU5ETEUsIHsgW0NsYXNzZXMuQUNUSVZFXTogaXNNb3ZpbmcgfSwgY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBvbktleURvd249e2Rpc2FibGVkID8gbnVsbCA6IHRoaXMuaGFuZGxlS2V5RG93bn1cbiAgICAgICAgICAgICAgICBvbktleVVwPXtkaXNhYmxlZCA/IG51bGwgOiB0aGlzLmhhbmRsZUtleVVwfVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duPXtkaXNhYmxlZCA/IG51bGwgOiB0aGlzLmJlZ2luSGFuZGxlTW92ZW1lbnR9XG4gICAgICAgICAgICAgICAgcmVmPXt0aGlzLnJlZkhhbmRsZXJzLmhhbmRsZX1cbiAgICAgICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBNYXRoLnJvdW5kKCh2YWx1ZSAtIG1pbikgKiB0aWNrU2l6ZSAtIGhhbmRsZVNpemUgLyAyKSB9fVxuICAgICAgICAgICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtsYWJlbCA9PSBudWxsID8gbnVsbCA6IDxzcGFuIGNsYXNzTmFtZT17Q2xhc3Nlcy5TTElERVJfTEFCRUx9PntsYWJlbH08L3NwYW4+fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVEb2N1bWVudEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqIENvbnZlcnQgY2xpZW50IHBpeGVsIHRvIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXguICovXG4gICAgcHVibGljIGNsaWVudFRvVmFsdWUoY2xpZW50UGl4ZWw6IG51bWJlcikge1xuICAgICAgICBjb25zdCB7IHN0ZXBTaXplLCB0aWNrU2l6ZSwgdmFsdWUgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZUVsZW1lbnQgPT0gbnVsbCkgeyByZXR1cm4gdmFsdWU7IH1cbiAgICAgICAgY29uc3QgaGFuZGxlUmVjdCA9IHRoaXMuaGFuZGxlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlQ2VudGVyUGl4ZWwgPSBoYW5kbGVSZWN0LmxlZnQgKyBoYW5kbGVSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgcGl4ZWxEZWx0YSA9IGNsaWVudFBpeGVsIC0gaGFuZGxlQ2VudGVyUGl4ZWw7XG4gICAgICAgIC8vIGNvbnZlcnQgcGl4ZWxzIHRvIHJhbmdlIHZhbHVlIGluIGluY3JlbWVudHMgb2YgYHN0ZXBTaXplYFxuICAgICAgICBjb25zdCB2YWx1ZURlbHRhID0gTWF0aC5yb3VuZChwaXhlbERlbHRhIC8gKHRpY2tTaXplICogc3RlcFNpemUpKSAqIHN0ZXBTaXplO1xuICAgICAgICByZXR1cm4gdmFsdWUgKyB2YWx1ZURlbHRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBiZWdpbkhhbmRsZU1vdmVtZW50ID0gKGV2ZW50OiBNb3VzZUV2ZW50IHwgUmVhY3QuTW91c2VFdmVudDxIVE1MRWxlbWVudD4pID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLmhhbmRsZUhhbmRsZU1vdmVtZW50KTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5lbmRIYW5kbGVNb3ZlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc01vdmluZzogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSh0aGlzLmNsaWVudFRvVmFsdWUoZXZlbnQuY2xpZW50WCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2YWxpZGF0ZVByb3BzKHByb3BzOiBJSGFuZGxlUHJvcHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE5VTUJFUl9QUk9QUykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocHJvcHMgYXMgYW55KVtwcm9wXSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlIHJlcXVpcmVzIG51bWJlciBmb3IgJHtwcm9wfSBwcm9wYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuZEhhbmRsZU1vdmVtZW50ID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRG9jdW1lbnRFdmVudExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNNb3Zpbmc6IGZhbHNlIH0pO1xuICAgICAgICAvLyBub3QgdXNpbmcgY2hhbmdlVmFsdWUgYmVjYXVzZSB3ZSB3YW50IHRvIGludm9rZSB0aGUgaGFuZGxlciByZWdhcmRsZXNzIG9mIGN1cnJlbnQgcHJvcCB2YWx1ZVxuICAgICAgICBjb25zdCB7IG9uUmVsZWFzZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgZmluYWxWYWx1ZSA9IHRoaXMuY2xhbXAodGhpcy5jbGllbnRUb1ZhbHVlKGV2ZW50LmNsaWVudFgpKTtcbiAgICAgICAgc2FmZUludm9rZShvblJlbGVhc2UsIGZpbmFsVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlSGFuZGxlTW92ZW1lbnQgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNNb3ZpbmcgJiYgIXRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlVmFsdWUodGhpcy5jbGllbnRUb1ZhbHVlKGV2ZW50LmNsaWVudFgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlS2V5RG93biA9IChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MU3BhbkVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RlcFNpemUsIHZhbHVlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7IHdoaWNoIH0gPSBldmVudDtcbiAgICAgICAgaWYgKHdoaWNoID09PSBLZXlzLkFSUk9XX0RPV04gfHwgd2hpY2ggPT09IEtleXMuQVJST1dfTEVGVCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSh2YWx1ZSAtIHN0ZXBTaXplKTtcbiAgICAgICAgICAgIC8vIHRoaXMga2V5IGV2ZW50IGhhcyBiZWVuIGhhbmRsZWQhIHByZXZlbnQgYnJvd3NlciBzY3JvbGwgb24gdXAvZG93blxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh3aGljaCA9PT0gS2V5cy5BUlJPV19VUCB8fCB3aGljaCA9PT0gS2V5cy5BUlJPV19SSUdIVCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSh2YWx1ZSArIHN0ZXBTaXplKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUtleVVwID0gKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxTcGFuRWxlbWVudD4pID0+IHtcbiAgICAgICAgaWYgKFtLZXlzLkFSUk9XX1VQLCBLZXlzLkFSUk9XX0RPV04sIEtleXMuQVJST1dfTEVGVCwgS2V5cy5BUlJPV19SSUdIVF0uaW5kZXhPZihldmVudC53aGljaCkgPj0gMCkge1xuICAgICAgICAgICAgc2FmZUludm9rZSh0aGlzLnByb3BzLm9uUmVsZWFzZSwgdGhpcy5wcm9wcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2xhbXAgdmFsdWUgYW5kIGludm9rZSBjYWxsYmFjayBpZiBpdCBkaWZmZXJzIGZyb20gY3VycmVudCB2YWx1ZSAqL1xuICAgIHByaXZhdGUgY2hhbmdlVmFsdWUobmV3VmFsdWU6IG51bWJlciwgY2FsbGJhY2sgPSB0aGlzLnByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdGhpcy5jbGFtcChuZXdWYWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4obmV3VmFsdWUpICYmIHRoaXMucHJvcHMudmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBzYWZlSW52b2tlKGNhbGxiYWNrLCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ2xhbXAgdmFsdWUgYmV0d2VlbiBtaW4gYW5kIG1heCBwcm9wcyAqL1xuICAgIHByaXZhdGUgY2xhbXAodmFsdWU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gY2xhbXAodmFsdWUsIHRoaXMucHJvcHMubWluLCB0aGlzLnByb3BzLm1heCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVEb2N1bWVudEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuaGFuZGxlSGFuZGxlTW92ZW1lbnQpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLmVuZEhhbmRsZU1vdmVtZW50KTtcbiAgICB9XG59XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=