theme-lib
Version:
This is a simple example Angular Library published to npm.
383 lines • 29.1 kB
JavaScript
import * as tslib_1 from "tslib";
var _a;
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Inject, Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
import { NB_DOCUMENT } from '../../../theme.options';
import { NbFlexibleConnectedPositionStrategy, NbOverlayPositionBuilder, NbPlatform, } from './mapping';
import { NbViewportRulerAdapter } from '../adapter/viewport-ruler-adapter';
import { NbGlobalLogicalPosition } from './position-helper';
import { GlobalPositionStrategy } from '@angular/cdk/overlay';
/** @enum {string} */
var NbAdjustment = {
NOOP: 'noop',
CLOCKWISE: 'clockwise',
COUNTERCLOCKWISE: 'counterclockwise',
VERTICAL: 'vertical',
HORIZONTAL: 'horizontal',
};
export { NbAdjustment };
/** @enum {string} */
var NbPosition = {
TOP: 'top',
BOTTOM: 'bottom',
LEFT: 'left',
RIGHT: 'right',
START: 'start',
END: 'end',
};
export { NbPosition };
/** @type {?} */
var POSITIONS = (_a = {},
_a[NbPosition.RIGHT] = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
return { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset };
},
_a[NbPosition.BOTTOM] = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
return { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: offset };
},
_a[NbPosition.LEFT] = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
return { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset };
},
_a[NbPosition.TOP] = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
return { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset };
},
_a);
/** @type {?} */
var COUNTER_CLOCKWISE_POSITIONS = [NbPosition.TOP, NbPosition.LEFT, NbPosition.BOTTOM, NbPosition.RIGHT];
/** @type {?} */
var NOOP_POSITIONS = [NbPosition.TOP, NbPosition.BOTTOM, NbPosition.LEFT, NbPosition.RIGHT];
/** @type {?} */
var CLOCKWISE_POSITIONS = [NbPosition.TOP, NbPosition.RIGHT, NbPosition.BOTTOM, NbPosition.LEFT];
/** @type {?} */
var VERTICAL_POSITIONS = [NbPosition.BOTTOM, NbPosition.TOP];
/** @type {?} */
var HORIZONTAL_POSITIONS = [NbPosition.START, NbPosition.END];
/**
* @param {?} p1
* @param {?} p2
* @return {?}
*/
function comparePositions(p1, p2) {
return p1.originX === p2.originX
&& p1.originY === p2.originY
&& p1.overlayX === p2.overlayX
&& p1.overlayY === p2.overlayY;
}
/*
* The main idea of the adjustable connected strategy is to provide predefined set of positions for your overlay.
* You have to provide adjustment and appropriate strategy will be chosen in runtime.
* */
var /*
* The main idea of the adjustable connected strategy is to provide predefined set of positions for your overlay.
* You have to provide adjustment and appropriate strategy will be chosen in runtime.
* */
NbAdjustableConnectedPositionStrategy = /** @class */ (function (_super) {
tslib_1.__extends(NbAdjustableConnectedPositionStrategy, _super);
function NbAdjustableConnectedPositionStrategy() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this._offset = 15;
_this.positionChange = _this.positionChanges.pipe(map(function (positionChange) { return positionChange.connectionPair; }), map(function (connectionPair) {
return _this.appliedPositions.find(function (_a) {
var connectedPosition = _a.connectedPosition;
return comparePositions(connectedPosition, connectionPair);
}).key;
}));
return _this;
}
/**
* @param {?} overlayRef
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.attach = /**
* @param {?} overlayRef
* @return {?}
*/
function (overlayRef) {
/*
* We have to apply positions before attach because super.attach() validates positions and crashes app
* if no positions provided.
* */
this.applyPositions();
_super.prototype.attach.call(this, overlayRef);
};
/**
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.apply = /**
* @return {?}
*/
function () {
this.applyPositions();
_super.prototype.apply.call(this);
};
/**
* @template THIS
* @this {THIS}
* @param {?} position
* @return {THIS}
*/
NbAdjustableConnectedPositionStrategy.prototype.position = /**
* @template THIS
* @this {THIS}
* @param {?} position
* @return {THIS}
*/
function (position) {
(/** @type {?} */ (this))._position = position;
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} adjustment
* @return {THIS}
*/
NbAdjustableConnectedPositionStrategy.prototype.adjustment = /**
* @template THIS
* @this {THIS}
* @param {?} adjustment
* @return {THIS}
*/
function (adjustment) {
(/** @type {?} */ (this))._adjustment = adjustment;
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @param {?} offset
* @return {THIS}
*/
NbAdjustableConnectedPositionStrategy.prototype.offset = /**
* @template THIS
* @this {THIS}
* @param {?} offset
* @return {THIS}
*/
function (offset) {
(/** @type {?} */ (this))._offset = offset;
return (/** @type {?} */ (this));
};
/**
* @protected
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.applyPositions = /**
* @protected
* @return {?}
*/
function () {
/** @type {?} */
var positions = this.createPositions();
this.persistChosenPositions(positions);
this.withPositions(this.appliedPositions.map(function (_a) {
var connectedPosition = _a.connectedPosition;
return connectedPosition;
}));
};
/**
* @protected
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.createPositions = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
switch (this._adjustment) {
case NbAdjustment.NOOP:
return NOOP_POSITIONS.filter(function (position) { return _this._position === position; });
case NbAdjustment.CLOCKWISE:
return this.reorderPreferredPositions(CLOCKWISE_POSITIONS);
case NbAdjustment.COUNTERCLOCKWISE:
return this.reorderPreferredPositions(COUNTER_CLOCKWISE_POSITIONS);
case NbAdjustment.HORIZONTAL:
return this.reorderPreferredPositions(HORIZONTAL_POSITIONS);
case NbAdjustment.VERTICAL:
return this.reorderPreferredPositions(VERTICAL_POSITIONS);
}
};
/**
* @protected
* @param {?} positions
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.persistChosenPositions = /**
* @protected
* @param {?} positions
* @return {?}
*/
function (positions) {
var _this = this;
this.appliedPositions = positions.map(function (position) { return ({
key: position,
connectedPosition: POSITIONS[position](_this._offset),
}); });
};
/**
* @protected
* @param {?} positions
* @return {?}
*/
NbAdjustableConnectedPositionStrategy.prototype.reorderPreferredPositions = /**
* @protected
* @param {?} positions
* @return {?}
*/
function (positions) {
/** @type {?} */
var cpy = positions.slice();
/** @type {?} */
var startIndex = positions.indexOf(this._position);
/** @type {?} */
var start = cpy.splice(startIndex);
return start.concat.apply(start, tslib_1.__spread(cpy));
};
return NbAdjustableConnectedPositionStrategy;
}(NbFlexibleConnectedPositionStrategy));
/*
* The main idea of the adjustable connected strategy is to provide predefined set of positions for your overlay.
* You have to provide adjustment and appropriate strategy will be chosen in runtime.
* */
export { NbAdjustableConnectedPositionStrategy };
if (false) {
/**
* @type {?}
* @protected
*/
NbAdjustableConnectedPositionStrategy.prototype._position;
/**
* @type {?}
* @protected
*/
NbAdjustableConnectedPositionStrategy.prototype._offset;
/**
* @type {?}
* @protected
*/
NbAdjustableConnectedPositionStrategy.prototype._adjustment;
/**
* @type {?}
* @protected
*/
NbAdjustableConnectedPositionStrategy.prototype.appliedPositions;
/** @type {?} */
NbAdjustableConnectedPositionStrategy.prototype.positionChange;
}
var NbGlobalPositionStrategy = /** @class */ (function (_super) {
tslib_1.__extends(NbGlobalPositionStrategy, _super);
function NbGlobalPositionStrategy() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @template THIS
* @this {THIS}
* @param {?} position
* @return {THIS}
*/
NbGlobalPositionStrategy.prototype.position = /**
* @template THIS
* @this {THIS}
* @param {?} position
* @return {THIS}
*/
function (position) {
switch (position) {
case NbGlobalLogicalPosition.TOP_START:
return (/** @type {?} */ (this)).top().left();
case NbGlobalLogicalPosition.TOP_END:
return (/** @type {?} */ (this)).top().right();
case NbGlobalLogicalPosition.BOTTOM_START:
return (/** @type {?} */ (this)).bottom().left();
case NbGlobalLogicalPosition.BOTTOM_END:
return (/** @type {?} */ (this)).bottom().right();
}
};
return NbGlobalPositionStrategy;
}(GlobalPositionStrategy));
export { NbGlobalPositionStrategy };
var NbPositionBuilderService = /** @class */ (function () {
function NbPositionBuilderService(document, viewportRuler, platform, positionBuilder) {
this.document = document;
this.viewportRuler = viewportRuler;
this.platform = platform;
this.positionBuilder = positionBuilder;
}
/**
* @return {?}
*/
NbPositionBuilderService.prototype.global = /**
* @return {?}
*/
function () {
return new NbGlobalPositionStrategy();
};
/**
* @param {?} elementRef
* @return {?}
*/
NbPositionBuilderService.prototype.connectedTo = /**
* @param {?} elementRef
* @return {?}
*/
function (elementRef) {
return new NbAdjustableConnectedPositionStrategy(elementRef, this.viewportRuler, this.document, this.platform)
.withFlexibleDimensions(false)
.withPush(false);
};
NbPositionBuilderService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbPositionBuilderService.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] },
{ type: NbViewportRulerAdapter },
{ type: NbPlatform },
{ type: NbOverlayPositionBuilder }
]; };
return NbPositionBuilderService;
}());
export { NbPositionBuilderService };
if (false) {
/**
* @type {?}
* @protected
*/
NbPositionBuilderService.prototype.document;
/**
* @type {?}
* @protected
*/
NbPositionBuilderService.prototype.viewportRuler;
/**
* @type {?}
* @protected
*/
NbPositionBuilderService.prototype.platform;
/**
* @type {?}
* @protected
*/
NbPositionBuilderService.prototype.positionBuilder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS1wb3NpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L292ZXJsYXktcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFjLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBSUwsbUNBQW1DLEVBQ25DLHdCQUF3QixFQUV4QixVQUFVLEdBRVgsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztJQUk1RCxNQUFPLE1BQU07SUFDYixXQUFZLFdBQVc7SUFDdkIsa0JBQW1CLGtCQUFrQjtJQUNyQyxVQUFXLFVBQVU7SUFDckIsWUFBYSxZQUFZOzs7OztJQUl6QixLQUFNLEtBQUs7SUFDWCxRQUFTLFFBQVE7SUFDakIsTUFBTyxNQUFNO0lBQ2IsT0FBUSxPQUFPO0lBQ2YsT0FBUSxPQUFPO0lBQ2YsS0FBTSxLQUFLOzs7O0lBR1AsU0FBUztJQUNiLEdBQUMsVUFBVSxDQUFDLEtBQUs7Ozs7SUFBakIsVUFBbUIsTUFBTTtRQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDdkcsQ0FBQztJQUNELEdBQUMsVUFBVSxDQUFDLE1BQU07Ozs7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QUFLLENBQUMsQ0FBQztJQUNyQixDQUFDOztnQkFoQkYsVUFBVTs7OztnREFFSSxNQUFNLFNBQUMsV0FBVztnQkEvSnhCLHNCQUFzQjtnQkFIN0IsVUFBVTtnQkFGVix3QkFBd0I7O0lBbUwxQiwrQkFBQztDQUFBLEFBakJELElBaUJDO1NBaEJZLHdCQUF3Qjs7Ozs7O0lBQ3ZCLDRDQUF1Qzs7Ozs7SUFDdkMsaURBQStDOzs7OztJQUMvQyw0Q0FBOEI7Ozs7O0lBQzlCLG1EQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBOQl9ET0NVTUVOVCB9IGZyb20gJy4uLy4uLy4uL3RoZW1lLm9wdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIE5iQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxyXG4gIE5iQ29ubmVjdGVkUG9zaXRpb24sXHJcbiAgTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxyXG4gIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE5iT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcclxuICBOYk92ZXJsYXlSZWYsXHJcbiAgTmJQbGF0Zm9ybSxcclxuICBOYlBvc2l0aW9uU3RyYXRlZ3ksXHJcbn0gZnJvbSAnLi9tYXBwaW5nJztcclxuaW1wb3J0IHsgTmJWaWV3cG9ydFJ1bGVyQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXIvdmlld3BvcnQtcnVsZXItYWRhcHRlcic7XHJcbmltcG9ydCB7IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uIH0gZnJvbSAnLi9wb3NpdGlvbi1oZWxwZXInO1xyXG5pbXBvcnQgeyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIE5iQWRqdXN0bWVudCB7XHJcbiAgTk9PUCA9ICdub29wJyxcclxuICBDTE9DS1dJU0UgPSAnY2xvY2t3aXNlJyxcclxuICBDT1VOVEVSQ0xPQ0tXSVNFID0gJ2NvdW50ZXJjbG9ja3dpc2UnLFxyXG4gIFZFUlRJQ0FMID0gJ3ZlcnRpY2FsJyxcclxuICBIT1JJWk9OVEFMID0gJ2hvcml6b250YWwnLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBOYlBvc2l0aW9uIHtcclxuICBUT1AgPSAndG9wJyxcclxuICBCT1RUT00gPSAnYm90dG9tJyxcclxuICBMRUZUID0gJ2xlZnQnLFxyXG4gIFJJR0hUID0gJ3JpZ2h0JyxcclxuICBTVEFSVCA9ICdzdGFydCcsXHJcbiAgRU5EID0gJ2VuZCcsXHJcbn1cclxuXHJcbmNvbnN0IFBPU0lUSU9OUyA9IHtcclxuICBbTmJQb3NpdGlvbi5SSUdIVF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IG9mZnNldCB9O1xyXG4gIH0sXHJcbiAgW05iUG9zaXRpb24uQk9UVE9NXShvZmZzZXQpIHtcclxuICAgIHJldHVybiB7IG9yaWdpblg6ICdjZW50ZXInLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IG9mZnNldCB9O1xyXG4gIH0sXHJcbiAgW05iUG9zaXRpb24uTEVGVF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnY2VudGVyJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicsIG9mZnNldFg6IC1vZmZzZXQgfTtcclxuICB9LFxyXG4gIFtOYlBvc2l0aW9uLlRPUF0ob2Zmc2V0KSB7XHJcbiAgICByZXR1cm4geyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtb2Zmc2V0IH07XHJcbiAgfSxcclxufTtcclxuXHJcbmNvbnN0IENPVU5URVJfQ0xPQ0tXSVNFX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlRPUCwgTmJQb3NpdGlvbi5MRUZULCBOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5SSUdIVF07XHJcbmNvbnN0IE5PT1BfUE9TSVRJT05TID0gW05iUG9zaXRpb24uVE9QLCBOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5MRUZULCBOYlBvc2l0aW9uLlJJR0hUXTtcclxuY29uc3QgQ0xPQ0tXSVNFX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlRPUCwgTmJQb3NpdGlvbi5SSUdIVCwgTmJQb3NpdGlvbi5CT1RUT00sIE5iUG9zaXRpb24uTEVGVF07XHJcbmNvbnN0IFZFUlRJQ0FMX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLkJPVFRPTSwgTmJQb3NpdGlvbi5UT1BdO1xyXG5jb25zdCBIT1JJWk9OVEFMX1BPU0lUSU9OUyA9IFtOYlBvc2l0aW9uLlNUQVJULCBOYlBvc2l0aW9uLkVORF07XHJcblxyXG5cclxuZnVuY3Rpb24gY29tcGFyZVBvc2l0aW9ucyhwMTogTmJDb25uZWN0ZWRQb3NpdGlvbiwgcDI6IE5iQ29ubmVjdGVkUG9zaXRpb24pOiBib29sZWFuIHtcclxuICByZXR1cm4gcDEub3JpZ2luWCA9PT0gcDIub3JpZ2luWFxyXG4gICAgJiYgcDEub3JpZ2luWSA9PT0gcDIub3JpZ2luWVxyXG4gICAgJiYgcDEub3ZlcmxheVggPT09IHAyLm92ZXJsYXlYXHJcbiAgICAmJiBwMS5vdmVybGF5WSA9PT0gcDIub3ZlcmxheVk7XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRoZSBtYWluIGlkZWEgb2YgdGhlIGFkanVzdGFibGUgY29ubmVjdGVkIHN0cmF0ZWd5IGlzIHRvIHByb3ZpZGUgcHJlZGVmaW5lZCBzZXQgb2YgcG9zaXRpb25zIGZvciB5b3VyIG92ZXJsYXkuXHJcbiAqIFlvdSBoYXZlIHRvIHByb3ZpZGUgYWRqdXN0bWVudCBhbmQgYXBwcm9wcmlhdGUgc3RyYXRlZ3kgd2lsbCBiZSBjaG9zZW4gaW4gcnVudGltZS5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lcclxuICBleHRlbmRzIE5iRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5IGltcGxlbWVudHMgTmJQb3NpdGlvblN0cmF0ZWd5IHtcclxuXHJcbiAgcHJvdGVjdGVkIF9wb3NpdGlvbjogTmJQb3NpdGlvbjtcclxuICBwcm90ZWN0ZWQgX29mZnNldDogbnVtYmVyID0gMTU7XHJcbiAgcHJvdGVjdGVkIF9hZGp1c3RtZW50OiBOYkFkanVzdG1lbnQ7XHJcblxyXG4gIHByb3RlY3RlZCBhcHBsaWVkUG9zaXRpb25zOiB7IGtleTogTmJQb3NpdGlvbiwgY29ubmVjdGVkUG9zaXRpb246IE5iQ29ubmVjdGVkUG9zaXRpb24gfVtdO1xyXG5cclxuICByZWFkb25seSBwb3NpdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxOYlBvc2l0aW9uPiA9IHRoaXMucG9zaXRpb25DaGFuZ2VzLnBpcGUoXHJcbiAgICBtYXAoKHBvc2l0aW9uQ2hhbmdlOiBOYkNvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSkgPT4gcG9zaXRpb25DaGFuZ2UuY29ubmVjdGlvblBhaXIpLFxyXG4gICAgbWFwKChjb25uZWN0aW9uUGFpcjogTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFwcGxpZWRQb3NpdGlvbnMuZmluZCgoeyBjb25uZWN0ZWRQb3NpdGlvbiB9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVQb3NpdGlvbnMoY29ubmVjdGVkUG9zaXRpb24sIGNvbm5lY3Rpb25QYWlyKTtcclxuICAgICAgfSkua2V5O1xyXG4gICAgfSksXHJcbiAgKTtcclxuXHJcbiAgYXR0YWNoKG92ZXJsYXlSZWY6IE5iT3ZlcmxheVJlZikge1xyXG4gICAgLypcclxuICAgICAqIFdlIGhhdmUgdG8gYXBwbHkgcG9zaXRpb25zIGJlZm9yZSBhdHRhY2ggYmVjYXVzZSBzdXBlci5hdHRhY2goKSB2YWxpZGF0ZXMgcG9zaXRpb25zIGFuZCBjcmFzaGVzIGFwcFxyXG4gICAgICogaWYgbm8gcG9zaXRpb25zIHByb3ZpZGVkLlxyXG4gICAgICogKi9cclxuICAgIHRoaXMuYXBwbHlQb3NpdGlvbnMoKTtcclxuICAgIHN1cGVyLmF0dGFjaChvdmVybGF5UmVmKTtcclxuICB9XHJcblxyXG4gIGFwcGx5KCkge1xyXG4gICAgdGhpcy5hcHBseVBvc2l0aW9ucygpO1xyXG4gICAgc3VwZXIuYXBwbHkoKTtcclxuICB9XHJcblxyXG4gIHBvc2l0aW9uKHBvc2l0aW9uOiBOYlBvc2l0aW9uKTogdGhpcyB7XHJcbiAgICB0aGlzLl9wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBhZGp1c3RtZW50KGFkanVzdG1lbnQ6IE5iQWRqdXN0bWVudCk6IHRoaXMge1xyXG4gICAgdGhpcy5fYWRqdXN0bWVudCA9IGFkanVzdG1lbnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIG9mZnNldChvZmZzZXQ6IG51bWJlcik6IHRoaXMge1xyXG4gICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXBwbHlQb3NpdGlvbnMoKSB7XHJcbiAgICBjb25zdCBwb3NpdGlvbnM6IE5iUG9zaXRpb25bXSA9IHRoaXMuY3JlYXRlUG9zaXRpb25zKCk7XHJcbiAgICB0aGlzLnBlcnNpc3RDaG9zZW5Qb3NpdGlvbnMocG9zaXRpb25zKTtcclxuICAgIHRoaXMud2l0aFBvc2l0aW9ucyh0aGlzLmFwcGxpZWRQb3NpdGlvbnMubWFwKCh7IGNvbm5lY3RlZFBvc2l0aW9uIH0pID0+IGNvbm5lY3RlZFBvc2l0aW9uKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlUG9zaXRpb25zKCk6IE5iUG9zaXRpb25bXSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX2FkanVzdG1lbnQpIHtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuTk9PUDpcclxuICAgICAgICByZXR1cm4gTk9PUF9QT1NJVElPTlMuZmlsdGVyKHBvc2l0aW9uID0+IHRoaXMuX3Bvc2l0aW9uID09PSBwb3NpdGlvbik7XHJcbiAgICAgIGNhc2UgTmJBZGp1c3RtZW50LkNMT0NLV0lTRTpcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKENMT0NLV0lTRV9QT1NJVElPTlMpO1xyXG4gICAgICBjYXNlIE5iQWRqdXN0bWVudC5DT1VOVEVSQ0xPQ0tXSVNFOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlb3JkZXJQcmVmZXJyZWRQb3NpdGlvbnMoQ09VTlRFUl9DTE9DS1dJU0VfUE9TSVRJT05TKTtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuSE9SSVpPTlRBTDpcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKEhPUklaT05UQUxfUE9TSVRJT05TKTtcclxuICAgICAgY2FzZSBOYkFkanVzdG1lbnQuVkVSVElDQUw6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVvcmRlclByZWZlcnJlZFBvc2l0aW9ucyhWRVJUSUNBTF9QT1NJVElPTlMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHBlcnNpc3RDaG9zZW5Qb3NpdGlvbnMocG9zaXRpb25zOiBOYlBvc2l0aW9uW10pIHtcclxuICAgIHRoaXMuYXBwbGllZFBvc2l0aW9ucyA9IHBvc2l0aW9ucy5tYXAocG9zaXRpb24gPT4gKHtcclxuICAgICAga2V5OiBwb3NpdGlvbixcclxuICAgICAgY29ubmVjdGVkUG9zaXRpb246IFBPU0lUSU9OU1twb3NpdGlvbl0odGhpcy5fb2Zmc2V0KSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZW9yZGVyUHJlZmVycmVkUG9zaXRpb25zKHBvc2l0aW9uczogTmJQb3NpdGlvbltdKTogTmJQb3NpdGlvbltdIHtcclxuICAgIGNvbnN0IGNweSA9IHBvc2l0aW9ucy5zbGljZSgpO1xyXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHBvc2l0aW9ucy5pbmRleE9mKHRoaXMuX3Bvc2l0aW9uKTtcclxuICAgIGNvbnN0IHN0YXJ0ID0gY3B5LnNwbGljZShzdGFydEluZGV4KTtcclxuICAgIHJldHVybiBzdGFydC5jb25jYXQoLi4uY3B5KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkdsb2JhbFBvc2l0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IHtcclxuXHJcbiAgcG9zaXRpb24ocG9zaXRpb246IE5iR2xvYmFsTG9naWNhbFBvc2l0aW9uKTogdGhpcyB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XHJcbiAgICAgIGNhc2UgTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24uVE9QX1NUQVJUOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnRvcCgpLmxlZnQoKTtcclxuXHJcbiAgICAgIGNhc2UgTmJHbG9iYWxMb2dpY2FsUG9zaXRpb24uVE9QX0VORDpcclxuICAgICAgICByZXR1cm4gdGhpcy50b3AoKS5yaWdodCgpO1xyXG5cclxuICAgICAgY2FzZSBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbi5CT1RUT01fU1RBUlQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tKCkubGVmdCgpO1xyXG5cclxuICAgICAgY2FzZSBOYkdsb2JhbExvZ2ljYWxQb3NpdGlvbi5CT1RUT01fRU5EOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmJvdHRvbSgpLnJpZ2h0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkJfRE9DVU1FTlQpIHByb3RlY3RlZCBkb2N1bWVudCxcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdmlld3BvcnRSdWxlcjogTmJWaWV3cG9ydFJ1bGVyQWRhcHRlcixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IE5iUGxhdGZvcm0sXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uQnVpbGRlcjogTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyKSB7XHJcbiAgfVxyXG5cclxuICBnbG9iYWwoKTogTmJHbG9iYWxQb3NpdGlvblN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJHbG9iYWxQb3NpdGlvblN0cmF0ZWd5KCk7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0ZWRUbyhlbGVtZW50UmVmOiBFbGVtZW50UmVmKTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gbmV3IE5iQWRqdXN0YWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3koZWxlbWVudFJlZiwgdGhpcy52aWV3cG9ydFJ1bGVyLCB0aGlzLmRvY3VtZW50LCB0aGlzLnBsYXRmb3JtKVxyXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcclxuICAgICAgLndpdGhQdXNoKGZhbHNlKTtcclxuICB9XHJcbn1cclxuIl19