@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
563 lines • 63 kB
JavaScript
/**
* © 2025 Visa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { Directive, HostBinding, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class FlexDirective {
get hostClasses() {
return [
this.vFlex ? (this.vFlexCol ? 'v-flex' : 'v-flex v-flex-row') : null,
this.vFlexInline ? 'v-flex-inline' : null,
this.vFlexCol ? 'v-flex-col' : null,
this.vFlexColReverse ? 'v-flex-col-reverse' : null,
this.vFlexRow ? 'v-flex-row' : null,
this.vFlexRowReverse ? 'v-flex-row-reverse' : null,
this.vFlexWrap ? 'v-flex-wrap' : null,
this.vFlexWrapReverse ? 'v-flex-wrap-reverse' : null,
this.vFlexNoWrap ? 'v-flex-nowrap' : null,
this.vFlexGrow ? 'v-flex-grow' : null,
this.vFlexGrow0 ? 'v-flex-grow-0' : null,
this.vFlexShrink ? 'v-flex-shrink' : null,
this.vFlexShrink0 ? 'v-flex-shrink-0' : null,
this.vAlignContentCenter ? 'v-align-content-center' : null,
this.vAlignContentStart ? 'v-align-content-start' : null,
this.vAlignContentEnd ? 'v-align-content-end' : null,
this.vAlignContentBetween ? 'v-align-content-between' : null,
this.vAlignContentAround ? 'v-align-content-around' : null,
this.vAlignContentEvenly ? 'v-align-content-evenly' : null,
this.vAlignItemsStart ? 'v-align-items-start' : null,
this.vAlignItemsEnd ? 'v-align-items-end' : null,
this.vAlignItemsCenter ? 'v-align-items-center' : null,
this.vAlignItemsBaseline ? 'v-align-items-baseline' : null,
this.vAlignItemsStretch ? 'v-align-items-stretch' : null,
this.vAlignSelfStart ? 'v-align-self-start' : null,
this.vAlignSelfEnd ? 'v-align-self-end' : null,
this.vAlignSelfCenter ? 'v-align-self-center' : null,
this.vAlignSelfBaseline ? 'v-align-self-baseline' : null,
this.vAlignSelfStretch ? 'v-align-self-stretch' : null,
this.vAlignSelfAuto ? 'v-align-self-auto' : null,
this.vJustifyContentStart ? 'v-justify-content-start' : null,
this.vJustifyContentEnd ? 'v-justify-content-end' : null,
this.vJustifyContentCenter ? 'v-justify-content-center' : null,
this.vJustifyContentBetween ? 'v-justify-content-between' : null,
this.vJustifyContentAround ? 'v-justify-content-around' : null,
this.vJustifyContentEvenly ? 'v-justify-content-evenly' : null,
this.vGap ? `v-flex v-gap-${this.vGap}` : null, // vGap="4"
this.vColGap ? `v-col-gap-${this.vColGap}` : null, // vGap="4"
this.vRowGap ? `v-row-gap-${this.vRowGap}` : null // vGap="4"
].join(' ');
}
/**
* Sets property <code>display: flex</code>. <br>
* This property is also a selector and can be used by itself on a flex element.
*/
get vFlex() {
return this._vFlex;
}
set vFlex(value) {
this._vFlex = coerceBooleanProperty(value);
}
/**
* Sets property <code>display: inline-flex</code>. <br>
* This property is also a selector and can be used by itself on a flex element.
*/
get vFlexInline() {
return this._vFlexInline;
}
set vFlexInline(value) {
this._vFlexInline = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: column</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexCol() {
return this._vFlexCol;
}
set vFlexCol(value) {
this._vFlexCol = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: column-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexColReverse() {
return this._vFlexColReverse;
}
set vFlexColReverse(value) {
this._vFlexColReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: row</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexRow() {
return this._vFlexRow;
}
set vFlexRow(value) {
this._vFlexRow = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-direction: row-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexRowReverse() {
return this._vFlexRowReverse;
}
set vFlexRowReverse(value) {
this._vFlexRowReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: wrap</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexWrap() {
return this._vFlexWrap;
}
set vFlexWrap(value) {
this._vFlexWrap = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: wrap-reverse</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexWrapReverse() {
return this._vFlexWrapReverse;
}
set vFlexWrapReverse(value) {
this._vFlexWrapReverse = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-wrap: no-wrap</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vFlexNoWrap() {
return this._vFlexNoWrap;
}
set vFlexNoWrap(value) {
this._vFlexNoWrap = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-basis: <value></code>. <br>
* Accepts a string that should be in the form of a percentage or CSS unit. <br />
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexBasis() {
return this._vFlexBasis;
}
set vFlexBasis(value) {
this._vFlexBasis = value;
}
get hostFlexBasis() {
return this.vFlexBasis ? this.vFlexBasis : null;
}
/**
* Sets property <code>flex-grow: 1</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexGrow() {
return this._vFlexGrow;
}
set vFlexGrow(value) {
this._vFlexGrow = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-grow: 0</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexGrow0() {
return this._vFlexGrow0;
}
set vFlexGrow0(value) {
this._vFlexGrow0 = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-shrink: 1</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexShrink() {
return this._vFlexShrink;
}
set vFlexShrink(value) {
this._vFlexShrink = coerceBooleanProperty(value);
}
/**
* Sets property <code>flex-shrink: 0</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vFlexShrink0() {
return this._vFlexShrink0;
}
set vFlexShrink0(value) {
this._vFlexShrink0 = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentCenter() {
return this._vAlignContentCenter;
}
set vAlignContentCenter(value) {
this._vAlignContentCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentStart() {
return this._vAlignContentStart;
}
set vAlignContentStart(value) {
this._vAlignContentStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentEnd() {
return this._vAlignContentEnd;
}
set vAlignContentEnd(value) {
this._vAlignContentEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-between</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentBetween() {
return this._vAlignContentBetween;
}
set vAlignContentBetween(value) {
this._vAlignContentBetween = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-around</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentAround() {
return this._vAlignContentAround;
}
set vAlignContentAround(value) {
this._vAlignContentAround = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: space-evenly</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignContentEvenly() {
return this._vAlignContentEvenly;
}
set vAlignContentEvenly(value) {
this._vAlignContentEvenly = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsCenter() {
return this._vAlignItemsCenter;
}
set vAlignItemsCenter(value) {
this._vAlignItemsCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsStart() {
return this._vAlignItemsStart;
}
set vAlignItemsStart(value) {
this._vAlignItemsStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsEnd() {
return this._vAlignItemsEnd;
}
set vAlignItemsEnd(value) {
this._vAlignItemsEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-items: baseline</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsBaseline() {
return this._vAlignItemsBaseline;
}
set vAlignItemsBaseline(value) {
this._vAlignItemsBaseline = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-items: stretch</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vAlignItemsStretch() {
return this._vAlignItemsStretch;
}
set vAlignItemsStretch(value) {
this._vAlignItemsStretch = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: center</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfCenter() {
return this._vAlignSelfCenter;
}
set vAlignSelfCenter(value) {
this._vAlignSelfCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: start</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfStart() {
return this._vAlignSelfStart;
}
set vAlignSelfStart(value) {
this._vAlignSelfStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: end</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfEnd() {
return this._vAlignSelfEnd;
}
set vAlignSelfEnd(value) {
this._vAlignSelfEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: baseline</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfBaseline() {
return this._vAlignSelfBaseline;
}
set vAlignSelfBaseline(value) {
this._vAlignSelfBaseline = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: stretch</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfStretch() {
return this._vAlignSelfStretch;
}
set vAlignSelfStretch(value) {
this._vAlignSelfStretch = coerceBooleanProperty(value);
}
/**
* Sets property <code>align-self: auto</code>. <br>
* This property is also a selector and can be used by itself on the <i>child</i> of a flex element.
*/
get vAlignSelfAuto() {
return this._vAlignSelfAuto;
}
set vAlignSelfAuto(value) {
this._vAlignSelfAuto = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: center</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentCenter() {
return this._vJustifyContentCenter;
}
set vJustifyContentCenter(value) {
this._vJustifyContentCenter = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: start</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentStart() {
return this._vJustifyContentStart;
}
set vJustifyContentStart(value) {
this._vJustifyContentStart = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: end</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentEnd() {
return this._vJustifyContentEnd;
}
set vJustifyContentEnd(value) {
this._vJustifyContentEnd = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-between</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentBetween() {
return this._vJustifyContentBetween;
}
set vJustifyContentBetween(value) {
this._vJustifyContentBetween = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-around</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentAround() {
return this._vJustifyContentAround;
}
set vJustifyContentAround(value) {
this._vJustifyContentAround = coerceBooleanProperty(value);
}
/**
* Sets property <code>justify-content: space-evenly</code>. <br>
* This property should be used alongside a FlexDirective selector (see selectors above).
*/
get vJustifyContentEvenly() {
return this._vJustifyContentEvenly;
}
set vJustifyContentEvenly(value) {
this._vJustifyContentEvenly = coerceBooleanProperty(value);
}
/**
* Sets property <code>gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vGap() {
return this._vGap;
}
set vGap(value) {
this._vGap = value;
}
/**
* Sets property <code>column-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vColGap() {
return this._vColGap;
}
set vColGap(value) {
this._vColGap = value;
}
/**
* Sets property <code>row-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties.
*/
get vRowGap() {
return this._vRowGap;
}
set vRowGap(value) {
this._vRowGap = value;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FlexDirective, isStandalone: true, selector: "[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], \n [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], \n [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],", inputs: { vFlex: "vFlex", vFlexInline: "vFlexInline", vFlexCol: "vFlexCol", vFlexColReverse: "vFlexColReverse", vFlexRow: "vFlexRow", vFlexRowReverse: "vFlexRowReverse", vFlexWrap: "vFlexWrap", vFlexWrapReverse: "vFlexWrapReverse", vFlexNoWrap: "vFlexNoWrap", vFlexBasis: "vFlexBasis", vFlexGrow: "vFlexGrow", vFlexGrow0: "vFlexGrow0", vFlexShrink: "vFlexShrink", vFlexShrink0: "vFlexShrink0", vAlignContentCenter: "vAlignContentCenter", vAlignContentStart: "vAlignContentStart", vAlignContentEnd: "vAlignContentEnd", vAlignContentBetween: "vAlignContentBetween", vAlignContentAround: "vAlignContentAround", vAlignContentEvenly: "vAlignContentEvenly", vAlignItemsCenter: "vAlignItemsCenter", vAlignItemsStart: "vAlignItemsStart", vAlignItemsEnd: "vAlignItemsEnd", vAlignItemsBaseline: "vAlignItemsBaseline", vAlignItemsStretch: "vAlignItemsStretch", vAlignSelfCenter: "vAlignSelfCenter", vAlignSelfStart: "vAlignSelfStart", vAlignSelfEnd: "vAlignSelfEnd", vAlignSelfBaseline: "vAlignSelfBaseline", vAlignSelfStretch: "vAlignSelfStretch", vAlignSelfAuto: "vAlignSelfAuto", vJustifyContentCenter: "vJustifyContentCenter", vJustifyContentStart: "vJustifyContentStart", vJustifyContentEnd: "vJustifyContentEnd", vJustifyContentBetween: "vJustifyContentBetween", vJustifyContentAround: "vJustifyContentAround", vJustifyContentEvenly: "vJustifyContentEvenly", vGap: "vGap", vColGap: "vColGap", vRowGap: "vRowGap" }, host: { properties: { "class": "this.hostClasses", "style.flex-basis": "this.hostFlexBasis" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: `[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0],
[vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd],
[vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],`
}]
}], propDecorators: { hostClasses: [{
type: HostBinding,
args: ['class']
}], vFlex: [{
type: Input
}], vFlexInline: [{
type: Input
}], vFlexCol: [{
type: Input
}], vFlexColReverse: [{
type: Input
}], vFlexRow: [{
type: Input
}], vFlexRowReverse: [{
type: Input
}], vFlexWrap: [{
type: Input
}], vFlexWrapReverse: [{
type: Input
}], vFlexNoWrap: [{
type: Input
}], vFlexBasis: [{
type: Input
}], hostFlexBasis: [{
type: HostBinding,
args: ['style.flex-basis']
}], vFlexGrow: [{
type: Input
}], vFlexGrow0: [{
type: Input
}], vFlexShrink: [{
type: Input
}], vFlexShrink0: [{
type: Input
}], vAlignContentCenter: [{
type: Input
}], vAlignContentStart: [{
type: Input
}], vAlignContentEnd: [{
type: Input
}], vAlignContentBetween: [{
type: Input
}], vAlignContentAround: [{
type: Input
}], vAlignContentEvenly: [{
type: Input
}], vAlignItemsCenter: [{
type: Input
}], vAlignItemsStart: [{
type: Input
}], vAlignItemsEnd: [{
type: Input
}], vAlignItemsBaseline: [{
type: Input
}], vAlignItemsStretch: [{
type: Input
}], vAlignSelfCenter: [{
type: Input
}], vAlignSelfStart: [{
type: Input
}], vAlignSelfEnd: [{
type: Input
}], vAlignSelfBaseline: [{
type: Input
}], vAlignSelfStretch: [{
type: Input
}], vAlignSelfAuto: [{
type: Input
}], vJustifyContentCenter: [{
type: Input
}], vJustifyContentStart: [{
type: Input
}], vJustifyContentEnd: [{
type: Input
}], vJustifyContentBetween: [{
type: Input
}], vJustifyContentAround: [{
type: Input
}], vJustifyContentEvenly: [{
type: Input
}], vGap: [{
type: Input
}], vColGap: [{
type: Input
}], vRowGap: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvZmxleC9mbGV4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQUUscUJBQXFCLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVM5RCxNQUFNLE9BQU8sYUFBYTtJQUN4QixJQUNJLFdBQVc7UUFDYixPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEQsSUFB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ZUYsVUFBVTtzQkFEYixLQUFLO2dCQVNGLGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQVUzQixTQUFTO3NCQURaLEtBQUs7Z0JBY0YsVUFBVTtzQkFEYixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFjRixZQUFZO3NCQURmLEtBQUs7Z0JBY0YsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWNGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFjRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBY0Ysb0JBQW9CO3NCQUR2QixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFjRixjQUFjO3NCQURqQixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBY0YsYUFBYTtzQkFEaEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBY0YscUJBQXFCO3NCQUR4QixLQUFLO2dCQWNGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0Ysc0JBQXNCO3NCQUR6QixLQUFLO2dCQWNGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFjRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBYUYsSUFBSTtzQkFEUCxLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFhRixPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3BhY2luZ1Byb3BlcnRpZXMgfSBmcm9tICcuLi9ub3ZhLWxpYi5jb25zdGFudHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IGBbdkZsZXhdLCBbdkZsZXhJbmxpbmVdLCBbdkdhcF0sIFt2RmxleEdyb3ddLCBbdkZsZXhHcm93MF0sIFxuICBbdkZsZXhTaHJpbmtdLCBbdkZsZXhTaHJpbmswXSwgW3ZGbGV4QmFzaXNdLCBbdkFsaWduU2VsZlN0YXJ0XSwgW3ZBbGlnblNlbGZFbmRdLCBcbiAgW3ZBbGlnblNlbGZDZW50ZXJdLCBbdkFsaWduU2VsZlN0cmV0Y2hdLCBbdkFsaWduU2VsZkF1dG9dLCBbdkFsaWduU2VsZkJhc2VsaW5lXSxgXG59KVxuZXhwb3J0IGNsYXNzIEZsZXhEaXJlY3RpdmUge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMudkZsZXggPyAodGhpcy52RmxleENvbCA/ICd2LWZsZXgnIDogJ3YtZmxleCB2LWZsZXgtcm93JykgOiBudWxsLFxuICAgICAgdGhpcy52RmxleElubGluZSA/ICd2LWZsZXgtaW5saW5lJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Q29sID8gJ3YtZmxleC1jb2wnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhDb2xSZXZlcnNlID8gJ3YtZmxleC1jb2wtcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFJvdyA/ICd2LWZsZXgtcm93JyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Um93UmV2ZXJzZSA/ICd2LWZsZXgtcm93LXJldmVyc2UnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhXcmFwID8gJ3YtZmxleC13cmFwJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4V3JhcFJldmVyc2UgPyAndi1mbGV4LXdyYXAtcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleE5vV3JhcCA/ICd2LWZsZXgtbm93cmFwJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4R3JvdyA/ICd2LWZsZXgtZ3JvdycgOiBudWxsLFxuICAgICAgdGhpcy52RmxleEdyb3cwID8gJ3YtZmxleC1ncm93LTAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhTaHJpbmsgPyAndi1mbGV4LXNocmluaycgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFNocmluazAgPyAndi1mbGV4LXNocmluay0wJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRDZW50ZXIgPyAndi1hbGlnbi1jb250ZW50LWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50U3RhcnQgPyAndi1hbGlnbi1jb250ZW50LXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRFbmQgPyAndi1hbGlnbi1jb250ZW50LWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50QmV0d2VlbiA/ICd2LWFsaWduLWNvbnRlbnQtYmV0d2VlbicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50QXJvdW5kID8gJ3YtYWxpZ24tY29udGVudC1hcm91bmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudEV2ZW5seSA/ICd2LWFsaWduLWNvbnRlbnQtZXZlbmx5JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zU3RhcnQgPyAndi1hbGlnbi1pdGVtcy1zdGFydCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0VuZCA/ICd2LWFsaWduLWl0ZW1zLWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0NlbnRlciA/ICd2LWFsaWduLWl0ZW1zLWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0Jhc2VsaW5lID8gJ3YtYWxpZ24taXRlbXMtYmFzZWxpbmUnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduSXRlbXNTdHJldGNoID8gJ3YtYWxpZ24taXRlbXMtc3RyZXRjaCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmU3RhcnQgPyAndi1hbGlnbi1zZWxmLXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZFbmQgPyAndi1hbGlnbi1zZWxmLWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQ2VudGVyID8gJ3YtYWxpZ24tc2VsZi1jZW50ZXInIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduU2VsZkJhc2VsaW5lID8gJ3YtYWxpZ24tc2VsZi1iYXNlbGluZScgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmU3RyZXRjaCA/ICd2LWFsaWduLXNlbGYtc3RyZXRjaCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQXV0byA/ICd2LWFsaWduLXNlbGYtYXV0bycgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRTdGFydCA/ICd2LWp1c3RpZnktY29udGVudC1zdGFydCcgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRFbmQgPyAndi1qdXN0aWZ5LWNvbnRlbnQtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudENlbnRlciA/ICd2LWp1c3RpZnktY29udGVudC1jZW50ZXInIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50QmV0d2VlbiA/ICd2LWp1c3RpZnktY29udGVudC1iZXR3ZWVuJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudEFyb3VuZCA/ICd2LWp1c3RpZnktY29udGVudC1hcm91bmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50RXZlbmx5ID8gJ3YtanVzdGlmeS1jb250ZW50LWV2ZW5seScgOiBudWxsLFxuICAgICAgdGhpcy52R2FwID8gYHYtZmxleCB2LWdhcC0ke3RoaXMudkdhcH1gIDogbnVsbCwgLy8gdkdhcD1cIjRcIlxuICAgICAgdGhpcy52Q29sR2FwID8gYHYtY29sLWdhcC0ke3RoaXMudkNvbEdhcH1gIDogbnVsbCwgLy8gdkdhcD1cIjRcIlxuICAgICAgdGhpcy52Um93R2FwID8gYHYtcm93LWdhcC0ke3RoaXMudlJvd0dhcH1gIDogbnVsbCAvLyB2R2FwPVwiNFwiXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5kaXNwbGF5OiBmbGV4PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleDtcbiAgfVxuICBzZXQgdkZsZXgodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXg6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZGlzcGxheTogaW5saW5lLWZsZXg8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4SW5saW5lO1xuICB9XG4gIHNldCB2RmxleElubGluZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhJbmxpbmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleElubGluZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogY29sdW1uPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Q29sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleENvbDtcbiAgfVxuICBzZXQgdkZsZXhDb2wodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Q29sID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhDb2w6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Q29sUmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhDb2xSZXZlcnNlO1xuICB9XG4gIHNldCB2RmxleENvbFJldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Q29sUmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Q29sUmV2ZXJzZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogcm93PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Um93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFJvdztcbiAgfVxuICBzZXQgdkZsZXhSb3codmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Um93ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhSb3c6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Um93UmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhSb3dSZXZlcnNlO1xuICB9XG4gIHNldCB2RmxleFJvd1JldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Um93UmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Um93UmV2ZXJzZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXdyYXA6IHdyYXA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhXcmFwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFdyYXA7XG4gIH1cbiAgc2V0IHZGbGV4V3JhcCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhXcmFwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhXcmFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogd3JhcC1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4V3JhcFJldmVyc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4V3JhcFJldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4V3JhcFJldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4V3JhcFJldmVyc2UgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFdyYXBSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogbm8td3JhcDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBhbG9uZ3NpZGUgYSBGbGV4RGlyZWN0aXZlIHNlbGVjdG9yIChzZWUgc2VsZWN0b3JzIGFib3ZlKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleE5vV3JhcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhOb1dyYXA7XG4gIH1cbiAgc2V0IHZGbGV4Tm9XcmFwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleE5vV3JhcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Tm9XcmFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtYmFzaXM6ICZsdDt2YWx1ZSZndDs8L2NvZGU+LiA8YnI+XG4gICAqIEFjY2VwdHMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgYSBwZXJjZW50YWdlIG9yIENTUyB1bml0LiA8YnIgLz5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4QmFzaXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhCYXNpcztcbiAgfVxuICBzZXQgdkZsZXhCYXNpcyh2YWx1ZSkge1xuICAgIHRoaXMuX3ZGbGV4QmFzaXMgPSB2YWx1ZTtcbiAgfVxuICBfdkZsZXhCYXNpczogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmZsZXgtYmFzaXMnKVxuICBnZXQgaG9zdEZsZXhCYXNpcygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52RmxleEJhc2lzID8gdGhpcy52RmxleEJhc2lzIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZ3JvdzogMTwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4R3JvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhHcm93O1xuICB9XG4gIHNldCB2RmxleEdyb3codmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4R3JvdyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4R3JvdzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWdyb3c6IDA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gdGhlIDxpPmNoaWxkPC9pPiBvZiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleEdyb3cwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleEdyb3cwO1xuICB9XG4gIHNldCB2RmxleEdyb3cwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleEdyb3cwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhHcm93MDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXNocmluazogMTwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4U2hyaW5rKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFNocmluaztcbiAgfVxuICBzZXQgdkZsZXhTaHJpbmsodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4U2hyaW5rID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhTaHJpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1zaHJpbms6IDA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gdGhlIDxpPmNoaWxkPC9pPiBvZiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleFNocmluazAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4U2hyaW5rMDtcbiAgfVxuICBzZXQgdkZsZXhTaHJpbmswKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleFNocmluazAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFNocmluazA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+YWxpZ24tY29udGVudDogY2VudGVyPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZBbGlnbkNvbnRlbnRDZW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZBbGlnbkNvbnRlbnRDZW50ZXI7XG4gIH1cbiAgc2V0IHZBbGlnbkNvbnRlbnRDZW50ZXIodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZBbGlnbkNvbnRlbnRDZW50ZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92QWxpZ25Db250ZW50Q2VudGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmFsaWduLWNvbnRlbnQ6IHN0YXJ0PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZBbGlnbkNvbnRlbnRTdGFydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkFsaWduQ29udGVudFN0YXJ0O1xuICB9XG4gIHNldCB2QWxpZ25Db250ZW50U3RhcnQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZBbGlnbkNvbnRlbnRTdGFydCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZBbGln