react-native-phone-input
Version:
Phone input box for React Native
197 lines • 31.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importDefault(require("react")); // eslint-disable-line import/no-extraneous-dependencies, no-use-before-define
const react_native_1 = require("react-native");
const country_1 = __importDefault(require("./country"));
const flags_1 = __importDefault(require("./resources/flags"));
const PhoneNumber_1 = __importDefault(require("./PhoneNumber"));
const styles_1 = __importDefault(require("./styles"));
const CountryPicker_1 = __importDefault(require("./CountryPicker"));
class PhoneInput extends react_1.default.Component {
static setCustomCountriesData(json) {
country_1.default.setCustomCountriesData(json);
}
constructor(props) {
super(props);
this.onChangePhoneNumber = (number) => {
const actionAfterSetState = this.props.onChangePhoneNumber
? (displayValue, iso2) => {
var _a, _b;
(_b = (_a = this.props).onChangePhoneNumber) === null || _b === void 0 ? void 0 : _b.call(_a, displayValue, iso2);
}
: null;
this.updateValue(number, actionAfterSetState);
};
this.onPressFlag = () => {
if (this.props.onPressFlag) {
this.props.onPressFlag();
}
else {
if (this.state.iso2)
this.picker.selectCountry(this.state.iso2);
this.picker.show();
}
};
// eslint-disable-next-line class-methods-use-this
this.getFlag = (iso2) => flags_1.default.get(iso2);
this.getISOCode = () => this.state.iso2;
this.selectCountry = (iso2) => {
if (this.state.iso2 !== iso2) {
const countryData = PhoneNumber_1.default.getCountryDataByCode(iso2);
if (countryData) {
this.setState({
iso2,
displayValue: this.format(`+${countryData.dialCode}`),
value: `+${countryData.dialCode}`
}, () => {
if (this.props.onSelectCountry)
this.props.onSelectCountry(iso2);
});
}
}
};
this.setValue = (number) => {
if (this.state.value !== number) {
this.updateValue(number);
}
};
let { initialCountry, initialValue } = this.props;
const { countriesList, disabled } = this.props;
if (countriesList) {
country_1.default.setCustomCountriesData(countriesList);
}
let displayValue = '';
if (initialValue) {
if (initialValue[0] !== '+') {
initialValue = `+${initialValue}`;
}
initialCountry = PhoneNumber_1.default.getCountryCodeOfNumber(initialValue);
displayValue = this.format(initialValue, initialCountry);
}
else {
const countryData = PhoneNumber_1.default.getCountryDataByCode(initialCountry);
initialValue = countryData ? `+${countryData.dialCode}` : '';
displayValue = initialValue;
}
this.state = {
disabled,
iso2: initialCountry,
displayValue,
value: initialValue,
};
}
componentDidUpdate() {
const { disabled } = this.props;
if (disabled !== this.state.disabled) {
this.setState({ disabled }); // eslint-disable-line react/no-did-update-set-state
}
}
// eslint-disable-next-line class-methods-use-this
getPickerData() {
return PhoneNumber_1.default.getAllCountries().map((country, index) => ({
key: index,
image: flags_1.default.get(country.iso2),
label: country.name,
dialCode: `+${country.dialCode}`,
iso2: country.iso2
}));
}
getCountryCode() {
const countryData = PhoneNumber_1.default.getCountryDataByCode(this.state.iso2);
return countryData ? countryData.dialCode : null;
}
// eslint-disable-next-line class-methods-use-this
getAllCountries() {
return PhoneNumber_1.default.getAllCountries();
}
getDialCode() {
return PhoneNumber_1.default.getDialCode(this.state.value);
}
getValue(text) {
return text ? text.replace(/[^0-9]/g, '') : this.state.value;
}
getNumberType() {
return PhoneNumber_1.default.getNumberType(this.state.value, this.state.iso2);
}
isValidNumber() {
if (this.state.value.length < 4)
return false;
return PhoneNumber_1.default.isValidNumber(this.state.value, this.state.iso2);
}
format(text, iso2) {
return this.props.autoFormat
? PhoneNumber_1.default.format(text, iso2 || this.state.iso2)
: text;
}
updateValue(number, actionAfterSetState = null) {
let modifiedNumber = this.getValue(number);
const { allowZeroAfterCountryCode } = this.props;
if (modifiedNumber[0] !== '+' && number.length) {
modifiedNumber = `+${modifiedNumber}`;
}
modifiedNumber = allowZeroAfterCountryCode
? modifiedNumber
: this.possiblyEliminateZeroAfterCountryCode(modifiedNumber);
const iso2 = PhoneNumber_1.default.getCountryCodeOfNumber(modifiedNumber);
let countryDialCode;
if (iso2) {
const countryData = PhoneNumber_1.default.getCountryDataByCode(iso2);
countryDialCode = countryData.dialCode;
}
let displayValue;
if (modifiedNumber === `+${countryDialCode}`) {
displayValue = modifiedNumber;
}
else {
displayValue = this.format(modifiedNumber);
}
this.setState({
iso2,
displayValue,
value: modifiedNumber,
}, () => {
if (actionAfterSetState) {
actionAfterSetState(displayValue, iso2);
}
});
}
// eslint-disable-next-line class-methods-use-this
possiblyEliminateZeroAfterCountryCode(number) {
const dialCode = PhoneNumber_1.default.getDialCode(number);
return number.startsWith(`${dialCode}0`)
? dialCode + number.substr(dialCode.length + 1)
: number;
}
getAccessibilityLabel() {
return this.props.accessibilityLabel || 'Telephone input';
}
focus() {
this.inputPhone.focus();
}
blur() {
this.inputPhone.blur();
}
render() {
const { iso2, displayValue, disabled } = this.state;
const country = this.getAllCountries().find((c) => c.iso2 === iso2);
const TextComponent = this.props.textComponent || react_native_1.TextInput;
return (react_1.default.createElement(react_native_1.View, { style: [styles_1.default.container, this.props.style] },
react_1.default.createElement(react_native_1.TouchableOpacity, { onPress: this.onPressFlag, disabled: disabled, accessibilityRole: "imagebutton", accessibilityLabel: country ? country.name : iso2 }, this.props.renderFlag ? (react_1.default.createElement(react_1.default.Fragment, null, this.props.renderFlag({
imageSource: flags_1.default.get(iso2),
}))) : (react_1.default.createElement(react_native_1.Image, { accessibilityIgnoresInvertColors: true, source: flags_1.default.get(iso2), style: [styles_1.default.flag, this.props.flagStyle] }))),
react_1.default.createElement(react_native_1.View, { style: { flex: 1, marginLeft: this.props.offset || 10 } },
react_1.default.createElement(TextComponent, Object.assign({ ref: (ref) => {
this.inputPhone = ref;
}, accessibilityLabel: this.getAccessibilityLabel(), editable: !disabled, autoCorrect: false, style: [styles_1.default.text, this.props.textStyle], onChangeText: (text) => {
this.onChangePhoneNumber(text);
}, keyboardType: "phone-pad", underlineColorAndroid: "rgba(0,0,0,0)", value: displayValue }, this.props.textProps))),
react_1.default.createElement(CountryPicker_1.default, { ref: (ref) => {
this.picker = ref;
}, selectedCountry: iso2, onSubmit: this.selectCountry, buttonColor: this.props.pickerButtonColor, cancelText: this.props.cancelText, cancelTextStyle: this.props.cancelTextStyle, confirmText: this.props.confirmText, confirmTextStyle: this.props.confirmTextStyle, pickerBackgroundColor: this.props.pickerBackgroundColor, itemStyle: this.props.pickerItemStyle, onPressCancel: this.props.onPressCancel, onPressConfirm: this.props.onPressConfirm })));
}
}
exports.default = PhoneInput;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhvbmVJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QaG9uZUlucHV0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUEwQixDQUFDLDhFQUE4RTtBQUN6RywrQ0FFc0I7QUFDdEIsd0RBQWdDO0FBQ2hDLDhEQUFzQztBQUN0QyxnRUFBd0M7QUFDeEMsc0RBQThCO0FBQzlCLG9FQUE0QztBQUc1QyxNQUFxQixVQUNqQixTQUFRLGVBQUssQ0FBQyxTQUE2RDtJQUMzRSxNQUFNLENBQUMsc0JBQXNCLENBQUMsSUFBSTtRQUM5QixpQkFBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFNRCxZQUFZLEtBQUs7UUFDYixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUE0Q2pCLHdCQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtnQkFDdEQsQ0FBQyxDQUFDLENBQUMsWUFBb0IsRUFBRSxJQUFZLEVBQUUsRUFBRTs7b0JBQ3JDLE1BQUEsTUFBQSxJQUFJLENBQUMsS0FBSyxFQUFDLG1CQUFtQixtREFBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7Z0JBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO1FBRUQsZ0JBQVcsR0FBRyxHQUFHLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO2dCQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdEI7UUFDTCxDQUFDLENBQUE7UUF1QkQsa0RBQWtEO1FBQ2xELFlBQU8sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQWlCcEMsZUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDMUIsTUFBTSxXQUFXLEdBQUcscUJBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FDVDt3QkFDSSxJQUFJO3dCQUNKLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNyRCxLQUFLLEVBQUUsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO3FCQUNwQyxFQUNELEdBQUcsRUFBRTt3QkFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTs0QkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckUsQ0FBQyxDQUNKLENBQUM7aUJBQ0w7YUFDSjtRQUNMLENBQUMsQ0FBQTtRQUVELGFBQVEsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzVCO1FBQ0wsQ0FBQyxDQUFBO1FBM0hHLElBQUksRUFDQSxjQUFjLEVBQUUsWUFBWSxFQUMvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFZixNQUFNLEVBQ0YsYUFBYSxFQUFFLFFBQVEsRUFDMUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWYsSUFBSSxhQUFhLEVBQUU7WUFDZixpQkFBTyxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRXRCLElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUN6QixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzthQUNyQztZQUVELGNBQWMsR0FBRyxxQkFBVyxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xFLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztTQUM1RDthQUFNO1lBQ0gsTUFBTSxXQUFXLEdBQUcscUJBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyRSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdELFlBQVksR0FBRyxZQUFZLENBQUM7U0FDL0I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1QsUUFBUTtZQUNSLElBQUksRUFBRSxjQUFjO1lBQ3BCLFlBQVk7WUFDWixLQUFLLEVBQUUsWUFBWTtTQUN0QixDQUFDO0lBQ04sQ0FBQztJQUVELGtCQUFrQjtRQUNkLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hDLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0RBQW9EO1NBQ3BGO0lBQ0wsQ0FBQztJQW9CRCxrREFBa0Q7SUFDbEQsYUFBYTtRQUNULE9BQU8scUJBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFELEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbkIsUUFBUSxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7U0FDckIsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsY0FBYztRQUNWLE1BQU0sV0FBVyxHQUFHLHFCQUFXLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JELENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsZUFBZTtRQUNYLE9BQU8scUJBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBS0QsV0FBVztRQUNQLE9BQU8scUJBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxhQUFhO1FBQ1QsT0FBTyxxQkFBVyxDQUFDLGFBQWEsQ0FDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNsQixDQUFDO0lBQ04sQ0FBQztJQTRCRCxhQUFhO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzlDLE9BQU8scUJBQVcsQ0FBQyxhQUFhLENBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDbEIsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUN4QixDQUFDLENBQUMscUJBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFNLEVBQUUsc0JBQTJCLElBQUk7UUFDL0MsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUseUJBQXlCLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRWpELElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzVDLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1NBQ3pDO1FBQ0QsY0FBYyxHQUFHLHlCQUF5QjtZQUN0QyxDQUFDLENBQUMsY0FBYztZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxHQUFXLHFCQUFXLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFeEUsSUFBSSxlQUFlLENBQUM7UUFDcEIsSUFBSSxJQUFJLEVBQUU7WUFDTixNQUFNLFdBQVcsR0FBRyxxQkFBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNELGVBQWUsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO1NBQzFDO1FBRUQsSUFBSSxZQUFZLENBQUM7UUFDakIsSUFBSSxjQUFjLEtBQUssSUFBSSxlQUFlLEVBQUUsRUFBRTtZQUMxQyxZQUFZLEdBQUcsY0FBYyxDQUFDO1NBQ2pDO2FBQU07WUFDSCxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM5QztRQUVELElBQUksQ0FBQyxRQUFRLENBQUM7WUFDVixJQUFJO1lBQ0osWUFBWTtZQUNaLEtBQUssRUFBRSxjQUFjO1NBQ3hCLEVBQUUsR0FBRyxFQUFFO1lBQ0osSUFBSSxtQkFBbUIsRUFBRTtnQkFDckIsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzNDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELHFDQUFxQyxDQUFDLE1BQU07UUFDeEMsTUFBTSxRQUFRLEdBQUcscUJBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUM7WUFDcEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakIsQ0FBQztJQUVELHFCQUFxQjtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUM7SUFDOUQsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTTtRQUNGLE1BQU0sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSx3QkFBUyxDQUFDO1FBQ2pFLE9BQU8sQ0FDSCw4QkFBQyxtQkFBSSxJQUFDLEtBQUssRUFBRSxDQUFDLGdCQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzdDLDhCQUFDLCtCQUFnQixJQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUN6QixRQUFRLEVBQUUsUUFBUSxFQUNsQixpQkFBaUIsRUFBQyxhQUFhLEVBQy9CLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUVoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDckIsOERBQ0ssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ25CLFdBQVcsRUFBRSxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzthQUMvQixDQUFDLENBQ0gsQ0FDTixDQUFDLENBQUMsQ0FBQyxDQUNBLDhCQUFDLG9CQUFLLElBQ0YsZ0NBQWdDLEVBQUUsSUFBSSxFQUN0QyxNQUFNLEVBQUUsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFDdkIsS0FBSyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FDNUMsQ0FDTCxDQUNjO1lBQ25CLDhCQUFDLG1CQUFJLElBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFO2dCQUN6RCw4QkFBQyxhQUFhLGtCQUNWLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO29CQUMxQixDQUFDLEVBQ0Qsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQ2hELFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFDbkIsV0FBVyxFQUFFLEtBQUssRUFDbEIsS0FBSyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDMUMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDbkMsQ0FBQyxFQUNELFlBQVksRUFBQyxXQUFXLEVBQ3hCLHFCQUFxQixFQUFDLGVBQWUsRUFDckMsS0FBSyxFQUFFLFlBQVksSUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDMUIsQ0FDQztZQUVQLDhCQUFDLHVCQUFhLElBQ1YsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7Z0JBQ3RCLENBQUMsRUFDRCxlQUFlLEVBQUUsSUFBSSxFQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFDNUIsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQ3pDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFDakMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUMzQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQ25DLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQzdDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQ3ZELFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFDckMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUN2QyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQzNDLENBQ0MsQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBaFJELDZCQWdSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuaW1wb3J0IHtcbiAgICBJbWFnZSwgVGV4dElucHV0LCBUb3VjaGFibGVPcGFjaXR5LCBWaWV3XG59IGZyb20gJ3JlYWN0LW5hdGl2ZSc7XG5pbXBvcnQgQ291bnRyeSBmcm9tICcuL2NvdW50cnknO1xuaW1wb3J0IEZsYWdzIGZyb20gJy4vcmVzb3VyY2VzL2ZsYWdzJztcbmltcG9ydCBQaG9uZU51bWJlciBmcm9tICcuL1Bob25lTnVtYmVyJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9zdHlsZXMnO1xuaW1wb3J0IENvdW50cnlQaWNrZXIgZnJvbSAnLi9Db3VudHJ5UGlja2VyJztcbmltcG9ydCB7IFJlYWN0TmF0aXZlUGhvbmVJbnB1dFByb3BzIH0gZnJvbSAnLi90eXBpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGhvbmVJbnB1dDxUZXh0Q29tcG9uZW50VHlwZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudFR5cGUgPSB0eXBlb2YgVGV4dElucHV0PlxuICAgIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFJlYWN0TmF0aXZlUGhvbmVJbnB1dFByb3BzPFRleHRDb21wb25lbnRUeXBlPiwgYW55PiB7XG4gICAgc3RhdGljIHNldEN1c3RvbUNvdW50cmllc0RhdGEoanNvbikge1xuICAgICAgICBDb3VudHJ5LnNldEN1c3RvbUNvdW50cmllc0RhdGEoanNvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwaWNrZXI6IGFueTtcblxuICAgIHByaXZhdGUgaW5wdXRQaG9uZTogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbml0aWFsQ291bnRyeSwgaW5pdGlhbFZhbHVlXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvdW50cmllc0xpc3QsIGRpc2FibGVkXG4gICAgICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIGlmIChjb3VudHJpZXNMaXN0KSB7XG4gICAgICAgICAgICBDb3VudHJ5LnNldEN1c3RvbUNvdW50cmllc0RhdGEoY291bnRyaWVzTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGlzcGxheVZhbHVlID0gJyc7XG5cbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZVswXSAhPT0gJysnKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gYCske2luaXRpYWxWYWx1ZX1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbml0aWFsQ291bnRyeSA9IFBob25lTnVtYmVyLmdldENvdW50cnlDb2RlT2ZOdW1iZXIoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0KGluaXRpYWxWYWx1ZSwgaW5pdGlhbENvdW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZShpbml0aWFsQ291bnRyeSk7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBjb3VudHJ5RGF0YSA/IGArJHtjb3VudHJ5RGF0YS5kaWFsQ29kZX1gIDogJyc7XG4gICAgICAgICAgICBkaXNwbGF5VmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICBpc28yOiBpbml0aWFsQ291bnRyeSxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBpbml0aWFsVmFsdWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICBjb25zdCB7IGRpc2FibGVkIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAoZGlzYWJsZWQgIT09IHRoaXMuc3RhdGUuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkaXNhYmxlZCB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZWFjdC9uby1kaWQtdXBkYXRlLXNldC1zdGF0ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DaGFuZ2VQaG9uZU51bWJlciA9IChudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uQWZ0ZXJTZXRTdGF0ZSA9IHRoaXMucHJvcHMub25DaGFuZ2VQaG9uZU51bWJlclxuICAgICAgICAgICAgPyAoZGlzcGxheVZhbHVlOiBzdHJpbmcsIGlzbzI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2VQaG9uZU51bWJlcj8uKGRpc3BsYXlWYWx1ZSwgaXNvMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUobnVtYmVyLCBhY3Rpb25BZnRlclNldFN0YXRlKTtcbiAgICB9XG5cbiAgICBvblByZXNzRmxhZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25QcmVzc0ZsYWcpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25QcmVzc0ZsYWcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzbzIpIHRoaXMucGlja2VyLnNlbGVjdENvdW50cnkodGhpcy5zdGF0ZS5pc28yKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgZ2V0UGlja2VyRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmdldEFsbENvdW50cmllcygpLm1hcCgoY291bnRyeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICAgICAgaW1hZ2U6IEZsYWdzLmdldChjb3VudHJ5LmlzbzIpLFxuICAgICAgICAgICAgbGFiZWw6IGNvdW50cnkubmFtZSxcbiAgICAgICAgICAgIGRpYWxDb2RlOiBgKyR7Y291bnRyeS5kaWFsQ29kZX1gLFxuICAgICAgICAgICAgaXNvMjogY291bnRyeS5pc28yXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBnZXRDb3VudHJ5Q29kZSgpIHtcbiAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZSh0aGlzLnN0YXRlLmlzbzIpO1xuICAgICAgICByZXR1cm4gY291bnRyeURhdGEgPyBjb3VudHJ5RGF0YS5kaWFsQ29kZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBnZXRBbGxDb3VudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBQaG9uZU51bWJlci5nZXRBbGxDb3VudHJpZXMoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIGdldEZsYWcgPSAoaXNvMikgPT4gRmxhZ3MuZ2V0KGlzbzIpO1xuXG4gICAgZ2V0RGlhbENvZGUoKSB7XG4gICAgICAgIHJldHVybiBQaG9uZU51bWJlci5nZXREaWFsQ29kZSh0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZSh0ZXh0Pykge1xuICAgICAgICByZXR1cm4gdGV4dCA/IHRleHQucmVwbGFjZSgvW14wLTldL2csICcnKSA6IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0TnVtYmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmdldE51bWJlclR5cGUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc28yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0SVNPQ29kZSA9ICgpID0+IHRoaXMuc3RhdGUuaXNvMjtcblxuICAgIHNlbGVjdENvdW50cnkgPSAoaXNvMikgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc28yICE9PSBpc28yKSB7XG4gICAgICAgICAgICBjb25zdCBjb3VudHJ5RGF0YSA9IFBob25lTnVtYmVyLmdldENvdW50cnlEYXRhQnlDb2RlKGlzbzIpO1xuICAgICAgICAgICAgaWYgKGNvdW50cnlEYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNvMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5mb3JtYXQoYCske2NvdW50cnlEYXRhLmRpYWxDb2RlfWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGArJHtjb3VudHJ5RGF0YS5kaWFsQ29kZX1gXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0Q291bnRyeSkgdGhpcy5wcm9wcy5vblNlbGVjdENvdW50cnkoaXNvMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VmFsdWUgPSAobnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlICE9PSBudW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzVmFsaWROdW1iZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZhbHVlLmxlbmd0aCA8IDQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIFBob25lTnVtYmVyLmlzVmFsaWROdW1iZXIoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pc28yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZm9ybWF0KHRleHQsIGlzbzI/KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmF1dG9Gb3JtYXRcbiAgICAgICAgICAgID8gUGhvbmVOdW1iZXIuZm9ybWF0KHRleHQsIGlzbzIgfHwgdGhpcy5zdGF0ZS5pc28yKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZVZhbHVlKG51bWJlciwgYWN0aW9uQWZ0ZXJTZXRTdGF0ZTogYW55ID0gbnVsbCkge1xuICAgICAgICBsZXQgbW9kaWZpZWROdW1iZXIgPSB0aGlzLmdldFZhbHVlKG51bWJlcik7XG4gICAgICAgIGNvbnN0IHsgYWxsb3daZXJvQWZ0ZXJDb3VudHJ5Q29kZSB9ID0gdGhpcy5wcm9wcztcblxuICAgICAgICBpZiAobW9kaWZpZWROdW1iZXJbMF0gIT09ICcrJyAmJiBudW1iZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBtb2RpZmllZE51bWJlciA9IGArJHttb2RpZmllZE51bWJlcn1gO1xuICAgICAgICB9XG4gICAgICAgIG1vZGlmaWVkTnVtYmVyID0gYWxsb3daZXJvQWZ0ZXJDb3VudHJ5Q29kZVxuICAgICAgICAgICAgPyBtb2RpZmllZE51bWJlclxuICAgICAgICAgICAgOiB0aGlzLnBvc3NpYmx5RWxpbWluYXRlWmVyb0FmdGVyQ291bnRyeUNvZGUobW9kaWZpZWROdW1iZXIpO1xuICAgICAgICBjb25zdCBpc28yOiBzdHJpbmcgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5Q29kZU9mTnVtYmVyKG1vZGlmaWVkTnVtYmVyKTtcblxuICAgICAgICBsZXQgY291bnRyeURpYWxDb2RlO1xuICAgICAgICBpZiAoaXNvMikge1xuICAgICAgICAgICAgY29uc3QgY291bnRyeURhdGEgPSBQaG9uZU51bWJlci5nZXRDb3VudHJ5RGF0YUJ5Q29kZShpc28yKTtcbiAgICAgICAgICAgIGNvdW50cnlEaWFsQ29kZSA9IGNvdW50cnlEYXRhLmRpYWxDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRpc3BsYXlWYWx1ZTtcbiAgICAgICAgaWYgKG1vZGlmaWVkTnVtYmVyID09PSBgKyR7Y291bnRyeURpYWxDb2RlfWApIHtcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA9IG1vZGlmaWVkTnVtYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gdGhpcy5mb3JtYXQobW9kaWZpZWROdW1iZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc28yLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG1vZGlmaWVkTnVtYmVyLFxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uQWZ0ZXJTZXRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbkFmdGVyU2V0U3RhdGUoZGlzcGxheVZhbHVlLCBpc28yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwb3NzaWJseUVsaW1pbmF0ZVplcm9BZnRlckNvdW50cnlDb2RlKG51bWJlcikge1xuICAgICAgICBjb25zdCBkaWFsQ29kZSA9IFBob25lTnVtYmVyLmdldERpYWxDb2RlKG51bWJlcik7XG4gICAgICAgIHJldHVybiBudW1iZXIuc3RhcnRzV2l0aChgJHtkaWFsQ29kZX0wYClcbiAgICAgICAgICAgID8gZGlhbENvZGUgKyBudW1iZXIuc3Vic3RyKGRpYWxDb2RlLmxlbmd0aCArIDEpXG4gICAgICAgICAgICA6IG51bWJlcjtcbiAgICB9XG5cbiAgICBnZXRBY2Nlc3NpYmlsaXR5TGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmFjY2Vzc2liaWxpdHlMYWJlbCB8fCAnVGVsZXBob25lIGlucHV0JztcbiAgICB9XG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5pbnB1dFBob25lLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5pbnB1dFBob25lLmJsdXIoKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvMiwgZGlzcGxheVZhbHVlLCBkaXNhYmxlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgY291bnRyeSA9IHRoaXMuZ2V0QWxsQ291bnRyaWVzKCkuZmluZCgoYykgPT4gYy5pc28yID09PSBpc28yKTtcbiAgICAgICAgY29uc3QgVGV4dENvbXBvbmVudDogYW55ID0gdGhpcy5wcm9wcy50ZXh0Q29tcG9uZW50IHx8IFRleHRJbnB1dDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWaWV3IHN0eWxlPXtbc3R5bGVzLmNvbnRhaW5lciwgdGhpcy5wcm9wcy5zdHlsZV19PlxuICAgICAgICAgICAgICAgIDxUb3VjaGFibGVPcGFjaXR5XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3M9e3RoaXMub25QcmVzc0ZsYWd9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eVJvbGU9XCJpbWFnZWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlMYWJlbD17Y291bnRyeSA/IGNvdW50cnkubmFtZSA6IGlzbzJ9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5yZW5kZXJGbGFnID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5yZW5kZXJGbGFnKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTb3VyY2U6IEZsYWdzLmdldChpc28yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eUlnbm9yZXNJbnZlcnRDb2xvcnM9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXtGbGFncy5nZXQoaXNvMil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1tzdHlsZXMuZmxhZywgdGhpcy5wcm9wcy5mbGFnU3R5bGVdfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1RvdWNoYWJsZU9wYWNpdHk+XG4gICAgICAgICAgICAgICAgPFZpZXcgc3R5bGU9e3sgZmxleDogMSwgbWFyZ2luTGVmdDogdGhpcy5wcm9wcy5vZmZzZXQgfHwgMTAgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxUZXh0Q29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9eyhyZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0UGhvbmUgPSByZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eUxhYmVsPXt0aGlzLmdldEFjY2Vzc2liaWxpdHlMYWJlbCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9eyFkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Db3JyZWN0PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtbc3R5bGVzLnRleHQsIHRoaXMucHJvcHMudGV4dFN0eWxlXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlVGV4dD17KHRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlUGhvbmVOdW1iZXIodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5Ym9hcmRUeXBlPVwicGhvbmUtcGFkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZUNvbG9yQW5kcm9pZD1cInJnYmEoMCwwLDAsMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLnRleHRQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L1ZpZXc+XG5cbiAgICAgICAgICAgICAgICA8Q291bnRyeVBpY2tlclxuICAgICAgICAgICAgICAgICAgICByZWY9eyhyZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGlja2VyID0gcmVmO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvdW50cnk9e2lzbzJ9XG4gICAgICAgICAgICAgICAgICAgIG9uU3VibWl0PXt0aGlzLnNlbGVjdENvdW50cnl9XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkNvbG9yPXt0aGlzLnByb3BzLnBpY2tlckJ1dHRvbkNvbG9yfVxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0PXt0aGlzLnByb3BzLmNhbmNlbFRleHR9XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHRTdHlsZT17dGhpcy5wcm9wcy5jYW5jZWxUZXh0U3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0PXt0aGlzLnByb3BzLmNvbmZpcm1UZXh0fVxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dFN0eWxlPXt0aGlzLnByb3BzLmNvbmZpcm1UZXh0U3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIHBpY2tlckJhY2tncm91bmRDb2xvcj17dGhpcy5wcm9wcy5waWNrZXJCYWNrZ3JvdW5kQ29sb3J9XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1TdHlsZT17dGhpcy5wcm9wcy5waWNrZXJJdGVtU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3NDYW5jZWw9e3RoaXMucHJvcHMub25QcmVzc0NhbmNlbH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmVzc0NvbmZpcm09e3RoaXMucHJvcHMub25QcmVzc0NvbmZpcm19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvVmlldz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=