@hxui/angular
Version:
This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.
596 lines (595 loc) • 56.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Input, forwardRef, Component, ViewChild, Output, EventEmitter, IterableDiffers, ViewEncapsulation, Renderer2 } from '@angular/core';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import * as _ from 'lodash';
import { SelectizeConfig } from './selectize.config';
export var /** @type {?} */ SELECTIZE_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return SelectizeComponent; }),
multi: true
};
var SelectizeComponent = /** @class */ (function () {
function SelectizeComponent(_differs, renderer) {
this._differs = _differs;
this.renderer = renderer;
this.enabled = true;
this.onBlur = new EventEmitter(false);
/**
* Invoked anytime a key is pressed down on the selectize search field
* @param e
*/
this.onKeydown = function (e) {
console.log(e);
var /** @type {?} */ TABKEY = 9;
if (e.keyCode === TABKEY) {
e.preventDefault();
e.stopImmediatePropagation();
e.stopPropagation();
}
};
}
/**
* @return {?}
*/
SelectizeComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.id && this.id.length > 0) {
this.renderer.setAttribute(this.selectizeInput.nativeElement, 'id', this.id);
}
this.reset();
};
/**
* @return {?}
*/
SelectizeComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.selectize = $(this.selectizeInput.nativeElement).selectize(this.config)[0].selectize;
this.selectize.on('change', this.onSelectizeValueChange.bind(this));
this.selectize.on('blur', this.onBlurEvent.bind(this));
this.selectize.on('type', this.onSelectizeType.bind(this));
this.selectize.on('item_add', this.onSelectizeItemSelected.bind(this));
this.updatePlaceholder();
this.onEnabledStatusChange();
};
/**
* @return {?}
*/
SelectizeComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.selectize.off('change');
this.selectize.off('blur');
this.selectize.off('type');
};
/**
* Change detection for primitive types.
*/
/**
* Change detection for primitive types.
* @param {?} changes
* @return {?}
*/
SelectizeComponent.prototype.ngOnChanges = /**
* Change detection for primitive types.
* @param {?} changes
* @return {?}
*/
function (changes) {
if (this.selectize) {
if (changes.hasOwnProperty('placeholder') ||
changes.hasOwnProperty('hasOptionsPlaceholder') ||
changes.hasOwnProperty('noOptionsPlaceholder')) {
this.updatePlaceholder();
}
if (changes.hasOwnProperty('enabled')) {
this.onEnabledStatusChange();
}
}
};
/**
* Implementing deep check for option comparison
*
* FIXME -> Implement deep check to only compare against label and value fields.
*/
/**
* Implementing deep check for option comparison
*
* FIXME -> Implement deep check to only compare against label and value fields.
* @return {?}
*/
SelectizeComponent.prototype.ngDoCheck = /**
* Implementing deep check for option comparison
*
* FIXME -> Implement deep check to only compare against label and value fields.
* @return {?}
*/
function () {
if (this._options_differ) {
var /** @type {?} */ changes = this._options_differ.diff(this._options);
if (changes) {
this._applyOptionsChanges(changes);
}
}
if (this._optgroups_differ) {
var /** @type {?} */ changes = this._optgroups_differ.diff(this._optgroups);
if (changes) {
this._applyOptionGroupChanges(changes);
}
}
};
/**
* @param {?} changes
* @return {?}
*/
SelectizeComponent.prototype._applyOptionsChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
changes.forEachAddedItem(function (record) {
_this.onSelectizeOptionAdd(record.item);
});
changes.forEachRemovedItem(function (record) {
_this.onSelectizeOptionRemove(record.item);
});
this.updatePlaceholder();
this.evalHasError();
};
/**
* @param {?} changes
* @return {?}
*/
SelectizeComponent.prototype._applyOptionGroupChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
changes.forEachAddedItem(function (record) {
_this.onSelectizeOptGroupAdd(record.item);
});
changes.forEachRemovedItem(function (record) {
_this.onSelectizeOptGroupRemove(record.item);
});
this.updatePlaceholder();
this.evalHasError();
};
/**
* @return {?}
*/
SelectizeComponent.prototype.clearhighlight = /**
* @return {?}
*/
function () {
// remove highlight to help selectize bug
// https://github.com/selectize/selectize.js/issues/1141
this.selectize.$dropdown_content.removeHighlight();
};
/**
* @return {?}
*/
SelectizeComponent.prototype.onBlurEvent = /**
* @return {?}
*/
function () {
if (this.formControl) {
this.formControl.markAsTouched();
}
this.onBlur.emit();
this.evalHasError();
};
/**
* @param {?} optgroup
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeOptGroupAdd = /**
* @param {?} optgroup
* @return {?}
*/
function (optgroup) {
this.selectize.addOptionGroup(optgroup[this.getOptgroupField()], optgroup);
};
/**
* @param {?} optgroup
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeOptGroupRemove = /**
* @param {?} optgroup
* @return {?}
*/
function (optgroup) {
this.selectize.removeOptionGroup(optgroup[this.getOptgroupField()]);
};
/**
* Refresh selected values when options change.
*/
/**
* Refresh selected values when options change.
* @param {?} option
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeOptionAdd = /**
* Refresh selected values when options change.
* @param {?} option
* @return {?}
*/
function (option) {
this.selectize.addOption(_.cloneDeep(option));
var /** @type {?} */ valueField = this.config.valueField;
if (this.value) {
var /** @type {?} */ items = typeof this.value === 'string' || typeof this.value === 'number'
? [this.value]
: this.value;
if (items &&
items instanceof Array &&
items.find(function (value) { return value === option[valueField]; })) {
this.selectize.addItem(option[valueField], true);
}
}
};
/**
* @param {?} option
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeOptionRemove = /**
* @param {?} option
* @return {?}
*/
function (option) {
this.selectize.removeOption(option[this.config.valueField]);
};
/**
* @return {?}
*/
SelectizeComponent.prototype.evalHasError = /**
* @return {?}
*/
function () {
var /** @type {?} */ parent = $(this.selectize.$control).parent();
if (this.formControl) {
if (this.formControl.touched && this.formControl.invalid) {
parent.addClass(this.errorClass || 'has-error');
}
else if (parent.hasClass('has-error')) {
parent.removeClass(this.errorClass || 'has-error');
}
}
};
/**
* Update the current placeholder based on the given input parameter.
*/
/**
* Update the current placeholder based on the given input parameter.
* @return {?}
*/
SelectizeComponent.prototype.updatePlaceholder = /**
* Update the current placeholder based on the given input parameter.
* @return {?}
*/
function () {
if (this.selectize.items.length === 0 &&
this.selectize.settings.placeholder !== this.getPlaceholder()) {
this.selectize.settings.placeholder = this.getPlaceholder();
this.selectize.updatePlaceholder();
this.selectize.showInput(); // Without this, when options are cleared placeholder only appears after focus.
}
};
/**
* Called when a change is detected in the 'enabled' input field.
* Sets the selectize state based on the new value.
*/
/**
* Called when a change is detected in the 'enabled' input field.
* Sets the selectize state based on the new value.
* @return {?}
*/
SelectizeComponent.prototype.onEnabledStatusChange = /**
* Called when a change is detected in the 'enabled' input field.
* Sets the selectize state based on the new value.
* @return {?}
*/
function () {
this.enabled ? this.selectize.enable() : this.selectize.disable();
};
/**
* Dispatches change event when a value change is detected.
* @param $event
*/
/**
* Dispatches change event when a value change is detected.
* @param {?} $event
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeValueChange = /**
* Dispatches change event when a value change is detected.
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
// In some cases this gets called before registerOnChange.
if (this.onChangeCallback) {
// Map selectize's value collection back to original ISelectizeItem object
var /** @type {?} */ data = this.selectize.items.map(function (v) {
return _this.selectize.options[v];
});
this.onChangeCallback(data);
}
};
/**
* Invoked when the user types while filtering options.
* @param str
*/
/**
* Invoked when the user types while filtering options.
* @param {?} str
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeType = /**
* Invoked when the user types while filtering options.
* @param {?} str
* @return {?}
*/
function (str) {
if (str.length === 0) {
this.clearhighlight();
this.selectize.close();
}
};
/**
* @param {?} $event
* @return {?}
*/
SelectizeComponent.prototype.onSelectizeItemSelected = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.clearhighlight();
if (this.config.closeAfterSelect) {
this.selectize.close();
}
};
/**
* Returns the applicable placeholder.
*/
/**
* Returns the applicable placeholder.
* @return {?}
*/
SelectizeComponent.prototype.getPlaceholder = /**
* Returns the applicable placeholder.
* @return {?}
*/
function () {
if (this.hasOptionsPlaceholder) {
if (this.options && this.options.length > 0) {
return this.hasOptionsPlaceholder;
}
}
if (this.noOptionsPlaceholder) {
if (!this.options || this.options.length === 0) {
return this.noOptionsPlaceholder;
}
}
return this.placeholder;
};
/**
* Implementation from ControlValueAccessor
*
* @param obj
*/
/**
* Implementation from ControlValueAccessor
*
* @param {?} obj
* @return {?}
*/
SelectizeComponent.prototype.writeValue = /**
* Implementation from ControlValueAccessor
*
* @param {?} obj
* @return {?}
*/
function (obj) {
var _this = this;
if (obj === this.value) {
return;
}
this.value = obj;
if (!obj || obj.length === 0) {
this.selectize.setValue('');
return;
}
var /** @type {?} */ stringValue = obj.map(function (v) {
if (!Object.keys(_this.selectize.options).some(function (x) { return x === v.value; })) {
_this.selectize.addOption(v);
}
return v.value;
});
this.selectize.setValue(stringValue);
};
/**
* Implementation from ControlValueAccessor, callback for (ngModelChange)
* @param fn
*/
/**
* Implementation from ControlValueAccessor, callback for (ngModelChange)
* @param {?} fn
* @return {?}
*/
SelectizeComponent.prototype.registerOnChange = /**
* Implementation from ControlValueAccessor, callback for (ngModelChange)
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* Implementation from ControlValueAccessor
* @param fn
*/
/**
* Implementation from ControlValueAccessor
* @param {?} fn
* @return {?}
*/
SelectizeComponent.prototype.registerOnTouched = /**
* Implementation from ControlValueAccessor
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* @return {?}
*/
SelectizeComponent.prototype.getOptgroupField = /**
* @return {?}
*/
function () {
return this.config['optgroupField']
? this.config['optgroupField']
: 'optgroup';
};
Object.defineProperty(SelectizeComponent.prototype, "options", {
get: /**
* @return {?}
*/
function () {
return this._options;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._options = value;
if (!this._options_differ && value) {
this._options_differ = this._differs.find(value).create();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(SelectizeComponent.prototype, "optgroups", {
get: /**
* @return {?}
*/
function () {
return this._optgroups;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._optgroups = value;
if (!this._optgroups_differ && value) {
this._optgroups_differ = this._differs.find(value).create();
}
},
enumerable: true,
configurable: true
});
SelectizeComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-selectize',
template: "<select #selectizeInput></select>",
providers: [SELECTIZE_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None,
styles: [".selectize-control{position:relative}.selectize-dropdown,.selectize-input,.selectize-input input{color:#2a2c2d;font-family:inherit;font-size:.92rem;line-height:1.5;-webkit-font-smoothing:inherit}.selectize-control.single .selectize-input.input-active,.selectize-input{background:0 0;cursor:text;display:inline-block}.selectize-input{border:1px solid rgba(0,0,0,.2);padding:8px;display:inline-block;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:0;border-width:0 0 1px}.selectize-control.multi .selectize-input.has-items{padding:6px 8px 3px}.selectize-input.full{background-color:transparent}.selectize-input.disabled,.selectize-input.disabled *{cursor:default!important}.selectize-input.focus{box-shadow:none}.selectize-input.dropdown-active{border-radius:0}.selectize-input>*{vertical-align:baseline;display:inline-block;zoom:1}.selectize-control.multi .selectize-input>div{cursor:pointer;margin:4px;padding:2px 6px;background:rgba(0,0,0,.05);color:#2a2c2d;border:0 solid transparent;border-radius:290486px;font-size:.75rem;justify-content:center;line-height:1.5;white-space:nowrap}.selectize-control.multi .selectize-input>div.active{background:#e8e8e8;color:#2a2c2d;border:0 solid #cacaca}.selectize-control.multi .selectize-input.disabled>div,.selectize-control.multi .selectize-input.disabled>div.active{color:#787878;background:rgba(77,77,77,.05);border:0 solid rgba(77,77,77,0)}.selectize-input>input{display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0 2px 0 0!important;text-indent:0!important;border:0!important;background:0 0!important;line-height:inherit!important;-webkit-user-select:auto!important}.selectize-input>input::-ms-clear{display:none}.selectize-input>input:focus{outline:0!important}.selectize-input::after{content:' ';display:block;clear:left}.selectize-input.dropdown-active::before{content:' ';display:block;position:absolute;background:#f0f0f0;height:1px;bottom:0;left:0;right:0}.hx-select-control:after{display:none}.selectize-dropdown{position:absolute;z-index:10;border:transparent;background:#fff;margin:-1px 0 0;border-top:0;box-sizing:border-box;box-shadow:0 6px 12px rgba(0,0,0,.145);border-radius:0}.selectize-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.selectize-dropdown [data-selectable] .highlight{background:rgba(35,49,43,.23);border-radius:1px;font-weight:700}.selectize-dropdown .optgroup-header,.selectize-dropdown [data-selectable]{padding:5px 8px}.selectize-dropdown .optgroup:first-child .optgroup-header{border-top:0}.selectize-dropdown .optgroup-header{color:#2a2c2d;background:#fff;cursor:default}.selectize-dropdown .active{background-color:#41b987;color:#fff}.selectize-dropdown .active.create{color:#fff}.selectize-dropdown .create{color:rgba(42,44,45,.5)}.selectize-dropdown-content{overflow-y:auto;overflow-x:hidden;max-height:200px;-webkit-overflow-scrolling:touch}.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.single .selectize-input:after{content:' ';display:block;position:absolute;top:50%;right:15px;margin-top:-3px;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:grey transparent transparent}.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.rtl.single .selectize-input:after{left:15px;right:auto}.selectize-control.rtl .selectize-input>input{margin:0 4px 0 -2px!important}.selectize-control .selectize-input.disabled{opacity:.5;background-color:#fafafa}.selectize-control.plugin-remove_button [data-value]{position:relative;padding-right:.7rem!important}.selectize-control.plugin-remove_button [data-value].is-medium{padding-right:1rem!important}.selectize-control.plugin-remove_button [data-value] .hx-delete{margin-left:-.2rem;height:16px;width:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px}.selectize-control.plugin-remove_button [data-value].is-medium .hx-delete{margin-left:-.5rem}.selectize-control.plugin-remove_button [data-value].is-large .hx-delete{margin-left:-.2rem;height:20px;width:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove:hover{background:0 0}.selectize-control.plugin-remove_button .disabled [data-value] .hx-remove{border-left-color:rgba(77,77,77,0)}.selectize-control.plugin-remove_button .remove-single{position:absolute;right:28px;top:6px;font-size:23px}"]
},] },
];
/** @nocollapse */
SelectizeComponent.ctorParameters = function () { return [
{ type: IterableDiffers, },
{ type: Renderer2, },
]; };
SelectizeComponent.propDecorators = {
"config": [{ type: Input },],
"id": [{ type: Input },],
"placeholder": [{ type: Input },],
"hasOptionsPlaceholder": [{ type: Input },],
"noOptionsPlaceholder": [{ type: Input },],
"enabled": [{ type: Input },],
"value": [{ type: Input },],
"formControl": [{ type: Input },],
"errorClass": [{ type: Input },],
"onBlur": [{ type: Output },],
"selectizeInput": [{ type: ViewChild, args: ['selectizeInput',] },],
"options": [{ type: Input },],
"optgroups": [{ type: Input },],
};
return SelectizeComponent;
}());
export { SelectizeComponent };
function SelectizeComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
SelectizeComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
SelectizeComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
SelectizeComponent.propDecorators;
/** @type {?} */
SelectizeComponent.prototype._options;
/** @type {?} */
SelectizeComponent.prototype._options_differ;
/** @type {?} */
SelectizeComponent.prototype._optgroups;
/** @type {?} */
SelectizeComponent.prototype._optgroups_differ;
/** @type {?} */
SelectizeComponent.prototype.config;
/** @type {?} */
SelectizeComponent.prototype.id;
/** @type {?} */
SelectizeComponent.prototype.placeholder;
/** @type {?} */
SelectizeComponent.prototype.hasOptionsPlaceholder;
/** @type {?} */
SelectizeComponent.prototype.noOptionsPlaceholder;
/** @type {?} */
SelectizeComponent.prototype.enabled;
/** @type {?} */
SelectizeComponent.prototype.value;
/** @type {?} */
SelectizeComponent.prototype.formControl;
/** @type {?} */
SelectizeComponent.prototype.errorClass;
/** @type {?} */
SelectizeComponent.prototype.onBlur;
/** @type {?} */
SelectizeComponent.prototype.selectizeInput;
/** @type {?} */
SelectizeComponent.prototype.selectize;
/** @type {?} */
SelectizeComponent.prototype.onTouchedCallback;
/** @type {?} */
SelectizeComponent.prototype.onChangeCallback;
/**
* Invoked anytime a key is pressed down on the selectize search field
* \@param e
* @type {?}
*/
SelectizeComponent.prototype.onKeydown;
/** @type {?} */
SelectizeComponent.prototype._differs;
/** @type {?} */
SelectizeComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aXplLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0aXplL3NlbGVjdGl6ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBS0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBSWYsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFdBQVcsRUFDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtyRCxNQUFNLENBQUMscUJBQU0sd0JBQXdCLEdBQVE7SUFDM0MsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7O0lBb0NBLDRCQUFvQixRQUF5QixFQUFVLFFBQW1CO1FBQXRELGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVzt1QkFmdkQsSUFBSTtzQkFLZ0IsSUFBSSxZQUFZLENBQU8sS0FBSyxDQUFDOzs7Ozt5QkE0TnhELFVBQUEsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixxQkFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixDQUFDLENBQUMsd0JBQXdC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Q0FBQztZQUN0QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUMzRDs7Ozs7MEJBUUMseUNBQVM7Ozs7UUFPYjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCOzs7OztrQkFUYSxLQUFZO1lBQ3hCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUM3RDs7Ozs7O2dCQWpWSixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFFBQVEsRUFBRSxtQ0FBbUM7b0JBQzdDLFNBQVMsRUFBRSxDQUFDLHdCQUF3QixDQUFDO29CQUNyQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsTUFBTSxFQUFFLENBQUMsNnBKQUE2cEosQ0FBQztpQkFDeHFKOzs7O2dCQWhDQyxlQUFlO2dCQUtmLFNBQVM7OzsyQkFtQ1IsS0FBSzt1QkFDTCxLQUFLO2dDQUNMLEtBQUs7MENBQ0wsS0FBSzt5Q0FDTCxLQUFLOzRCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FDTCxLQUFLOytCQUNMLEtBQUs7MkJBRUwsTUFBTTttQ0FFTixTQUFTLFNBQUMsZ0JBQWdCOzRCQXNTMUIsS0FBSzs4QkFZTCxLQUFLOzs2QkFqWFI7O1NBNENhLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIERvQ2hlY2ssXHJcbiAgZm9yd2FyZFJlZixcclxuICBDb21wb25lbnQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSXRlcmFibGVEaWZmZXJzLFxyXG4gIEl0ZXJhYmxlRGlmZmVyLFxyXG4gIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxyXG4gIEl0ZXJhYmxlQ2hhbmdlcyxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBSZW5kZXJlcjIsXHJcbiAgT25EZXN0cm95XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgRm9ybUNvbnRyb2xcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IFNlbGVjdGl6ZUNvbmZpZyB9IGZyb20gJy4vc2VsZWN0aXplLmNvbmZpZyc7XHJcbmltcG9ydCB7SVNlbGVjdGl6ZUl0ZW19IGZyb20gJy4vc2VsZWN0aXplLWl0ZW0uaW50ZXJmYWNlJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmV4cG9ydCBjb25zdCBTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWxlY3RpemVDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1zZWxlY3RpemUnLFxyXG4gIHRlbXBsYXRlOiBgPHNlbGVjdCAjc2VsZWN0aXplSW5wdXQ+PC9zZWxlY3Q+YCxcclxuICBwcm92aWRlcnM6IFtTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3R5bGVzOiBbYC5zZWxlY3RpemUtY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZX0uc2VsZWN0aXplLWRyb3Bkb3duLC5zZWxlY3RpemUtaW5wdXQsLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjb2xvcjojMmEyYzJkO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOi45MnJlbTtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC1mb250LXNtb290aGluZzppbmhlcml0fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUsLnNlbGVjdGl6ZS1pbnB1dHtiYWNrZ3JvdW5kOjAgMDtjdXJzb3I6dGV4dDtkaXNwbGF5OmlubGluZS1ibG9ja30uc2VsZWN0aXplLWlucHV0e2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7cGFkZGluZzo4cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czowO2JvcmRlci13aWR0aDowIDAgMXB4fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtc3twYWRkaW5nOjZweCA4cHggM3B4fS5zZWxlY3RpemUtaW5wdXQuZnVsbHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQsLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCAqe2N1cnNvcjpkZWZhdWx0IWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0LmZvY3Vze2JveC1zaGFkb3c6bm9uZX0uc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZXtib3JkZXItcmFkaXVzOjB9LnNlbGVjdGl6ZS1pbnB1dD4qe3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3pvb206MX0uc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dD5kaXZ7Y3Vyc29yOnBvaW50ZXI7bWFyZ2luOjRweDtwYWRkaW5nOjJweCA2cHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6IzJhMmMyZDtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjI5MDQ4NnB4O2ZvbnQtc2l6ZTouNzVyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcjtsaW5lLWhlaWdodDoxLjU7d2hpdGUtc3BhY2U6bm93cmFwfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0PmRpdi5hY3RpdmV7YmFja2dyb3VuZDojZThlOGU4O2NvbG9yOiMyYTJjMmQ7Ym9yZGVyOjAgc29saWQgI2NhY2FjYX0uc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZD5kaXYsLnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWQ+ZGl2LmFjdGl2ZXtjb2xvcjojNzg3ODc4O2JhY2tncm91bmQ6cmdiYSg3Nyw3Nyw3NywuMDUpO2JvcmRlcjowIHNvbGlkIHJnYmEoNzcsNzcsNzcsMCl9LnNlbGVjdGl6ZS1pbnB1dD5pbnB1dHtkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDttaW4taGVpZ2h0OjAhaW1wb3J0YW50O21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOjEwMCUhaW1wb3J0YW50O21hcmdpbjowIDJweCAwIDAhaW1wb3J0YW50O3RleHQtaW5kZW50OjAhaW1wb3J0YW50O2JvcmRlcjowIWltcG9ydGFudDtiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6aW5oZXJpdCFpbXBvcnRhbnQ7LXdlYmtpdC11c2VyLXNlbGVjdDphdXRvIWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0PmlucHV0OjotbXMtY2xlYXJ7ZGlzcGxheTpub25lfS5zZWxlY3RpemUtaW5wdXQ+aW5wdXQ6Zm9jdXN7b3V0bGluZTowIWltcG9ydGFudH0uc2VsZWN0aXplLWlucHV0OjphZnRlcntjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO2NsZWFyOmxlZnR9LnNlbGVjdGl6ZS1pbnB1dC5kcm9wZG93bi1hY3RpdmU6OmJlZm9yZXtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6I2YwZjBmMDtoZWlnaHQ6MXB4O2JvdHRvbTowO2xlZnQ6MDtyaWdodDowfS5oeC1zZWxlY3QtY29udHJvbDphZnRlcntkaXNwbGF5Om5vbmV9LnNlbGVjdGl6ZS1kcm9wZG93bntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwO2JvcmRlcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kOiNmZmY7bWFyZ2luOi0xcHggMCAwO2JvcmRlci10b3A6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNoYWRvdzowIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE0NSk7Ym9yZGVyLXJhZGl1czowfS5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV17Y3Vyc29yOnBvaW50ZXI7b3ZlcmZsb3c6aGlkZGVufS5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV0gLmhpZ2hsaWdodHtiYWNrZ3JvdW5kOnJnYmEoMzUsNDksNDMsLjIzKTtib3JkZXItcmFkaXVzOjFweDtmb250LXdlaWdodDo3MDB9LnNlbGVjdGl6ZS1kcm9wZG93biAub3B0Z3JvdXAtaGVhZGVyLC5zZWxlY3RpemUtZHJvcGRvd24gW2RhdGEtc2VsZWN0YWJsZV17cGFkZGluZzo1cHggOHB4fS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwOmZpcnN0LWNoaWxkIC5vcHRncm91cC1oZWFkZXJ7Ym9yZGVyLXRvcDowfS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwLWhlYWRlcntjb2xvcjojMmEyYzJkO2JhY2tncm91bmQ6I2ZmZjtjdXJzb3I6ZGVmYXVsdH0uc2VsZWN0aXplLWRyb3Bkb3duIC5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNDFiOTg3O2NvbG9yOiNmZmZ9LnNlbGVjdGl6ZS1kcm9wZG93biAuYWN0aXZlLmNyZWF0ZXtjb2xvcjojZmZmfS5zZWxlY3RpemUtZHJvcGRvd24gLmNyZWF0ZXtjb2xvcjpyZ2JhKDQyLDQ0LDQ1LC41KX0uc2VsZWN0aXplLWRyb3Bkb3duLWNvbnRlbnR7b3ZlcmZsb3cteTphdXRvO292ZXJmbG93LXg6aGlkZGVuO21heC1oZWlnaHQ6MjAwcHg7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0LC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjdXJzb3I6cG9pbnRlcn0uc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUgaW5wdXR7Y3Vyc29yOnRleHR9LnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNXB4O21hcmdpbi10b3A6LTNweDt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci1jb2xvcjpncmV5IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5kcm9wZG93bi1hY3RpdmU6YWZ0ZXJ7bWFyZ2luLXRvcDotNHB4O2JvcmRlci13aWR0aDowIDVweCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGdyZXl9LnNlbGVjdGl6ZS1jb250cm9sLnJ0bC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dDphZnRlcntsZWZ0OjE1cHg7cmlnaHQ6YXV0b30uc2VsZWN0aXplLWNvbnRyb2wucnRsIC5zZWxlY3RpemUtaW5wdXQ+aW5wdXR7bWFyZ2luOjAgNHB4IDAgLTJweCFpbXBvcnRhbnR9LnNlbGVjdGl6ZS1jb250cm9sIC5zZWxlY3RpemUtaW5wdXQuZGlzYWJsZWR7b3BhY2l0eTouNTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXJpZ2h0Oi43cmVtIWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLW1lZGl1bXtwYWRkaW5nLXJpZ2h0OjFyZW0haW1wb3J0YW50fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0gLmh4LWRlbGV0ZXttYXJnaW4tbGVmdDotLjJyZW07aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDttYXgtaGVpZ2h0OjE2cHg7bWF4LXdpZHRoOjE2cHg7bWluLWhlaWdodDoxNnB4O21pbi13aWR0aDoxNnB4fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0uaXMtbWVkaXVtIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS41cmVtfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV0uaXMtbGFyZ2UgLmh4LWRlbGV0ZXttYXJnaW4tbGVmdDotLjJyZW07aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDttYXgtaGVpZ2h0OjIwcHg7bWF4LXdpZHRoOjIwcHg7bWluLWhlaWdodDoyMHB4O21pbi13aWR0aDoyMHB4fS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAuZGlzYWJsZWQgW2RhdGEtdmFsdWVdIC5oeC1yZW1vdmU6aG92ZXJ7YmFja2dyb3VuZDowIDB9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIC5kaXNhYmxlZCBbZGF0YS12YWx1ZV0gLmh4LXJlbW92ZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDc3LDc3LDc3LDApfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAucmVtb3ZlLXNpbmdsZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoyOHB4O3RvcDo2cHg7Zm9udC1zaXplOjIzcHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdGl6ZUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2ssIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX29wdGlvbnM6IGFueVtdO1xyXG4gIHByaXZhdGUgX29wdGlvbnNfZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+O1xyXG4gIHByaXZhdGUgX29wdGdyb3VwczogYW55W107XHJcbiAgcHJpdmF0ZSBfb3B0Z3JvdXBzX2RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBTZWxlY3RpemVDb25maWc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhhc09wdGlvbnNQbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5vT3B0aW9uc1BsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZW5hYmxlZCA9IHRydWU7XHJcbiAgQElucHV0KCkgdmFsdWU6IElTZWxlY3RpemVJdGVtW107XHJcbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIEBJbnB1dCgpIGVycm9yQ2xhc3M6IHN0cmluZztcclxuXHJcbiAgQE91dHB1dCgpIG9uQmx1cjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPihmYWxzZSk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGl6ZUlucHV0Jykgc2VsZWN0aXplSW5wdXQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RpemU6IGFueTtcclxuXHJcbiAgLy8gQ29udHJvbCB2YWx1ZSBhY2Nlc3NvcnMuXHJcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0aXplSW5wdXQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAnaWQnLFxyXG4gICAgICAgIHRoaXMuaWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5zZWxlY3RpemUgPSAkKHRoaXMuc2VsZWN0aXplSW5wdXQubmF0aXZlRWxlbWVudCkuc2VsZWN0aXplKFxyXG4gICAgICB0aGlzLmNvbmZpZ1xyXG4gICAgKVswXS5zZWxlY3RpemU7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vbignY2hhbmdlJywgdGhpcy5vblNlbGVjdGl6ZVZhbHVlQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub24oJ2JsdXInLCB0aGlzLm9uQmx1ckV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub24oJ3R5cGUnLCB0aGlzLm9uU2VsZWN0aXplVHlwZS5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMuc2VsZWN0aXplLm9uKCdpdGVtX2FkZCcsIHRoaXMub25TZWxlY3RpemVJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XHJcbiAgICB0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLm9uRW5hYmxlZFN0YXR1c0NoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vZmYoJ2NoYW5nZScpO1xyXG4gICAgdGhpcy5zZWxlY3RpemUub2ZmKCdibHVyJyk7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5vZmYoJ3R5cGUnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBkZXRlY3Rpb24gZm9yIHByaW1pdGl2ZSB0eXBlcy5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RpemUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3BsYWNlaG9sZGVyJykgfHxcclxuICAgICAgICBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdoYXNPcHRpb25zUGxhY2Vob2xkZXInKSB8fFxyXG4gICAgICAgIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ25vT3B0aW9uc1BsYWNlaG9sZGVyJylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdlbmFibGVkJykpIHtcclxuICAgICAgICB0aGlzLm9uRW5hYmxlZFN0YXR1c0NoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbXBsZW1lbnRpbmcgZGVlcCBjaGVjayBmb3Igb3B0aW9uIGNvbXBhcmlzb25cclxuICAgKlxyXG4gICAqIEZJWE1FIC0+IEltcGxlbWVudCBkZWVwIGNoZWNrIHRvIG9ubHkgY29tcGFyZSBhZ2FpbnN0IGxhYmVsIGFuZCB2YWx1ZSBmaWVsZHMuXHJcbiAgICovXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX29wdGlvbnNfZGlmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9vcHRpb25zX2RpZmZlci5kaWZmKHRoaXMuX29wdGlvbnMpO1xyXG4gICAgICBpZiAoY2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuX2FwcGx5T3B0aW9uc0NoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9vcHRncm91cHNfZGlmZmVyKSB7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9vcHRncm91cHNfZGlmZmVyLmRpZmYodGhpcy5fb3B0Z3JvdXBzKTtcclxuICAgICAgaWYgKGNoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLl9hcHBseU9wdGlvbkdyb3VwQ2hhbmdlcyhjaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYXBwbHlPcHRpb25zQ2hhbmdlcyhjaGFuZ2VzOiBJdGVyYWJsZUNoYW5nZXM8YW55Pik6IHZvaWQge1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdGlvbkFkZChyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdGlvblJlbW92ZShyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcclxuICAgIHRoaXMuZXZhbEhhc0Vycm9yKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hcHBseU9wdGlvbkdyb3VwQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcclxuICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxhbnk+KSA9PiB7XHJcbiAgICAgIHRoaXMub25TZWxlY3RpemVPcHRHcm91cEFkZChyZWNvcmQuaXRlbSk7XHJcbiAgICB9KTtcclxuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPGFueT4pID0+IHtcclxuICAgICAgdGhpcy5vblNlbGVjdGl6ZU9wdEdyb3VwUmVtb3ZlKHJlY29yZC5pdGVtKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5ldmFsSGFzRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJoaWdobGlnaHQoKTogdm9pZCB7XHJcbiAgICAvLyByZW1vdmUgaGlnaGxpZ2h0IHRvIGhlbHAgc2VsZWN0aXplIGJ1Z1xyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlbGVjdGl6ZS9zZWxlY3RpemUuanMvaXNzdWVzLzExNDFcclxuICAgIHRoaXMuc2VsZWN0aXplLiRkcm9wZG93bl9jb250ZW50LnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyRXZlbnQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuICAgIHRoaXMub25CbHVyLmVtaXQoKTtcclxuICAgIHRoaXMuZXZhbEhhc0Vycm9yKCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGl6ZU9wdEdyb3VwQWRkKG9wdGdyb3VwOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aXplLmFkZE9wdGlvbkdyb3VwKG9wdGdyb3VwW3RoaXMuZ2V0T3B0Z3JvdXBGaWVsZCgpXSwgb3B0Z3JvdXApO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RpemVPcHRHcm91cFJlbW92ZShvcHRncm91cDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGl6ZS5yZW1vdmVPcHRpb25Hcm91cChvcHRncm91cFt0aGlzLmdldE9wdGdyb3VwRmllbGQoKV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVmcmVzaCBzZWxlY3RlZCB2YWx1ZXMgd2hlbiBvcHRpb25zIGNoYW5nZS5cclxuICAgKi9cclxuICBvblNlbGVjdGl6ZU9wdGlvbkFkZChvcHRpb246IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RpemUuYWRkT3B0aW9uKF8uY2xvbmVEZWVwKG9wdGlvbikpO1xyXG4gICAgY29uc3QgdmFsdWVGaWVsZCA9IHRoaXMuY29uZmlnLnZhbHVlRmllbGQ7XHJcbiAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICBjb25zdCBpdGVtcyA9XHJcbiAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgPyBbdGhpcy52YWx1ZV1cclxuICAgICAgICAgIDogdGhpcy52YWx1ZTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGl0ZW1zICYmXHJcbiAgICAgICAgaXRlbXMgaW5zdGFuY2VvZiBBcnJheSAmJlxyXG4gICAgICAgIGl