com.phloxui
Version:
PhloxUI Ng2+ Framework
207 lines (206 loc) • 26 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
// unsupported: template constraints.
/**
* <p style="text-indent: 2em;">
* An interface for component class having navigation mechanism. For example, a menu bar having
* menu items to navigate through each page should implement this interface.
* </p>
*
* \@typeparam T A type of <code>navigatee</code> item can be navigated by this <code>navigator</code>.
*
* @author shiorin, tee4cute
* @see [[INavigatee]]
* @record
* @template T
*/
export function INavigator() { }
function INavigator_tsickle_Closure_declarations() {
/**
* <p style="text-indent: 1em;">
* Get <code>navigatee</code> ([[INavigatee]]) items can be navigated by this <code>navigator</code>.
* </p>
*
* \@return An array of <code>navigatee</code> ([[INavigatee]]) items can be navigated by this <code>navigator</code>.
* @type {?}
*/
INavigator.prototype.getItems;
/**
* <p style="text-indent: 1em;">
* Get number of <code>navigatee</code> ([[INavigatee]]) items can be navigated by this <code>navigator</code>.
* This must be the same value as [[getItems]]'s length.
* </p>
*
* \@return The <code>navigatee</code> ([[INavigatee]]) item count.
* @type {?}
*/
INavigator.prototype.getItemCount;
/**
* <p style="text-indent: 1em;">
* Get current active <code>navigatee</code> ([[INavigatee]]) item. In most scenarios, this method should return the item
* representing the component (page) being displayed by this <code>navigator</code>.
* </p>
*
* \@return The current active <code>navigatee</code> ([[INavigatee]]) item being displayed by this <code>navigator</code>.
* Returns <code>null</code> if there is no current active item.
* @type {?}
*/
INavigator.prototype.getActiveItem;
/**
* <p style="text-indent: 1em;">
* Get current active <code>navigatee</code> ([[INavigatee]]) item's index. The value returned from this method must be an
* index of array returning from method [[getItems]].
* </p>
*
* \@return The index of <code>navigatee</code> ([[INavigatee]]) item currently active. Returns <code>-1</code> if there is no
* current active item.
* @type {?}
*/
INavigator.prototype.getActiveIndex;
/**
* <p style="text-indent: 1em;">
* Find the index of the given <code>navigatee</code> <code><b>item</b></code> in the items array returned from method [[getItems]].
* </p>
*
* \@param item The <code>navigatee</code> item to find the index.
* \@return The index of the given <code><b>item</b></code>. Returns <code>-1</code> if not found.
* @type {?}
*/
INavigator.prototype.getItemIndex;
/**
* <p style="text-indent: 1em;">
* Find the index of <code>navigatee</code> item having <code>item name</code> ([[INavigatee.getName]]) matches the <code><b>name</b></code>
* passed as a parameter.
* </p>
*
* \@param name The name of <code>navigatee</code> item to find the index.
* \@return The index of the <code>navigatee</code> item having <code>item name</code> ([[INavigatee.getName]]) matches the <code><b>name</b></code>
* passed as a parameter. Returns <code>-1</code> if not found.
* @type {?}
*/
INavigator.prototype.getItemIndexByName;
/**
* <p style="text-indent: 1em;">
* Get the <code>navigatee</code> item ([[INavigatee]]) by the given <code><b>idx</b></code>.
* </p>
*
* \@param idx The <code>navigatee</code> item array index (starting from <code>0</code>).
* \@return The <code>navigatee</code> item ([[INavigatee]]) at the specified <code><b>idx</b></code>. If the specified <code><b>idx</b></code> is
* out of bound, this method will returns <code>null</code> without throwing any exceptions.
* @type {?}
*/
INavigator.prototype.getItemByIndex;
/**
* <p style="text-indent: 1em;">
* Get the <code>navigatee</code> item ([[INavigatee]]) by the given item <code><b>name</b></code>.
* </p>
*
* \@param name The name of <code>navigatee</code> item.
* \@return The <code>navigatee</code> item having the name ([[INavigatee.getName]]) matches the <code><b>name</b></code> passed as a parameter.
* Returns <code>null</code> if not found.
* @type {?}
*/
INavigator.prototype.getItemByName;
/**
* <p style="text-indent: 1em;">
* Set <code>navigatee</code> items ([[INavigatee]]) into this <code>navigator</code>.
* </p>
*
* \@param items The <code>navigatee</code> items ([[INavigatee]]) to be set into this <code>navigator</code>.
* @type {?}
*/
INavigator.prototype.setItems;
/**
* <p style="text-indent: 1em;">
* Add a new <code>navigatee</code> <code><b>item</b></code> ([[INavigatee]]) into this <code>navigator</code>. This method will check that there already is the
* given <code><b>item</b></code> in this <code>navigator</code> or not. If yes, the <code><b>item</b></code> will not be added and this method
* will return <code>false</code>.
* </p>
*
* \@param item A new <code>navigatee</code> item ([[INavigatee]]) to be added into this <code>navigator</code>.
* \@return Returns <code>true</code> if the given <code><b>item</b></code> is newly added into this <code>navigator</code>. Otherwise, returns
* <code>false</code>.
* @type {?}
*/
INavigator.prototype.addItem;
/**
* <p style="text-indent: 1em;">
* Remove the given <code>navigatee</code> <code><b>item</b></code> ([[INavigatee]]) from this <code>navigator</code>. If the given <code><b>item</b></code> is
* not currently in this <code>navigator</code>, this method will do nothing and return <code>false</code>.
* </p>
*
* \@param item The <code>navigatee</code> item to be removed from this <code>navigator</code>.
* \@return Returns <code>true</code> if the given <code><b>item</b></code> is in this <code>navigator</code> and successfully removed. Otherwise, returns
* <code>false</code>.
* @type {?}
*/
INavigator.prototype.removeItem;
/**
* <p style="text-indent: 1em;">
* To check that the given <code>navigatee</code> <code><b>item</b></code> ([[INavigatee]]) is currently in this <code>navigator</code> or not.
* </p>
*
* \@param item The <code>navigatee</code> item to be checked.
* \@return Returns <code>true</code> if the given <code><b>item</b></code> is currently in this <code>navigator</code>. Otherwise, returns <code>false</code>.
* @type {?}
*/
INavigator.prototype.containsItem;
/**
* <p style="text-indent: 1em;">
* Navigate this <code>navigator</code> to the given <code><b>item</b></code> ([[INavigatee]]). This method returns <code>Promise</code> to allow the navigation to be
* asynchronous. If the <code><b>item</b></code> is not in this <code>navigator</code>, this method will suddenly return resolved <code>Promise</code> having result value
* <code>"false"</code>. Otherwise, it'll return a <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. The
* navigated-to <code><b>item</b></code> will be set <code>active</code> flag to <code>true</code> and all other <code>navigatee</code> items in this <code>navigator</code>
* will be set <code>active</code> flag to <code>false</code>.
* </p>
*
* \@param item The <code>navigatee</code> item to be navigated to.
* \@param options The <code>options</code> object used for the navigation. This will depend on each navigator implementation.
* \@return A <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. If the given <code><b>item</b></code> is not
* in this <code>navigator</code>, this method will return a resolved <code>Promise</code> with result value <code>"false"</code>.
* @type {?}
*/
INavigator.prototype.navigateTo;
/**
* <p style="text-indent: 1em;">
* Navigate this <code>navigator</code> to the given <code>navigatee</code> item <code><b>idx</b></code>. This method returns <code>Promise</code> to allow the navigation to be
* asynchronous. If the given <code><b>idx</b></code> is out of bound, this method will suddenly return resolved <code>Promise</code> having result value <code>"false"</code>.
* Otherwise, it'll return a <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. The navigated-to <code><b>item</b></code>
* will be set <code>active</code> flag to <code>true</code> and all other <code>navigatee</code> items in this <code>navigator</code> will be set <code>active</code> flag to
* <code>false</code>.
* </p>
*
* \@param idx The <code>navigatee</code> item <code><b>idx</b></code> to be navigated to.
* \@param options The <code>options</code> object used for the navigation. This will depend on each navigator implementation.
* \@return A <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. If the given <code><b>idx</b></code> is out of
* bound, this method will return a resolved <code>Promise</code> with result value <code>"false"</code>.
* @type {?}
*/
INavigator.prototype.navigateToIndex;
/**
* <p style="text-indent: 1em;">
* Navigate this <code>navigator</code> to the given <code>navigatee</code> item <code><b>name</b></code>. This method returns <code>Promise</code> to allow the navigation to be
* asynchronous. If the given item <code><b>name</b></code> does not exist, this method will suddenly return resolved <code>Promise</code> having result value <code>"false"</code>.
* Otherwise, it'll return a <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. The navigated-to <code><b>item</b></code>
* will be set <code>active</code> flag to <code>true</code> and all other <code>navigatee</code> items in this <code>navigator</code> will be set <code>active</code> flag to
* <code>false</code>.
* </p>
*
* \@param name The <code>navigatee</code> item <code><b>name</b></code> to be navigated to.
* \@param options The <code>options</code> object used for the navigation. This will depend on each navigator implementation.
* \@return A <code>Promise</code> which will be resolved when the navigation is done with result value <code>"true"</code>. If the given item <code><b>name</b></code> does not
* exist, this method will return a resolved <code>Promise</code> with result value <code>"false"</code>.
* @type {?}
*/
INavigator.prototype.navigateToName;
/**
* <p style="text-indent: 1em;">
* Reset this <code>navigator</code> to the original state.
* </p>
* @type {?}
*/
INavigator.prototype.reset;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSU5hdmlnYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9JTmF2aWdhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJTmF2aWdhdGVlIH0gZnJvbSAnLi9JTmF2aWdhdGVlJztcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBbiBpbnRlcmZhY2UgZm9yIGNvbXBvbmVudCBjbGFzcyBoYXZpbmcgbmF2aWdhdGlvbiBtZWNoYW5pc20uIEZvciBleGFtcGxlLCBhIG1lbnUgYmFyIGhhdmluZ1xuICogbWVudSBpdGVtcyB0byBuYXZpZ2F0ZSB0aHJvdWdoIGVhY2ggcGFnZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICogPC9wPlxuICpcbiAqIEB0eXBlcGFyYW0gVCBBIHR5cGUgb2YgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIGNhbiBiZSBuYXZpZ2F0ZWQgYnkgdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LlxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqIEBzZWUgW1tJTmF2aWdhdGVlXV1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTmF2aWdhdG9yPFQgZXh0ZW5kcyBJTmF2aWdhdGVlPiB7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogR2V0IDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gKFtbSU5hdmlnYXRlZV1dKSBpdGVtcyBjYW4gYmUgbmF2aWdhdGVkIGJ5IHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPi5cbiAgICAgKiA8L3A+XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IChbW0lOYXZpZ2F0ZWVdXSkgaXRlbXMgY2FuIGJlIG5hdmlnYXRlZCBieSB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4uXG4gICAgICovXG4gICAgZ2V0SXRlbXMoKTogVFtdO1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIEdldCBudW1iZXIgb2YgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiAoW1tJTmF2aWdhdGVlXV0pIGl0ZW1zIGNhbiBiZSBuYXZpZ2F0ZWQgYnkgdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LlxuICAgICAqIFRoaXMgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZSBhcyBbW2dldEl0ZW1zXV0ncyBsZW5ndGguXG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gKFtbSU5hdmlnYXRlZV1dKSBpdGVtIGNvdW50LlxuICAgICAqL1xuICAgIGdldEl0ZW1Db3VudCgpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogR2V0IGN1cnJlbnQgYWN0aXZlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gKFtbSU5hdmlnYXRlZV1dKSBpdGVtLiBJbiBtb3N0IHNjZW5hcmlvcywgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgaXRlbVxuICAgICAqIHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50IChwYWdlKSBiZWluZyBkaXNwbGF5ZWQgYnkgdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGFjdGl2ZSA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IChbW0lOYXZpZ2F0ZWVdXSkgaXRlbSBiZWluZyBkaXNwbGF5ZWQgYnkgdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LlxuICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBhY3RpdmUgaXRlbS5cbiAgICAgKi9cbiAgICBnZXRBY3RpdmVJdGVtKCk6IFQ7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogR2V0IGN1cnJlbnQgYWN0aXZlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gKFtbSU5hdmlnYXRlZV1dKSBpdGVtJ3MgaW5kZXguIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIG11c3QgYmUgYW5cbiAgICAgKiBpbmRleCBvZiBhcnJheSByZXR1cm5pbmcgZnJvbSBtZXRob2QgW1tnZXRJdGVtc11dLlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IChbW0lOYXZpZ2F0ZWVdXSkgaXRlbSBjdXJyZW50bHkgYWN0aXZlLiBSZXR1cm5zIDxjb2RlPi0xPC9jb2RlPiBpZiB0aGVyZSBpcyBub1xuICAgICAqIGN1cnJlbnQgYWN0aXZlIGl0ZW0uXG4gICAgICovXG4gICAgZ2V0QWN0aXZlSW5kZXgoKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiBpbiB0aGUgaXRlbXMgYXJyYXkgcmV0dXJuZWQgZnJvbSBtZXRob2QgW1tnZXRJdGVtc11dLlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW0gdG8gZmluZCB0aGUgaW5kZXguXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBnaXZlbiA8Y29kZT48Yj5pdGVtPC9iPjwvY29kZT4uIFJldHVybnMgPGNvZGU+LTE8L2NvZGU+IGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBnZXRJdGVtSW5kZXgoaXRlbTogVCk6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICAgKiBGaW5kIHRoZSBpbmRleCBvZiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW0gaGF2aW5nIDxjb2RlPml0ZW0gbmFtZTwvY29kZT4gKFtbSU5hdmlnYXRlZS5nZXROYW1lXV0pIG1hdGNoZXMgdGhlIDxjb2RlPjxiPm5hbWU8L2I+PC9jb2RlPlxuICAgICAqIHBhc3NlZCBhcyBhIHBhcmFtZXRlci5cbiAgICAgKiA8L3A+XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW0gdG8gZmluZCB0aGUgaW5kZXguXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW0gaGF2aW5nIDxjb2RlPml0ZW0gbmFtZTwvY29kZT4gKFtbSU5hdmlnYXRlZS5nZXROYW1lXV0pIG1hdGNoZXMgdGhlIDxjb2RlPjxiPm5hbWU8L2I+PC9jb2RlPlxuICAgICAqIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4gUmV0dXJucyA8Y29kZT4tMTwvY29kZT4gaWYgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGdldEl0ZW1JbmRleEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogR2V0IHRoZSA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW0gKFtbSU5hdmlnYXRlZV1dKSBieSB0aGUgZ2l2ZW4gPGNvZGU+PGI+aWR4PC9iPjwvY29kZT4uXG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkeCBUaGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIGFycmF5IGluZGV4IChzdGFydGluZyBmcm9tIDxjb2RlPjA8L2NvZGU+KS5cbiAgICAgKiBAcmV0dXJucyBUaGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIChbW0lOYXZpZ2F0ZWVdXSkgYXQgdGhlIHNwZWNpZmllZCA8Y29kZT48Yj5pZHg8L2I+PC9jb2RlPi4gSWYgdGhlIHNwZWNpZmllZCA8Y29kZT48Yj5pZHg8L2I+PC9jb2RlPiBpc1xuICAgICAqIG91dCBvZiBib3VuZCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHdpdGhvdXQgdGhyb3dpbmcgYW55IGV4Y2VwdGlvbnMuXG4gICAgICovXG4gICAgZ2V0SXRlbUJ5SW5kZXgoaWR4OiBudW1iZXIpOiBUO1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIEdldCB0aGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIChbW0lOYXZpZ2F0ZWVdXSkgYnkgdGhlIGdpdmVuIGl0ZW0gPGNvZGU+PGI+bmFtZTwvYj48L2NvZGU+LlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIGhhdmluZyB0aGUgbmFtZSAoW1tJTmF2aWdhdGVlLmdldE5hbWVdXSkgbWF0Y2hlcyB0aGUgPGNvZGU+PGI+bmFtZTwvYj48L2NvZGU+IHBhc3NlZCBhcyBhIHBhcmFtZXRlci5cbiAgICAgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IFQ7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogU2V0IDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbXMgKFtbSU5hdmlnYXRlZV1dKSBpbnRvIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPi5cbiAgICAgKiA8L3A+XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbXMgKFtbSU5hdmlnYXRlZV1dKSB0byBiZSBzZXQgaW50byB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4uXG4gICAgICovXG4gICAgc2V0SXRlbXMoaXRlbXM6IFRbXSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogQWRkIGEgbmV3IDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+IChbW0lOYXZpZ2F0ZWVdXSkgaW50byB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4uIFRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgdGhhdCB0aGVyZSBhbHJlYWR5IGlzIHRoZVxuICAgICAqIGdpdmVuIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiBpbiB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4gb3Igbm90LiBJZiB5ZXMsIHRoZSA8Y29kZT48Yj5pdGVtPC9iPjwvY29kZT4gd2lsbCBub3QgYmUgYWRkZWQgYW5kIHRoaXMgbWV0aG9kXG4gICAgICogd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtIEEgbmV3IDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbSAoW1tJTmF2aWdhdGVlXV0pIHRvIGJlIGFkZGVkIGludG8gdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiBpcyBuZXdseSBhZGRlZCBpbnRvIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPi4gT3RoZXJ3aXNlLCByZXR1cm5zXG4gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LlxuICAgICAqL1xuICAgIGFkZEl0ZW0oaXRlbTogVCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiAoW1tJTmF2aWdhdGVlXV0pIGZyb20gdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LiBJZiB0aGUgZ2l2ZW4gPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+IGlzXG4gICAgICogbm90IGN1cnJlbnRseSBpbiB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4sIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBhbmQgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi5cbiAgICAgKiA8L3A+XG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4uXG4gICAgICogQHJldHVybnMgUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+IGlzIGluIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPiBhbmQgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuIE90aGVyd2lzZSwgcmV0dXJuc1xuICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi5cbiAgICAgKi9cbiAgICByZW1vdmVJdGVtKGl0ZW06IFQpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIFRvIGNoZWNrIHRoYXQgdGhlIGdpdmVuIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+IChbW0lOYXZpZ2F0ZWVdXSkgaXMgY3VycmVudGx5IGluIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPiBvciBub3QuXG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbSB0byBiZSBjaGVja2VkLlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiBpcyBjdXJyZW50bHkgaW4gdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+LiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuICAgICAqL1xuICAgIGNvbnRhaW5zSXRlbShpdGVtOiBUKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICAgKiBOYXZpZ2F0ZSB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4gdG8gdGhlIGdpdmVuIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiAoW1tJTmF2aWdhdGVlXV0pLiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPlByb21pc2U8L2NvZGU+IHRvIGFsbG93IHRoZSBuYXZpZ2F0aW9uIHRvIGJlXG4gICAgICogYXN5bmNocm9ub3VzLiBJZiB0aGUgPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+IGlzIG5vdCBpbiB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4sIHRoaXMgbWV0aG9kIHdpbGwgc3VkZGVubHkgcmV0dXJuIHJlc29sdmVkIDxjb2RlPlByb21pc2U8L2NvZGU+IGhhdmluZyByZXN1bHQgdmFsdWVcbiAgICAgKiA8Y29kZT5cImZhbHNlXCI8L2NvZGU+LiBPdGhlcndpc2UsIGl0J2xsIHJldHVybiBhIDxjb2RlPlByb21pc2U8L2NvZGU+IHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHdpdGggcmVzdWx0IHZhbHVlIDxjb2RlPlwidHJ1ZVwiPC9jb2RlPi4gVGhlXG4gICAgICogbmF2aWdhdGVkLXRvIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiB3aWxsIGJlIHNldCA8Y29kZT5hY3RpdmU8L2NvZGU+IGZsYWcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIGFsbCBvdGhlciA8Y29kZT5uYXZpZ2F0ZWU8L2NvZGU+IGl0ZW1zIGluIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPlxuICAgICAqIHdpbGwgYmUgc2V0IDxjb2RlPmFjdGl2ZTwvY29kZT4gZmxhZyB0byA8Y29kZT5mYWxzZTwvY29kZT4uXG4gICAgICogPC9wPlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbSB0byBiZSBuYXZpZ2F0ZWQgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG9iamVjdCB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbi4gVGhpcyB3aWxsIGRlcGVuZCBvbiBlYWNoIG5hdmlnYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIDxjb2RlPlByb21pc2U8L2NvZGU+IHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHdpdGggcmVzdWx0IHZhbHVlIDxjb2RlPlwidHJ1ZVwiPC9jb2RlPi4gSWYgdGhlIGdpdmVuIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPiBpcyBub3RcbiAgICAgKiBpbiB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcmVzb2x2ZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gd2l0aCByZXN1bHQgdmFsdWUgPGNvZGU+XCJmYWxzZVwiPC9jb2RlPi5cbiAgICAgKi9cbiAgICBuYXZpZ2F0ZVRvKGl0ZW06IFQsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIE5hdmlnYXRlIHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPiB0byB0aGUgZ2l2ZW4gPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIDxjb2RlPjxiPmlkeDwvYj48L2NvZGU+LiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPlByb21pc2U8L2NvZGU+IHRvIGFsbG93IHRoZSBuYXZpZ2F0aW9uIHRvIGJlXG4gICAgICogYXN5bmNocm9ub3VzLiBJZiB0aGUgZ2l2ZW4gPGNvZGU+PGI+aWR4PC9iPjwvY29kZT4gaXMgb3V0IG9mIGJvdW5kLCB0aGlzIG1ldGhvZCB3aWxsIHN1ZGRlbmx5IHJldHVybiByZXNvbHZlZCA8Y29kZT5Qcm9taXNlPC9jb2RlPiBoYXZpbmcgcmVzdWx0IHZhbHVlIDxjb2RlPlwiZmFsc2VcIjwvY29kZT4uXG4gICAgICogT3RoZXJ3aXNlLCBpdCdsbCByZXR1cm4gYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiB3aGljaCB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIG5hdmlnYXRpb24gaXMgZG9uZSB3aXRoIHJlc3VsdCB2YWx1ZSA8Y29kZT5cInRydWVcIjwvY29kZT4uIFRoZSBuYXZpZ2F0ZWQtdG8gPGNvZGU+PGI+aXRlbTwvYj48L2NvZGU+XG4gICAgICogd2lsbCBiZSBzZXQgPGNvZGU+YWN0aXZlPC9jb2RlPiBmbGFnIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBhbGwgb3RoZXIgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtcyBpbiB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4gd2lsbCBiZSBzZXQgPGNvZGU+YWN0aXZlPC9jb2RlPiBmbGFnIHRvXG4gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LlxuICAgICAqIDwvcD5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZHggVGhlIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbSA8Y29kZT48Yj5pZHg8L2I+PC9jb2RlPiB0byBiZSBuYXZpZ2F0ZWQgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG9iamVjdCB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbi4gVGhpcyB3aWxsIGRlcGVuZCBvbiBlYWNoIG5hdmlnYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIDxjb2RlPlByb21pc2U8L2NvZGU+IHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHdpdGggcmVzdWx0IHZhbHVlIDxjb2RlPlwidHJ1ZVwiPC9jb2RlPi4gSWYgdGhlIGdpdmVuIDxjb2RlPjxiPmlkeDwvYj48L2NvZGU+IGlzIG91dCBvZlxuICAgICAqIGJvdW5kLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHJlc29sdmVkIDxjb2RlPlByb21pc2U8L2NvZGU+IHdpdGggcmVzdWx0IHZhbHVlIDxjb2RlPlwiZmFsc2VcIjwvY29kZT4uXG4gICAgICovXG4gICAgbmF2aWdhdGVUb0luZGV4KGlkeDogbnVtYmVyLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICAgKiBOYXZpZ2F0ZSB0aGlzIDxjb2RlPm5hdmlnYXRvcjwvY29kZT4gdG8gdGhlIGdpdmVuIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbSA8Y29kZT48Yj5uYW1lPC9iPjwvY29kZT4uIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+UHJvbWlzZTwvY29kZT4gdG8gYWxsb3cgdGhlIG5hdmlnYXRpb24gdG8gYmVcbiAgICAgKiBhc3luY2hyb25vdXMuIElmIHRoZSBnaXZlbiBpdGVtIDxjb2RlPjxiPm5hbWU8L2I+PC9jb2RlPiBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBzdWRkZW5seSByZXR1cm4gcmVzb2x2ZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gaGF2aW5nIHJlc3VsdCB2YWx1ZSA8Y29kZT5cImZhbHNlXCI8L2NvZGU+LlxuICAgICAqIE90aGVyd2lzZSwgaXQnbGwgcmV0dXJuIGEgPGNvZGU+UHJvbWlzZTwvY29kZT4gd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmUgd2l0aCByZXN1bHQgdmFsdWUgPGNvZGU+XCJ0cnVlXCI8L2NvZGU+LiBUaGUgbmF2aWdhdGVkLXRvIDxjb2RlPjxiPml0ZW08L2I+PC9jb2RlPlxuICAgICAqIHdpbGwgYmUgc2V0IDxjb2RlPmFjdGl2ZTwvY29kZT4gZmxhZyB0byA8Y29kZT50cnVlPC9jb2RlPiBhbmQgYWxsIG90aGVyIDxjb2RlPm5hdmlnYXRlZTwvY29kZT4gaXRlbXMgaW4gdGhpcyA8Y29kZT5uYXZpZ2F0b3I8L2NvZGU+IHdpbGwgYmUgc2V0IDxjb2RlPmFjdGl2ZTwvY29kZT4gZmxhZyB0b1xuICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPi5cbiAgICAgKiA8L3A+XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgPGNvZGU+bmF2aWdhdGVlPC9jb2RlPiBpdGVtIDxjb2RlPjxiPm5hbWU8L2I+PC9jb2RlPiB0byBiZSBuYXZpZ2F0ZWQgdG8uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG9iamVjdCB1c2VkIGZvciB0aGUgbmF2aWdhdGlvbi4gVGhpcyB3aWxsIGRlcGVuZCBvbiBlYWNoIG5hdmlnYXRvciBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIDxjb2RlPlByb21pc2U8L2NvZGU+IHdoaWNoIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiBpcyBkb25lIHdpdGggcmVzdWx0IHZhbHVlIDxjb2RlPlwidHJ1ZVwiPC9jb2RlPi4gSWYgdGhlIGdpdmVuIGl0ZW0gPGNvZGU+PGI+bmFtZTwvYj48L2NvZGU+IGRvZXMgbm90XG4gICAgICogZXhpc3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcmVzb2x2ZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gd2l0aCByZXN1bHQgdmFsdWUgPGNvZGU+XCJmYWxzZVwiPC9jb2RlPi5cbiAgICAgKi9cbiAgICBuYXZpZ2F0ZVRvTmFtZShuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgICAqIFJlc2V0IHRoaXMgPGNvZGU+bmF2aWdhdG9yPC9jb2RlPiB0byB0aGUgb3JpZ2luYWwgc3RhdGUuXG4gICAgICogPC9wPlxuICAgICAqL1xuICAgIHJlc2V0KCk6IHZvaWQ7XG5cbn1cbiJdfQ==