@glimmer/component
Version:
Glimmer component library
181 lines (166 loc) • 19.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ARGS_SET = undefined;
var _env = require("@glimmer/env");
var _owner = require("./owner");
var _destroyables = require("./destroyables");
// SAFETY: this only holds because we *only* acces this when `DEBUG` is `true`.
// There is not a great way to connect that data in TS at present.
let ARGS_SET = exports.ARGS_SET = undefined;
if (_env.DEBUG) {
exports.ARGS_SET = ARGS_SET = new WeakMap();
}
/**
* The `Component` class defines an encapsulated UI element that is rendered to
* the DOM. A component is made up of a template and, optionally, this component
* object.
*
* ## Defining a Component
*
* To define a component, subclass `Component` and add your own properties,
* methods and lifecycle hooks:
*
* ```ts
* import Component from '@glimmer/component';
*
* export default class extends Component {
* }
* ```
*
* ## Lifecycle Hooks
*
* Lifecycle hooks allow you to respond to changes to a component, such as when
* it gets created, rendered, updated or destroyed. To add a lifecycle hook to a
* component, implement the hook as a method on your component subclass.
*
* For example, to be notified when Glimmer has rendered your component so you
* can attach a legacy jQuery plugin, implement the `didInsertElement()` method:
*
* ```ts
* import Component from '@glimmer/component';
*
* export default class extends Component {
* didInsertElement() {
* $(this.element).pickadate();
* }
* }
* ```
*
* ## Data for Templates
*
* `Component`s have two different kinds of data, or state, that can be
* displayed in templates:
*
* 1. Arguments
* 2. Properties
*
* Arguments are data that is passed in to a component from its parent
* component. For example, if I have a `UserGreeting` component, I can pass it
* a name and greeting to use:
*
* ```hbs
* <UserGreeting @name="Ricardo" @greeting="Olá" />
* ```
*
* Inside my `UserGreeting` template, I can access the `@name` and `@greeting`
* arguments that I've been given:
*
* ```hbs
* {{@greeting}}, {{@name}}!
* ```
*
* Arguments are also available inside my component:
*
* ```ts
* console.log(this.args.greeting); // prints "Olá"
* ```
*
* Properties, on the other hand, are internal to the component and declared in
* the class. You can use properties to store data that you want to show in the
* template, or pass to another component as an argument.
*
* ```ts
* import Component from '@glimmer/component';
*
* export default class extends Component {
* user = {
* name: 'Robbie'
* }
* }
* ```
*
* In the above example, we've defined a component with a `user` property that
* contains an object with its own `name` property.
*
* We can render that property in our template:
*
* ```hbs
* Hello, {{user.name}}!
* ```
*
* We can also take that property and pass it as an argument to the
* `UserGreeting` component we defined above:
*
* ```hbs
* <UserGreeting @greeting="Hello" @name={{user.name}} />
* ```
*
* ## Arguments vs. Properties
*
* Remember, arguments are data that was given to your component by its parent
* component, and properties are data your component has defined for itself.
*
* You can tell the difference between arguments and properties in templates
* because arguments always start with an `@` sign (think "A is for arguments"):
*
* ```hbs
* {{@firstName}}
* ```
*
* We know that `@firstName` came from the parent component, not the current
* component, because it starts with `@` and is therefore an argument.
*
* On the other hand, if we see:
*
* ```hbs
* {{name}}
* ```
*
* We know that `name` is a property on the component. If we want to know where
* the data is coming from, we can go look at our component class to find out.
*
* Inside the component itself, arguments always show up inside the component's
* `args` property. For example, if `{{@firstName}}` is `Tom` in the template,
* inside the component `this.args.firstName` would also be `Tom`.
*/
class BaseComponent {
/**
* Constructs a new component and assigns itself the passed properties. You
* should not construct new components yourself. Instead, Glimmer will
* instantiate new components automatically as it renders.
*
* @param owner
* @param args
*/
constructor(owner, args) {
if (_env.DEBUG && !(owner !== null && typeof owner === 'object' && ARGS_SET.has(args))) {
throw new Error(`You must pass both the owner and args to super() in your component: ${this.constructor.name}. You can pass them directly, or use ...arguments to pass all arguments through.`);
}
this.args = args;
(0, _owner.setOwner)(this, owner);
}
get isDestroying() {
return (0, _destroyables.isDestroying)(this);
}
get isDestroyed() {
return (0, _destroyables.isDestroyed)(this);
}
/**
* Called before the component has been removed from the DOM.
*/
willDestroy() {}
}
exports.default = BaseComponent;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBvbmVudC9hZGRvbi8tcHJpdmF0ZS9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQVdBO0FBQ0E7QUFDTyxJQUFJLFFBQW9CLFdBQXBCLFFBQW9CLFlBQXhCOztBQUVQLElBQUksVUFBSixFQUFXO0FBQ1QsVUFIUyxRQUdULEdBQUEsUUFBUSxHQUFHLElBQUksT0FBSixFQUFYO0FBQ0Q7QUEyRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkhjLE1BQU8sYUFBUCxDQUFvQjtBQUNoQzs7Ozs7Ozs7QUFRQSxFQUFBLFdBQUEsQ0FBWSxLQUFaLEVBQTRCLElBQTVCLEVBQXlDO0FBQ3ZDLFFBQUksY0FBUyxFQUFFLEtBQUssS0FBSyxJQUFWLElBQWtCLE9BQU8sS0FBUCxLQUFpQixRQUFuQyxJQUErQyxRQUFRLENBQUMsR0FBVCxDQUFhLElBQWIsQ0FBakQsQ0FBYixFQUFtRjtBQUNqRixZQUFNLElBQUksS0FBSixDQUNKLHVFQUNFLEtBQUssV0FBTCxDQUFpQixJQUNuQixrRkFISSxDQUFOO0FBS0Q7O0FBRUQsU0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLHlCQUFTLElBQVQsRUFBZSxLQUFmO0FBQ0Q7O0FBNEJELE1BQUksWUFBSixHQUFnQjtBQUNkLFdBQU8sZ0NBQWEsSUFBYixDQUFQO0FBQ0Q7O0FBRUQsTUFBSSxXQUFKLEdBQWU7QUFDYixXQUFPLCtCQUFZLElBQVosQ0FBUDtBQUNEO0FBRUQ7Ozs7O0FBR0EsRUFBQSxXQUFXLEdBQUEsQ0FBVzs7QUEzRFU7O2tCQUFiLGEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBzZXRPd25lciB9IGZyb20gJy4vb3duZXInO1xuaW1wb3J0IHsgaXNEZXN0cm95aW5nLCBpc0Rlc3Ryb3llZCB9IGZyb20gJy4vZGVzdHJveWFibGVzJztcblxuLy8gVGhpcyBwcm92aWRlcyBhIHR5cGUtc2FmZSBgV2Vha01hcGA6IHRoZSBnZXR0ZXIgYW5kIHNldHRlciBsaW5rIHRoZSBrZXkgdG8gYVxuLy8gc3BlY2lmaWMgdmFsdWUuIFRoaXMgaXMgaG93IGBXZWFrTWFwYHMgYWN0dWFsbHkgYmVoYXZlLCBidXQgdGhlIFRTIHR5cGVcbi8vIHN5c3RlbSBkb2VzIG5vdCAoeWV0ISkgaGF2ZSBhIGdvb2Qgd2F5IHRvIGNhcHR1cmUgdGhhdCBmb3IgdHlwZXMgbGlrZVxuLy8gYFdlYWtNYXBgIHdoZXJlIHRoZSB0eXBlIGlzIGdlbmVyaWMgb3ZlciBhbm90aGVyIGdlbmVyaWMgdHlwZSAoaGVyZSwgYEFyZ3NgKS5cbmludGVyZmFjZSBBcmdzU2V0TWFwIGV4dGVuZHMgV2Vha01hcDxBcmdzPHVua25vd24+LCBib29sZWFuPiB7XG4gIGdldDxTPihrZXk6IEFyZ3M8Uz4pOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBzZXQ8Uz4oa2V5OiBBcmdzPFM+LCB2YWx1ZTogYm9vbGVhbik6IHRoaXM7XG59XG5cbi8vIFNBRkVUWTogdGhpcyBvbmx5IGhvbGRzIGJlY2F1c2Ugd2UgKm9ubHkqIGFjY2VzIHRoaXMgd2hlbiBgREVCVUdgIGlzIGB0cnVlYC5cbi8vIFRoZXJlIGlzIG5vdCBhIGdyZWF0IHdheSB0byBjb25uZWN0IHRoYXQgZGF0YSBpbiBUUyBhdCBwcmVzZW50LlxuZXhwb3J0IGxldCBBUkdTX1NFVDogQXJnc1NldE1hcDtcblxuaWYgKERFQlVHKSB7XG4gIEFSR1NfU0VUID0gbmV3IFdlYWtNYXAoKSBhcyBBcmdzU2V0TWFwO1xufVxuXG4vLyAtLS0gVHlwZSB1dGlsaXRpZXMgZm9yIGNvbXBvbmVudCBzaWduYXR1cmVzIC0tLSAvL1xuLy8gVHlwZS1vbmx5IFwic3ltYm9sXCIgdG8gdXNlIHdpdGggYEVtcHR5T2JqZWN0YCBiZWxvdywgc28gdGhhdCBpdCBpcyAqbm90KlxuLy8gZXF1aXZhbGVudCB0byBhbiBlbXB0eSBpbnRlcmZhY2UuXG5kZWNsYXJlIGNvbnN0IEVtcHR5OiB1bmlxdWUgc3ltYm9sO1xuXG4vKipcbiAqIFRoaXMgcHJvdmlkZXMgdXMgYSB3YXkgdG8gaGF2ZSBhIFwiZmFsbGJhY2tcIiB3aGljaCByZXByZXNlbnRzIGFuIGVtcHR5IG9iamVjdCxcbiAqIHdpdGhvdXQgdGhlIGRvd25zaWRlcyBvZiBob3cgVFMgdHJlYXRzIGB7fWAuIFNwZWNpZmljYWxseTogdGhpcyB3aWxsXG4gKiBjb3JyZWN0bHkgbGV2ZXJhZ2UgXCJleGNlc3MgcHJvcGVydHkgY2hlY2tpbmdcIiBzbyB0aGF0LCBnaXZlbiBhIGNvbXBvbmVudFxuICogd2hpY2ggaGFzIG5vIG5hbWVkIGFyZ3MsIGlmIHNvbWVvbmUgaW52b2tlcyBpdCB3aXRoIGFueSBuYW1lZCBhcmdzLCB0aGV5IHdpbGxcbiAqIGdldCBhIHR5cGUgZXJyb3IuXG4gKlxuICogQGludGVybmFsIFRoaXMgaXMgZXhwb3J0ZWQgc28gZGVjbGFyYXRpb24gZW1pdCB3b3JrcyAoaWYgaXQgd2VyZSBub3QgZW1pdHRlZCxcbiAqICAgZGVjbGFyYXRpb25zIHdoaWNoIGZhbGwgYmFjayB0byBpdCB3b3VsZCBub3Qgd29yaykuIEl0IGlzICpub3QqIGludGVuZGVkIGZvclxuICogICBwdWJsaWMgdXNhZ2UsIGFuZCB0aGUgc3BlY2lmaWMgbWVjaGFuaWNzIGl0IHVzZXMgbWF5IGNoYW5nZSBhdCBhbnkgdGltZS5cbiAqICAgVGhlIGxvY2F0aW9uIG9mIHRoaXMgZXhwb3J0ICppcyogcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYmVjYXVzZSBtb3ZpbmcgaXRcbiAqICAgd2lsbCBicmVhayBleGlzdGluZyBkZWNsYXJhdGlvbnMsIGJ1dCBpcyBub3QgbGVnYWwgZm9yIGVuZCB1c2VycyB0byBpbXBvcnRcbiAqICAgdGhlbXNlbHZlcywgc28gKioqRE8gTk9UIFJFTFkgT04gSVQqKiouXG4gKi9cbmV4cG9ydCB0eXBlIEVtcHR5T2JqZWN0ID0geyBbRW1wdHldPzogdHJ1ZSB9O1xuXG50eXBlIEdldE9yRWxzZTxPYmosIEsgZXh0ZW5kcyBQcm9wZXJ0eUtleSwgRmFsbGJhY2s+ID0gT2JqIGV4dGVuZHMgeyBbS2V5IGluIEtdOiBpbmZlciBVIH1cbiAgPyBVXG4gIDogRmFsbGJhY2s7XG5cbi8qKiBHaXZlbiBhIHNpZ25hdHVyZSBgU2AsIGdldCBiYWNrIHRoZSBgQXJnc2AgdHlwZS4gKi9cbnR5cGUgQXJnc0ZvcjxTPiA9IFMgZXh0ZW5kcyB7IEFyZ3M6IGluZmVyIEFyZ3MgfVxuICA/IEFyZ3MgZXh0ZW5kcyB7IE5hbWVkPzogb2JqZWN0OyBQb3NpdGlvbmFsPzogdW5rbm93bltdIH0gLy8gQXJlIHRoZXkgbG9uZ2hhbmQgYWxyZWFkeT9cbiAgICA/IHtcbiAgICAgICAgTmFtZWQ6IEdldE9yRWxzZTxTWydBcmdzJ10sICdOYW1lZCcsIEVtcHR5T2JqZWN0PjtcbiAgICAgICAgUG9zaXRpb25hbDogR2V0T3JFbHNlPFNbJ0FyZ3MnXSwgJ1Bvc2l0aW9uYWwnLCBbXT47XG4gICAgICB9XG4gICAgOiB7IE5hbWVkOiBTWydBcmdzJ107IFBvc2l0aW9uYWw6IFtdIH1cbiAgOiB7IE5hbWVkOiBFbXB0eU9iamVjdDsgUG9zaXRpb25hbDogW10gfTtcblxudHlwZSBfRXhwYW5kU2lnbmF0dXJlPFQ+ID0ge1xuICBFbGVtZW50OiBHZXRPckVsc2U8VCwgJ0VsZW1lbnQnLCBudWxsPjtcbiAgQXJnczoga2V5b2YgVCBleHRlbmRzICdBcmdzJyB8ICdFbGVtZW50JyB8ICdCbG9ja3MnIC8vIElzIHRoaXMgYSBgU2lnbmF0dXJlYD9cbiAgICA/IEFyZ3NGb3I8VD4gLy8gVGhlbiB1c2UgYFNpZ25hdHVyZWAgYXJnc1xuICAgIDogeyBOYW1lZDogVDsgUG9zaXRpb25hbDogW10gfTsgLy8gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byBjbGFzc2ljIGBBcmdzYC5cbiAgQmxvY2tzOiBUIGV4dGVuZHMgeyBCbG9ja3M6IGluZmVyIEJsb2NrcyB9XG4gICAgPyB7XG4gICAgICAgIFtCbG9jayBpbiBrZXlvZiBCbG9ja3NdOiBCbG9ja3NbQmxvY2tdIGV4dGVuZHMgdW5rbm93bltdXG4gICAgICAgICAgPyB7IFBhcmFtczogeyBQb3NpdGlvbmFsOiBCbG9ja3NbQmxvY2tdIH0gfVxuICAgICAgICAgIDogQmxvY2tzW0Jsb2NrXTtcbiAgICAgIH1cbiAgICA6IEVtcHR5T2JqZWN0O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhbnkgYWxsb3dlZCBzaG9ydGhhbmQgZm9ybSBvZiBhIHNpZ25hdHVyZSwgZGVzdWdhcnMgaXQgdG8gaXRzIGZ1bGxcbiAqIGV4cGFuZGVkIHR5cGUuXG4gKlxuICogQGludGVybmFsIFRoaXMgaXMgb25seSBleHBvcnRlZCBzbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRpbmcgaXQgaW5cbiAqICAgW0dsaW50XShodHRwczovL2dpdGh1Yi5jb20vdHlwZWQtZW1iZXIvZ2xpbnQpIG9yIG90aGVyIHN1Y2ggdG9vbGluZy4gSXQgaXNcbiAqICAgKm5vdCogaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZSwgYW5kIHRoZSBzcGVjaWZpYyBtZWNoYW5pY3MgaXQgdXNlcyBtYXlcbiAqICAgY2hhbmdlIGF0IGFueSB0aW1lLiBBbHRob3VnaCB0aGUgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IGlzIHBhcnQgb2YgR2xpbW1lcidzXG4gKiAgIHB1YmxpYyBBUEkgdGhlIGV4aXN0ZW5jZSBhbmQgbWVjaGFuaWNzIG9mIHRoaXMgc3BlY2lmaWMgc3ltYm9sIGFyZSAqbm90KixcbiAqICAgc28gKioqRE8gTk9UIFJFTFkgT04gSVQqKiouXG4gKi9cbi8vIFRoZSBjb25kaXRpb25hbCB0eXBlIGhlcmUgaXMgYmVjYXVzZSBUUyBhcHBsaWVzIGNvbmRpdGlvbmFsIHR5cGVzXG4vLyBkaXN0cmlidXRpdmVseS4gVGhpcyBtZWFucyB0aGF0IGZvciB1bmlvbiB0eXBlcywgY2hlY2tzIGxpa2UgYGtleW9mIFRgIGdldFxuLy8gYWxsIHRoZSBrZXlzIGZyb20gYWxsIGVsZW1lbnRzIG9mIHRoZSB1bmlvbiwgaW5zdGVhZCBvZiBlbmRpbmcgdXAgYXMgYG5ldmVyYFxuLy8gYW5kIHRoZW4gYWx3YXlzIGZhbGxpbmcgaW50byB0aGUgYFNpZ25hdHVyZWAgcGF0aCBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0b1xuLy8gdGhlIGxlZ2FjeSBhcmdzIGhhbmRsaW5nIHBhdGguXG5leHBvcnQgdHlwZSBFeHBhbmRTaWduYXR1cmU8VD4gPSBUIGV4dGVuZHMgYW55ID8gX0V4cGFuZFNpZ25hdHVyZTxUPiA6IG5ldmVyO1xuXG4vKipcbiAqIEBpbnRlcm5hbCB3ZSB1c2UgdGhpcyB0eXBlIGZvciBjb252ZW5pZW5jZSBpbnRlcm5hbGx5OyBpbmZlcmVuY2UgbWVhbnMgdXNlcnNcbiAqICAgc2hvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvIG5hbWUgaXRcbiAqL1xuZXhwb3J0IHR5cGUgQXJnczxTPiA9IEV4cGFuZFNpZ25hdHVyZTxTPlsnQXJncyddWydOYW1lZCddO1xuXG4vKipcbiAqIFRoZSBgQ29tcG9uZW50YCBjbGFzcyBkZWZpbmVzIGFuIGVuY2Fwc3VsYXRlZCBVSSBlbGVtZW50IHRoYXQgaXMgcmVuZGVyZWQgdG9cbiAqIHRoZSBET00uIEEgY29tcG9uZW50IGlzIG1hZGUgdXAgb2YgYSB0ZW1wbGF0ZSBhbmQsIG9wdGlvbmFsbHksIHRoaXMgY29tcG9uZW50XG4gKiBvYmplY3QuXG4gKlxuICogIyMgRGVmaW5pbmcgYSBDb21wb25lbnRcbiAqXG4gKiBUbyBkZWZpbmUgYSBjb21wb25lbnQsIHN1YmNsYXNzIGBDb21wb25lbnRgIGFuZCBhZGQgeW91ciBvd24gcHJvcGVydGllcyxcbiAqIG1ldGhvZHMgYW5kIGxpZmVjeWNsZSBob29rczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IENvbXBvbmVudCBmcm9tICdAZ2xpbW1lci9jb21wb25lbnQnO1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIExpZmVjeWNsZSBIb29rc1xuICpcbiAqIExpZmVjeWNsZSBob29rcyBhbGxvdyB5b3UgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIHRvIGEgY29tcG9uZW50LCBzdWNoIGFzIHdoZW5cbiAqIGl0IGdldHMgY3JlYXRlZCwgcmVuZGVyZWQsIHVwZGF0ZWQgb3IgZGVzdHJveWVkLiBUbyBhZGQgYSBsaWZlY3ljbGUgaG9vayB0byBhXG4gKiBjb21wb25lbnQsIGltcGxlbWVudCB0aGUgaG9vayBhcyBhIG1ldGhvZCBvbiB5b3VyIGNvbXBvbmVudCBzdWJjbGFzcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdG8gYmUgbm90aWZpZWQgd2hlbiBHbGltbWVyIGhhcyByZW5kZXJlZCB5b3VyIGNvbXBvbmVudCBzbyB5b3VcbiAqIGNhbiBhdHRhY2ggYSBsZWdhY3kgalF1ZXJ5IHBsdWdpbiwgaW1wbGVtZW50IHRoZSBgZGlkSW5zZXJ0RWxlbWVudCgpYCBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBDb21wb25lbnQgZnJvbSAnQGdsaW1tZXIvY29tcG9uZW50JztcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIENvbXBvbmVudCB7XG4gKiAgIGRpZEluc2VydEVsZW1lbnQoKSB7XG4gKiAgICAgJCh0aGlzLmVsZW1lbnQpLnBpY2thZGF0ZSgpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBEYXRhIGZvciBUZW1wbGF0ZXNcbiAqXG4gKiBgQ29tcG9uZW50YHMgaGF2ZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIGRhdGEsIG9yIHN0YXRlLCB0aGF0IGNhbiBiZVxuICogZGlzcGxheWVkIGluIHRlbXBsYXRlczpcbiAqXG4gKiAxLiBBcmd1bWVudHNcbiAqIDIuIFByb3BlcnRpZXNcbiAqXG4gKiBBcmd1bWVudHMgYXJlIGRhdGEgdGhhdCBpcyBwYXNzZWQgaW4gdG8gYSBjb21wb25lbnQgZnJvbSBpdHMgcGFyZW50XG4gKiBjb21wb25lbnQuIEZvciBleGFtcGxlLCBpZiBJIGhhdmUgYSBgVXNlckdyZWV0aW5nYCBjb21wb25lbnQsIEkgY2FuIHBhc3MgaXRcbiAqIGEgbmFtZSBhbmQgZ3JlZXRpbmcgdG8gdXNlOlxuICpcbiAqIGBgYGhic1xuICogPFVzZXJHcmVldGluZyBAbmFtZT1cIlJpY2FyZG9cIiBAZ3JlZXRpbmc9XCJPbMOhXCIgLz5cbiAqIGBgYFxuICpcbiAqIEluc2lkZSBteSBgVXNlckdyZWV0aW5nYCB0ZW1wbGF0ZSwgSSBjYW4gYWNjZXNzIHRoZSBgQG5hbWVgIGFuZCBgQGdyZWV0aW5nYFxuICogYXJndW1lbnRzIHRoYXQgSSd2ZSBiZWVuIGdpdmVuOlxuICpcbiAqIGBgYGhic1xuICoge3tAZ3JlZXRpbmd9fSwge3tAbmFtZX19IVxuICogYGBgXG4gKlxuICogQXJndW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbnNpZGUgbXkgY29tcG9uZW50OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zb2xlLmxvZyh0aGlzLmFyZ3MuZ3JlZXRpbmcpOyAvLyBwcmludHMgXCJPbMOhXCJcbiAqIGBgYFxuICpcbiAqIFByb3BlcnRpZXMsIG9uIHRoZSBvdGhlciBoYW5kLCBhcmUgaW50ZXJuYWwgdG8gdGhlIGNvbXBvbmVudCBhbmQgZGVjbGFyZWQgaW5cbiAqIHRoZSBjbGFzcy4gWW91IGNhbiB1c2UgcHJvcGVydGllcyB0byBzdG9yZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gc2hvdyBpbiB0aGVcbiAqIHRlbXBsYXRlLCBvciBwYXNzIHRvIGFub3RoZXIgY29tcG9uZW50IGFzIGFuIGFyZ3VtZW50LlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgQ29tcG9uZW50IGZyb20gJ0BnbGltbWVyL2NvbXBvbmVudCc7XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBDb21wb25lbnQge1xuICogICB1c2VyID0ge1xuICogICAgIG5hbWU6ICdSb2JiaWUnXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB3ZSd2ZSBkZWZpbmVkIGEgY29tcG9uZW50IHdpdGggYSBgdXNlcmAgcHJvcGVydHkgdGhhdFxuICogY29udGFpbnMgYW4gb2JqZWN0IHdpdGggaXRzIG93biBgbmFtZWAgcHJvcGVydHkuXG4gKlxuICogV2UgY2FuIHJlbmRlciB0aGF0IHByb3BlcnR5IGluIG91ciB0ZW1wbGF0ZTpcbiAqXG4gKiBgYGBoYnNcbiAqIEhlbGxvLCB7e3VzZXIubmFtZX19IVxuICogYGBgXG4gKlxuICogV2UgY2FuIGFsc28gdGFrZSB0aGF0IHByb3BlcnR5IGFuZCBwYXNzIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZVxuICogYFVzZXJHcmVldGluZ2AgY29tcG9uZW50IHdlIGRlZmluZWQgYWJvdmU6XG4gKlxuICogYGBgaGJzXG4gKiA8VXNlckdyZWV0aW5nIEBncmVldGluZz1cIkhlbGxvXCIgQG5hbWU9e3t1c2VyLm5hbWV9fSAvPlxuICogYGBgXG4gKlxuICogIyMgQXJndW1lbnRzIHZzLiBQcm9wZXJ0aWVzXG4gKlxuICogUmVtZW1iZXIsIGFyZ3VtZW50cyBhcmUgZGF0YSB0aGF0IHdhcyBnaXZlbiB0byB5b3VyIGNvbXBvbmVudCBieSBpdHMgcGFyZW50XG4gKiBjb21wb25lbnQsIGFuZCBwcm9wZXJ0aWVzIGFyZSBkYXRhIHlvdXIgY29tcG9uZW50IGhhcyBkZWZpbmVkIGZvciBpdHNlbGYuXG4gKlxuICogWW91IGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYXJndW1lbnRzIGFuZCBwcm9wZXJ0aWVzIGluIHRlbXBsYXRlc1xuICogYmVjYXVzZSBhcmd1bWVudHMgYWx3YXlzIHN0YXJ0IHdpdGggYW4gYEBgIHNpZ24gKHRoaW5rIFwiQSBpcyBmb3IgYXJndW1lbnRzXCIpOlxuICpcbiAqIGBgYGhic1xuICoge3tAZmlyc3ROYW1lfX1cbiAqIGBgYFxuICpcbiAqIFdlIGtub3cgdGhhdCBgQGZpcnN0TmFtZWAgY2FtZSBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LCBub3QgdGhlIGN1cnJlbnRcbiAqIGNvbXBvbmVudCwgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBgQGAgYW5kIGlzIHRoZXJlZm9yZSBhbiBhcmd1bWVudC5cbiAqXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2Ugc2VlOlxuICpcbiAqIGBgYGhic1xuICoge3tuYW1lfX1cbiAqIGBgYFxuICpcbiAqIFdlIGtub3cgdGhhdCBgbmFtZWAgaXMgYSBwcm9wZXJ0eSBvbiB0aGUgY29tcG9uZW50LiBJZiB3ZSB3YW50IHRvIGtub3cgd2hlcmVcbiAqIHRoZSBkYXRhIGlzIGNvbWluZyBmcm9tLCB3ZSBjYW4gZ28gbG9vayBhdCBvdXIgY29tcG9uZW50IGNsYXNzIHRvIGZpbmQgb3V0LlxuICpcbiAqIEluc2lkZSB0aGUgY29tcG9uZW50IGl0c2VsZiwgYXJndW1lbnRzIGFsd2F5cyBzaG93IHVwIGluc2lkZSB0aGUgY29tcG9uZW50J3NcbiAqIGBhcmdzYCBwcm9wZXJ0eS4gRm9yIGV4YW1wbGUsIGlmIGB7e0BmaXJzdE5hbWV9fWAgaXMgYFRvbWAgaW4gdGhlIHRlbXBsYXRlLFxuICogaW5zaWRlIHRoZSBjb21wb25lbnQgYHRoaXMuYXJncy5maXJzdE5hbWVgIHdvdWxkIGFsc28gYmUgYFRvbWAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VDb21wb25lbnQ8UyA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY29tcG9uZW50IGFuZCBhc3NpZ25zIGl0c2VsZiB0aGUgcGFzc2VkIHByb3BlcnRpZXMuIFlvdVxuICAgKiBzaG91bGQgbm90IGNvbnN0cnVjdCBuZXcgY29tcG9uZW50cyB5b3Vyc2VsZi4gSW5zdGVhZCwgR2xpbW1lciB3aWxsXG4gICAqIGluc3RhbnRpYXRlIG5ldyBjb21wb25lbnRzIGF1dG9tYXRpY2FsbHkgYXMgaXQgcmVuZGVycy5cbiAgICpcbiAgICogQHBhcmFtIG93bmVyXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihvd25lcjogdW5rbm93biwgYXJnczogQXJnczxTPikge1xuICAgIGlmIChERUJVRyAmJiAhKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciA9PT0gJ29iamVjdCcgJiYgQVJHU19TRVQuaGFzKGFyZ3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IG11c3QgcGFzcyBib3RoIHRoZSBvd25lciBhbmQgYXJncyB0byBzdXBlcigpIGluIHlvdXIgY29tcG9uZW50OiAke1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IubmFtZVxuICAgICAgICB9LiBZb3UgY2FuIHBhc3MgdGhlbSBkaXJlY3RseSwgb3IgdXNlIC4uLmFyZ3VtZW50cyB0byBwYXNzIGFsbCBhcmd1bWVudHMgdGhyb3VnaC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgc2V0T3duZXIodGhpcywgb3duZXIgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lZCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQgZnJvbSBpdHMgcGFyZW50IGNvbXBvbmVudC5cbiAgICogVGhleSBjYW4gYmUgYWNjZXNzZWQgaW4gSmF2YVNjcmlwdCB2aWEgYHRoaXMuYXJncy5hcmd1bWVudE5hbWVgIGFuZCBpbiB0aGUgdGVtcGxhdGUgdmlhIGBAYXJndW1lbnROYW1lYC5cbiAgICpcbiAgICogU2F5IHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50LCB3aGljaCB3aWxsIGhhdmUgdHdvIGBhcmdzYCwgYGZpcnN0TmFtZWAgYW5kIGBsYXN0TmFtZWA6XG4gICAqXG4gICAqIGBgYGhic1xuICAgKiA8bXktY29tcG9uZW50IEBmaXJzdE5hbWU9XCJBcnRodXJcIiBAbGFzdE5hbWU9XCJEZW50XCIgLz5cbiAgICogYGBgXG4gICAqXG4gICAqIElmIHlvdSBuZWVkZWQgdG8gY2FsY3VsYXRlIGBmdWxsTmFtZWAgYnkgY29tYmluaW5nIGJvdGggb2YgdGhlbSwgeW91IHdvdWxkIGRvOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaWRJbnNlcnRFbGVtZW50KCkge1xuICAgKiAgIGNvbnNvbGUubG9nKGBIaSwgbXkgZnVsbCBuYW1lIGlzICR7dGhpcy5hcmdzLmZpcnN0TmFtZX0gJHt0aGlzLmFyZ3MubGFzdE5hbWV9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFdoaWxlIGluIHRoZSB0ZW1wbGF0ZSB5b3UgY291bGQgZG86XG4gICAqXG4gICAqIGBgYGhic1xuICAgKiA8cD5XZWxjb21lLCB7e0BmaXJzdE5hbWV9fSB7e0BsYXN0TmFtZX19ITwvcD5cbiAgICogYGBgXG4gICAqL1xuICBhcmdzOiBSZWFkb25seTxBcmdzPFM+PjtcblxuICBnZXQgaXNEZXN0cm95aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0Rlc3Ryb3lpbmcodGhpcyk7XG4gIH1cblxuICBnZXQgaXNEZXN0cm95ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRGVzdHJveWVkKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICovXG4gIHdpbGxEZXN0cm95KCk6IHZvaWQge31cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
;