com.phloxui
Version:
PhloxUI Ng2+ Framework
798 lines (797 loc) • 81 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractHasDataHelp } from './AbstractHasDataHelp';
import { Option } from '../decorator/Option.decorator';
import { EventUtils } from '../share/utils/EventUtils';
import { LANG_ADD_EVENT, LANG_REMOVE_EVENT, LANG_CLICK_EVENT } from '../share/CustomEventType';
/**
* <p style="text-indent: 2em;">
* An abstract base class for component providing <code>data lang selector</code> to the user.
* </p>
*
* @author shiorin, tee4cute
* @abstract
*/
export class AbstractDataLangSelector extends AbstractHasDataHelp {
/**
* @param {?} elementRef
* @param {?} dialogService
*/
constructor(elementRef, dialogService) {
super(elementRef);
this.langClickEvent = new EventEmitter();
this.langAddEvent = new EventEmitter();
this.langRemoveEvent = new EventEmitter();
this.languageList = [];
this.dataLangList = [];
this.oldLangs = [];
this.markCreatedLangs = [];
this.selectedLang = null;
this.defaultData = null;
this.dialogService = dialogService;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
this.defaultData = this.getDefaultLangData();
this.refreshLanguageList();
this.refreshDataLanguageList();
}
/**
* @param {?} langCode
* @param {?=} objId
* @return {?}
*/
isDataObjectsContainsLang(langCode, objId) {
let /** @type {?} */ result = this.getDataObjectByLang(langCode, objId);
if (result !== null && typeof result !== 'undefined') {
return true;
}
return false;
}
/**
* @param {?} langCode
* @param {?=} objId
* @return {?}
*/
getDataObjectByLang(langCode, objId) {
let /** @type {?} */ objects = this.getDataObjects();
if (objects !== null && typeof objects !== 'undefined') {
let /** @type {?} */ objIdFieldName = this.getObjectIdFieldName();
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
if (langFieldName !== null) {
for (let /** @type {?} */ d of objects) {
let /** @type {?} */ langPass = false;
if (d[langFieldName] === langCode) {
langPass = true;
}
let /** @type {?} */ objIdPass = true;
if (typeof objId !== 'undefined') {
if (d[objIdFieldName] !== objId) {
objIdPass = false;
}
}
if (langPass && objIdPass) {
return d;
}
}
}
}
return null;
}
/**
* @return {?}
*/
getDefaultLangData() {
return this.getDefaultData();
}
/**
* @return {?}
*/
refreshDataLanguageList() {
let /** @type {?} */ defaultObj = this.getDefaultLangData();
this.defaultData = defaultObj;
// search for other lang
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
this.oldLangs = [];
let /** @type {?} */ langProm = this.loadDataLanguageList(defaultObj);
if (langProm !== null && typeof langProm !== 'undefined') {
langProm.then((result) => {
let /** @type {?} */ tempArray = [];
if (result !== null && typeof result !== 'undefined') {
if (Array.isArray(result)) {
tempArray = result;
}
else {
tempArray.push(result);
}
}
// check contain
let /** @type {?} */ langCode = [];
for (let /** @type {?} */ lang of this.languageList) {
langCode.push(lang.code);
}
let /** @type {?} */ isAdded = false;
for (let /** @type {?} */ temp of tempArray) {
let /** @type {?} */ tempCode = temp[langFieldName];
if (langCode.indexOf(tempCode) <= -1) {
isAdded = true;
this.languageList.push(this.parseLanguageButtonModel(tempCode));
}
this.oldLangs.push(tempCode);
}
if (isAdded) {
this.sortLanguageList(this.languageList);
}
this.dataLangList = [];
for (let /** @type {?} */ i = 0; i < this.languageList.length; i++) {
let /** @type {?} */ item = this.languageList[i];
let /** @type {?} */ matched = null;
for (let /** @type {?} */ temp of tempArray) {
if (item.code === temp[langFieldName]) {
let /** @type {?} */ curData = this.getDataObjectByLang(item.code);
if (curData === null) {
matched = temp;
}
else {
// get from old
matched = curData;
}
break;
}
}
this.dataLangList.push(matched);
}
});
}
else {
this.dataLangList = [];
for (let /** @type {?} */ i = 0; i < this.languageList.length; i++) {
this.dataLangList.push(null);
}
}
}
/**
* @return {?}
*/
refreshLanguageList() {
this.languageList = [];
let /** @type {?} */ defaultLangs = this.getLanguageList();
if (defaultLangs !== null && typeof defaultLangs !== 'undefined' && Array.isArray(defaultLangs)) {
for (let /** @type {?} */ lang of defaultLangs) {
this.languageList.push(this.parseLanguageButtonModel(lang));
}
}
this.sortLanguageList(this.languageList);
}
/**
* @param {?} objArray
* @return {?}
*/
sortLanguageList(objArray) {
if (objArray === null || typeof objArray === 'undefined') {
return;
}
objArray.sort(function (obj1, obj2) {
if ((obj1 === null || typeof obj1 === 'undefined') && (obj2 !== null && typeof obj2 !== 'undefined')) {
return 1;
}
else if ((obj1 !== null && typeof obj1 !== 'undefined') && (obj2 === null || typeof obj2 === 'undefined')) {
return -1;
}
else if ((obj1 === null || typeof obj1 === 'undefined') && (obj2 === null || typeof obj2 === 'undefined')) {
return 0;
}
let /** @type {?} */ code1 = obj1.code;
let /** @type {?} */ code2 = obj2.code;
if ((code1 === null || typeof code1 === 'undefined') && (code2 !== null && typeof code2 !== 'undefined')) {
return 1;
}
else if ((code1 !== null && typeof code1 !== 'undefined') && (code2 === null || typeof code2 === 'undefined')) {
return -1;
}
else if ((code1 === null || typeof code1 === 'undefined') && (code2 === null || typeof code2 === 'undefined')) {
return 0;
}
if (code1 < code2) {
return -1;
}
else if (code1 > code2) {
return 1;
}
return 0;
});
}
/**
* @param {?} langModel
* @return {?}
*/
langTabChange(langModel) {
this.selectedLang = langModel;
}
/**
* @param {?} code
* @return {?}
*/
getLanguageIndex(code) {
if (code !== null && typeof code !== 'undefined') {
for (let /** @type {?} */ i = 0; i < this.languageList.length; i++) {
let /** @type {?} */ lang = this.languageList[i];
if (lang.code === code) {
return i;
}
}
}
return -1;
}
/**
* @param {?} langCode
* @return {?}
*/
createNewLang(langCode) {
let /** @type {?} */ result = null;
if (langCode !== null && typeof langCode !== 'undefined') {
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
let /** @type {?} */ index = this.getLanguageIndex(langCode);
if (this.isLanguageHasData(langCode)) {
// already has data in the lang
if (index > -1 && index < this.dataLangList.length) {
let /** @type {?} */ dataLang = this.dataLangList[index];
result = dataLang;
}
if (index > -1 && index < this.languageList.length) {
this.langTabChange(this.languageList[index]);
}
}
else {
// create empty data
if (index > -1 && index < this.dataLangList.length) {
let /** @type {?} */ cloneDefault = {};
let /** @type {?} */ defaultData = this.getDefaultLangData();
if (defaultData !== null && typeof defaultData !== 'undefined') {
cloneDefault = JSON.parse(JSON.stringify(defaultData));
}
cloneDefault[langFieldName] = langCode; // add lang
this.dataLangList[index] = cloneDefault;
result = cloneDefault;
if (index > -1 && index < this.languageList.length) {
this.langTabChange(this.languageList[index]);
}
}
}
this.onLanguageAdded(result);
let /** @type {?} */ data = result;
let /** @type {?} */ ev = EventUtils.newCustomEvent(LANG_ADD_EVENT, this, data, null);
this.langAddEvent.emit(ev);
}
return result;
}
/**
* @param {?} langCode
* @return {?}
*/
removeLanguageData(langCode) {
let /** @type {?} */ result = null;
if (langCode !== null && typeof langCode !== 'undefined') {
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
if (this.isLanguageHasData(langCode)) {
let /** @type {?} */ index = this.getLanguageIndex(langCode);
let /** @type {?} */ changeToDefLang = false;
// remove from datalanglist
if (index > -1 && index < this.dataLangList.length) {
let /** @type {?} */ removeItem = this.dataLangList[index];
result = removeItem;
this.dataLangList[index] = null;
if (this.selectedLang === this.languageList[index]) {
changeToDefLang = true;
}
}
if (changeToDefLang) {
// set tab to default
this.langTabChange(null);
}
}
else {
// no lang data
}
this.onLanguageRemoved(result);
let /** @type {?} */ data = result;
let /** @type {?} */ ev = EventUtils.newCustomEvent(LANG_REMOVE_EVENT, this, data, null);
this.langRemoveEvent.emit(ev);
}
return result;
}
/**
* @param {?} index
* @return {?}
*/
_isSelectedLanguageByIndex(index) {
if (typeof index !== 'undefined') {
if (index !== null) {
// find lang model
if (index >= 0 && index < this.languageList.length) {
return this.isSelectedLanguage(this.languageList[index]);
}
}
else {
return this.isSelectedLanguage(null);
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
_langHasDataByIndex(index) {
if (index <= -1) {
return false;
}
if (index < this.dataLangList.length) {
let /** @type {?} */ value = this.dataLangList[index];
if (value !== null && typeof value !== 'undefined') {
return true;
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
_isDataDirtyByIndex(index) {
let /** @type {?} */ dataLang = null;
if (index !== null && typeof index === 'number' && index > -1) {
if (index < this.dataLangList.length) {
dataLang = this.dataLangList[index];
}
}
let /** @type {?} */ isDirty = this.isDataLanguageDirty(dataLang);
if (isDirty) {
return true;
}
return false;
}
/**
* @param {?} langModel
* @return {?}
*/
_hasButtonIcon(langModel) {
if (langModel !== null && typeof langModel !== 'undefined') {
if (langModel.iconURL !== null && typeof langModel.iconURL !== 'undefined' && langModel.iconURL !== '') {
return true;
}
}
return false;
}
/**
* @return {?}
*/
_getDataLangList() {
return this.dataLangList;
}
/**
* when new language was created this method will be called
* @param {?} newLangData as any
* @return {?}
*/
onLanguageAdded(newLangData) {
if (this.controller !== null && typeof this.controller !== 'undefined') {
this.controller.languageAdded(newLangData);
}
}
/**
* when language was removed this method will be called
* @param {?} removedData
* @return {?}
*/
onLanguageRemoved(removedData) {
if (this.controller !== null && typeof this.controller !== 'undefined') {
this.controller.languageRemoved(removedData);
}
}
/**
* @param {?} $event
* @param {?} langModel
* @param {?} index
* @return {?}
*/
onActionBtnClicked($event, langModel, index) {
let /** @type {?} */ showDialog = true;
if (langModel === null) {
// default
showDialog = false;
}
if (this._langHasDataByIndex(index)) {
showDialog = false;
}
if (showDialog) {
// asking to new tab
let /** @type {?} */ prom = this.createNewLangWithConfirmDialog(langModel.code);
prom.then((result) => {
let /** @type {?} */ data = langModel;
let /** @type {?} */ ev = EventUtils.newCustomEvent(LANG_CLICK_EVENT, this, data, $event);
this.langClickEvent.emit(ev);
});
}
else {
this.langTabChange(langModel);
let /** @type {?} */ data = langModel;
let /** @type {?} */ ev = EventUtils.newCustomEvent(LANG_CLICK_EVENT, this, data, $event);
this.langClickEvent.emit(ev);
}
}
/**
* @param {?} langModel
* @return {?}
*/
isSelectedLanguage(langModel) {
if (typeof this.selectedLang !== 'undefined') {
return this.selectedLang === langModel;
}
return false;
}
/**
* @return {?}
*/
hasLanguage() {
if (this.languageList !== null && typeof this.languageList !== 'undefined' && this.languageList.length > 0) {
return true;
}
return false;
}
/**
* @param {?} defaultData as any
* @return {?} promise that return array of dataLang object
*/
loadDataLanguageList(defaultData) {
if (this.controller !== null && typeof this.controller !== 'undefined') {
return this.controller.loadDataLanguageList(defaultData);
}
return Promise.resolve(null);
}
/**
* @return {?} any as object in pattern {iconURL: string, code: string, label: string}
*/
getLanguageList() {
if (this.controller !== null && typeof this.controller !== 'undefined') {
return this.controller.getLanguageList();
}
return null;
}
/**
* <p style="text-indent: 1em;">
* To check that the data bound to <code>this</code> component having the given language <code><b>code</b></code> or not.
* </p>
*
* @param {?} code The language code to check.
*
* @return {?} <code>True</code> if there is the given language <code><b>code</b></code> in the <code>data</code>. Otherwise,
* returns <code>false</code>.
*/
isLanguageHasData(code) {
if (code !== null && typeof code !== 'undefined') {
let /** @type {?} */ index = this.getLanguageIndex(code);
return this._langHasDataByIndex(index);
}
return false;
}
/**
* <p style="text-indent: 1em;">
* Create a new data lang by showing confirmation dialog first. If the given language code (<code><b>langCode</b></code>) already
* exists in component data, this method will return a resolved <code>Promise</code> having result as data object of the
* corresponding language.
* </p>
*
* @param {?} langCode The language code to create.
*
* @return {?} A <code>Promise</code> with result's value as in the following cases: <br/>
* <ul>
* <li>If [[DialogService]] is not available, returns <code>null</code>.</li>
* <li>If the user clicks <code>NO</code> button, returns <code>null</code>.</li>
* <li>If the given <code><b>langCode</b></code> already exists, returns data object of the corresponding language.</li>
* <li>Otherwise, returns a newly created data object of the given language.</li>
* </ul>
*/
createNewLangWithConfirmDialog(langCode) {
return new Promise((resolve, reject) => {
if (this.dialogService === null || typeof this.dialogService === 'undefined') {
resolve(null);
return;
}
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
this.dialogService.showConfirmDialog('Confirm Create Data', 'Do you want to Create data in new language ?', false).then((result) => {
if (result == 1) {
let /** @type {?} */ rData = this.createNewLang(langCode);
resolve(rData);
}
else {
// NO
resolve(null);
}
});
});
}
/**
* <p style="text-indent: 1em;">
* Remove data lang by showing confirmation dialog first. If the given language code (<code><b>langCode</b></code>) does not
* exist in component data, this method will return a resolved <code>Promise</code> having result as <code>null</code>.
* </p>
*
* @param {?} langCode The language code to remove.
*
* @return {?} A <code>Promise</code> with result's value as in the following cases: <br/>
* <ul>
* <li>If [[DialogService]] is not available, returns <code>null</code>.</li>
* <li>If the user clicks <code>NO</code> button, returns <code>null</code>.</li>
* <li>If the given <code><b>langCode</b></code> does not exist, returns <code>null</code>.</li>
* <li>Otherwise, returns data object of the corresponding <code><b>langCode</b></code>.</li>
* </ul>
*/
removeLangWithConfirmDialog(langCode) {
return new Promise((resolve, reject) => {
if (this.dialogService === null || typeof this.dialogService === 'undefined') {
resolve(null);
return;
}
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
this.dialogService.showConfirmDialog('Confirm Remove Data', 'Do you want to Remove ' + langCode + ' ?', false).then((result) => {
if (result == 1) {
let /** @type {?} */ rData = this.removeLanguageData(langCode);
resolve(rData);
}
else {
// NO
resolve(null);
}
});
});
}
/**
* <p style="text-indent: 1em;">
* Get output [[EventEmitter]] which will emit an event when lang button of <code>this</code> component is clicked.
* </p>
* @return {?}
*/
getLangClickEvent() {
return this.langClickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setLangClickEvent(event) {
this.langClickEvent = event;
}
/**
* @return {?}
*/
getLangAddEvent() {
return this.langAddEvent;
}
/**
* @param {?} event
* @return {?}
*/
setLangAddEvent(event) {
this.langAddEvent = event;
}
/**
* @return {?}
*/
getLangRemoveEvent() {
return this.langRemoveEvent;
}
/**
* @param {?} event
* @return {?}
*/
setLangRemoveEvent(event) {
this.langRemoveEvent = event;
}
/**
* @param {?} data
* @return {?}
*/
setData(data) {
this.data = data;
this.selectedLang = null;
this.refreshDataLanguageList();
}
/**
* @return {?}
*/
isSelfDataDirty() {
if (this.dataLangList !== null && typeof this.dataLangList !== 'undefined') {
let /** @type {?} */ langFieldName = this.getLanguageFieldName();
let /** @type {?} */ objIdFieldName = this.getObjectIdFieldName();
let /** @type {?} */ newLangDirty = false;
for (let /** @type {?} */ dataLang of this.dataLangList) {
if (dataLang === null || typeof dataLang === 'undefined') {
continue;
}
let /** @type {?} */ lang = dataLang[langFieldName];
let /** @type {?} */ objId = dataLang[objIdFieldName];
if (lang !== null && typeof lang !== 'undefined') {
if (objId === null || typeof objId === 'undefined') {
newLangDirty = true;
break;
}
}
let /** @type {?} */ isDirty = this.isDataLanguageDirty(dataLang);
if (isDirty) {
return true;
}
}
if (newLangDirty) {
return true;
}
}
return false;
}
/**
*
* @return {?}
*/
getMergedLanguageList() {
return this.languageList;
}
/**
* @return {?}
*/
selfSaveData() {
}
/**
* @return {?}
*/
selfResetData() {
}
/**
* @param {?} controller
* @return {?}
*/
setController(controller) {
this.controller = controller;
}
/**
* @param {?} langCode
* @return {?}
*/
isNew(langCode) {
if (langCode !== null && typeof langCode !== 'undefined') {
let /** @type {?} */ oldLangContsins = (this.oldLangs.indexOf(langCode) >= 0) ? true : false;
let /** @type {?} */ markLangContsins = (this.markCreatedLangs.indexOf(langCode) >= 0) ? true : false;
return !oldLangContsins && !markLangContsins;
}
else {
// DefaultData
let /** @type {?} */ defaultData = this.getDefaultData();
if (defaultData !== null && typeof defaultData !== 'undefined') {
let /** @type {?} */ uuid = defaultData._uuid;
if (uuid === null || typeof uuid === 'undefined') {
return true;
}
}
else {
return true;
}
}
return false;
}
/**
* @param {?} langCode
* @return {?}
*/
markLangAsCreated(langCode) {
if (langCode === null || typeof langCode === 'undefined') {
// DefaultData
}
let /** @type {?} */ index = this.markCreatedLangs.indexOf(langCode);
if (index < 0) {
this.markCreatedLangs.push(langCode);
}
}
/**
* @param {?} langCode
* @return {?}
*/
unmarkLangAsCreated(langCode) {
if (langCode === null || typeof langCode === 'undefined') {
// DefaultData
}
let /** @type {?} */ index = this.markCreatedLangs.indexOf(langCode);
if (index >= 0) {
this.markCreatedLangs.splice(index, 1);
}
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @return {?}
*/
_getDefaultData() {
return this.defaultData;
}
}
tslib_1.__decorate([
Option('langClick'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataLangSelector.prototype, "langClickEvent", void 0);
tslib_1.__decorate([
Option('langAdd'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataLangSelector.prototype, "langAddEvent", void 0);
tslib_1.__decorate([
Option('langRemove'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataLangSelector.prototype, "langRemoveEvent", void 0);
function AbstractDataLangSelector_tsickle_Closure_declarations() {
/** @type {?} */
AbstractDataLangSelector.prototype.oldLangs;
/** @type {?} */
AbstractDataLangSelector.prototype.markCreatedLangs;
/** @type {?} */
AbstractDataLangSelector.prototype.defaultData;
/** @type {?} */
AbstractDataLangSelector.prototype.langClickEvent;
/** @type {?} */
AbstractDataLangSelector.prototype.langAddEvent;
/** @type {?} */
AbstractDataLangSelector.prototype.langRemoveEvent;
/** @type {?} */
AbstractDataLangSelector.prototype.dialogService;
/** @type {?} */
AbstractDataLangSelector.prototype.languageList;
/** @type {?} */
AbstractDataLangSelector.prototype.selectedLang;
/** @type {?} */
AbstractDataLangSelector.prototype.dataLangList;
/** @type {?} */
AbstractDataLangSelector.prototype.controller;
/**
* @abstract
* @return {?} any as one object.
*/
AbstractDataLangSelector.prototype.getDefaultData = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDataLangSelector.prototype.getDataObjects = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDataLangSelector.prototype.getLanguageFieldName = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDataLangSelector.prototype.getObjectIdFieldName = function () { };
/**
* @abstract
* @param {?} data as a dataLanguage
* @return {?} boolean is dataLanguageDirty
*/
AbstractDataLangSelector.prototype.isDataLanguageDirty = function (data) { };
/**
* @abstract
* @param {?} langCode
* @return {?}
*/
AbstractDataLangSelector.prototype.parseLanguageButtonModel = function (langCode) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRhTGFuZ1NlbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0Fic3RyYWN0RGF0YUxhbmdTZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBNEIsWUFBWSxFQUFzQixNQUFNLGVBQWUsQ0FBQztBQUUzRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUs1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7O0FBVy9GLE1BQU0sK0JBQXlDLFNBQVEsbUJBQW1COzs7OztJQW1CeEUsWUFBWSxVQUFzQixFQUFFLGFBQTRCO1FBQzlELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFD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