@boldreports/angular-reporting-components
Version:
The Bold Reports by Syncfuion components for Angular contains ReportViewer and ReportDesigner reporting components for enterprise web development
380 lines • 57.9 kB
JavaScript
import { EventEmitter, Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export { ContentChild, Type, forwardRef } from '@angular/core';
export let currentTemplateElement;
let firstVal = {};
/** Internal Helpers */
export class Utils {
static IterateAndGetChanges(obj) {
if (ej.isNullOrUndefined(obj.tags) || obj.tags.length === 0) {
return null;
}
let res = {};
for (let i = 0, tags = obj.tags; i < tags.length; i++) {
let tag = tags[i], tagElement = obj['tag_' + tag.replace(/\./g, '_')];
if (!ej.isNullOrUndefined(tagElement) && tagElement.hasChanges) {
res[tag] = tagElement.getChangesAndReset();
}
}
return res;
}
}
Utils.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
Utils.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Utils, decorators: [{
type: Injectable
}] });
// tslint:disable-next-line:max-line-length
export class BoldReportComponents {
// tslint:disable-next-line:max-line-length
constructor(controlName, el, cdRef, tags, ejIterableDiffers, _ejKeyValueDiffers) {
this.controlName = controlName;
this.el = el;
this.cdRef = cdRef;
this.tags = tags;
this.ejIterableDiffers = ejIterableDiffers;
this._ejKeyValueDiffers = _ejKeyValueDiffers;
this.model = {};
this.outputs = [];
this.inputs = [];
this.twoways = [];
// this.__shadow = this.dom.getShadowRoot(this.el.nativeElement);
this.firstCheck = true;
this.ejIterable = this.ejIterableDiffers.find([]).create(null);
this.ejKeyValueDif = _ejKeyValueDiffers.find([]).create();
}
static bindAndRaiseEvent(instance, model, event) {
if (!event.startsWith('model.')) { // && instance[event]['observers'].length > 1) {
let originalEvt = event.startsWith('bold') ? event.substr(4) : event;
model[originalEvt] = function (params) {
instance[event + '_output']['emit'](params);
};
}
}
createTwoways(twoways) {
if (!twoways) {
return;
}
let model = this.model;
for (let i = 0; i < twoways.length; i++) {
let element = twoways[i].replace(/\_/g, '.');
ej.createObject(element + 'Change', this[twoways[i] + '_twoChange'], model);
ej.createObject(element, this.addTwoways(element), model);
}
}
addTwoways(prop) {
let model = this.model, value = firstVal; // , originalProp = prop.replace(/-/g, '.');
return function (newVal, isApp) {
if (value === firstVal) {
value = ej.getObject(prop + '_two', model);
if (value === undefined) {
value = ej.getObject(prop, this === undefined || this.defaults === undefined ? {} : this.defaults);
}
}
if (newVal === undefined) {
return value;
}
if (value === newVal) {
return;
}
value = newVal;
if (!isApp) {
ej.createObject(prop + '_two', newVal, model);
ej.getObject(prop + 'Change', model).emit(newVal);
}
};
}
ngOnInit() {
for (let key in this) {
if (key.indexOf('_input') != -1)
this.inputs.push(key);
if (key.indexOf('_output') != -1)
this.outputs.push(key);
if (key.indexOf('_two') != -1 && key.indexOf('_twoChange') == -1)
this.twoways.push(key.replace('_two', ''));
}
if (ej.isNullOrUndefined(this['options'])) {
this.createTwoways(this.twoways);
}
}
ngAfterContentInit() {
this.firstCheck = false;
let model = this.model, events = this.outputs;
if (events) {
for (let i = 0; i < events.length; i++) {
let event = events[i].replace('_output', '');
BoldReportComponents.bindAndRaiseEvent(this, model, event);
}
}
if (ej.isNullOrUndefined(this['options'])) {
for (let i = 0; i < this.tags.length; i++) {
let element = this.tags[i], item = this['tag_' + element.replace(/\./g, '_')];
if (!ej.isNullOrUndefined(item)) {
ej.createObject(element, item.getList(), this.model);
}
}
for (let i = 0; i < this.inputs.length; i++) {
let property = this.inputs[i];
let modelProperty = this.inputs[i].replace('_input', '');
if (this[property] != null) {
if (modelProperty.indexOf('_') == -1) {
if (this.model[modelProperty]) {
$.extend(true, this.model[modelProperty], this[property]);
}
else {
this.model[modelProperty] = this[property];
}
}
else if (modelProperty.indexOf('_two') == -1) {
let tempObj = {};
let key = modelProperty.replace(/\_/g, '.');
ej.createObject(key, this[property], tempObj);
let rootProp = key.split('.')[0];
if (this.model[rootProp] == undefined)
this.model[rootProp] = {};
$.extend(true, this.model[rootProp], tempObj[rootProp]);
}
}
}
for (let i = 0; i < this.twoways.length; i++) {
let twoway = this.twoways[i];
let twowayProperty = twoway + '_two';
if (this[twowayProperty] != null) {
if (twoway.indexOf('_') == -1) {
this.model[twowayProperty] = this[twowayProperty];
}
else {
let tempObj = {};
let key = twoway.replace(/\_/g, '.') + '_two';
ej.createObject(key, this[twowayProperty], tempObj);
let rootProp = twowayProperty.split('_')[0];
$.extend(true, this.model[rootProp], tempObj[rootProp]);
}
}
}
}
else
this.model = jQuery.extend(this.model, this['options']);
}
ngDoCheck() {
if (ej.isNullOrUndefined(this['options'])) {
this.twoways.forEach(element => {
if (this[element + '_two'] instanceof Array) {
let changes = this.ejIterable.diff(this[element + '_two']);
if (changes) {
let ngChanges = {};
if (this.widget != undefined) {
ngChanges = this.getTwowayChanges(changes.collection, ngChanges, element.replace(/\_/g, '.'));
ej.createObject(element.replace(/\_/g, '.') + '.two', changes.collection, ngChanges);
this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges));
}
}
}
});
}
else {
let changes = this.ejKeyValueDif.diff(this['options']);
if (changes) {
if (this.widget != undefined) {
var ngchanges = {};
changes.forEachChangedItem((changedprop) => {
ej.createObject(changedprop.key, changedprop.currentValue, ngchanges);
});
this.widget['setModel'](ngchanges, $.isPlainObject(ngchanges));
}
}
}
}
ngAfterViewInit() {
let nativeElement = this.isEditor ? $(this.el.nativeElement.children) : $(this.el.nativeElement);
let controlName = this.lowerCaseFirstLetter(this.controlName);
this.widget = $(nativeElement)[controlName](this.model)[controlName]('instance');
}
lowerCaseFirstLetter(string) {
return string[0].toLowerCase() + string.slice(1);
}
ngOnChanges(changes) {
if (this.firstCheck) {
return;
}
let ngChanges = {};
if (ej.isNullOrUndefined(this['options'])) {
for (let key in changes) {
let element = changes[key];
if (element.previousValue === element.currentValue) {
break;
}
key = key.replace('_input', '').replace(/\_/g, '.');
if (key.endsWith('.two')) {
let oKey = key.replace('.two', '');
ngChanges = this.getTwowayChanges(element.currentValue, ngChanges, oKey);
}
ej.createObject(key, element.currentValue, ngChanges);
}
this.widget['setModel'](ngChanges, $.isPlainObject(ngChanges));
}
}
getTwowayChanges(value, ngChanges, prop) {
let valFn = ej.getObject(prop, this.widget['model']);
valFn(value, true);
ej.createObject(prop, valFn, ngChanges);
return ngChanges;
}
ngAfterContentChecked() {
// TODO: ChangeDetection Third/Multi level
let changes = Utils.IterateAndGetChanges(this);
for (let key in changes) {
if (changes.hasOwnProperty(key)) {
let element = changes[key];
this.widget['_' + key](element);
}
}
}
ngOnDestroy() {
this.widget['destroy']();
}
}
BoldReportComponents.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
BoldReportComponents.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: BoldReportComponents, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Array }, { type: i0.IterableDiffers }, { type: i0.KeyValueDiffers }]; } });
export class ComplexTagElement {
// tags: Array<string>;
constructor(tags) {
this.tags = tags;
this.valueChange = new EventEmitter();
this.complexes = [];
this.hasChanges = false;
this.firstChange = true;
Object.defineProperty(this, 'parent', {
enumerable: false,
writable: true,
value: null
});
currentTemplateElement = this;
}
ngOnInit() {
this.firstChange = false;
for (let key in this) {
if (key.indexOf('_') != -1 && key.indexOf('tag_') == -1)
this.complexes.push(key);
}
for (let i = 0; i < this.complexes.length; i++) {
let property = this.complexes[i];
if (property.indexOf('_') != -1) {
let tempObj = {};
let key = property.replace(/\_/g, '.');
ej.createObject(key, this[property], tempObj);
let rootProp = key.split('.')[0];
if (this[rootProp] == undefined)
this[rootProp] = {};
$.extend(true, this[rootProp], tempObj[rootProp]);
}
}
}
ensureCleanObject() {
let tags = this.tags;
for (let i = 0; i < tags.length; i++) {
let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')];
if (i === 0 && this[element]) {
return;
}
if (ej.isNullOrUndefined(tagElement)) {
continue;
}
ej.createObject(element, tagElement.getList(), this);
}
}
ngOnChanges(changes) {
if (this.firstChange) {
return;
}
this.recentChanges = changes;
this.hasChanges = true;
}
getChangesAndReset() {
if (this.hasChanges === false) {
return;
}
let changes = this.recentChanges || {};
let contentChanges = Utils.IterateAndGetChanges(this);
if (!$.isEmptyObject(contentChanges)) {
for (let key in contentChanges) {
if (contentChanges.hasOwnProperty(key)) {
let element = contentChanges[key];
// this.el.nativeElement.
if (!ej.isNullOrUndefined(this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key]))
this.parent.widget['_' + this.property.replace(/\./g, '_') + '_' + key](element);
}
}
}
this.hasChanges = false;
return changes;
}
ngAfterContentChecked() {
let tags = this.tags;
for (let i = 0, len = tags.length; i < len; i++) {
let element = tags[i], tagElement = this['tag_' + element.replace(/\./g, '_')];
if (tagElement && tagElement.hasChanges) {
this.hasChanges = true;
}
}
}
}
ComplexTagElement.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement, deps: [{ token: Array }], target: i0.ɵɵFactoryTarget.Injectable });
ComplexTagElement.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ComplexTagElement, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: Array }]; } });
export class ArrayTagElement {
constructor(propertyName) {
this.propertyName = propertyName;
this.hasChanges = false;
}
// TODO: Need to consider dynamic child change
ngAfterContentInit() {
let index = 0;
this.list = this.children.map((child) => {
child.index = index++;
child.property = this.propertyName;
return child;
});
}
getList() {
let list = this.list;
for (let i = 0; i < list.length; i++) {
list[i].ensureCleanObject();
}
return list;
}
getChangesAndReset() {
this.hasChanges = false;
return this.recentChanges;
}
ngAfterContentChecked() {
let changes = {}, res = changes[this.propertyName] = [], childChange;
for (let i = 0, list = this.list; i < list.length; i++) {
let child = list[i];
if (child.hasChanges) {
childChange = child.getChangesAndReset();
if (!ej.isNullOrUndefined(childChange)) {
res.push({
index: child.index,
change: childChange
});
}
}
}
if (res.length > 0) {
this.recentChanges = res;
this.hasChanges = true;
}
}
}
ArrayTagElement.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable });
ArrayTagElement.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: ArrayTagElement, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxZQUFZLEVBRXlFLFVBQVUsRUFFbEcsTUFBTSxlQUFlLENBQUM7O0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxNQUFNLENBQUMsSUFBSSxzQkFBMkIsQ0FBQztBQWlCdkMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBR2xCLHVCQUF1QjtBQUN2QixNQUFNLE9BQU8sS0FBSztJQUNkLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxHQUFlO1FBQ3ZDLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDekQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksR0FBRyxHQUFlLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFTLEdBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQzVELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM5QztTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDOztrR0FiUSxLQUFLO3NHQUFMLEtBQUs7MkZBQUwsS0FBSztrQkFGakIsVUFBVTs7QUFvQlgsMkNBQTJDO0FBQzNDLE1BQU0sT0FBTyxvQkFBb0I7SUFxQjdCLDJDQUEyQztJQUMzQyxZQUFzQixXQUFtQixFQUFZLEVBQWMsRUFBWSxLQUF3QixFQUFTLElBQW1CLEVBQVUsaUJBQWtDLEVBQVUsa0JBQW1DO1FBQXRNLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQVksT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFZLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBZTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBaUI7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWlCO1FBckJyTixVQUFLLEdBQVMsRUFBRSxDQUFDO1FBRWQsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFrQixFQUFFLENBQUM7UUFDM0IsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFrQmxDLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFkTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBYSxFQUFFLEtBQVUsRUFBRSxLQUFhO1FBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsZ0RBQWdEO1lBQzlFLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNyRSxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsVUFBVSxNQUFXO2dCQUN0QyxRQUFRLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQVNTLGFBQWEsQ0FBQyxPQUFzQjtRQUMxQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsUUFBUSxFQUFRLElBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkYsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM3RDtJQUNMLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBWTtRQUM3QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyw0Q0FBNEM7UUFDdEYsT0FBTyxVQUFVLE1BQVcsRUFBRSxLQUFjO1lBQ3hDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDcEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUNyQixLQUFLLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RHO2FBQ0o7WUFDRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUNqQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JEO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELFFBQVE7UUFDSixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksTUFBTSxFQUFFO1lBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzlEO1NBQ0o7UUFDRCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFTLElBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDN0IsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEQ7YUFDSjtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFVLElBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQy9CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDbEMsSUFBVSxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFOzRCQUNsQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBUSxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxFQUFRLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3lCQUMzRTs2QkFBTTs0QkFDRyxJQUFJLENBQUMsS0FBTSxDQUFDLGFBQWEsQ0FBQyxHQUFTLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzt5QkFDNUQ7cUJBQ0o7eUJBQU0sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUM1QyxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7d0JBQ3RCLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUM1QyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBUSxJQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ3JELElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pDLElBQVUsSUFBSSxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTOzRCQUNsQyxJQUFJLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQVEsSUFBSSxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztxQkFDbEU7aUJBQ0o7YUFDSjtZQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckMsSUFBVSxJQUFLLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFO29CQUNyQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ3JCLElBQUksQ0FBQyxLQUFNLENBQUMsY0FBYyxDQUFDLEdBQVMsSUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUNuRTt5QkFBTTt3QkFDSCxJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUM7d0JBQ3RCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzt3QkFDOUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQVEsSUFBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM1QyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBUSxJQUFJLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUNsRTtpQkFDSjthQUNKO1NBQ0o7O1lBRUcsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQVEsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsQ0FBQztJQUNELFNBQVM7UUFDTCxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBTyxJQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDM0IsSUFBVSxJQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEtBQUssRUFBRTtvQkFDaEQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQU8sSUFBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLE9BQU8sRUFBRTt3QkFDVCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7d0JBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7NEJBQzFCLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDOUYsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3lCQUN6RTtxQkFDSjtpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBRU47YUFDSTtZQUNELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFPLElBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUU7b0JBQzFCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsV0FBZ0IsRUFBRSxFQUFFO3dCQUM1QyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDMUUsQ0FBQyxDQUFDLENBQUM7b0JBQ0csSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUN6RTthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBQ0QsZUFBZTtRQUNYLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakcsSUFBSSxXQUFXLEdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsTUFBTSxHQUFJLENBQUMsQ0FBQyxhQUFhLENBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQWM7UUFDL0IsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXdDO1FBQ2hELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNoQyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxFQUFFLENBQUMsaUJBQWlCLENBQU8sSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7WUFDOUMsS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7Z0JBQ3JCLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQyxZQUFZLEVBQUU7b0JBQ2hELE1BQU07aUJBQ1Q7Z0JBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDdEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25DLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzVFO2dCQUNELEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDekQ7WUFFSyxJQUFJLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDekU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLFNBQWMsRUFBRSxJQUFZO1FBQ3JELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFRLElBQUksQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLDBDQUEwQztRQUMxQyxJQUFJLE9BQU8sR0FBZSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsS0FBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUU7WUFDckIsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNELElBQUksQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztJQUNwQyxDQUFDOztpSEFyTlEsb0JBQW9CO3FIQUFwQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFGaEMsVUFBVTt3SUF3QitHLEtBQUs7QUFtTS9ILE1BQU0sT0FBTyxpQkFBaUI7SUFXMUIsdUJBQXVCO0lBRXZCLFlBQW1CLElBQW1CO1FBQW5CLFNBQUksR0FBSixJQUFJLENBQWU7UUFSdEMsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUlwRCxjQUFTLEdBQWtCLEVBQUUsQ0FBQztRQUsxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbEMsVUFBVSxFQUFFLEtBQUs7WUFDakIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztRQUNILHNCQUFzQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ2xCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQzdCLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFRLElBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDckQsSUFBSSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBVSxJQUFLLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUztvQkFBUSxJQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNuRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBUSxJQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7U0FDSjtJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEdBQVMsSUFBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXRGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBVSxJQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQ2hELElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUFFLFNBQVM7YUFBRTtZQUVuRCxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEQ7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXdDO1FBQ2hELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU87U0FBRTtRQUUxQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDbEMsS0FBSyxJQUFJLEdBQUcsSUFBSSxjQUFjLEVBQUU7Z0JBQzVCLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDcEMsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsQyx5QkFBeUI7b0JBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7d0JBQzlGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4RjthQUNKO1NBQ0o7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFTLElBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUMxQjtTQUNKO0lBQ0wsQ0FBQzs7OEdBMUZRLGlCQUFpQixrQkFhRCxLQUFLO2tIQWJyQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTswREFja0IsS0FBSztBQWlGbEMsTUFBTSxPQUFPLGVBQWU7SUFNeEIsWUFBbUIsWUFBb0I7UUFBcEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxrQkFBa0I7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUN0QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDL0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxxQkFBcUI7UUFDakIsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBOEIsT0FBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBZ0IsQ0FBQztRQUV0RyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUNsQixXQUFXLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEVBQUU7b0JBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQWU7d0JBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzt3QkFDbEIsTUFBTSxFQUFFLFdBQVc7cUJBQ3RCLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7UUFFRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQzs7NEdBckRRLGVBQWU7Z0hBQWYsZUFBZTsyRkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEV2ZW50RW1pdHRlciwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBTaW1wbGVDaGFuZ2UsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZiwgSXRlcmFibGVEaWZmZXJzLCBLZXlWYWx1ZURpZmZlcnMsIE9uSW5pdCxcclxuICAgIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95LCBJbmplY3RhYmxlXHJcblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IHsgQ29udGVudENoaWxkLCBUeXBlLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgbGV0IGN1cnJlbnRUZW1wbGF0ZUVsZW1lbnQ6IGFueTtcclxuXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGFyZW50VGFnIHtcclxuICAgIHRhZ3M6IEFycmF5PGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNoaWxkQ2hhbmdlIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBjaGFuZ2U6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbmdlU2V0IHtcclxuICAgIFtrZXk6IHN0cmluZ106IEFycmF5PElDaGlsZENoYW5nZT47XHJcbn1cclxuXHJcbmxldCBmaXJzdFZhbCA9IHt9O1xyXG5cclxuQEluamVjdGFibGUoKVxyXG4vKiogSW50ZXJuYWwgSGVscGVycyAqL1xyXG5leHBvcnQgY2xhc3MgVXRpbHMge1xyXG4gICAgc3RhdGljIEl0ZXJhdGVBbmRHZXRDaGFuZ2VzKG9iajogSVBhcmVudFRhZyk6IElDaGFuZ2VTZXQge1xyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZChvYmoudGFncykgfHwgb2JqLnRhZ3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmVzOiBJQ2hhbmdlU2V0ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHRhZ3MgPSBvYmoudGFnczsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRhZyA9IHRhZ3NbaV0sIHRhZ0VsZW1lbnQgPSAoPGFueT5vYmopWyd0YWdfJyArIHRhZy5yZXBsYWNlKC9cXC4vZywgJ18nKV07XHJcbiAgICAgICAgICAgIGlmICghZWouaXNOdWxsT3JVbmRlZmluZWQodGFnRWxlbWVudCkgJiYgdGFnRWxlbWVudC5oYXNDaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICByZXNbdGFnXSA9IHRhZ0VsZW1lbnQuZ2V0Q2hhbmdlc0FuZFJlc2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG5leHBvcnQgY2xhc3MgQm9sZFJlcG9ydENvbXBvbmVudHM8VywgVD4gaW1wbGVtZW50cyBJUGFyZW50VGFnLCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIERvQ2hlY2ssIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIHB1YmxpYyBtb2RlbDogVCA9IDxUPnt9O1xyXG4gICAgcHVibGljIHdpZGdldDogVztcclxuICAgIHByb3RlY3RlZCBvdXRwdXRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgaW5wdXRzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBwcm90ZWN0ZWQgdHdvd2F5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgcHJvdGVjdGVkIGNvbXBsZXhQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgcHJvdGVjdGVkIGlzRWRpdG9yOiBib29sZWFuO1xyXG5cclxuICAgIHByaXZhdGUgZmlyc3RDaGVjazogYm9vbGVhbjtcclxuICAgIGVqSXRlcmFibGU6IGFueTtcclxuICAgIGVqS2V5VmFsdWVEaWY6IGFueTtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBiaW5kQW5kUmFpc2VFdmVudChpbnN0YW5jZTogYW55LCBtb2RlbDogYW55LCBldmVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFldmVudC5zdGFydHNXaXRoKCdtb2RlbC4nKSkgey8vICYmIGluc3RhbmNlW2V2ZW50XVsnb2JzZXJ2ZXJzJ10ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBsZXQgb3JpZ2luYWxFdnQgPSBldmVudC5zdGFydHNXaXRoKCdib2xkJykgPyBldmVudC5zdWJzdHIoNCkgOiBldmVudDtcclxuICAgICAgICAgICAgbW9kZWxbb3JpZ2luYWxFdnRdID0gZnVuY3Rpb24gKHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtldmVudCArICdfb3V0cHV0J11bJ2VtaXQnXShwYXJhbXMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sTmFtZTogc3RyaW5nLCBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyB0YWdzOiBBcnJheTxzdHJpbmc+LCBwcml2YXRlIGVqSXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsIHByaXZhdGUgX2VqS2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMpIHtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5fX3NoYWRvdyA9IHRoaXMuZG9tLmdldFNoYWRvd1Jvb3QodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB0aGlzLmZpcnN0Q2hlY2sgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWpJdGVyYWJsZSA9IHRoaXMuZWpJdGVyYWJsZURpZmZlcnMuZmluZChbXSkuY3JlYXRlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZWpLZXlWYWx1ZURpZiA9IF9laktleVZhbHVlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlVHdvd2F5cyh0d293YXlzOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgaWYgKCF0d293YXlzKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWw7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0d293YXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdHdvd2F5c1tpXS5yZXBsYWNlKC9cXF8vZywgJy4nKTtcclxuICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQgKyAnQ2hhbmdlJywgKDxhbnk+dGhpcylbdHdvd2F5c1tpXSArICdfdHdvQ2hhbmdlJ10sIG1vZGVsKTtcclxuICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGVsZW1lbnQsIHRoaXMuYWRkVHdvd2F5cyhlbGVtZW50KSwgbW9kZWwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkVHdvd2F5cyhwcm9wOiBzdHJpbmcpOiBGdW5jdGlvbiB7XHJcbiAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbCwgdmFsdWUgPSBmaXJzdFZhbDsgLy8gLCBvcmlnaW5hbFByb3AgPSBwcm9wLnJlcGxhY2UoLy0vZywgJy4nKTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5ld1ZhbDogYW55LCBpc0FwcDogYm9vbGVhbikge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGZpcnN0VmFsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVqLmdldE9iamVjdChwcm9wICsgJ190d28nLCBtb2RlbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWouZ2V0T2JqZWN0KHByb3AsIHRoaXMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRlZmF1bHRzID09PSB1bmRlZmluZWQgPyB7fSA6IHRoaXMuZGVmYXVsdHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChuZXdWYWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbmV3VmFsKSB7IHJldHVybjsgfVxyXG4gICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbDtcclxuICAgICAgICAgICAgaWYgKCFpc0FwcCkge1xyXG4gICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KHByb3AgKyAnX3R3bycsIG5ld1ZhbCwgbW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgZWouZ2V0T2JqZWN0KHByb3AgKyAnQ2hhbmdlJywgbW9kZWwpLmVtaXQobmV3VmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcykge1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19pbnB1dCcpICE9IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dHMucHVzaChrZXkpO1xyXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19vdXRwdXQnKSAhPSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0cy5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX3R3bycpICE9IC0xICYmIGtleS5pbmRleE9mKCdfdHdvQ2hhbmdlJykgPT0gLTEpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnR3b3dheXMucHVzaChrZXkucmVwbGFjZSgnX3R3bycsICcnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCgoPGFueT50aGlzKVsnb3B0aW9ucyddKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVR3b3dheXModGhpcy50d293YXlzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgICAgIHRoaXMuZmlyc3RDaGVjayA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLm1vZGVsLCBldmVudHMgPSB0aGlzLm91dHB1dHM7XHJcbiAgICAgICAgaWYgKGV2ZW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50ID0gZXZlbnRzW2ldLnJlcGxhY2UoJ19vdXRwdXQnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBCb2xkUmVwb3J0Q29tcG9uZW50cy5iaW5kQW5kUmFpc2VFdmVudCh0aGlzLCBtb2RlbCwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlai5pc051bGxPclVuZGVmaW5lZCgoPGFueT50aGlzKVsnb3B0aW9ucyddKSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLnRhZ3NbaV0sIGl0ZW0gPSAoPGFueT50aGlzKVsndGFnXycgKyBlbGVtZW50LnJlcGxhY2UoL1xcLi9nLCAnXycpXTtcclxuICAgICAgICAgICAgICAgIGlmICghZWouaXNOdWxsT3JVbmRlZmluZWQoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3QoZWxlbWVudCwgaXRlbS5nZXRMaXN0KCksIHRoaXMubW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHkgPSB0aGlzLmlucHV0c1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCBtb2RlbFByb3BlcnR5ID0gdGhpcy5pbnB1dHNbaV0ucmVwbGFjZSgnX2lucHV0JywgJycpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnR5XSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvcGVydHkuaW5kZXhPZignXycpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzLm1vZGVsKVttb2RlbFByb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgKDxhbnk+dGhpcy5tb2RlbClbbW9kZWxQcm9wZXJ0eV0sICg8YW55PnRoaXMpW3Byb3BlcnR5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLm1vZGVsKVttb2RlbFByb3BlcnR5XSA9ICg8YW55PnRoaXMpW3Byb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWxQcm9wZXJ0eS5pbmRleE9mKCdfdHdvJykgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBPYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gbW9kZWxQcm9wZXJ0eS5yZXBsYWNlKC9cXF8vZywgJy4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWouY3JlYXRlT2JqZWN0KGtleSwgKDxhbnk+dGhpcylbcHJvcGVydHldLCB0ZW1wT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvb3RQcm9wID0ga2V5LnNwbGl0KCcuJylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzLm1vZGVsKVtyb290UHJvcF0gPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5tb2RlbClbcm9vdFByb3BdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsICg8YW55PnRoaXMubW9kZWwpW3Jvb3RQcm9wXSwgdGVtcE9ialtyb290UHJvcF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHdvd2F5cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHR3b3dheSA9IHRoaXMudHdvd2F5c1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCB0d293YXlQcm9wZXJ0eSA9IHR3b3dheSArICdfdHdvJztcclxuICAgICAgICAgICAgICAgIGlmICgoPGFueT50aGlzKVt0d293YXlQcm9wZXJ0eV0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0d293YXkuaW5kZXhPZignXycpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMubW9kZWwpW3R3b3dheVByb3BlcnR5XSA9ICg8YW55PnRoaXMpW3R3b3dheVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcE9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0d293YXkucmVwbGFjZSgvXFxfL2csICcuJykgKyAnX3R3byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChrZXksICg8YW55PnRoaXMpW3R3b3dheVByb3BlcnR5XSwgdGVtcE9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb290UHJvcCA9IHR3b3dheVByb3BlcnR5LnNwbGl0KCdfJylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsICg8YW55PnRoaXMubW9kZWwpW3Jvb3RQcm9wXSwgdGVtcE9ialtyb290UHJvcF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBqUXVlcnkuZXh0ZW5kKHRoaXMubW9kZWwsICg8YW55PnRoaXMpWydvcHRpb25zJ10pO1xyXG5cclxuICAgIH1cclxuICAgIG5nRG9DaGVjaygpIHtcclxuICAgICAgICBpZiAoZWouaXNOdWxsT3JVbmRlZmluZWQoKDxhbnk+dGhpcylbJ29wdGlvbnMnXSkpIHtcclxuICAgICAgICAgICAgdGhpcy50d293YXlzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKDxhbnk+dGhpcylbZWxlbWVudCArICdfdHdvJ10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5lakl0ZXJhYmxlLmRpZmYoKDxhbnk+dGhpcylbZWxlbWVudCArICdfdHdvJ10pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZ0NoYW5nZXMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud2lkZ2V0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdDaGFuZ2VzID0gdGhpcy5nZXRUd293YXlDaGFuZ2VzKGNoYW5nZXMuY29sbGVjdGlvbiwgbmdDaGFuZ2VzLCBlbGVtZW50LnJlcGxhY2UoL1xcXy9nLCAnLicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChlbGVtZW50LnJlcGxhY2UoL1xcXy9nLCAnLicpICsgJy50d28nLCBjaGFuZ2VzLmNvbGxlY3Rpb24sIG5nQ2hhbmdlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLndpZGdldClbJ3NldE1vZGVsJ10obmdDaGFuZ2VzLCAkLmlzUGxhaW5PYmplY3QobmdDaGFuZ2VzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5laktleVZhbHVlRGlmLmRpZmYoKDxhbnk+dGhpcylbJ29wdGlvbnMnXSk7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53aWRnZXQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5nY2hhbmdlcyA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKChjaGFuZ2VkcHJvcDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVqLmNyZWF0ZU9iamVjdChjaGFuZ2VkcHJvcC5rZXksIGNoYW5nZWRwcm9wLmN1cnJlbnRWYWx1ZSwgbmdjaGFuZ2VzKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLndpZGdldClbJ3NldE1vZGVsJ10obmdjaGFuZ2VzLCAkLmlzUGxhaW5PYmplY3QobmdjaGFuZ2VzKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgbGV0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLmlzRWRpdG9yID8gJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pIDogJCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIGxldCBjb250cm9sTmFtZTogc3RyaW5nID0gdGhpcy5sb3dlckNhc2VGaXJzdExldHRlcih0aGlzLmNvbnRyb2xOYW1lKTtcclxuICAgICAgICB0aGlzLndpZGdldCA9ICgkKG5hdGl2ZUVsZW1lbnQpIGFzIGFueSlbY29udHJvbE5hbWVdKHRoaXMubW9kZWwpW2NvbnRyb2xOYW1lXSgnaW5zdGFuY2UnKTtcclxuICAgIH1cclxuXHJcbiAgICBsb3dlckNhc2VGaXJzdExldHRlcihzdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBzdHJpbmdbMF0udG9Mb3dlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RDaGVjaykgeyByZXR1cm47IH1cclxuICAgICAgICBsZXQgbmdDaGFuZ2VzID0ge307XHJcbiAgICAgICAgaWYgKGVqLmlzTnVsbE9yVW5kZWZpbmVkKCg8YW55PnRoaXMpWydvcHRpb25zJ10pKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBjaGFuZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGNoYW5nZXNba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnByZXZpb3VzVmFsdWUgPT09IGVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2lucHV0JywgJycpLnJlcGxhY2UoL1xcXy9nLCAnLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnLnR3bycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9LZXkgPSBrZXkucmVwbGFjZSgnLnR3bycsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICBuZ0NoYW5nZXMgPSB0aGlzLmdldFR3b3dheUNoYW5nZXMoZWxlbWVudC5jdXJyZW50VmFsdWUsIG5nQ2hhbmdlcywgb0tleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlai5jcmVhdGVPYmplY3Qoa2V5LCBlbGVtZW50LmN1cnJlbnRWYWx1ZSwgbmdDaGFuZ2VzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKDxhbnk+dGhpcy53aWRnZXQpWydzZXRNb2RlbCddKG5nQ2hhbmdlcywgJC5pc1BsYWluT2JqZWN0KG5nQ2hhbmdlcykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUd293YXlDaGFuZ2VzKHZhbHVlOiBhbnksIG5nQ2hhbmdlczogYW55LCBwcm9wOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdmFsRm4gPSBlai5nZXRPYmplY3QocHJvcCwgKDxhbnk+dGhpcy53aWRnZX