radio.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { ChangeDetectorRef, Directive, ElementRef, forwardRef, Input, Renderer2 } from '@angular/core';
  6. import { NG_VALUE_ACCESSOR } from '@angular/forms';
  7. import { NgbButtonLabel } from './label';
  8. /** @type {?} */
  9. var NGB_RADIO_VALUE_ACCESSOR = {
  10. provide: NG_VALUE_ACCESSOR,
  11. useExisting: forwardRef((/**
  12. * @return {?}
  13. */
  14. function () { return NgbRadioGroup; })),
  15. multi: true
  16. };
  17. /** @type {?} */
  18. var nextId = 0;
  19. /**
  20. * Allows to easily create Bootstrap-style radio buttons.
  21. *
  22. * Integrates with forms, so the value of a checked button is bound to the underlying form control
  23. * either in a reactive or template-driven way.
  24. */
  25. var NgbRadioGroup = /** @class */ (function () {
  26. function NgbRadioGroup() {
  27. this._radios = new Set();
  28. this._value = null;
  29. /**
  30. * Name of the radio group applied to radio input elements.
  31. *
  32. * Will be applied to all radio input elements inside the group,
  33. * unless [`NgbRadio`](#/components/buttons/api#NgbRadio)'s specify names themselves.
  34. *
  35. * If not provided, will be generated in the `ngb-radio-xx` format.
  36. */
  37. this.name = "ngb-radio-" + nextId++;
  38. this.onChange = (/**
  39. * @param {?} _
  40. * @return {?}
  41. */
  42. function (_) { });
  43. this.onTouched = (/**
  44. * @return {?}
  45. */
  46. function () { });
  47. }
  48. Object.defineProperty(NgbRadioGroup.prototype, "disabled", {
  49. get: /**
  50. * @return {?}
  51. */
  52. function () { return this._disabled; },
  53. set: /**
  54. * @param {?} isDisabled
  55. * @return {?}
  56. */
  57. function (isDisabled) { this.setDisabledState(isDisabled); },
  58. enumerable: true,
  59. configurable: true
  60. });
  61. /**
  62. * @param {?} radio
  63. * @return {?}
  64. */
  65. NgbRadioGroup.prototype.onRadioChange = /**
  66. * @param {?} radio
  67. * @return {?}
  68. */
  69. function (radio) {
  70. this.writeValue(radio.value);
  71. this.onChange(radio.value);
  72. };
  73. /**
  74. * @return {?}
  75. */
  76. NgbRadioGroup.prototype.onRadioValueUpdate = /**
  77. * @return {?}
  78. */
  79. function () { this._updateRadiosValue(); };
  80. /**
  81. * @param {?} radio
  82. * @return {?}
  83. */
  84. NgbRadioGroup.prototype.register = /**
  85. * @param {?} radio
  86. * @return {?}
  87. */
  88. function (radio) { this._radios.add(radio); };
  89. /**
  90. * @param {?} fn
  91. * @return {?}
  92. */
  93. NgbRadioGroup.prototype.registerOnChange = /**
  94. * @param {?} fn
  95. * @return {?}
  96. */
  97. function (fn) { this.onChange = fn; };
  98. /**
  99. * @param {?} fn
  100. * @return {?}
  101. */
  102. NgbRadioGroup.prototype.registerOnTouched = /**
  103. * @param {?} fn
  104. * @return {?}
  105. */
  106. function (fn) { this.onTouched = fn; };
  107. /**
  108. * @param {?} isDisabled
  109. * @return {?}
  110. */
  111. NgbRadioGroup.prototype.setDisabledState = /**
  112. * @param {?} isDisabled
  113. * @return {?}
  114. */
  115. function (isDisabled) {
  116. this._disabled = isDisabled;
  117. this._updateRadiosDisabled();
  118. };
  119. /**
  120. * @param {?} radio
  121. * @return {?}
  122. */
  123. NgbRadioGroup.prototype.unregister = /**
  124. * @param {?} radio
  125. * @return {?}
  126. */
  127. function (radio) { this._radios.delete(radio); };
  128. /**
  129. * @param {?} value
  130. * @return {?}
  131. */
  132. NgbRadioGroup.prototype.writeValue = /**
  133. * @param {?} value
  134. * @return {?}
  135. */
  136. function (value) {
  137. this._value = value;
  138. this._updateRadiosValue();
  139. };
  140. /**
  141. * @private
  142. * @return {?}
  143. */
  144. NgbRadioGroup.prototype._updateRadiosValue = /**
  145. * @private
  146. * @return {?}
  147. */
  148. function () {
  149. var _this = this;
  150. this._radios.forEach((/**
  151. * @param {?} radio
  152. * @return {?}
  153. */
  154. function (radio) { return radio.updateValue(_this._value); }));
  155. };
  156. /**
  157. * @private
  158. * @return {?}
  159. */
  160. NgbRadioGroup.prototype._updateRadiosDisabled = /**
  161. * @private
  162. * @return {?}
  163. */
  164. function () { this._radios.forEach((/**
  165. * @param {?} radio
  166. * @return {?}
  167. */
  168. function (radio) { return radio.updateDisabled(); })); };
  169. NgbRadioGroup.decorators = [
  170. { type: Directive, args: [{ selector: '[ngbRadioGroup]', host: { 'role': 'radiogroup' }, providers: [NGB_RADIO_VALUE_ACCESSOR] },] }
  171. ];
  172. NgbRadioGroup.propDecorators = {
  173. name: [{ type: Input }]
  174. };
  175. return NgbRadioGroup;
  176. }());
  177. export { NgbRadioGroup };
  178. if (false) {
  179. /**
  180. * @type {?}
  181. * @private
  182. */
  183. NgbRadioGroup.prototype._radios;
  184. /**
  185. * @type {?}
  186. * @private
  187. */
  188. NgbRadioGroup.prototype._value;
  189. /**
  190. * @type {?}
  191. * @private
  192. */
  193. NgbRadioGroup.prototype._disabled;
  194. /**
  195. * Name of the radio group applied to radio input elements.
  196. *
  197. * Will be applied to all radio input elements inside the group,
  198. * unless [`NgbRadio`](#/components/buttons/api#NgbRadio)'s specify names themselves.
  199. *
  200. * If not provided, will be generated in the `ngb-radio-xx` format.
  201. * @type {?}
  202. */
  203. NgbRadioGroup.prototype.name;
  204. /** @type {?} */
  205. NgbRadioGroup.prototype.onChange;
  206. /** @type {?} */
  207. NgbRadioGroup.prototype.onTouched;
  208. }
  209. /**
  210. * A directive that marks an input of type "radio" as a part of the
  211. * [`NgbRadioGroup`](#/components/buttons/api#NgbRadioGroup).
  212. */
  213. var NgbRadio = /** @class */ (function () {
  214. function NgbRadio(_group, _label, _renderer, _element, _cd) {
  215. this._group = _group;
  216. this._label = _label;
  217. this._renderer = _renderer;
  218. this._element = _element;
  219. this._cd = _cd;
  220. this._value = null;
  221. this._group.register(this);
  222. this.updateDisabled();
  223. }
  224. Object.defineProperty(NgbRadio.prototype, "value", {
  225. get: /**
  226. * @return {?}
  227. */
  228. function () { return this._value; },
  229. /**
  230. * The form control value when current radio button is checked.
  231. */
  232. set: /**
  233. * The form control value when current radio button is checked.
  234. * @param {?} value
  235. * @return {?}
  236. */
  237. function (value) {
  238. this._value = value;
  239. /** @type {?} */
  240. var stringValue = value ? value.toString() : '';
  241. this._renderer.setProperty(this._element.nativeElement, 'value', stringValue);
  242. this._group.onRadioValueUpdate();
  243. },
  244. enumerable: true,
  245. configurable: true
  246. });
  247. Object.defineProperty(NgbRadio.prototype, "disabled", {
  248. get: /**
  249. * @return {?}
  250. */
  251. function () { return this._group.disabled || this._disabled; },
  252. /**
  253. * If `true`, current radio button will be disabled.
  254. */
  255. set: /**
  256. * If `true`, current radio button will be disabled.
  257. * @param {?} isDisabled
  258. * @return {?}
  259. */
  260. function (isDisabled) {
  261. this._disabled = isDisabled !== false;
  262. this.updateDisabled();
  263. },
  264. enumerable: true,
  265. configurable: true
  266. });
  267. Object.defineProperty(NgbRadio.prototype, "focused", {
  268. set: /**
  269. * @param {?} isFocused
  270. * @return {?}
  271. */
  272. function (isFocused) {
  273. if (this._label) {
  274. this._label.focused = isFocused;
  275. }
  276. if (!isFocused) {
  277. this._group.onTouched();
  278. }
  279. },
  280. enumerable: true,
  281. configurable: true
  282. });
  283. Object.defineProperty(NgbRadio.prototype, "checked", {
  284. get: /**
  285. * @return {?}
  286. */
  287. function () { return this._checked; },
  288. enumerable: true,
  289. configurable: true
  290. });
  291. Object.defineProperty(NgbRadio.prototype, "nameAttr", {
  292. get: /**
  293. * @return {?}
  294. */
  295. function () { return this.name || this._group.name; },
  296. enumerable: true,
  297. configurable: true
  298. });
  299. /**
  300. * @return {?}
  301. */
  302. NgbRadio.prototype.ngOnDestroy = /**
  303. * @return {?}
  304. */
  305. function () { this._group.unregister(this); };
  306. /**
  307. * @return {?}
  308. */
  309. NgbRadio.prototype.onChange = /**
  310. * @return {?}
  311. */
  312. function () { this._group.onRadioChange(this); };
  313. /**
  314. * @param {?} value
  315. * @return {?}
  316. */
  317. NgbRadio.prototype.updateValue = /**
  318. * @param {?} value
  319. * @return {?}
  320. */
  321. function (value) {
  322. // label won't be updated, if it is inside the OnPush component when [ngModel] changes
  323. if (this.value !== value) {
  324. this._cd.markForCheck();
  325. }
  326. this._checked = this.value === value;
  327. this._label.active = this._checked;
  328. };
  329. /**
  330. * @return {?}
  331. */
  332. NgbRadio.prototype.updateDisabled = /**
  333. * @return {?}
  334. */
  335. function () { this._label.disabled = this.disabled; };
  336. NgbRadio.decorators = [
  337. { type: Directive, args: [{
  338. selector: '[ngbButton][type=radio]',
  339. host: {
  340. '[checked]': 'checked',
  341. '[disabled]': 'disabled',
  342. '[name]': 'nameAttr',
  343. '(change)': 'onChange()',
  344. '(focus)': 'focused = true',
  345. '(blur)': 'focused = false'
  346. }
  347. },] }
  348. ];
  349. /** @nocollapse */
  350. NgbRadio.ctorParameters = function () { return [
  351. { type: NgbRadioGroup },
  352. { type: NgbButtonLabel },
  353. { type: Renderer2 },
  354. { type: ElementRef },
  355. { type: ChangeDetectorRef }
  356. ]; };
  357. NgbRadio.propDecorators = {
  358. name: [{ type: Input }],
  359. value: [{ type: Input, args: ['value',] }],
  360. disabled: [{ type: Input, args: ['disabled',] }]
  361. };
  362. return NgbRadio;
  363. }());
  364. export { NgbRadio };
  365. if (false) {
  366. /**
  367. * @type {?}
  368. * @private
  369. */
  370. NgbRadio.prototype._checked;
  371. /**
  372. * @type {?}
  373. * @private
  374. */
  375. NgbRadio.prototype._disabled;
  376. /**
  377. * @type {?}
  378. * @private
  379. */
  380. NgbRadio.prototype._value;
  381. /**
  382. * The value for the 'name' property of the input element.
  383. *
  384. * All inputs of the radio group should have the same name. If not specified,
  385. * the name of the enclosing group is used.
  386. * @type {?}
  387. */
  388. NgbRadio.prototype.name;
  389. /**
  390. * @type {?}
  391. * @private
  392. */
  393. NgbRadio.prototype._group;
  394. /**
  395. * @type {?}
  396. * @private
  397. */
  398. NgbRadio.prototype._label;
  399. /**
  400. * @type {?}
  401. * @private
  402. */
  403. NgbRadio.prototype._renderer;
  404. /**
  405. * @type {?}
  406. * @private
  407. */
  408. NgbRadio.prototype._element;
  409. /**
  410. * @type {?}
  411. * @private
  412. */
  413. NgbRadio.prototype._cd;
  414. }
  415. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcC8iLCJzb3VyY2VzIjpbImJ1dHRvbnMvcmFkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDOztJQUVqQyx3QkFBd0IsR0FBRztJQUMvQixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEsYUFBYSxFQUFiLENBQWEsRUFBQztJQUM1QyxLQUFLLEVBQUUsSUFBSTtDQUNaOztJQUVHLE1BQU0sR0FBRyxDQUFDOzs7Ozs7O0FBUWQ7SUFBQTtRQUVVLFlBQU8sR0FBa0IsSUFBSSxHQUFHLEVBQVksQ0FBQztRQUM3QyxXQUFNLEdBQUcsSUFBSSxDQUFDOzs7Ozs7Ozs7UUFjYixTQUFJLEdBQUcsZUFBYSxNQUFNLEVBQUksQ0FBQztRQUV4QyxhQUFROzs7O1FBQUcsVUFBQyxDQUFNLElBQU0sQ0FBQyxFQUFDO1FBQzFCLGNBQVM7OztRQUFHLGNBQU8sQ0FBQyxFQUFDO0lBNkJ2QixDQUFDO0lBM0NDLHNCQUFJLG1DQUFROzs7O1FBQVosY0FBaUIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7Ozs7UUFDekMsVUFBYSxVQUFtQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7OztPQUQvQjs7Ozs7SUFnQnpDLHFDQUFhOzs7O0lBQWIsVUFBYyxLQUFlO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FB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QTRCOzs7OztJQUMzRiw0QkFBOEM7Ozs7O0lBQUUsdUJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtOZ2JCdXR0b25MYWJlbH0gZnJvbSAnLi9sYWJlbCc7XG5cbmNvbnN0IE5HQl9SQURJT19WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nYlJhZGlvR3JvdXApLFxuICBtdWx0aTogdHJ1ZVxufTtcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQWxsb3dzIHRvIGVhc2lseSBjcmVhdGUgQm9vdHN0cmFwLXN0eWxlIHJhZGlvIGJ1dHRvbnMuXG4gKlxuICogSW50ZWdyYXRlcyB3aXRoIGZvcm1zLCBzbyB0aGUgdmFsdWUgb2YgYSBjaGVja2VkIGJ1dHRvbiBpcyBib3VuZCB0byB0aGUgdW5kZXJseWluZyBmb3JtIGNvbnRyb2xcbiAqIGVpdGhlciBpbiBhIHJlYWN0aXZlIG9yIHRlbXBsYXRlLWRyaXZlbiB3YXkuXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nYlJhZGlvR3JvdXBdJywgaG9zdDogeydyb2xlJzogJ3JhZGlvZ3JvdXAnfSwgcHJvdmlkZXJzOiBbTkdCX1JBRElPX1ZBTFVFX0FDQ0VTU09SXX0pXG5leHBvcnQgY2xhc3MgTmdiUmFkaW9Hcm91cCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBfcmFkaW9zOiBTZXQ8TmdiUmFkaW8+ID0gbmV3IFNldDxOZ2JSYWRpbz4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUgPSBudWxsO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcblxuICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICBzZXQgZGlzYWJsZWQoaXNEaXNhYmxlZDogYm9vbGVhbikgeyB0aGlzLnNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCk7IH1cblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmFkaW8gZ3JvdXAgYXBwbGllZCB0byByYWRpbyBpbnB1dCBlbGVtZW50cy5cbiAgICpcbiAgICogV2lsbCBiZSBhcHBsaWVkIHRvIGFsbCByYWRpbyBpbnB1dCBlbGVtZW50cyBpbnNpZGUgdGhlIGdyb3VwLFxuICAgKiB1bmxlc3MgW2BOZ2JSYWRpb2BdKCMvY29tcG9uZW50cy9idXR0b25zL2FwaSNOZ2JSYWRpbykncyBzcGVjaWZ5IG5hbWVzIHRoZW1zZWx2ZXMuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIGBuZ2ItcmFkaW8teHhgIGZvcm1hdC5cbiAgICovXG4gIEBJbnB1dCgpIG5hbWUgPSBgbmdiLXJhZGlvLSR7bmV4dElkKyt9YDtcblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICBvblJhZGlvQ2hhbmdlKHJhZGlvOiBOZ2JSYWRpbykge1xuICAgIHRoaXMud3JpdGVWYWx1ZShyYWRpby52YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZShyYWRpby52YWx1ZSk7XG4gIH1cblxuICBvblJhZGlvVmFsdWVVcGRhdGUoKSB7IHRoaXMuX3VwZGF0ZVJhZGlvc1ZhbHVlKCk7IH1cblxuICByZWdpc3RlcihyYWRpbzogTmdiUmFkaW8pIHsgdGhpcy5fcmFkaW9zLmFkZChyYWRpbyk7IH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gYW55KTogdm9pZCB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLl91cGRhdGVSYWRpb3NEaXNhYmxlZCgpO1xuICB9XG5cbiAgdW5yZWdpc3RlcihyYWRpbzogTmdiUmFkaW8pIHsgdGhpcy5fcmFkaW9zLmRlbGV0ZShyYWRpbyk7IH1cblxuICB3cml0ZVZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl91cGRhdGVSYWRpb3NWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUmFkaW9zVmFsdWUoKSB7IHRoaXMuX3JhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4gcmFkaW8udXBkYXRlVmFsdWUodGhpcy5fdmFsdWUpKTsgfVxuICBwcml2YXRlIF91cGRhdGVSYWRpb3NEaXNhYmxlZCgpIHsgdGhpcy5fcmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiByYWRpby51cGRhdGVEaXNhYmxlZCgpKTsgfVxufVxuXG5cbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBtYXJrcyBhbiBpbnB1dCBvZiB0eXBlIFwicmFkaW9cIiBhcyBhIHBhcnQgb2YgdGhlXG4gKiBbYE5nYlJhZGlvR3JvdXBgXSgjL2NvbXBvbmVudHMvYnV0dG9ucy9hcGkjTmdiUmFkaW9Hcm91cCkuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ2JCdXR0b25dW3R5cGU9cmFkaW9dJyxcbiAgaG9zdDoge1xuICAgICdbY2hlY2tlZF0nOiAnY2hlY2tlZCcsXG4gICAgJ1tkaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdbbmFtZV0nOiAnbmFtZUF0dHInLFxuICAgICcoY2hhbmdlKSc6ICdvbkNoYW5nZSgpJyxcbiAgICAnKGZvY3VzKSc6ICdmb2N1c2VkID0gdHJ1ZScsXG4gICAgJyhibHVyKSc6ICdmb2N1c2VkID0gZmFsc2UnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTmdiUmFkaW8gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9jaGVja2VkOiBib29sZWFuO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBmb3IgdGhlICduYW1lJyBwcm9wZXJ0eSBvZiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICpcbiAgICogQWxsIGlucHV0cyBvZiB0aGUgcmFkaW8gZ3JvdXAgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbmFtZS4gSWYgbm90IHNwZWNpZmllZCxcbiAgICogdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBncm91cCBpcyB1c2VkLlxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIHZhbHVlIHdoZW4gY3VycmVudCByYWRpbyBidXR0b24gaXMgY2hlY2tlZC5cbiAgICovXG4gIEBJbnB1dCgndmFsdWUnKVxuICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB2YWx1ZSA/IHZhbHVlLnRvU3RyaW5nKCkgOiAnJztcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHN0cmluZ1ZhbHVlKTtcbiAgICB0aGlzLl9ncm91cC5vblJhZGlvVmFsdWVVcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGN1cnJlbnQgcmFkaW8gYnV0dG9uIHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBASW5wdXQoJ2Rpc2FibGVkJylcbiAgc2V0IGRpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGlzRGlzYWJsZWQgIT09IGZhbHNlO1xuICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcbiAgfVxuXG4gIHNldCBmb2N1c2VkKGlzRm9jdXNlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9sYWJlbCkge1xuICAgICAgdGhpcy5fbGFiZWwuZm9jdXNlZCA9IGlzRm9jdXNlZDtcbiAgICB9XG4gICAgaWYgKCFpc0ZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX2dyb3VwLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjaGVja2VkKCkgeyByZXR1cm4gdGhpcy5fY2hlY2tlZDsgfVxuXG4gIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2dyb3VwLmRpc2FibGVkIHx8IHRoaXMuX2Rpc2FibGVkOyB9XG5cbiAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH1cblxuICBnZXQgbmFtZUF0dHIoKSB7IHJldHVybiB0aGlzLm5hbWUgfHwgdGhpcy5fZ3JvdXAubmFtZTsgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJpdmF0ZSBfZ3JvdXA6IE5nYlJhZGlvR3JvdXAsIHByaXZhdGUgX2xhYmVsOiBOZ2JCdXR0b25MYWJlbCwgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHRoaXMuX2dyb3VwLnJlZ2lzdGVyKHRoaXMpO1xuICAgIHRoaXMudXBkYXRlRGlzYWJsZWQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkgeyB0aGlzLl9ncm91cC51bnJlZ2lzdGVyKHRoaXMpOyB9XG5cbiAgb25DaGFuZ2UoKSB7IHRoaXMuX2dyb3VwLm9uUmFkaW9DaGFuZ2UodGhpcyk7IH1cblxuICB1cGRhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIC8vIGxhYmVsIHdvbid0IGJlIHVwZGF0ZWQsIGlmIGl0IGlzIGluc2lkZSB0aGUgT25QdXNoIGNvbXBvbmVudCB3aGVuIFtuZ01vZGVsXSBjaGFuZ2VzXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGVja2VkID0gdGhpcy52YWx1ZSA9PT0gdmFsdWU7XG4gICAgdGhpcy5fbGFiZWwuYWN0aXZlID0gdGhpcy5fY2hlY2tlZDtcbiAgfVxuXG4gIHVwZGF0ZURpc2FibGVkKCkgeyB0aGlzLl9sYWJlbC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7IH1cbn1cbiJdfQ==