UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

1,111 lines 74.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; import { isNotNil } from '../util'; import { NzTreeNode } from './nz-tree-base-node'; import { isCheckDisabled, isInArray } from './nz-tree-base-util'; var NzTreeBaseService = /** @class */ (function () { function NzTreeBaseService() { this.DRAG_SIDE_RANGE = 0.25; this.DRAG_MIN_GAP = 2; this.isCheckStrictly = false; this.isMultiple = false; this.rootNodes = []; this.selectedNodeList = []; this.expandedNodeList = []; this.checkedNodeList = []; this.halfCheckedNodeList = []; this.matchedNodeList = []; this.triggerEventChange$ = new Subject(); } /** * trigger event */ /** * trigger event * @return {?} */ NzTreeBaseService.prototype.eventTriggerChanged = /** * trigger event * @return {?} */ function () { return this.triggerEventChange$.asObservable(); }; /** * reset tree nodes will clear default node list */ /** * reset tree nodes will clear default node list * @param {?} nzNodes * @return {?} */ NzTreeBaseService.prototype.initTree = /** * reset tree nodes will clear default node list * @param {?} nzNodes * @return {?} */ function (nzNodes) { var _this = this; this.rootNodes = nzNodes; this.expandedNodeList = []; this.selectedNodeList = []; this.halfCheckedNodeList = []; this.checkedNodeList = []; this.matchedNodeList = []; // refresh node checked state setTimeout((/** * @return {?} */ function () { _this.refreshCheckState(_this.isCheckStrictly); })); }; /** * @return {?} */ NzTreeBaseService.prototype.getSelectedNode = /** * @return {?} */ function () { return this.selectedNode; }; /** * get some list */ /** * get some list * @return {?} */ NzTreeBaseService.prototype.getSelectedNodeList = /** * get some list * @return {?} */ function () { return this.conductNodeState('select'); }; /** * return checked nodes */ /** * return checked nodes * @return {?} */ NzTreeBaseService.prototype.getCheckedNodeList = /** * return checked nodes * @return {?} */ function () { return this.conductNodeState('check'); }; /** * @return {?} */ NzTreeBaseService.prototype.getHalfCheckedNodeList = /** * @return {?} */ function () { return this.conductNodeState('halfCheck'); }; /** * return expanded nodes */ /** * return expanded nodes * @return {?} */ NzTreeBaseService.prototype.getExpandedNodeList = /** * return expanded nodes * @return {?} */ function () { return this.conductNodeState('expand'); }; /** * return search matched nodes */ /** * return search matched nodes * @return {?} */ NzTreeBaseService.prototype.getMatchedNodeList = /** * return search matched nodes * @return {?} */ function () { return this.conductNodeState('match'); }; // tslint:disable-next-line:no-any // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ NzTreeBaseService.prototype.isArrayOfNzTreeNode = // tslint:disable-next-line:no-any /** * @param {?} value * @return {?} */ function (value) { return value.every((/** * @param {?} item * @return {?} */ function (item) { return item instanceof NzTreeNode; })); }; /** * reset selectedNodeList */ /** * reset selectedNodeList * @param {?} selectedKeys * @param {?} nzNodes * @param {?=} isMulti * @return {?} */ NzTreeBaseService.prototype.calcSelectedKeys = /** * reset selectedNodeList * @param {?} selectedKeys * @param {?} nzNodes * @param {?=} isMulti * @return {?} */ function (selectedKeys, nzNodes, isMulti) { if (isMulti === void 0) { isMulti = false; } /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { return nodes.every((/** * @param {?} node * @return {?} */ function (node) { if (isInArray(node.key, selectedKeys)) { node.isSelected = true; if (!isMulti) { // if not support multi select return false; } } else { node.isSelected = false; } if (node.children.length > 0) { // Recursion return calc(node.children); } return true; })); }); calc(nzNodes); }; /** * reset expandedNodeList */ /** * reset expandedNodeList * @param {?} expandedKeys * @param {?} nzNodes * @return {?} */ NzTreeBaseService.prototype.calcExpandedKeys = /** * reset expandedNodeList * @param {?} expandedKeys * @param {?} nzNodes * @return {?} */ function (expandedKeys, nzNodes) { this.expandedNodeList = []; /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { nodes.forEach((/** * @param {?} node * @return {?} */ function (node) { node.isExpanded = isInArray(node.key, expandedKeys); if (node.children.length > 0) { calc(node.children); } })); }); calc(nzNodes); }; /** * reset checkedNodeList */ /** * reset checkedNodeList * @param {?} checkedKeys * @param {?} nzNodes * @param {?=} isCheckStrictly * @return {?} */ NzTreeBaseService.prototype.calcCheckedKeys = /** * reset checkedNodeList * @param {?} checkedKeys * @param {?} nzNodes * @param {?=} isCheckStrictly * @return {?} */ function (checkedKeys, nzNodes, isCheckStrictly) { if (isCheckStrictly === void 0) { isCheckStrictly = false; } this.checkedNodeList = []; this.halfCheckedNodeList = []; /** @type {?} */ var calc = (/** * @param {?} nodes * @return {?} */ function (nodes) { nodes.forEach((/** * @param {?} node * @return {?} */ function (node) { if (isInArray(node.key, checkedKeys)) { node.isChecked = true; node.isHalfChecked = false; } else { node.isChecked = false; node.isHalfChecked = false; } if (node.children.length > 0) { calc(node.children); } })); }); calc(nzNodes); // controlled state this.refreshCheckState(isCheckStrictly); }; /** * set drag node */ /** * set drag node * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setSelectedNode = /** * set drag node * @param {?} node * @return {?} */ function (node) { this.selectedNode = node; }; /** * set node selected status */ /** * set node selected status * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setNodeActive = /** * set node selected status * @param {?} node * @return {?} */ function (node) { if (!this.isMultiple && node.isSelected) { this.selectedNodeList.forEach((/** * @param {?} n * @return {?} */ function (n) { if (node.key !== n.key) { // reset other nodes n.isSelected = false; } })); // single mode: remove pre node this.selectedNodeList = []; } this.setSelectedNodeList(node, this.isMultiple); }; /** * add or remove node to selectedNodeList */ /** * add or remove node to selectedNodeList * @param {?} node * @param {?=} isMultiple * @return {?} */ NzTreeBaseService.prototype.setSelectedNodeList = /** * add or remove node to selectedNodeList * @param {?} node * @param {?=} isMultiple * @return {?} */ function (node, isMultiple) { if (isMultiple === void 0) { isMultiple = false; } /** @type {?} */ var index = this.selectedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (isMultiple) { if (node.isSelected && index === -1) { this.selectedNodeList.push(node); } } else { if (node.isSelected && index === -1) { this.selectedNodeList = [node]; } } if (!node.isSelected) { this.selectedNodeList = this.selectedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); } }; /** * merge checked nodes */ /** * merge checked nodes * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setHalfCheckedNodeList = /** * merge checked nodes * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var index = this.halfCheckedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isHalfChecked && index === -1) { this.halfCheckedNodeList.push(node); } else if (!node.isHalfChecked && index > -1) { this.halfCheckedNodeList = this.halfCheckedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setCheckedNodeList = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var index = this.checkedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isChecked && index === -1) { this.checkedNodeList.push(node); } else if (!node.isChecked && index > -1) { this.checkedNodeList = this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * conduct checked/selected/expanded keys */ /** * conduct checked/selected/expanded keys * @param {?=} type * @return {?} */ NzTreeBaseService.prototype.conductNodeState = /** * conduct checked/selected/expanded keys * @param {?=} type * @return {?} */ function (type) { var _this = this; if (type === void 0) { type = 'check'; } /** @type {?} */ var resultNodesList = []; switch (type) { case 'select': resultNodesList = this.selectedNodeList; break; case 'expand': resultNodesList = this.expandedNodeList; break; case 'match': resultNodesList = this.matchedNodeList; break; case 'check': resultNodesList = this.checkedNodeList; /** @type {?} */ var isIgnore_1 = (/** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { if (_this.checkedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return n.key === parentNode.key; })) > -1) { return true; } else { return isIgnore_1(parentNode); } } return false; }); // merge checked if (!this.isCheckStrictly) { resultNodesList = this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return !isIgnore_1(n); })); } break; case 'halfCheck': if (!this.isCheckStrictly) { resultNodesList = this.halfCheckedNodeList; } break; } return resultNodesList; }; /** * set expanded nodes */ /** * set expanded nodes * @param {?} node * @return {?} */ NzTreeBaseService.prototype.setExpandedNodeList = /** * set expanded nodes * @param {?} node * @return {?} */ function (node) { if (node.isLeaf) { return; } /** @type {?} */ var index = this.expandedNodeList.findIndex((/** * @param {?} n * @return {?} */ function (n) { return node.key === n.key; })); if (node.isExpanded && index === -1) { this.expandedNodeList.push(node); } else if (!node.isExpanded && index > -1) { this.expandedNodeList = this.expandedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return node.key !== n.key; })); } }; /** * check state * @param isCheckStrictly */ /** * check state * @param {?=} isCheckStrictly * @return {?} */ NzTreeBaseService.prototype.refreshCheckState = /** * check state * @param {?=} isCheckStrictly * @return {?} */ function (isCheckStrictly) { var _this = this; if (isCheckStrictly === void 0) { isCheckStrictly = false; } if (isCheckStrictly) { return; } this.checkedNodeList.forEach((/** * @param {?} node * @return {?} */ function (node) { _this.conduct(node); })); }; // reset other node checked state based current node // reset other node checked state based current node /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.conduct = // reset other node checked state based current node /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var isChecked = node.isChecked; if (node) { this.conductUp(node); this.conductDown(node, isChecked); } }; /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked */ /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked * @param {?} node * @return {?} */ NzTreeBaseService.prototype.conductUp = /** * 1、children half checked * 2、children all checked, parent checked * 3、no children checked * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { if (!isCheckDisabled(parentNode)) { if (parentNode.children.every((/** * @param {?} child * @return {?} */ function (child) { return isCheckDisabled(child) || (!child.isHalfChecked && child.isChecked); }))) { parentNode.isChecked = true; parentNode.isHalfChecked = false; } else if (parentNode.children.some((/** * @param {?} child * @return {?} */ function (child) { return child.isHalfChecked || child.isChecked; }))) { parentNode.isChecked = false; parentNode.isHalfChecked = true; } else { parentNode.isChecked = false; parentNode.isHalfChecked = false; } } this.setCheckedNodeList(parentNode); this.setHalfCheckedNodeList(parentNode); this.conductUp(parentNode); } }; /** * reset child check state */ /** * reset child check state * @param {?} node * @param {?} value * @return {?} */ NzTreeBaseService.prototype.conductDown = /** * reset child check state * @param {?} node * @param {?} value * @return {?} */ function (node, value) { var _this = this; if (!isCheckDisabled(node)) { node.isChecked = value; node.isHalfChecked = false; this.setCheckedNodeList(node); this.setHalfCheckedNodeList(node); node.children.forEach((/** * @param {?} n * @return {?} */ function (n) { _this.conductDown(n, value); })); } }; /** * search value & expand node * should add expandlist */ /** * search value & expand node * should add expandlist * @param {?} value * @return {?} */ NzTreeBaseService.prototype.searchExpand = /** * search value & expand node * should add expandlist * @param {?} value * @return {?} */ function (value) { var _this = this; this.matchedNodeList = []; /** @type {?} */ var expandedKeys = []; if (!isNotNil(value)) { return; } // to reset expandedNodeList /** @type {?} */ var expandParent = (/** * @param {?} n * @return {?} */ function (n) { // expand parent node /** @type {?} */ var parentNode = n.getParentNode(); if (parentNode) { expandedKeys.push(parentNode.key); expandParent(parentNode); } }); /** @type {?} */ var searchChild = (/** * @param {?} n * @return {?} */ function (n) { if (value && n.title.includes(value)) { // match the node n.isMatched = true; _this.matchedNodeList.push(n); // expand parentNode expandParent(n); } else { n.isMatched = false; } n.canHide = !n.isMatched; n.children.forEach((/** * @param {?} child * @return {?} */ function (child) { searchChild(child); })); }); this.rootNodes.forEach((/** * @param {?} child * @return {?} */ function (child) { searchChild(child); })); // expand matched keys this.calcExpandedKeys(expandedKeys, this.rootNodes); }; /** * flush after delete node */ /** * flush after delete node * @param {?} nodes * @return {?} */ NzTreeBaseService.prototype.afterRemove = /** * flush after delete node * @param {?} nodes * @return {?} */ function (nodes) { var _this = this; // to reset selectedNodeList & expandedNodeList /** @type {?} */ var loopNode = (/** * @param {?} node * @return {?} */ function (node) { // remove selected node _this.selectedNodeList = _this.selectedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); // remove expanded node _this.expandedNodeList = _this.expandedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); // remove checked node _this.checkedNodeList = _this.checkedNodeList.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== node.key; })); if (node.children) { node.children.forEach((/** * @param {?} child * @return {?} */ function (child) { loopNode(child); })); } }); nodes.forEach((/** * @param {?} n * @return {?} */ function (n) { loopNode(n); })); this.refreshCheckState(this.isCheckStrictly); }; /** * drag event */ /** * drag event * @param {?} node * @return {?} */ NzTreeBaseService.prototype.refreshDragNode = /** * drag event * @param {?} node * @return {?} */ function (node) { var _this = this; if (node.children.length === 0) { // until root this.conductUp(node); } else { node.children.forEach((/** * @param {?} child * @return {?} */ function (child) { _this.refreshDragNode(child); })); } }; // reset node level // reset node level /** * @param {?} node * @return {?} */ NzTreeBaseService.prototype.resetNodeLevel = // reset node level /** * @param {?} node * @return {?} */ function (node) { var e_1, _a; /** @type {?} */ var parentNode = node.getParentNode(); if (parentNode) { node.level = parentNode.level + 1; } else { node.level = 0; } try { for (var _b = tslib_1.__values(node.children), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; this.resetNodeLevel(child); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; /** * @param {?} event * @return {?} */ NzTreeBaseService.prototype.calcDropPosition = /** * @param {?} event * @return {?} */ function (event) { var clientY = event.clientY; // to fix firefox undefined var _a = event.srcElement ? ((/** @type {?} */ (event.srcElement))).getBoundingClientRect() : ((/** @type {?} */ (event.target))).getBoundingClientRect(), top = _a.top, bottom = _a.bottom, height = _a.height; /** @type {?} */ var des = Math.max(height * this.DRAG_SIDE_RANGE, this.DRAG_MIN_GAP); if (clientY <= top + des) { return -1; } else if (clientY >= bottom - des) { return 1; } return 0; }; /** * drop * 0: inner -1: pre 1: next */ /** * drop * 0: inner -1: pre 1: next * @param {?} targetNode * @param {?=} dragPos * @return {?} */ NzTreeBaseService.prototype.dropAndApply = /** * drop * 0: inner -1: pre 1: next * @param {?} targetNode * @param {?=} dragPos * @return {?} */ function (targetNode, dragPos) { var _this = this; if (dragPos === void 0) { dragPos = -1; } if (!targetNode || dragPos > 1) { return; } /** @type {?} */ var treeService = targetNode.treeService; /** @type {?} */ var targetParent = targetNode.getParentNode(); /** @type {?} */ var isSelectedRootNode = this.selectedNode.getParentNode(); // remove the dragNode if (isSelectedRootNode) { isSelectedRootNode.children = isSelectedRootNode.children.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== _this.selectedNode.key; })); } else { this.rootNodes = this.rootNodes.filter((/** * @param {?} n * @return {?} */ function (n) { return n.key !== _this.selectedNode.key; })); } switch (dragPos) { case 0: targetNode.addChildren([this.selectedNode]); this.resetNodeLevel(targetNode); break; case -1: case 1: /** @type {?} */ var tIndex = dragPos === 1 ? 1 : 0; if (targetParent) { targetParent.addChildren([this.selectedNode], targetParent.children.indexOf(targetNode) + tIndex); /** @type {?} */ var parentNode = this.selectedNode.getParentNode(); if (parentNode) { this.resetNodeLevel(parentNode); } } else { /** @type {?} */ var targetIndex = this.rootNodes.indexOf(targetNode) + tIndex; // Insert root node. this.rootNodes.splice(targetIndex, 0, this.selectedNode); this.rootNodes[targetIndex].parentNode = null; this.rootNodes[targetIndex].level = 0; } break; } // flush all nodes this.rootNodes.forEach((/** * @param {?} child * @return {?} */ function (child) { if (!child.treeService) { child.service = treeService; } _this.refreshDragNode(child); })); }; /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode */ /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode * @param {?} eventName * @param {?} node * @param {?} event * @return {?} */ NzTreeBaseService.prototype.formatEvent = /** * emit Structure * eventName * node * event: MouseEvent / DragEvent * dragNode * @param {?} eventName * @param {?} node * @param {?} event * @return {?} */ function (eventName, node, event) { /** @type {?} */ var emitStructure = { eventName: eventName, node: node, event: event }; switch (eventName) { case 'dragstart': case 'dragenter': case 'dragover': case 'dragleave': case 'drop': case 'dragend': Object.assign(emitStructure, { dragNode: this.getSelectedNode() }); break; case 'click': case 'dblclick': Object.assign(emitStructure, { selectedKeys: this.selectedNodeList }); Object.assign(emitStructure, { nodes: this.selectedNodeList }); Object.assign(emitStructure, { keys: this.selectedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'check': /** @type {?} */ var checkedNodeList = this.getCheckedNodeList(); Object.assign(emitStructure, { checkedKeys: checkedNodeList }); Object.assign(emitStructure, { nodes: checkedNodeList }); Object.assign(emitStructure, { keys: checkedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'search': Object.assign(emitStructure, { matchedKeys: this.getMatchedNodeList() }); Object.assign(emitStructure, { nodes: this.getMatchedNodeList() }); Object.assign(emitStructure, { keys: this.getMatchedNodeList().map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; case 'expand': Object.assign(emitStructure, { nodes: this.expandedNodeList }); Object.assign(emitStructure, { keys: this.expandedNodeList.map((/** * @param {?} n * @return {?} */ function (n) { return n.key; })) }); break; } return emitStructure; }; /** * @return {?} */ NzTreeBaseService.prototype.ngOnDestroy = /** * @return {?} */ function () { this.triggerEventChange$.complete(); }; NzTreeBaseService.decorators = [ { type: Injectable } ]; return NzTreeBaseService; }()); export { NzTreeBaseService }; if (false) { /** @type {?} */ NzTreeBaseService.prototype.DRAG_SIDE_RANGE; /** @type {?} */ NzTreeBaseService.prototype.DRAG_MIN_GAP; /** @type {?} */ NzTreeBaseService.prototype.isCheckStrictly; /** @type {?} */ NzTreeBaseService.prototype.isMultiple; /** @type {?} */ NzTreeBaseService.prototype.selectedNode; /** @type {?} */ NzTreeBaseService.prototype.rootNodes; /** @type {?} */ NzTreeBaseService.prototype.selectedNodeList; /** @type {?} */ NzTreeBaseService.prototype.expandedNodeList; /** @type {?} */ NzTreeBaseService.prototype.checkedNodeList; /** @type {?} */ NzTreeBaseService.prototype.halfCheckedNodeList; /** @type {?} */ NzTreeBaseService.prototype.matchedNodeList; /** @type {?} */ NzTreeBaseService.prototype.triggerEventChange$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotdHJlZS1iYXNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL2NvcmUvIiwic291cmNlcyI6WyJ0cmVlL256LXRyZWUtYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRW5DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2pFO0lBQUE7UUFFRSxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVqQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBRTVCLGNBQVMsR0FBaUIsRUFBRSxDQUFDO1FBQzdCLHFCQUFnQixHQUFpQixFQUFFLENBQUM7UUFDcEMscUJBQWdCLEdBQWlCLEVBQUUsQ0FBQztRQUNwQyxvQkFBZSxHQUFpQixFQUFFLENBQUM7UUFDbkMsd0JBQW1CLEdBQWlCLEVBQUUsQ0FBQztRQUN2QyxvQkFBZSxHQUFpQixFQUFFLENBQUM7UUFDbkMsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7SUE2Z0J6RCxDQUFDO0lBM2dCQzs7T0FFRzs7Ozs7SUFDSCwrQ0FBbUI7Ozs7SUFBbkI7UUFDRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNILG9DQUFROzs7OztJQUFSLFVBQVMsT0FBcUI7UUFBOUIsaUJBV0M7UUFWQyxJQUFJLENBQUMsU0FBUyxHQUFH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