/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, IterableDiffers, Output } from '@angular/core'; import { BasicList } from './basic-list'; /** @type {?} */ var nextId = 0; export class DualListComponent { /** * @param {?} differs */ constructor(differs) { this.differs = differs; this.id = `dual-list-${nextId++}`; this.key = '_id'; this.display = '_name'; this.height = '100px'; this.filter = false; this.format = DualListComponent.DEFAULT_FORMAT; this.sort = false; this.disabled = false; this.destinationChange = new EventEmitter(); this.sorter = (/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => { return (a._name < b._name) ? -1 : ((a._name > b._name) ? 1 : 0); }); this.available = new BasicList(DualListComponent.AVAILABLE_LIST_NAME); this.confirmed = new BasicList(DualListComponent.CONFIRMED_LIST_NAME); } /** * @param {?} changeRecord * @return {?} */ ngOnChanges(changeRecord) { if (changeRecord['filter']) { if (changeRecord['filter'].currentValue === false) { this.clearFilter(this.available); this.clearFilter(this.confirmed); } } if (changeRecord['sort']) { if (changeRecord['sort'].currentValue === true && this.compare === undefined) { this.compare = this.sorter; } else if (changeRecord['sort'].currentValue === false) { this.compare = undefined; } } if (changeRecord['format']) { this.format = changeRecord['format'].currentValue; if (typeof (this.format.direction) === 'undefined') { this.format.direction = DualListComponent.LTR; } if (typeof (this.format.add) === 'undefined') { this.format.add = DualListComponent.DEFAULT_FORMAT.add; } if (typeof (this.format.remove) === 'undefined') { this.format.remove = DualListComponent.DEFAULT_FORMAT.remove; } if (typeof (this.format.all) === 'undefined') { this.format.all = DualListComponent.DEFAULT_FORMAT.all; } if (typeof (this.format.none) === 'undefined') { this.format.none = DualListComponent.DEFAULT_FORMAT.none; } if (typeof (this.format.draggable) === 'undefined') { this.format.draggable = DualListComponent.DEFAULT_FORMAT.draggable; } } if (changeRecord['source']) { this.available = new BasicList(DualListComponent.AVAILABLE_LIST_NAME); this.updatedSource(); this.updatedDestination(); } if (changeRecord['destination']) { this.confirmed = new BasicList(DualListComponent.CONFIRMED_LIST_NAME); this.updatedDestination(); this.updatedSource(); } } /** * @return {?} */ ngDoCheck() { if (this.source && this.buildAvailable(this.source)) { this.onFilter(this.available); } if (this.destination && this.buildConfirmed(this.destination)) { this.onFilter(this.confirmed); } } /** * @param {?} source * @return {?} */ buildAvailable(source) { /** @type {?} */ const sourceChanges = this.sourceDiffer.diff(source); if (sourceChanges) { sourceChanges.forEachRemovedItem((/** * @param {?} r * @return {?} */ (r) => { /** @type {?} */ const idx = this.findItemIndex(this.available.list, r.item, this.key); if (idx !== -1) { this.available.list.splice(idx, 1); } })); sourceChanges.forEachAddedItem((/** * @param {?} r * @return {?} */ (r) => { // Do not add duplicates even if source has duplicates. if (this.findItemIndex(this.available.list, r.item, this.key) === -1) { this.available.list.push({ _id: this.makeId(r.item), _name: this.makeName(r.item) }); } })); if (this.compare !== undefined) { this.available.list.sort(this.compare); } this.available.sift = this.available.list; return true; } return false; } /** * @param {?} destination * @return {?} */ buildConfirmed(destination) { /** @type {?} */ let moved = false; /** @type {?} */ const destChanges = this.destinationDiffer.diff(destination); if (destChanges) { destChanges.forEachRemovedItem((/** * @param {?} r * @return {?} */ (r) => { /** @type {?} */ const idx = this.findItemIndex(this.confirmed.list, r.item, this.key); if (idx !== -1) { if (!this.isItemSelected(this.confirmed.pick, this.confirmed.list[idx])) { this.selectItem(this.confirmed.pick, this.confirmed.list[idx]); } this.moveItem(this.confirmed, this.available, this.confirmed.list[idx], false); moved = true; } })); destChanges.forEachAddedItem((/** * @param {?} r * @return {?} */ (r) => { /** @type {?} */ const idx = this.findItemIndex(this.available.list, r.item, this.key); if (idx !== -1) { if (!this.isItemSelected(this.available.pick, this.available.list[idx])) { this.selectItem(this.available.pick, this.available.list[idx]); } this.moveItem(this.available, this.confirmed, this.available.list[idx], false); moved = true; } })); if (this.compare !== undefined) { this.confirmed.list.sort(this.compare); } this.confirmed.sift = this.confirmed.list; if (moved) { this.trueUp(); } return true; } return false; } /** * @return {?} */ updatedSource() { this.available.list.length = 0; this.available.pick.length = 0; if (this.source !== undefined) { this.sourceDiffer = this.differs.find(this.source).create(null); } } /** * @return {?} */ updatedDestination() { if (this.destination !== undefined) { this.destinationDiffer = this.differs.find(this.destination).create(null); } } /** * @return {?} */ direction() { return this.format.direction === DualListComponent.LTR; } /** * @param {?=} list * @return {?} */ dragEnd(list = null) { if (list) { list.dragStart = false; } else { this.available.dragStart = false; this.confirmed.dragStart = false; } return false; } /** * @param {?} event * @param {?} item * @param {?} list * @return {?} */ drag(event, item, list) { if (!this.isItemSelected(list.pick, item)) { this.selectItem(list.pick, item); } list.dragStart = true; // Set a custom type to be this dual-list's id. event.dataTransfer.setData(this.id, item['_id']); } /** * @param {?} event * @param {?} list * @return {?} */ allowDrop(event, list) { if (event.dataTransfer.types.length && (event.dataTransfer.types[0] === this.id)) { event.preventDefault(); if (!list.dragStart) { list.dragOver = true; } } return false; } /** * @return {?} */ dragLeave() { this.available.dragOver = false; this.confirmed.dragOver = false; } /** * @param {?} event * @param {?} list * @return {?} */ drop(event, list) { if (event.dataTransfer.types.length && (event.dataTransfer.types[0] === this.id)) { event.preventDefault(); this.dragLeave(); this.dragEnd(); if (list === this.available) { this.moveItem(this.available, this.confirmed); } else { this.moveItem(this.confirmed, this.available); } } } /** * @private * @return {?} */ trueUp() { /** @type {?} */ let changed = false; // Clear removed items. /** @type {?} */ let pos = this.destination.length; while ((pos -= 1) >= 0) { /** @type {?} */ const mv = this.confirmed.list.filter((/** * @param {?} conf * @return {?} */ conf => { if (typeof this.destination[pos] === 'object') { return conf._id === this.destination[pos][this.key]; } else { return conf._id === this.destination[pos]; } })); if (mv.length === 0) { // Not found so remove. this.destination.splice(pos, 1); changed = true; } } // Push added items. for (let i = 0, len = this.confirmed.list.length; i < len; i += 1) { /** @type {?} */ let mv = this.destination.filter((/** * @param {?} d * @return {?} */ (d) => { if (typeof d === 'object') { return (d[this.key] === this.confirmed.list[i]._id); } else { return (d === this.confirmed.list[i]._id); } })); if (mv.length === 0) { // Not found so add. mv = this.source.filter((/** * @param {?} o * @return {?} */ (o) => { if (typeof o === 'object') { return (o[this.key] === this.confirmed.list[i]._id); } else { return (o === this.confirmed.list[i]._id); } })); if (mv.length > 0) { this.destination.push(mv[0]); changed = true; } } } if (changed) { this.destinationChange.emit(this.destination); } } /** * @param {?} list * @param {?} item * @param {?=} key * @return {?} */ findItemIndex(list, item, key = '_id') { /** @type {?} */ let idx = -1; /** * @param {?} e * @return {?} */ function matchObject(e) { if (e._id === item[key]) { idx = list.indexOf(e); return true; } return false; } /** * @param {?} e * @return {?} */ function match(e) { if (e._id === item) { idx = list.indexOf(e); return true; } return false; } // Assumption is that the arrays do not have duplicates. if (typeof item === 'object') { list.filter(matchObject); } else { list.filter(match); } return idx; } /** * @private * @param {?} source * @param {?} item * @return {?} */ makeUnavailable(source, item) { /** @type {?} */ const idx = source.list.indexOf(item); if (idx !== -1) { source.list.splice(idx, 1); } } /** * @param {?} source * @param {?} target * @param {?=} item * @param {?=} trueup * @return {?} */ moveItem(source, target, item = null, trueup = true) { /** @type {?} */ let i = 0; /** @type {?} */ let len = source.pick.length; if (item) { i = source.list.indexOf(item); len = i + 1; } for (; i < len; i += 1) { // Is the pick still in list? /** @type {?} */ let mv = []; if (item) { /** @type {?} */ const idx = this.findItemIndex(source.pick, item); if (idx !== -1) { mv[0] = source.pick[idx]; } } else { mv = source.list.filter((/** * @param {?} src * @return {?} */ src => { return (src._id === source.pick[i]._id); })); } // Should only ever be 1 if (mv.length === 1) { // Add if not already in target. if (target.list.filter((/** * @param {?} trg * @return {?} */ trg => trg._id === mv[0]._id)).length === 0) { target.list.push(mv[0]); } this.makeUnavailable(source, mv[0]); } } if (this.compare !== undefined) { target.list.sort(this.compare); } source.pick.length = 0; // Update destination if (trueup) { this.trueUp(); } // Delay ever-so-slightly to prevent race condition. setTimeout((/** * @return {?} */ () => { this.onFilter(source); this.onFilter(target); }), 10); } /** * @param {?} list * @param {?} item * @return {?} */ isItemSelected(list, item) { if (list.filter((/** * @param {?} e * @return {?} */ e => Object.is(e, item))).length > 0) { return true; } return false; } /** * @param {?} event * @param {?} index * @param {?} source * @param {?} item * @return {?} */ shiftClick(event, index, source, item) { if (event.shiftKey && source.last && !Object.is(item, source.last)) { /** @type {?} */ const idx = source.sift.indexOf(source.last); if (index > idx) { for (let i = (idx + 1); i < index; i += 1) { this.selectItem(source.pick, source.sift[i]); } } else if (idx !== -1) { for (let i = (index + 1); i < idx; i += 1) { this.selectItem(source.pick, source.sift[i]); } } } source.last = item; } /** * @param {?} list * @param {?} item * @return {?} */ selectItem(list, item) { /** @type {?} */ const pk = list.filter((/** * @param {?} e * @return {?} */ (e) => { return Object.is(e, item); })); if (pk.length > 0) { // Already in list, so deselect. for (let i = 0, len = pk.length; i < len; i += 1) { /** @type {?} */ const idx = list.indexOf(pk[i]); if (idx !== -1) { list.splice(idx, 1); } } } else { list.push(item); } } /** * @param {?} source * @return {?} */ selectAll(source) { source.pick.length = 0; source.pick = source.sift.slice(0); } /** * @param {?} source * @return {?} */ selectNone(source) { source.pick.length = 0; } /** * @param {?} source * @return {?} */ isAllSelected(source) { if (source.list.length === 0 || source.list.length === source.pick.length) { return true; } return false; } /** * @param {?} source * @return {?} */ isAnySelected(source) { if (source.pick.length > 0) { return true; } return false; } /** * @private * @param {?} source * @return {?} */ unpick(source) { for (let i = source.pick.length - 1; i >= 0; i -= 1) { if (source.sift.indexOf(source.pick[i]) === -1) { source.pick.splice(i, 1); } } } /** * @param {?} source * @return {?} */ clearFilter(source) { if (source) { source.picker = ''; this.onFilter(source); } } /** * @param {?} source * @return {?} */ onFilter(source) { if (source.picker.length > 0) { try { /** @type {?} */ const filtered = source.list.filter((/** * @param {?} item * @return {?} */ (item) => { if (Object.prototype.toString.call(item) === '[object Object]') { if (item._name !== undefined) { // @ts-ignore: remove when d.ts has locale as an argument. return item._name.toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1; } else { // @ts-ignore: remove when d.ts has locale as an argument. return JSON.stringify(item).toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1; } } else { // @ts-ignore: remove when d.ts has locale as an argument. return item.toLocaleLowerCase(this.format.locale).indexOf(source.picker.toLocaleLowerCase(this.format.locale)) !== -1; } })); source.sift = filtered; this.unpick(source); } catch (e) { if (e instanceof RangeError) { this.format.locale = undefined; } source.sift = source.list; } } else { source.sift = source.list; } } /** * @private * @param {?} item * @return {?} */ makeId(item) { if (typeof item === 'object') { return item[this.key]; } else { return item; } } // Allow for complex names by passing an array of strings. // Example: [display]="[ '_type.substring(0,1)', '_name' ]" /** * @protected * @param {?} item * @param {?=} separator * @return {?} */ makeName(item, separator = '_') { /** @type {?} */ const display = this.display; /** * @param {?} itm * @return {?} */ function fallback(itm) { switch (Object.prototype.toString.call(itm)) { case '[object Number]': return itm; case '[object String]': return itm; default: if (itm !== undefined) { return itm[display]; } else { return 'undefined'; } } } /** @type {?} */ let str = ''; if (this.display !== undefined) { switch (Object.prototype.toString.call(this.display)) { case '[object Function]': str = this.display(item); break; case '[object Array]': for (let i = 0, len = this.display.length; i < len; i += 1) { if (str.length > 0) { str = str + separator; } if (this.display[i].indexOf('.') === -1) { // Simple, just add to string. str = str + item[this.display[i]]; } else { // Complex, some action needs to be performed /** @type {?} */ const parts = this.display[i].split('.'); /** @type {?} */ const s = item[parts[0]]; if (s) { // Use brute force if (parts[1].indexOf('substring') !== -1) { /** @type {?} */ const nums = (parts[1].substring(parts[1].indexOf('(') + 1, parts[1].indexOf(')'))).split(','); switch (nums.length) { case 1: str = str + s.substring(parseInt(nums[0], 10)); break; case 2: str = str + s.substring(parseInt(nums[0], 10), parseInt(nums[1], 10)); break; default: str = str + s; break; } } else { // method not approved, so just add s. str = str + s; } } } } break; default: str = fallback(item); break; } } else { str = fallback(item); } return str; } } DualListComponent.AVAILABLE_LIST_NAME = 'available'; DualListComponent.CONFIRMED_LIST_NAME = 'confirmed'; DualListComponent.LTR = 'left-to-right'; DualListComponent.RTL = 'right-to-left'; DualListComponent.DEFAULT_FORMAT = { add: 'Add', remove: 'Remove', all: 'All', none: 'None', direction: DualListComponent.LTR, draggable: true, locale: undefined }; DualListComponent.decorators = [ { type: Component, args: [{ selector: 'dual-list', template: "
\n\t
\n\t\t\n\n\t\t
\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
    \n\t\t\t\t
  • \n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t
\n\n\t
\n\t\t\n\n\t\t
\n\t\t\t\n\t\t
\n\n\t\t
\n\t\t\t
    \n\t\t\t\t
  • \n\t\t\t
\n\t\t
\n\n\t\t
\n\t\t\t\n\t\t\t\n\t\t
\n\t
\n
\n", styles: ["div.record-picker{overflow-x:hidden;overflow-y:auto;border:1px solid #ddd;border-radius:8px;position:relative;cursor:pointer;scrollbar-base-color:#337ab7;scrollbar-3dlight-color:#337ab7;scrollbar-highlight-color:#337ab7;scrollbar-track-color:#eee;scrollbar-arrow-color:gray;scrollbar-shadow-color:gray;scrollbar-dark-shadow-color:gray}div.record-picker::-webkit-scrollbar{width:12px}div.record-picker::-webkit-scrollbar-button{width:0;height:0}div.record-picker::-webkit-scrollbar-track{background:#eee;box-shadow:0 0 3px #dfdfdf inset;border-top-right-radius:8px;border-bottom-right-radius:8px}div.record-picker::-webkit-scrollbar-thumb{background:#337ab7;border:thin solid gray;border-top-right-radius:8px;border-bottom-right-radius:8px}div.record-picker::-webkit-scrollbar-thumb:hover{background:#286090}.record-picker ul{margin:0;padding:0 0 1px}.record-picker li{border-top:thin solid #ddd;border-bottom:1px solid #ddd;display:block;padding:2px 2px 2px 10px;margin-bottom:-1px;font-size:.85em;cursor:pointer;white-space:nowrap;min-height:16px}.record-picker li:hover{background-color:#f5f5f5}.record-picker li.selected{background-color:#d9edf7}.record-picker li.selected:hover{background-color:#c4e3f3}.record-picker li.disabled{opacity:.5;cursor:default;background-color:inherit}.record-picker li:first-child{border-top-left-radius:8px;border-top-right-radius:8px;border-top:none}.record-picker li:last-child{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-bottom:none}.record-picker label{cursor:pointer;font-weight:inherit;font-size:14px;padding:4px;margin-bottom:-1px;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.record-picker ul.over{background-color:#d3d3d3}.dual-list{display:flex;flex-direction:row;align-content:flex-start}.dual-list .listbox{width:50%;margin:0}.dual-list .button-bar{margin-top:8px}.point-right::after{content:\"\\25B6\";padding-left:1em}.point-left::before{content:\"\\25C0\";padding-right:1em}.dual-list .button-bar button{width:47%}button.btn-block{display:block;width:100%;margin-bottom:8px}.filter{margin-bottom:-2.2em}.filter::after{content:\"o\";width:40px;color:transparent;font-size:2em;background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:center center;opacity:.2;top:-36px;left:calc(100% - 21px);position:relative}"] }] } ]; /** @nocollapse */ DualListComponent.ctorParameters = () => [ { type: IterableDiffers } ]; DualListComponent.propDecorators = { id: [{ type: Input }], key: [{ type: Input }], display: [{ type: Input }], height: [{ type: Input }], filter: [{ type: Input }], format: [{ type: Input }], sort: [{ type: Input }], compare: [{ type: Input }], disabled: [{ type: Input }], source: [{ type: Input }], destination: [{ type: Input }], destinationChange: [{ type: Output }] }; if (false) { /** @type {?} */ DualListComponent.AVAILABLE_LIST_NAME; /** @type {?} */ DualListComponent.CONFIRMED_LIST_NAME; /** @type {?} */ DualListComponent.LTR; /** @type {?} */ DualListComponent.RTL; /** @type {?} */ DualListComponent.DEFAULT_FORMAT; /** @type {?} */ DualListComponent.prototype.id; /** @type {?} */ DualListComponent.prototype.key; /** @type {?} */ DualListComponent.prototype.display; /** @type {?} */ DualListComponent.prototype.height; /** @type {?} */ DualListComponent.prototype.filter; /** @type {?} */ DualListComponent.prototype.format; /** @type {?} */ DualListComponent.prototype.sort; /** @type {?} */ DualListComponent.prototype.compare; /** @type {?} */ DualListComponent.prototype.disabled; /** @type {?} */ DualListComponent.prototype.source; /** @type {?} */ DualListComponent.prototype.destination; /** @type {?} */ DualListComponent.prototype.destinationChange; /** @type {?} */ DualListComponent.prototype.available; /** @type {?} */ DualListComponent.prototype.confirmed; /** @type {?} */ DualListComponent.prototype.sourceDiffer; /** @type {?} */ DualListComponent.prototype.destinationDiffer; /** * @type {?} * @private */ DualListComponent.prototype.sorter; /** * @type {?} * @private */ DualListComponent.prototype.differs; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItZHVhbC1saXN0Ym94LyIsInNvdXJjZXMiOlsibGliL2R1YWwtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVcsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQ2hFLE1BQU0sRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7SUFJckMsTUFBTSxHQUFHLENBQUM7QUFRZCxNQUFNLE9BQU8saUJBQWlCOzs7O0lBc0M3QixZQUFvQixPQUF3QjtRQUF4QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQXJCbkMsT0FBRSxHQUFHLGFBQWEsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUM3QixRQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ1osWUFBTyxHQUFRLE9BQU8sQ0FBQztRQUN2QixXQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixXQUFNLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDO1FBQzFDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFFYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2hCLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFRekMsV0FBTTs7Ozs7UUFBRyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQztRQUd6RyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLFlBQTJDO1FBQ3RELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNqQztTQUNEO1FBRUQsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekIsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDN0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQzNCO2lCQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2FBQ3pCO1NBQ0Q7UUFFRCxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFFbEQsSUFBSSxPQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxXQUFXLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQzthQUM5QztZQUVELElBQUksT0FBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssV0FBVyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO2FBQ3ZEO1lBRUQsSUFBSSxPQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7YUFDN0Q7WUFFRCxJQUFJLE9BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQzthQUN2RDtZQUVELElBQUksT0FBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxFQUFFO2dCQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2FBQ3pEO1lBRUQsSUFBSSxPQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxXQUFXLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7YUFDbkU7U0FDRDtRQUVELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDMUI7UUFFRCxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3JCO0lBQ0YsQ0FBQzs7OztJQUVELFNBQVM7UUFDUixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDOUI7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDOUI7SUFDRixDQUFDOzs7OztJQUVELGNBQWMsQ0FBQyxNQUFrQjs7Y0FDMUIsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLGFBQWEsRUFBRTtZQUNsQixhQUFhLENBQUMsa0JBQWtCOzs7O1lBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTs7c0JBQ3JDLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDckUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDbkM7WUFDRixDQUFDLEVBQUMsQ0FBQztZQUVILGFBQWEsQ0FBQyxnQkFBZ0I7Ozs7WUFBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUN6Qyx1REFBdUQ7Z0JBQ3ZELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3RGO1lBQ0YsQ0FBQyxFQUFDLENBQUM7WUFFSCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFFMUMsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQzs7Ozs7SUFFRCxjQUFjLENBQUMsV0FBdUI7O1lBQ2pDLEtBQUssR0FBRyxLQUFLOztjQUNYLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM1RCxJQUFJLFdBQVcsRUFBRTtZQUNoQixXQUFXLENBQUMsa0JBQWtCOzs7O1lBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTs7c0JBQ25DLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDckUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUMvRDtvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDL0UsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDYjtZQUNGLENBQUMsRUFBQyxDQUFDO1lBRUgsV0FBVyxDQUFDLGdCQUFnQjs7OztZQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7O3NCQUNqQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ3JFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDL0Q7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQy9FLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2I7WUFDRixDQUFDLEVBQUMsQ0FBQztZQUVILElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUUxQyxJQUFJLEtBQUssRUFBRTtnQkFDVixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDZDtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7Ozs7SUFFRCxhQUFhO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hFO0lBQ0YsQ0FBQzs7OztJQUVELGtCQUFrQjtRQUNqQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFFO0lBQ0YsQ0FBQzs7OztJQUVELFNBQVM7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztJQUN4RCxDQUFDOzs7OztJQUVELE9BQU8sQ0FBQyxPQUFrQixJQUFJO1FBQzdCLElBQUksSUFBSSxFQUFFO1lBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDdkI7YUFBTTtZQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDakM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7Ozs7Ozs7SUFFRCxJQUFJLENBQUMsS0FBZ0IsRUFBRSxJQUFTLEVBQUUsSUFBZTtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLCtDQUErQztRQUMvQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7OztJQUVELFNBQVMsQ0FBQyxLQUFnQixFQUFFLElBQWU7UUFDMUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDakYsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNyQjtTQUNEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDOzs7O0lBRUQsU0FBUztRQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQzs7Ozs7O0lBRUQsSUFBSSxDQUFDLEtBQWdCLEVBQUUsSUFBZTtRQUNyQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNqRixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVmLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM5QztTQUNEO0lBQ0YsQ0FBQzs7Ozs7SUFFTyxNQUFNOztZQUNULE9BQU8sR0FBRyxLQUFLOzs7WUFHZixHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFOztrQkFDakIsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU07Ozs7WUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFO29CQUM5QyxPQUFPLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BEO3FCQUFNO29CQUNOLE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMxQztZQUNGLENBQUMsRUFBQztZQUNGLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLHVCQUF1QjtnQkFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7U0FDRDtRQUVELG9CQUFvQjtRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTs7Z0JBQzlELEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07Ozs7WUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUM1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtvQkFDMUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BEO3FCQUFNO29CQUNOLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzFDO1lBQ0YsQ0FBQyxFQUFDO1lBRUYsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDcEIsb0JBQW9CO2dCQUNwQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNOzs7O2dCQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQ25DLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO3dCQUMxQixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDcEQ7eUJBQU07d0JBQ04sT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDMUM7Z0JBQ0YsQ0FBQyxFQUFDLENBQUM7Z0JBRUgsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdCLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ2Y7YUFDRDtTQUNEO1FBRUQsSUFBSSxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QztJQUNGLENBQUM7Ozs7Ozs7SUFFRCxhQUFhLENBQUMsSUFBZ0IsRUFBRSxJQUFTLEVBQUUsTUFBVyxLQUFLOztZQUN0RCxHQUFHLEdBQUcsQ0FBQyxDQUFDOzs7OztRQUVaLFNBQVMsV0FBVyxDQUFDLENBQU07WUFDMUIsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDeEIsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDO2FBQ1o7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7Ozs7O1FBRUQsU0FBUyxLQUFLLENBQUMsQ0FBTTtZQUNwQixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7YUFDWjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25CO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDOzs7Ozs7O0lBRU8sZUFBZSxDQUFDLE1BQWlCLEVBQUUsSUFBUzs7Y0FDN0MsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMzQjtJQUNGLENBQUM7Ozs7Ozs7O0lBRUQsUUFBUSxDQUFDLE1BQWlCLEVBQUUsTUFBaUIsRUFBRSxPQUFZLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSTs7WUFDekUsQ0FBQyxHQUFHLENBQUM7O1lBQ0wsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTTtRQUU1QixJQUFJLElBQUksRUFBRTtZQUNULENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNaO1FBRUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7OztnQkFFbkIsRUFBRSxHQUFlLEVBQUU7WUFDdkIsSUFBSSxJQUFJLEVBQUU7O3NCQUNILEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUNqRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDZixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDekI7YUFDRDtpQkFBTTtnQkFDTixFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNOzs7O2dCQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDLEVBQUMsQ0FBQzthQUNIO1lBRUQsd0JBQXdCO1lBQ3hCLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLGdDQUFnQztnQkFDaEMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU07Ozs7Z0JBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQztpQkFDMUI7Z0JBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEM7U0FDRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQy9CO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRXZCLHFCQUFxQjtRQUNyQixJQUFJLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNkO1FBRUQsb0RBQW9EO1FBQ3BELFVBQVU7OztRQUFFLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7O0lBRUQsY0FBYyxDQUFDLElBQWdCLEVBQUUsSUFBUztRQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQzs7Ozs7Ozs7SUFFRCxVQUFVLENBQUMsS0FBaUIsRUFBRSxLQUFhLEVBQUUsTUFBaUIsRUFBRSxJQUFTO1FBQ3hFLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFOztrQkFDN0QsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDNUMsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0M7YUFDRDtpQkFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUc7b0JBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2FBQ0Q7U0FDRDtRQUNELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7Ozs7OztJQUVELFVBQVUsQ0FBQyxJQUFnQixFQUFFLElBQVM7O2NBQy9CLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTTs7OztRQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDLEVBQUM7UUFDRixJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLGdDQUFnQztZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7O3NCQUMzQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNwQjthQUNEO1NBQ0Q7YUFBTTtZQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEI7SUFDRixDQUFDOzs7OztJQUVELFNBQVMsQ0FBQyxNQUFpQjtRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxNQUFpQjtRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsTUFBaUI7UUFDOUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDMUUsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsTUFBaUI7UUFDOUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDWjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRU8sTUFBTSxDQUFDLE1BQWlCO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3pCO1NBQ0Q7SUFDRixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxNQUFpQjtRQUM1QixJQUFJLE1BQU0sRUFBRTtZQUNYLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEI7SUFDRixDQUFDOzs7OztJQUVELFFBQVEsQ0FBQyxNQUFpQjtRQUN6QixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixJQUFJOztzQkFDRyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNOzs7O2dCQUFFLENBQUMsSUFBUyxFQUFFLEVBQUU7b0JBQ2xELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLGlCQUFpQixFQUFFO3dCQUMvRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFOzRCQUM3QiwwREFBMEQ7NEJBQzFELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzt5QkFDNUg7NkJBQU07NEJBQ04sMERBQTBEOzRCQUMxRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7eUJBQ3RJO3FCQUNEO3lCQUFNO3dCQUNOLDBEQUEwRDt3QkFDMUQsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQ3RIO2dCQUNGLENBQUMsRUFBQztnQkFDRixNQUFNLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwQjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyxZQUFZLFVBQVUsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO2lCQUMvQjtnQkFDRCxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDMUI7U0FDRDthQUFNO1lBQ04sTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQzFCO0lBQ0YsQ0FBQzs7Ozs7O0lBRU8sTUFBTSxDQUFDLElBQVM7UUFDdkIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDTixPQUFPLElBQUksQ0FBQztTQUNaO0lBQ0YsQ0FBQzs7Ozs7Ozs7O0lBSVMsUUFBUSxDQUFDLElBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRzs7Y0FDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPOzs7OztRQUU1QixTQUFTLFFBQVEsQ0FBQyxHQUFRO1lBQ3pCLFFBQVEsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QyxLQUFLLGlCQUFpQjtvQkFDckIsT0FBTyxHQUFHLENBQUM7Z0JBQ1osS0FBSyxpQkFBaUI7b0JBQ3JCLE9BQU8sR0FBRyxDQUFDO2dCQUNaO29CQUNDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTt3QkFDdEIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3BCO3lCQUFNO3dCQUNOLE9BQU8sV0FBVyxDQUFDO3FCQUNuQjthQUNEO1FBQ0YsQ0FBQzs7WUFFRyxHQUFHLEdBQUcsRUFBRTtRQUVaLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDL0IsUUFBUSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN0RCxLQUFLLG1CQUFtQjtvQkFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLE1BQU07Z0JBRVAsS0FBSyxnQkFBZ0I7b0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzNELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQ25CLEdBQUcsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDO3lCQUN0Qjt3QkFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzRCQUN4Qyw4QkFBOEI7NEJBQzlCLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDbEM7NkJBQU07OztrQ0FFQSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOztrQ0FFbEMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxFQUFFO2dDQUNOLGtCQUFrQjtnQ0FDbEIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOzswQ0FDbkMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29DQUU5RixRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUU7d0NBQ3JCLEtBQUssQ0FBQzs0Q0FDTCxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDOzRDQUMvQyxNQUFNO3dDQUNQLEtBQUssQ0FBQzs0Q0FDTCxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7NENBQ3RFLE1BQU07d0NBQ1A7NENBQ0MsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7NENBQ2QsTUFBTTtxQ0FDTjtpQ0FDRDtxQ0FBTTtvQ0FDTixzQ0FBc0M7b0NBQ3RDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2lDQUNkOzZCQUNEO3lCQUNEO3FCQUNEO29CQUNELE1BQU07Z0JBQ1A7b0JBQ0MsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckIsTUFBTTthQUNOO1NBQ0Q7YUFBTTtZQUNOLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckI7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNaLENBQUM7O0FBN2pCTSxxQ0FBbUIsR0FBRyxXQUFXLENBQUM7QUFDbEMscUNBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRWxDLHFCQUFHLEdBQUcsZUFBZSxDQUFDO0FBQ3RCLHFCQUFHLEdBQUcsZUFBZSxDQUFDO0FBRXRCLGdDQUFjLEdBQUc7SUFDdkIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixHQUFHLEVBQUUsS0FBSztJQUNWLElBQUksRUFBRSxNQUFNO0lBQ1osU0FBUyxFQUFFLGlCQUFpQixDQUFDLEdBQUc7SUFDaEMsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsU0FBUztDQUNqQixDQUFDOztZQXJCRixTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLDA5R0FBeUM7O2FBRXpDOzs7O1lBYmlELGVBQWU7OztpQkFnQy9ELEtBQUs7a0JBQ0wsS0FBSztzQkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztxQkFDTCxLQUFLO21CQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSztnQ0FDTCxNQUFNOzs7O0lBM0JQLHNDQUF5Qzs7SUFDekMsc0NBQXlDOztJQUV6QyxzQkFBNkI7O0lBQzdCLHNCQUE2Qjs7SUFFN0IsaUNBUUU7O0lBRUYsK0JBQXNDOztJQUN0QyxnQ0FBcUI7O0lBQ3JCLG9DQUFnQzs7SUFDaEMsbUNBQTBCOztJQUMxQixtQ0FBd0I7O0lBQ3hCLG1DQUFtRDs7SUFDbkQsaUNBQXNCOztJQUN0QixvQ0FBa0M7O0lBQ2xDLHFDQUEwQjs7SUFDMUIsbUNBQTRCOztJQUM1Qix3Q0FBaUM7O0lBQ2pDLDhDQUFpRDs7SUFFakQsc0NBQXFCOztJQUNyQixzQ0FBcUI7O0lBRXJCLHlDQUFrQjs7SUFDbEIsOENBQXVCOzs7OztJQUV2QixtQ0FBMEc7Ozs7O0lBRTlGLG9DQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRG9DaGVjaywgRXZlbnRFbWl0dGVyLCBJbnB1dCwgSXRlcmFibGVEaWZmZXJzLCBPbkNoYW5nZXMsXG5cdE91dHB1dCwgU2ltcGxlQ2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2ljTGlzdCB9IGZyb20gJy4vYmFzaWMtbGlzdCc7XG5cbmV4cG9ydCB0eXBlIGNvbXBhcmVGdW5jdGlvbiA9IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyO1xuXG52YXIgbmV4dElkID0gMDtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnZHVhbC1saXN0Jyxcblx0dGVtcGxhdGVVcmw6ICcuL2R1YWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWyAnLi9kdWFsLWxpc3QuY29tcG9uZW50LmNzcycgXVxufSlcblxuZXhwb3J0IGNsYXNzIER1YWxMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25DaGFuZ2VzIHtcblx0c3RhdGljIEFWQUlMQUJMRV9MSVNUX05BTUUgPSAnYXZhaWxhYmxlJztcblx0c3RhdGljIENPTkZJUk1FRF9MSVNUX05BTUUgPSAnY29uZmlybWVkJztcblxuXHRzdGF0aWMgTFRSID0gJ2xlZnQtdG8tcmlnaHQnO1xuXHRzdGF0aWMgUlRMID0gJ3JpZ2h0LXRvLWxlZnQnO1xuXG5cdHN0YXRpYyBERUZBVUxUX0ZPUk1BVCA9IHtcblx0XHRhZGQ6ICdBZGQnLFxuXHRcdHJlbW92ZTogJ1JlbW92ZScsXG5cdFx0YWxsOiAnQWxsJyxcblx0XHRub25lOiAnTm9uZScsXG5cdFx0ZGlyZWN0aW9uOiBEdWFsTGlzdENvbXBvbmVudC5MVFIsXG5cdFx0ZHJhZ2dhYmxlOiB0cnVlLFxuXHRcdGxvY2FsZTogdW5kZWZpbmVkXG5cdH07XG5cblx0QElucHV0KCkgaWQgPSBgZHVhbC1saXN0LSR7bmV4dElkKyt9YDtcblx0QElucHV0KCkga2V5ID0gJ19pZCc7XG5cdEBJbnB1dCgpIGRpc3BsYXk6IGFueSA9ICdfbmFtZSc7XG5cdEBJbnB1dCgpIGhlaWdodCA9ICcxMDBweCc7XG5cdEBJbnB1dCgpIGZpbHRlciA9IGZhbHNlO1xuXHRASW5wdXQoKSBmb3JtYXQgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVDtcblx0QElucHV0KCkgc29ydCA9IGZhbHNlO1xuXHRASW5wdXQoKSBjb21wYXJlOiBjb21wYXJlRnVuY3Rpb247XG5cdEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cdEBJbnB1dCgpIHNvdXJjZTogQXJyYXk8YW55Pjtcblx0QElucHV0KCkgZGVzdGluYXRpb246IEFycmF5PGFueT47XG5cdEBPdXRwdXQoKSBkZXN0aW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRhdmFpbGFibGU6IEJhc2ljTGlzdDtcblx0Y29uZmlybWVkOiBCYXNpY0xpc3Q7XG5cblx0c291cmNlRGlmZmVyOiBhbnk7XG5cdGRlc3RpbmF0aW9uRGlmZmVyOiBhbnk7XG5cblx0cHJpdmF0ZSBzb3J0ZXIgPSAoYTogYW55LCBiOiBhbnkpID0+IHsgcmV0dXJuIChhLl9uYW1lIDwgYi5fbmFtZSkgPyAtMSA6ICgoYS5fbmFtZSA+IGIuX25hbWUpID8gMSA6IDApOyB9O1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzKSB7XG5cdFx0dGhpcy5hdmFpbGFibGUgPSBuZXcgQmFzaWNMaXN0KER1YWxMaXN0Q29tcG9uZW50LkFWQUlMQUJMRV9MSVNUX05BTUUpO1xuXHRcdHRoaXMuY29uZmlybWVkID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5DT05GSVJNRURfTElTVF9OQU1FKTtcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZVJlY29yZDoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pIHtcblx0XHRpZiAoY2hhbmdlUmVjb3JkWydmaWx0ZXInXSkge1xuXHRcdFx0aWYgKGNoYW5nZVJlY29yZFsnZmlsdGVyJ10uY3VycmVudFZhbHVlID09PSBmYWxzZSkge1xuXHRcdFx0XHR0aGlzLmNsZWFyRmlsdGVyKHRoaXMuYXZhaWxhYmxlKTtcblx0XHRcdFx0dGhpcy5jbGVhckZpbHRlcih0aGlzLmNvbmZpcm1lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZVJlY29yZFsnc29ydCddKSB7XG5cdFx0XHRpZiAoY2hhbmdlUmVjb3JkWydzb3J0J10uY3VycmVudFZhbHVlID09PSB0cnVlICYmIHRoaXMuY29tcGFyZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuY29tcGFyZSA9IHRoaXMuc29ydGVyO1xuXHRcdFx0fSBlbHNlIGlmIChjaGFuZ2VSZWNvcmRbJ3NvcnQnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuY29tcGFyZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlUmVjb3JkWydmb3JtYXQnXSkge1xuXHRcdFx0dGhpcy5mb3JtYXQgPSBjaGFuZ2VSZWNvcmRbJ2Zvcm1hdCddLmN1cnJlbnRWYWx1ZTtcblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5kaXJlY3Rpb24pID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5kaXJlY3Rpb24gPSBEdWFsTGlzdENvbXBvbmVudC5MVFI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQuYWRkKSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0dGhpcy5mb3JtYXQuYWRkID0gRHVhbExpc3RDb21wb25lbnQuREVGQVVMVF9GT1JNQVQuYWRkO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0LnJlbW92ZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0LnJlbW92ZSA9IER1YWxMaXN0Q29tcG9uZW50LkRFRkFVTFRfRk9STUFULnJlbW92ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZih0aGlzLmZvcm1hdC5hbGwpID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHR0aGlzLmZvcm1hdC5hbGwgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5hbGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodGhpcy5mb3JtYXQubm9uZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0Lm5vbmUgPSBEdWFsTGlzdENvbXBvbmVudC5ERUZBVUxUX0ZPUk1BVC5ub25lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHlwZW9mKHRoaXMuZm9ybWF0LmRyYWdnYWJsZSkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0LmRyYWdnYWJsZSA9IER1YWxMaXN0Q29tcG9uZW50LkRFRkFVTFRfRk9STUFULmRyYWdnYWJsZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlUmVjb3JkWydzb3VyY2UnXSkge1xuXHRcdFx0dGhpcy5hdmFpbGFibGUgPSBuZXcgQmFzaWNMaXN0KER1YWxMaXN0Q29tcG9uZW50LkFWQUlMQUJMRV9MSVNUX05BTUUpO1xuXHRcdFx0dGhpcy51cGRhdGVkU291cmNlKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZWREZXN0aW5hdGlvbigpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VSZWNvcmRbJ2Rlc3RpbmF0aW9uJ10pIHtcblx0XHRcdHRoaXMuY29uZmlybWVkID0gbmV3IEJhc2ljTGlzdChEdWFsTGlzdENvbXBvbmVudC5DT05GSVJNRURfTElTVF9OQU1FKTtcblx0XHRcdHRoaXMudXBkYXRlZERlc3RpbmF0aW9uKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZWRTb3VyY2UoKTtcblx0XHR9XG5cdH1cblxuXHRuZ0RvQ2hlY2soKSB7XG5cdFx0aWYgKHRoaXMuc291cmNlICYmIHRoaXMuYnVpbGRBdmFpbGFibGUodGhpcy5zb3VyY2UpKSB7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHRoaXMuYXZhaWxhYmxlKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuZGVzdGluYXRpb24gJiYgdGhpcy5idWlsZENvbmZpcm1lZCh0aGlzLmRlc3RpbmF0aW9uKSkge1xuXHRcdFx0dGhpcy5vbkZpbHRlcih0aGlzLmNvbmZpcm1lZCk7XG5cdFx0fVxuXHR9XG5cblx0YnVpbGRBdmFpbGFibGUoc291cmNlOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc291cmNlQ2hhbmdlcyA9IHRoaXMuc291cmNlRGlmZmVyLmRpZmYoc291cmNlKTtcblx0XHRpZiAoc291cmNlQ2hhbmdlcykge1xuXHRcdFx0c291cmNlQ2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHI6IGFueSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5hdmFpbGFibGUubGlzdCwgci5pdGVtLCB0aGlzLmtleSk7XG5cdFx0XHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdFx0dGhpcy5hdmFpbGFibGUubGlzdC5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHNvdXJjZUNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocjogYW55KSA9PiB7XG5cdFx0XHRcdC8vIERvIG5vdCBhZGQgZHVwbGljYXRlcyBldmVuIGlmIHNvdXJjZSBoYXMgZHVwbGljYXRlcy5cblx0XHRcdFx0aWYgKHRoaXMuZmluZEl0ZW1JbmRleCh0aGlzLmF2YWlsYWJsZS5saXN0LCByLml0ZW0sIHRoaXMua2V5KSA9PT0gLTEpIHtcblx0XHRcdFx0XHR0aGlzLmF2YWlsYWJsZS5saXN0LnB1c2goIHsgX2lkOiB0aGlzLm1ha2VJZChyLml0ZW0pLCBfbmFtZTogdGhpcy5tYWtlTmFtZShyLml0ZW0pIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHRoaXMuY29tcGFyZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuYXZhaWxhYmxlLmxpc3Quc29ydCh0aGlzLmNvbXBhcmUpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5hdmFpbGFibGUuc2lmdCA9IHRoaXMuYXZhaWxhYmxlLmxpc3Q7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRidWlsZENvbmZpcm1lZChkZXN0aW5hdGlvbjogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGxldCBtb3ZlZCA9IGZhbHNlO1xuXHRcdGNvbnN0IGRlc3RDaGFuZ2VzID0gdGhpcy5kZXN0aW5hdGlvbkRpZmZlci5kaWZmKGRlc3RpbmF0aW9uKTtcblx0XHRpZiAoZGVzdENoYW5nZXMpIHtcblx0XHRcdGRlc3RDaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbSgocjogYW55KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IHRoaXMuZmluZEl0ZW1JbmRleCh0aGlzLmNvbmZpcm1lZC5saXN0LCByLml0ZW0sIHRoaXMua2V5KTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5jb25maXJtZWQucGljaywgdGhpcy5jb25maXJtZWQubGlzdFtpZHhdKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuY29uZmlybWVkLnBpY2ssIHRoaXMuY29uZmlybWVkLmxpc3RbaWR4XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlLCB0aGlzLmNvbmZpcm1lZC5saXN0W2lkeF0sIGZhbHNlKTtcblx0XHRcdFx0XHRtb3ZlZCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRkZXN0Q2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5maW5kSXRlbUluZGV4KHRoaXMuYXZhaWxhYmxlLmxpc3QsIHIuaXRlbSwgdGhpcy5rZXkpO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdGlmICghdGhpcy5pc0l0ZW1TZWxlY3RlZCh0aGlzLmF2YWlsYWJsZS5waWNrLCB0aGlzLmF2YWlsYWJsZS5saXN0W2lkeF0pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5hdmFpbGFibGUucGljaywgdGhpcy5hdmFpbGFibGUubGlzdFtpZHhdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5tb3ZlSXRlbSh0aGlzLmF2YWlsYWJsZSwgdGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlLmxpc3RbaWR4XSwgZmFsc2UpO1xuXHRcdFx0XHRcdG1vdmVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGlmICh0aGlzLmNvbXBhcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmNvbmZpcm1lZC5saXN0LnNvcnQodGhpcy5jb21wYXJlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuY29uZmlybWVkLnNpZnQgPSB0aGlzLmNvbmZpcm1lZC5saXN0O1xuXG5cdFx0XHRpZiAobW92ZWQpIHtcblx0XHRcdFx0dGhpcy50cnVlVXAoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHR1cGRhdGVkU291cmNlKCkge1xuXHRcdHRoaXMuYXZhaWxhYmxlLmxpc3QubGVuZ3RoID0gMDtcblx0XHR0aGlzLmF2YWlsYWJsZS5waWNrLmxlbmd0aCA9IDA7XG5cblx0XHRpZiAodGhpcy5zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5zb3VyY2VEaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZCh0aGlzLnNvdXJjZSkuY3JlYXRlKG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZWREZXN0aW5hdGlvbigpIHtcblx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uRGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQodGhpcy5kZXN0aW5hdGlvbikuY3JlYXRlKG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdGRpcmVjdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5mb3JtYXQuZGlyZWN0aW9uID09PSBEdWFsTGlzdENvbXBvbmVudC5MVFI7XG5cdH1cblxuXHRkcmFnRW5kKGxpc3Q6IEJhc2ljTGlzdCA9IG51bGwpOiBib29sZWFuIHtcblx0XHRpZiAobGlzdCkge1xuXHRcdFx0bGlzdC5kcmFnU3RhcnQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5hdmFpbGFibGUuZHJhZ1N0YXJ0ID0gZmFsc2U7XG5cdFx0XHR0aGlzLmNvbmZpcm1lZC5kcmFnU3RhcnQgPSBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZHJhZyhldmVudDogRHJhZ0V2ZW50LCBpdGVtOiBhbnksIGxpc3Q6IEJhc2ljTGlzdCkge1xuXHRcdGlmICghdGhpcy5pc0l0ZW1TZWxlY3RlZChsaXN0LnBpY2ssIGl0ZW0pKSB7XG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0obGlzdC5waWNrLCBpdGVtKTtcblx0XHR9XG5cdFx0bGlzdC5kcmFnU3RhcnQgPSB0cnVlO1xuXG5cdFx0Ly8gU2V0IGEgY3VzdG9tIHR5cGUgdG8gYmUgdGhpcyBkdWFsLWxpc3QncyBpZC5cblx0XHRldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSh0aGlzLmlkLCBpdGVtWydfaWQnXSk7XG5cdH1cblxuXHRhbGxvd0Ryb3AoZXZlbnQ6IERyYWdFdmVudCwgbGlzdDogQmFzaWNMaXN0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5sZW5ndGggJiYgKGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlc1swXSA9PT0gdGhpcy5pZCkpIHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoIWxpc3QuZHJhZ1N0YXJ0KSB7XG5cdFx0XHRcdGxpc3QuZHJhZ092ZXIgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRkcmFnTGVhdmUoKSB7XG5cdFx0dGhpcy5hdmFpbGFibGUuZHJhZ092ZXIgPSBmYWxzZTtcblx0XHR0aGlzLmNvbmZpcm1lZC5kcmFnT3ZlciA9IGZhbHNlO1xuXHR9XG5cblx0ZHJvcChldmVudDogRHJhZ0V2ZW50LCBsaXN0OiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLmxlbmd0aCAmJiAoZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzWzBdID09PSB0aGlzLmlkKSkge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHRoaXMuZHJhZ0xlYXZlKCk7XG5cdFx0XHR0aGlzLmRyYWdFbmQoKTtcblxuXHRcdFx0aWYgKGxpc3QgPT09IHRoaXMuYXZhaWxhYmxlKSB7XG5cdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5hdmFpbGFibGUsIHRoaXMuY29uZmlybWVkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMubW92ZUl0ZW0odGhpcy5jb25maXJtZWQsIHRoaXMuYXZhaWxhYmxlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRydWVVcCgpIHtcblx0XHRsZXQgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ2xlYXIgcmVtb3ZlZCBpdGVtcy5cblx0XHRsZXQgcG9zID0gdGhpcy5kZXN0aW5hdGlvbi5sZW5ndGg7XG5cdFx0d2hpbGUgKChwb3MgLT0gMSkgPj0gMCkge1xuXHRcdFx0Y29uc3QgbXYgPSB0aGlzLmNvbmZpcm1lZC5saXN0LmZpbHRlciggY29uZiA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgdGhpcy5kZXN0aW5hdGlvbltwb3NdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHJldHVybiBjb25mLl9pZCA9PT0gdGhpcy5kZXN0aW5hdGlvbltwb3NdW3RoaXMua2V5XTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gY29uZi5faWQgPT09IHRoaXMuZGVzdGluYXRpb25bcG9zXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBmb3VuZCBzbyByZW1vdmUuXG5cdFx0XHRcdHRoaXMuZGVzdGluYXRpb24uc3BsaWNlKHBvcywgMSk7XG5cdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFB1c2ggYWRkZWQgaXRlbXMuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29uZmlybWVkLmxpc3QubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcblx0XHRcdGxldCBtdiA9IHRoaXMuZGVzdGluYXRpb24uZmlsdGVyKCAoZDogYW55KSA9PiB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRyZXR1cm4gKGRbdGhpcy5rZXldID09PSB0aGlzLmNvbmZpcm1lZC5saXN0W2ldLl9pZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIChkID09PSB0aGlzLmNvbmZpcm1lZC5saXN0W2ldLl9pZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBmb3VuZCBzbyBhZGQuXG5cdFx0XHRcdG12ID0gdGhpcy5zb3VyY2UuZmlsdGVyKCAobzogYW55KSA9PiB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBvID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIChvW3RoaXMua2V5XSA9PT0gdGhpcy5jb25maXJtZWQubGlzdFtpXS5faWQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKG8gPT09IHRoaXMuY29uZmlybWVkLmxpc3RbaV0uX2lkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChtdi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXN0aW5hdGlvbi5wdXNoKG12WzBdKTtcblx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uQ2hhbmdlLmVtaXQodGhpcy5kZXN0aW5hdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0ZmluZEl0ZW1JbmRleChsaXN0OiBBcnJheTxhbnk+LCBpdGVtOiBhbnksIGtleTogYW55ID0gJ19pZCcpIHtcblx0XHRsZXQgaWR4ID0gLTE7XG5cblx0XHRmdW5jdGlvbiBtYXRjaE9iamVjdChlOiBhbnkpIHtcblx0XHRcdGlmIChlLl9pZCA9PT0gaXRlbVtrZXldKSB7XG5cdFx0XHRcdGlkeCA9IGxpc3QuaW5kZXhPZihlKTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gbWF0Y2goZTogYW55KSB7XG5cdFx0XHRpZiAoZS5faWQgPT09IGl0ZW0pIHtcblx0XHRcdFx0aWR4ID0gbGlzdC5pbmRleE9mKGUpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBBc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGFycmF5cyBkbyBub3QgaGF2ZSBkdXBsaWNhdGVzLlxuXHRcdGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGxpc3QuZmlsdGVyKG1hdGNoT2JqZWN0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlzdC5maWx0ZXIobWF0Y2gpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpZHg7XG5cdH1cblxuXHRwcml2YXRlIG1ha2VVbmF2YWlsYWJsZShzb3VyY2U6IEJhc2ljTGlzdCwgaXRlbTogYW55KSB7XG5cdFx0Y29uc3QgaWR4ID0gc291cmNlLmxpc3QuaW5kZXhPZihpdGVtKTtcblx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0c291cmNlLmxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0bW92ZUl0ZW0oc291cmNlOiBCYXNpY0xpc3QsIHRhcmdldDogQmFzaWNMaXN0LCBpdGVtOiBhbnkgPSBudWxsLCB0cnVldXAgPSB0cnVlKSB7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBsZW4gPSBzb3VyY2UucGljay5sZW5ndGg7XG5cblx0XHRpZiAoaXRlbSkge1xuXHRcdFx0aSA9IHNvdXJjZS5saXN0LmluZGV4T2YoaXRlbSk7XG5cdFx0XHRsZW4gPSBpICsgMTtcblx0XHR9XG5cblx0XHRmb3IgKDsgaSA8IGxlbjsgaSArPSAxKSB7XG5cdFx0XHQvLyBJcyB0aGUgcGljayBzdGlsbCBpbiBsaXN0P1xuXHRcdFx0bGV0IG12OiBBcnJheTxhbnk+ID0gW107XG5cdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRjb25zdCBpZHggPSB0aGlzLmZpbmRJdGVtSW5kZXgoc291cmNlLnBpY2ssIGl0ZW0pO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdG12WzBdID0gc291cmNlLnBpY2tbaWR4XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bXYgPSBzb3VyY2UubGlzdC5maWx0ZXIoIHNyYyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChzcmMuX2lkID09PSBzb3VyY2UucGlja1tpXS5faWQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdWxkIG9ubHkgZXZlciBiZSAxXG5cdFx0XHRpZiAobXYubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIEFkZCBpZiBub3QgYWxyZWFkeSBpbiB0YXJnZXQuXG5cdFx0XHRcdGlmICh0YXJnZXQubGlzdC5maWx0ZXIodHJnID0+IHRyZy5faWQgPT09IG12WzBdLl9pZCkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Lmxpc3QucHVzaCggbXZbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMubWFrZVVuYXZhaWxhYmxlKHNvdXJjZSwgbXZbMF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbXBhcmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGFyZ2V0Lmxpc3Quc29ydCh0aGlzLmNvbXBhcmUpO1xuXHRcdH1cblxuXHRcdHNvdXJjZS5waWNrLmxlbmd0aCA9IDA7XG5cblx0XHQvLyBVcGRhdGUgZGVzdGluYXRpb25cblx0XHRpZiAodHJ1ZXVwKSB7XG5cdFx0XHR0aGlzLnRydWVVcCgpO1xuXHRcdH1cblxuXHRcdC8vIERlbGF5IGV2ZXItc28tc2xpZ2h0bHkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbi5cblx0XHRzZXRUaW1lb3V0KCAoKSA9PiB7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHNvdXJjZSk7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHRhcmdldCk7XG5cdFx0fSwgMTApO1xuXHR9XG5cblx0aXNJdGVtU2VsZWN0ZWQobGlzdDogQXJyYXk8YW55PiwgaXRlbTogYW55KTogYm9vbGVhbiB7XG5cdFx0aWYgKGxpc3QuZmlsdGVyKGUgPT4gT2JqZWN0LmlzKGUsIGl0ZW0pKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0c2hpZnRDbGljayhldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlciwgc291cmNlOiBCYXNpY0xpc3QsIGl0ZW06IGFueSkge1xuXHRcdGlmIChldmVudC5zaGlmdEtleSAmJiBzb3VyY2UubGFzdCAmJiAhT2JqZWN0LmlzKGl0ZW0sIHNvdXJjZS5sYXN0KSkge1xuXHRcdFx0Y29uc3QgaWR4ID0gc291cmNlLnNpZnQuaW5kZXhPZihzb3VyY2UubGFzdCk7XG5cdFx0XHRpZiAoaW5kZXggPiBpZHgpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IChpZHggKyAxKTsgaSA8IGluZGV4OyBpICs9IDEpIHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdEl0ZW0oc291cmNlLnBpY2ssIHNvdXJjZS5zaWZ0W2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAoaW5kZXggKyAxKTsgaSA8IGlkeDsgaSArPSAxKSAge1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0SXRlbShzb3VyY2UucGljaywgc291cmNlLnNpZnRbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNvdXJjZS5sYXN0ID0gaXRlbTtcblx0fVxuXG5cdHNlbGVjdEl0ZW0obGlzdDogQXJyYXk8YW55PiwgaXRlbTogYW55KSB7XG5cdFx0Y29uc3QgcGsgPSBsaXN0LmZpbHRlciggKGU6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5pcyhlLCBpdGVtKTtcblx0XHR9KTtcblx0XHRpZiAocGsubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gQWxyZWFkeSBpbiBsaXN0LCBzbyBkZXNlbGVjdC5cblx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSBway5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuXHRcdFx0XHRjb25zdCBpZHggPSBsaXN0LmluZGV4T2YocGtbaV0pO1xuXHRcdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRcdGxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG5cdHNlbGVjdEFsbChzb3VyY2U6IEJhc2ljTGlzdCkge1xuXHRcdHNvdXJjZS5waWNrLmxlbmd0aCA9IDA7XG5cdFx0c291cmNlLnBpY2sgPSBzb3VyY2Uuc2lmdC5zbGljZSgwKTtcblx0fVxuXG5cdHNlbGVjdE5vbmUoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRzb3VyY2UucGljay5sZW5ndGggPSAwO1xuXHR9XG5cblx0aXNBbGxTZWxlY3RlZChzb3VyY2U6IEJhc2ljTGlzdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChzb3VyY2UubGlzdC5sZW5ndGggPT09IDAgfHwgc291cmNlLmxpc3QubGVuZ3RoID09PSBzb3VyY2UucGljay5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpc0FueVNlbGVjdGVkKHNvdXJjZTogQmFzaWNMaXN0KTogYm9vbGVhbiB7XG5cdFx0aWYgKHNvdXJjZS5waWNrLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcml2YXRlIHVucGljayhzb3VyY2U6IEJhc2ljTGlzdCkge1xuXHRcdGZvciAobGV0IGkgPSBzb3VyY2UucGljay5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuXHRcdFx0aWYgKHNvdXJjZS5zaWZ0LmluZGV4T2Yoc291cmNlLnBpY2tbaV0pID09PSAtMSkge1xuXHRcdFx0XHRzb3VyY2UucGljay5zcGxpY2UoaSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y2xlYXJGaWx0ZXIoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoc291cmNlKSB7XG5cdFx0XHRzb3VyY2UucGlja2VyID0gJyc7XG5cdFx0XHR0aGlzLm9uRmlsdGVyKHNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0b25GaWx0ZXIoc291cmNlOiBCYXNpY0xpc3QpIHtcblx0XHRpZiAoc291cmNlLnBpY2tlci5sZW5ndGggPiAwKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHNvdXJjZS5saXN0LmZpbHRlciggKGl0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG5cdFx0XHRcdFx0XHRpZiAoaXRlbS5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEB0cy1pZ25vcmU6IHJlbW92ZSB3aGVuIGQudHMgaGFzIGxvY2FsZSBhcyBhbiBhcmd1bWVudC5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0uX25hbWUudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKS5pbmRleE9mKHNvdXJjZS5waWNrZXIudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKSkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZTogcmVtb3ZlIHdoZW4gZC50cyBoYXMgbG9jYWxlIGFzIGFuIGFyZ3VtZW50LlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaXRlbSkudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKS5pbmRleE9mKHNvdXJjZS5waWNrZXIudG9Mb2NhbGVMb3dlckNhc2UodGhpcy5mb3JtYXQubG9jYWxlKSkgIT09IC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlOiByZW1vdmUgd2hlbiBkLnRzIGhhcyBsb2NhbGUgYXMgYW4gYXJndW1lbnQuXG5cdFx0XHRcdFx0XHRyZXR1cm4gaXRlbS50b0xvY2FsZUxvd2VyQ2FzZSh0aGlzLmZvcm1hdC5sb2NhbGUpLmluZGV4T2Yoc291cmNlLnBpY2tlci50b0xvY2FsZUxvd2VyQ2FzZSh0aGlzLmZvcm1hdC5sb2NhbGUpKSAhPT0gLTE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c291cmNlLnNpZnQgPSBmaWx0ZXJlZDtcblx0XHRcdFx0dGhpcy51bnBpY2soc291cmNlKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG5cdFx0XHRcdFx0dGhpcy5mb3JtYXQubG9jYWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNvdXJjZS5zaWZ0ID0gc291cmNlLmxpc3Q7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNvdXJjZS5zaWZ0ID0gc291cmNlLmxpc3Q7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBtYWtlSWQoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRyZXR1cm4gaXRlbVt0aGlzLmtleV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBpdGVtO1xuXHRcdH1cblx0fVxuXG5cdC8vIEFsbG93IGZvciBjb21wbGV4IG5hbWVzIGJ5IHBhc3NpbmcgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cblx0Ly8gRXhhbXBsZTogW2Rpc3BsYXldPVwiWyAnX3R5cGUuc3Vic3RyaW5nKDAsMSknLCAnX25hbWUnIF1cIlxuXHRwcm90ZWN0ZWQgbWFrZU5hbWUoaXRlbTogYW55LCBzZXBhcmF0b3IgPSAnXycpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XG5cblx0XHRmdW5jdGlvbiBmYWxsYmFjayhpdG06IGFueSkge1xuXHRcdFx0c3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRtKSkge1xuXHRcdFx0Y2FzZSAnW29iamVjdCBOdW1iZXJdJzpcblx0XHRcdFx0cmV0dXJuIGl0bTtcblx0XHRcdGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG5cdFx0XHRcdHJldHVybiBpdG07XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRpZiAoaXRtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gaXRtW2Rpc3BsYXldO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiAndW5kZWZpbmVkJztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCBzdHIgPSAnJztcblxuXHRcdGlmICh0aGlzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0c3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcy5kaXNwbGF5KSkge1xuXHRcdFx0Y2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuXHRcdFx0XHRzdHIgPSB0aGlzLmRpc3BsYXkoaXRlbSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEFycmF5XSc6XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmRpc3BsYXkubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcblx0XHRcdFx0XHRpZiAoc3RyLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIHNlcGFyYXRvcjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5kaXNwbGF5W2ldLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdC8vIFNpbXBsZSwganVzdCBhZGQgdG8gc3RyaW5nLlxuXHRcdFx0XHRcdFx0c3RyID0gc3RyICsgaXRlbVt0aGlzLmRpc3BsYXlbaV1dO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBDb21wbGV4LCBzb21lIGFjdGlvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWRcblx0XHRcdFx0XHRcdGNvbnN0IHBhcnRzID0gdGhpcy5kaXNwbGF5W2ldLnNwbGl0KCcuJyk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHMgPSBpdGVtW3BhcnRzWzBdXTtcblx0XHRcdFx0XHRcdGlmIChzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBicnV0ZSBmb3JjZVxuXHRcdFx0XHRcdFx0XHRpZiAocGFydHNbMV0uaW5kZXhPZignc3Vic3RyaW5nJykgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbnVtcyA9IChwYXJ0c1sxXS5zdWJzdHJpbmcocGFydHNbMV0uaW5kZXhPZignKCcpICsgMSwgcGFydHNbMV0uaW5kZXhPZignKScpKSkuc3BsaXQoJywnKTtcblxuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAobnVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzLnN1YnN0cmluZyhwYXJzZUludChudW1zWzBdLCAxMCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRcdFx0XHRcdFx0c3RyID0gc3RyICsgcy5zdWJzdHJpbmcocGFyc2VJbnQobnVtc1swXSwgMTApLCBwYXJzZUludChudW1zWzFdLCAxMCkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRcdHN0ciA9IHN0ciArIHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gbWV0aG9kIG5vdCBhcHByb3ZlZCwgc28ganVzdCBhZGQgcy5cblx0XHRcdFx0XHRcdFx0XHRzdHIgPSBzdHIgKyBzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0c3RyID0gZmFsbGJhY2soaXRlbSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgPSBmYWxsYmFjayhpdGVtKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3RyO1xuXHR9XG59XG4iXX0=