UNPKG

@hxui/angular

Version:

* * *

493 lines 63.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} 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'; /** @type {?} */ export const SELECTIZE_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectizeComponent), multi: true }; export class SelectizeComponent { /** * @param {?} _differs * @param {?} renderer */ constructor(_differs, renderer) { this._differs = _differs; this.renderer = renderer; this.enabled = true; this.value = []; this.isFocused = false; this.isValid = false; this.onBlur = new EventEmitter(false); this.onFocus = new EventEmitter(false); /** * Invoked anytime a key is pressed down on the selectize search field * @param e */ this.onKeydown = e => { console.log(e); /** @type {?} */ const TABKEY = 9; if (e.keyCode === TABKEY) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); } }; } /** * @return {?} */ ngOnInit() { if (this.id && this.id.length > 0) { this.renderer.setAttribute(this.selectizeInput.nativeElement, 'id', this.id); } this.reset(); } /** * @return {?} */ reset() { 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('focus', this.onFocusEvent.bind(this)); this.selectize.on('type', this.onSelectizeType.bind(this)); this.selectize.on('item_add', this.onSelectizeItemSelected.bind(this)); this.updatePlaceholder(); this.onEnabledStatusChange(); this.hasCaret(); } /** * @return {?} */ ngOnDestroy() { if (this.selectize) { this.selectize.off('change'); this.selectize.off('blur'); this.selectize.off('focus'); this.selectize.off('type'); } } /** * Change detection for primitive types. * @param {?} changes * @return {?} */ ngOnChanges(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. * @return {?} */ ngDoCheck() { if (this._options_differ) { /** @type {?} */ const changes = this._options_differ.diff(this._options); if (changes) { this._applyOptionsChanges(changes); } } if (this._optgroups_differ) { /** @type {?} */ const changes = this._optgroups_differ.diff(this._optgroups); if (changes) { this._applyOptionGroupChanges(changes); } } } /** * @param {?} changes * @return {?} */ _applyOptionsChanges(changes) { changes.forEachRemovedItem((record) => { this.onSelectizeOptionRemove(record.item); }); changes.forEachAddedItem((record) => { this.onSelectizeOptionAdd(record.item); }); this.updatePlaceholder(); this.evalHasError(); } /** * @param {?} changes * @return {?} */ _applyOptionGroupChanges(changes) { changes.forEachRemovedItem((record) => { this.onSelectizeOptGroupRemove(record.item); }); changes.forEachAddedItem((record) => { this.onSelectizeOptGroupAdd(record.item); }); this.updatePlaceholder(); this.evalHasError(); } /** * @return {?} */ clearhighlight() { // remove highlight to help selectize bug // https://github.com/selectize/selectize.js/issues/1141 this.selectize.$dropdown_content.removeHighlight(); } /** * @return {?} */ onBlurEvent() { if (this.formControl) { this.formControl.markAsTouched(); } this.onBlur.emit(); this.evalHasError(); this.isFocused = false; this.isValid = (this.selectize.getValue().length > 0); } /** * @return {?} */ onFocusEvent() { if (this.formControl) { this.formControl.markAsTouched(); } this.onFocus.emit(); this.evalHasError(); this.isFocused = true; } /** * @param {?} optgroup * @return {?} */ onSelectizeOptGroupAdd(optgroup) { this.selectize.addOptionGroup(optgroup[this.getOptgroupField()], optgroup); } /** * @param {?} optgroup * @return {?} */ onSelectizeOptGroupRemove(optgroup) { this.selectize.removeOptionGroup(optgroup[this.getOptgroupField()]); } /** * Refresh selected values when options change. * @param {?} option * @return {?} */ onSelectizeOptionAdd(option) { this.selectize.addOption(_.cloneDeep(option)); /** @type {?} */ const valueField = this.config.valueField; if (this.value) { /** @type {?} */ const items = typeof this.value === 'string' || typeof this.value === 'number' ? [this.value] : this.value; if (items && items instanceof Array && items.find(value => value === option[valueField])) { this.selectize.addItem(option[valueField], true); } } } /** * @param {?} option * @return {?} */ onSelectizeOptionRemove(option) { this.selectize.removeOption(option[this.config.valueField]); } /** * @return {?} */ evalHasError() { /** @type {?} */ const 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'); } } } /** * @return {?} */ updateLabel() { } /** * Update the current placeholder based on the given input parameter. * @return {?} */ updatePlaceholder() { 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. * @return {?} */ onEnabledStatusChange() { this.enabled ? this.selectize.enable() : this.selectize.disable(); } /** * @return {?} */ hasCaret() { if (this.config.hasCaret) { /** @type {?} */ const parent = $(this.selectize.$control).parent(); parent.addClass('hasCaret'); } } /** * Dispatches change event when a value change is detected. * @param {?} $event * @return {?} */ onSelectizeValueChange($event) { // In some cases this gets called before registerOnChange. if (this.onChangeCallback) { // Map selectize's value collection back to original ISelectizeItem object /** @type {?} */ const data = this.selectize.items.map(v => { return this.selectize.options[v]; }); this.onChangeCallback(data); } } /** * Invoked when the user types while filtering options. * @param {?} str * @return {?} */ onSelectizeType(str) { if (str.length === 0) { this.clearhighlight(); this.selectize.close(); } } /** * @param {?} $event * @return {?} */ onSelectizeItemSelected($event) { this.clearhighlight(); if (this.config.closeAfterSelect) { this.selectize.close(); } } /** * Returns the applicable placeholder. * @return {?} */ getPlaceholder() { 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 * @return {?} */ writeValue(obj) { if (obj === this.value) { return; } this.value = obj; if (!obj || obj.length === 0) { this.selectize.setValue(''); return; } /** @type {?} */ const stringValue = obj.map(v => { if (!Object.keys(this.selectize.options).some(x => x === v.value)) { this.selectize.addOption(v); } return v.value; }); this.selectize.setValue(stringValue); this.evalHasError(); this.isValid = (this.selectize.getValue().length > 0); } /** * Implementation from ControlValueAccessor, callback for (ngModelChange) * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChangeCallback = fn; } /** * Implementation from ControlValueAccessor * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouchedCallback = fn; } /** * @return {?} */ getOptgroupField() { return this.config['optgroupField'] ? this.config['optgroupField'] : 'optgroup'; } /** * @param {?} value * @return {?} */ set options(value) { this._options = value; if (!this._options_differ && value) { this._options_differ = this._differs.find(value).create(); } } /** * @return {?} */ get options() { return this._options; } /** * @param {?} value * @return {?} */ set optgroups(value) { this._optgroups = value; if (!this._optgroups_differ && value) { this._optgroups_differ = this._differs.find(value).create(); } } /** * @return {?} */ get optgroups() { return this._optgroups; } } SelectizeComponent.decorators = [ { type: Component, args: [{ selector: 'hxa-selectize', template: `<div class="hx-input-control" [ngClass]="config.inputControlClasses" [class.is-focused]="isFocused" [class.is-valid]="isValid"> <select #selectizeInput></select> <label for="{{id}}" class="hx-label">{{config.label}} <sup *ngIf="config.mandatory">*</sup></label> <div class="hx-help">{{config.help}}</div> </div>`, 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 0;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 0 3px}.selectize-control.multi.hasCaret .selectize-input.has-items{padding-right:1rem}.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.hasCaret .selectize-input,.selectize-control.hasCaret .selectize-input input,.selectize-control.single .selectize-input,.selectize-control.single .selectize-input input{cursor:pointer}.selectize-control.hasCaret .selectize-input.input-active,.selectize-control.hasCaret .selectize-input.input-active input,.selectize-control.single .selectize-input.input-active,.selectize-control.single .selectize-input.input-active input{cursor:text}.selectize-control.hasCaret .selectize-input:after,.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.hasCaret .selectize-input.dropdown-active:after,.selectize-control.single .selectize-input.dropdown-active:after{margin-top:-4px;border-width:0 5px 5px;border-color:transparent transparent grey}.selectize-control.multi.hasCaret .selectize-input.has-items:after{top:initial;bottom:1.3rem}.selectize-control.rtl.hasCaret .selectize-input:after,.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}hxa-selectize .hx-input-control{padding-top:.21rem}hxa-selectize .hx-input-control .hx-label{position:absolute;top:.7rem;margin:0;font-weight:400;color:#aeadad;left:0;transition:.3s;z-index:0}hxa-selectize .hx-input-control .hx-label sup{top:-.2rem;color:#b81e4f;font-size:.7rem;transition:.3s}hxa-selectize .hx-input-control .hx-label+.hx-help{font-size:.75rem;margin-top:-.09rem;color:#63605f;transition:.3s;opacity:0;position:relative}hxa-selectize .hx-input-control .hx-label+.hx-help:after,hxa-selectize .hx-input-control .hx-label+.hx-help:before{content:'';position:absolute;top:-.4rem;width:0%;height:3px;background-color:#41b987;transition:.3s;z-index:1}hxa-selectize .hx-input-control .hx-label+.hx-help:before{left:50%}hxa-selectize .hx-input-control .hx-label+.hx-help:after{right:50%}hxa-selectize .hx-input-control.is-focused .hx-label{color:#41b987}hxa-selectize .hx-input-control.is-focused .hx-help{opacity:1}hxa-selectize .hx-input-control.is-focused .hx-help:after,hxa-selectize .hx-input-control.is-focused .hx-help:before{width:50%}hxa-selectize .hx-input-control.is-focused .hx-label,hxa-selectize .hx-input-control.is-valid .hx-label{top:-.5rem;font-size:.75rem}hxa-selectize .hx-input-control.is-focused .hx-label sup,hxa-selectize .hx-input-control.is-valid .hx-label sup{top:-.3rem;font-size:.4rem}hxa-selectize .selectize-control:focus{outline:0}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-label,hxa-selectize .selectize-control:valid~.hx-label{top:-.5rem;font-size:.75rem}hxa-selectize .selectize-control:-webkit-autofill~.hx-label sup,hxa-selectize .selectize-control:focus~.hx-label sup,hxa-selectize .selectize-control:valid~.hx-label sup{top:-.3rem;font-size:.4rem}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-label{color:#41b987}hxa-selectize .selectize-control:-webkit-autofill~.hx-label,hxa-selectize .selectize-control:focus~.hx-help{opacity:1}hxa-selectize .selectize-control:-webkit-autofill~.hx-label:after,hxa-selectize .selectize-control:-webkit-autofill~.hx-label:before,hxa-selectize .selectize-control:focus~.hx-help:after,hxa-selectize .selectize-control:focus~.hx-help:before{width:50%}hxa-selectize .selectize-control.is-disabled,hxa-selectize .selectize-control[disabled]{border-color:#aeadad;color:#aeadad;cursor:not-allowed}hxa-selectize .selectize-control.is-disabled~.hx-label,hxa-selectize .selectize-control[disabled]~.hx-label{top:-.5rem;font-size:.75rem;color:#aeadad;cursor:not-allowed}hxa-selectize .selectize-control.is-disabled~.hx-label sup,hxa-selectize .selectize-control[disabled]~.hx-label sup{font-size:.4rem}hxa-selectize.ng-invalid.ng-dirty .hx-label{color:#b81e4f}hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help{position:relative;opacity:1;color:#b81e4f}hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help:after,hxa-selectize.ng-invalid.ng-dirty .hx-label+.hx-help:before{width:50%;background-color:#b81e4f}.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 = () => [ { 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 }], onFocus: [{ type: Output }], selectizeInput: [{ type: ViewChild, args: ['selectizeInput',] }], options: [{ type: Input }], optgroups: [{ type: Input }] }; if (false) { /** @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.isFocused; /** @type {?} */ SelectizeComponent.prototype.isValid; /** @type {?} */ SelectizeComponent.prototype.onBlur; /** @type {?} */ SelectizeComponent.prototype.onFocus; /** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aXplLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvc2VsZWN0aXplL3NlbGVjdGl6ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxLQUFLLEVBS0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBSWYsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLFdBQVcsRUFDWixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFLckQsTUFBTSxPQUFPLHdCQUF3QixHQUFRO0lBQzNDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNqRCxLQUFLLEVBQUUsSUFBSTtDQUNaO0FBYUQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7SUE4QjdCLFlBQW9CLFFBQXlCLEVBQVUsUUFBbUI7UUFBdEQsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbEJqRSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsVUFBSyxHQUFxQixFQUFFLENBQUM7UUFHdEMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRU4sV0FBTSxHQUF1QixJQUFJLFlBQVksQ0FBTyxLQUFLLENBQUMsQ0FBQztRQUMzRCxZQUFPLEdBQXVCLElBQUksWUFBWSxDQUFPLEtBQUssQ0FBQyxDQUFDOzs7OztRQXdQdEUsY0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxD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LENBQUM7YUFDbHBROzs7O1lBcENDLGVBQWU7WUFLZixTQUFTOzs7cUJBdUNSLEtBQUs7aUJBQ0wsS0FBSzswQkFDTCxLQUFLO29DQUNMLEtBQUs7bUNBQ0wsS0FBSztzQkFDTCxLQUFLO29CQUNMLEtBQUs7MEJBQ0wsS0FBSzt5QkFDTCxLQUFLO3FCQUlMLE1BQU07c0JBQ04sTUFBTTs2QkFFTixTQUFTLFNBQUMsZ0JBQWdCO3NCQW9VMUIsS0FBSzt3QkFZTCxLQUFLOzs7O0lBcFdOLHNDQUF3Qjs7SUFDeEIsNkNBQTZDOztJQUM3Qyx3Q0FBMEI7O0lBQzFCLCtDQUErQzs7SUFFL0Msb0NBQWlDOztJQUNqQyxnQ0FBb0I7O0lBQ3BCLHlDQUE2Qjs7SUFDN0IsbURBQXVDOztJQUN2QyxrREFBc0M7O0lBQ3RDLHFDQUF3Qjs7SUFDeEIsbUNBQXNDOztJQUN0Qyx5Q0FBa0M7O0lBQ2xDLHdDQUE0Qjs7SUFDNUIsdUNBQWtCOztJQUNsQixxQ0FBZ0I7O0lBRWhCLG9DQUFxRTs7SUFDckUscUNBQXNFOztJQUV0RSw0Q0FBaUQ7O0lBRWpELHVDQUF1Qjs7SUFHdkIsK0NBQW9DOztJQUNwQyw4Q0FBeUM7Ozs7OztJQWdQekMsdUNBUUM7O0lBdFBXLHNDQUFpQzs7SUFBRSxzQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBEb0NoZWNrLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEl0ZXJhYmxlRGlmZmVycyxcclxuICBJdGVyYWJsZURpZmZlcixcclxuICBJdGVyYWJsZUNoYW5nZVJlY29yZCxcclxuICBJdGVyYWJsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgUmVuZGVyZXIyLFxyXG4gIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIEZvcm1Db250cm9sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBTZWxlY3RpemVDb25maWcgfSBmcm9tICcuL3NlbGVjdGl6ZS5jb25maWcnO1xyXG5pbXBvcnQge0lTZWxlY3RpemVJdGVtfSBmcm9tICcuL3NlbGVjdGl6ZS1pdGVtLmludGVyZmFjZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5leHBvcnQgY29uc3QgU0VMRUNUSVpFX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0aXplQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZVxyXG59O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtc2VsZWN0aXplJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJoeC1pbnB1dC1jb250cm9sXCIgW25nQ2xhc3NdPVwiY29uZmlnLmlucHV0Q29udHJvbENsYXNzZXNcIiBbY2xhc3MuaXMtZm9jdXNlZF09XCJpc0ZvY3VzZWRcIiBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c2VsZWN0ICNzZWxlY3RpemVJbnB1dD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInt7aWR9fVwiIGNsYXNzPVwiaHgtbGFiZWxcIj57e2NvbmZpZy5sYWJlbH19IDxzdXAgKm5nSWY9XCJjb25maWcubWFuZGF0b3J5XCI+Kjwvc3VwPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1oZWxwXCI+e3tjb25maWcuaGVscH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+YCxcclxuICBwcm92aWRlcnM6IFtTRUxFQ1RJWkVfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3R5bGVzOiBbYC5zZWxlY3RpemUtY29udHJvbHtwb3NpdGlvbjpyZWxhdGl2ZX0uc2VsZWN0aXplLWRyb3Bkb3duLC5zZWxlY3RpemUtaW5wdXQsLnNlbGVjdGl6ZS1pbnB1dCBpbnB1dHtjb2xvcjojMmEyYzJkO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOi45MnJlbTtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC1mb250LXNtb290aGluZzppbmhlcml0fS5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUsLnNlbGVjdGl6ZS1pbnB1dHtiYWNrZ3JvdW5kOjAgMDtjdXJzb3I6dGV4dDtkaXNwbGF5OmlubGluZS1ibG9ja30uc2VsZWN0aXplLWlucHV0e2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwuMik7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7Ym94LXNpemluZzpib3JkZXItYm94O2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXdpZHRoOjAgMCAxcHh9LnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQuaGFzLWl0ZW1ze3BhZGRpbmc6NnB4IDAgM3B4fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aS5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtc3twYWRkaW5nLXJpZ2h0OjFyZW19LnNlbGVjdGl6ZS1pbnB1dC5mdWxse2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZCwuc2VsZWN0aXplLWlucHV0LmRpc2FibGVkICp7Y3Vyc29yOmRlZmF1bHQhaW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQuZm9jdXN7Ym94LXNoYWRvdzpub25lfS5zZWxlY3RpemUtaW5wdXQuZHJvcGRvd24tYWN0aXZle2JvcmRlci1yYWRpdXM6MH0uc2VsZWN0aXplLWlucHV0Pip7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7em9vbToxfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0PmRpdntjdXJzb3I6cG9pbnRlcjttYXJnaW46NHB4O3BhZGRpbmc6MnB4IDZweDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjojMmEyYzJkO2JvcmRlcjowIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MjkwNDg2cHg7Zm9udC1zaXplOi43NXJlbTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2xpbmUtaGVpZ2h0OjEuNTt3aGl0ZS1zcGFjZTpub3dyYXB9LnNlbGVjdGl6ZS1jb250cm9sLm11bHRpIC5zZWxlY3RpemUtaW5wdXQ+ZGl2LmFjdGl2ZXtiYWNrZ3JvdW5kOiNlOGU4ZTg7Y29sb3I6IzJhMmMyZDtib3JkZXI6MCBzb2xpZCAjY2FjYWNhfS5zZWxlY3RpemUtY29udHJvbC5tdWx0aSAuc2VsZWN0aXplLWlucHV0LmRpc2FibGVkPmRpdiwuc2VsZWN0aXplLWNvbnRyb2wubXVsdGkgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZD5kaXYuYWN0aXZle2NvbG9yOiM3ODc4Nzg7YmFja2dyb3VuZDpyZ2JhKDc3LDc3LDc3LC4wNSk7Ym9yZGVyOjAgc29saWQgcmdiYSg3Nyw3Nyw3NywwKX0uc2VsZWN0aXplLWlucHV0PmlucHV0e2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWF4LWhlaWdodDpub25lIWltcG9ydGFudDttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luOjAgMnB4IDAgMCFpbXBvcnRhbnQ7dGV4dC1pbmRlbnQ6MCFpbXBvcnRhbnQ7Ym9yZGVyOjAhaW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtsaW5lLWhlaWdodDppbmhlcml0IWltcG9ydGFudDstd2Via2l0LXVzZXItc2VsZWN0OmF1dG8haW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQ+aW5wdXQ6Oi1tcy1jbGVhcntkaXNwbGF5Om5vbmV9LnNlbGVjdGl6ZS1pbnB1dD5pbnB1dDpmb2N1c3tvdXRsaW5lOjAhaW1wb3J0YW50fS5zZWxlY3RpemUtaW5wdXQ6OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7Y2xlYXI6bGVmdH0uc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTo6YmVmb3Jle2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDojZjBmMGYwO2hlaWdodDoxcHg7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjB9Lmh4LXNlbGVjdC1jb250cm9sOmFmdGVye2Rpc3BsYXk6bm9uZX0uc2VsZWN0aXplLWRyb3Bkb3due3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTA7Ym9yZGVyOnRyYW5zcGFyZW50O2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MXB4IDAgMDtib3JkZXItdG9wOjA7Ym94LXNpemluZzpib3JkZXItYm94O2JveC1zaGFkb3c6MCA2cHggMTJweCByZ2JhKDAsMCwwLC4xNDUpO2JvcmRlci1yYWRpdXM6MH0uc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVde2N1cnNvcjpwb2ludGVyO292ZXJmbG93OmhpZGRlbn0uc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVdIC5oaWdobGlnaHR7YmFja2dyb3VuZDpyZ2JhKDM1LDQ5LDQzLC4yMyk7Ym9yZGVyLXJhZGl1czoxcHg7Zm9udC13ZWlnaHQ6NzAwfS5zZWxlY3RpemUtZHJvcGRvd24gLm9wdGdyb3VwLWhlYWRlciwuc2VsZWN0aXplLWRyb3Bkb3duIFtkYXRhLXNlbGVjdGFibGVde3BhZGRpbmc6NXB4IDhweH0uc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cDpmaXJzdC1jaGlsZCAub3B0Z3JvdXAtaGVhZGVye2JvcmRlci10b3A6MH0uc2VsZWN0aXplLWRyb3Bkb3duIC5vcHRncm91cC1oZWFkZXJ7Y29sb3I6IzJhMmMyZDtiYWNrZ3JvdW5kOiNmZmY7Y3Vyc29yOmRlZmF1bHR9LnNlbGVjdGl6ZS1kcm9wZG93biAuYWN0aXZle2JhY2tncm91bmQtY29sb3I6IzQxYjk4Nztjb2xvcjojZmZmfS5zZWxlY3RpemUtZHJvcGRvd24gLmFjdGl2ZS5jcmVhdGV7Y29sb3I6I2ZmZn0uc2VsZWN0aXplLWRyb3Bkb3duIC5jcmVhdGV7Y29sb3I6cmdiYSg0Miw0NCw0NSwuNSl9LnNlbGVjdGl6ZS1kcm9wZG93bi1jb250ZW50e292ZXJmbG93LXk6YXV0bztvdmVyZmxvdy14OmhpZGRlbjttYXgtaGVpZ2h0OjIwMHB4Oy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LC5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0IGlucHV0LC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dCwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQgaW5wdXR7Y3Vyc29yOnBvaW50ZXJ9LnNlbGVjdGl6ZS1jb250cm9sLmhhc0NhcmV0IC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LmlucHV0LWFjdGl2ZSBpbnB1dCwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuaW5wdXQtYWN0aXZlLC5zZWxlY3RpemUtY29udHJvbC5zaW5nbGUgLnNlbGVjdGl6ZS1pbnB1dC5pbnB1dC1hY3RpdmUgaW5wdXR7Y3Vyc29yOnRleHR9LnNlbGVjdGl6ZS1jb250cm9sLmhhc0NhcmV0IC5zZWxlY3RpemUtaW5wdXQ6YWZ0ZXIsLnNlbGVjdGl6ZS1jb250cm9sLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2NvbnRlbnQ6JyAnO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNXB4O21hcmdpbi10b3A6LTNweDt3aWR0aDowO2hlaWdodDowO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6NXB4IDVweCAwO2JvcmRlci1jb2xvcjpncmV5IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5zZWxlY3RpemUtY29udHJvbC5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0LmRyb3Bkb3duLWFjdGl2ZTphZnRlciwuc2VsZWN0aXplLWNvbnRyb2wuc2luZ2xlIC5zZWxlY3RpemUtaW5wdXQuZHJvcGRvd24tYWN0aXZlOmFmdGVye21hcmdpbi10b3A6LTRweDtib3JkZXItd2lkdGg6MCA1cHggNXB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBncmV5fS5zZWxlY3RpemUtY29udHJvbC5tdWx0aS5oYXNDYXJldCAuc2VsZWN0aXplLWlucHV0Lmhhcy1pdGVtczphZnRlcnt0b3A6aW5pdGlhbDtib3R0b206MS4zcmVtfS5zZWxlY3RpemUtY29udHJvbC5ydGwuaGFzQ2FyZXQgLnNlbGVjdGl6ZS1pbnB1dDphZnRlciwuc2VsZWN0aXplLWNvbnRyb2wucnRsLnNpbmdsZSAuc2VsZWN0aXplLWlucHV0OmFmdGVye2xlZnQ6MTVweDtyaWdodDphdXRvfS5zZWxlY3RpemUtY29udHJvbC5ydGwgLnNlbGVjdGl6ZS1pbnB1dD5pbnB1dHttYXJnaW46MCA0cHggMCAtMnB4IWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wgLnNlbGVjdGl6ZS1pbnB1dC5kaXNhYmxlZHtvcGFjaXR5Oi41O2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9se3BhZGRpbmctdG9wOi4yMXJlbX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjdyZW07bWFyZ2luOjA7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiNhZWFkYWQ7bGVmdDowO3RyYW5zaXRpb246LjNzO3otaW5kZXg6MH1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCBzdXB7dG9wOi0uMnJlbTtjb2xvcjojYjgxZTRmO2ZvbnQtc2l6ZTouN3JlbTt0cmFuc2l0aW9uOi4zc31oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscHtmb250LXNpemU6Ljc1cmVtO21hcmdpbi10b3A6LS4wOXJlbTtjb2xvcjojNjM2MDVmO3RyYW5zaXRpb246LjNzO29wYWNpdHk6MDtwb3NpdGlvbjpyZWxhdGl2ZX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LS40cmVtO3dpZHRoOjAlO2hlaWdodDozcHg7YmFja2dyb3VuZC1jb2xvcjojNDFiOTg3O3RyYW5zaXRpb246LjNzO3otaW5kZXg6MX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sIC5oeC1sYWJlbCsuaHgtaGVscDpiZWZvcmV7bGVmdDo1MCV9aHhhLXNlbGVjdGl6ZSAuaHgtaW5wdXQtY29udHJvbCAuaHgtbGFiZWwrLmh4LWhlbHA6YWZ0ZXJ7cmlnaHQ6NTAlfWh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtZm9jdXNlZCAuaHgtbGFiZWx7Y29sb3I6IzQxYjk4N31oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWhlbHB7b3BhY2l0eToxfWh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtZm9jdXNlZCAuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWhlbHA6YmVmb3Jle3dpZHRoOjUwJX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWxhYmVsLGh4YS1zZWxlY3RpemUgLmh4LWlucHV0LWNvbnRyb2wuaXMtdmFsaWQgLmh4LWxhYmVse3RvcDotLjVyZW07Zm9udC1zaXplOi43NXJlbX1oeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLWZvY3VzZWQgLmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5oeC1pbnB1dC1jb250cm9sLmlzLXZhbGlkIC5oeC1sYWJlbCBzdXB7dG9wOi0uM3JlbTtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN7b3V0bGluZTowfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOmZvY3Vzfi5oeC1sYWJlbCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDp2YWxpZH4uaHgtbGFiZWx7dG9wOi0uNXJlbTtmb250LXNpemU6Ljc1cmVtfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtbGFiZWwgc3VwLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOnZhbGlkfi5oeC1sYWJlbCBzdXB7dG9wOi0uM3JlbTtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN+Lmh4LWxhYmVse2NvbG9yOiM0MWI5ODd9aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2w6Zm9jdXN+Lmh4LWhlbHB7b3BhY2l0eToxfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsOmFmdGVyLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGx+Lmh4LWxhYmVsOmJlZm9yZSxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbDpmb2N1c34uaHgtaGVscDpiZWZvcmV7d2lkdGg6NTAlfWh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sLmlzLWRpc2FibGVkLGh4YS1zZWxlY3RpemUgLnNlbGVjdGl6ZS1jb250cm9sW2Rpc2FibGVkXXtib3JkZXItY29sb3I6I2FlYWRhZDtjb2xvcjojYWVhZGFkO2N1cnNvcjpub3QtYWxsb3dlZH1oeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbC5pcy1kaXNhYmxlZH4uaHgtbGFiZWwsaHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2xbZGlzYWJsZWRdfi5oeC1sYWJlbHt0b3A6LS41cmVtO2ZvbnQtc2l6ZTouNzVyZW07Y29sb3I6I2FlYWRhZDtjdXJzb3I6bm90LWFsbG93ZWR9aHhhLXNlbGVjdGl6ZSAuc2VsZWN0aXplLWNvbnRyb2wuaXMtZGlzYWJsZWR+Lmh4LWxhYmVsIHN1cCxoeGEtc2VsZWN0aXplIC5zZWxlY3RpemUtY29udHJvbFtkaXNhYmxlZF1+Lmh4LWxhYmVsIHN1cHtmb250LXNpemU6LjRyZW19aHhhLXNlbGVjdGl6ZS5uZy1pbnZhbGlkLm5nLWRpcnR5IC5oeC1sYWJlbHtjb2xvcjojYjgxZTRmfWh4YS1zZWxlY3RpemUubmctaW52YWxpZC5uZy1kaXJ0eSAuaHgtbGFiZWwrLmh4LWhlbHB7cG9zaXRpb246cmVsYXRpdmU7b3BhY2l0eToxO2NvbG9yOiNiODFlNGZ9aHhhLXNlbGVjdGl6ZS5uZy1pbnZhbGlkLm5nLWRpcnR5IC5oeC1sYWJlbCsuaHgtaGVscDphZnRlcixoeGEtc2VsZWN0aXplLm5nLWludmFsaWQubmctZGlydHkgLmh4LWxhYmVsKy5oeC1oZWxwOmJlZm9yZXt3aWR0aDo1MCU7YmFja2dyb3VuZC1jb2xvcjojYjgxZTRmfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiBbZGF0YS12YWx1ZV17cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1yaWdodDouN3JlbSFpbXBvcnRhbnR9LnNlbGVjdGl6ZS1jb250cm9sLnBsdWdpbi1yZW1vdmVfYnV0dG9uIFtkYXRhLXZhbHVlXS5pcy1tZWRpdW17cGFkZGluZy1yaWdodDoxcmVtIWltcG9ydGFudH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS4ycmVtO2hlaWdodDoxNnB4O3dpZHRoOjE2cHg7bWF4LWhlaWdodDoxNnB4O21heC13aWR0aDoxNnB4O21pbi1oZWlnaHQ6MTZweDttaW4td2lkdGg6MTZweH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLW1lZGl1bSAuaHgtZGVsZXRle21hcmdpbi1sZWZ0Oi0uNXJlbX0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gW2RhdGEtdmFsdWVdLmlzLWxhcmdlIC5oeC1kZWxldGV7bWFyZ2luLWxlZnQ6LS4ycmVtO2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7bWF4LWhlaWdodDoyMHB4O21heC13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDttaW4td2lkdGg6MjBweH0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLmRpc2FibGVkIFtkYXRhLXZhbHVlXSAuaHgtcmVtb3ZlOmhvdmVye2JhY2tncm91bmQ6MCAwfS5zZWxlY3RpemUtY29udHJvbC5wbHVnaW4tcmVtb3ZlX2J1dHRvbiAuZGlzYWJsZWQgW2RhdGEtdmFsdWVdIC5oeC1yZW1vdmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSg3Nyw3Nyw3NywwKX0uc2VsZWN0aXplLWNvbnRyb2wucGx1Z2luLXJlbW92ZV9idXR0b24gLnJlbW92ZS1zaW5nbGV7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MjhweDt0b3A6NnB4O2ZvbnQtc2l6ZToyM3B4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RpemVDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBEb0NoZWNrLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9vcHRpb25zOiBhbnlbXTtcclxuICBwcml2YXRlIF9vcHRpb25zX2RpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcclxuICBwcml2YXRlIF9vcHRncm91cHM6IGFueVtdO1xyXG4gIHByaXZhdGUgX29wdGdyb3Vwc19kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyPGFueT47XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZzogU2VsZWN0aXplQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBoYXNPcHRpb25zUGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBub09wdGlvbnNQbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGVuYWJsZWQgPSB0cnVlO1xyXG4gIE