UNPKG

stimulsoft-viewer-angular

Version:
697 lines 104 kB
import { Injectable } from '@angular/core'; import { DateTimeObject } from './objects'; import * as i0 from "@angular/core"; import * as i1 from "./model.service"; import * as i2 from "./animation.service"; export class HelperService { constructor(model, animationService) { this.model = model; this.animationService = animationService; } val(value, def) { return value != null && value.trim() !== '' ? value : (def || ''); } findPosY(obj, mainClassName, noScroll) { let curtop = noScroll ? 0 : this.getScrollYOffset(obj, mainClassName); if (obj.offsetParent) { while (obj.className !== mainClassName) { curtop += obj.offsetTop; if (!obj.offsetParent) { break; } obj = obj.offsetParent; } } else if (obj.y) { curtop += obj.y; } return curtop; } getScrollYOffset(obj, mainClassName) { let scrolltop = 0; if (obj.parentElement) { while (obj.className !== mainClassName) { if ('scrollTop' in obj) { scrolltop -= obj.scrollTop; } if (!obj.parentElement) { break; } obj = obj.parentElement; } } return scrolltop; } findPosX(obj, mainClassName, noScroll) { let curleft = noScroll ? 0 : this.getScrollXOffset(obj, mainClassName); if (obj.offsetParent) { while (obj.className !== mainClassName) { curleft += obj.offsetLeft; if (!obj.offsetParent) { break; } obj = obj.offsetParent; } } else if (obj.x) { curleft += obj.x; } return curleft; } getScrollXOffset(obj, mainClassName) { let scrollleft = 0; if (obj.parentElement) { while (obj.className !== mainClassName) { if ('scrollLeft' in obj) { scrollleft -= obj.scrollLeft; } if (!obj.parentElement) { break; } obj = obj.parentElement; } } return scrollleft; } showHelpWindow(url) { let helpLanguage = 'en'; switch (this.model.options.cultureName) { case 'ru': helpLanguage = 'ru'; // case 'de': helpLanguage = 'de'; } this.openNewWindow('https://www.stimulsoft.com/' + helpLanguage + '/documentation/online/' + url); } openNewWindow(url, name, specs) { return window.open(url, name, specs); } scrollToAnchor(anchorName, componentGuid) { let aHyperlinks = this.model.controls.reportPanel.el.nativeElement.getElementsByTagName("a"); const identicalAnchors = []; if (anchorName) { anchorName = anchorName.replace(/!!#92/g, '\\'); } if (componentGuid) { for (let i = 0; i < aHyperlinks.length; i++) { if (aHyperlinks[i].getAttribute('guid') === componentGuid) { identicalAnchors.push(aHyperlinks[i]); } } } if (identicalAnchors.length === 0) { let guidIndex = anchorName.indexOf("#GUID#"); if (identicalAnchors.length == 0) { let aHyperlinks = this.model.controls.reportPanel.el.nativeElement.getElementsByTagName("a"); for (var i = 0; i < aHyperlinks.length; i++) { if (aHyperlinks[i].name && ((guidIndex >= 0 && (aHyperlinks[i].name.indexOf(anchorName.substring(guidIndex + 6)) >= 0 || anchorName.substring(0, guidIndex) == aHyperlinks[i].name)) || aHyperlinks[i].name == anchorName)) identicalAnchors.push(aHyperlinks[i]); } } } if (identicalAnchors.length > 0) { const anchor = identicalAnchors[0]; const anchorParent = anchor.parentElement || anchor; let anchorHeight = anchorParent.offsetHeight; const anchorOffsetTop = anchorParent.offsetTop; identicalAnchors.forEach((identicalAnchor) => { const nextAnchorParent = identicalAnchor.parentElement || identicalAnchor; if (nextAnchorParent.offsetTop > anchorOffsetTop) { anchorHeight = Math.max(anchorHeight, nextAnchorParent.offsetTop - anchorOffsetTop + nextAnchorParent.offsetHeight); } }); const date = new Date(); const endTime = date.getTime() + this.model.options.scrollDuration; const targetTop = this.findPosY(anchor, this.model.options.appearance.scrollbarsMode ? 'stiJsViewerReportPanel' : null, true) - anchorParent.offsetHeight * 2; this.animationService.showAnimationForScroll(this.model.controls.reportPanel.el.nativeElement, targetTop, endTime, () => { const page = this.getPageFromAnchorElement(anchor); const anchorParentTopPos = this.findPosY(anchorParent, 'stiJsViewerReportPanel', true); const pageTopPos = page ? this.findPosY(page, 'stiJsViewerReportPanel', true) : anchorParentTopPos; this.removeBookmarksLabel(); const label = document.createElement('div'); this.model.controls.bookmarksLabel = label; label.className = 'stiJsViewerBookmarksLabel'; const labelMargin = 20 * (this.model.reportParams.zoom / 100); const labelWidth = page ? page.offsetWidth - labelMargin - 6 : anchorParent.offsetWidth; const labelHeight = anchorHeight - 2; label.style.width = labelWidth + 'px'; label.style.height = labelHeight + 'px'; const margins = page.pageAttributes.margins?.replace('px', '').split(' '); const pageLeftMargin = page.pageAttributes.margins ? this.strToInt(margins[3]) : 0; const pageTopMargin = page.pageAttributes.margins ? this.strToInt(margins[0]) : 0; label.style.marginLeft = (labelMargin / 2 - pageLeftMargin) + 'px'; label.style.marginTop = (anchorParentTopPos - pageTopPos - pageTopMargin - (this.model.reportParams.zoom / 100) - 1) + 'px'; page.insertBefore(label, page.childNodes[0]); }); } } removeBookmarksLabel() { if (this.model.controls.bookmarksLabel) { this.model.controls.bookmarksLabel.parentElement.removeChild(this.model.controls.bookmarksLabel); this.model.controls.bookmarksLabel = null; } } getPageFromAnchorElement(anchorElement) { let obj = anchorElement; while (obj.parentElement) { if (obj.className && obj.className.indexOf('stiJsViewerPage') === 0) { return obj; } obj = obj.parentElement; } return obj; } strToInt(value) { const result = parseInt(value, 10); return result || 0; } strToDouble(value) { if (value === null) { return null; } const result = parseFloat(value.toString().replace(',', '.').trim()); return result || 0; } copyObject(o) { if (!o || 'object' !== typeof o) { return o; } const c = 'function' === typeof o.pop ? [] : {}; let p; let v; for (p in o) { if (o.hasOwnProperty(p)) { v = o[p]; if (v && 'object' === typeof v) { c[p] = this.copyObject(v); } else { c[p] = v; } } } return c; } getCountObjects(objectArray) { let count = 0; if (objectArray) { for (const singleObject in objectArray) { count++; } } return count; } replaceMonths(value) { for (let i = 1; i <= 12; i++) { let enName = ''; let locName = ''; switch (i) { case 1: enName = 'January'; locName = this.model.loc('MonthJanuary'); break; case 2: enName = 'February'; locName = this.model.loc('MonthFebruary'); break; case 3: enName = 'March'; locName = this.model.loc('MonthMarch'); break; case 4: enName = 'April'; locName = this.model.loc('MonthApril'); break; case 5: enName = 'May'; locName = this.model.loc('MonthMay'); break; case 6: enName = 'June'; locName = this.model.loc('MonthJune'); break; case 7: enName = 'July'; locName = this.model.loc('MonthJuly'); break; case 8: enName = 'August'; locName = this.model.loc('MonthAugust'); break; case 9: enName = 'September'; locName = this.model.loc('MonthSeptember'); break; case 10: enName = 'October'; locName = this.model.loc('MonthOctober'); break; case 11: enName = 'November'; locName = this.model.loc('MonthNovember'); break; case 12: enName = 'December'; locName = this.model.loc('MonthDecember'); break; } const enShortName = enName.substring(0, 3); const locShortName = locName.substring(0, 3); value = value.replace(enName, i).replace(enName.toLowerCase(), i).replace(enShortName, i).replace(enShortName.toLowerCase(), i); value = value.replace(locName, i).replace(locName.toLowerCase(), i).replace(locShortName, i).replace(locShortName.toLowerCase(), i); } return value; } getDate(dateTimeObj) { return new Date(dateTimeObj.year, dateTimeObj.month - 1, dateTimeObj.day, dateTimeObj.hours, dateTimeObj.minutes, dateTimeObj.seconds); } getDateTimeObject(date) { if (!date) { date = new Date(); } const dateTimeObject = new DateTimeObject(); dateTimeObject.year = date.getFullYear(); dateTimeObject.month = date.getMonth() + 1; dateTimeObject.day = date.getDate(); dateTimeObject.hours = date.getHours(); dateTimeObject.minutes = date.getMinutes(); dateTimeObject.seconds = date.getSeconds(); return dateTimeObject; } getDateTimeFromString(value, format) { const charIsDigit = (ch) => { return ('0123456789'.indexOf(ch) >= 0); }; if (!value) { return new Date(); } value = this.replaceMonths(value); let dateTime = new Date(); // If the date format is not specified, then deserializator for getting date and time is applied if (format === null) { format = 'dd.MM.yyyy hh:mm:ss'; } // Otherwise the format is parsed. Now only numeric date and time formats are supported let year = 1970; let month = 1; let day = 1; let hour = 0; let minute = 0; let second = 0; let millisecond = 0; let char = ''; let pos = 0; const values = []; // Parse date and time into separate numeric values while (pos < value.length) { char = value.charAt(pos); if (charIsDigit(char)) { values.push(char); pos++; while (pos < value.length && charIsDigit(value.charAt(pos))) { values[values.length - 1] += value.charAt(pos); pos++; } values[values.length - 1] = this.strToInt(values[values.length - 1]); } pos++; } pos = 0; let charCount = 0; let index = -1; let is12hour = false; // Parsing format and replacement of appropriate values of date and time while (pos < format.length) { char = format.charAt(pos); charCount = 0; if (char === 'Y' || char === 'y' || char === 'M' || char === 'd' || char === 'h' || char === 'H' || char === 'm' || char === 's' || char === 'f' || char === 'F' || char === 't' || char === 'z') { index++; while (pos < format.length && format.charAt(pos) === char) { pos++; charCount++; } } switch (char) { case 'Y': // full year year = values[index]; break; case 'y': // year if (values[index] < 1000) { year = 2000 + values[index]; } else { year = values[index]; } break; case 'M': // month month = values[index]; break; case 'd': // day day = values[index]; break; case 'h': // (hour 12) is12hour = true; hour = values[index]; break; case 'H': // (hour 24) hour = values[index]; break; case 'm': // minute minute = values[index]; break; case 's': // second second = values[index]; break; case 'f': // second fraction case 'F': // second fraction, trailing zeroes are trimmed millisecond = values[index]; break; case 't': // PM or AM if (value.toLowerCase().indexOf('am') >= 0 && hour === 12) { hour = 0; } if (value.toLowerCase().indexOf('pm') >= 0 && hour < 12) { hour += 12; } break; default: pos++; break; } } dateTime = new Date(year || new Date().getFullYear(), month - 1 || 0, day || 1, hour || 0, minute || 0, second, millisecond || 0); if (!dateTime || isNaN(dateTime)) { return new Date(); } return dateTime; } getStringDateTime(object, dateTimeType) { if (dateTimeType === 'Date') { object.hours = 0; object.minutes = 0; object.seconds = 0; } return object.month + '/' + object.day + '/' + object.year + ' ' + (object.hours > 12 ? object.hours - 12 : object.hours) + ':' + object.minutes + ':' + object.seconds + ' ' + (object.hours < 12 ? 'AM' : 'PM'); } dateTimeObjectToString(dateTimeObject, typeDateTimeObject) { const date = new Date(dateTimeObject.year, dateTimeObject.month - 1, dateTimeObject.day, dateTimeObject.hours, dateTimeObject.minutes, dateTimeObject.seconds); if (this.model.options.appearance.parametersPanelDateFormat !== '') { return this.formatDate(date, this.model.options.appearance.parametersPanelDateFormat); } return this.dateToLocaleString(date, typeDateTimeObject); } dateToLocaleString(date, dateTimeType) { const timeString = date.toLocaleTimeString(); const isAmericanFormat = timeString.toLowerCase().indexOf('am') >= 0 || timeString.toLowerCase().indexOf('pm') >= 0; let formatDate = isAmericanFormat ? 'MM/dd/yyyy' : 'dd.MM.yyyy'; const yyyy = date.getFullYear(); const yy = yyyy.toString().substring(2); const M = date.getMonth() + 1; const MM = M < 10 ? '0' + M : M; const d = date.getDate(); const dd = d < 10 ? '0' + d : d; formatDate = formatDate.replace(/yyyy/i, yyyy); formatDate = formatDate.replace(/yy/i, yy); formatDate = formatDate.replace(/MM/i, MM); formatDate = formatDate.replace(/M/i, M); formatDate = formatDate.replace(/dd/i, dd); formatDate = formatDate.replace(/d/i, d); let h = date.getHours(); let tt = ''; if (isAmericanFormat) { tt = h < 12 ? ' AM' : ' PM'; h = h > 12 ? h - 12 : h; if (h === 0) { h = 12; } } else { h = h < 10 ? '0' + h : h; } let m = date.getMinutes(); m = m < 10 ? '0' + m : m; let s = date.getSeconds(); s = s < 10 ? '0' + s : s; const formatTime = h + ':' + m + ':' + s + tt; if (dateTimeType === 'Time') { return formatTime; } if (dateTimeType === 'Date') { return formatDate; } return formatDate + ' ' + formatTime; } formatDate(formatDate, formatString) { const yyyy = formatDate.getFullYear(); const yy = yyyy.toString().substring(2); const m = formatDate.getMonth() + 1; const mm = m < 10 ? '0' + m : m; const d = formatDate.getDate(); const dd = d < 10 ? '0' + d : d; const h = formatDate.getHours(); const hh = h < 10 ? '0' + h : h; const h12 = h > 12 ? h - 12 : (h > 0 ? h : 12); const hh12 = h12 < 10 ? '0' + h12 : h12; const n = formatDate.getMinutes(); const nn = n < 10 ? '0' + n : n; const s = formatDate.getSeconds(); const ss = s < 10 ? '0' + s : s; const tt = h < 12 ? 'AM' : 'PM'; formatString = formatString.replace(/yyyy/gi, yyyy); formatString = formatString.replace(/yy/gi, yy); formatString = formatString.replace(/Y/, yyyy); formatString = formatString.replace(/MM/g, mm); formatString = formatString.replace(/M/g, m); formatString = formatString.replace(/dd/g, dd); formatString = formatString.replace(/d/g, d); formatString = formatString.replace(/hh/g, hh12); formatString = formatString.replace(/h/g, h12); formatString = formatString.replace(/HH/g, hh); formatString = formatString.replace(/H/g, h); formatString = formatString.replace(/mm/g, nn); formatString = formatString.replace(/m/g, n); formatString = formatString.replace(/ss/g, ss); formatString = formatString.replace(/s/g, s); formatString = formatString.replace(/tt/gi, tt); formatString = formatString.replace(/t/gi, tt.substr(0, 1)); return formatString; } getStringKey(key, params) { if (key === null) { return ''; } return ((params.type === 'DateTime') ? this.dateTimeObjectToString(key, params.dateTimeType) : key); } stringToTime(timeStr) { const timeArray = timeStr.split(':'); const time = { hours: 0, minutes: 0, seconds: 0 }; time.hours = this.strToInt(timeArray[0]); if (timeArray.length > 1) { time.minutes = this.strToInt(timeArray[1]); } if (timeArray.length > 2) { time.seconds = this.strToInt(timeArray[2]); } if (time.hours < 0) { time.hours = 0; } if (time.minutes < 0) { time.minutes = 0; } if (time.seconds < 0) { time.seconds = 0; } if (time.hours > 23) { time.hours = 23; } if (time.minutes > 59) { time.minutes = 59; } if (time.seconds > 59) { time.seconds = 59; } return time; } newGuid() { const chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split(''); const uuid = []; const rnd = Math.random; let r; uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; for (let i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | rnd() * 16; uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r & 0xf]; } } return uuid.join(''); } getCountDaysOfMonth(year, month) { const countDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; let count = countDaysInMonth[month]; if (month === 1) { if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) { count = 29; } else { count = 28; } } return count; } setObjectToCenter(object, defaultTop) { const leftPos = (this.model.viewerSize.width / 2 - object.offsetWidth / 2); const topPos = this.model.options.appearance.fullScreenMode ? (this.model.viewerSize.height / 2 - object.offsetHeight / 2) : (defaultTop ? defaultTop : 250); return { left: Math.max(leftPos, 0), top: Math.max(topPos, 0) }; } checkCloudAuthorization(action) { return true; } getCookie_(name) { const cookie = ' ' + document.cookie; const search = ' ' + name + '='; let setStr = null; let offset = 0; let end = 0; if (cookie.length > 0) { offset = cookie.indexOf(search); if (offset !== -1) { offset += search.length; end = cookie.indexOf(';', offset); if (end === -1) { end = cookie.length; } setStr = unescape(cookie.substring(offset, end)); } } return setStr; } getCookie(name) { if (this.model.options.standaloneJsMode || typeof localStorage === 'undefined' || name.indexOf('sti_') == 0 || name.indexOf('login') == 0) { return this.getCookie_(name); } let value = localStorage.getItem(name); if (value != null) { return value; } else { value = this.getCookie_(name); if (value != null) { this.removeCookie(name); localStorage.setItem(name, value); } return value; } } removeCookie(name) { document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'; } setCookie(name, value, path, domain, secure, expires) { if (this.model.options.standaloneJsMode || typeof localStorage === 'undefined' || name.indexOf('sti_') === 0 || name.indexOf('login') === 0) { // save to cookies if (value && typeof (value) === 'string' && value.length >= 4096) { return; } const pathName = location.pathname; const expDate = new Date(); expDate.setTime(expDate.getTime() + (365 * 24 * 3600 * 1000)); document.cookie = name + '=' + escape(value) + '; expires=' + (expires || expDate['toGMTString']()) + ((path) ? '; path=' + path : '; path=/') + ((domain) ? '; domain=' + domain : '') + ((secure) ? '; secure' : ''); } else { // save to localstorage localStorage.setItem(name, value); } } getNavigatorName() { if (!navigator) { return 'Unknown'; } const userAgent = navigator.userAgent; if (userAgent.indexOf('Edge') >= 0) { return 'Edge'; } if (userAgent.indexOf('MSIE') >= 0 || userAgent.indexOf('Trident') >= 0) { return 'MSIE'; } if (userAgent.indexOf('Gecko') >= 0) { if (userAgent.indexOf('Chrome') >= 0) { return 'Chrome'; } if (userAgent.indexOf('Safari') >= 0) { return 'Safari'; } return 'Mozilla'; } if (userAgent.indexOf('Opera') >= 0) { return 'Opera'; } } isTouchDevice() { return ('ontouchstart' in document.documentElement); } isMobileDevice() { return /iPhone|iPad|iPod|Macintosh|Android|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } getHumanFileSize(value, decimals) { const i = Math.floor(Math.log(value) / Math.log(1024)); return ((value / Math.pow(1024, i)).toFixed(decimals)) + ' ' + ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i]; } getZoomMenuItems() { const items = [{ name: 'Zoom25', caption: '25%', img: '' }, { name: 'Zoom50', caption: '50%', img: '' }, { name: 'Zoom75', caption: '75%', img: '' }, { name: 'Zoom100', caption: '100%', img: '' }, { name: 'Zoom150', caption: '150%', img: '' }, { name: 'Zoom200', caption: '200%', img: '' }]; if (this.model.options.toolbar.displayMode !== 'Separated') { items.push({ type: 'separator' }); items.push({ name: 'ZoomOnePage', caption: this.model.loc('ZoomOnePage'), img: 'ZoomOnePage.png' }); items.push({ name: 'ZoomPageWidth', caption: this.model.loc('ZoomPageWidth'), img: 'ZoomPageWidth.png' }); } return items; } get helpLinks() { return { Print: 'user-manual/index.html?viewer_reports.htm#toolbar', Save: 'user-manual/index.html?viewer_reports.htm#toolbar', SendEmail: 'user-manual/index.html?viewer_reports.htm#toolbar', Bookmarks: 'user-manual/index.html?viewer_reports.htm#toolbar', Parameters: 'user-manual/index.html?viewer_reports.htm#toolbar', FirstPage: 'user-manual/index.html?viewer_reports.htm#statusbar', PrevPage: 'user-manual/index.html?viewer_reports.htm#statusbar', NextPage: 'user-manual/index.html?viewer_reports.htm#statusbar', LastPage: 'user-manual/index.html?viewer_reports.htm#statusbar', FullScreen: 'user-manual/index.html?viewer_reports.htm#toolbar', Zoom: 'user-manual/index.html?viewer_reports.htm#statusbar', ViewMode: 'user-manual/index.html?viewer_reports.htm#displayingmode', Editor: 'user-manual/index.html?viewer_reports.htm#toolbar', Find: 'user-manual/index.html?viewer_reports.htm#searchpanel', DashboardToolbar: 'user-manual/index.html?viewer_dashboards.htm#controlbuttonsofthedashboard', DashboardElementToolbar: 'user-manual/index.html?viewer_dashboards.htm#elementcontrols', DashboardExport: 'user-manual/index.html?exports_dashboards.htm', DashboardPdfExport: 'user-manual/index.html?exports_dashboards.htm#pdfexportsettings', DashboardExcelExport: 'user-manual/index.html?exports_dashboards.htm#excelexportsettings', DashboardImageExport: 'user-manual/index.html?exports_dashboards.htm#imageexportsettings', DashboardDataExport: 'user-manual/index.html?exports_dashboards.htm#exportsettingsofdata' }; } getBackText(withoutBrackets) { const backText = String.fromCharCode(84) + 'r' + String.fromCharCode(105) + 'a'; if (withoutBrackets) { return backText + String.fromCharCode(108); } return String.fromCharCode(91) + backText + String.fromCharCode(108) + String.fromCharCode(93); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService, deps: [{ token: i1.ModelService }, { token: i2.AnimationService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.ModelService }, { type: i2.AnimationService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGltdWxzb2Z0LXZpZXdlci1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvaGVscGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7O0FBSTNDLE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQW9CLEtBQW1CLEVBQVUsZ0JBQWtDO1FBQS9ELFVBQUssR0FBTCxLQUFLLENBQWM7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUksQ0FBQztJQUVqRixHQUFHLENBQUMsS0FBYSxFQUFFLEdBQVk7UUFDcEMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLFFBQVEsQ0FBQyxHQUFRLEVBQUUsYUFBc0IsRUFBRSxRQUFrQjtRQUNsRSxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNyQixPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsR0FBRyxHQUFHLEdB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