tweb/stats.json

9666 lines
5.6 MiB
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"errors": [],
"warnings": [
"asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).\nThis can impact web performance.\nAssets: \n bundle.js (1.09 MiB)",
"entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.\nEntrypoints:\n main (1.09 MiB)\n bundle.js\n",
"webpack performance recommendations: \nYou can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.\nFor more info visit https://webpack.js.org/guides/code-splitting/"
],
"version": "4.41.2",
"hash": "e5bb06c076e3ed69a540",
"time": 8680,
"builtAt": 1579094416874,
"publicPath": "",
"outputPath": "/Users/kuzmenko/Documents/projects/tweb/public",
"assetsByChunkName": {
"main": "bundle.js"
},
"assets": [
{
"name": "assets/fonts/tgico.eot",
"size": 21788,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/fonts/tgico.svg",
"size": 78299,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/fonts/tgico.svg.br",
"size": 17893,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/fonts/tgico.ttf",
"size": 21632,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/fonts/tgico.woff",
"size": 21708,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/img/msg-tail-left.svg",
"size": 1026,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "assets/img/msg-tail-right.svg",
"size": 973,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "bundle.js",
"size": 1142787,
"chunks": [
0
],
"chunkNames": [
"main"
],
"info": {},
"emitted": true,
"isOverSizeLimit": true
},
{
"name": "bundle.js.br",
"size": 225779,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
},
{
"name": "c05c8d5242c7b2494d71.worker.js",
"size": 105265,
"chunks": [],
"chunkNames": [],
"info": {
"immutable": true
},
"emitted": true
},
{
"name": "c05c8d5242c7b2494d71.worker.js.br",
"size": 30801,
"chunks": [],
"chunkNames": [],
"info": {},
"emitted": true
}
],
"filteredAssets": 0,
"entrypoints": {
"main": {
"chunks": [
0
],
"assets": [
"bundle.js"
],
"children": {},
"childAssets": {},
"isOverSizeLimit": true
}
},
"namedChunkGroups": {
"main": {
"chunks": [
0
],
"assets": [
"bundle.js"
],
"children": {},
"childAssets": {},
"isOverSizeLimit": true
}
},
"chunks": [
{
"id": 0,
"rendered": true,
"initial": true,
"entry": true,
"size": 2285829,
"names": [
"main"
],
"files": [
"bundle.js"
],
"hash": "744b15056b7f610a19ae",
"siblings": [],
"parents": [],
"children": [],
"childrenByOrder": {},
"modules": [
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/utils.js",
"name": "./src/lib/utils.js",
"index": 29,
"index2": 26,
"size": 19444,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "58:14-32"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "38:14-32"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "17:14-32"
},
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "6:14-32"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony side effect evaluation",
"userRequest": "./utils",
"loc": "1:0-59"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "108:14-26"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "345:32-36"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "367:11-25"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "398:8-22"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "426:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "439:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "457:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "468:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "470:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "483:18-32"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "490:12-26"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "506:76-90"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "536:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "538:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "559:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "565:65-79"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "566:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "576:12-26"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "13:14-32"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/utils",
"loc": "18:14-37"
}
],
"usedExports": true,
"providedExports": [
"dT",
"isObject",
"tsNow",
"safeReplaceObject",
"numberWithCommas",
"isElementInViewport",
"copy",
"ripple",
"encodeEntities",
"calcImageInBox",
"emojiUnicode",
"countryCodeEmoji",
"unifiedCountryCodeEmoji",
"SearchIndexManager"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/pageSignIn.ts (referenced with cjs require), ./src/lib/cryptoworker.ts (referenced with cjs require), ./src/lib/mtnetworker.ts (referenced with cjs require), ./src/lib/mtproto.ts (referenced with cjs require), ./src/lib/services.ts (referenced with cjs require), ./src/lib/tl_utils.ts (referenced with cjs require)"
],
"depth": 2,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\nvar _logTimer = (new Date()).getTime()\r\nexport function dT () {\r\n return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']'\r\n}\r\n\r\nfunction checkClick (e, noprevent) {\r\n if (e.which == 1 && (e.ctrlKey || e.metaKey) || e.which == 2) {\r\n return true\r\n }\r\n\r\n if (!noprevent) {\r\n e.preventDefault()\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction isInDOM (element, parentNode) {\r\n if (!element) {\r\n return false\r\n }\r\n parentNode = parentNode || document.body\r\n if (element == parentNode) {\r\n return true\r\n }\r\n return isInDOM(element.parentNode, parentNode)\r\n}\r\n\r\nfunction checkDragEvent (e) {\r\n if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false\r\n if (e.dataTransfer && e.dataTransfer.types) {\r\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\r\n if (e.dataTransfer.types[i] == 'Files') {\r\n return true\r\n }\r\n }\r\n } else {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction cancelEvent (event) {\r\n event = event || window.event\r\n if (event) {\r\n event = event.originalEvent || event\r\n\r\n if (event.stopPropagation) event.stopPropagation()\r\n if (event.preventDefault) event.preventDefault()\r\n event.returnValue = false\r\n event.cancelBubble = true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction hasOnclick (element) {\r\n if (element.onclick ||\r\n element.getAttribute('ng-click')) {\r\n return true\r\n }\r\n var events = $._data(element, 'events')\r\n if (events && (events.click || events.mousedown)) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nfunction getScrollWidth () {\r\n var outer = $('<div>').css({\r\n position: 'absolute',\r\n width: 100,\r\n height: 100,\r\n overflow: 'scroll',\r\n top: -9999\r\n }).appendTo($(document.body))\r\n\r\n var scrollbarWidth = outer[0].offsetWidth - outer[0].clientWidth\r\n outer.remove()\r\n\r\n return scrollbarWidth\r\n}\r\n\r\nfunction onCtrlEnter (textarea, cb) {\r\n $(textarea).on('keydown', function (e) {\r\n if (e.keyCode == 13 && (e.ctrlKey || e.metaKey)) {\r\n cb()\r\n return cancelEvent(e)\r\n }\r\n })\r\n}\r\n\r\nfunction setFieldSelection (field, from, to) {\r\n field = $(field)[0]\r\n try {\r\n field.focus()\r\n if (from === undefined || from === false) {\r\n from = field.value.length\r\n }\r\n if (to === undefined || to === false) {\r\n to = from\r\n }\r\n if (field.createTextRange) {\r\n var range = field.createTextRange()\r\n range.collapse(true)\r\n range.moveEnd('character', to)\r\n range.moveStart('character', from)\r\n range.select()\r\n }\r\n else if (field.setSelectionRange) {\r\n field.setSelectionRange(from, to)\r\n }\r\n } catch(e) {}\r\n}\r\n\r\nfunction getFieldSelection (field) {\r\n if (field.selectionStart) {\r\n return field.selectionStart\r\n }\r\n else if (!document.selection) {\r\n return 0\r\n }\r\n\r\n var c = '\\x01'\r\n var sel = document.selection.createRange()\r\n var txt = sel.text\r\n var dup = sel.duplicate()\r\n var len = 0\r\n\r\n try {\r\n dup.moveToElementText(field)\r\n } catch(e) {\r\n return 0\r\n }\r\n\r\n sel.text = txt + c\r\n len = dup.text.indexOf(c)\r\n sel.moveStart('character', -1)\r\n sel.text = ''\r\n\r\n // if (browser.msie && len == -1) {\r\n // return field.value.length\r\n // }\r\n return len\r\n}\r\n\r\nfunction getRichValue (field) {\r\n if (!field) {\r\n return ''\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n getRichElementValue(field, lines, line)\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return value\r\n}\r\n\r\nfunction getRichValueWithCaret (field) {\r\n if (!field) {\r\n return []\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n var sel = window.getSelection ? window.getSelection() : false\r\n var selNode\r\n var selOffset\r\n if (sel && sel.rangeCount) {\r\n var range = sel.getRangeAt(0)\r\n if (range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n range.startOffset == range.endOffset) {\r\n selNode = range.startContainer\r\n selOffset = range.startOffset\r\n }\r\n }\r\n\r\n getRichElementValue(field, lines, line, selNode, selOffset)\r\n\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n var caretPos = value.indexOf('\\x01')\r\n if (caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1)\r\n }\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return [value, caretPos]\r\n}\r\n\r\nfunction getRichElementValue (node, lines, line, selNode, selOffset) {\r\n if (node.nodeType == 3) { // TEXT\r\n if (selNode === node) {\r\n var value = node.nodeValue\r\n line.push(value.substr(0, selOffset) + '\\x01' + value.substr(selOffset))\r\n } else {\r\n line.push(node.nodeValue)\r\n }\r\n return\r\n }\r\n if (node.nodeType != 1) { // NON-ELEMENT\r\n return\r\n }\r\n var isSelected = (selNode === node)\r\n var isBlock = node.tagName == 'DIV' || node.tagName == 'P'\r\n var curChild\r\n if (isBlock && line.length || node.tagName == 'BR') {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n else if (node.tagName == 'IMG') {\r\n if (node.alt) {\r\n line.push(node.alt)\r\n }\r\n }\r\n if (isSelected && !selOffset) {\r\n line.push('\\x01')\r\n }\r\n var curChild = node.firstChild\r\n while (curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset)\r\n curChild = curChild.nextSibling\r\n }\r\n if (isSelected && selOffset) {\r\n line.push('\\x01')\r\n }\r\n if (isBlock && line.length) {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n}\r\n\r\nfunction setRichFocus (field, selectNode, noCollapse) {\r\n field.focus()\r\n if (selectNode &&\r\n selectNode.parentNode == field &&\r\n !selectNode.nextSibling &&\r\n !noCollapse) {\r\n field.removeChild(selectNode)\r\n selectNode = null\r\n }\r\n if (window.getSelection && document.createRange) {\r\n var range = document.createRange()\r\n if (selectNode) {\r\n range.selectNode(selectNode)\r\n } else {\r\n range.selectNodeContents(field)\r\n }\r\n if (!noCollapse) {\r\n range.collapse(false)\r\n }\r\n\r\n var sel = window.getSelection()\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n }\r\n else if (document.body.createTextRange !== undefined) {\r\n var textRange = document.body.createTextRange()\r\n textRange.moveToElementText(selectNode || field)\r\n if (!noCollapse) {\r\n textRange.collapse(false)\r\n }\r\n textRange.select()\r\n }\r\n}\r\n\r\nfunction getSelectedText () {\r\n var sel = (\r\n window.getSelection && window.getSelection() ||\r\n document.getSelection && document.getSelection() ||\r\n document.selection && document.selection.createRange().text || ''\r\n ).toString().replace(/^\\s+|\\s+$/g, '')\r\n\r\n return sel\r\n}\r\n\r\nfunction scrollToNode (scrollable, node, scroller) {\r\n var elTop = node.offsetTop - 15\r\n var elHeight = node.offsetHeight + 30\r\n var scrollTop = scrollable.scrollTop\r\n var viewportHeight = scrollable.clientHeight\r\n\r\n if (scrollTop > elTop) { // we are below the node to scroll\r\n scrollable.scrollTop = elTop\r\n $(scroller).nanoScroller({flash: true})\r\n }\r\n else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll\r\n scrollable.scrollTop = elTop + elHeight - viewportHeight\r\n $(scroller).nanoScroller({flash: true})\r\n }\r\n}\r\n\r\nif (Config.Modes.animations &&\r\n typeof window.requestAnimationFrame == 'function') {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return (function () {\r\n window.requestAnimationFrame(cb)\r\n })\r\n }\r\n} else {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return cb\r\n }\r\n}\r\n\r\nfunction onContentLoaded (cb) {\r\n cb = onAnimationFrameCallback(cb)\r\n setZeroTimeout(cb)\r\n}\r\n\r\nexport function isObject(object) {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function tsNow (seconds) {\r\n var t = +new Date() + (window.tsOffset || 0)\r\n return seconds ? Math.floor(t / 1000) : t\r\n}\r\n\r\nexport function safeReplaceObject (wasObject, newObject) {\r\n for (var key in wasObject) {\r\n if (!newObject.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n delete wasObject[key]\r\n }\r\n }\r\n for (var key in newObject) {\r\n if (newObject.hasOwnProperty(key)) {\r\n wasObject[key] = newObject[key]\r\n }\r\n }\r\n}\r\n\r\nexport function numberWithCommas(x) {\r\n var parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function isElementInViewport(el) {\r\n var rect = el.getBoundingClientRect(),\r\n vWidth = window.innerWidth || doc.documentElement.clientWidth,\r\n vHeight = window.innerHeight || doc.documentElement.clientHeight,\r\n efp = function (x, y) { return document.elementFromPoint(x, y) }; \r\n\r\n // Return false if it's not in the viewport\r\n if (rect.right < 0 || rect.bottom < 0 \r\n || rect.left > vWidth || rect.top > vHeight)\r\n return false;\r\n\r\n // Return true if any of its four corners are visible\r\n return (\r\n el.contains(efp(rect.left, rect.top))\r\n || el.contains(efp(rect.right, rect.top))\r\n || el.contains(efp(rect.right, rect.bottom))\r\n || el.contains(efp(rect.left, rect.bottom))\r\n );\r\n}\r\n\r\nexport function copy(obj) {\r\n //in case of premitives\r\n if(obj===null || typeof obj !== \"object\"){\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date){\r\n return new Date(obj.getTime());\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)){\r\n var clonedArr = [];\r\n obj.forEach(function(element){\r\n clonedArr.push(copy(element))\r\n });\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)){\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function ripple(elem/* : HTMLElement */) {\r\n elem.addEventListener('mousedown', function(/* this: typeof elem, */e) {\r\n let rect = this.getBoundingClientRect();\r\n\r\n const startTime = Date.now();\r\n const animationTime = 350;\r\n\r\n let X = e.clientX - rect.left;\r\n let Y = e.clientY - rect.top;\r\n let rippleDiv = document.createElement(\"div\");\r\n rippleDiv.classList.add(\"ripple\");\r\n rippleDiv.setAttribute(\"style\", \"top:\" + Y + \"px; left:\" + X + \"px;\");\r\n this.appendChild(rippleDiv);\r\n\r\n elem.addEventListener('mouseup', () => {\r\n let elapsed = Date.now() - startTime;\r\n\r\n setTimeout(() => {\r\n rippleDiv.parentElement.removeChild(rippleDiv);\r\n }, elapsed < animationTime ? animationTime - elapsed : 0);\r\n }, {once: true});\r\n });\r\n};\r\n\r\nfunction listMergeSorted (list1, list2) {\r\n list1 = list1 || []\r\n list2 = list2 || []\r\n\r\n var result = copy(list1);\r\n\r\n var minID = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF\r\n for (var i = 0; i < list2.length; i++) {\r\n if (list2[i] < minID) {\r\n result.push(list2[i])\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction listUniqSorted (list) {\r\n list = list || []\r\n var resultList = []\r\n var prev = false\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i] !== prev) {\r\n resultList.push(list[i])\r\n }\r\n prev = list[i]\r\n }\r\n\r\n return resultList\r\n}\r\n\r\nfunction templateUrl (tplName) {\r\n var forceLayout = {\r\n confirm_modal: 'desktop',\r\n error_modal: 'desktop',\r\n media_modal_layout: 'desktop',\r\n slider: 'desktop',\r\n reply_message: 'desktop',\r\n full_round: 'desktop',\r\n message_body: 'desktop',\r\n message_media: 'desktop',\r\n message_attach_game: 'desktop',\r\n forwarded_messages: 'desktop',\r\n chat_invite_link_modal: 'desktop',\r\n reply_markup: 'desktop',\r\n short_message: 'desktop',\r\n pinned_message: 'desktop',\r\n channel_edit_modal: 'desktop',\r\n megagroup_edit_modal: 'desktop',\r\n inline_results: 'desktop',\r\n composer_dropdown: 'desktop',\r\n peer_pinned_message_bar: 'desktop',\r\n report_msgs_modal: 'desktop'\r\n }\r\n var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop')\r\n return 'partials/' + layout + '/' + tplName + '.html'\r\n}\r\n\r\nexport function encodeEntities (value) {\r\n return value.replace(/&/g, '&amp;').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, function (value) {\r\n var hi = value.charCodeAt(0)\r\n var low = value.charCodeAt(1)\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'\r\n }).replace(/([^\\#-~| |!])/g, function (value) { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';'\r\n }).replace(/</g, '&lt;').replace(/>/g, '&gt;')\r\n}\r\n\r\nexport function calcImageInBox (imageW, imageH, boxW, boxH, noZooom) {\r\n var boxedImageW = boxW\r\n var boxedImageH = boxH\r\n\r\n if ((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = parseInt(imageH * boxW / imageW)\r\n }else {\r\n boxedImageW = parseInt(imageW * boxH / imageH)\r\n if (boxedImageW > boxW) {\r\n boxedImageH = parseInt(boxedImageH * boxW / boxedImageW)\r\n boxedImageW = boxW\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if (noZooom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW\r\n boxedImageH = imageH\r\n }\r\n\r\n return {w: boxedImageW, h: boxedImageH}\r\n}\r\n\r\n/**\r\n * emojiUnicode\r\n * Get the unicode code of an emoji in base 16.\r\n *\r\n * @name emojiUnicode\r\n * @function\r\n * @param {String} input The emoji character.\r\n * @returns {String} The base 16 unicode code.\r\n */\r\nexport function emojiUnicode (input) {\r\n return emojiUnicode.raw(input).split(' ').map(val => parseInt(val).toString(16)).join('-').toUpperCase();\r\n}\r\n\r\n/**\r\n* emojiunicode.raw\r\n* Get the unicode code points of an emoji in base 16.\r\n*\r\n* @name emojiunicode.raw\r\n* @function\r\n* @param {String} input The emoji character.\r\n* @returns {String} The unicode code points.\r\n*/\r\nemojiUnicode.raw = function (input) {\r\n if(input.length === 1) {\r\n return input.charCodeAt(0).toString();\r\n } else if(input.length > 1) {\r\n const pairs = [];\r\n for (var i = 0; i < input.length; i++) {\r\n if (\r\n // high surrogate\r\n input.charCodeAt(i) >= 0xd800 && input.charCodeAt(i) <= 0xdbff\r\n ) {\r\n if (\r\n input.charCodeAt(i + 1) >= 0xdc00 && input.charCodeAt(i + 1) <= 0xdfff\r\n ) {\r\n // low surrogate\r\n pairs.push(\r\n (input.charCodeAt(i) - 0xd800) * 0x400\r\n + (input.charCodeAt(i + 1) - 0xdc00) + 0x10000\r\n );\r\n }\r\n } else if (input.charCodeAt(i) < 0xd800 || input.charCodeAt(i) > 0xdfff) {\r\n // modifiers and joiners\r\n pairs.push(input.charCodeAt(i))\r\n }\r\n }\r\n return pairs.join(' ');\r\n }\r\n\r\n return '';\r\n};\r\n\r\n// country code regex\r\nconst CC_REGEX = /^[a-z]{2}$/i;\r\n\r\n// offset between uppercase ascii and regional indicator symbols\r\nconst OFFSET = 127397;\r\n\r\n/**\r\n * convert country code to corresponding emoji flag\r\n * @param {string} cc - country code string\r\n * @returns {string} country code emoji\r\n */\r\nexport function countryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n console.log(chars);\r\n return String.fromCodePoint(...chars);\r\n}\r\n\r\nexport function unifiedCountryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n return chars.map(c => c.toString(16).toUpperCase()).join('-');\r\n}\r\n\r\nfunction versionCompare (ver1, ver2) {\r\n if (typeof ver1 !== 'string') {\r\n ver1 = ''\r\n }\r\n if (typeof ver2 !== 'string') {\r\n ver2 = ''\r\n }\r\n ver1 = ver1.replace(/^\\s+|\\s+$/g, '').split('.')\r\n ver2 = ver2.replace(/^\\s+|\\s+$/g, '').split('.')\r\n\r\n var a = Math.max(ver1.length, ver2.length), i\r\n\r\n for (i = 0; i < a; i++) {\r\n if (ver1[i] == ver2[i]) {\r\n continue\r\n }\r\n if (ver1[i] > ver2[i]) {\r\n return 1\r\n } else {\r\n return -1\r\n }\r\n }\r\n\r\n return 0\r\n}\r\n\r\n\r\n var badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<\\s]+/g,\r\n trimRe = /^\\s+|\\s$/g\r\n\r\n function createIndex () {\r\n return {\r\n shortIndexes: {},\r\n fullTexts: {}\r\n }\r\n }\r\n\r\n function cleanSearchText (text) {\r\n var hasTag = text.charAt(0) == '%'\r\n text = text.replace(badCharsRe, ' ').replace(trimRe, '')\r\n text = text.replace(/[^A-Za-z0-9]/g, function (ch) {\r\n var latinizeCh = Config.LatinizeMap[ch]\r\n return latinizeCh !== undefined ? latinizeCh : ch\r\n })\r\n text = text.toLowerCase()\r\n if (hasTag) {\r\n text = '%' + text\r\n }\r\n\r\n return text\r\n }\r\n\r\n function cleanUsername (username) {\r\n return username && username.toLowerCase() || ''\r\n }\r\n\r\n function indexObject (id, searchText, searchIndex) {\r\n if (searchIndex.fullTexts[id] !== undefined) {\r\n return false\r\n }\r\n\r\n searchText = cleanSearchText(searchText)\r\n\r\n if (!searchText.length) {\r\n return false\r\n }\r\n\r\n var shortIndexes = searchIndex.shortIndexes\r\n\r\n searchIndex.fullTexts[id] = searchText\r\n\r\n searchText.split(' ').forEach(function(searchWord) {\r\n var len = Math.min(searchWord.length, 3),\r\n wordPart, i\r\n for (i = 1; i <= len; i++) {\r\n wordPart = searchWord.substr(0, i)\r\n if (shortIndexes[wordPart] === undefined) {\r\n shortIndexes[wordPart] = [id]\r\n } else {\r\n shortIndexes[wordPart].push(id)\r\n }\r\n }\r\n })\r\n }\r\n\r\n function search (query, searchIndex) {\r\n var shortIndexes = searchIndex.shortIndexes\r\n var fullTexts = searchIndex.fullTexts\r\n\r\n query = cleanSearchText(query)\r\n\r\n var queryWords = query.split(' ')\r\n var foundObjs = false,\r\n newFoundObjs, i\r\n var j, searchText\r\n var found\r\n\r\n for (i = 0; i < queryWords.length; i++) {\r\n newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]\r\n if (!newFoundObjs) {\r\n foundObjs = []\r\n break\r\n }\r\n if (foundObjs === false || foundObjs.length > newFoundObjs.length) {\r\n foundObjs = newFoundObjs\r\n }\r\n }\r\n\r\n newFoundObjs = {}\r\n\r\n for (j = 0; j < foundObjs.length; j++) {\r\n found = true\r\n searchText = fullTexts[foundObjs[j]]\r\n for (i = 0; i < queryWords.length; i++) {\r\n if (searchText.indexOf(queryWords[i]) == -1) {\r\n found = false\r\n break\r\n }\r\n }\r\n if (found) {\r\n newFoundObjs[foundObjs[j]] = true\r\n }\r\n }\r\n\r\n return newFoundObjs\r\n }\r\n\r\n let SearchIndexManager = {\r\n createIndex: createIndex,\r\n indexObject: indexObject,\r\n cleanSearchText: cleanSearchText,\r\n cleanUsername: cleanUsername,\r\n search: search\r\n };\r\n window.SearchIndexManager = SearchIndexManager;\r\n\r\n export {SearchIndexManager};\r\n//})(window)\r\n"
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"index": 22,
"index2": 25,
"size": 28692,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "57:18-40"
},
{
"moduleId": 9,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/filemanager.ts",
"module": "./src/lib/filemanager.ts",
"moduleName": "./src/lib/filemanager.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "3:18-40"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "43:18-40"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "16:18-40"
},
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "7:18-40"
},
{
"moduleId": 38,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"module": "./src/lib/idb.ts",
"moduleName": "./src/lib/idb.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "6:18-40"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "14:18-40"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "../lib/bin_utils",
"loc": "13:18-45"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "../lib/bin_utils",
"loc": "13:18-45"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar jsbn_1 = require(\"jsbn\");\n// @ts-ignore\nvar Rusha = __importStar(require(\"rusha/dist/rusha.min.js\"));\nvar leemon_1 = require(\"leemon\");\n//import CryptoJS from 'crypto-js';\n// @ts-ignore\nvar pako_inflate_min_js_1 = __importDefault(require(\"pako/dist/pako_inflate.min.js\"));\nvar CryptoJS = require(\"./crypto.js\");\nrequire(\"./closure_long.js\");\nvar goog = this.goog;\nfunction bigint(num) {\n return new jsbn_1.BigInteger(num.toString(16), 16);\n}\nexports.bigint = bigint;\nfunction bigStringInt(strNum) {\n return new jsbn_1.BigInteger(strNum, 10);\n}\nexports.bigStringInt = bigStringInt;\n/* export function dHexDump (bytes) {\n var arr = []\n for (var i = 0; i < bytes.length; i++) {\n if (i && !(i % 2)) {\n if (!(i % 16)) {\n arr.push('\\n')\n } else if (!(i % 4)) {\n arr.push(' ')\n } else {\n arr.push(' ')\n }\n }\n arr.push((bytes[i] < 16 ? '0' : '') + bytes[i].toString(16))\n }\n\n console.log(arr.join(''))\n} */\nfunction bytesToHex(bytes) {\n bytes = bytes || [];\n var arr = [];\n for (var i = 0; i < bytes.length; i++) {\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\n }\n return arr.join('');\n}\nexports.bytesToHex = bytesToHex;\nfunction bytesFromHex(hexString) {\n var len = hexString.length, i;\n var start = 0;\n var bytes = [];\n if (hexString.length % 2) {\n bytes.push(parseInt(hexString.charAt(0), 16));\n start++;\n }\n for (i = start; i < len; i += 2) {\n bytes.push(parseInt(hexString.substr(i, 2), 16));\n }\n return bytes;\n}\nexports.bytesFromHex = bytesFromHex;\nfunction bytesToBase64(bytes) {\n var mod3;\n var result = '';\n for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if (mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(uint6ToBase64(nUint24 >>> 18 & 63), uint6ToBase64(nUint24 >>> 12 & 63), uint6ToBase64(nUint24 >>> 6 & 63), uint6ToBase64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n return result.replace(/A(?=A$|$)/g, '=');\n}\nexports.bytesToBase64 = bytesToBase64;\nfunction uint6ToBase64(nUint6) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\nexports.uint6ToBase64 = uint6ToBase64;\nfunction base64ToBlob(base64str, mimeType) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return blobConstruct(byteArrays, mimeType);\n}\nexports.base64ToBlob = base64ToBlob;\nfunction dataUrlToBlob(url) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n}\nexports.dataUrlToBlob = dataUrlToBlob;\nfunction blobConstruct(blobParts, mimeType) {\n if (mimeType === void 0) { mimeType = ''; }\n var blob;\n var safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, { type: safeMimeType });\n }\n catch (e) {\n // @ts-ignore\n var bb = new BlobBuilder;\n blobParts.forEach(function (blobPart) {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\nexports.blobConstruct = blobConstruct;\nfunction blobSafeMimeType(mimeType) {\n if ([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n ].indexOf(mimeType) == -1) {\n return 'application/octet-stream';\n }\n return mimeType;\n}\nexports.blobSafeMimeType = blobSafeMimeType;\nfunction bytesCmp(bytes1, bytes2) {\n var len = bytes1.length;\n if (len != bytes2.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (bytes1[i] != bytes2[i]) {\n return false;\n }\n }\n return true;\n}\nexports.bytesCmp = bytesCmp;\nfunction bytesXor(bytes1, bytes2) {\n var len = bytes1.length;\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n return bytes;\n}\nexports.bytesXor = bytesXor;\nfunction bytesToWords(bytes) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n var words = [];\n var i;\n for (i = 0; i < len; i++) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n return new CryptoJS.lib.WordArray.init(words, len);\n}\nfunction bytesFromWords(wordArray) {\n var words = wordArray.words;\n var sigBytes = wordArray.sigBytes;\n var bytes = [];\n for (var i = 0; i < sigBytes; i++) {\n bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return bytes;\n}\nfunction bytesFromBigInt(bigInt, len) {\n var bytes = bigInt.toByteArray();\n if (len && bytes.length < len) {\n var padding = [];\n for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n }\n else {\n bytes = padding.concat(bytes);\n }\n }\n else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n return bytes;\n}\nexports.bytesFromBigInt = bytesFromBigInt;\nfunction bytesFromLeemonBigInt(bigInt) {\n var str = leemon_1.bigInt2str(bigInt, 16);\n return bytesFromHex(str);\n}\nexports.bytesFromLeemonBigInt = bytesFromLeemonBigInt;\nfunction bytesToArrayBuffer(b) {\n return (new Uint8Array(b)).buffer;\n}\nexports.bytesToArrayBuffer = bytesToArrayBuffer;\nfunction convertToArrayBuffer(bytes) {\n // Be careful with converting subarrays!!\n if (bytes instanceof ArrayBuffer) {\n return bytes;\n }\n if (bytes.buffer !== undefined &&\n bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n return bytes.buffer;\n }\n return bytesToArrayBuffer(bytes);\n}\nexports.convertToArrayBuffer = convertToArrayBuffer;\nfunction convertToUint8Array(bytes) {\n if (bytes.buffer !== undefined) {\n return bytes;\n }\n return new Uint8Array(bytes);\n}\nexports.convertToUint8Array = convertToUint8Array;\nfunction convertToByteArray(bytes) {\n if (Array.isArray(bytes)) {\n return bytes;\n }\n bytes = convertToUint8Array(bytes);\n var newBytes = [];\n for (var i = 0, len = bytes.length; i < len; i++) {\n newBytes.push(bytes[i]);\n }\n return newBytes;\n}\nexports.convertToByteArray = convertToByteArray;\nfunction bytesFromArrayBuffer(buffer) {\n var len = buffer.byteLength;\n var byteView = new Uint8Array(buffer);\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = byteView[i];\n }\n return bytes;\n}\nexports.bytesFromArrayBuffer = bytesFromArrayBuffer;\nfunction bufferConcat(buffer1, buffer2) {\n var l1 = buffer1.byteLength || buffer1.length;\n var l2 = buffer2.byteLength || buffer2.length;\n var tmp = new Uint8Array(l1 + l2);\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\n return tmp.buffer;\n}\nexports.bufferConcat = bufferConcat;\nfunction bufferConcats() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var length = 0;\n args.forEach(function (b) { return length += b.byteLength || b.length; });\n var tmp = new Uint8Array(length);\n var lastLength = 0;\n args.forEach(function (b) {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += b.byteLength || b.length;\n });\n return tmp /* .buffer */;\n}\nexports.bufferConcats = bufferConcats;\nfunction longToInts(sLong) {\n var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000));\n return [divRem[0].intValue(), divRem[1].intValue()];\n}\nexports.longToInts = longToInts;\nfunction longToBytes(sLong) {\n return bytesFromWords({ words: longToInts(sLong), sigBytes: 8 }).reverse();\n}\nexports.longToBytes = longToBytes;\nfunction longFromInts(high, low) {\n return bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n}\nexports.longFromInts = longFromInts;\nfunction intToUint(val) {\n if (typeof (val) === 'string')\n val = parseInt(val);\n if (val < 0) {\n val = val + 4294967296;\n }\n return val;\n}\nexports.intToUint = intToUint;\nfunction uintToInt(val) {\n if (val > 2147483647) {\n val = val - 4294967296;\n }\n return val;\n}\nexports.uintToInt = uintToInt;\nfunction sha1HashSync(bytes) {\n var hash = Rusha.createHash();\n hash.update(bytes);\n var hashBytes = hash.digest();\n //console.log('sha1HashSync', bytes, hashBytes);\n //rushaInstance = rushaInstance || new Rusha(1024 * 1024);\n // console.log(dT(), 'SHA-1 hash start', bytes.byteLength || bytes.length)\n /* var hashBytes = rushaInstance.rawDigest(bytes).buffer; */\n // console.log(dT(), 'SHA-1 hash finish')\n return hashBytes;\n}\nexports.sha1HashSync = sha1HashSync;\nfunction sha1BytesSync(bytes) {\n return bytesFromArrayBuffer(sha1HashSync(bytes));\n}\nexports.sha1BytesSync = sha1BytesSync;\nfunction sha256HashSync(bytes) {\n // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length)\n var hashWords = CryptoJS.SHA256(bytesToWords(bytes));\n // console.log(dT(), 'SHA-2 hash finish')\n var hashBytes = bytesFromWords(hashWords);\n return hashBytes;\n}\nexports.sha256HashSync = sha256HashSync;\nfunction rsaEncrypt(publicKey, bytes) {\n bytes = addPadding(bytes, 255);\n // console.log('RSA encrypt start')\n var N = new jsbn_1.BigInteger(publicKey.modulus, 16);\n var E = new jsbn_1.BigInteger(publicKey.exponent, 16);\n var X = new jsbn_1.BigInteger(bytes);\n var encryptedBigInt = X.modPowInt(E, N), encryptedBytes = bytesFromBigInt(encryptedBigInt, 256);\n // console.log('RSA encrypt finish')\n return encryptedBytes;\n}\nexports.rsaEncrypt = rsaEncrypt;\nfunction addPadding(bytes, blockSize, zeroes, full) {\n if (full === void 0) { full = false; }\n blockSize = blockSize || 16;\n var len = bytes.byteLength || bytes.length;\n var needPadding = blockSize - (len % blockSize);\n if (needPadding > 0 && (needPadding < blockSize || full)) {\n var padding = new Array(needPadding);\n if (zeroes) {\n for (var i = 0; i < needPadding; i++) {\n padding[i] = 0;\n }\n }\n else {\n (new jsbn_1.SecureRandom()).nextBytes(padding);\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(bytes, padding);\n }\n else {\n bytes = bytes.concat(padding);\n }\n }\n return bytes;\n}\nexports.addPadding = addPadding;\nfunction aesEncryptSync(bytes, keyBytes, ivBytes) {\n var len = bytes.byteLength || bytes.length;\n // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/)\n bytes = addPadding(bytes);\n var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n }).ciphertext;\n var encryptedBytes = bytesFromWords(encryptedWords);\n // console.log(dT(), 'AES encrypt finish')\n return encryptedBytes;\n}\nexports.aesEncryptSync = aesEncryptSync;\nfunction aesDecryptSync(encryptedBytes, keyBytes, ivBytes) {\n // console.log(dT(), 'AES decrypt start', encryptedBytes.length)\n var decryptedWords = CryptoJS.AES.decrypt({ ciphertext: bytesToWords(encryptedBytes) }, bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n });\n var bytes = bytesFromWords(decryptedWords);\n // console.log(dT(), 'AES decrypt finish')\n return bytes;\n}\nexports.aesDecryptSync = aesDecryptSync;\nfunction getDerivation(hash, salt, password, iterations, keyLength) {\n if (hash === void 0) { hash = 'SHA-512'; }\n return __awaiter(this, void 0, void 0, function () {\n var passwordBuffer, importedKey, saltBuffer, params, derivation;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n passwordBuffer = password;\n return [4 /*yield*/, crypto.subtle.importKey(\"raw\", passwordBuffer, \"PBKDF2\", false, [\"deriveBits\", 'deriveKey'])];\n case 1:\n importedKey = _a.sent();\n saltBuffer = salt /* textEncoder.encode(salt); */;\n params = { name: \"PBKDF2\", hash: hash, salt: saltBuffer, iterations: iterations };\n return [4 /*yield*/, crypto.subtle.deriveBits(params, importedKey, keyLength * 8)];\n case 2:\n derivation = _a.sent();\n return [2 /*return*/, derivation];\n }\n });\n });\n}\nfunction getKey(derivation) {\n return __awaiter(this, void 0, void 0, function () {\n var ivlen, keylen, derivedKey, iv, importedEncryptionKey;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n ivlen = 16;\n keylen = 32;\n derivedKey = derivation.slice(0, keylen);\n iv = derivation.slice(-ivlen);\n return [4 /*yield*/, crypto.subtle.importKey('raw', derivedKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt'])];\n case 1:\n importedEncryptionKey = _a.sent();\n return [2 /*return*/, {\n key: importedEncryptionKey,\n iv: iv\n }];\n }\n });\n });\n}\nfunction encrypt(text, keyObject) {\n return __awaiter(this, void 0, void 0, function () {\n var textBuffer, encryptedText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n textBuffer = text;\n return [4 /*yield*/, crypto.subtle.encrypt({ name: 'AES-CBC', iv: keyObject.iv }, keyObject.key, textBuffer)];\n case 1:\n encryptedText = _a.sent();\n return [2 /*return*/, encryptedText];\n }\n });\n });\n}\n/* import * as crypto from 'crypto'; */\nfunction hash_pbkdf2(/* hasher: 'string', */ buffer, salt, iterations) {\n return __awaiter(this, void 0, void 0, function () {\n var importKey, deriveKey, bits;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, window.crypto.subtle.importKey(\"raw\", //only \"raw\" is allowed\n buffer, //your password\n {\n name: \"PBKDF2\",\n }, false, //whether the key is extractable (i.e. can be used in exportKey)\n [\"deriveKey\", \"deriveBits\"] //can be any combination of \"deriveKey\" and \"deriveBits\"\n )];\n case 1:\n importKey = _a.sent();\n return [4 /*yield*/, window.crypto.subtle.deriveKey({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n {\n name: \"AES-CTR\",\n //the generateKey parameters for that type of algorithm\n length: 256,\n }, false, //whether the derived key is extractable (i.e. can be used in exportKey)\n [\"encrypt\", \"decrypt\"] //limited to the options in that algorithm's importKey\n )];\n case 2:\n deriveKey = _a.sent();\n bits = window.crypto.subtle.deriveBits({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n 512 //the number of bits you want to derive\n );\n return [2 /*return*/, bits];\n }\n });\n });\n}\nexports.hash_pbkdf2 = hash_pbkdf2;\nfunction gzipUncompress(bytes, toString) {\n // console.log('Gzip uncompress start')\n // @ts-ignore\n //var result = (new Zlib.Gunzip(bytes)).decompress();\n var result = pako_inflate_min_js_1.default.inflate(bytes, toString ? { to: 'string' } : undefined);\n // console.log('Gzip uncompress finish')\n return result;\n}\nexports.gzipUncompress = gzipUncompress;\nfunction nextRandomInt(maxValue) {\n return Math.floor(Math.random() * maxValue);\n}\nexports.nextRandomInt = nextRandomInt;\nfunction pqPrimeFactorization(pqBytes) {\n var what = new jsbn_1.BigInteger(pqBytes);\n var result = false;\n // console.log(dT(), 'PQ start', pqBytes, what.toString(16), what.bitLength())\n try {\n result = pqPrimeLeemon(leemon_1.str2bigInt(what.toString(16), 16, Math.ceil(64 / leemon_1.bpe) + 1));\n }\n catch (e) {\n console.error('Pq leemon Exception', e);\n }\n if (result === false && what.bitLength() <= 64) {\n // console.time('PQ long')\n try {\n result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16));\n }\n catch (e) {\n console.error('Pq long Exception', e);\n }\n // console.timeEnd('PQ long')\n }\n // console.log(result)\n if (result === false) {\n // console.time('pq BigInt')\n result = pqPrimeBigInteger(what);\n // console.timeEnd('pq BigInt')\n }\n // console.log(dT(), 'PQ finish')\n return result;\n}\nexports.pqPrimeFactorization = pqPrimeFactorization;\nfunction pqPrimeBigInteger(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = (nextRandomInt(128) & 15) + 17;\n var x = bigint(nextRandomInt(1000000000) + 1);\n var y = x.clone();\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x.clone();\n var b = x.clone();\n var c = bigint(q);\n while (!b.equals(jsbn_1.BigInteger.ZERO)) {\n if (!b.and(jsbn_1.BigInteger.ONE).equals(jsbn_1.BigInteger.ZERO)) {\n c = c.add(a);\n if (c.compareTo(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compareTo(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c.clone();\n var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = z.gcd(what);\n if (!g.equals(jsbn_1.BigInteger.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x.clone();\n }\n }\n if (g.compareTo(jsbn_1.BigInteger.ONE) > 0) {\n break;\n }\n }\n var f = what.divide(g), P, Q;\n if (g.compareTo(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromBigInt(P), bytesFromBigInt(Q), it];\n}\nexports.pqPrimeBigInteger = pqPrimeBigInteger;\nfunction gcdLong(a, b) {\n while (a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) {\n while (b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n b = b.shiftRight(1);\n }\n while (a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n a = a.shiftRight(1);\n }\n if (a.compare(b) > 0) {\n a = a.subtract(b);\n }\n else {\n b = b.subtract(a);\n }\n }\n return b.equals(goog.math.Long.ZERO) ? a : b;\n}\nexports.gcdLong = gcdLong;\nfunction pqPrimeLong(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17);\n var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1);\n var y = x;\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x;\n var b = x;\n var c = q;\n while (b.notEquals(goog.math.Long.ZERO)) {\n if (b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) {\n c = c.add(a);\n if (c.compare(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compare(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c;\n var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = gcdLong(z, what);\n if (g.notEquals(goog.math.Long.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x;\n }\n }\n if (g.compare(goog.math.Long.ONE) > 0) {\n break;\n }\n }\n var f = what.div(g), P, Q;\n if (g.compare(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it];\n}\nexports.pqPrimeLong = pqPrimeLong;\nfunction pqPrimeLeemon(what) {\n var minBits = 64;\n var minLen = Math.ceil(minBits / leemon_1.bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n for (i = 0; i < 3; i++) {\n q = (nextRandomInt(128) & 15) + 17;\n leemon_1.copyInt_(x, nextRandomInt(1000000000) + 1);\n leemon_1.copy_(y, x);\n lim = 1 << (i + 18);\n for (j = 1; j < lim; j++) {\n ++it;\n leemon_1.copy_(a, x);\n leemon_1.copy_(b, x);\n leemon_1.copyInt_(c, q);\n while (!leemon_1.isZero(b)) {\n if (b[0] & 1) {\n leemon_1.add_(c, a);\n if (leemon_1.greater(c, what)) {\n leemon_1.sub_(c, what);\n }\n }\n leemon_1.add_(a, a);\n if (leemon_1.greater(a, what)) {\n leemon_1.sub_(a, what);\n }\n leemon_1.rightShift_(b, 1);\n }\n leemon_1.copy_(x, c);\n if (leemon_1.greater(x, y)) {\n leemon_1.copy_(z, x);\n leemon_1.sub_(z, y);\n }\n else {\n leemon_1.copy_(z, y);\n leemon_1.sub_(z, x);\n }\n leemon_1.eGCD_(z, what, g, a, b);\n if (!leemon_1.equalsInt(g, 1)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n leemon_1.copy_(y, x);\n }\n }\n if (leemon_1.greater(g, leemon_1.one)) {\n break;\n }\n }\n leemon_1.divide_(what, g, x, y);\n if (leemon_1.greater(g, x)) {\n P = x;\n Q = g;\n }\n else {\n P = g;\n Q = x;\n }\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];\n}\nexports.pqPrimeLeemon = pqPrimeLeemon;\nfunction bytesModPow(x, y, m) {\n try {\n var xBigInt = leemon_1.str2bigInt(bytesToHex(x), 16);\n var yBigInt = leemon_1.str2bigInt(bytesToHex(y), 16);\n var mBigInt = leemon_1.str2bigInt(bytesToHex(m), 16);\n var resBigInt = leemon_1.powMod(xBigInt, yBigInt, mBigInt);\n return bytesFromHex(leemon_1.bigInt2str(resBigInt, 16));\n }\n catch (e) {\n console.error('mod pow error', e);\n }\n return bytesFromBigInt(new jsbn_1.BigInteger(x).modPow(new jsbn_1.BigInteger(y), new jsbn_1.BigInteger(m)), 256);\n}\nexports.bytesModPow = bytesModPow;\n"
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"index": 19,
"index2": 33,
"size": 92532,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./mtproto",
"loc": "37:16-36"
},
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./lib/mtproto",
"loc": "21:16-40"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./mtproto",
"loc": "15:16-36"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "13:16-41"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "15:16-41"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "6:16-41"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "15:16-41"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Config = __importStar(require(\"./config\"));\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar bin_utils_1 = require(\"./bin_utils\");\nvar utils_1 = require(\"./utils\");\nvar tl_utils_1 = require(\"./tl_utils\");\nvar cryptoworker_1 = __importDefault(require(\"./cryptoworker\"));\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar idb_1 = __importDefault(require(\"./idb\"));\nvar mtnetworker_1 = require(\"./mtnetworker\");\nvar leemon_1 = require(\"leemon\");\nvar $rootScope = {\n $broadcast: function (name, detail) {\n console.log(utils_1.dT(), 'Broadcasting ' + name + ' event, with args:', detail);\n //console.trace();\n var myCustomEvent = new CustomEvent(name, { detail: detail });\n document.dispatchEvent(myCustomEvent);\n },\n};\n/* let qSync = {\n when: function<T>(result: any) {\n return Promise.resolve(result);\n },\n reject: function (result: any) {\n return {\n then: function(cb: any, badcb: any) {\n if(badcb) {\n return badcb(result);\n }\n }\n };\n }\n}; */\nvar TelegramMeWebService = /** @class */ (function () {\n function TelegramMeWebService() {\n this.disabled = Config.Modes.test ||\n Config.App.domains.indexOf(location.hostname) == -1 ||\n location.protocol != 'http:' && location.protocol != 'https:' ||\n location.protocol == 'https:' && location.hostname != 'web.telegram.org';\n }\n TelegramMeWebService.prototype.setAuthorized = function (canRedirect) {\n if (this.disabled) {\n return false;\n }\n storage_1.default.get('tgme_sync').then(function (curValue) {\n var ts = utils_1.tsNow(true);\n if (canRedirect &&\n curValue &&\n curValue.canRedirect == canRedirect &&\n curValue.ts + 86400 > ts) {\n return false;\n }\n storage_1.default.set({ tgme_sync: { canRedirect: canRedirect, ts: ts } });\n var urls = [\n '//telegram.me/_websync_?authed=' + (canRedirect ? '1' : '0'),\n '//t.me/_websync_?authed=' + (canRedirect ? '1' : '0')\n ];\n urls.forEach(function (url) {\n var script = document.createElement('script');\n script.onload = script.onerror = function () {\n //document.body.removeChild(script);\n script.remove();\n };\n script.src = url;\n document.body.appendChild(script);\n });\n });\n };\n return TelegramMeWebService;\n}());\nexports.TelegramMeWebService = TelegramMeWebService;\nexports.telegramMeWebService = new TelegramMeWebService();\n// @ts-ignore\n// костыль\n//import * as jsbn from 'jsbn';\nvar jsbn_1 = require(\"jsbn\");\n//import { SecureRandom } from '../types';\n// @ts-ignore\nglobalThis.BigInteger = jsbn_1.BigInteger;\n//let SecureRandom = jsbn.SecureRandom;\nvar chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\nvar chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false;\nvar xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30);\nvar MTProto;\n(function (MTProto) {\n var MTProto_ = /** @class */ (function () {\n function MTProto_() {\n /* public chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\n public chromeVersion = this.chromeMatches && parseFloat(this.chromeMatches[1]) || false;\n public xhrSendBuffer = !('ArrayBufferView' in window) && (this.chromeVersion > 0 && this.chromeVersion < 30); */\n this.secureRandom = null;\n this.secureRandom = new jsbn_1.SecureRandom();\n //$($window).on('click keydown', rng_seed_time);\n }\n return MTProto_;\n }());\n MTProto.MTProto_ = MTProto_;\n var DcConfigurator = /** @class */ (function () {\n function DcConfigurator() {\n // it was DcConfigurator\n this.sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n this.dcOptions = Config.Modes.test\n ? [\n { id: 1, host: '149.154.175.10', port: 80 },\n { id: 2, host: '149.154.167.40', port: 80 },\n { id: 3, host: '149.154.175.117', port: 80 }\n ]\n : [\n { id: 1, host: '149.154.175.50', port: 80 },\n { id: 2, host: '149.154.167.50', port: 80 },\n { id: 3, host: '149.154.175.100', port: 80 },\n { id: 4, host: '149.154.167.91', port: 80 },\n { id: 5, host: '149.154.171.5', port: 80 }\n ];\n /* public dcOptions = Config.Modes.test ? [{\n id: 2,\n host: '149.154.167.40',\n port: 443\n }] : [{\n id: 2,\n host: '149.154.167.50',\n port: 443\n }]; */\n this.chosenServers = {};\n }\n DcConfigurator.prototype.chooseServer = function (dcID, upload) {\n if (!(dcID in this.chosenServers)) {\n var chosenServer = false, i, dcOption;\n if (Config.Modes.ssl || !Config.Modes.http) {\n var subdomain = this.sslSubdomains[dcID - 1] + (upload ? '-1' : '');\n var path = Config.Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n return chosenServer;\n }\n for (i = 0; i < this.dcOptions.length; i++) {\n dcOption = this.dcOptions[i];\n if (dcOption.id == dcID) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port != 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n // @ts-ignore\n chosenServers[dcID] = chosenServer;\n }\n // @ts-ignore\n return chosenServers[dcID];\n };\n return DcConfigurator;\n }());\n MTProto.DcConfigurator = DcConfigurator;\n var RSAKeysManager = /** @class */ (function () {\n function RSAKeysManager() {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n * lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n * an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n * Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n * 8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n * Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAruw2yP/BCcsJliRoW5eB\n * VBVle9dtjJw+OYED160Wybum9SXtBBLXriwt4rROd9csv0t0OHCaTmRqBcQ0J8fx\n * hN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvd\n * l84Kd9ORYjDEAyFnEA7dD556OptgLQQ2e2iVNq8NZLYTzLp5YpOdO1doK+ttrltg\n * gTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnSLj16yE5HvJQn0CNpRdENvRUXe6tBP78O\n * 39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wFXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5\n * JwIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvfLHfYH2r9R70w8prHbl\n * Wt/nDkh+XkgpflqQVcnAfSuTtO05lNPspQmL8Y2XjVT4t8cT6xAkdgfmmvnvRPOO\n * KPi0OfJXoRVylFzAQG/j83u5K3kRLbae7fLccVhKZhY46lvsueI1hQdLgNV9n1cQ\n * 3TDS2pQOCtovG4eDl9wacrXOJTG2990VjgnIKNA0UMoP+KF03qzryqIt3oTvZq03\n * DyWdGK+AZjgBLaDKSnC6qD2cFY81UryRWOab8zKkWAnhw2kFpcqhI0jdV5QaSCEx\n * vnsjVaX0Y1N0870931/5Jb9ICe4nweZ9kSDF/gip3kWLG0o8XQpChDfyvsqB9OLV\n * /wIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/ditzm+mPND6xkhzwFI\n * z6J/968CtkcSE/7Z2qAJiXbmZ3UDJPGrzqTDHkO30R8VeRM/Kz2f4nR05GIFiITl\n * 4bEjvpy7xqRDspJcCFIOcyXm8abVDhF+th6knSU0yLtNKuQVP6voMrnt9MV1X92L\n * GZQLgdHZbPQz0Z5qIpaKhdyA8DEvWWvSUwwc+yi1/gGaybwlzZwqXYoPOhwMebzK\n * Uk0xW14htcJrRrq+PXXQbRzTMynseCoPIoke0dtCodbA3qQxQovE16q9zz4Otv2k\n * 4j63cz53J+mhkVWAeWxVGI0lltJmWtEYK6er8VqqWot3nqmWMXogrgRLggv/Nbbo\n * oQIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmpxVY7ld/8DAjz6F6q0\n * 5shjg8/4p6047bn6/m8yPy1RBsvIyvuDuGnP/RzPEhzXQ9UJ5Ynmh2XJZgHoE9xb\n * nfxL5BXHplJhMtADXKM9bWB11PU1Eioc3+AXBB8QiNFBn2XI5UkO5hPhbb9mJpjA\n * 9Uhw8EdfqJP8QetVsI/xrCEbwEXe0xvifRLJbY08/Gp66KpQvy7g8w7VB8wlgePe\n * xW3pT13Ap6vuC+mQuJPyiHvSxjEKHgqePji9NP3tJUFQjcECqcm0yV7/2d0t/pbC\n * m+ZH1sadZspQCEPPrtbkQBlvHb4OLiIWPGHKSMeRFvp3IWcmdJqXahxLCUS1Eh6M\n * AQIDAQAB\n * -----END PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -pubin -in key.pub -text -noout\n */\n this.publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }];\n this.publicKeysParsed = {};\n this.prepared = false;\n }\n // prepareRsaKeys\n RSAKeysManager.prototype.prepare = function () {\n if (this.prepared) {\n return;\n }\n for (var i = 0; i < this.publisKeysHex.length; i++) {\n var keyParsed = this.publisKeysHex[i];\n var RSAPublicKey = new tl_utils_1.TLSerialization();\n RSAPublicKey.storeBytes(bin_utils_1.bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bin_utils_1.bytesFromHex(keyParsed.exponent), 'e');\n var buffer = RSAPublicKey.getBuffer();\n var fingerprintBytes = bin_utils_1.sha1BytesSync(buffer).slice(-8);\n fingerprintBytes.reverse();\n // @ts-ignore\n this.publicKeysParsed[bin_utils_1.bytesToHex(fingerprintBytes)] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n }\n this.prepared = true;\n };\n // selectRsaKeyByFingerPrint\n RSAKeysManager.prototype.select = function (fingerprints) {\n this.prepare();\n var fingerprintHex, foundKey, i;\n for (i = 0; i < fingerprints.length; i++) {\n fingerprintHex = bin_utils_1.bigStringInt(fingerprints[i]).toString(16);\n // @ts-ignore\n if (foundKey = this.publicKeysParsed[fingerprintHex]) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n return false;\n };\n return RSAKeysManager;\n }());\n MTProto.RSAKeysManager = RSAKeysManager;\n var TimeManager = /** @class */ (function () {\n function TimeManager() {\n var _this = this;\n this.lastMessageID = [0, 0];\n this.timeOffset = 0;\n storage_1.default.get('server_time_offset').then(function (to) {\n if (to) {\n _this.timeOffset = to;\n }\n });\n }\n TimeManager.prototype.generateID = function () {\n var timeTicks = utils_1.tsNow(), timeSec = Math.floor(timeTicks / 1000) + this.timeOffset, timeMSec = timeTicks % 1000, random = bin_utils_1.nextRandomInt(0xFFFF);\n var messageID = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if (this.lastMessageID[0] > messageID[0] ||\n this.lastMessageID[0] == messageID[0] && this.lastMessageID[1] >= messageID[1]) {\n messageID = [this.lastMessageID[0], this.lastMessageID[1] + 4];\n }\n this.lastMessageID = messageID;\n // console.log('generated msg id', messageID, timeOffset)\n return bin_utils_1.longFromInts(messageID[0], messageID[1]);\n };\n TimeManager.prototype.applyServerTime = function (serverTime, localTime) {\n var newTimeOffset = serverTime - Math.floor((localTime || utils_1.tsNow()) / 1000);\n var changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n storage_1.default.set({\n server_time_offset: newTimeOffset\n });\n this.lastMessageID = [0, 0];\n this.timeOffset = newTimeOffset;\n console.log(utils_1.dT(), 'Apply server time', serverTime, localTime, newTimeOffset, changed);\n return changed;\n };\n return TimeManager;\n }());\n MTProto.TimeManager = TimeManager;\n var Authorizer = /** @class */ (function () {\n function Authorizer( /* $http: any */) {\n this.cached = {};\n /* delete $http.defaults.headers.post['Content-Type'];\n delete $http.defaults.headers.common['Accept']; */\n }\n Authorizer.prototype.mtpSendPlainRequest = function (dcID, requestBuffer) {\n var requestLength = requestBuffer.byteLength, requestArray = new Int32Array(requestBuffer);\n var header = new tl_utils_1.TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id'); // Auth key\n header.storeLong(MTProto.timeManager.generateID(), 'msg_id'); // Msg_id\n header.storeInt(requestLength, 'request_length');\n var headerBuffer = header.getBuffer(), headerArray = new Int32Array(headerBuffer);\n var headerLength = headerBuffer.byteLength;\n var resultBuffer = new ArrayBuffer(headerLength + requestLength), resultArray = new Int32Array(resultBuffer);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n var requestData = xhrSendBuffer ? resultBuffer : resultArray, requestPromise;\n var url = MTProto.dcConfigurator.chooseServer(dcID);\n var baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n url: url\n };\n console.log('mtpSendPlainRequest: creating requestPromise');\n return /* requestPromise = */ fetch(url, { method: 'POST', body: requestData })\n .then(function (response) {\n console.log('response', response);\n if (response.status != 200)\n throw response;\n return response.arrayBuffer();\n })\n /* .catch(err => {console.log('asdasdasd', err); }); */\n /* try {\n requestPromise = fetch(url, {method: 'POST', body: requestData});\n } catch(e) {\n requestPromise = $q.reject(Object.assign(baseError, {\n originalError: e\n }));\n } */\n /* return requestPromise */ .then(function (result) {\n console.log('mtpSendPlainRequest: in good sector', result);\n if (!result || !result.byteLength) {\n return Promise.reject(baseError);\n //return this.$q.reject(baseError);\n }\n try {\n var deserializer = new tl_utils_1.TLDeserialization(result, { mtproto: true });\n var auth_key_id = deserializer.fetchLong('auth_key_id');\n var msg_id = deserializer.fetchLong('msg_id');\n var msg_len = deserializer.fetchInt('msg_len');\n }\n catch (e) {\n console.error('mtpSendPlainRequest: deserialization went bad', e);\n var error = Object.assign(baseError, { originalError: e });\n throw error;\n //return Promise.reject(error);\n //return $q.reject(error);\n }\n return deserializer;\n }, function (error) {\n if (!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n return Promise.reject(error);\n //return $q.reject(error);\n });\n };\n Authorizer.prototype.mtpSendReqPQ = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n var request = new tl_utils_1.TLSerialization({\n mtproto: true\n });\n request.storeMethod('req_pq', {\n nonce: auth.nonce\n });\n console.log(utils_1.dT(), 'Send req_pq', bin_utils_1.bytesToHex(auth.nonce));\n this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('ResPQ');\n if (response._ != 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] resPQ nonce mismatch');\n }\n auth.serverNonce = response.server_nonce;\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n console.log(utils_1.dT(), 'Got ResPQ', bin_utils_1.bytesToHex(auth.serverNonce), bin_utils_1.bytesToHex(auth.pq), auth.fingerprints);\n auth.publicKey = MTProto.rsaKeysManager.select(auth.fingerprints);\n if (!auth.publicKey) {\n throw new Error('[MT] No public key found');\n }\n console.log(utils_1.dT(), 'PQ factorization start', auth.pq);\n cryptoworker_1.default.factorize(auth.pq).then(function (pAndQ) {\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n console.log(utils_1.dT(), 'PQ factorization done', pAndQ[2]);\n _this.mtpSendReqDhParams(auth);\n }, function (error) {\n console.log('Worker error', error, error.stack);\n deferred.reject(error);\n });\n }, function (error) {\n console.error(utils_1.dT(), 'req_pq error', error.message);\n deferred.reject(error);\n });\n setTimeout(function () {\n MTProto.rsaKeysManager.prepare();\n });\n };\n Authorizer.prototype.mtpSendReqDhParams = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n auth.newNonce = new Array(32);\n MTProto.secureRandom.nextBytes(auth.newNonce);\n var data = new tl_utils_1.TLSerialization({ mtproto: true });\n data.storeObject({\n _: 'p_q_inner_data',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce\n }, 'P_Q_inner_data', 'DECRYPTED_DATA');\n // @ts-ignore\n var dataWithHash = bin_utils_1.sha1BytesSync(data.getBuffer()).concat(data.getBytes());\n var request = new tl_utils_1.TLSerialization({ mtproto: true });\n request.storeMethod('req_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: bin_utils_1.rsaEncrypt(auth.publicKey, dataWithHash)\n });\n console.log(utils_1.dT(), 'Send req_DH_params');\n this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n console.log(utils_1.dT(), 'Sent req_DH_params, response:', response);\n if (response._ != 'server_DH_params_fail' && response._ != 'server_DH_params_ok') {\n deferred.reject(new Error('[MT] Server_DH_Params response invalid: ' + response._));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n deferred.reject(new Error('[MT] Server_DH_Params nonce mismatch'));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n deferred.reject(new Error('[MT] Server_DH_Params server_nonce mismatch'));\n return false;\n }\n if (response._ == 'server_DH_params_fail') {\n var newNonceHash = bin_utils_1.sha1BytesSync(auth.newNonce).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash, response.new_nonce_hash)) {\n deferred.reject(new Error('[MT] server_DH_params_fail new_nonce_hash mismatch'));\n return false;\n }\n deferred.reject(new Error('[MT] server_DH_params_fail'));\n return false;\n }\n // fill auth object\n try {\n _this.mtpDecryptServerDhDataAnswer(auth, response.encrypted_answer);\n }\n catch (e) {\n console.error(utils_1.dT(), 'mtpDecryptServerDhDataAnswer FAILED!', e);\n deferred.reject(e);\n return false;\n }\n console.log(utils_1.dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n _this.mtpSendSetClientDhParams(auth);\n }, function (error) {\n console.log(utils_1.dT(), 'Send req_DH_params FAIL!', error);\n deferred.reject(error);\n });\n };\n Authorizer.prototype.mtpDecryptServerDhDataAnswer = function (auth, encryptedAnswer) {\n auth.localTime = utils_1.tsNow();\n auth.tmpAesKey = bin_utils_1.sha1BytesSync(auth.newNonce.concat(auth.serverNonce)).concat(bin_utils_1.sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(0, 12));\n auth.tmpAesIv = bin_utils_1.sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(12).concat(bin_utils_1.sha1BytesSync([].concat(auth.newNonce, auth.newNonce)), auth.newNonce.slice(0, 4));\n var answerWithHash = bin_utils_1.aesDecryptSync(encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv);\n var hash = answerWithHash.slice(0, 20);\n var answerWithPadding = answerWithHash.slice(20);\n var buffer = bin_utils_1.bytesToArrayBuffer(answerWithPadding);\n var deserializer = new tl_utils_1.TLDeserialization(buffer, { mtproto: true });\n var response = deserializer.fetchObject('Server_DH_inner_data');\n if (response._ != 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response /* constructor */);\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n console.log(utils_1.dT(), 'Done decrypting answer');\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n this.mtpVerifyDhParams(auth.g, auth.dhPrime, auth.gA);\n var offset = deserializer.getOffset();\n if (!bin_utils_1.bytesCmp(hash, bin_utils_1.sha1BytesSync(answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n MTProto.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n };\n Authorizer.prototype.mtpVerifyDhParams = function (g, dhPrime, gA) {\n console.log(utils_1.dT(), 'Verifying DH params');\n var dhPrimeHex = bin_utils_1.bytesToHex(dhPrime);\n if (g != 3 ||\n dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n console.log(utils_1.dT(), 'dhPrime cmp OK');\n var gABigInt = new jsbn_1.BigInteger(bin_utils_1.bytesToHex(gA), 16);\n var dhPrimeBigInt = new jsbn_1.BigInteger(dhPrimeHex, 16);\n if (gABigInt.compareTo(jsbn_1.BigInteger.ONE) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n if (gABigInt.compareTo(dhPrimeBigInt.subtract(jsbn_1.BigInteger.ONE)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n console.log(utils_1.dT(), '1 < gA < dhPrime-1 OK');\n var two = new jsbn_1.BigInteger(/* null */ '');\n two.fromInt(2);\n var twoPow = two.pow(2048 - 64);\n if (gABigInt.compareTo(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if (gABigInt.compareTo(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n console.log(utils_1.dT(), '2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n return true;\n };\n Authorizer.prototype.mtpSendSetClientDhParams = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n var gBytes = bin_utils_1.bytesFromHex(auth.g.toString(16));\n auth.b = new Array(256);\n MTProto.secureRandom.nextBytes(auth.b);\n cryptoworker_1.default.modPow(gBytes, auth.b, auth.dhPrime).then(function (gB) {\n var data = new tl_utils_1.TLSerialization({ mtproto: true });\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n // @ts-ignore\n var dataWithHash = bin_utils_1.sha1BytesSync(data.getBuffer()).concat(data.getBytes());\n var encryptedData = bin_utils_1.aesEncryptSync(dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n var request = new tl_utils_1.TLSerialization({ mtproto: true });\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n console.log(utils_1.dT(), 'Send set_client_DH_params');\n _this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('Set_client_DH_params_answer');\n if (response._ != 'dh_gen_ok' && response._ != 'dh_gen_retry' && response._ != 'dh_gen_fail') {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer nonce mismatch'));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer server_nonce mismatch'));\n return false;\n }\n cryptoworker_1.default.modPow(auth.gA, auth.b, auth.dhPrime).then(function (authKey) {\n var authKeyHash = bin_utils_1.sha1BytesSync(authKey), authKeyAux = authKeyHash.slice(0, 8), authKeyID = authKeyHash.slice(-8);\n console.log(utils_1.dT(), 'Got Set_client_DH_params_answer', response._);\n switch (response._) {\n case 'dh_gen_ok':\n var newNonceHash1 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([1], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash1 mismatch'));\n return false;\n }\n var serverSalt = bin_utils_1.bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n // console.log('Auth successfull!', authKeyID, authKey, serverSalt);\n auth.authKeyID = authKeyID;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n deferred.resolve(auth);\n break;\n case 'dh_gen_retry':\n var newNonceHash2 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([2], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch'));\n return false;\n }\n return _this.mtpSendSetClientDhParams(auth);\n case 'dh_gen_fail':\n var newNonceHash3 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([3], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch'));\n return false;\n }\n deferred.reject(new Error('[MT] Set_client_DH_params_answer fail'));\n return false;\n }\n }, deferred.reject);\n }, deferred.reject);\n }, deferred.reject);\n };\n // mtpAuth\n Authorizer.prototype.auth = function (dcID) {\n var _this = this;\n if (dcID in this.cached) {\n return this.cached[dcID];\n }\n var nonce = [];\n for (var i = 0; i < 16; i++) {\n nonce.push(bin_utils_1.nextRandomInt(0xFF));\n }\n if (!MTProto.dcConfigurator.chooseServer(dcID)) {\n return Promise.reject(new Error('[MT] No server found for dc ' + dcID));\n }\n var promise = new Promise(function (resolve, reject) {\n var auth = {\n dcID: dcID,\n nonce: nonce,\n deferred: { resolve: resolve, reject: reject }\n };\n //this.cached[dcID] = auth.deferred.promise;\n _this.cached[dcID] = promise;\n setTimeout(function () {\n _this.mtpSendReqPQ(auth);\n });\n }).catch(function () {\n delete _this.cached[dcID];\n });\n return promise;\n //return this.cached[dcID];\n };\n return Authorizer;\n }());\n MTProto.Authorizer = Authorizer;\n var NetworkerFactory = /** @class */ (function () {\n function NetworkerFactory( /*public AppRuntimeManager: any , $rootScope: any */) {\n /* delete $http.defaults.headers.post['Content-Type']\n delete $http.defaults.headers.common['Accept'] */\n this.updatesProcessor = null;\n this.iii = 0;\n this.offline = false;\n this.offlineInited = false;\n this.akStopped = false;\n /* $rootScope.retryOnline = function() {\n $(document.body).trigger('online');\n } */\n }\n NetworkerFactory.prototype.startAll = function () {\n if (this.akStopped) {\n this.akStopped = false;\n // @ts-ignore\n this.updatesProcessor({\n _: 'new_session_created'\n }, true);\n }\n };\n NetworkerFactory.prototype.stopAll = function () {\n this.akStopped = true;\n };\n NetworkerFactory.prototype.setUpdatesProcessor = function (callback) {\n this.updatesProcessor = callback;\n };\n NetworkerFactory.prototype.getNetworker = function (dcID, authKey, serverSalt, options) {\n console.log(utils_1.dT(), 'NetworkerFactory: creating new instance of MTPNetworker...');\n return new mtnetworker_1.MTPNetworker(this, dcID, authKey, serverSalt, options);\n };\n return NetworkerFactory;\n }());\n MTProto.NetworkerFactory = NetworkerFactory;\n var ApiManager = /** @class */ (function () {\n function ApiManager() {\n //MtpSingleInstanceService.start();\n var _this = this;\n this.cachedNetworkers = {};\n this.cachedUploadNetworkers = {};\n this.cachedExportPromise = {};\n this.baseDcID = false;\n this.telegramMeNotified = false;\n storage_1.default.get('dc').then(function (dcID) {\n if (dcID) {\n _this.baseDcID = dcID;\n }\n });\n }\n ApiManager.prototype.telegramMeNotify = function (newValue) {\n if (this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n exports.telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n };\n // mtpSetUserAuth\n ApiManager.prototype.setUserAuth = function (dcID, userAuth) {\n var fullUserAuth = Object.assign({ dcID: dcID }, userAuth);\n storage_1.default.set({\n dc: dcID,\n user_auth: fullUserAuth\n });\n this.telegramMeNotify(true);\n $rootScope.$broadcast('user_auth', fullUserAuth);\n this.baseDcID = dcID;\n };\n // mtpLogOut\n ApiManager.prototype.logOut = function () {\n var _this = this;\n var storageKeys = [];\n for (var dcID = 1; dcID <= 5; dcID++) {\n storageKeys.push('dc' + dcID + '_auth_key');\n }\n // WebPushApiManager.forceUnsubscribe(); // WARNING\n return storage_1.default.get(storageKeys).then(function (storageResult) {\n var logoutPromises = [];\n for (var i = 0; i < storageResult.length; i++) {\n if (storageResult[i]) {\n logoutPromises.push(_this.invokeApi('auth.logOut', {}, { dcID: i + 1, ignoreErrors: true }));\n }\n }\n return Promise.all(logoutPromises).then(function () {\n storage_1.default.remove('dc', 'user_auth');\n _this.baseDcID = false;\n _this.telegramMeNotify(false);\n return _this.mtpClearStorage();\n }, function (error) {\n storageKeys.push('dc', 'user_auth');\n storage_1.default.remove(storageKeys);\n _this.baseDcID = false;\n error.handled = true;\n _this.telegramMeNotify(false);\n return _this.mtpClearStorage();\n });\n });\n };\n ApiManager.prototype.mtpClearStorage = function () {\n var saveKeys = ['user_auth', 't_user_auth', 'dc', 't_dc'];\n for (var dcID = 1; dcID <= 5; dcID++) {\n saveKeys.push('dc' + dcID + '_auth_key');\n saveKeys.push('t_dc' + dcID + '_auth_key');\n }\n storage_1.default.noPrefix();\n storage_1.default.get(saveKeys).then(function (values) {\n storage_1.default.clear().then(function () {\n var restoreObj = {};\n saveKeys.forEach(function (key, i) {\n var value = values[i];\n if (value !== false && value !== undefined) {\n restoreObj[key] = value;\n }\n });\n storage_1.default.noPrefix();\n return storage_1.default.set(restoreObj);\n });\n });\n };\n // mtpGetNetworker\n ApiManager.prototype.getNetworker = function (dcID, options) {\n if (options === void 0) { options = {}; }\n var cache = (options.fileUpload || options.fileDownload)\n ? this.cachedUploadNetworkers\n : this.cachedNetworkers;\n if (!dcID) {\n throw new Error('get Networker without dcID');\n }\n if (cache[dcID] !== undefined) {\n return Promise.resolve(cache[dcID]);\n //return qSync.when(cache[dcID]);\n }\n var akk = 'dc' + dcID + '_auth_key';\n var ssk = 'dc' + dcID + '_server_salt';\n // WARNING added []\n return storage_1.default.get([akk, ssk]).then(function (result) {\n if (cache[dcID] !== undefined) {\n return cache[dcID];\n }\n var authKeyHex = result[0];\n var serverSaltHex = result[1];\n // console.log('ass', dcID, authKeyHex, serverSaltHex)\n if (authKeyHex && authKeyHex.length == 512) {\n if (!serverSaltHex || serverSaltHex.length != 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n var authKey = bin_utils_1.bytesFromHex(authKeyHex);\n var serverSalt = bin_utils_1.bytesFromHex(serverSaltHex);\n return cache[dcID] = MTProto.networkerFactory.getNetworker(dcID, authKey, serverSalt, options);\n }\n if (!options.createNetworker) {\n return Promise.reject({ type: 'AUTH_KEY_EMPTY', code: 401 });\n //return $q.reject({type: 'AUTH_KEY_EMPTY', code: 401})\n }\n return MTProto.authorizer.auth(dcID).then(function (auth) {\n var _a;\n var storeObj = (_a = {},\n _a[akk] = bin_utils_1.bytesToHex(auth.authKey),\n _a[ssk] = bin_utils_1.bytesToHex(auth.serverSalt),\n _a);\n storage_1.default.set(storeObj);\n return cache[dcID] = MTProto.networkerFactory.getNetworker(dcID, auth.authKey, auth.serverSalt, options);\n }, function (error) {\n console.log('Get networker error', error, error.stack);\n return Promise.reject(error);\n //return $q.reject(error);\n });\n });\n };\n // mtpInvokeApi\n ApiManager.prototype.invokeApi = function (method, params, options) {\n var _this = this;\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n console.log(utils_1.dT(), 'Invoke api', method, params, options);\n return new Promise(function (resolve, reject) {\n var rejectPromise = function (error) {\n if (!error) {\n error = { type: 'ERROR_EMPTY' };\n }\n else if (!utils_1.isObject(error)) {\n error = { message: error };\n }\n reject(error);\n if (options.ignoreErrors) {\n return;\n }\n if (error.code == 406) {\n error.handled = true;\n }\n if (!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(function () {\n if (!error.handled) {\n if (error.code == 401) {\n // @ts-ignore WARNING!\n _this.logOut().finally(function () {\n if (location.protocol == 'http:' &&\n !Config.Modes.http &&\n Config.App.domains.indexOf(location.hostname) != -1) {\n location.href = location.href.replace(/^http:/, 'https:');\n }\n else {\n location.hash = '/login';\n // AppRuntimeManager.reload(); // WARNING\n }\n });\n }\n else {\n // ErrorService.show({error: error}); // WARNING\n }\n error.handled = true;\n }\n }, 100);\n }\n };\n var dcID;\n var cachedNetworker;\n var stack = (new Error()).stack || 'empty stack';\n var performRequest = function (networker) {\n return (cachedNetworker = networker)\n .wrapApiCall(method, params, options)\n .then(resolve, function (error) {\n console.error(utils_1.dT(), 'Error', error.code, error.type, _this.baseDcID, dcID);\n if (error.code == 401 && _this.baseDcID == dcID) {\n storage_1.default.remove('dc', 'user_auth');\n _this.telegramMeNotify(false);\n rejectPromise(error);\n }\n else if (error.code == 401 && _this.baseDcID && dcID != _this.baseDcID) {\n if (_this.cachedExportPromise[dcID] === undefined) {\n var promise = new Promise(function (exportResolve, exportReject) {\n _this.invokeApi('auth.exportAuthorization', { dc_id: dcID }, { noErrorBox: true }).then(function (exportedAuth) {\n _this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, { dcID: dcID, noErrorBox: true }).then(exportResolve, exportReject);\n }, exportReject);\n });\n _this.cachedExportPromise[dcID] = promise;\n }\n _this.cachedExportPromise[dcID].then(function () {\n (cachedNetworker = networker).wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n else if (error.code == 303) {\n var newDcID = error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2];\n if (newDcID != dcID) {\n if (options.dcID) {\n options.dcID = newDcID;\n }\n else {\n storage_1.default.set({ dc: _this.baseDcID = newDcID });\n }\n _this.getNetworker(newDcID, options).then(function (networker) {\n networker.wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n }\n else if (!options.rawError && error.code == 420) {\n var waitTime = error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 10;\n if (waitTime > (options.timeout || 60)) {\n return rejectPromise(error);\n }\n setTimeout(function () {\n performRequest(cachedNetworker);\n }, waitTime * 1000);\n }\n else if (!options.rawError && (error.code == 500 || error.type == 'MSG_WAIT_FAILED')) {\n var now = utils_1.tsNow();\n if (options.stopTime) {\n if (now >= options.stopTime) {\n return rejectPromise(error);\n }\n }\n else {\n options.stopTime = now + (options.timeout !== undefined ? options.timeout : 10) * 1000;\n }\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n setTimeout(function () {\n performRequest(cachedNetworker);\n }, options.waitTime * 1000);\n }\n else {\n rejectPromise(error);\n }\n });\n };\n if (dcID = (options.dcID || _this.baseDcID)) {\n _this.getNetworker(dcID, options).then(performRequest, rejectPromise);\n }\n else {\n storage_1.default.get('dc').then(function (baseDcID) {\n _this.getNetworker(dcID = baseDcID || 2, options).then(performRequest, rejectPromise);\n });\n }\n });\n };\n // mtpGetUserID\n ApiManager.prototype.getUserID = function () {\n var _this = this;\n return storage_1.default.get('user_auth').then(function (auth) {\n _this.telegramMeNotify(auth && auth.id > 0 || false);\n return auth.id || 0;\n });\n };\n ApiManager.prototype.getBaseDcID = function () {\n return this.baseDcID || false;\n };\n return ApiManager;\n }());\n MTProto.ApiManager = ApiManager;\n var ApiFileManager = /** @class */ (function () {\n function ApiFileManager() {\n this.cachedFs = false;\n this.cachedFsPromise = false;\n this.cachedSavePromises = {};\n this.cachedDownloadPromises = {};\n this.cachedDownloads = {};\n this.downloadPulls = {};\n this.downloadActives = {};\n this.index = 0;\n }\n ApiFileManager.prototype.downloadRequest = function (dcID, cb, activeDelta) {\n var _this = this;\n if (this.downloadPulls[dcID] === undefined) {\n this.downloadPulls[dcID] = [];\n this.downloadActives[dcID] = 0;\n }\n var downloadPull = this.downloadPulls[dcID];\n var promise = new Promise(function (resolve, reject) {\n // WARNING deferred!\n downloadPull.push({ cb: cb, deferred: { resolve: resolve, reject: reject }, activeDelta: activeDelta });\n });\n setTimeout(function () {\n _this.downloadCheck(dcID);\n }, 0);\n return promise;\n };\n ApiFileManager.prototype.downloadCheck = function (dcID) {\n var _this = this;\n var downloadPull = this.downloadPulls[dcID];\n var downloadLimit = dcID == 'upload' ? 11 : 5;\n if (this.downloadActives[dcID] >= downloadLimit || !downloadPull || !downloadPull.length) {\n return false;\n }\n var data = downloadPull.shift();\n var activeDelta = data.activeDelta || 1;\n this.downloadActives[dcID] += activeDelta;\n this.index++;\n data.cb()\n .then(function (result) {\n _this.downloadActives[dcID] -= activeDelta;\n _this.downloadCheck(dcID);\n data.deferred.resolve(result);\n }, function (error) {\n _this.downloadActives[dcID] -= activeDelta;\n _this.downloadCheck(dcID);\n data.deferred.reject(error);\n });\n };\n ApiFileManager.prototype.getFileName = function (location) {\n switch (location._) {\n case 'inputDocumentFileLocation':\n var fileName = (location.file_name || '').split('.', 2);\n var ext = fileName[1] || '';\n if (location.stickerType == 1 /* && !WebpManager.isWebpSupported() */) { // warning\n ext += 'webp'; /* 'png'; */\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n var versionPart = location.version ? ('v' + location.version) : '';\n return fileName[0] + '_' + location.id + versionPart + (ext ? '.' + ext : ext);\n default:\n if (!location.volume_id && !location.file_reference) {\n console.trace('Empty location', location);\n }\n var ext = 'jpg';\n if (location.stickerType == 1) {\n ext = 'webp' /* WebpManager.isWebpSupported() ? 'webp' : 'png'*/;\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n if (location.volume_id) {\n return location.volume_id + '_' + location.local_id + '_' + location.secret + '.' + ext;\n }\n else {\n return location.id + '_' + location.access_hash + '.' + ext;\n }\n }\n };\n ApiFileManager.prototype.getTempFileName = function (file) {\n var size = file.size || -1;\n var random = bin_utils_1.nextRandomInt(0xFFFFFFFF);\n return '_temp' + random + '_' + size;\n };\n ApiFileManager.prototype.getCachedFile = function (location) {\n if (!location) {\n return false;\n }\n var fileName = this.getFileName(location);\n return this.cachedDownloads[fileName] || false;\n };\n ApiFileManager.prototype.getFileStorage = function () {\n if (!Config.Modes.memory_only) {\n /* if(TmpfsFileStorage.isAvailable()) {\n return TmpfsFileStorage;\n } */\n if (idb_1.default.isAvailable()) {\n return idb_1.default;\n }\n }\n return idb_1.default /* MemoryFileStorage */;\n };\n ApiFileManager.prototype.saveSmallFile = function (location, bytes) {\n var _this = this;\n var fileName = this.getFileName(location);\n if (!this.cachedSavePromises[fileName]) {\n this.cachedSavePromises[fileName] = this.getFileStorage().saveFile(fileName, bytes).then(function (blob) {\n return _this.cachedDownloads[fileName] = blob;\n }, function (error) {\n delete _this.cachedSavePromises[fileName];\n });\n }\n return this.cachedSavePromises[fileName];\n };\n ApiFileManager.prototype.downloadSmallFile = function (location, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n var dcID = options.dcID || location.dc_id;\n var mimeType = options.mimeType || 'image/jpeg';\n var fileName = this.getFileName(location);\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n if (cachedPromise) {\n return cachedPromise;\n }\n var fileStorage = this.getFileStorage();\n return this.cachedDownloadPromises[fileName] = fileStorage.getFile(fileName).then(function (blob) {\n return _this.cachedDownloads[fileName] = blob;\n }, function () {\n var downloadPromise = _this.downloadRequest(dcID, function () {\n var inputLocation = location;\n if (!inputLocation._ || inputLocation._ == 'fileLocation') {\n inputLocation = Object.assign({}, location, { _: 'inputFileLocation' });\n }\n var params = {\n flags: 0,\n location: inputLocation,\n offset: 0,\n limit: 1024 * 1024\n };\n console.log('next small promise', params);\n return MTProto.apiManager.invokeApi('upload.getFile', params, {\n dcID: dcID,\n fileDownload: true,\n createNetworker: true,\n noErrorBox: true\n });\n }, dcID);\n var processDownloaded = function (bytes) {\n return Promise.resolve(bytes);\n /* if(!location.sticker || WebpManager.isWebpSupported()) {\n return qSync.when(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n return fileStorage.getFileWriter(fileName, mimeType).then(function (fileWriter) {\n return downloadPromise.then(function (result) {\n return processDownloaded(result.bytes).then(function (proccessedResult) {\n return filemanager_1.default.write(fileWriter, proccessedResult).then(function () {\n return _this.cachedDownloads[fileName] = fileWriter.finalize();\n });\n });\n });\n });\n });\n };\n ApiFileManager.prototype.getDownloadedFile = function (location, size) {\n var fileStorage = this.getFileStorage();\n var fileName = this.getFileName(location);\n return fileStorage.getFile(fileName, size);\n };\n ApiFileManager.prototype.downloadFile = function (dcID, location, size, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n /* var processSticker = false;\n if(location.sticker && !WebpManager.isWebpSupported()) {\n if(options.toFileEntry || size > 524288) {\n delete location.sticker;\n } else {\n processSticker = true;\n options.mime = 'image/png';\n }\n } */\n // console.log(dT(), 'Dload file', dcID, location, size)\n var fileName = this.getFileName(location);\n var toFileEntry = options.toFileEntry || null;\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n var fileStorage = this.getFileStorage();\n // console.log(dT(), 'fs', fileStorage.name, fileName, cachedPromise)\n if (cachedPromise) {\n if (toFileEntry) {\n return cachedPromise.then(function (blob) {\n return filemanager_1.default.copy(blob, toFileEntry);\n });\n }\n return cachedPromise;\n }\n //var deferred = $q.defer()\n var deferredHelper = { notify: function () { } };\n var deferred = new Promise(function (resolve, reject) {\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n });\n Object.assign(deferred, deferredHelper);\n var canceled = false;\n var resolved = false;\n var mimeType = options.mime_type || 'image/jpeg', cacheFileWriter;\n var errorHandler = function (error) {\n deferred.reject(error);\n errorHandler = function () { };\n if (cacheFileWriter &&\n (!error || error.type != 'DOWNLOAD_CANCELED')) {\n cacheFileWriter.truncate(0);\n }\n };\n fileStorage.getFile(fileName, size).then(function (blob) {\n if (toFileEntry) {\n filemanager_1.default.copy(blob, toFileEntry).then(function () {\n deferred.resolve();\n }, errorHandler);\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = blob);\n }\n }, function () {\n var fileWriterPromise = toFileEntry ? filemanager_1.default.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType);\n var processDownloaded = function (bytes) {\n return Promise.resolve(bytes);\n /* if(!processSticker) {\n return Promise.resolve(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n fileWriterPromise.then(function (fileWriter) {\n cacheFileWriter = fileWriter;\n var limit = 524288, offset;\n var startOffset = 0;\n var writeFilePromise = Promise.resolve(), writeFileDeferred;\n if (fileWriter.length) {\n startOffset = fileWriter.length;\n if (startOffset >= size) {\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n return;\n }\n fileWriter.seek(startOffset);\n deferred.notify({ done: startOffset, total: size });\n }\n var _loop_1 = function () {\n //writeFileDeferred = $q.defer();\n var writeFileDeferredHelper = {};\n writeFileDeferred = new Promise(function (resolve, reject) {\n writeFileDeferredHelper.resolve = resolve;\n writeFileDeferredHelper.reject = reject;\n });\n Object.assign(writeFileDeferred, writeFileDeferredHelper);\n ;\n (function (isFinal, offset, writeFileDeferred, writeFilePromise) {\n return _this.downloadRequest(dcID, function () {\n if (canceled) {\n return Promise.resolve();\n }\n return MTProto.apiManager.invokeApi('upload.getFile', {\n flags: 0,\n location: location,\n offset: offset,\n limit: limit\n }, {\n dcID: dcID,\n fileDownload: true,\n singleInRequest: 'safari' in window,\n createNetworker: true\n });\n }, dcID).then(function (result) {\n writeFilePromise.then(function () {\n if (canceled) {\n return Promise.resolve();\n }\n return processDownloaded(result.bytes).then(function (processedResult) {\n return filemanager_1.default.write(fileWriter, processedResult).then(function () {\n writeFileDeferred.resolve();\n }, errorHandler).then(function () {\n if (isFinal) {\n resolved = true;\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n }\n else {\n deferred.notify({ done: offset + limit, total: size });\n }\n });\n });\n });\n });\n })(offset + limit >= size, offset, writeFileDeferred, writeFilePromise);\n writeFilePromise = writeFileDeferred;\n };\n for (offset = startOffset; offset < size; offset += limit) {\n _loop_1();\n }\n });\n });\n deferred.cancel = function () {\n if (!canceled && !resolved) {\n canceled = true;\n delete _this.cachedDownloadPromises[fileName];\n errorHandler({ type: 'DOWNLOAD_CANCELED' });\n }\n };\n if (!toFileEntry) {\n this.cachedDownloadPromises[fileName] = deferred;\n }\n return deferred;\n };\n ApiFileManager.prototype.uploadFile = function (file) {\n var fileSize = file.size, isBigFile = fileSize >= 10485760, canceled = false, resolved = false, doneParts = 0, partSize = 262144, // 256 Kb\n activeDelta = 2;\n if (fileSize > 67108864) {\n partSize = 524288;\n activeDelta = 4;\n }\n else if (fileSize < 102400) {\n partSize = 32768;\n activeDelta = 1;\n }\n var totalParts = Math.ceil(fileSize / partSize);\n if (totalParts > 3000) {\n return Promise.reject({ type: 'FILE_TOO_BIG' });\n }\n var fileID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n //var deferred = $q.defer();\n var deferredHelper = { notify: function () { } };\n var deferred = new Promise(function (resolve, reject) {\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n return Promise.resolve();\n });\n Object.assign(deferred, deferredHelper);\n var errorHandler = function (error) {\n console.error(utils_1.dT(), 'Up Error', error);\n deferred.reject(error);\n canceled = true;\n errorHandler = function () { };\n };\n var _part = 0, resultInputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileID,\n parts: totalParts,\n name: file.name,\n md5_checksum: ''\n };\n var _loop_2 = function (offset) {\n var part = _part++; // 0, 1\n this_1.downloadRequest('upload', function () {\n return new Promise(function (uploadResolve, uploadReject) {\n var reader = new FileReader();\n var blob = file.slice(offset, offset + partSize);\n reader.onloadend = function (e) {\n if (canceled) {\n uploadReject();\n return;\n }\n if (e.target.readyState != FileReader.DONE) {\n console.error(utils_1.dT(), 'wrong readyState!');\n return;\n }\n console.log(utils_1.dT(), 'Starting to upload file, isBig:', isBigFile, fileID, part);\n MTProto.apiManager.invokeApi(isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart', {\n file_id: fileID,\n file_part: part,\n file_total_parts: totalParts,\n bytes: e.target.result\n }, {\n startMaxLength: partSize + 256,\n fileUpload: true,\n singleInRequest: true\n }).then(function (result) {\n doneParts++;\n uploadResolve();\n console.log(utils_1.dT(), 'Progress', doneParts * partSize / fileSize);\n if (doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n else {\n deferred.notify({ done: doneParts * partSize, total: fileSize });\n }\n }, errorHandler);\n };\n reader.readAsArrayBuffer(blob);\n });\n }, activeDelta);\n };\n var this_1 = this;\n for (var offset = 0; offset < fileSize; offset += partSize) {\n _loop_2(offset);\n }\n deferred.cancel = function () {\n console.log('cancel upload', canceled, resolved);\n if (!canceled && !resolved) {\n canceled = true;\n errorHandler({ type: 'UPLOAD_CANCELED' });\n }\n };\n return deferred;\n };\n return ApiFileManager;\n }());\n MTProto.ApiFileManager = ApiFileManager;\n var ServerTimeManager = /** @class */ (function () {\n function ServerTimeManager() {\n var _this = this;\n this.timestampNow = utils_1.tsNow(true);\n this.midnightNoOffset = this.timestampNow - (this.timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000));\n this.serverTimeOffset = 0;\n this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n };\n this.midnightOffseted.setHours(0);\n this.midnightOffseted.setMinutes(0);\n this.midnightOffseted.setSeconds(0);\n storage_1.default.get('server_time_offset').then(function (to) {\n if (to) {\n _this.serverTimeOffset = to;\n _this.timeParams.serverTimeOffset = to;\n }\n });\n }\n return ServerTimeManager;\n }());\n MTProto.ServerTimeManager = ServerTimeManager;\n var PasswordManager = /** @class */ (function () {\n function PasswordManager() {\n }\n PasswordManager.prototype.getState = function (options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('account.getPassword', {}, options).then(function (result) {\n return result;\n });\n };\n /* public updateSettings(state: any, settings: any) {\n var currentHashPromise;\n var newHashPromise;\n var params: any = {\n new_settings: {\n _: 'account.passwordInputSettings',\n flags: 0,\n hint: settings.hint || ''\n }\n };\n \n if(typeof settings.cur_password === 'string' &&\n settings.cur_password.length > 0) {\n currentHashPromise = this.makePasswordHash(state.current_salt, settings.cur_password);\n } else {\n currentHashPromise = Promise.resolve([]);\n }\n \n if (typeof settings.new_password === 'string' &&\n settings.new_password.length > 0) {\n var saltRandom = new Array(8);\n var newSalt = bufferConcat(state.new_salt, saltRandom);\n secureRandom.nextBytes(saltRandom);\n newHashPromise = this.makePasswordHash(newSalt, settings.new_password);\n params.new_settings.new_salt = newSalt;\n params.new_settings.flags |= 1;\n } else {\n if(typeof settings.new_password === 'string') {\n params.new_settings.flags |= 1;\n params.new_settings.new_salt = [];\n }\n newHashPromise = Promise.resolve([]);\n }\n \n if(typeof settings.email === 'string') {\n params.new_settings.flags |= 2;\n params.new_settings.email = settings.email || '';\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.current_password_hash = hashes[0];\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n } */\n PasswordManager.prototype.check = function (state, password, options) {\n if (options === void 0) { options = {}; }\n return this.computeCheck(password, state).then(function (inputCheckPassword) {\n return MTProto.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options);\n });\n };\n PasswordManager.prototype.requestRecovery = function (options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n };\n PasswordManager.prototype.recover = function (code, options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('auth.recoverPassword', {\n code: code\n }, options);\n };\n /* public makePasswordHash(salt: any, password: any) {\n var passwordUTF8 = unescape(encodeURIComponent(password));\n \n var buffer = new ArrayBuffer(passwordUTF8.length);\n var byteView = new Uint8Array(buffer);\n for(var i = 0, len = passwordUTF8.length; i < len; i++) {\n byteView[i] = passwordUTF8.charCodeAt(i);\n }\n \n buffer = bufferConcat(bufferConcat(salt, byteView), salt);\n \n return CryptoWorker.sha256Hash(buffer);\n } */\n PasswordManager.prototype.makePasswordHash = function (password, client_salt, server_salt) {\n var passwordUTF8 = unescape(encodeURIComponent(password));\n // @ts-ignore\n var textEncoder = new TextEncoder(\"utf-8\");\n var passwordBuffer = textEncoder.encode(passwordUTF8);\n // right\n var buffer = bin_utils_1.bufferConcats(client_salt, passwordBuffer, client_salt);\n return cryptoworker_1.default.sha256Hash(buffer).then(function (buffer) {\n console.log('encoded 1', bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n buffer = bin_utils_1.bufferConcats(server_salt, buffer, server_salt);\n return cryptoworker_1.default.sha256Hash(buffer).then(function (buffer) {\n console.log('encoded 2', buffer, bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n return cryptoworker_1.default.pbkdf2(new Uint8Array(buffer), client_salt, 100000).then(function (hash) {\n console.log('encoded 3', hash, bin_utils_1.bytesToHex(new Uint8Array(hash)));\n hash = bin_utils_1.bufferConcats(server_salt, hash, server_salt);\n return cryptoworker_1.default.sha256Hash(hash).then(function (buffer) {\n console.log('got password hash:', buffer, bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n return buffer;\n });\n });\n });\n });\n };\n PasswordManager.prototype.computeCheck = function (password, state) {\n return __awaiter(this, void 0, void 0, function () {\n var algo, p, B, g, check_prime_and_good, pw_hash, x, padArray, pForHash, gForHash, b_for_hash, g_x, k, kg_x, is_good_mod_exp_first, generate_and_check_random, _a, a, a_for_hash, u, g_b, ux, a_ux, S, K, h1, h2, buff, _b, _c, M1, out;\n var _this = this;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n algo = state.current_algo;\n p = leemon_1.str2bigInt(bin_utils_1.bytesToHex(algo.p), 16);\n B = leemon_1.str2bigInt(bin_utils_1.bytesToHex(state.srp_B), 16);\n g = leemon_1.int2bigInt(algo.g, 32, 256);\n console.log('p', leemon_1.bigInt2str(p, 16));\n console.log('B', leemon_1.bigInt2str(B, 16));\n check_prime_and_good = function (bytes, g) {\n var good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n if (bin_utils_1.bytesToHex(bytes) == good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n // TO-DO check_prime_and_good_check\n };\n return [4 /*yield*/, this.makePasswordHash(password, new Uint8Array(algo.salt1), new Uint8Array(algo.salt2))];\n case 1:\n pw_hash = _d.sent();\n x = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(pw_hash)), 16);\n console.warn('computed pw_hash:', pw_hash, x, bin_utils_1.bytesToHex(new Uint8Array(pw_hash)));\n padArray = function (arr, len, fill) {\n if (fill === void 0) { fill = 0; }\n return Array(len).fill(fill).concat(arr).slice(-len);\n };\n pForHash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(p, 16)), 256);\n gForHash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(g, 16)), 256);\n b_for_hash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(B, 16)), 256);\n console.log(bin_utils_1.bytesToHex(pForHash));\n console.log(bin_utils_1.bytesToHex(gForHash));\n console.log(bin_utils_1.bytesToHex(b_for_hash));\n g_x = leemon_1.powMod(g, x, p);\n console.log('g_x', leemon_1.bigInt2str(g_x, 16));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(bin_utils_1.bufferConcat(pForHash, gForHash))];\n case 2:\n k = _d.sent();\n k = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(k)), 16);\n console.log('k', leemon_1.bigInt2str(k, 16));\n kg_x = leemon_1.mod(leemon_1.mult(k, g_x), p);\n // good\n console.log('kg_x', leemon_1.bigInt2str(kg_x, 16));\n is_good_mod_exp_first = function (modexp, prime) {\n var diff = leemon_1.sub(prime, modexp);\n var min_diff_bits_count = 2048 - 64;\n var max_mod_exp_size = 256;\n if (leemon_1.negative(diff) ||\n leemon_1.bitSize(diff) < min_diff_bits_count ||\n leemon_1.bitSize(modexp) < min_diff_bits_count ||\n Math.floor((leemon_1.bitSize(modexp) + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n generate_and_check_random = function () { return __awaiter(_this, void 0, void 0, function () {\n var random_size, a_1, A, a_for_hash_1, s, u_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n random_size = 256;\n _a.label = 1;\n case 1:\n if (!true) return [3 /*break*/, 4];\n a_1 = leemon_1.str2bigInt(bin_utils_1.bytesToHex(state.secure_random), 16);\n A = leemon_1.powMod(g, a_1, p);\n if (!is_good_mod_exp_first(A, p)) return [3 /*break*/, 3];\n a_for_hash_1 = bin_utils_1.bytesFromHex(leemon_1.bigInt2str(A, 16));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(bin_utils_1.bufferConcat(new Uint8Array(a_for_hash_1), new Uint8Array(b_for_hash)))];\n case 2:\n s = _a.sent();\n u_1 = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(s)), 16);\n //if(u > 0)\n if (!leemon_1.isZero(u_1) && !leemon_1.negative(u_1))\n return [2 /*return*/, { a: a_1, a_for_hash: a_for_hash_1, u: u_1 }];\n _a.label = 3;\n case 3: return [3 /*break*/, 1];\n case 4: return [2 /*return*/];\n }\n });\n }); };\n return [4 /*yield*/, generate_and_check_random()];\n case 3:\n _a = _d.sent(), a = _a.a, a_for_hash = _a.a_for_hash, u = _a.u;\n console.log('a', leemon_1.bigInt2str(a, 16));\n console.log('a_for_hash', bin_utils_1.bytesToHex(a_for_hash));\n console.log('u', leemon_1.bigInt2str(u, 16));\n // g_b = (B - kg_x) % p\n console.log('B - kg_x', leemon_1.bigInt2str(leemon_1.sub(B, kg_x), 16));\n if (!leemon_1.greater(B, kg_x)) {\n console.log('negative');\n g_b = leemon_1.add(B, p);\n }\n else\n g_b = B;\n g_b = leemon_1.mod(leemon_1.sub(g_b, kg_x), p);\n ux = leemon_1.mult(u, x);\n a_ux = leemon_1.add(a, ux);\n S = leemon_1.powMod(g_b, a_ux, p);\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(S, 16)), 256))];\n case 4:\n K = _d.sent();\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(pForHash)];\n case 5:\n h1 = _d.sent();\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(gForHash)];\n case 6:\n h2 = _d.sent();\n h1 = bin_utils_1.bytesXor(new Uint8Array(h1), new Uint8Array(h2));\n _b = bin_utils_1.bufferConcats;\n _c = [h1];\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(algo.salt1)];\n case 7:\n _c = _c.concat([_d.sent()]);\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(algo.salt2)];\n case 8:\n buff = _b.apply(void 0, _c.concat([_d.sent(),\n a_for_hash,\n b_for_hash,\n K]));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(buff)];\n case 9:\n M1 = _d.sent();\n out = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1: new Uint8Array(M1)\n };\n console.log('out', bin_utils_1.bytesToHex(out.A), bin_utils_1.bytesToHex(out.M1));\n return [2 /*return*/, out];\n }\n });\n });\n };\n return PasswordManager;\n }());\n MTProto.PasswordManager = PasswordManager;\n MTProto.passwordManager = new PasswordManager();\n MTProto.secureRandom = new jsbn_1.SecureRandom();\n //export const mtproto = new MTProto();\n MTProto.dcConfigurator = new DcConfigurator();\n MTProto.rsaKeysManager = new RSAKeysManager();\n MTProto.timeManager = new TimeManager();\n MTProto.authorizer = new Authorizer();\n MTProto.networkerFactory = new NetworkerFactory();\n MTProto.apiManager = new ApiManager();\n MTProto.apiFileManager = new ApiFileManager();\n MTProto.serverTimeManager = new ServerTimeManager();\n})(MTProto = exports.MTProto || (exports.MTProto = {}));\nwindow.MTProto = MTProto;\n"
},
{
"id": 3,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/runtime/api.js",
"name": "./node_modules/css-loader/dist/runtime/api.js",
"index": 3,
"index2": 0,
"size": 2677,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerId": 22,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 22,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 185,
"building": 23
}
}
],
"profile": {
"factory": 726,
"building": 109
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 20,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"type": "cjs require",
"userRequest": "../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-84"
},
{
"moduleId": 22,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "../../css-loader/dist/runtime/api.js",
"loc": "1:27-74"
},
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-87"
},
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-87"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \"{\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = modules[_i]; // skip already imported module\n // this implementation is not 100% perfect for weird media query combinations\n // when a module is imported multiple times with different media queries.\n // I hope this will never occur (Hey this way we have smaller bundles)\n\n if (item[0] == null || !alreadyImportedModules[item[0]]) {\n if (mediaQuery && !item[2]) {\n item[2] = mediaQuery;\n } else if (mediaQuery) {\n item[2] = \"(\".concat(item[2], \") and (\").concat(mediaQuery, \")\");\n }\n\n list.push(item);\n }\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot).concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n return \"/*# \".concat(data, \" */\");\n}"
},
{
"id": 4,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"name": "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"index": 4,
"index2": 2,
"size": 6909,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"issuerId": 19,
"issuerName": "./src/materialize.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 187,
"building": 2741,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 19,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./src/materialize.scss",
"moduleName": "./src/materialize.scss",
"type": "cjs require",
"userRequest": "!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-94"
},
{
"moduleId": 21,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-84"
},
{
"moduleId": 23,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./src/scss/style.scss",
"moduleName": "./src/scss/style.scss",
"type": "cjs require",
"userRequest": "!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-97"
},
{
"moduleId": 27,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./src/scss/tgico.scss",
"moduleName": "./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-97"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n\nvar stylesInDom = {};\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nfunction listToStyles(list, options) {\n var styles = [];\n var newStyles = {};\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var css = item[1];\n var media = item[2];\n var sourceMap = item[3];\n var part = {\n css: css,\n media: media,\n sourceMap: sourceMap\n };\n\n if (!newStyles[id]) {\n styles.push(newStyles[id] = {\n id: id,\n parts: [part]\n });\n } else {\n newStyles[id].parts.push(part);\n }\n }\n\n return styles;\n}\n\nfunction addStylesToDom(styles, options) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i];\n var domStyle = stylesInDom[item.id];\n var j = 0;\n\n if (domStyle) {\n domStyle.refs++;\n\n for (; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j]);\n }\n\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j], options));\n }\n } else {\n var parts = [];\n\n for (; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j], options));\n }\n\n stylesInDom[item.id] = {\n id: item.id,\n refs: 1,\n parts: parts\n };\n }\n }\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n\n if (typeof options.attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n options.attributes.nonce = nonce;\n }\n }\n\n Object.keys(options.attributes).forEach(function (key) {\n style.setAttribute(key, options.attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n }\n\n if (sourceMap && btoa) {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n options.attributes = typeof options.attributes === 'object' ? options.attributes : {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n var styles = listToStyles(list, options);\n addStylesToDom(styles, options);\n return function update(newList) {\n var mayRemove = [];\n\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i];\n var domStyle = stylesInDom[item.id];\n\n if (domStyle) {\n domStyle.refs--;\n mayRemove.push(domStyle);\n }\n }\n\n if (newList) {\n var newStyles = listToStyles(newList, options);\n addStylesToDom(newStyles, options);\n }\n\n for (var _i = 0; _i < mayRemove.length; _i++) {\n var _domStyle = mayRemove[_i];\n\n if (_domStyle.refs === 0) {\n for (var j = 0; j < _domStyle.parts.length; j++) {\n _domStyle.parts[j]();\n }\n\n delete stylesInDom[_domStyle.id];\n }\n }\n };\n};"
},
{
"id": 5,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/config.js",
"name": "./src/lib/config.js",
"index": 20,
"index2": 17,
"size": 445393,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "55:26-45"
},
{
"moduleId": 8,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
"module": "./src/lib/storage.ts",
"moduleName": "./src/lib/storage.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "23:15-34"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "18:26-45"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "19:26-45"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nConfig = window.Config || {};\r\n\r\n/*\r\n\r\n IMPORTANT NOTICE\r\n ================\r\n\r\n Do not publish your Webogram fork with my app credentials (below), or your application may be blocked.\r\n You can get your own api_id, api_hash at https://my.telegram.org, see manual at https://core.telegram.org/api/obtaining_api_id.\r\n\r\n*/\r\n\r\nConfig.App = {\r\n id: 1025907,\r\n hash: '452b0359b988148995f22ff0f4229750',\r\n version: '0.1.0',\r\n domains: [],\r\n baseDcID: 2\r\n};\r\n\r\nConfig.Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: location.search.indexOf('http=1') > 0,\r\n ssl: location.search.indexOf('ssl=1') > 0 || location.protocol == 'https:' && location.search.indexOf('ssl=0') == -1,\r\n force_mobile: location.search.indexOf('mobile=1') > 0,\r\n force_desktop: location.search.indexOf('desktop=1') > 0,\r\n nacl: location.search.indexOf('nacl=0') == -1,\r\n webcrypto: location.search.indexOf('webcrypto=0') == -1,\r\n packed: location.protocol == 'app:' || location.protocol == 'chrome-extension:',\r\n ios_standalone: window.navigator.standalone && navigator.userAgent.match(/iOS|iPhone|iPad/),\r\n chrome_packed: window.chrome && chrome.app && chrome.app.window && true || false,\r\n animations: true,\r\n memory_only: false,\r\n allow_tmpfs: location.search.indexOf('tmpfs=yeahImSureIknowWhatImDoing') > 0 || false,\r\n push_api: location.search.indexOf('push=1') == -1\r\n};\r\n\r\nConfig.Mobile = false;\r\n\r\nConfig.Navigator = {\r\n nativeEmoji: /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform || ''),\r\n osX: (navigator.platform || '').toLowerCase().indexOf('mac') != -1 ||\r\n (navigator.userAgent || '').toLowerCase().indexOf('mac') != -1,\r\n msie: (navigator.userAgent || '').search(/MSIE | Trident\\/|Edge\\//) != -1,\r\n retina: window.devicePixelRatio > 1,\r\n ffos: navigator.userAgent.search(/mobi.+Gecko/i) != -1,\r\n ffos2p: navigator.userAgent.search(/mobi.+Gecko\\/[34567]/i) != -1,\r\n touch: screen.width <= 768 || ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,\r\n mobile: screen.width && screen.width < 480 || navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1\r\n};\r\n\r\nConfig.ExtCredentials = {\r\n gmaps: {\r\n api_key: 'AIzaSyC72t5GDcP-dob20d-ARwSwOQ41-zgbArg'\r\n }\r\n};\r\n\r\n{\r\n let img_size = 32;\r\n let sheetUrl = `assets/img/sheet_apple_${img_size}_`; // #.png\r\n let multiplyX = 100 / (6 - 1);\r\n let multiplyY = 100 / (52 - 1);\r\n let sheetSizeX = 6 * (img_size + 2); // size of image in pixels\r\n let sheetSizeY = 52 * (img_size + 2); // size of image in pixels\r\n let sizeX = 100 * (sheetSizeX / img_size);\r\n let sizeY = 100 * (sheetSizeY / img_size);\r\n\r\n Config.Emoji = {\r\n img_size,\r\n sheetUrl,\r\n multiplyX,\r\n multiplyY,\r\n sheetSizeX,\r\n sheetSizeY,\r\n sizeX,\r\n sizeY,\r\n\r\n emoji: [{\"unified\":\"0023-FE0F-20E3\",\"name\":\"HASH KEY\",\"short_names\":[\"hash\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":0},{\"unified\":\"002A-FE0F-20E3\",\"name\":null,\"short_names\":[\"keycap_star\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":1},{\"unified\":\"0030-FE0F-20E3\",\"name\":\"KEYCAP 0\",\"short_names\":[\"zero\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":2},{\"unified\":\"0031-FE0F-20E3\",\"name\":\"KEYCAP 1\",\"short_names\":[\"one\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":3},{\"unified\":\"0032-FE0F-20E3\",\"name\":\"KEYCAP 2\",\"short_names\":[\"two\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":4},{\"unified\":\"0033-FE0F-20E3\",\"name\":\"KEYCAP 3\",\"short_names\":[\"three\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":5},{\"unified\":\"0034-FE0F-20E3\",\"name\":\"KEYCAP 4\",\"short_names\":[\"four\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":6},{\"unified\":\"0035-FE0F-20E3\",\"name\":\"KEYCAP 5\",\"short_names\":[\"five\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":7},{\"unified\":\"0036-FE0F-20E3\",\"name\":\"KEYCAP 6\",\"short_names\":[\"six\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":8},{\"unified\":\"0037-FE0F-20E3\",\"name\":\"KEYCAP 7\",\"short_names\":[\"seven\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":9},{\"unified\":\"0038-FE0F-20E3\",\"name\":\"KEYCAP 8\",\"short_names\":[\"eight\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":10},{\"unified\":\"0039-FE0F-20E3\",\"name\":\"KEYCAP 9\",\"short_names\":[\"nine\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":11},{\"unified\":\"00A9-FE0F\",\"name\":\"COPYRIGHT SIGN\",\"short_names\":[\"copyright\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":12},{\"unified\":\"00AE-FE0F\",\"name\":\"REGISTERED SIGN\",\"short_names\":[\"registered\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":13},{\"unified\":\"1F004\",\"name\":\"MAHJONG TILE RED DRAGON\",\"short_names\":[\"mahjong\"],\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":14},{\"unified\":\"1F0CF\",\"name\":\"PLAYING CARD BLACK JOKER\",\"short_names\":[\"black_joker\"],\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":15},{\"unified\":\"1F170-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER A\",\"short_names\":[\"a\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":16},{\"unified\":\"1F171-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER B\",\"short_names\":[\"b\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":17},{\"unified\":\"1F17E-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER O\",\"short_names\":[\"o2\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":18},{\"unified\":\"1F17F-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER P\",\"short_names\":[\"parking\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":19},{\"unified\":\"1F18E\",\"name\":\"NEGATIVE SQUARED AB\",\"short_names\":[\"ab\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":20},{\"unified\":\"1F191\",\"name\":\"SQUARED CL\",\"short_names\":[\"cl\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":21},{\"unified\":\"1F192\",\"name\":\"SQUARED COOL\",\"short_names\":[\"cool\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":22},{\"unified\":\"1F193\",\"name\":\"SQUARED FREE\",\"short_names\":[\"free\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":23},{\"unified\":\"1F194\",\"name\":\"SQUARED ID\",\"short_names\":[\"id\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":24},{\"unified\":\"1F195\",\"name\":\"SQUARED NEW\",\"short_names\":[\"new\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":25},{\"unified\":\"1F196\",\"name\":\"SQUARED NG\",\"short_names\":[\"ng\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":26},{\"unified\":\"1F197\",\"name\":\"SQUARED OK\",\"short_names\":[\"ok\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":27},{\"unified\":\"1F198\",\"name\":\"SQUARED SOS\",\"short_names\":[\"sos\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":28},{\"unified\":\"1F199\",\"name\":\"SQUARED UP WITH EXCLAMATION MARK\",\"short_names\":[\"up\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":29},{\"unified\":\"1F19A\",\"name\":\"SQUARED VS\",\"short_names\":[\"vs\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":30},{\"unified\":\"1F1E6-1F1E8\",\"name\":\"Ascension Island Flag\",\"short_names\":[\"flag-ac\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":31},{\"unified\":\"1F1E6-1F1E9\",\"name\":\"Andorra Flag\",\"short_names\":[\"flag-ad\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":32},{\"unified\":\"1F1E6-1F1EA\",\"name\":\"United Arab Emirates Flag\",\"short_names\":[\"flag-ae\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":33},{\"unified\":\"1F1E6-1F1EB\",\"name\":\"Afghanistan Flag\",\"short_names\":[\"flag-af\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":34},{\"unified\":\"1F1E6-1F1EC\",\"name\":\"Antigua & Barbuda Flag\",\"short_names\":[\"flag-ag\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":35},{\"unified\":\"1F1E6-1F1EE\",\"name\":\"Anguilla Flag\",\"short_names\":[\"flag-ai\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":36},{\"unified\":\"1F1E6-1F1F1\",\"name\":\"Albania Flag\",\"short_names\":[\"flag-al\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":37},{\"unified\":\"1F1E6-1F1F2\",\"name\":\"Armenia Flag\",\"short_names\":[\"flag-am\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":38},{\"unified\":\"1F1E6-1F1F4\",\"name\":\"Angola Flag\",\"short_names\":[\"flag-ao\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":39},{\"unified\":\"1F1E6-1F1F6\",\"name\":\"Antarctica Flag\",\"short_names\":[\"flag-aq\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":40},{\"unified\":\"1F1E6-1F1F7\",\"name\":\"Argentina Flag\",\"short_names\":[\"flag-ar\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":41},{\"unified\":\"1F1E6-1F1F8\",\"name\":\"American Samoa Flag\",\"short_names\":[\"flag-as\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":42},{\"unified\":\"1F1E6-1F1F9\",\"name\":\"Austria Flag\",\"short_names\":[\"flag-at\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":43},{\"unified\":\"1F1E6-1F1FA\",\"name\":\"Australia Flag\",\"short_names\":[\"flag-au\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":44},{\"unified\":\"1F1E6-1F1FC\",\"name\":\"Aruba Flag\",\"short_names\":[\"flag-aw\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":45},{\"unified\":\"1F1E6-1F1FD\",\"name\":\"Åland Islands Flag\",\"short_names\":[\"flag-ax\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":46},{\"unified\":\"1F1E6-1F1FF\",\"name\":\"Azerbaijan Flag\",\"short_names\":[\"flag-az\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":47},{\"unified\":\"1F1E7-1F1E6\",\"name\":\"Bosnia & Herzegovina Flag\",\"short_names\":[\"flag-ba\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":48},{\"unified\":\"1F1E7-1F1E7\",\"name\":\"Barbados Flag\",\"short_names\":[\"flag-bb\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":49},{\"unified\":\"1F1E7-1F1E9\",\"name\":\"Bangladesh Flag\",\"short_names\":[\"flag-bd\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":50},{\"unified\":\"1F1E7-1F1EA\",\"name\":\"Belgium Flag\",\"short_names\":[\"flag-be\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":51},{\"unified\":\"1F1E7-1F1EB\",\"name\":\"Burkina Faso Flag\",\"short_names\":[\"flag-bf\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":52},{\"unified\":\"1F1E7-1F1EC\",\"name\":\"Bulgaria Flag\",\"short_names\":[\"flag-bg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":0},{\"unified\":\"1F1E7-1F1ED\",\"name\":\"Bahrain Flag\",\"short_names\":[\"flag-bh\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":1},{\"unified\":\"1F1E7-1F1EE\",\"name\":\"Burundi Flag\",\"short_names\":[\"flag-bi\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":2},{\"unified\":\"1F1E7-1F1EF\",\"name\":\"Benin Flag\",\"short_names\":[\"flag-bj\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":3},{\"unified\":\"1F1E7-1F1F1\",\"name\":\"St. Barthélemy Flag\",\"short_names\":[\"flag-bl\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":4},{\"unified\":\"1F1E7-1F1F2\",\"name\":\"Bermuda Flag\",\"short_names\":[\"flag-bm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":5},{\"unified\":\"1F1E7-1F1F3\",\"name\":\"Brunei Flag\",\"short_names\":[\"flag-bn\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":6},{\"unified\":\"1F1E7-1F1F4\",\"name\":\"Bolivia Flag\",\"short_names\":[\"flag-bo\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":7},{\"unified\":\"1F1E7-1F1F6\",\"name\":\"Caribbean Netherlands Flag\",\"short_names\":[\"flag-bq\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":8},{\"unified\":\"1F1E7-1F1F7\",\"name\":\"Brazil Flag\",\"short_names\":[\"flag-br\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":9},{\"unified\":\"1F1E7-1F1F8\",\"name\":\"Bahamas Flag\",\"short_names\":[\"flag-bs\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":10},{\"unified\":\"1F1E7-1F1F9\",\"name\":\"Bhutan Flag\",\"short_names\":[\"flag-bt\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":11},{\"unified\":\"1F1E7-1F1FB\",\"name\":\"Bouvet Island Flag\",\"short_names\":[\"flag-bv\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":12},{\"unified\":\"1F1E7-1F1FC\",\"name\":\"Botswana Flag\",\"short_names\":[\"flag-bw\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":13},{\"unified\":\"1F1E7-1F1FE\",\"name\":\"Belarus Flag\",\"short_names\":[\"flag-by\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":14},{\"unified\":\"1F1E7-1F1FF\",\"name\":\"Belize Flag\",\"short_names\":[\"flag-bz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":15},{\"unified\":\"1F1E8-1F1E6\",\"name\":\"Canada Flag\",\"short_names\":[\"flag-ca\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":16},{\"unified\":\"1F1E8-1F1E8\",\"name\":\"Cocos (Keeling) Islands Flag\",\"short_names\":[\"flag-cc\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":17},{\"unified\":\"1F1E8-1F1E9\",\"name\":\"Congo - Kinshasa Flag\",\"short_names\":[\"flag-cd\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":18},{\"unified\":\"1F1E8-1F1EB\",\"name\":\"Central African Republic Flag\",\"short_names\":[\"flag-cf\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":19},{\"unified\":\"1F1E8-1F1EC\",\"name\":\"Congo - Brazzaville Flag\",\"short_names\":[\"flag-cg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":20},{\"unified\":\"1F1E8-1F1ED\",\"name\":\"Switzerland Flag\",\"short_names\":[\"flag-ch\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":21},{\"unified\":\"1F1E8-1F1EE\",\"name\":\"Côte dIvoire Flag\",\"short_names\":[\"flag-ci\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":22},{\"unified\":\"1F1E8-1F1F0\",\"name\":\"Cook Islands Flag\",\"short_names\":[\"flag-ck\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":23},{\"unified\":\"1F1E8-1F1F1\",\"name\":\"Chile Flag\",\"short_names\":[\"flag-cl\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":24},{\"unified\":\"1F1E8-1F1F2\",\"name\":\"Cameroon Flag\",\"short_names\":[\"flag-cm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":25},{\"unified\":\"1F1E8-1F1F3\",\"name\":\"China Flag\",\"short_names\":[\"cn\",\"flag-cn\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":26},{\"unified\":\"1F1E8-1F1F4\",\"name\":\"Colombia Flag\",\"short_names\":[\"flag-co\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":27},{\"unified\":\"1F1E8-1F1F5\",\"name\":\"Clipperton Island Flag\",\"short_names\":[\"flag-cp\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":28},{\"unified\":\"1F1E8-1F1F7\",\"name\":\"Costa Rica Flag\",\"short_names\":[\"flag-cr\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":29},{\"unified\":\"1F1E8-1F1FA\",\"name\":\"Cuba Flag\",\"short_names\":[\"flag-cu\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":30},{\"unified\":\"1F1E8-1F1FB\",\"name\":\"Cape Verde Flag\",\"short_names\":[\"flag-cv\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":31},{\"unified\":\"1F1E8-1F1FC\",\"name\":\"Curaçao Flag\",\"short_names\":[\"flag-cw\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":32},{\"unified\":\"1F1E8-1F1FD\",\"name\":\"Christmas Island Flag\",\"short_names\":[\"flag-cx\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":33},{\"unified\":\"1F1E8-1F1FE\",\"name\":\"Cyprus Flag\",\"short_names\":[\"flag-cy\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":34},{\"unified\":\"1F1E8-1F1FF\",\"name\":\"Czechia Flag\",\"short_names\":[\"flag-cz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":35},{\"unified\":\"1F1E9-1F1EA\",\"name\":\"Germany Flag\",\"short_names\":[\"de\",\"flag-de\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":36},{\"unified\":\"1F1E9-1F1EC\",\"name\":\"Diego Garcia Flag\",\"short_names\":[\"flag-dg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":37},{\"unified\":\"1F1E9-1F1EF\",\"name\":\"Djibouti Flag\",\"short_names\":[\"flag-dj\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":38},{\"unified\":\"1F1E9-1F1F0\",\"name\":\"Denmark Flag\",\"short_names\":[\"flag-dk\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":39},{\"unified\":\"1F1E9-1F1F2\",\"name\":\"Dominica Flag\",\"short_names\":[\"flag-dm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":40},{\"unified\":\"1F1E9-1F1F4\",\"name\":\"Dominican Republic Flag\",\"short_names\":[\"flag-do\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":41},{\"unified\":\"1F1E9-1F1FF\",\"name\":\"Algeria Flag\",\"short_names\":[\"flag-dz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":42},{\"unified\":\"1F1EA-1F1E6\",\"name\":\"Ceuta & Melilla Flag\",\"short_names\":[\"flag-ea\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":43},{\"unified\":\"1F1EA-1F1E8\",\"name\":\"Ecuador Flag\",\"short_names\":[\"flag-ec\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":44},{\"unified\":\"1F1EA-1F1EA\",\"name\":\"Estonia Flag\",\"short_names\":[\"flag-ee\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":45},{\"unified\":\"1F1EA-1F1EC\",\"name\":\"Egypt Flag\",\"short_names\":[\"flag-eg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":46},{\"unified\":\"1F1EA-1F1ED\",\"name\":\"Western Sahara Flag\",\"short_names\":[\"flag-eh\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":47},{\"unified\":\"1F1EA-1F1F7\",\"name\":\"Eritrea Flag\",\"short_names\":[\"flag-er\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":48},{\"unified\":\"1F1EA-1F1F8\",\"name\":\"Spain Flag\",\"short_names\":[\"es\",\"flag-es\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":49},{\"unified\":\"1F1EA-1F1F9\",\"name\":\"Ethiopia Flag\",\"short_names\":[\"flag-et\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":50},{\"unified\":\"1F1EA-1F1FA\",\"name\":\"European Union Flag\",\"short_names\":[\"flag-eu\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":51},{\"unified\":\"1F1EB-1F1EE\",\"name\":\"Finland Flag\",\"short_names\":[\"flag-fi\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":52},{\"unified\":\"1F1EB-1F1EF\",\"name\":\"Fiji Flag\",\"short_names\":[\"flag-fj\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":0},{\"unified\":\"1F1EB-1F1F0\",\"name\":\"Falkland Islands Flag\",\"short_names\":[\"flag-fk\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":1},{\"unified\":\"1F1EB-1F1F2\",\"name\":\"Micronesia Flag\",\"short_names\":[\"flag-fm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":2},{\"unified\":\"1F1EB-1F1F4\",\"name\":\"Faroe Islands Flag\",\"short_names\":[\"flag-fo\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":3},{\"unified\":\"1F1EB-1F1F7\",\"name\":\"France Flag\",\"short_names\":[\"fr\",\"flag-fr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":4},{\"unified\":\"1F1EC-1F1E6\",\"name\":\"Gabon Flag\",\"short_names\":[\"flag-ga\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":5},{\"unified\":\"1F1EC-1F1E7\",\"name\":\"United Kingdom Flag\",\"short_names\":[\"gb\",\"uk\",\"flag-gb\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":6},{\"unified\":\"1F1EC-1F1E9\",\"name\":\"Grenada Flag\",\"short_names\":[\"flag-gd\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":7},{\"unified\":\"1F1EC-1F1EA\",\"name\":\"Georgia Flag\",\"short_names\":[\"flag-ge\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":8},{\"unified\":\"1F1EC-1F1EB\",\"name\":\"French Guiana Flag\",\"short_names\":[\"flag-gf\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":9},{\"unified\":\"1F1EC-1F1EC\",\"name\":\"Guernsey Flag\",\"short_names\":[\"flag-gg\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":10},{\"unified\":\"1F1EC-1F1ED\",\"name\":\"Ghana Flag\",\"short_names\":[\"flag-gh\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":11},{\"unified\":\"1F1EC-1F1EE\",\"name\":\"Gibraltar Flag\",\"short_names\":[\"flag-gi\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":12},{\"unified\":\"1F1EC-1F1F1\",\"name\":\"Greenland Flag\",\"short_names\":[\"flag-gl\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":13},{\"unified\":\"1F1EC-1F1F2\",\"name\":\"Gambia Flag\",\"short_names\":[\"flag-gm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":14},{\"unified\":\"1F1EC-1F1F3\",\"name\":\"Guinea Flag\",\"short_names\":[\"flag-gn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":15},{\"unified\":\"1F1EC-1F1F5\",\"name\":\"Guadeloupe Flag\",\"short_names\":[\"flag-gp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":16},{\"unified\":\"1F1EC-1F1F6\",\"name\":\"Equatorial Guinea Flag\",\"short_names\":[\"flag-gq\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":17},{\"unified\":\"1F1EC-1F1F7\",\"name\":\"Greece Flag\",\"short_names\":[\"flag-gr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":18},{\"unified\":\"1F1EC-1F1F8\",\"name\":\"South Georgia & South Sandwich Islands Flag\",\"short_names\":[\"flag-gs\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":19},{\"unified\":\"1F1EC-1F1F9\",\"name\":\"Guatemala Flag\",\"short_names\":[\"flag-gt\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":20},{\"unified\":\"1F1EC-1F1FA\",\"name\":\"Guam Flag\",\"short_names\":[\"flag-gu\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":21},{\"unified\":\"1F1EC-1F1FC\",\"name\":\"Guinea-Bissau Flag\",\"short_names\":[\"flag-gw\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":22},{\"unified\":\"1F1EC-1F1FE\",\"name\":\"Guyana Flag\",\"short_names\":[\"flag-gy\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":23},{\"unified\":\"1F1ED-1F1F0\",\"name\":\"Hong Kong SAR China Flag\",\"short_names\":[\"flag-hk\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":24},{\"unified\":\"1F1ED-1F1F2\",\"name\":\"Heard & McDonald Islands Flag\",\"short_names\":[\"flag-hm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":25},{\"unified\":\"1F1ED-1F1F3\",\"name\":\"Honduras Flag\",\"short_names\":[\"flag-hn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":26},{\"unified\":\"1F1ED-1F1F7\",\"name\":\"Croatia Flag\",\"short_names\":[\"flag-hr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":27},{\"unified\":\"1F1ED-1F1F9\",\"name\":\"Haiti Flag\",\"short_names\":[\"flag-ht\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":28},{\"unified\":\"1F1ED-1F1FA\",\"name\":\"Hungary Flag\",\"short_names\":[\"flag-hu\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":29},{\"unified\":\"1F1EE-1F1E8\",\"name\":\"Canary Islands Flag\",\"short_names\":[\"flag-ic\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":30},{\"unified\":\"1F1EE-1F1E9\",\"name\":\"Indonesia Flag\",\"short_names\":[\"flag-id\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":31},{\"unified\":\"1F1EE-1F1EA\",\"name\":\"Ireland Flag\",\"short_names\":[\"flag-ie\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":32},{\"unified\":\"1F1EE-1F1F1\",\"name\":\"Israel Flag\",\"short_names\":[\"flag-il\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":33},{\"unified\":\"1F1EE-1F1F2\",\"name\":\"Isle of Man Flag\",\"short_names\":[\"flag-im\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":34},{\"unified\":\"1F1EE-1F1F3\",\"name\":\"India Flag\",\"short_names\":[\"flag-in\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":35},{\"unified\":\"1F1EE-1F1F4\",\"name\":\"British Indian Ocean Territory Flag\",\"short_names\":[\"flag-io\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":36},{\"unified\":\"1F1EE-1F1F6\",\"name\":\"Iraq Flag\",\"short_names\":[\"flag-iq\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":37},{\"unified\":\"1F1EE-1F1F7\",\"name\":\"Iran Flag\",\"short_names\":[\"flag-ir\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":38},{\"unified\":\"1F1EE-1F1F8\",\"name\":\"Iceland Flag\",\"short_names\":[\"flag-is\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":39},{\"unified\":\"1F1EE-1F1F9\",\"name\":\"Italy Flag\",\"short_names\":[\"it\",\"flag-it\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":40},{\"unified\":\"1F1EF-1F1EA\",\"name\":\"Jersey Flag\",\"short_names\":[\"flag-je\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":41},{\"unified\":\"1F1EF-1F1F2\",\"name\":\"Jamaica Flag\",\"short_names\":[\"flag-jm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":42},{\"unified\":\"1F1EF-1F1F4\",\"name\":\"Jordan Flag\",\"short_names\":[\"flag-jo\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":43},{\"unified\":\"1F1EF-1F1F5\",\"name\":\"Japan Flag\",\"short_names\":[\"jp\",\"flag-jp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":44},{\"unified\":\"1F1F0-1F1EA\",\"name\":\"Kenya Flag\",\"short_names\":[\"flag-ke\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":45},{\"unified\":\"1F1F0-1F1EC\",\"name\":\"Kyrgyzstan Flag\",\"short_names\":[\"flag-kg\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":46},{\"unified\":\"1F1F0-1F1ED\",\"name\":\"Cambodia Flag\",\"short_names\":[\"flag-kh\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":47},{\"unified\":\"1F1F0-1F1EE\",\"name\":\"Kiribati Flag\",\"short_names\":[\"flag-ki\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":48},{\"unified\":\"1F1F0-1F1F2\",\"name\":\"Comoros Flag\",\"short_names\":[\"flag-km\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":49},{\"unified\":\"1F1F0-1F1F3\",\"name\":\"St. Kitts & Nevis Flag\",\"short_names\":[\"flag-kn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":50},{\"unified\":\"1F1F0-1F1F5\",\"name\":\"North Korea Flag\",\"short_names\":[\"flag-kp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":51},{\"unified\":\"1F1F0-1F1F7\",\"name\":\"South Korea Flag\",\"short_names\":[\"kr\",\"flag-kr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":52},{\"unified\":\"1F1F0-1F1FC\",\"name\":\"Kuwait Flag\",\"short_names\":[\"flag-kw\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":0},{\"unified\":\"1F1F0-1F1FE\",\"name\":\"Cayman Islands Flag\",\"short_names\":[\"flag-ky\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":1},{\"unified\":\"1F1F0-1F1FF\",\"name\":\"Kazakhstan Flag\",\"short_names\":[\"flag-kz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":2},{\"unified\":\"1F1F1-1F1E6\",\"name\":\"Laos Flag\",\"short_names\":[\"flag-la\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":3},{\"unified\":\"1F1F1-1F1E7\",\"name\":\"Lebanon Flag\",\"short_names\":[\"flag-lb\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":4},{\"unified\":\"1F1F1-1F1E8\",\"name\":\"St. Lucia Flag\",\"short_names\":[\"flag-lc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":5},{\"unified\":\"1F1F1-1F1EE\",\"name\":\"Liechtenstein Flag\",\"short_names\":[\"flag-li\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":6},{\"unified\":\"1F1F1-1F1F0\",\"name\":\"Sri Lanka Flag\",\"short_names\":[\"flag-lk\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":7},{\"unified\":\"1F1F1-1F1F7\",\"name\":\"Liberia Flag\",\"short_names\":[\"flag-lr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":8},{\"unified\":\"1F1F1-1F1F8\",\"name\":\"Lesotho Flag\",\"short_names\":[\"flag-ls\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":9},{\"unified\":\"1F1F1-1F1F9\",\"name\":\"Lithuania Flag\",\"short_names\":[\"flag-lt\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":10},{\"unified\":\"1F1F1-1F1FA\",\"name\":\"Luxembourg Flag\",\"short_names\":[\"flag-lu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":11},{\"unified\":\"1F1F1-1F1FB\",\"name\":\"Latvia Flag\",\"short_names\":[\"flag-lv\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":12},{\"unified\":\"1F1F1-1F1FE\",\"name\":\"Libya Flag\",\"short_names\":[\"flag-ly\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":13},{\"unified\":\"1F1F2-1F1E6\",\"name\":\"Morocco Flag\",\"short_names\":[\"flag-ma\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":14},{\"unified\":\"1F1F2-1F1E8\",\"name\":\"Monaco Flag\",\"short_names\":[\"flag-mc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":15},{\"unified\":\"1F1F2-1F1E9\",\"name\":\"Moldova Flag\",\"short_names\":[\"flag-md\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":16},{\"unified\":\"1F1F2-1F1EA\",\"name\":\"Montenegro Flag\",\"short_names\":[\"flag-me\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":17},{\"unified\":\"1F1F2-1F1EB\",\"name\":\"St. Martin Flag\",\"short_names\":[\"flag-mf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":18},{\"unified\":\"1F1F2-1F1EC\",\"name\":\"Madagascar Flag\",\"short_names\":[\"flag-mg\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":19},{\"unified\":\"1F1F2-1F1ED\",\"name\":\"Marshall Islands Flag\",\"short_names\":[\"flag-mh\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":20},{\"unified\":\"1F1F2-1F1F0\",\"name\":\"Macedonia Flag\",\"short_names\":[\"flag-mk\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":21},{\"unified\":\"1F1F2-1F1F1\",\"name\":\"Mali Flag\",\"short_names\":[\"flag-ml\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":22},{\"unified\":\"1F1F2-1F1F2\",\"name\":\"Myanmar (Burma) Flag\",\"short_names\":[\"flag-mm\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":23},{\"unified\":\"1F1F2-1F1F3\",\"name\":\"Mongolia Flag\",\"short_names\":[\"flag-mn\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":24},{\"unified\":\"1F1F2-1F1F4\",\"name\":\"Macau SAR China Flag\",\"short_names\":[\"flag-mo\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":25},{\"unified\":\"1F1F2-1F1F5\",\"name\":\"Northern Mariana Islands Flag\",\"short_names\":[\"flag-mp\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":26},{\"unified\":\"1F1F2-1F1F6\",\"name\":\"Martinique Flag\",\"short_names\":[\"flag-mq\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":27},{\"unified\":\"1F1F2-1F1F7\",\"name\":\"Mauritania Flag\",\"short_names\":[\"flag-mr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":28},{\"unified\":\"1F1F2-1F1F8\",\"name\":\"Montserrat Flag\",\"short_names\":[\"flag-ms\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":29},{\"unified\":\"1F1F2-1F1F9\",\"name\":\"Malta Flag\",\"short_names\":[\"flag-mt\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":30},{\"unified\":\"1F1F2-1F1FA\",\"name\":\"Mauritius Flag\",\"short_names\":[\"flag-mu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":31},{\"unified\":\"1F1F2-1F1FB\",\"name\":\"Maldives Flag\",\"short_names\":[\"flag-mv\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":32},{\"unified\":\"1F1F2-1F1FC\",\"name\":\"Malawi Flag\",\"short_names\":[\"flag-mw\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":33},{\"unified\":\"1F1F2-1F1FD\",\"name\":\"Mexico Flag\",\"short_names\":[\"flag-mx\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":34},{\"unified\":\"1F1F2-1F1FE\",\"name\":\"Malaysia Flag\",\"short_names\":[\"flag-my\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":35},{\"unified\":\"1F1F2-1F1FF\",\"name\":\"Mozambique Flag\",\"short_names\":[\"flag-mz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":36},{\"unified\":\"1F1F3-1F1E6\",\"name\":\"Namibia Flag\",\"short_names\":[\"flag-na\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":37},{\"unified\":\"1F1F3-1F1E8\",\"name\":\"New Caledonia Flag\",\"short_names\":[\"flag-nc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":38},{\"unified\":\"1F1F3-1F1EA\",\"name\":\"Niger Flag\",\"short_names\":[\"flag-ne\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":39},{\"unified\":\"1F1F3-1F1EB\",\"name\":\"Norfolk Island Flag\",\"short_names\":[\"flag-nf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":40},{\"unified\":\"1F1F3-1F1EC\",\"name\":\"Nigeria Flag\",\"short_names\":[\"flag-ng\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":41},{\"unified\":\"1F1F3-1F1EE\",\"name\":\"Nicaragua Flag\",\"short_names\":[\"flag-ni\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":42},{\"unified\":\"1F1F3-1F1F1\",\"name\":\"Netherlands Flag\",\"short_names\":[\"flag-nl\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":43},{\"unified\":\"1F1F3-1F1F4\",\"name\":\"Norway Flag\",\"short_names\":[\"flag-no\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":44},{\"unified\":\"1F1F3-1F1F5\",\"name\":\"Nepal Flag\",\"short_names\":[\"flag-np\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":45},{\"unified\":\"1F1F3-1F1F7\",\"name\":\"Nauru Flag\",\"short_names\":[\"flag-nr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":46},{\"unified\":\"1F1F3-1F1FA\",\"name\":\"Niue Flag\",\"short_names\":[\"flag-nu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":47},{\"unified\":\"1F1F3-1F1FF\",\"name\":\"New Zealand Flag\",\"short_names\":[\"flag-nz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":48},{\"unified\":\"1F1F4-1F1F2\",\"name\":\"Oman Flag\",\"short_names\":[\"flag-om\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":49},{\"unified\":\"1F1F5-1F1E6\",\"name\":\"Panama Flag\",\"short_names\":[\"flag-pa\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":50},{\"unified\":\"1F1F5-1F1EA\",\"name\":\"Peru Flag\",\"short_names\":[\"flag-pe\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":51},{\"unified\":\"1F1F5-1F1EB\",\"name\":\"French Polynesia Flag\",\"short_names\":[\"flag-pf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":52},{\"unified\":\"1F1F5-1F1EC\",\"name\":\"Papua New Guinea Flag\",\"short_names\":[\"flag-pg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":0},{\"unified\":\"1F1F5-1F1ED\",\"name\":\"Philippines Flag\",\"short_names\":[\"flag-ph\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":1},{\"unified\":\"1F1F5-1F1F0\",\"name\":\"Pakistan Flag\",\"short_names\":[\"flag-pk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":2},{\"unified\":\"1F1F5-1F1F1\",\"name\":\"Poland Flag\",\"short_names\":[\"flag-pl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":3},{\"unified\":\"1F1F5-1F1F2\",\"name\":\"St. Pierre & Miquelon Flag\",\"short_names\":[\"flag-pm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":4},{\"unified\":\"1F1F5-1F1F3\",\"name\":\"Pitcairn Islands Flag\",\"short_names\":[\"flag-pn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":5},{\"unified\":\"1F1F5-1F1F7\",\"name\":\"Puerto Rico Flag\",\"short_names\":[\"flag-pr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":6},{\"unified\":\"1F1F5-1F1F8\",\"name\":\"Palestinian Territories Flag\",\"short_names\":[\"flag-ps\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":7},{\"unified\":\"1F1F5-1F1F9\",\"name\":\"Portugal Flag\",\"short_names\":[\"flag-pt\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":8},{\"unified\":\"1F1F5-1F1FC\",\"name\":\"Palau Flag\",\"short_names\":[\"flag-pw\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":9},{\"unified\":\"1F1F5-1F1FE\",\"name\":\"Paraguay Flag\",\"short_names\":[\"flag-py\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":10},{\"unified\":\"1F1F6-1F1E6\",\"name\":\"Qatar Flag\",\"short_names\":[\"flag-qa\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":11},{\"unified\":\"1F1F7-1F1EA\",\"name\":\"Réunion Flag\",\"short_names\":[\"flag-re\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":12},{\"unified\":\"1F1F7-1F1F4\",\"name\":\"Romania Flag\",\"short_names\":[\"flag-ro\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":13},{\"unified\":\"1F1F7-1F1F8\",\"name\":\"Serbia Flag\",\"short_names\":[\"flag-rs\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":14},{\"unified\":\"1F1F7-1F1FA\",\"name\":\"Russia Flag\",\"short_names\":[\"ru\",\"flag-ru\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":15},{\"unified\":\"1F1F7-1F1FC\",\"name\":\"Rwanda Flag\",\"short_names\":[\"flag-rw\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":16},{\"unified\":\"1F1F8-1F1E6\",\"name\":\"Saudi Arabia Flag\",\"short_names\":[\"flag-sa\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":17},{\"unified\":\"1F1F8-1F1E7\",\"name\":\"Solomon Islands Flag\",\"short_names\":[\"flag-sb\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":18},{\"unified\":\"1F1F8-1F1E8\",\"name\":\"Seychelles Flag\",\"short_names\":[\"flag-sc\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":19},{\"unified\":\"1F1F8-1F1E9\",\"name\":\"Sudan Flag\",\"short_names\":[\"flag-sd\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":20},{\"unified\":\"1F1F8-1F1EA\",\"name\":\"Sweden Flag\",\"short_names\":[\"flag-se\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":21},{\"unified\":\"1F1F8-1F1EC\",\"name\":\"Singapore Flag\",\"short_names\":[\"flag-sg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":22},{\"unified\":\"1F1F8-1F1ED\",\"name\":\"St. Helena Flag\",\"short_names\":[\"flag-sh\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":23},{\"unified\":\"1F1F8-1F1EE\",\"name\":\"Slovenia Flag\",\"short_names\":[\"flag-si\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":24},{\"unified\":\"1F1F8-1F1EF\",\"name\":\"Svalbard & Jan Mayen Flag\",\"short_names\":[\"flag-sj\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":25},{\"unified\":\"1F1F8-1F1F0\",\"name\":\"Slovakia Flag\",\"short_names\":[\"flag-sk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":26},{\"unified\":\"1F1F8-1F1F1\",\"name\":\"Sierra Leone Flag\",\"short_names\":[\"flag-sl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":27},{\"unified\":\"1F1F8-1F1F2\",\"name\":\"San Marino Flag\",\"short_names\":[\"flag-sm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":28},{\"unified\":\"1F1F8-1F1F3\",\"name\":\"Senegal Flag\",\"short_names\":[\"flag-sn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":29},{\"unified\":\"1F1F8-1F1F4\",\"name\":\"Somalia Flag\",\"short_names\":[\"flag-so\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":30},{\"unified\":\"1F1F8-1F1F7\",\"name\":\"Suriname Flag\",\"short_names\":[\"flag-sr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":31},{\"unified\":\"1F1F8-1F1F8\",\"name\":\"South Sudan Flag\",\"short_names\":[\"flag-ss\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":32},{\"unified\":\"1F1F8-1F1F9\",\"name\":\"São Tomé & Príncipe Flag\",\"short_names\":[\"flag-st\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":33},{\"unified\":\"1F1F8-1F1FB\",\"name\":\"El Salvador Flag\",\"short_names\":[\"flag-sv\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":34},{\"unified\":\"1F1F8-1F1FD\",\"name\":\"Sint Maarten Flag\",\"short_names\":[\"flag-sx\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":35},{\"unified\":\"1F1F8-1F1FE\",\"name\":\"Syria Flag\",\"short_names\":[\"flag-sy\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":36},{\"unified\":\"1F1F8-1F1FF\",\"name\":\"Swaziland Flag\",\"short_names\":[\"flag-sz\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":37},{\"unified\":\"1F1F9-1F1E6\",\"name\":\"Tristan da Cunha Flag\",\"short_names\":[\"flag-ta\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":38},{\"unified\":\"1F1F9-1F1E8\",\"name\":\"Turks & Caicos Islands Flag\",\"short_names\":[\"flag-tc\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":39},{\"unified\":\"1F1F9-1F1E9\",\"name\":\"Chad Flag\",\"short_names\":[\"flag-td\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":40},{\"unified\":\"1F1F9-1F1EB\",\"name\":\"French Southern Territories Flag\",\"short_names\":[\"flag-tf\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":41},{\"unified\":\"1F1F9-1F1EC\",\"name\":\"Togo Flag\",\"short_names\":[\"flag-tg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":42},{\"unified\":\"1F1F9-1F1ED\",\"name\":\"Thailand Flag\",\"short_names\":[\"flag-th\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":43},{\"unified\":\"1F1F9-1F1EF\",\"name\":\"Tajikistan Flag\",\"short_names\":[\"flag-tj\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":44},{\"unified\":\"1F1F9-1F1F0\",\"name\":\"Tokelau Flag\",\"short_names\":[\"flag-tk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":45},{\"unified\":\"1F1F9-1F1F1\",\"name\":\"Timor-Leste Flag\",\"short_names\":[\"flag-tl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":46},{\"unified\":\"1F1F9-1F1F2\",\"name\":\"Turkmenistan Flag\",\"short_names\":[\"flag-tm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":47},{\"unified\":\"1F1F9-1F1F3\",\"name\":\"Tunisia Flag\",\"short_names\":[\"flag-tn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":48},{\"unified\":\"1F1F9-1F1F4\",\"name\":\"Tonga Flag\",\"short_names\":[\"flag-to\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":49},{\"unified\":\"1F1F9-1F1F7\",\"name\":\"Turkey Flag\",\"short_names\":[\"flag-tr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":50},{\"unified\":\"1F1F9-1F1F9\",\"name\":\"Trinidad & Tobago Flag\",\"short_names\":[\"flag-tt\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":51},{\"unified\":\"1F1F9-1F1FB\",\"name\":\"Tuvalu Flag\",\"short_names\":[\"flag-tv\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":52},{\"unified\":\"1F1F9-1F1FC\",\"name\":\"Taiwan Flag\",\"short_names\":[\"flag-tw\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":0},{\"unified\":\"1F1F9-1F1FF\",\"name\":\"Tanzania Flag\",\"short_names\":[\"flag-tz\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":1},{\"unified\":\"1F1FA-1F1E6\",\"name\":\"Ukraine Flag\",\"short_names\":[\"flag-ua\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":2},{\"unified\":\"1F1FA-1F1EC\",\"name\":\"Uganda Flag\",\"short_names\":[\"flag-ug\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":3},{\"unified\":\"1F1FA-1F1F2\",\"name\":\"U.S. Outlying Islands Flag\",\"short_names\":[\"flag-um\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":4},{\"unified\":\"1F1FA-1F1F3\",\"name\":\"United Nations Flag\",\"short_names\":[\"flag-un\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":5},{\"unified\":\"1F1FA-1F1F8\",\"name\":\"United States Flag\",\"short_names\":[\"us\",\"flag-us\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":6},{\"unified\":\"1F1FA-1F1FE\",\"name\":\"Uruguay Flag\",\"short_names\":[\"flag-uy\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":7},{\"unified\":\"1F1FA-1F1FF\",\"name\":\"Uzbekistan Flag\",\"short_names\":[\"flag-uz\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":8},{\"unified\":\"1F1FB-1F1E6\",\"name\":\"Vatican City Flag\",\"short_names\":[\"flag-va\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":9},{\"unified\":\"1F1FB-1F1E8\",\"name\":\"St. Vincent & Grenadines Flag\",\"short_names\":[\"flag-vc\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":10},{\"unified\":\"1F1FB-1F1EA\",\"name\":\"Venezuela Flag\",\"short_names\":[\"flag-ve\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":11},{\"unified\":\"1F1FB-1F1EC\",\"name\":\"British Virgin Islands Flag\",\"short_names\":[\"flag-vg\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":12},{\"unified\":\"1F1FB-1F1EE\",\"name\":\"U.S. Virgin Islands Flag\",\"short_names\":[\"flag-vi\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":13},{\"unified\":\"1F1FB-1F1F3\",\"name\":\"Vietnam Flag\",\"short_names\":[\"flag-vn\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":14},{\"unified\":\"1F1FB-1F1FA\",\"name\":\"Vanuatu Flag\",\"short_names\":[\"flag-vu\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":15},{\"unified\":\"1F1FC-1F1EB\",\"name\":\"Wallis & Futuna Flag\",\"short_names\":[\"flag-wf\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":16},{\"unified\":\"1F1FC-1F1F8\",\"name\":\"Samoa Flag\",\"short_names\":[\"flag-ws\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":17},{\"unified\":\"1F1FD-1F1F0\",\"name\":\"Kosovo Flag\",\"short_names\":[\"flag-xk\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":18},{\"unified\":\"1F1FE-1F1EA\",\"name\":\"Yemen Flag\",\"short_names\":[\"flag-ye\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":19},{\"unified\":\"1F1FE-1F1F9\",\"name\":\"Mayotte Flag\",\"short_names\":[\"flag-yt\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":20},{\"unified\":\"1F1FF-1F1E6\",\"name\":\"South Africa Flag\",\"short_names\":[\"flag-za\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":21},{\"unified\":\"1F1FF-1F1F2\",\"name\":\"Zambia Flag\",\"short_names\":[\"flag-zm\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":22},{\"unified\":\"1F1FF-1F1FC\",\"name\":\"Zimbabwe Flag\",\"short_names\":[\"flag-zw\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":23},{\"unified\":\"1F201\",\"name\":\"SQUARED KATAKANA KOKO\",\"short_names\":[\"koko\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":24},{\"unified\":\"1F202-FE0F\",\"name\":\"SQUARED KATAKANA SA\",\"short_names\":[\"sa\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":25},{\"unified\":\"1F21A\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7121\",\"short_names\":[\"u7121\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":26},{\"unified\":\"1F22F\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6307\",\"short_names\":[\"u6307\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":27},{\"unified\":\"1F232\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7981\",\"short_names\":[\"u7981\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":28},{\"unified\":\"1F233\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7A7A\",\"short_names\":[\"u7a7a\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":29},{\"unified\":\"1F234\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5408\",\"short_names\":[\"u5408\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":30},{\"unified\":\"1F235\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6E80\",\"short_names\":[\"u6e80\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":31},{\"unified\":\"1F236\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6709\",\"short_names\":[\"u6709\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":32},{\"unified\":\"1F237-FE0F\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6708\",\"short_names\":[\"u6708\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":33},{\"unified\":\"1F238\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7533\",\"short_names\":[\"u7533\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":34},{\"unified\":\"1F239\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5272\",\"short_names\":[\"u5272\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":35},{\"unified\":\"1F23A\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-55B6\",\"short_names\":[\"u55b6\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":36},{\"unified\":\"1F250\",\"name\":\"CIRCLED IDEOGRAPH ADVANTAGE\",\"short_names\":[\"ideograph_advantage\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":37},{\"unified\":\"1F251\",\"name\":\"CIRCLED IDEOGRAPH ACCEPT\",\"short_names\":[\"accept\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":38},{\"unified\":\"1F300\",\"name\":\"CYCLONE\",\"short_names\":[\"cyclone\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":39},{\"unified\":\"1F301\",\"name\":\"FOGGY\",\"short_names\":[\"foggy\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":40},{\"unified\":\"1F302\",\"name\":\"CLOSED UMBRELLA\",\"short_names\":[\"closed_umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":41},{\"unified\":\"1F303\",\"name\":\"NIGHT WITH STARS\",\"short_names\":[\"night_with_stars\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":42},{\"unified\":\"1F304\",\"name\":\"SUNRISE OVER MOUNTAINS\",\"short_names\":[\"sunrise_over_mountains\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":43},{\"unified\":\"1F305\",\"name\":\"SUNRISE\",\"short_names\":[\"sunrise\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":44},{\"unified\":\"1F306\",\"name\":\"CITYSCAPE AT DUSK\",\"short_names\":[\"city_sunset\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":45},{\"unified\":\"1F307\",\"name\":\"SUNSET OVER BUILDINGS\",\"short_names\":[\"city_sunrise\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":46},{\"unified\":\"1F308\",\"name\":\"RAINBOW\",\"short_names\":[\"rainbow\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":47},{\"unified\":\"1F309\",\"name\":\"BRIDGE AT NIGHT\",\"short_names\":[\"bridge_at_night\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":48},{\"unified\":\"1F30A\",\"name\":\"WATER WAVE\",\"short_names\":[\"ocean\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":49},{\"unified\":\"1F30B\",\"name\":\"VOLCANO\",\"short_names\":[\"volcano\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":50},{\"unified\":\"1F30C\",\"name\":\"MILKY WAY\",\"short_names\":[\"milky_way\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":51},{\"unified\":\"1F30D\",\"name\":\"EARTH GLOBE EUROPE-AFRICA\",\"short_names\":[\"earth_africa\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":52},{\"unified\":\"1F30E\",\"name\":\"EARTH GLOBE AMERICAS\",\"short_names\":[\"earth_americas\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":0},{\"unified\":\"1F30F\",\"name\":\"EARTH GLOBE ASIA-AUSTRALIA\",\"short_names\":[\"earth_asia\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":1},{\"unified\":\"1F310\",\"name\":\"GLOBE WITH MERIDIANS\",\"short_names\":[\"globe_with_meridians\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":2},{\"unified\":\"1F311\",\"name\":\"NEW MOON SYMBOL\",\"short_names\":[\"new_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":3},{\"unified\":\"1F312\",\"name\":\"WAXING CRESCENT MOON SYMBOL\",\"short_names\":[\"waxing_crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":4},{\"unified\":\"1F313\",\"name\":\"FIRST QUARTER MOON SYMBOL\",\"short_names\":[\"first_quarter_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":5},{\"unified\":\"1F314\",\"name\":\"WAXING GIBBOUS MOON SYMBOL\",\"short_names\":[\"moon\",\"waxing_gibbous_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":6},{\"unified\":\"1F315\",\"name\":\"FULL MOON SYMBOL\",\"short_names\":[\"full_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":7},{\"unified\":\"1F316\",\"name\":\"WANING GIBBOUS MOON SYMBOL\",\"short_names\":[\"waning_gibbous_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":8},{\"unified\":\"1F317\",\"name\":\"LAST QUARTER MOON SYMBOL\",\"short_names\":[\"last_quarter_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":9},{\"unified\":\"1F318\",\"name\":\"WANING CRESCENT MOON SYMBOL\",\"short_names\":[\"waning_crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":10},{\"unified\":\"1F319\",\"name\":\"CRESCENT MOON\",\"short_names\":[\"crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":11},{\"unified\":\"1F31A\",\"name\":\"NEW MOON WITH FACE\",\"short_names\":[\"new_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":12},{\"unified\":\"1F31B\",\"name\":\"FIRST QUARTER MOON WITH FACE\",\"short_names\":[\"first_quarter_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":13},{\"unified\":\"1F31C\",\"name\":\"LAST QUARTER MOON WITH FACE\",\"short_names\":[\"last_quarter_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":14},{\"unified\":\"1F31D\",\"name\":\"FULL MOON WITH FACE\",\"short_names\":[\"full_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":15},{\"unified\":\"1F31E\",\"name\":\"SUN WITH FACE\",\"short_names\":[\"sun_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":16},{\"unified\":\"1F31F\",\"name\":\"GLOWING STAR\",\"short_names\":[\"star2\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":17},{\"unified\":\"1F320\",\"name\":\"SHOOTING STAR\",\"short_names\":[\"stars\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":18},{\"unified\":\"1F321-FE0F\",\"name\":null,\"short_names\":[\"thermometer\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":19},{\"unified\":\"1F324-FE0F\",\"name\":null,\"short_names\":[\"mostly_sunny\",\"sun_small_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":20},{\"unified\":\"1F325-FE0F\",\"name\":null,\"short_names\":[\"barely_sunny\",\"sun_behind_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":21},{\"unified\":\"1F326-FE0F\",\"name\":null,\"short_names\":[\"partly_sunny_rain\",\"sun_behind_rain_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":22},{\"unified\":\"1F327-FE0F\",\"name\":null,\"short_names\":[\"rain_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":23},{\"unified\":\"1F328-FE0F\",\"name\":null,\"short_names\":[\"snow_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":24},{\"unified\":\"1F329-FE0F\",\"name\":null,\"short_names\":[\"lightning\",\"lightning_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":25},{\"unified\":\"1F32A-FE0F\",\"name\":null,\"short_names\":[\"tornado\",\"tornado_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":26},{\"unified\":\"1F32B-FE0F\",\"name\":null,\"short_names\":[\"fog\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":27},{\"unified\":\"1F32C-FE0F\",\"name\":null,\"short_names\":[\"wind_blowing_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":28},{\"unified\":\"1F32D\",\"name\":\"HOT DOG\",\"short_names\":[\"hotdog\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":29},{\"unified\":\"1F32E\",\"name\":\"TACO\",\"short_names\":[\"taco\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":30},{\"unified\":\"1F32F\",\"name\":\"BURRITO\",\"short_names\":[\"burrito\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":31},{\"unified\":\"1F330\",\"name\":\"CHESTNUT\",\"short_names\":[\"chestnut\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":32},{\"unified\":\"1F331\",\"name\":\"SEEDLING\",\"short_names\":[\"seedling\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":33},{\"unified\":\"1F332\",\"name\":\"EVERGREEN TREE\",\"short_names\":[\"evergreen_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":34},{\"unified\":\"1F333\",\"name\":\"DECIDUOUS TREE\",\"short_names\":[\"deciduous_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":35},{\"unified\":\"1F334\",\"name\":\"PALM TREE\",\"short_names\":[\"palm_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":36},{\"unified\":\"1F335\",\"name\":\"CACTUS\",\"short_names\":[\"cactus\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":37},{\"unified\":\"1F336-FE0F\",\"name\":null,\"short_names\":[\"hot_pepper\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":38},{\"unified\":\"1F337\",\"name\":\"TULIP\",\"short_names\":[\"tulip\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":39},{\"unified\":\"1F338\",\"name\":\"CHERRY BLOSSOM\",\"short_names\":[\"cherry_blossom\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":40},{\"unified\":\"1F339\",\"name\":\"ROSE\",\"short_names\":[\"rose\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":41},{\"unified\":\"1F33A\",\"name\":\"HIBISCUS\",\"short_names\":[\"hibiscus\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":42},{\"unified\":\"1F33B\",\"name\":\"SUNFLOWER\",\"short_names\":[\"sunflower\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":43},{\"unified\":\"1F33C\",\"name\":\"BLOSSOM\",\"short_names\":[\"blossom\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":44},{\"unified\":\"1F33D\",\"name\":\"EAR OF MAIZE\",\"short_names\":[\"corn\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":45},{\"unified\":\"1F33E\",\"name\":\"EAR OF RICE\",\"short_names\":[\"ear_of_rice\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":46},{\"unified\":\"1F33F\",\"name\":\"HERB\",\"short_names\":[\"herb\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":47},{\"unified\":\"1F340\",\"name\":\"FOUR LEAF CLOVER\",\"short_names\":[\"four_leaf_clover\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":48},{\"unified\":\"1F341\",\"name\":\"MAPLE LEAF\",\"short_names\":[\"maple_leaf\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":49},{\"unified\":\"1F342\",\"name\":\"FALLEN LEAF\",\"short_names\":[\"fallen_leaf\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":50},{\"unified\":\"1F343\",\"name\":\"LEAF FLUTTERING IN WIND\",\"short_names\":[\"leaves\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":51},{\"unified\":\"1F344\",\"name\":\"MUSHROOM\",\"short_names\":[\"mushroom\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":52},{\"unified\":\"1F345\",\"name\":\"TOMATO\",\"short_names\":[\"tomato\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":0},{\"unified\":\"1F346\",\"name\":\"AUBERGINE\",\"short_names\":[\"eggplant\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":1},{\"unified\":\"1F347\",\"name\":\"GRAPES\",\"short_names\":[\"grapes\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":2},{\"unified\":\"1F348\",\"name\":\"MELON\",\"short_names\":[\"melon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":3},{\"unified\":\"1F349\",\"name\":\"WATERMELON\",\"short_names\":[\"watermelon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":4},{\"unified\":\"1F34A\",\"name\":\"TANGERINE\",\"short_names\":[\"tangerine\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":5},{\"unified\":\"1F34B\",\"name\":\"LEMON\",\"short_names\":[\"lemon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":6},{\"unified\":\"1F34C\",\"name\":\"BANANA\",\"short_names\":[\"banana\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":7},{\"unified\":\"1F34D\",\"name\":\"PINEAPPLE\",\"short_names\":[\"pineapple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":8},{\"unified\":\"1F34E\",\"name\":\"RED APPLE\",\"short_names\":[\"apple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":9},{\"unified\":\"1F34F\",\"name\":\"GREEN APPLE\",\"short_names\":[\"green_apple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":10},{\"unified\":\"1F350\",\"name\":\"PEAR\",\"short_names\":[\"pear\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":11},{\"unified\":\"1F351\",\"name\":\"PEACH\",\"short_names\":[\"peach\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":12},{\"unified\":\"1F352\",\"name\":\"CHERRIES\",\"short_names\":[\"cherries\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":13},{\"unified\":\"1F353\",\"name\":\"STRAWBERRY\",\"short_names\":[\"strawberry\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":14},{\"unified\":\"1F354\",\"name\":\"HAMBURGER\",\"short_names\":[\"hamburger\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":15},{\"unified\":\"1F355\",\"name\":\"SLICE OF PIZZA\",\"short_names\":[\"pizza\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":16},{\"unified\":\"1F356\",\"name\":\"MEAT ON BONE\",\"short_names\":[\"meat_on_bone\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":17},{\"unified\":\"1F357\",\"name\":\"POULTRY LEG\",\"short_names\":[\"poultry_leg\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":18},{\"unified\":\"1F358\",\"name\":\"RICE CRACKER\",\"short_names\":[\"rice_cracker\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":19},{\"unified\":\"1F359\",\"name\":\"RICE BALL\",\"short_names\":[\"rice_ball\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":20},{\"unified\":\"1F35A\",\"name\":\"COOKED RICE\",\"short_names\":[\"rice\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":21},{\"unified\":\"1F35B\",\"name\":\"CURRY AND RICE\",\"short_names\":[\"curry\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":22},{\"unified\":\"1F35C\",\"name\":\"STEAMING BOWL\",\"short_names\":[\"ramen\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":23},{\"unified\":\"1F35D\",\"name\":\"SPAGHETTI\",\"short_names\":[\"spaghetti\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":24},{\"unified\":\"1F35E\",\"name\":\"BREAD\",\"short_names\":[\"bread\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":25},{\"unified\":\"1F35F\",\"name\":\"FRENCH FRIES\",\"short_names\":[\"fries\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":26},{\"unified\":\"1F360\",\"name\":\"ROASTED SWEET POTATO\",\"short_names\":[\"sweet_potato\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":27},{\"unified\":\"1F361\",\"name\":\"DANGO\",\"short_names\":[\"dango\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":28},{\"unified\":\"1F362\",\"name\":\"ODEN\",\"short_names\":[\"oden\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":29},{\"unified\":\"1F363\",\"name\":\"SUSHI\",\"short_names\":[\"sushi\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":30},{\"unified\":\"1F364\",\"name\":\"FRIED SHRIMP\",\"short_names\":[\"fried_shrimp\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":31},{\"unified\":\"1F365\",\"name\":\"FISH CAKE WITH SWIRL DESIGN\",\"short_names\":[\"fish_cake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":32},{\"unified\":\"1F366\",\"name\":\"SOFT ICE CREAM\",\"short_names\":[\"icecream\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":33},{\"unified\":\"1F367\",\"name\":\"SHAVED ICE\",\"short_names\":[\"shaved_ice\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":34},{\"unified\":\"1F368\",\"name\":\"ICE CREAM\",\"short_names\":[\"ice_cream\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":35},{\"unified\":\"1F369\",\"name\":\"DOUGHNUT\",\"short_names\":[\"doughnut\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":36},{\"unified\":\"1F36A\",\"name\":\"COOKIE\",\"short_names\":[\"cookie\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":37},{\"unified\":\"1F36B\",\"name\":\"CHOCOLATE BAR\",\"short_names\":[\"chocolate_bar\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":38},{\"unified\":\"1F36C\",\"name\":\"CANDY\",\"short_names\":[\"candy\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":39},{\"unified\":\"1F36D\",\"name\":\"LOLLIPOP\",\"short_names\":[\"lollipop\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":40},{\"unified\":\"1F36E\",\"name\":\"CUSTARD\",\"short_names\":[\"custard\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":41},{\"unified\":\"1F36F\",\"name\":\"HONEY POT\",\"short_names\":[\"honey_pot\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":42},{\"unified\":\"1F370\",\"name\":\"SHORTCAKE\",\"short_names\":[\"cake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":43},{\"unified\":\"1F371\",\"name\":\"BENTO BOX\",\"short_names\":[\"bento\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":44},{\"unified\":\"1F372\",\"name\":\"POT OF FOOD\",\"short_names\":[\"stew\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":45},{\"unified\":\"1F373\",\"name\":\"COOKING\",\"short_names\":[\"fried_egg\",\"cooking\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":46},{\"unified\":\"1F374\",\"name\":\"FORK AND KNIFE\",\"short_names\":[\"fork_and_knife\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":47},{\"unified\":\"1F375\",\"name\":\"TEACUP WITHOUT HANDLE\",\"short_names\":[\"tea\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":48},{\"unified\":\"1F376\",\"name\":\"SAKE BOTTLE AND CUP\",\"short_names\":[\"sake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":49},{\"unified\":\"1F377\",\"name\":\"WINE GLASS\",\"short_names\":[\"wine_glass\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":50},{\"unified\":\"1F378\",\"name\":\"COCKTAIL GLASS\",\"short_names\":[\"cocktail\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":51},{\"unified\":\"1F379\",\"name\":\"TROPICAL DRINK\",\"short_names\":[\"tropical_drink\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":52},{\"unified\":\"1F37A\",\"name\":\"BEER MUG\",\"short_names\":[\"beer\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":0},{\"unified\":\"1F37B\",\"name\":\"CLINKING BEER MUGS\",\"short_names\":[\"beers\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":1},{\"unified\":\"1F37C\",\"name\":\"BABY BOTTLE\",\"short_names\":[\"baby_bottle\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":2},{\"unified\":\"1F37D-FE0F\",\"name\":null,\"short_names\":[\"knife_fork_plate\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":3},{\"unified\":\"1F37E\",\"name\":\"BOTTLE WITH POPPING CORK\",\"short_names\":[\"champagne\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":4},{\"unified\":\"1F37F\",\"name\":\"POPCORN\",\"short_names\":[\"popcorn\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":5},{\"unified\":\"1F380\",\"name\":\"RIBBON\",\"short_names\":[\"ribbon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":6},{\"unified\":\"1F381\",\"name\":\"WRAPPED PRESENT\",\"short_names\":[\"gift\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":7},{\"unified\":\"1F382\",\"name\":\"BIRTHDAY CAKE\",\"short_names\":[\"birthday\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":8},{\"unified\":\"1F383\",\"name\":\"JACK-O-LANTERN\",\"short_names\":[\"jack_o_lantern\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":9},{\"unified\":\"1F384\",\"name\":\"CHRISTMAS TREE\",\"short_names\":[\"christmas_tree\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":10},{\"unified\":\"1F385\",\"name\":\"FATHER CHRISTMAS\",\"short_names\":[\"santa\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":11},{\"unified\":\"1F386\",\"name\":\"FIREWORKS\",\"short_names\":[\"fireworks\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":17},{\"unified\":\"1F387\",\"name\":\"FIREWORK SPARKLER\",\"short_names\":[\"sparkler\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":18},{\"unified\":\"1F388\",\"name\":\"BALLOON\",\"short_names\":[\"balloon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":19},{\"unified\":\"1F389\",\"name\":\"PARTY POPPER\",\"short_names\":[\"tada\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":20},{\"unified\":\"1F38A\",\"name\":\"CONFETTI BALL\",\"short_names\":[\"confetti_ball\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":21},{\"unified\":\"1F38B\",\"name\":\"TANABATA TREE\",\"short_names\":[\"tanabata_tree\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":22},{\"unified\":\"1F38C\",\"name\":\"CROSSED FLAGS\",\"short_names\":[\"crossed_flags\"],\"category\":\"Flags\",\"sheet_x\":8,\"sheet_y\":23},{\"unified\":\"1F38D\",\"name\":\"PINE DECORATION\",\"short_names\":[\"bamboo\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":24},{\"unified\":\"1F38E\",\"name\":\"JAPANESE DOLLS\",\"short_names\":[\"dolls\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":25},{\"unified\":\"1F38F\",\"name\":\"CARP STREAMER\",\"short_names\":[\"flags\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":26},{\"unified\":\"1F390\",\"name\":\"WIND CHIME\",\"short_names\":[\"wind_chime\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":27},{\"unified\":\"1F391\",\"name\":\"MOON VIEWING CEREMONY\",\"short_names\":[\"rice_scene\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":28},{\"unified\":\"1F392\",\"name\":\"SCHOOL SATCHEL\",\"short_names\":[\"school_satchel\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":29},{\"unified\":\"1F393\",\"name\":\"GRADUATION CAP\",\"short_names\":[\"mortar_board\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":30},{\"unified\":\"1F396-FE0F\",\"name\":null,\"short_names\":[\"medal\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":31},{\"unified\":\"1F397-FE0F\",\"name\":null,\"short_names\":[\"reminder_ribbon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":32},{\"unified\":\"1F399-FE0F\",\"name\":null,\"short_names\":[\"studio_microphone\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":33},{\"unified\":\"1F39A-FE0F\",\"name\":null,\"short_names\":[\"level_slider\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":34},{\"unified\":\"1F39B-FE0F\",\"name\":null,\"short_names\":[\"control_knobs\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":35},{\"unified\":\"1F39E-FE0F\",\"name\":null,\"short_names\":[\"film_frames\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":36},{\"unified\":\"1F39F-FE0F\",\"name\":null,\"short_names\":[\"admission_tickets\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":37},{\"unified\":\"1F3A0\",\"name\":\"CAROUSEL HORSE\",\"short_names\":[\"carousel_horse\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":38},{\"unified\":\"1F3A1\",\"name\":\"FERRIS WHEEL\",\"short_names\":[\"ferris_wheel\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":39},{\"unified\":\"1F3A2\",\"name\":\"ROLLER COASTER\",\"short_names\":[\"roller_coaster\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":40},{\"unified\":\"1F3A3\",\"name\":\"FISHING POLE AND FISH\",\"short_names\":[\"fishing_pole_and_fish\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":41},{\"unified\":\"1F3A4\",\"name\":\"MICROPHONE\",\"short_names\":[\"microphone\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":42},{\"unified\":\"1F3A5\",\"name\":\"MOVIE CAMERA\",\"short_names\":[\"movie_camera\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":43},{\"unified\":\"1F3A6\",\"name\":\"CINEMA\",\"short_names\":[\"cinema\"],\"category\":\"Symbols\",\"sheet_x\":8,\"sheet_y\":44},{\"unified\":\"1F3A7\",\"name\":\"HEADPHONE\",\"short_names\":[\"headphones\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":45},{\"unified\":\"1F3A8\",\"name\":\"ARTIST PALETTE\",\"short_names\":[\"art\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":46},{\"unified\":\"1F3A9\",\"name\":\"TOP HAT\",\"short_names\":[\"tophat\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":47},{\"unified\":\"1F3AA\",\"name\":\"CIRCUS TENT\",\"short_names\":[\"circus_tent\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":48},{\"unified\":\"1F3AB\",\"name\":\"TICKET\",\"short_names\":[\"ticket\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":49},{\"unified\":\"1F3AC\",\"name\":\"CLAPPER BOARD\",\"short_names\":[\"clapper\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":50},{\"unified\":\"1F3AD\",\"name\":\"PERFORMING ARTS\",\"short_names\":[\"performing_arts\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":51},{\"unified\":\"1F3AE\",\"name\":\"VIDEO GAME\",\"short_names\":[\"video_game\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":52},{\"unified\":\"1F3AF\",\"name\":\"DIRECT HIT\",\"short_names\":[\"dart\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":0},{\"unified\":\"1F3B0\",\"name\":\"SLOT MACHINE\",\"short_names\":[\"slot_machine\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":1},{\"unified\":\"1F3B1\",\"name\":\"BILLIARDS\",\"short_names\":[\"8ball\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":2},{\"unified\":\"1F3B2\",\"name\":\"GAME DIE\",\"short_names\":[\"game_die\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":3},{\"unified\":\"1F3B3\",\"name\":\"BOWLING\",\"short_names\":[\"bowling\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":4},{\"unified\":\"1F3B4\",\"name\":\"FLOWER PLAYING CARDS\",\"short_names\":[\"flower_playing_cards\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":5},{\"unified\":\"1F3B5\",\"name\":\"MUSICAL NOTE\",\"short_names\":[\"musical_note\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":6},{\"unified\":\"1F3B6\",\"name\":\"MULTIPLE MUSICAL NOTES\",\"short_names\":[\"notes\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":7},{\"unified\":\"1F3B7\",\"name\":\"SAXOPHONE\",\"short_names\":[\"saxophone\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":8},{\"unified\":\"1F3B8\",\"name\":\"GUITAR\",\"short_names\":[\"guitar\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":9},{\"unified\":\"1F3B9\",\"name\":\"MUSICAL KEYBOARD\",\"short_names\":[\"musical_keyboard\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":10},{\"unified\":\"1F3BA\",\"name\":\"TRUMPET\",\"short_names\":[\"trumpet\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":11},{\"unified\":\"1F3BB\",\"name\":\"VIOLIN\",\"short_names\":[\"violin\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":12},{\"unified\":\"1F3BC\",\"name\":\"MUSICAL SCORE\",\"short_names\":[\"musical_score\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":13},{\"unified\":\"1F3BD\",\"name\":\"RUNNING SHIRT WITH SASH\",\"short_names\":[\"running_shirt_with_sash\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":14},{\"unified\":\"1F3BE\",\"name\":\"TENNIS RACQUET AND BALL\",\"short_names\":[\"tennis\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":15},{\"unified\":\"1F3BF\",\"name\":\"SKI AND SKI BOOT\",\"short_names\":[\"ski\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":16},{\"unified\":\"1F3C0\",\"name\":\"BASKETBALL AND HOOP\",\"short_names\":[\"basketball\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":17},{\"unified\":\"1F3C1\",\"name\":\"CHEQUERED FLAG\",\"short_names\":[\"checkered_flag\"],\"category\":\"Flags\",\"sheet_x\":9,\"sheet_y\":18},{\"unified\":\"1F3C2\",\"name\":\"SNOWBOARDER\",\"short_names\":[\"snowboarder\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":19},{\"unified\":\"1F3C3-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":25},{\"unified\":\"1F3C3-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":31},{\"unified\":\"1F3C3\",\"name\":\"RUNNER\",\"short_names\":[\"runner\",\"running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":37},{\"unified\":\"1F3C4-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-surfing\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":43},{\"unified\":\"1F3C4-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-surfing\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":49},{\"unified\":\"1F3C4\",\"name\":\"SURFER\",\"short_names\":[\"surfer\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":2},{\"unified\":\"1F3C5\",\"name\":\"SPORTS MEDAL\",\"short_names\":[\"sports_medal\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":8},{\"unified\":\"1F3C6\",\"name\":\"TROPHY\",\"short_names\":[\"trophy\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":9},{\"unified\":\"1F3C7\",\"name\":\"HORSE RACING\",\"short_names\":[\"horse_racing\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":10},{\"unified\":\"1F3C8\",\"name\":\"AMERICAN FOOTBALL\",\"short_names\":[\"football\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":16},{\"unified\":\"1F3C9\",\"name\":\"RUGBY FOOTBALL\",\"short_names\":[\"rugby_football\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":17},{\"unified\":\"1F3CA-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-swimming\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":18},{\"unified\":\"1F3CA-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-swimming\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":24},{\"unified\":\"1F3CA\",\"name\":\"SWIMMER\",\"short_names\":[\"swimmer\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":30},{\"unified\":\"1F3CB-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-lifting-weights\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":36},{\"unified\":\"1F3CB-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-lifting-weights\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":42},{\"unified\":\"1F3CB-FE0F\",\"name\":null,\"short_names\":[\"weight_lifter\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":48},{\"unified\":\"1F3CC-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-golfing\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":1},{\"unified\":\"1F3CC-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-golfing\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":7},{\"unified\":\"1F3CC-FE0F\",\"name\":null,\"short_names\":[\"golfer\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":13},{\"unified\":\"1F3CD-FE0F\",\"name\":null,\"short_names\":[\"racing_motorcycle\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":19},{\"unified\":\"1F3CE-FE0F\",\"name\":null,\"short_names\":[\"racing_car\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":20},{\"unified\":\"1F3CF\",\"name\":\"CRICKET BAT AND BALL\",\"short_names\":[\"cricket_bat_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":21},{\"unified\":\"1F3D0\",\"name\":\"VOLLEYBALL\",\"short_names\":[\"volleyball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":22},{\"unified\":\"1F3D1\",\"name\":\"FIELD HOCKEY STICK AND BALL\",\"short_names\":[\"field_hockey_stick_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":23},{\"unified\":\"1F3D2\",\"name\":\"ICE HOCKEY STICK AND PUCK\",\"short_names\":[\"ice_hockey_stick_and_puck\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":24},{\"unified\":\"1F3D3\",\"name\":\"TABLE TENNIS PADDLE AND BALL\",\"short_names\":[\"table_tennis_paddle_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":25},{\"unified\":\"1F3D4-FE0F\",\"name\":null,\"short_names\":[\"snow_capped_mountain\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":26},{\"unified\":\"1F3D5-FE0F\",\"name\":null,\"short_names\":[\"camping\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":27},{\"unified\":\"1F3D6-FE0F\",\"name\":null,\"short_names\":[\"beach_with_umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":28},{\"unified\":\"1F3D7-FE0F\",\"name\":null,\"short_names\":[\"building_construction\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":29},{\"unified\":\"1F3D8-FE0F\",\"name\":null,\"short_names\":[\"house_buildings\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":30},{\"unified\":\"1F3D9-FE0F\",\"name\":null,\"short_names\":[\"cityscape\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":31},{\"unified\":\"1F3DA-FE0F\",\"name\":null,\"short_names\":[\"derelict_house_building\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":32},{\"unified\":\"1F3DB-FE0F\",\"name\":null,\"short_names\":[\"classical_building\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":33},{\"unified\":\"1F3DC-FE0F\",\"name\":null,\"short_names\":[\"desert\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":34},{\"unified\":\"1F3DD-FE0F\",\"name\":null,\"short_names\":[\"desert_island\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":35},{\"unified\":\"1F3DE-FE0F\",\"name\":null,\"short_names\":[\"national_park\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":36},{\"unified\":\"1F3DF-FE0F\",\"name\":null,\"short_names\":[\"stadium\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":37},{\"unified\":\"1F3E0\",\"name\":\"HOUSE BUILDING\",\"short_names\":[\"house\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":38},{\"unified\":\"1F3E1\",\"name\":\"HOUSE WITH GARDEN\",\"short_names\":[\"house_with_garden\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":39},{\"unified\":\"1F3E2\",\"name\":\"OFFICE BUILDING\",\"short_names\":[\"office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":40},{\"unified\":\"1F3E3\",\"name\":\"JAPANESE POST OFFICE\",\"short_names\":[\"post_office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":41},{\"unified\":\"1F3E4\",\"name\":\"EUROPEAN POST OFFICE\",\"short_names\":[\"european_post_office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":42},{\"unified\":\"1F3E5\",\"name\":\"HOSPITAL\",\"short_names\":[\"hospital\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":43},{\"unified\":\"1F3E6\",\"name\":\"BANK\",\"short_names\":[\"bank\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":44},{\"unified\":\"1F3E7\",\"name\":\"AUTOMATED TELLER MACHINE\",\"short_names\":[\"atm\"],\"category\":\"Symbols\",\"sheet_x\":11,\"sheet_y\":45},{\"unified\":\"1F3E8\",\"name\":\"HOTEL\",\"short_names\":[\"hotel\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":46},{\"unified\":\"1F3E9\",\"name\":\"LOVE HOTEL\",\"short_names\":[\"love_hotel\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":47},{\"unified\":\"1F3EA\",\"name\":\"CONVENIENCE STORE\",\"short_names\":[\"convenience_store\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":48},{\"unified\":\"1F3EB\",\"name\":\"SCHOOL\",\"short_names\":[\"school\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":49},{\"unified\":\"1F3EC\",\"name\":\"DEPARTMENT STORE\",\"short_names\":[\"department_store\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":50},{\"unified\":\"1F3ED\",\"name\":\"FACTORY\",\"short_names\":[\"factory\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":51},{\"unified\":\"1F3EE\",\"name\":\"IZAKAYA LANTERN\",\"short_names\":[\"izakaya_lantern\",\"lantern\"],\"category\":\"Objects\",\"sheet_x\":11,\"sheet_y\":52},{\"unified\":\"1F3EF\",\"name\":\"JAPANESE CASTLE\",\"short_names\":[\"japanese_castle\"],\"category\":\"Travel & Places\",\"sheet_x\":12,\"sheet_y\":0},{\"unified\":\"1F3F0\",\"name\":\"EUROPEAN CASTLE\",\"short_names\":[\"european_castle\"],\"category\":\"Travel & Places\",\"sheet_x\":12,\"sheet_y\":1},{\"unified\":\"1F3F3-FE0F-200D-1F308\",\"name\":null,\"short_names\":[\"rainbow-flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":2},{\"unified\":\"1F3F3-FE0F\",\"name\":null,\"short_names\":[\"waving_white_flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":3},{\"unified\":\"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\"name\":\"England Flag\",\"short_names\":[\"flag-england\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":5},{\"unified\":\"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\"name\":\"Scotland Flag\",\"short_names\":[\"flag-scotland\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":6},{\"unified\":\"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\"name\":\"Wales Flag\",\"short_names\":[\"flag-wales\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":7},{\"unified\":\"1F3F4\",\"name\":\"WAVING BLACK FLAG\",\"short_names\":[\"waving_black_flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":8},{\"unified\":\"1F3F5-FE0F\",\"name\":null,\"short_names\":[\"rosette\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":9},{\"unified\":\"1F3F7-FE0F\",\"name\":null,\"short_names\":[\"label\"],\"category\":\"Objects\",\"sheet_x\":12,\"sheet_y\":10},{\"unified\":\"1F3F8\",\"name\":\"BADMINTON RACQUET AND SHUTTLECOCK\",\"short_names\":[\"badminton_racquet_and_shuttlecock\"],\"category\":\"Activities\",\"sheet_x\":12,\"sheet_y\":11},{\"unified\":\"1F3F9\",\"name\":\"BOW AND ARROW\",\"short_names\":[\"bow_and_arrow\"],\"category\":\"Objects\",\"sheet_x\":12,\"sheet_y\":12},{\"unified\":\"1F3FA\",\"name\":\"AMPHORA\",\"short_names\":[\"amphora\"],\"category\":\"Food & Drink\",\"sheet_x\":12,\"sheet_y\":13},{\"unified\":\"1F3FB\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-1-2\",\"short_names\":[\"skin-tone-2\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":14},{\"unified\":\"1F3FC\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-3\",\"short_names\":[\"skin-tone-3\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":15},{\"unified\":\"1F3FD\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-4\",\"short_names\":[\"skin-tone-4\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":16},{\"unified\":\"1F3FE\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-5\",\"short_names\":[\"skin-tone-5\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":17},{\"unified\":\"1F3FF\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-6\",\"short_names\":[\"skin-tone-6\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":18},{\"unified\":\"1F400\",\"name\":\"RAT\",\"short_names\":[\"rat\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":19},{\"unified\":\"1F401\",\"name\":\"MOUSE\",\"short_names\":[\"mouse2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":20},{\"unified\":\"1F402\",\"name\":\"OX\",\"short_names\":[\"ox\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":21},{\"unified\":\"1F403\",\"name\":\"WATER BUFFALO\",\"short_names\":[\"water_buffalo\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":22},{\"unified\":\"1F404\",\"name\":\"COW\",\"short_names\":[\"cow2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":23},{\"unified\":\"1F405\",\"name\":\"TIGER\",\"short_names\":[\"tiger2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":24},{\"unified\":\"1F406\",\"name\":\"LEOPARD\",\"short_names\":[\"leopard\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":25},{\"unified\":\"1F407\",\"name\":\"RABBIT\",\"short_names\":[\"rabbit2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":26},{\"unified\":\"1F408\",\"name\":\"CAT\",\"short_names\":[\"cat2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":27},{\"unified\":\"1F409\",\"name\":\"DRAGON\",\"short_names\":[\"dragon\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":28},{\"unified\":\"1F40A\",\"name\":\"CROCODILE\",\"short_names\":[\"crocodile\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":29},{\"unified\":\"1F40B\",\"name\":\"WHALE\",\"short_names\":[\"whale2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":30},{\"unified\":\"1F40C\",\"name\":\"SNAIL\",\"short_names\":[\"snail\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":31},{\"unified\":\"1F40D\",\"name\":\"SNAKE\",\"short_names\":[\"snake\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":32},{\"unified\":\"1F40E\",\"name\":\"HORSE\",\"short_names\":[\"racehorse\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":33},{\"unified\":\"1F40F\",\"name\":\"RAM\",\"short_names\":[\"ram\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":34},{\"unified\":\"1F410\",\"name\":\"GOAT\",\"short_names\":[\"goat\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":35},{\"unified\":\"1F411\",\"name\":\"SHEEP\",\"short_names\":[\"sheep\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":36},{\"unified\":\"1F412\",\"name\":\"MONKEY\",\"short_names\":[\"monkey\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":37},{\"unified\":\"1F413\",\"name\":\"ROOSTER\",\"short_names\":[\"rooster\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":38},{\"unified\":\"1F414\",\"name\":\"CHICKEN\",\"short_names\":[\"chicken\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":39},{\"unified\":\"1F415\",\"name\":\"DOG\",\"short_names\":[\"dog2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":40},{\"unified\":\"1F416\",\"name\":\"PIG\",\"short_names\":[\"pig2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":41},{\"unified\":\"1F417\",\"name\":\"BOAR\",\"short_names\":[\"boar\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":42},{\"unified\":\"1F418\",\"name\":\"ELEPHANT\",\"short_names\":[\"elephant\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":43},{\"unified\":\"1F419\",\"name\":\"OCTOPUS\",\"short_names\":[\"octopus\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":44},{\"unified\":\"1F41A\",\"name\":\"SPIRAL SHELL\",\"short_names\":[\"shell\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":45},{\"unified\":\"1F41B\",\"name\":\"BUG\",\"short_names\":[\"bug\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":46},{\"unified\":\"1F41C\",\"name\":\"ANT\",\"short_names\":[\"ant\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":47},{\"unified\":\"1F41D\",\"name\":\"HONEYBEE\",\"short_names\":[\"bee\",\"honeybee\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":48},{\"unified\":\"1F41E\",\"name\":\"LADY BEETLE\",\"short_names\":[\"beetle\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":49},{\"unified\":\"1F41F\",\"name\":\"FISH\",\"short_names\":[\"fish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":50},{\"unified\":\"1F420\",\"name\":\"TROPICAL FISH\",\"short_names\":[\"tropical_fish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":51},{\"unified\":\"1F421\",\"name\":\"BLOWFISH\",\"short_names\":[\"blowfish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":52},{\"unified\":\"1F422\",\"name\":\"TURTLE\",\"short_names\":[\"turtle\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":0},{\"unified\":\"1F423\",\"name\":\"HATCHING CHICK\",\"short_names\":[\"hatching_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":1},{\"unified\":\"1F424\",\"name\":\"BABY CHICK\",\"short_names\":[\"baby_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":2},{\"unified\":\"1F425\",\"name\":\"FRONT-FACING BABY CHICK\",\"short_names\":[\"hatched_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":3},{\"unified\":\"1F426\",\"name\":\"BIRD\",\"short_names\":[\"bird\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":4},{\"unified\":\"1F427\",\"name\":\"PENGUIN\",\"short_names\":[\"penguin\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":5},{\"unified\":\"1F428\",\"name\":\"KOALA\",\"short_names\":[\"koala\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":6},{\"unified\":\"1F429\",\"name\":\"POODLE\",\"short_names\":[\"poodle\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":7},{\"unified\":\"1F42A\",\"name\":\"DROMEDARY CAMEL\",\"short_names\":[\"dromedary_camel\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":8},{\"unified\":\"1F42B\",\"name\":\"BACTRIAN CAMEL\",\"short_names\":[\"camel\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":9},{\"unified\":\"1F42C\",\"name\":\"DOLPHIN\",\"short_names\":[\"dolphin\",\"flipper\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":10},{\"unified\":\"1F42D\",\"name\":\"MOUSE FACE\",\"short_names\":[\"mouse\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":11},{\"unified\":\"1F42E\",\"name\":\"COW FACE\",\"short_names\":[\"cow\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":12},{\"unified\":\"1F42F\",\"name\":\"TIGER FACE\",\"short_names\":[\"tiger\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":13},{\"unified\":\"1F430\",\"name\":\"RABBIT FACE\",\"short_names\":[\"rabbit\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":14},{\"unified\":\"1F431\",\"name\":\"CAT FACE\",\"short_names\":[\"cat\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":15},{\"unified\":\"1F432\",\"name\":\"DRAGON FACE\",\"short_names\":[\"dragon_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":16},{\"unified\":\"1F433\",\"name\":\"SPOUTING WHALE\",\"short_names\":[\"whale\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":17},{\"unified\":\"1F434\",\"name\":\"HORSE FACE\",\"short_names\":[\"horse\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":18},{\"unified\":\"1F435\",\"name\":\"MONKEY FACE\",\"short_names\":[\"monkey_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":19},{\"unified\":\"1F436\",\"name\":\"DOG FACE\",\"short_names\":[\"dog\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":20},{\"unified\":\"1F437\",\"name\":\"PIG FACE\",\"short_names\":[\"pig\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":21},{\"unified\":\"1F438\",\"name\":\"FROG FACE\",\"short_names\":[\"frog\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":22},{\"unified\":\"1F439\",\"name\":\"HAMSTER FACE\",\"short_names\":[\"hamster\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":23},{\"unified\":\"1F43A\",\"name\":\"WOLF FACE\",\"short_names\":[\"wolf\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":24},{\"unified\":\"1F43B\",\"name\":\"BEAR FACE\",\"short_names\":[\"bear\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":25},{\"unified\":\"1F43C\",\"name\":\"PANDA FACE\",\"short_names\":[\"panda_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":26},{\"unified\":\"1F43D\",\"name\":\"PIG NOSE\",\"short_names\":[\"pig_nose\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":27},{\"unified\":\"1F43E\",\"name\":\"PAW PRINTS\",\"short_names\":[\"feet\",\"paw_prints\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":28},{\"unified\":\"1F43F-FE0F\",\"name\":null,\"short_names\":[\"chipmunk\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":29},{\"unified\":\"1F440\",\"name\":\"EYES\",\"short_names\":[\"eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":30},{\"unified\":\"1F441-FE0F-200D-1F5E8-FE0F\",\"name\":null,\"short_names\":[\"eye-in-speech-bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":31},{\"unified\":\"1F441-FE0F\",\"name\":null,\"short_names\":[\"eye\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":32},{\"unified\":\"1F442\",\"name\":\"EAR\",\"short_names\":[\"ear\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":33},{\"unified\":\"1F443\",\"name\":\"NOSE\",\"short_names\":[\"nose\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":39},{\"unified\":\"1F444\",\"name\":\"MOUTH\",\"short_names\":[\"lips\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":45},{\"unified\":\"1F445\",\"name\":\"TONGUE\",\"short_names\":[\"tongue\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":46},{\"unified\":\"1F446\",\"name\":\"WHITE UP POINTING BACKHAND INDEX\",\"short_names\":[\"point_up_2\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":47},{\"unified\":\"1F447\",\"name\":\"WHITE DOWN POINTING BACKHAND INDEX\",\"short_names\":[\"point_down\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":0},{\"unified\":\"1F448\",\"name\":\"WHITE LEFT POINTING BACKHAND INDEX\",\"short_names\":[\"point_left\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":6},{\"unified\":\"1F449\",\"name\":\"WHITE RIGHT POINTING BACKHAND INDEX\",\"short_names\":[\"point_right\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":12},{\"unified\":\"1F44A\",\"name\":\"FISTED HAND SIGN\",\"short_names\":[\"facepunch\",\"punch\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":18},{\"unified\":\"1F44B\",\"name\":\"WAVING HAND SIGN\",\"short_names\":[\"wave\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":24},{\"unified\":\"1F44C\",\"name\":\"OK HAND SIGN\",\"short_names\":[\"ok_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":30},{\"unified\":\"1F44D\",\"name\":\"THUMBS UP SIGN\",\"short_names\":[\"+1\",\"thumbsup\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":36},{\"unified\":\"1F44E\",\"name\":\"THUMBS DOWN SIGN\",\"short_names\":[\"-1\",\"thumbsdown\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":42},{\"unified\":\"1F44F\",\"name\":\"CLAPPING HANDS SIGN\",\"short_names\":[\"clap\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":48},{\"unified\":\"1F450\",\"name\":\"OPEN HANDS SIGN\",\"short_names\":[\"open_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":1},{\"unified\":\"1F451\",\"name\":\"CROWN\",\"short_names\":[\"crown\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":7},{\"unified\":\"1F452\",\"name\":\"WOMANS HAT\",\"short_names\":[\"womans_hat\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":8},{\"unified\":\"1F453\",\"name\":\"EYEGLASSES\",\"short_names\":[\"eyeglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":9},{\"unified\":\"1F454\",\"name\":\"NECKTIE\",\"short_names\":[\"necktie\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":10},{\"unified\":\"1F455\",\"name\":\"T-SHIRT\",\"short_names\":[\"shirt\",\"tshirt\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":11},{\"unified\":\"1F456\",\"name\":\"JEANS\",\"short_names\":[\"jeans\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":12},{\"unified\":\"1F457\",\"name\":\"DRESS\",\"short_names\":[\"dress\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":13},{\"unified\":\"1F458\",\"name\":\"KIMONO\",\"short_names\":[\"kimono\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":14},{\"unified\":\"1F459\",\"name\":\"BIKINI\",\"short_names\":[\"bikini\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":15},{\"unified\":\"1F45A\",\"name\":\"WOMANS CLOTHES\",\"short_names\":[\"womans_clothes\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":16},{\"unified\":\"1F45B\",\"name\":\"PURSE\",\"short_names\":[\"purse\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":17},{\"unified\":\"1F45C\",\"name\":\"HANDBAG\",\"short_names\":[\"handbag\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":18},{\"unified\":\"1F45D\",\"name\":\"POUCH\",\"short_names\":[\"pouch\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":19},{\"unified\":\"1F45E\",\"name\":\"MANS SHOE\",\"short_names\":[\"mans_shoe\",\"shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":20},{\"unified\":\"1F45F\",\"name\":\"ATHLETIC SHOE\",\"short_names\":[\"athletic_shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":21},{\"unified\":\"1F460\",\"name\":\"HIGH-HEELED SHOE\",\"short_names\":[\"high_heel\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":22},{\"unified\":\"1F461\",\"name\":\"WOMANS SANDAL\",\"short_names\":[\"sandal\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":23},{\"unified\":\"1F462\",\"name\":\"WOMANS BOOTS\",\"short_names\":[\"boot\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":24},{\"unified\":\"1F463\",\"name\":\"FOOTPRINTS\",\"short_names\":[\"footprints\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":25},{\"unified\":\"1F464\",\"name\":\"BUST IN SILHOUETTE\",\"short_names\":[\"bust_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":26},{\"unified\":\"1F465\",\"name\":\"BUSTS IN SILHOUETTE\",\"short_names\":[\"busts_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":27},{\"unified\":\"1F466\",\"name\":\"BOY\",\"short_names\":[\"boy\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":28},{\"unified\":\"1F467\",\"name\":\"GIRL\",\"short_names\":[\"girl\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":34},{\"unified\":\"1F468-200D-1F33E\",\"name\":null,\"short_names\":[\"male-farmer\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":40},{\"unified\":\"1F468-200D-1F373\",\"name\":null,\"short_names\":[\"male-cook\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":46},{\"unified\":\"1F468-200D-1F393\",\"name\":null,\"short_names\":[\"male-student\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":52},{\"unified\":\"1F468-200D-1F3A4\",\"name\":null,\"short_names\":[\"male-singer\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":5},{\"unified\":\"1F468-200D-1F3A8\",\"name\":null,\"short_names\":[\"male-artist\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":11},{\"unified\":\"1F468-200D-1F3EB\",\"name\":null,\"short_names\":[\"male-teacher\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":17},{\"unified\":\"1F468-200D-1F3ED\",\"name\":null,\"short_names\":[\"male-factory-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":23},{\"unified\":\"1F468-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":29},{\"unified\":\"1F468-200D-1F466\",\"name\":null,\"short_names\":[\"man-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":30},{\"unified\":\"1F468-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":31},{\"unified\":\"1F468-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":32},{\"unified\":\"1F468-200D-1F467\",\"name\":null,\"short_names\":[\"man-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":33},{\"unified\":\"1F468-200D-1F468-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":34},{\"unified\":\"1F468-200D-1F468-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":35},{\"unified\":\"1F468-200D-1F468-200D-1F467\",\"name\":null,\"short_names\":[\"man-man-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":36},{\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":37},{\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-man-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":38},{\"unified\":\"1F468-200D-1F469-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-boy\",\"family\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":39},{\"unified\":\"1F468-200D-1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":40},{\"unified\":\"1F468-200D-1F469-200D-1F467\",\"name\":null,\"short_names\":[\"man-woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":41},{\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":42},{\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":43},{\"unified\":\"1F468-200D-1F4BB\",\"name\":null,\"short_names\":[\"male-technologist\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":44},{\"unified\":\"1F468-200D-1F4BC\",\"name\":null,\"short_names\":[\"male-office-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":50},{\"unified\":\"1F468-200D-1F527\",\"name\":null,\"short_names\":[\"male-mechanic\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":3},{\"unified\":\"1F468-200D-1F52C\",\"name\":null,\"short_names\":[\"male-scientist\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":9},{\"unified\":\"1F468-200D-1F680\",\"name\":null,\"short_names\":[\"male-astronaut\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":15},{\"unified\":\"1F468-200D-1F692\",\"name\":null,\"short_names\":[\"male-firefighter\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":21},{\"unified\":\"1F468-200D-2695-FE0F\",\"name\":null,\"short_names\":[\"male-doctor\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":51},{\"unified\":\"1F468-200D-2696-FE0F\",\"name\":null,\"short_names\":[\"male-judge\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":4},{\"unified\":\"1F468-200D-2708-FE0F\",\"name\":null,\"short_names\":[\"male-pilot\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":10},{\"unified\":\"1F468-200D-2764-FE0F-200D-1F468\",\"name\":null,\"short_names\":[\"man-heart-man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":16},{\"unified\":\"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\"name\":null,\"short_names\":[\"man-kiss-man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":17},{\"unified\":\"1F468\",\"name\":\"MAN\",\"short_names\":[\"man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":18},{\"unified\":\"1F469-200D-1F33E\",\"name\":null,\"short_names\":[\"female-farmer\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":24},{\"unified\":\"1F469-200D-1F373\",\"name\":null,\"short_names\":[\"female-cook\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":30},{\"unified\":\"1F469-200D-1F393\",\"name\":null,\"short_names\":[\"female-student\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":36},{\"unified\":\"1F469-200D-1F3A4\",\"name\":null,\"short_names\":[\"female-singer\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":42},{\"unified\":\"1F469-200D-1F3A8\",\"name\":null,\"short_names\":[\"female-artist\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":48},{\"unified\":\"1F469-200D-1F3EB\",\"name\":null,\"short_names\":[\"female-teacher\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":1},{\"unified\":\"1F469-200D-1F3ED\",\"name\":null,\"short_names\":[\"female-factory-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":7},{\"unified\":\"1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":13},{\"unified\":\"1F469-200D-1F466\",\"name\":null,\"short_names\":[\"woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":14},{\"unified\":\"1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":15},{\"unified\":\"1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":16},{\"unified\":\"1F469-200D-1F467\",\"name\":null,\"short_names\":[\"woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":17},{\"unified\":\"1F469-200D-1F469-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":18},{\"unified\":\"1F469-200D-1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":19},{\"unified\":\"1F469-200D-1F469-200D-1F467\",\"name\":null,\"short_names\":[\"woman-woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":20},{\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":21},{\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"woman-woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":22},{\"unified\":\"1F469-200D-1F4BB\",\"name\":null,\"short_names\":[\"female-technologist\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":23},{\"unified\":\"1F469-200D-1F4BC\",\"name\":null,\"short_names\":[\"female-office-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":29},{\"unified\":\"1F469-200D-1F527\",\"name\":null,\"short_names\":[\"female-mechanic\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":35},{\"unified\":\"1F469-200D-1F52C\",\"name\":null,\"short_names\":[\"female-scientist\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":41},{\"unified\":\"1F469-200D-1F680\",\"name\":null,\"short_names\":[\"female-astronaut\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":47},{\"unified\":\"1F469-200D-1F692\",\"name\":null,\"short_names\":[\"female-firefighter\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":0},{\"unified\":\"1F469-200D-2695-FE0F\",\"name\":null,\"short_names\":[\"female-doctor\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":30},{\"unified\":\"1F469-200D-2696-FE0F\",\"name\":null,\"short_names\":[\"female-judge\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":36},{\"unified\":\"1F469-200D-2708-FE0F\",\"name\":null,\"short_names\":[\"female-pilot\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":42},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F468\",\"name\":null,\"short_names\":[\"woman-heart-man\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":48},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F469\",\"name\":null,\"short_names\":[\"woman-heart-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":49},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\"name\":null,\"short_names\":[\"woman-kiss-man\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":50},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\"name\":null,\"short_names\":[\"woman-kiss-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":51},{\"unified\":\"1F469\",\"name\":\"WOMAN\",\"short_names\":[\"woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":52},{\"unified\":\"1F46A\",\"name\":\"FAMILY\",\"short_names\":[\"family\",\"man-woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":5},{\"unified\":\"1F46B\",\"name\":\"MAN AND WOMAN HOLDING HANDS\",\"short_names\":[\"couple\",\"man_and_woman_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":6},{\"unified\":\"1F46C\",\"name\":\"TWO MEN HOLDING HANDS\",\"short_names\":[\"two_men_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":7},{\"unified\":\"1F46D\",\"name\":\"TWO WOMEN HOLDING HANDS\",\"short_names\":[\"two_women_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":8},{\"unified\":\"1F46E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-police-officer\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":9},{\"unified\":\"1F46E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-police-officer\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":15},{\"unified\":\"1F46E\",\"name\":\"POLICE OFFICER\",\"short_names\":[\"cop\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":21},{\"unified\":\"1F46F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-with-bunny-ears-partying\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":27},{\"unified\":\"1F46F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-with-bunny-ears-partying\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":28},{\"unified\":\"1F46F\",\"name\":\"WOMAN WITH BUNNY EARS\",\"short_names\":[\"dancers\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":29},{\"unified\":\"1F470\",\"name\":\"BRIDE WITH VEIL\",\"short_names\":[\"bride_with_veil\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":30},{\"unified\":\"1F471-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"blond-haired-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":36},{\"unified\":\"1F471-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"blond-haired-man\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":42},{\"unified\":\"1F471\",\"name\":\"PERSON WITH BLOND HAIR\",\"short_names\":[\"person_with_blond_hair\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":48},{\"unified\":\"1F472\",\"name\":\"MAN WITH GUA PI MAO\",\"short_names\":[\"man_with_gua_pi_mao\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":1},{\"unified\":\"1F473-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-wearing-turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":7},{\"unified\":\"1F473-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-wearing-turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":13},{\"unified\":\"1F473\",\"name\":\"MAN WITH TURBAN\",\"short_names\":[\"man_with_turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":19},{\"unified\":\"1F474\",\"name\":\"OLDER MAN\",\"short_names\":[\"older_man\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":25},{\"unified\":\"1F475\",\"name\":\"OLDER WOMAN\",\"short_names\":[\"older_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":31},{\"unified\":\"1F476\",\"name\":\"BABY\",\"short_names\":[\"baby\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":37},{\"unified\":\"1F477-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-construction-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":43},{\"unified\":\"1F477-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-construction-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":49},{\"unified\":\"1F477\",\"name\":\"CONSTRUCTION WORKER\",\"short_names\":[\"construction_worker\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":2},{\"unified\":\"1F478\",\"name\":\"PRINCESS\",\"short_names\":[\"princess\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":8},{\"unified\":\"1F479\",\"name\":\"JAPANESE OGRE\",\"short_names\":[\"japanese_ogre\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":14},{\"unified\":\"1F47A\",\"name\":\"JAPANESE GOBLIN\",\"short_names\":[\"japanese_goblin\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":15},{\"unified\":\"1F47B\",\"name\":\"GHOST\",\"short_names\":[\"ghost\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":16},{\"unified\":\"1F47C\",\"name\":\"BABY ANGEL\",\"short_names\":[\"angel\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":17},{\"unified\":\"1F47D\",\"name\":\"EXTRATERRESTRIAL ALIEN\",\"short_names\":[\"alien\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":23},{\"unified\":\"1F47E\",\"name\":\"ALIEN MONSTER\",\"short_names\":[\"space_invader\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":24},{\"unified\":\"1F47F\",\"name\":\"IMP\",\"short_names\":[\"imp\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":25},{\"unified\":\"1F480\",\"name\":\"SKULL\",\"short_names\":[\"skull\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":26},{\"unified\":\"1F481-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-tipping-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":27},{\"unified\":\"1F481-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-tipping-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":33},{\"unified\":\"1F481\",\"name\":\"INFORMATION DESK PERSON\",\"short_names\":[\"information_desk_person\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":39},{\"unified\":\"1F482-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-guard\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":45},{\"unified\":\"1F482-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-guard\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":51},{\"unified\":\"1F482\",\"name\":\"GUARDSMAN\",\"short_names\":[\"guardsman\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":4},{\"unified\":\"1F483\",\"name\":\"DANCER\",\"short_names\":[\"dancer\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":10},{\"unified\":\"1F484\",\"name\":\"LIPSTICK\",\"short_names\":[\"lipstick\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":16},{\"unified\":\"1F485\",\"name\":\"NAIL POLISH\",\"short_names\":[\"nail_care\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":17},{\"unified\":\"1F486-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-getting-massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":23},{\"unified\":\"1F486-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-getting-massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":29},{\"unified\":\"1F486\",\"name\":\"FACE MASSAGE\",\"short_names\":[\"massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":35},{\"unified\":\"1F487-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-getting-haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":41},{\"unified\":\"1F487-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-getting-haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":47},{\"unified\":\"1F487\",\"name\":\"HAIRCUT\",\"short_names\":[\"haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":0},{\"unified\":\"1F488\",\"name\":\"BARBER POLE\",\"short_names\":[\"barber\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":6},{\"unified\":\"1F489\",\"name\":\"SYRINGE\",\"short_names\":[\"syringe\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":7},{\"unified\":\"1F48A\",\"name\":\"PILL\",\"short_names\":[\"pill\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":8},{\"unified\":\"1F48B\",\"name\":\"KISS MARK\",\"short_names\":[\"kiss\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":9},{\"unified\":\"1F48C\",\"name\":\"LOVE LETTER\",\"short_names\":[\"love_letter\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":10},{\"unified\":\"1F48D\",\"name\":\"RING\",\"short_names\":[\"ring\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":11},{\"unified\":\"1F48E\",\"name\":\"GEM STONE\",\"short_names\":[\"gem\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":12},{\"unified\":\"1F48F\",\"name\":\"KISS\",\"short_names\":[\"couplekiss\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":13},{\"unified\":\"1F490\",\"name\":\"BOUQUET\",\"short_names\":[\"bouquet\"],\"category\":\"Animals & Nature\",\"sheet_x\":25,\"sheet_y\":14},{\"unified\":\"1F491\",\"name\":\"COUPLE WITH HEART\",\"short_names\":[\"couple_with_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":15},{\"unified\":\"1F492\",\"name\":\"WEDDING\",\"short_names\":[\"wedding\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":16},{\"unified\":\"1F493\",\"name\":\"BEATING HEART\",\"short_names\":[\"heartbeat\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":17},{\"unified\":\"1F494\",\"name\":\"BROKEN HEART\",\"short_names\":[\"broken_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":18},{\"unified\":\"1F495\",\"name\":\"TWO HEARTS\",\"short_names\":[\"two_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":19},{\"unified\":\"1F496\",\"name\":\"SPARKLING HEART\",\"short_names\":[\"sparkling_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":20},{\"unified\":\"1F497\",\"name\":\"GROWING HEART\",\"short_names\":[\"heartpulse\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":21},{\"unified\":\"1F498\",\"name\":\"HEART WITH ARROW\",\"short_names\":[\"cupid\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":22},{\"unified\":\"1F499\",\"name\":\"BLUE HEART\",\"short_names\":[\"blue_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":23},{\"unified\":\"1F49A\",\"name\":\"GREEN HEART\",\"short_names\":[\"green_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":24},{\"unified\":\"1F49B\",\"name\":\"YELLOW HEART\",\"short_names\":[\"yellow_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":25},{\"unified\":\"1F49C\",\"name\":\"PURPLE HEART\",\"short_names\":[\"purple_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":26},{\"unified\":\"1F49D\",\"name\":\"HEART WITH RIBBON\",\"short_names\":[\"gift_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":27},{\"unified\":\"1F49E\",\"name\":\"REVOLVING HEARTS\",\"short_names\":[\"revolving_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":28},{\"unified\":\"1F49F\",\"name\":\"HEART DECORATION\",\"short_names\":[\"heart_decoration\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":29},{\"unified\":\"1F4A0\",\"name\":\"DIAMOND SHAPE WITH A DOT INSIDE\",\"short_names\":[\"diamond_shape_with_a_dot_inside\"],\"category\":\"Symbols\",\"sheet_x\":25,\"sheet_y\":30},{\"unified\":\"1F4A1\",\"name\":\"ELECTRIC LIGHT BULB\",\"short_names\":[\"bulb\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":31},{\"unified\":\"1F4A2\",\"name\":\"ANGER SYMBOL\",\"short_names\":[\"anger\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":32},{\"unified\":\"1F4A3\",\"name\":\"BOMB\",\"short_names\":[\"bomb\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":33},{\"unified\":\"1F4A4\",\"name\":\"SLEEPING SYMBOL\",\"short_names\":[\"zzz\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":34},{\"unified\":\"1F4A5\",\"name\":\"COLLISION SYMBOL\",\"short_names\":[\"boom\",\"collision\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":35},{\"unified\":\"1F4A6\",\"name\":\"SPLASHING SWEAT SYMBOL\",\"short_names\":[\"sweat_drops\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":36},{\"unified\":\"1F4A7\",\"name\":\"DROPLET\",\"short_names\":[\"droplet\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":37},{\"unified\":\"1F4A8\",\"name\":\"DASH SYMBOL\",\"short_names\":[\"dash\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":38},{\"unified\":\"1F4A9\",\"name\":\"PILE OF POO\",\"short_names\":[\"hankey\",\"poop\",\"shit\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":39},{\"unified\":\"1F4AA\",\"name\":\"FLEXED BICEPS\",\"short_names\":[\"muscle\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":40},{\"unified\":\"1F4AB\",\"name\":\"DIZZY SYMBOL\",\"short_names\":[\"dizzy\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":46},{\"unified\":\"1F4AC\",\"name\":\"SPEECH BALLOON\",\"short_names\":[\"speech_balloon\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":47},{\"unified\":\"1F4AD\",\"name\":\"THOUGHT BALLOON\",\"short_names\":[\"thought_balloon\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":48},{\"unified\":\"1F4AE\",\"name\":\"WHITE FLOWER\",\"short_names\":[\"white_flower\"],\"category\":\"Animals & Nature\",\"sheet_x\":25,\"sheet_y\":49},{\"unified\":\"1F4AF\",\"name\":\"HUNDRED POINTS SYMBOL\",\"short_names\":[\"100\"],\"category\":\"Symbols\",\"sheet_x\":25,\"sheet_y\":50},{\"unified\":\"1F4B0\",\"name\":\"MONEY BAG\",\"short_names\":[\"moneybag\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":51},{\"unified\":\"1F4B1\",\"name\":\"CURRENCY EXCHANGE\",\"short_names\":[\"currency_exchange\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":52},{\"unified\":\"1F4B2\",\"name\":\"HEAVY DOLLAR SIGN\",\"short_names\":[\"heavy_dollar_sign\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":0},{\"unified\":\"1F4B3\",\"name\":\"CREDIT CARD\",\"short_names\":[\"credit_card\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":1},{\"unified\":\"1F4B4\",\"name\":\"BANKNOTE WITH YEN SIGN\",\"short_names\":[\"yen\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":2},{\"unified\":\"1F4B5\",\"name\":\"BANKNOTE WITH DOLLAR SIGN\",\"short_names\":[\"dollar\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":3},{\"unified\":\"1F4B6\",\"name\":\"BANKNOTE WITH EURO SIGN\",\"short_names\":[\"euro\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":4},{\"unified\":\"1F4B7\",\"name\":\"BANKNOTE WITH POUND SIGN\",\"short_names\":[\"pound\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":5},{\"unified\":\"1F4B8\",\"name\":\"MONEY WITH WINGS\",\"short_names\":[\"money_with_wings\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":6},{\"unified\":\"1F4B9\",\"name\":\"CHART WITH UPWARDS TREND AND YEN SIGN\",\"short_names\":[\"chart\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":7},{\"unified\":\"1F4BA\",\"name\":\"SEAT\",\"short_names\":[\"seat\"],\"category\":\"Travel & Places\",\"sheet_x\":26,\"sheet_y\":8},{\"unified\":\"1F4BB\",\"name\":\"PERSONAL COMPUTER\",\"short_names\":[\"computer\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":9},{\"unified\":\"1F4BC\",\"name\":\"BRIEFCASE\",\"short_names\":[\"briefcase\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":10},{\"unified\":\"1F4BD\",\"name\":\"MINIDISC\",\"short_names\":[\"minidisc\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":11},{\"unified\":\"1F4BE\",\"name\":\"FLOPPY DISK\",\"short_names\":[\"floppy_disk\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":12},{\"unified\":\"1F4BF\",\"name\":\"OPTICAL DISC\",\"short_names\":[\"cd\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":13},{\"unified\":\"1F4C0\",\"name\":\"DVD\",\"short_names\":[\"dvd\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":14},{\"unified\":\"1F4C1\",\"name\":\"FILE FOLDER\",\"short_names\":[\"file_folder\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":15},{\"unified\":\"1F4C2\",\"name\":\"OPEN FILE FOLDER\",\"short_names\":[\"open_file_folder\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":16},{\"unified\":\"1F4C3\",\"name\":\"PAGE WITH CURL\",\"short_names\":[\"page_with_curl\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":17},{\"unified\":\"1F4C4\",\"name\":\"PAGE FACING UP\",\"short_names\":[\"page_facing_up\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":18},{\"unified\":\"1F4C5\",\"name\":\"CALENDAR\",\"short_names\":[\"date\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":19},{\"unified\":\"1F4C6\",\"name\":\"TEAR-OFF CALENDAR\",\"short_names\":[\"calendar\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":20},{\"unified\":\"1F4C7\",\"name\":\"CARD INDEX\",\"short_names\":[\"card_index\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":21},{\"unified\":\"1F4C8\",\"name\":\"CHART WITH UPWARDS TREND\",\"short_names\":[\"chart_with_upwards_trend\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":22},{\"unified\":\"1F4C9\",\"name\":\"CHART WITH DOWNWARDS TREND\",\"short_names\":[\"chart_with_downwards_trend\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":23},{\"unified\":\"1F4CA\",\"name\":\"BAR CHART\",\"short_names\":[\"bar_chart\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":24},{\"unified\":\"1F4CB\",\"name\":\"CLIPBOARD\",\"short_names\":[\"clipboard\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":25},{\"unified\":\"1F4CC\",\"name\":\"PUSHPIN\",\"short_names\":[\"pushpin\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":26},{\"unified\":\"1F4CD\",\"name\":\"ROUND PUSHPIN\",\"short_names\":[\"round_pushpin\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":27},{\"unified\":\"1F4CE\",\"name\":\"PAPERCLIP\",\"short_names\":[\"paperclip\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":28},{\"unified\":\"1F4CF\",\"name\":\"STRAIGHT RULER\",\"short_names\":[\"straight_ruler\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":29},{\"unified\":\"1F4D0\",\"name\":\"TRIANGULAR RULER\",\"short_names\":[\"triangular_ruler\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":30},{\"unified\":\"1F4D1\",\"name\":\"BOOKMARK TABS\",\"short_names\":[\"bookmark_tabs\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":31},{\"unified\":\"1F4D2\",\"name\":\"LEDGER\",\"short_names\":[\"ledger\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":32},{\"unified\":\"1F4D3\",\"name\":\"NOTEBOOK\",\"short_names\":[\"notebook\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":33},{\"unified\":\"1F4D4\",\"name\":\"NOTEBOOK WITH DECORATIVE COVER\",\"short_names\":[\"notebook_with_decorative_cover\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":34},{\"unified\":\"1F4D5\",\"name\":\"CLOSED BOOK\",\"short_names\":[\"closed_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":35},{\"unified\":\"1F4D6\",\"name\":\"OPEN BOOK\",\"short_names\":[\"book\",\"open_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":36},{\"unified\":\"1F4D7\",\"name\":\"GREEN BOOK\",\"short_names\":[\"green_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":37},{\"unified\":\"1F4D8\",\"name\":\"BLUE BOOK\",\"short_names\":[\"blue_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":38},{\"unified\":\"1F4D9\",\"name\":\"ORANGE BOOK\",\"short_names\":[\"orange_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":39},{\"unified\":\"1F4DA\",\"name\":\"BOOKS\",\"short_names\":[\"books\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":40},{\"unified\":\"1F4DB\",\"name\":\"NAME BADGE\",\"short_names\":[\"name_badge\"],\"category\":\"Symbols\",\"sheet_x\":26,\"sheet_y\":41},{\"unified\":\"1F4DC\",\"name\":\"SCROLL\",\"short_names\":[\"scroll\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":42},{\"unified\":\"1F4DD\",\"name\":\"MEMO\",\"short_names\":[\"memo\",\"pencil\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":43},{\"unified\":\"1F4DE\",\"name\":\"TELEPHONE RECEIVER\",\"short_names\":[\"telephone_receiver\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":44},{\"unified\":\"1F4DF\",\"name\":\"PAGER\",\"short_names\":[\"pager\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":45},{\"unified\":\"1F4E0\",\"name\":\"FAX MACHINE\",\"short_names\":[\"fax\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":46},{\"unified\":\"1F4E1\",\"name\":\"SATELLITE ANTENNA\",\"short_names\":[\"satellite_antenna\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":47},{\"unified\":\"1F4E2\",\"name\":\"PUBLIC ADDRESS LOUDSPEAKER\",\"short_names\":[\"loudspeaker\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":48},{\"unified\":\"1F4E3\",\"name\":\"CHEERING MEGAPHONE\",\"short_names\":[\"mega\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":49},{\"unified\":\"1F4E4\",\"name\":\"OUTBOX TRAY\",\"short_names\":[\"outbox_tray\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":50},{\"unified\":\"1F4E5\",\"name\":\"INBOX TRAY\",\"short_names\":[\"inbox_tray\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":51},{\"unified\":\"1F4E6\",\"name\":\"PACKAGE\",\"short_names\":[\"package\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":52},{\"unified\":\"1F4E7\",\"name\":\"E-MAIL SYMBOL\",\"short_names\":[\"e-mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":0},{\"unified\":\"1F4E8\",\"name\":\"INCOMING ENVELOPE\",\"short_names\":[\"incoming_envelope\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":1},{\"unified\":\"1F4E9\",\"name\":\"ENVELOPE WITH DOWNWARDS ARROW ABOVE\",\"short_names\":[\"envelope_with_arrow\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":2},{\"unified\":\"1F4EA\",\"name\":\"CLOSED MAILBOX WITH LOWERED FLAG\",\"short_names\":[\"mailbox_closed\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":3},{\"unified\":\"1F4EB\",\"name\":\"CLOSED MAILBOX WITH RAISED FLAG\",\"short_names\":[\"mailbox\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":4},{\"unified\":\"1F4EC\",\"name\":\"OPEN MAILBOX WITH RAISED FLAG\",\"short_names\":[\"mailbox_with_mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":5},{\"unified\":\"1F4ED\",\"name\":\"OPEN MAILBOX WITH LOWERED FLAG\",\"short_names\":[\"mailbox_with_no_mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":6},{\"unified\":\"1F4EE\",\"name\":\"POSTBOX\",\"short_names\":[\"postbox\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":7},{\"unified\":\"1F4EF\",\"name\":\"POSTAL HORN\",\"short_names\":[\"postal_horn\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":8},{\"unified\":\"1F4F0\",\"name\":\"NEWSPAPER\",\"short_names\":[\"newspaper\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":9},{\"unified\":\"1F4F1\",\"name\":\"MOBILE PHONE\",\"short_names\":[\"iphone\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":10},{\"unified\":\"1F4F2\",\"name\":\"MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT\",\"short_names\":[\"calling\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":11},{\"unified\":\"1F4F3\",\"name\":\"VIBRATION MODE\",\"short_names\":[\"vibration_mode\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":12},{\"unified\":\"1F4F4\",\"name\":\"MOBILE PHONE OFF\",\"short_names\":[\"mobile_phone_off\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":13},{\"unified\":\"1F4F5\",\"name\":\"NO MOBILE PHONES\",\"short_names\":[\"no_mobile_phones\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":14},{\"unified\":\"1F4F6\",\"name\":\"ANTENNA WITH BARS\",\"short_names\":[\"signal_strength\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":15},{\"unified\":\"1F4F7\",\"name\":\"CAMERA\",\"short_names\":[\"camera\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":16},{\"unified\":\"1F4F8\",\"name\":\"CAMERA WITH FLASH\",\"short_names\":[\"camera_with_flash\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":17},{\"unified\":\"1F4F9\",\"name\":\"VIDEO CAMERA\",\"short_names\":[\"video_camera\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":18},{\"unified\":\"1F4FA\",\"name\":\"TELEVISION\",\"short_names\":[\"tv\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":19},{\"unified\":\"1F4FB\",\"name\":\"RADIO\",\"short_names\":[\"radio\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":20},{\"unified\":\"1F4FC\",\"name\":\"VIDEOCASSETTE\",\"short_names\":[\"vhs\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":21},{\"unified\":\"1F4FD-FE0F\",\"name\":null,\"short_names\":[\"film_projector\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":22},{\"unified\":\"1F4FF\",\"name\":\"PRAYER BEADS\",\"short_names\":[\"prayer_beads\"],\"category\":\"Smileys & People\",\"sheet_x\":27,\"sheet_y\":23},{\"unified\":\"1F500\",\"name\":\"TWISTED RIGHTWARDS ARROWS\",\"short_names\":[\"twisted_rightwards_arrows\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":24},{\"unified\":\"1F501\",\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"repeat\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":25},{\"unified\":\"1F502\",\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY\",\"short_names\":[\"repeat_one\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":26},{\"unified\":\"1F503\",\"name\":\"CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"arrows_clockwise\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":27},{\"unified\":\"1F504\",\"name\":\"ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"arrows_counterclockwise\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":28},{\"unified\":\"1F505\",\"name\":\"LOW BRIGHTNESS SYMBOL\",\"short_names\":[\"low_brightness\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":29},{\"unified\":\"1F506\",\"name\":\"HIGH BRIGHTNESS SYMBOL\",\"short_names\":[\"high_brightness\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":30},{\"unified\":\"1F507\",\"name\":\"SPEAKER WITH CANCELLATION STROKE\",\"short_names\":[\"mute\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":31},{\"unified\":\"1F508\",\"name\":\"SPEAKER\",\"short_names\":[\"speaker\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":32},{\"unified\":\"1F509\",\"name\":\"SPEAKER WITH ONE SOUND WAVE\",\"short_names\":[\"sound\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":33},{\"unified\":\"1F50A\",\"name\":\"SPEAKER WITH THREE SOUND WAVES\",\"short_names\":[\"loud_sound\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":34},{\"unified\":\"1F50B\",\"name\":\"BATTERY\",\"short_names\":[\"battery\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":35},{\"unified\":\"1F50C\",\"name\":\"ELECTRIC PLUG\",\"short_names\":[\"electric_plug\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":36},{\"unified\":\"1F50D\",\"name\":\"LEFT-POINTING MAGNIFYING GLASS\",\"short_names\":[\"mag\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":37},{\"unified\":\"1F50E\",\"name\":\"RIGHT-POINTING MAGNIFYING GLASS\",\"short_names\":[\"mag_right\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":38},{\"unified\":\"1F50F\",\"name\":\"LOCK WITH INK PEN\",\"short_names\":[\"lock_with_ink_pen\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":39},{\"unified\":\"1F510\",\"name\":\"CLOSED LOCK WITH KEY\",\"short_names\":[\"closed_lock_with_key\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":40},{\"unified\":\"1F511\",\"name\":\"KEY\",\"short_names\":[\"key\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":41},{\"unified\":\"1F512\",\"name\":\"LOCK\",\"short_names\":[\"lock\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":42},{\"unified\":\"1F513\",\"name\":\"OPEN LOCK\",\"short_names\":[\"unlock\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":43},{\"unified\":\"1F514\",\"name\":\"BELL\",\"short_names\":[\"bell\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":44},{\"unified\":\"1F515\",\"name\":\"BELL WITH CANCELLATION STROKE\",\"short_names\":[\"no_bell\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":45},{\"unified\":\"1F516\",\"name\":\"BOOKMARK\",\"short_names\":[\"bookmark\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":46},{\"unified\":\"1F517\",\"name\":\"LINK SYMBOL\",\"short_names\":[\"link\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":47},{\"unified\":\"1F518\",\"name\":\"RADIO BUTTON\",\"short_names\":[\"radio_button\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":48},{\"unified\":\"1F519\",\"name\":\"BACK WITH LEFTWARDS ARROW ABOVE\",\"short_names\":[\"back\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":49},{\"unified\":\"1F51A\",\"name\":\"END WITH LEFTWARDS ARROW ABOVE\",\"short_names\":[\"end\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":50},{\"unified\":\"1F51B\",\"name\":\"ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE\",\"short_names\":[\"on\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":51},{\"unified\":\"1F51C\",\"name\":\"SOON WITH RIGHTWARDS ARROW ABOVE\",\"short_names\":[\"soon\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":52},{\"unified\":\"1F51D\",\"name\":\"TOP WITH UPWARDS ARROW ABOVE\",\"short_names\":[\"top\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":0},{\"unified\":\"1F51E\",\"name\":\"NO ONE UNDER EIGHTEEN SYMBOL\",\"short_names\":[\"underage\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":1},{\"unified\":\"1F51F\",\"name\":\"KEYCAP TEN\",\"short_names\":[\"keycap_ten\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":2},{\"unified\":\"1F520\",\"name\":\"INPUT SYMBOL FOR LATIN CAPITAL LETTERS\",\"short_names\":[\"capital_abcd\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":3},{\"unified\":\"1F521\",\"name\":\"INPUT SYMBOL FOR LATIN SMALL LETTERS\",\"short_names\":[\"abcd\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":4},{\"unified\":\"1F522\",\"name\":\"INPUT SYMBOL FOR NUMBERS\",\"short_names\":[\"1234\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":5},{\"unified\":\"1F523\",\"name\":\"INPUT SYMBOL FOR SYMBOLS\",\"short_names\":[\"symbols\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":6},{\"unified\":\"1F524\",\"name\":\"INPUT SYMBOL FOR LATIN LETTERS\",\"short_names\":[\"abc\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":7},{\"unified\":\"1F525\",\"name\":\"FIRE\",\"short_names\":[\"fire\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":8},{\"unified\":\"1F526\",\"name\":\"ELECTRIC TORCH\",\"short_names\":[\"flashlight\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":9},{\"unified\":\"1F527\",\"name\":\"WRENCH\",\"short_names\":[\"wrench\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":10},{\"unified\":\"1F528\",\"name\":\"HAMMER\",\"short_names\":[\"hammer\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":11},{\"unified\":\"1F529\",\"name\":\"NUT AND BOLT\",\"short_names\":[\"nut_and_bolt\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":12},{\"unified\":\"1F52A\",\"name\":\"HOCHO\",\"short_names\":[\"hocho\",\"knife\"],\"category\":\"Food & Drink\",\"sheet_x\":28,\"sheet_y\":13},{\"unified\":\"1F52B\",\"name\":\"PISTOL\",\"short_names\":[\"gun\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":14},{\"unified\":\"1F52C\",\"name\":\"MICROSCOPE\",\"short_names\":[\"microscope\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":15},{\"unified\":\"1F52D\",\"name\":\"TELESCOPE\",\"short_names\":[\"telescope\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":16},{\"unified\":\"1F52E\",\"name\":\"CRYSTAL BALL\",\"short_names\":[\"crystal_ball\"],\"category\":\"Activities\",\"sheet_x\":28,\"sheet_y\":17},{\"unified\":\"1F52F\",\"name\":\"SIX POINTED STAR WITH MIDDLE DOT\",\"short_names\":[\"six_pointed_star\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":18},{\"unified\":\"1F530\",\"name\":\"JAPANESE SYMBOL FOR BEGINNER\",\"short_names\":[\"beginner\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":19},{\"unified\":\"1F531\",\"name\":\"TRIDENT EMBLEM\",\"short_names\":[\"trident\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":20},{\"unified\":\"1F532\",\"name\":\"BLACK SQUARE BUTTON\",\"short_names\":[\"black_square_button\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":21},{\"unified\":\"1F533\",\"name\":\"WHITE SQUARE BUTTON\",\"short_names\":[\"white_square_button\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":22},{\"unified\":\"1F534\",\"name\":\"LARGE RED CIRCLE\",\"short_names\":[\"red_circle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":23},{\"unified\":\"1F535\",\"name\":\"LARGE BLUE CIRCLE\",\"short_names\":[\"large_blue_circle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":24},{\"unified\":\"1F536\",\"name\":\"LARGE ORANGE DIAMOND\",\"short_names\":[\"large_orange_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":25},{\"unified\":\"1F537\",\"name\":\"LARGE BLUE DIAMOND\",\"short_names\":[\"large_blue_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":26},{\"unified\":\"1F538\",\"name\":\"SMALL ORANGE DIAMOND\",\"short_names\":[\"small_orange_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":27},{\"unified\":\"1F539\",\"name\":\"SMALL BLUE DIAMOND\",\"short_names\":[\"small_blue_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":28},{\"unified\":\"1F53A\",\"name\":\"UP-POINTING RED TRIANGLE\",\"short_names\":[\"small_red_triangle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":29},{\"unified\":\"1F53B\",\"name\":\"DOWN-POINTING RED TRIANGLE\",\"short_names\":[\"small_red_triangle_down\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":30},{\"unified\":\"1F53C\",\"name\":\"UP-POINTING SMALL RED TRIANGLE\",\"short_names\":[\"arrow_up_small\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":31},{\"unified\":\"1F53D\",\"name\":\"DOWN-POINTING SMALL RED TRIANGLE\",\"short_names\":[\"arrow_down_small\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":32},{\"unified\":\"1F549-FE0F\",\"name\":null,\"short_names\":[\"om_symbol\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":33},{\"unified\":\"1F54A-FE0F\",\"name\":null,\"short_names\":[\"dove_of_peace\"],\"category\":\"Animals & Nature\",\"sheet_x\":28,\"sheet_y\":34},{\"unified\":\"1F54B\",\"name\":\"KAABA\",\"short_names\":[\"kaaba\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":35},{\"unified\":\"1F54C\",\"name\":\"MOSQUE\",\"short_names\":[\"mosque\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":36},{\"unified\":\"1F54D\",\"name\":\"SYNAGOGUE\",\"short_names\":[\"synagogue\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":37},{\"unified\":\"1F54E\",\"name\":\"MENORAH WITH NINE BRANCHES\",\"short_names\":[\"menorah_with_nine_branches\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":38},{\"unified\":\"1F550\",\"name\":\"CLOCK FACE ONE OCLOCK\",\"short_names\":[\"clock1\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":39},{\"unified\":\"1F551\",\"name\":\"CLOCK FACE TWO OCLOCK\",\"short_names\":[\"clock2\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":40},{\"unified\":\"1F552\",\"name\":\"CLOCK FACE THREE OCLOCK\",\"short_names\":[\"clock3\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":41},{\"unified\":\"1F553\",\"name\":\"CLOCK FACE FOUR OCLOCK\",\"short_names\":[\"clock4\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":42},{\"unified\":\"1F554\",\"name\":\"CLOCK FACE FIVE OCLOCK\",\"short_names\":[\"clock5\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":43},{\"unified\":\"1F555\",\"name\":\"CLOCK FACE SIX OCLOCK\",\"short_names\":[\"clock6\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":44},{\"unified\":\"1F556\",\"name\":\"CLOCK FACE SEVEN OCLOCK\",\"short_names\":[\"clock7\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":45},{\"unified\":\"1F557\",\"name\":\"CLOCK FACE EIGHT OCLOCK\",\"short_names\":[\"clock8\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":46},{\"unified\":\"1F558\",\"name\":\"CLOCK FACE NINE OCLOCK\",\"short_names\":[\"clock9\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":47},{\"unified\":\"1F559\",\"name\":\"CLOCK FACE TEN OCLOCK\",\"short_names\":[\"clock10\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":48},{\"unified\":\"1F55A\",\"name\":\"CLOCK FACE ELEVEN OCLOCK\",\"short_names\":[\"clock11\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":49},{\"unified\":\"1F55B\",\"name\":\"CLOCK FACE TWELVE OCLOCK\",\"short_names\":[\"clock12\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":50},{\"unified\":\"1F55C\",\"name\":\"CLOCK FACE ONE-THIRTY\",\"short_names\":[\"clock130\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":51},{\"unified\":\"1F55D\",\"name\":\"CLOCK FACE TWO-THIRTY\",\"short_names\":[\"clock230\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":52},{\"unified\":\"1F55E\",\"name\":\"CLOCK FACE THREE-THIRTY\",\"short_names\":[\"clock330\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":0},{\"unified\":\"1F55F\",\"name\":\"CLOCK FACE FOUR-THIRTY\",\"short_names\":[\"clock430\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":1},{\"unified\":\"1F560\",\"name\":\"CLOCK FACE FIVE-THIRTY\",\"short_names\":[\"clock530\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":2},{\"unified\":\"1F561\",\"name\":\"CLOCK FACE SIX-THIRTY\",\"short_names\":[\"clock630\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":3},{\"unified\":\"1F562\",\"name\":\"CLOCK FACE SEVEN-THIRTY\",\"short_names\":[\"clock730\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":4},{\"unified\":\"1F563\",\"name\":\"CLOCK FACE EIGHT-THIRTY\",\"short_names\":[\"clock830\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":5},{\"unified\":\"1F564\",\"name\":\"CLOCK FACE NINE-THIRTY\",\"short_names\":[\"clock930\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":6},{\"unified\":\"1F565\",\"name\":\"CLOCK FACE TEN-THIRTY\",\"short_names\":[\"clock1030\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":7},{\"unified\":\"1F566\",\"name\":\"CLOCK FACE ELEVEN-THIRTY\",\"short_names\":[\"clock1130\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":8},{\"unified\":\"1F567\",\"name\":\"CLOCK FACE TWELVE-THIRTY\",\"short_names\":[\"clock1230\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":9},{\"unified\":\"1F56F-FE0F\",\"name\":null,\"short_names\":[\"candle\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":10},{\"unified\":\"1F570-FE0F\",\"name\":null,\"short_names\":[\"mantelpiece_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":11},{\"unified\":\"1F573-FE0F\",\"name\":null,\"short_names\":[\"hole\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":12},{\"unified\":\"1F574-FE0F\",\"name\":null,\"short_names\":[\"man_in_business_suit_levitating\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":13},{\"unified\":\"1F575-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-detective\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":19},{\"unified\":\"1F575-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-detective\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":25},{\"unified\":\"1F575-FE0F\",\"name\":null,\"short_names\":[\"sleuth_or_spy\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":31},{\"unified\":\"1F576-FE0F\",\"name\":null,\"short_names\":[\"dark_sunglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":37},{\"unified\":\"1F577-FE0F\",\"name\":null,\"short_names\":[\"spider\"],\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":38},{\"unified\":\"1F578-FE0F\",\"name\":null,\"short_names\":[\"spider_web\"],\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":39},{\"unified\":\"1F579-FE0F\",\"name\":null,\"short_names\":[\"joystick\"],\"category\":\"Activities\",\"sheet_x\":29,\"sheet_y\":40},{\"unified\":\"1F57A\",\"name\":\"MAN DANCING\",\"short_names\":[\"man_dancing\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":41},{\"unified\":\"1F587-FE0F\",\"name\":null,\"short_names\":[\"linked_paperclips\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":47},{\"unified\":\"1F58A-FE0F\",\"name\":null,\"short_names\":[\"lower_left_ballpoint_pen\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":48},{\"unified\":\"1F58B-FE0F\",\"name\":null,\"short_names\":[\"lower_left_fountain_pen\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":49},{\"unified\":\"1F58C-FE0F\",\"name\":null,\"short_names\":[\"lower_left_paintbrush\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":50},{\"unified\":\"1F58D-FE0F\",\"name\":null,\"short_names\":[\"lower_left_crayon\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":51},{\"unified\":\"1F590-FE0F\",\"name\":null,\"short_names\":[\"raised_hand_with_fingers_splayed\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":52},{\"unified\":\"1F595\",\"name\":\"REVERSED HAND WITH MIDDLE FINGER EXTENDED\",\"short_names\":[\"middle_finger\",\"reversed_hand_with_middle_finger_extended\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":5},{\"unified\":\"1F596\",\"name\":\"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS\",\"short_names\":[\"spock-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":11},{\"unified\":\"1F5A4\",\"name\":\"BLACK HEART\",\"short_names\":[\"black_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":17},{\"unified\":\"1F5A5-FE0F\",\"name\":null,\"short_names\":[\"desktop_computer\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":18},{\"unified\":\"1F5A8-FE0F\",\"name\":null,\"short_names\":[\"printer\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":19},{\"unified\":\"1F5B1-FE0F\",\"name\":null,\"short_names\":[\"three_button_mouse\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":20},{\"unified\":\"1F5B2-FE0F\",\"name\":null,\"short_names\":[\"trackball\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":21},{\"unified\":\"1F5BC-FE0F\",\"name\":null,\"short_names\":[\"frame_with_picture\"],\"category\":\"Activities\",\"sheet_x\":30,\"sheet_y\":22},{\"unified\":\"1F5C2-FE0F\",\"name\":null,\"short_names\":[\"card_index_dividers\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":23},{\"unified\":\"1F5C3-FE0F\",\"name\":null,\"short_names\":[\"card_file_box\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":24},{\"unified\":\"1F5C4-FE0F\",\"name\":null,\"short_names\":[\"file_cabinet\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":25},{\"unified\":\"1F5D1-FE0F\",\"name\":null,\"short_names\":[\"wastebasket\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":26},{\"unified\":\"1F5D2-FE0F\",\"name\":null,\"short_names\":[\"spiral_note_pad\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":27},{\"unified\":\"1F5D3-FE0F\",\"name\":null,\"short_names\":[\"spiral_calendar_pad\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":28},{\"unified\":\"1F5DC-FE0F\",\"name\":null,\"short_names\":[\"compression\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":29},{\"unified\":\"1F5DD-FE0F\",\"name\":null,\"short_names\":[\"old_key\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":30},{\"unified\":\"1F5DE-FE0F\",\"name\":null,\"short_names\":[\"rolled_up_newspaper\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":31},{\"unified\":\"1F5E1-FE0F\",\"name\":null,\"short_names\":[\"dagger_knife\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":32},{\"unified\":\"1F5E3-FE0F\",\"name\":null,\"short_names\":[\"speaking_head_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":33},{\"unified\":\"1F5E8-FE0F\",\"name\":null,\"short_names\":[\"left_speech_bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":34},{\"unified\":\"1F5EF-FE0F\",\"name\":null,\"short_names\":[\"right_anger_bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":35},{\"unified\":\"1F5F3-FE0F\",\"name\":null,\"short_names\":[\"ballot_box_with_ballot\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":36},{\"unified\":\"1F5FA-FE0F\",\"name\":null,\"short_names\":[\"world_map\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":37},{\"unified\":\"1F5FB\",\"name\":\"MOUNT FUJI\",\"short_names\":[\"mount_fuji\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":38},{\"unified\":\"1F5FC\",\"name\":\"TOKYO TOWER\",\"short_names\":[\"tokyo_tower\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":39},{\"unified\":\"1F5FD\",\"name\":\"STATUE OF LIBERTY\",\"short_names\":[\"statue_of_liberty\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":40},{\"unified\":\"1F5FE\",\"name\":\"SILHOUETTE OF JAPAN\",\"short_names\":[\"japan\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":41},{\"unified\":\"1F5FF\",\"name\":\"MOYAI\",\"short_names\":[\"moyai\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":42},{\"unified\":\"1F600\",\"name\":\"GRINNING FACE\",\"short_names\":[\"grinning\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":43},{\"unified\":\"1F601\",\"name\":\"GRINNING FACE WITH SMILING EYES\",\"short_names\":[\"grin\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":44},{\"unified\":\"1F602\",\"name\":\"FACE WITH TEARS OF JOY\",\"short_names\":[\"joy\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":45},{\"unified\":\"1F603\",\"name\":\"SMILING FACE WITH OPEN MOUTH\",\"short_names\":[\"smiley\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":46},{\"unified\":\"1F604\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND SMILING EYES\",\"short_names\":[\"smile\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":47},{\"unified\":\"1F605\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT\",\"short_names\":[\"sweat_smile\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":48},{\"unified\":\"1F606\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES\",\"short_names\":[\"laughing\",\"satisfied\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":49},{\"unified\":\"1F607\",\"name\":\"SMILING FACE WITH HALO\",\"short_names\":[\"innocent\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":50},{\"unified\":\"1F608\",\"name\":\"SMILING FACE WITH HORNS\",\"short_names\":[\"smiling_imp\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":51},{\"unified\":\"1F609\",\"name\":\"WINKING FACE\",\"short_names\":[\"wink\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":52},{\"unified\":\"1F60A\",\"name\":\"SMILING FACE WITH SMILING EYES\",\"short_names\":[\"blush\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":0},{\"unified\":\"1F60B\",\"name\":\"FACE SAVOURING DELICIOUS FOOD\",\"short_names\":[\"yum\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":1},{\"unified\":\"1F60C\",\"name\":\"RELIEVED FACE\",\"short_names\":[\"relieved\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":2},{\"unified\":\"1F60D\",\"name\":\"SMILING FACE WITH HEART-SHAPED EYES\",\"short_names\":[\"heart_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":3},{\"unified\":\"1F60E\",\"name\":\"SMILING FACE WITH SUNGLASSES\",\"short_names\":[\"sunglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":4},{\"unified\":\"1F60F\",\"name\":\"SMIRKING FACE\",\"short_names\":[\"smirk\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":5},{\"unified\":\"1F610\",\"name\":\"NEUTRAL FACE\",\"short_names\":[\"neutral_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":6},{\"unified\":\"1F611\",\"name\":\"EXPRESSIONLESS FACE\",\"short_names\":[\"expressionless\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":7},{\"unified\":\"1F612\",\"name\":\"UNAMUSED FACE\",\"short_names\":[\"unamused\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":8},{\"unified\":\"1F613\",\"name\":\"FACE WITH COLD SWEAT\",\"short_names\":[\"sweat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":9},{\"unified\":\"1F614\",\"name\":\"PENSIVE FACE\",\"short_names\":[\"pensive\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":10},{\"unified\":\"1F615\",\"name\":\"CONFUSED FACE\",\"short_names\":[\"confused\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":11},{\"unified\":\"1F616\",\"name\":\"CONFOUNDED FACE\",\"short_names\":[\"confounded\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":12},{\"unified\":\"1F617\",\"name\":\"KISSING FACE\",\"short_names\":[\"kissing\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":13},{\"unified\":\"1F618\",\"name\":\"FACE THROWING A KISS\",\"short_names\":[\"kissing_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":14},{\"unified\":\"1F619\",\"name\":\"KISSING FACE WITH SMILING EYES\",\"short_names\":[\"kissing_smiling_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":15},{\"unified\":\"1F61A\",\"name\":\"KISSING FACE WITH CLOSED EYES\",\"short_names\":[\"kissing_closed_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":16},{\"unified\":\"1F61B\",\"name\":\"FACE WITH STUCK-OUT TONGUE\",\"short_names\":[\"stuck_out_tongue\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":17},{\"unified\":\"1F61C\",\"name\":\"FACE WITH STUCK-OUT TONGUE AND WINKING EYE\",\"short_names\":[\"stuck_out_tongue_winking_eye\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":18},{\"unified\":\"1F61D\",\"name\":\"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES\",\"short_names\":[\"stuck_out_tongue_closed_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":19},{\"unified\":\"1F61E\",\"name\":\"DISAPPOINTED FACE\",\"short_names\":[\"disappointed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":20},{\"unified\":\"1F61F\",\"name\":\"WORRIED FACE\",\"short_names\":[\"worried\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":21},{\"unified\":\"1F620\",\"name\":\"ANGRY FACE\",\"short_names\":[\"angry\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":22},{\"unified\":\"1F621\",\"name\":\"POUTING FACE\",\"short_names\":[\"rage\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":23},{\"unified\":\"1F622\",\"name\":\"CRYING FACE\",\"short_names\":[\"cry\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":24},{\"unified\":\"1F623\",\"name\":\"PERSEVERING FACE\",\"short_names\":[\"persevere\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":25},{\"unified\":\"1F624\",\"name\":\"FACE WITH LOOK OF TRIUMPH\",\"short_names\":[\"triumph\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":26},{\"unified\":\"1F625\",\"name\":\"DISAPPOINTED BUT RELIEVED FACE\",\"short_names\":[\"disappointed_relieved\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":27},{\"unified\":\"1F626\",\"name\":\"FROWNING FACE WITH OPEN MOUTH\",\"short_names\":[\"frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":28},{\"unified\":\"1F627\",\"name\":\"ANGUISHED FACE\",\"short_names\":[\"anguished\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":29},{\"unified\":\"1F628\",\"name\":\"FEARFUL FACE\",\"short_names\":[\"fearful\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":30},{\"unified\":\"1F629\",\"name\":\"WEARY FACE\",\"short_names\":[\"weary\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":31},{\"unified\":\"1F62A\",\"name\":\"SLEEPY FACE\",\"short_names\":[\"sleepy\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":32},{\"unified\":\"1F62B\",\"name\":\"TIRED FACE\",\"short_names\":[\"tired_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":33},{\"unified\":\"1F62C\",\"name\":\"GRIMACING FACE\",\"short_names\":[\"grimacing\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":34},{\"unified\":\"1F62D\",\"name\":\"LOUDLY CRYING FACE\",\"short_names\":[\"sob\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":35},{\"unified\":\"1F62E\",\"name\":\"FACE WITH OPEN MOUTH\",\"short_names\":[\"open_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":36},{\"unified\":\"1F62F\",\"name\":\"HUSHED FACE\",\"short_names\":[\"hushed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":37},{\"unified\":\"1F630\",\"name\":\"FACE WITH OPEN MOUTH AND COLD SWEAT\",\"short_names\":[\"cold_sweat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":38},{\"unified\":\"1F631\",\"name\":\"FACE SCREAMING IN FEAR\",\"short_names\":[\"scream\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":39},{\"unified\":\"1F632\",\"name\":\"ASTONISHED FACE\",\"short_names\":[\"astonished\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":40},{\"unified\":\"1F633\",\"name\":\"FLUSHED FACE\",\"short_names\":[\"flushed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":41},{\"unified\":\"1F634\",\"name\":\"SLEEPING FACE\",\"short_names\":[\"sleeping\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":42},{\"unified\":\"1F635\",\"name\":\"DIZZY FACE\",\"short_names\":[\"dizzy_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":43},{\"unified\":\"1F636\",\"name\":\"FACE WITHOUT MOUTH\",\"short_names\":[\"no_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":44},{\"unified\":\"1F637\",\"name\":\"FACE WITH MEDICAL MASK\",\"short_names\":[\"mask\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":45},{\"unified\":\"1F638\",\"name\":\"GRINNING CAT FACE WITH SMILING EYES\",\"short_names\":[\"smile_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":46},{\"unified\":\"1F639\",\"name\":\"CAT FACE WITH TEARS OF JOY\",\"short_names\":[\"joy_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":47},{\"unified\":\"1F63A\",\"name\":\"SMILING CAT FACE WITH OPEN MOUTH\",\"short_names\":[\"smiley_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":48},{\"unified\":\"1F63B\",\"name\":\"SMILING CAT FACE WITH HEART-SHAPED EYES\",\"short_names\":[\"heart_eyes_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":49},{\"unified\":\"1F63C\",\"name\":\"CAT FACE WITH WRY SMILE\",\"short_names\":[\"smirk_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":50},{\"unified\":\"1F63D\",\"name\":\"KISSING CAT FACE WITH CLOSED EYES\",\"short_names\":[\"kissing_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":51},{\"unified\":\"1F63E\",\"name\":\"POUTING CAT FACE\",\"short_names\":[\"pouting_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":52},{\"unified\":\"1F63F\",\"name\":\"CRYING CAT FACE\",\"short_names\":[\"crying_cat_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":0},{\"unified\":\"1F640\",\"name\":\"WEARY CAT FACE\",\"short_names\":[\"scream_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":1},{\"unified\":\"1F641\",\"name\":\"SLIGHTLY FROWNING FACE\",\"short_names\":[\"slightly_frowning_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":2},{\"unified\":\"1F642\",\"name\":\"SLIGHTLY SMILING FACE\",\"short_names\":[\"slightly_smiling_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":3},{\"unified\":\"1F643\",\"name\":\"UPSIDE-DOWN FACE\",\"short_names\":[\"upside_down_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":4},{\"unified\":\"1F644\",\"name\":\"FACE WITH ROLLING EYES\",\"short_names\":[\"face_with_rolling_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":5},{\"unified\":\"1F645-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-gesturing-no\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":6},{\"unified\":\"1F645-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-gesturing-no\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":12},{\"unified\":\"1F645\",\"name\":\"FACE WITH NO GOOD GESTURE\",\"short_names\":[\"no_good\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":18},{\"unified\":\"1F646-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-gesturing-ok\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":24},{\"unified\":\"1F646-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-gesturing-ok\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":30},{\"unified\":\"1F646\",\"name\":\"FACE WITH OK GESTURE\",\"short_names\":[\"ok_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":36},{\"unified\":\"1F647-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-bowing\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":42},{\"unified\":\"1F647-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-bowing\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":48},{\"unified\":\"1F647\",\"name\":\"PERSON BOWING DEEPLY\",\"short_names\":[\"bow\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":1},{\"unified\":\"1F648\",\"name\":\"SEE-NO-EVIL MONKEY\",\"short_names\":[\"see_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":7},{\"unified\":\"1F649\",\"name\":\"HEAR-NO-EVIL MONKEY\",\"short_names\":[\"hear_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":8},{\"unified\":\"1F64A\",\"name\":\"SPEAK-NO-EVIL MONKEY\",\"short_names\":[\"speak_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":9},{\"unified\":\"1F64B-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-raising-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":10},{\"unified\":\"1F64B-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-raising-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":16},{\"unified\":\"1F64B\",\"name\":\"HAPPY PERSON RAISING ONE HAND\",\"short_names\":[\"raising_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":22},{\"unified\":\"1F64C\",\"name\":\"PERSON RAISING BOTH HANDS IN CELEBRATION\",\"short_names\":[\"raised_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":28},{\"unified\":\"1F64D-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":34},{\"unified\":\"1F64D-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":40},{\"unified\":\"1F64D\",\"name\":\"PERSON FROWNING\",\"short_names\":[\"person_frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":46},{\"unified\":\"1F64E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-pouting\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":52},{\"unified\":\"1F64E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-pouting\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":5},{\"unified\":\"1F64E\",\"name\":\"PERSON WITH POUTING FACE\",\"short_names\":[\"person_with_pouting_face\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":11},{\"unified\":\"1F64F\",\"name\":\"PERSON WITH FOLDED HANDS\",\"short_names\":[\"pray\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":17},{\"unified\":\"1F680\",\"name\":\"ROCKET\",\"short_names\":[\"rocket\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":23},{\"unified\":\"1F681\",\"name\":\"HELICOPTER\",\"short_names\":[\"helicopter\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":24},{\"unified\":\"1F682\",\"name\":\"STEAM LOCOMOTIVE\",\"short_names\":[\"steam_locomotive\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":25},{\"unified\":\"1F683\",\"name\":\"RAILWAY CAR\",\"short_names\":[\"railway_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":26},{\"unified\":\"1F684\",\"name\":\"HIGH-SPEED TRAIN\",\"short_names\":[\"bullettrain_side\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":27},{\"unified\":\"1F685\",\"name\":\"HIGH-SPEED TRAIN WITH BULLET NOSE\",\"short_names\":[\"bullettrain_front\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":28},{\"unified\":\"1F686\",\"name\":\"TRAIN\",\"short_names\":[\"train2\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":29},{\"unified\":\"1F687\",\"name\":\"METRO\",\"short_names\":[\"metro\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":30},{\"unified\":\"1F688\",\"name\":\"LIGHT RAIL\",\"short_names\":[\"light_rail\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":31},{\"unified\":\"1F689\",\"name\":\"STATION\",\"short_names\":[\"station\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":32},{\"unified\":\"1F68A\",\"name\":\"TRAM\",\"short_names\":[\"tram\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":33},{\"unified\":\"1F68B\",\"name\":\"TRAM CAR\",\"short_names\":[\"train\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":34},{\"unified\":\"1F68C\",\"name\":\"BUS\",\"short_names\":[\"bus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":35},{\"unified\":\"1F68D\",\"name\":\"ONCOMING BUS\",\"short_names\":[\"oncoming_bus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":36},{\"unified\":\"1F68E\",\"name\":\"TROLLEYBUS\",\"short_names\":[\"trolleybus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":37},{\"unified\":\"1F68F\",\"name\":\"BUS STOP\",\"short_names\":[\"busstop\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":38},{\"unified\":\"1F690\",\"name\":\"MINIBUS\",\"short_names\":[\"minibus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":39},{\"unified\":\"1F691\",\"name\":\"AMBULANCE\",\"short_names\":[\"ambulance\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":40},{\"unified\":\"1F692\",\"name\":\"FIRE ENGINE\",\"short_names\":[\"fire_engine\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":41},{\"unified\":\"1F693\",\"name\":\"POLICE CAR\",\"short_names\":[\"police_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":42},{\"unified\":\"1F694\",\"name\":\"ONCOMING POLICE CAR\",\"short_names\":[\"oncoming_police_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":43},{\"unified\":\"1F695\",\"name\":\"TAXI\",\"short_names\":[\"taxi\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":44},{\"unified\":\"1F696\",\"name\":\"ONCOMING TAXI\",\"short_names\":[\"oncoming_taxi\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":45},{\"unified\":\"1F697\",\"name\":\"AUTOMOBILE\",\"short_names\":[\"car\",\"red_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":46},{\"unified\":\"1F698\",\"name\":\"ONCOMING AUTOMOBILE\",\"short_names\":[\"oncoming_automobile\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":47},{\"unified\":\"1F699\",\"name\":\"RECREATIONAL VEHICLE\",\"short_names\":[\"blue_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":48},{\"unified\":\"1F69A\",\"name\":\"DELIVERY TRUCK\",\"short_names\":[\"truck\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":49},{\"unified\":\"1F69B\",\"name\":\"ARTICULATED LORRY\",\"short_names\":[\"articulated_lorry\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":50},{\"unified\":\"1F69C\",\"name\":\"TRACTOR\",\"short_names\":[\"tractor\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":51},{\"unified\":\"1F69D\",\"name\":\"MONORAIL\",\"short_names\":[\"monorail\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":52},{\"unified\":\"1F69E\",\"name\":\"MOUNTAIN RAILWAY\",\"short_names\":[\"mountain_railway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":0},{\"unified\":\"1F69F\",\"name\":\"SUSPENSION RAILWAY\",\"short_names\":[\"suspension_railway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":1},{\"unified\":\"1F6A0\",\"name\":\"MOUNTAIN CABLEWAY\",\"short_names\":[\"mountain_cableway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":2},{\"unified\":\"1F6A1\",\"name\":\"AERIAL TRAMWAY\",\"short_names\":[\"aerial_tramway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":3},{\"unified\":\"1F6A2\",\"name\":\"SHIP\",\"short_names\":[\"ship\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":4},{\"unified\":\"1F6A3-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-rowing-boat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":5},{\"unified\":\"1F6A3-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-rowing-boat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":11},{\"unified\":\"1F6A3\",\"name\":\"ROWBOAT\",\"short_names\":[\"rowboat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":17},{\"unified\":\"1F6A4\",\"name\":\"SPEEDBOAT\",\"short_names\":[\"speedboat\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":23},{\"unified\":\"1F6A5\",\"name\":\"HORIZONTAL TRAFFIC LIGHT\",\"short_names\":[\"traffic_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":24},{\"unified\":\"1F6A6\",\"name\":\"VERTICAL TRAFFIC LIGHT\",\"short_names\":[\"vertical_traffic_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":25},{\"unified\":\"1F6A7\",\"name\":\"CONSTRUCTION SIGN\",\"short_names\":[\"construction\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":26},{\"unified\":\"1F6A8\",\"name\":\"POLICE CARS REVOLVING LIGHT\",\"short_names\":[\"rotating_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":27},{\"unified\":\"1F6A9\",\"name\":\"TRIANGULAR FLAG ON POST\",\"short_names\":[\"triangular_flag_on_post\"],\"category\":\"Flags\",\"sheet_x\":35,\"sheet_y\":28},{\"unified\":\"1F6AA\",\"name\":\"DOOR\",\"short_names\":[\"door\"],\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":29},{\"unified\":\"1F6AB\",\"name\":\"NO ENTRY SIGN\",\"short_names\":[\"no_entry_sign\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":30},{\"unified\":\"1F6AC\",\"name\":\"SMOKING SYMBOL\",\"short_names\":[\"smoking\"],\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":31},{\"unified\":\"1F6AD\",\"name\":\"NO SMOKING SYMBOL\",\"short_names\":[\"no_smoking\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":32},{\"unified\":\"1F6AE\",\"name\":\"PUT LITTER IN ITS PLACE SYMBOL\",\"short_names\":[\"put_litter_in_its_place\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":33},{\"unified\":\"1F6AF\",\"name\":\"DO NOT LITTER SYMBOL\",\"short_names\":[\"do_not_litter\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":34},{\"unified\":\"1F6B0\",\"name\":\"POTABLE WATER SYMBOL\",\"short_names\":[\"potable_water\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":35},{\"unified\":\"1F6B1\",\"name\":\"NON-POTABLE WATER SYMBOL\",\"short_names\":[\"non-potable_water\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":36},{\"unified\":\"1F6B2\",\"name\":\"BICYCLE\",\"short_names\":[\"bike\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":37},{\"unified\":\"1F6B3\",\"name\":\"NO BICYCLES\",\"short_names\":[\"no_bicycles\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":38},{\"unified\":\"1F6B4-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":39},{\"unified\":\"1F6B4-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":45},{\"unified\":\"1F6B4\",\"name\":\"BICYCLIST\",\"short_names\":[\"bicyclist\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":51},{\"unified\":\"1F6B5-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-mountain-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":4},{\"unified\":\"1F6B5-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-mountain-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":10},{\"unified\":\"1F6B5\",\"name\":\"MOUNTAIN BICYCLIST\",\"short_names\":[\"mountain_bicyclist\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":16},{\"unified\":\"1F6B6-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":22},{\"unified\":\"1F6B6-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":28},{\"unified\":\"1F6B6\",\"name\":\"PEDESTRIAN\",\"short_names\":[\"walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":34},{\"unified\":\"1F6B7\",\"name\":\"NO PEDESTRIANS\",\"short_names\":[\"no_pedestrians\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":40},{\"unified\":\"1F6B8\",\"name\":\"CHILDREN CROSSING\",\"short_names\":[\"children_crossing\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":41},{\"unified\":\"1F6B9\",\"name\":\"MENS SYMBOL\",\"short_names\":[\"mens\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":42},{\"unified\":\"1F6BA\",\"name\":\"WOMENS SYMBOL\",\"short_names\":[\"womens\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":43},{\"unified\":\"1F6BB\",\"name\":\"RESTROOM\",\"short_names\":[\"restroom\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":44},{\"unified\":\"1F6BC\",\"name\":\"BABY SYMBOL\",\"short_names\":[\"baby_symbol\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":45},{\"unified\":\"1F6BD\",\"name\":\"TOILET\",\"short_names\":[\"toilet\"],\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":46},{\"unified\":\"1F6BE\",\"name\":\"WATER CLOSET\",\"short_names\":[\"wc\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":47},{\"unified\":\"1F6BF\",\"name\":\"SHOWER\",\"short_names\":[\"shower\"],\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":48},{\"unified\":\"1F6C0\",\"name\":\"BATH\",\"short_names\":[\"bath\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":49},{\"unified\":\"1F6C1\",\"name\":\"BATHTUB\",\"short_names\":[\"bathtub\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":2},{\"unified\":\"1F6C2\",\"name\":\"PASSPORT CONTROL\",\"short_names\":[\"passport_control\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":3},{\"unified\":\"1F6C3\",\"name\":\"CUSTOMS\",\"short_names\":[\"customs\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":4},{\"unified\":\"1F6C4\",\"name\":\"BAGGAGE CLAIM\",\"short_names\":[\"baggage_claim\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":5},{\"unified\":\"1F6C5\",\"name\":\"LEFT LUGGAGE\",\"short_names\":[\"left_luggage\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":6},{\"unified\":\"1F6CB-FE0F\",\"name\":null,\"short_names\":[\"couch_and_lamp\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":7},{\"unified\":\"1F6CC\",\"name\":\"SLEEPING ACCOMMODATION\",\"short_names\":[\"sleeping_accommodation\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":8},{\"unified\":\"1F6CD-FE0F\",\"name\":null,\"short_names\":[\"shopping_bags\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":14},{\"unified\":\"1F6CE-FE0F\",\"name\":null,\"short_names\":[\"bellhop_bell\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":15},{\"unified\":\"1F6CF-FE0F\",\"name\":null,\"short_names\":[\"bed\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":16},{\"unified\":\"1F6D0\",\"name\":\"PLACE OF WORSHIP\",\"short_names\":[\"place_of_worship\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":17},{\"unified\":\"1F6D1\",\"name\":\"OCTAGONAL SIGN\",\"short_names\":[\"octagonal_sign\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":18},{\"unified\":\"1F6D2\",\"name\":\"SHOPPING TROLLEY\",\"short_names\":[\"shopping_trolley\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":19},{\"unified\":\"1F6E0-FE0F\",\"name\":null,\"short_names\":[\"hammer_and_wrench\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":20},{\"unified\":\"1F6E1-FE0F\",\"name\":null,\"short_names\":[\"shield\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":21},{\"unified\":\"1F6E2-FE0F\",\"name\":null,\"short_names\":[\"oil_drum\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":22},{\"unified\":\"1F6E3-FE0F\",\"name\":null,\"short_names\":[\"motorway\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":23},{\"unified\":\"1F6E4-FE0F\",\"name\":null,\"short_names\":[\"railway_track\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":24},{\"unified\":\"1F6E5-FE0F\",\"name\":null,\"short_names\":[\"motor_boat\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":25},{\"unified\":\"1F6E9-FE0F\",\"name\":null,\"short_names\":[\"small_airplane\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":26},{\"unified\":\"1F6EB\",\"name\":\"AIRPLANE DEPARTURE\",\"short_names\":[\"airplane_departure\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":27},{\"unified\":\"1F6EC\",\"name\":\"AIRPLANE ARRIVING\",\"short_names\":[\"airplane_arriving\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":28},{\"unified\":\"1F6F0-FE0F\",\"name\":null,\"short_names\":[\"satellite\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":29},{\"unified\":\"1F6F3-FE0F\",\"name\":null,\"short_names\":[\"passenger_ship\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":30},{\"unified\":\"1F6F4\",\"name\":\"SCOOTER\",\"short_names\":[\"scooter\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":31},{\"unified\":\"1F6F5\",\"name\":\"MOTOR SCOOTER\",\"short_names\":[\"motor_scooter\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":32},{\"unified\":\"1F6F6\",\"name\":\"CANOE\",\"short_names\":[\"canoe\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":33},{\"unified\":\"1F6F7\",\"name\":\"SLED\",\"short_names\":[\"sled\"],\"category\":\"Activities\",\"sheet_x\":37,\"sheet_y\":34},{\"unified\":\"1F6F8\",\"name\":\"FLYING SAUCER\",\"short_names\":[\"flying_saucer\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":35},{\"unified\":\"1F6F9\",\"name\":\"SKATEBOARD\",\"short_names\":[\"skateboard\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":36},{\"unified\":\"1F910\",\"name\":\"ZIPPER-MOUTH FACE\",\"short_names\":[\"zipper_mouth_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":37},{\"unified\":\"1F911\",\"name\":\"MONEY-MOUTH FACE\",\"short_names\":[\"money_mouth_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":38},{\"unified\":\"1F912\",\"name\":\"FACE WITH THERMOMETER\",\"short_names\":[\"face_with_thermometer\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":39},{\"unified\":\"1F913\",\"name\":\"NERD FACE\",\"short_names\":[\"nerd_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":40},{\"unified\":\"1F914\",\"name\":\"THINKING FACE\",\"short_names\":[\"thinking_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":41},{\"unified\":\"1F915\",\"name\":\"FACE WITH HEAD-BANDAGE\",\"short_names\":[\"face_with_head_bandage\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":42},{\"unified\":\"1F916\",\"name\":\"ROBOT FACE\",\"short_names\":[\"robot_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":43},{\"unified\":\"1F917\",\"name\":\"HUGGING FACE\",\"short_names\":[\"hugging_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":44},{\"unified\":\"1F918\",\"name\":\"SIGN OF THE HORNS\",\"short_names\":[\"the_horns\",\"sign_of_the_horns\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":45},{\"unified\":\"1F919\",\"name\":\"CALL ME HAND\",\"short_names\":[\"call_me_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":51},{\"unified\":\"1F91A\",\"name\":\"RAISED BACK OF HAND\",\"short_names\":[\"raised_back_of_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":4},{\"unified\":\"1F91B\",\"name\":\"LEFT-FACING FIST\",\"short_names\":[\"left-facing_fist\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":10},{\"unified\":\"1F91C\",\"name\":\"RIGHT-FACING FIST\",\"short_names\":[\"right-facing_fist\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":16},{\"unified\":\"1F91D\",\"name\":\"HANDSHAKE\",\"short_names\":[\"handshake\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":22},{\"unified\":\"1F91E\",\"name\":\"HAND WITH INDEX AND MIDDLE FINGERS CROSSED\",\"short_names\":[\"crossed_fingers\",\"hand_with_index_and_middle_fingers_crossed\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":23},{\"unified\":\"1F91F\",\"name\":\"I LOVE YOU HAND SIGN\",\"short_names\":[\"i_love_you_hand_sign\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":29},{\"unified\":\"1F920\",\"name\":\"FACE WITH COWBOY HAT\",\"short_names\":[\"face_with_cowboy_hat\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":35},{\"unified\":\"1F921\",\"name\":\"CLOWN FACE\",\"short_names\":[\"clown_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":36},{\"unified\":\"1F922\",\"name\":\"NAUSEATED FACE\",\"short_names\":[\"nauseated_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":37},{\"unified\":\"1F923\",\"name\":\"ROLLING ON THE FLOOR LAUGHING\",\"short_names\":[\"rolling_on_the_floor_laughing\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":38},{\"unified\":\"1F924\",\"name\":\"DROOLING FACE\",\"short_names\":[\"drooling_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":39},{\"unified\":\"1F925\",\"name\":\"LYING FACE\",\"short_names\":[\"lying_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":40},{\"unified\":\"1F926-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-facepalming\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":41},{\"unified\":\"1F926-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-facepalming\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":47},{\"unified\":\"1F926\",\"name\":\"FACE PALM\",\"short_names\":[\"face_palm\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":0},{\"unified\":\"1F927\",\"name\":\"SNEEZING FACE\",\"short_names\":[\"sneezing_face\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":6},{\"unified\":\"1F928\",\"name\":\"FACE WITH ONE EYEBROW RAISED\",\"short_names\":[\"face_with_raised_eyebrow\",\"face_with_one_eyebrow_raised\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":7},{\"unified\":\"1F929\",\"name\":\"GRINNING FACE WITH STAR EYES\",\"short_names\":[\"star-struck\",\"grinning_face_with_star_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":8},{\"unified\":\"1F92A\",\"name\":\"GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE\",\"short_names\":[\"zany_face\",\"grinning_face_with_one_large_and_one_small_eye\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":9},{\"unified\":\"1F92B\",\"name\":\"FACE WITH FINGER COVERING CLOSED LIPS\",\"short_names\":[\"shushing_face\",\"face_with_finger_covering_closed_lips\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":10},{\"unified\":\"1F92C\",\"name\":\"SERIOUS FACE WITH SYMBOLS COVERING MOUTH\",\"short_names\":[\"face_with_symbols_on_mouth\",\"serious_face_with_symbols_covering_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":11},{\"unified\":\"1F92D\",\"name\":\"SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH\",\"short_names\":[\"face_with_hand_over_mouth\",\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":12},{\"unified\":\"1F92E\",\"name\":\"FACE WITH OPEN MOUTH VOMITING\",\"short_names\":[\"face_vomiting\",\"face_with_open_mouth_vomiting\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":13},{\"unified\":\"1F92F\",\"name\":\"SHOCKED FACE WITH EXPLODING HEAD\",\"short_names\":[\"exploding_head\",\"shocked_face_with_exploding_head\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":14},{\"unified\":\"1F930\",\"name\":\"PREGNANT WOMAN\",\"short_names\":[\"pregnant_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":15},{\"unified\":\"1F931\",\"name\":\"BREAST-FEEDING\",\"short_names\":[\"breast-feeding\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":21},{\"unified\":\"1F932\",\"name\":\"PALMS UP TOGETHER\",\"short_names\":[\"palms_up_together\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":27},{\"unified\":\"1F933\",\"name\":\"SELFIE\",\"short_names\":[\"selfie\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":33},{\"unified\":\"1F934\",\"name\":\"PRINCE\",\"short_names\":[\"prince\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":39},{\"unified\":\"1F935\",\"name\":\"MAN IN TUXEDO\",\"short_names\":[\"man_in_tuxedo\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":45},{\"unified\":\"1F936\",\"name\":\"MOTHER CHRISTMAS\",\"short_names\":[\"mrs_claus\",\"mother_christmas\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":51},{\"unified\":\"1F937-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-shrugging\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":4},{\"unified\":\"1F937-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-shrugging\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":10},{\"unified\":\"1F937\",\"name\":\"SHRUG\",\"short_names\":[\"shrug\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":16},{\"unified\":\"1F938-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-cartwheeling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":22},{\"unified\":\"1F938-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-cartwheeling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":28},{\"unified\":\"1F938\",\"name\":\"PERSON DOING CARTWHEEL\",\"short_names\":[\"person_doing_cartwheel\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":34},{\"unified\":\"1F939-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":40},{\"unified\":\"1F939-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":46},{\"unified\":\"1F939\",\"name\":\"JUGGLING\",\"short_names\":[\"juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":52},{\"unified\":\"1F93A\",\"name\":\"FENCER\",\"short_names\":[\"fencer\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":5},{\"unified\":\"1F93C-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-wrestling\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":6},{\"unified\":\"1F93C-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-wrestling\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":7},{\"unified\":\"1F93C\",\"name\":\"WRESTLERS\",\"short_names\":[\"wrestlers\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":8},{\"unified\":\"1F93D-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-playing-water-polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":9},{\"unified\":\"1F93D-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-playing-water-polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":15},{\"unified\":\"1F93D\",\"name\":\"WATER POLO\",\"short_names\":[\"water_polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":21},{\"unified\":\"1F93E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-playing-handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":27},{\"unified\":\"1F93E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-playing-handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":33},{\"unified\":\"1F93E\",\"name\":\"HANDBALL\",\"short_names\":[\"handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":39},{\"unified\":\"1F940\",\"name\":\"WILTED FLOWER\",\"short_names\":[\"wilted_flower\"],\"category\":\"Animals & Nature\",\"sheet_x\":41,\"sheet_y\":45},{\"unified\":\"1F941\",\"name\":\"DRUM WITH DRUMSTICKS\",\"short_names\":[\"drum_with_drumsticks\"],\"category\":\"Objects\",\"sheet_x\":41,\"sheet_y\":46},{\"unified\":\"1F942\",\"name\":\"CLINKING GLASSES\",\"short_names\":[\"clinking_glasses\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":47},{\"unified\":\"1F943\",\"name\":\"TUMBLER GLASS\",\"short_names\":[\"tumbler_glass\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":48},{\"unified\":\"1F944\",\"name\":\"SPOON\",\"short_names\":[\"spoon\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":49},{\"unified\":\"1F945\",\"name\":\"GOAL NET\",\"short_names\":[\"goal_net\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":50},{\"unified\":\"1F947\",\"name\":\"FIRST PLACE MEDAL\",\"short_names\":[\"first_place_medal\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":51},{\"unified\":\"1F948\",\"name\":\"SECOND PLACE MEDAL\",\"short_names\":[\"second_place_medal\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":52},{\"unified\":\"1F949\",\"name\":\"THIRD PLACE MEDAL\",\"short_names\":[\"third_place_medal\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":0},{\"unified\":\"1F94A\",\"name\":\"BOXING GLOVE\",\"short_names\":[\"boxing_glove\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":1},{\"unified\":\"1F94B\",\"name\":\"MARTIAL ARTS UNIFORM\",\"short_names\":[\"martial_arts_uniform\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":2},{\"unified\":\"1F94C\",\"name\":\"CURLING STONE\",\"short_names\":[\"curling_stone\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":3},{\"unified\":\"1F94D\",\"name\":\"LACROSSE STICK AND BALL\",\"short_names\":[\"lacrosse\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":4},{\"unified\":\"1F94E\",\"name\":\"SOFTBALL\",\"short_names\":[\"softball\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":5},{\"unified\":\"1F94F\",\"name\":\"FLYING DISC\",\"short_names\":[\"flying_disc\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":6},{\"unified\":\"1F950\",\"name\":\"CROISSANT\",\"short_names\":[\"croissant\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":7},{\"unified\":\"1F951\",\"name\":\"AVOCADO\",\"short_names\":[\"avocado\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":8},{\"unified\":\"1F952\",\"name\":\"CUCUMBER\",\"short_names\":[\"cucumber\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":9},{\"unified\":\"1F953\",\"name\":\"BACON\",\"short_names\":[\"bacon\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":10},{\"unified\":\"1F954\",\"name\":\"POTATO\",\"short_names\":[\"potato\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":11},{\"unified\":\"1F955\",\"name\":\"CARROT\",\"short_names\":[\"carrot\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":12},{\"unified\":\"1F956\",\"name\":\"BAGUETTE BREAD\",\"short_names\":[\"baguette_bread\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":13},{\"unified\":\"1F957\",\"name\":\"GREEN SALAD\",\"short_names\":[\"green_salad\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":14},{\"unified\":\"1F958\",\"name\":\"SHALLOW PAN OF FOOD\",\"short_names\":[\"shallow_pan_of_food\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":15},{\"unified\":\"1F959\",\"name\":\"STUFFED FLATBREAD\",\"short_names\":[\"stuffed_flatbread\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":16},{\"unified\":\"1F95A\",\"name\":\"EGG\",\"short_names\":[\"egg\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":17},{\"unified\":\"1F95B\",\"name\":\"GLASS OF MILK\",\"short_names\":[\"glass_of_milk\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":18},{\"unified\":\"1F95C\",\"name\":\"PEANUTS\",\"short_names\":[\"peanuts\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":19},{\"unified\":\"1F95D\",\"name\":\"KIWIFRUIT\",\"short_names\":[\"kiwifruit\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":20},{\"unified\":\"1F95E\",\"name\":\"PANCAKES\",\"short_names\":[\"pancakes\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":21},{\"unified\":\"1F95F\",\"name\":\"DUMPLING\",\"short_names\":[\"dumpling\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":22},{\"unified\":\"1F960\",\"name\":\"FORTUNE COOKIE\",\"short_names\":[\"fortune_cookie\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":23},{\"unified\":\"1F961\",\"name\":\"TAKEOUT BOX\",\"short_names\":[\"takeout_box\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":24},{\"unified\":\"1F962\",\"name\":\"CHOPSTICKS\",\"short_names\":[\"chopsticks\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":25},{\"unified\":\"1F963\",\"name\":\"BOWL WITH SPOON\",\"short_names\":[\"bowl_with_spoon\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":26},{\"unified\":\"1F964\",\"name\":\"CUP WITH STRAW\",\"short_names\":[\"cup_with_straw\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":27},{\"unified\":\"1F965\",\"name\":\"COCONUT\",\"short_names\":[\"coconut\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":28},{\"unified\":\"1F966\",\"name\":\"BROCCOLI\",\"short_names\":[\"broccoli\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":29},{\"unified\":\"1F967\",\"name\":\"PIE\",\"short_names\":[\"pie\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":30},{\"unified\":\"1F968\",\"name\":\"PRETZEL\",\"short_names\":[\"pretzel\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":31},{\"unified\":\"1F969\",\"name\":\"CUT OF MEAT\",\"short_names\":[\"cut_of_meat\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":32},{\"unified\":\"1F96A\",\"name\":\"SANDWICH\",\"short_names\":[\"sandwich\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":33},{\"unified\":\"1F96B\",\"name\":\"CANNED FOOD\",\"short_names\":[\"canned_food\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":34},{\"unified\":\"1F96C\",\"name\":\"LEAFY GREEN\",\"short_names\":[\"leafy_green\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":35},{\"unified\":\"1F96D\",\"name\":\"MANGO\",\"short_names\":[\"mango\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":36},{\"unified\":\"1F96E\",\"name\":\"MOON CAKE\",\"short_names\":[\"moon_cake\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":37},{\"unified\":\"1F96F\",\"name\":\"BAGEL\",\"short_names\":[\"bagel\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":38},{\"unified\":\"1F970\",\"name\":\"SMILING FACE WITH SMILING EYES AND THREE HEARTS\",\"short_names\":[\"smiling_face_with_3_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":39},{\"unified\":\"1F973\",\"name\":\"FACE WITH PARTY HORN AND PARTY HAT\",\"short_names\":[\"partying_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":40},{\"unified\":\"1F974\",\"name\":\"FACE WITH UNEVEN EYES AND WAVY MOUTH\",\"short_names\":[\"woozy_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":41},{\"unified\":\"1F975\",\"name\":\"OVERHEATED FACE\",\"short_names\":[\"hot_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":42},{\"unified\":\"1F976\",\"name\":\"FREEZING FACE\",\"short_names\":[\"cold_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":43},{\"unified\":\"1F97A\",\"name\":\"FACE WITH PLEADING EYES\",\"short_names\":[\"pleading_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":44},{\"unified\":\"1F97C\",\"name\":\"LAB COAT\",\"short_names\":[\"lab_coat\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":45},{\"unified\":\"1F97D\",\"name\":\"GOGGLES\",\"short_names\":[\"goggles\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":46},{\"unified\":\"1F97E\",\"name\":\"HIKING BOOT\",\"short_names\":[\"hiking_boot\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":47},{\"unified\":\"1F97F\",\"name\":\"FLAT SHOE\",\"short_names\":[\"womans_flat_shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":48},{\"unified\":\"1F980\",\"name\":\"CRAB\",\"short_names\":[\"crab\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":49},{\"unified\":\"1F981\",\"name\":\"LION FACE\",\"short_names\":[\"lion_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":50},{\"unified\":\"1F982\",\"name\":\"SCORPION\",\"short_names\":[\"scorpion\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":51},{\"unified\":\"1F983\",\"name\":\"TURKEY\",\"short_names\":[\"turkey\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":52},{\"unified\":\"1F984\",\"name\":\"UNICORN FACE\",\"short_names\":[\"unicorn_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":0},{\"unified\":\"1F985\",\"name\":\"EAGLE\",\"short_names\":[\"eagle\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":1},{\"unified\":\"1F986\",\"name\":\"DUCK\",\"short_names\":[\"duck\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":2},{\"unified\":\"1F987\",\"name\":\"BAT\",\"short_names\":[\"bat\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":3},{\"unified\":\"1F988\",\"name\":\"SHARK\",\"short_names\":[\"shark\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":4},{\"unified\":\"1F989\",\"name\":\"OWL\",\"short_names\":[\"owl\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":5},{\"unified\":\"1F98A\",\"name\":\"FOX FACE\",\"short_names\":[\"fox_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":6},{\"unified\":\"1F98B\",\"name\":\"BUTTERFLY\",\"short_names\":[\"butterfly\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":7},{\"unified\":\"1F98C\",\"name\":\"DEER\",\"short_names\":[\"deer\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":8},{\"unified\":\"1F98D\",\"name\":\"GORILLA\",\"short_names\":[\"gorilla\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":9},{\"unified\":\"1F98E\",\"name\":\"LIZARD\",\"short_names\":[\"lizard\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":10},{\"unified\":\"1F98F\",\"name\":\"RHINOCEROS\",\"short_names\":[\"rhinoceros\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":11},{\"unified\":\"1F990\",\"name\":\"SHRIMP\",\"short_names\":[\"shrimp\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":12},{\"unified\":\"1F991\",\"name\":\"SQUID\",\"short_names\":[\"squid\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":13},{\"unified\":\"1F992\",\"name\":\"GIRAFFE FACE\",\"short_names\":[\"giraffe_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":14},{\"unified\":\"1F993\",\"name\":\"ZEBRA FACE\",\"short_names\":[\"zebra_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":15},{\"unified\":\"1F994\",\"name\":\"HEDGEHOG\",\"short_names\":[\"hedgehog\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":16},{\"unified\":\"1F995\",\"name\":\"SAUROPOD\",\"short_names\":[\"sauropod\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":17},{\"unified\":\"1F996\",\"name\":\"T-REX\",\"short_names\":[\"t-rex\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":18},{\"unified\":\"1F997\",\"name\":\"CRICKET\",\"short_names\":[\"cricket\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":19},{\"unified\":\"1F998\",\"name\":\"KANGAROO\",\"short_names\":[\"kangaroo\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":20},{\"unified\":\"1F999\",\"name\":\"LLAMA\",\"short_names\":[\"llama\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":21},{\"unified\":\"1F99A\",\"name\":\"PEACOCK\",\"short_names\":[\"peacock\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":22},{\"unified\":\"1F99B\",\"name\":\"HIPPOPOTAMUS\",\"short_names\":[\"hippopotamus\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":23},{\"unified\":\"1F99C\",\"name\":\"PARROT\",\"short_names\":[\"parrot\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":24},{\"unified\":\"1F99D\",\"name\":\"RACCOON\",\"short_names\":[\"raccoon\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":25},{\"unified\":\"1F99E\",\"name\":\"LOBSTER\",\"short_names\":[\"lobster\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":26},{\"unified\":\"1F99F\",\"name\":\"MOSQUITO\",\"short_names\":[\"mosquito\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":27},{\"unified\":\"1F9A0\",\"name\":\"MICROBE\",\"short_names\":[\"microbe\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":28},{\"unified\":\"1F9A1\",\"name\":\"BADGER\",\"short_names\":[\"badger\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":29},{\"unified\":\"1F9A2\",\"name\":\"SWAN\",\"short_names\":[\"swan\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":30},{\"unified\":\"1F9B4\",\"name\":\"BONE\",\"short_names\":[\"bone\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":31},{\"unified\":\"1F9B5\",\"name\":\"LEG\",\"short_names\":[\"leg\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":32},{\"unified\":\"1F9B6\",\"name\":\"FOOT\",\"short_names\":[\"foot\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":38},{\"unified\":\"1F9B7\",\"name\":\"TOOTH\",\"short_names\":[\"tooth\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":44},{\"unified\":\"1F9C0\",\"name\":\"CHEESE WEDGE\",\"short_names\":[\"cheese_wedge\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":16},{\"unified\":\"1F9C1\",\"name\":\"CUPCAKE\",\"short_names\":[\"cupcake\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":17},{\"unified\":\"1F9C2\",\"name\":\"SALT SHAKER\",\"short_names\":[\"salt\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":18},{\"unified\":\"1F9D0\",\"name\":\"FACE WITH MONOCLE\",\"short_names\":[\"face_with_monocle\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":19},{\"unified\":\"1F9D1\",\"name\":\"ADULT\",\"short_names\":[\"adult\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":20},{\"unified\":\"1F9D2\",\"name\":\"CHILD\",\"short_names\":[\"child\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":26},{\"unified\":\"1F9D3\",\"name\":\"OLDER ADULT\",\"short_names\":[\"older_adult\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":32},{\"unified\":\"1F9D4\",\"name\":\"BEARDED PERSON\",\"short_names\":[\"bearded_person\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":38},{\"unified\":\"1F9D5\",\"name\":\"PERSON WITH HEADSCARF\",\"short_names\":[\"person_with_headscarf\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":44},{\"unified\":\"1F9D6-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":50},{\"unified\":\"1F9D6-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":3},{\"unified\":\"1F9D6\",\"name\":\"PERSON IN STEAMY ROOM\",\"short_names\":[\"person_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":9},{\"unified\":\"1F9D7-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":15},{\"unified\":\"1F9D7-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":21},{\"unified\":\"1F9D7\",\"name\":\"PERSON CLIMBING\",\"short_names\":[\"person_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":27},{\"unified\":\"1F9D8-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":33},{\"unified\":\"1F9D8-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":39},{\"unified\":\"1F9D8\",\"name\":\"PERSON IN LOTUS POSITION\",\"short_names\":[\"person_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":45},{\"unified\":\"1F9D9-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_mage\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":51},{\"unified\":\"1F9D9-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_mage\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":4},{\"unified\":\"1F9D9\",\"name\":\"MAGE\",\"short_names\":[\"mage\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":10},{\"unified\":\"1F9DA-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":16},{\"unified\":\"1F9DA-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":22},{\"unified\":\"1F9DA\",\"name\":\"FAIRY\",\"short_names\":[\"fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":28},{\"unified\":\"1F9DB-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":34},{\"unified\":\"1F9DB-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":40},{\"unified\":\"1F9DB\",\"name\":\"VAMPIRE\",\"short_names\":[\"vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":46},{\"unified\":\"1F9DC-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"mermaid\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":52},{\"unified\":\"1F9DC-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"merman\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":5},{\"unified\":\"1F9DC\",\"name\":\"MERPERSON\",\"short_names\":[\"merperson\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":11},{\"unified\":\"1F9DD-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":17},{\"unified\":\"1F9DD-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":23},{\"unified\":\"1F9DD\",\"name\":\"ELF\",\"short_names\":[\"elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":29},{\"unified\":\"1F9DE-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":35},{\"unified\":\"1F9DE-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":36},{\"unified\":\"1F9DE\",\"name\":\"GENIE\",\"short_names\":[\"genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":37},{\"unified\":\"1F9DF-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":38},{\"unified\":\"1F9DF-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":39},{\"unified\":\"1F9DF\",\"name\":\"ZOMBIE\",\"short_names\":[\"zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":40},{\"unified\":\"1F9E0\",\"name\":\"BRAIN\",\"short_names\":[\"brain\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":41},{\"unified\":\"1F9E1\",\"name\":\"ORANGE HEART\",\"short_names\":[\"orange_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":42},{\"unified\":\"1F9E2\",\"name\":\"BILLED CAP\",\"short_names\":[\"billed_cap\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":43},{\"unified\":\"1F9E3\",\"name\":\"SCARF\",\"short_names\":[\"scarf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":44},{\"unified\":\"1F9E4\",\"name\":\"GLOVES\",\"short_names\":[\"gloves\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":45},{\"unified\":\"1F9E5\",\"name\":\"COAT\",\"short_names\":[\"coat\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":46},{\"unified\":\"1F9E6\",\"name\":\"SOCKS\",\"short_names\":[\"socks\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":47},{\"unified\":\"1F9E7\",\"name\":\"RED GIFT ENVELOPE\",\"short_names\":[\"red_envelope\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":48},{\"unified\":\"1F9E8\",\"name\":\"FIRECRACKER\",\"short_names\":[\"firecracker\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":49},{\"unified\":\"1F9E9\",\"name\":\"JIGSAW PUZZLE PIECE\",\"short_names\":[\"jigsaw\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":50},{\"unified\":\"1F9EA\",\"name\":\"TEST TUBE\",\"short_names\":[\"test_tube\"],\"category\":\"Objects\",\"sheet_x\":47,\"sheet_y\":51},{\"unified\":\"1F9EB\",\"name\":\"PETRI DISH\",\"short_names\":[\"petri_dish\"],\"category\":\"Objects\",\"sheet_x\":47,\"sheet_y\":52},{\"unified\":\"1F9EC\",\"name\":\"DNA DOUBLE HELIX\",\"short_names\":[\"dna\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":0},{\"unified\":\"1F9ED\",\"name\":\"COMPASS\",\"short_names\":[\"compass\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":1},{\"unified\":\"1F9EE\",\"name\":\"ABACUS\",\"short_names\":[\"abacus\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":2},{\"unified\":\"1F9EF\",\"name\":\"FIRE EXTINGUISHER\",\"short_names\":[\"fire_extinguisher\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":3},{\"unified\":\"1F9F0\",\"name\":\"TOOLBOX\",\"short_names\":[\"toolbox\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":4},{\"unified\":\"1F9F1\",\"name\":\"BRICK\",\"short_names\":[\"bricks\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":5},{\"unified\":\"1F9F2\",\"name\":\"MAGNET\",\"short_names\":[\"magnet\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":6},{\"unified\":\"1F9F3\",\"name\":\"LUGGAGE\",\"short_names\":[\"luggage\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":7},{\"unified\":\"1F9F4\",\"name\":\"LOTION BOTTLE\",\"short_names\":[\"lotion_bottle\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":8},{\"unified\":\"1F9F5\",\"name\":\"SPOOL OF THREAD\",\"short_names\":[\"thread\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":9},{\"unified\":\"1F9F6\",\"name\":\"BALL OF YARN\",\"short_names\":[\"yarn\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":10},{\"unified\":\"1F9F7\",\"name\":\"SAFETY PIN\",\"short_names\":[\"safety_pin\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":11},{\"unified\":\"1F9F8\",\"name\":\"TEDDY BEAR\",\"short_names\":[\"teddy_bear\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":12},{\"unified\":\"1F9F9\",\"name\":\"BROOM\",\"short_names\":[\"broom\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":13},{\"unified\":\"1F9FA\",\"name\":\"BASKET\",\"short_names\":[\"basket\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":14},{\"unified\":\"1F9FB\",\"name\":\"ROLL OF PAPER\",\"short_names\":[\"roll_of_paper\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":15},{\"unified\":\"1F9FC\",\"name\":\"BAR OF SOAP\",\"short_names\":[\"soap\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":16},{\"unified\":\"1F9FD\",\"name\":\"SPONGE\",\"short_names\":[\"sponge\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":17},{\"unified\":\"1F9FE\",\"name\":\"RECEIPT\",\"short_names\":[\"receipt\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":18},{\"unified\":\"1F9FF\",\"name\":\"NAZAR AMULET\",\"short_names\":[\"nazar_amulet\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":19},{\"unified\":\"203C-FE0F\",\"name\":\"DOUBLE EXCLAMATION MARK\",\"short_names\":[\"bangbang\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":20},{\"unified\":\"2049-FE0F\",\"name\":\"EXCLAMATION QUESTION MARK\",\"short_names\":[\"interrobang\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":21},{\"unified\":\"2122-FE0F\",\"name\":\"TRADE MARK SIGN\",\"short_names\":[\"tm\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":22},{\"unified\":\"2139-FE0F\",\"name\":\"INFORMATION SOURCE\",\"short_names\":[\"information_source\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":23},{\"unified\":\"2194-FE0F\",\"name\":\"LEFT RIGHT ARROW\",\"short_names\":[\"left_right_arrow\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":24},{\"unified\":\"2195-FE0F\",\"name\":\"UP DOWN ARROW\",\"short_names\":[\"arrow_up_down\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":25},{\"unified\":\"2196-FE0F\",\"name\":\"NORTH WEST ARROW\",\"short_names\":[\"arrow_upper_left\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":26},{\"unified\":\"2197-FE0F\",\"name\":\"NORTH EAST ARROW\",\"short_names\":[\"arrow_upper_right\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":27},{\"unified\":\"2198-FE0F\",\"name\":\"SOUTH EAST ARROW\",\"short_names\":[\"arrow_lower_right\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":28},{\"unified\":\"2199-FE0F\",\"name\":\"SOUTH WEST ARROW\",\"short_names\":[\"arrow_lower_left\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":29},{\"unified\":\"21A9-FE0F\",\"name\":\"LEFTWARDS ARROW WITH HOOK\",\"short_names\":[\"leftwards_arrow_with_hook\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":30},{\"unified\":\"21AA-FE0F\",\"name\":\"RIGHTWARDS ARROW WITH HOOK\",\"short_names\":[\"arrow_right_hook\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":31},{\"unified\":\"231A\",\"name\":\"WATCH\",\"short_names\":[\"watch\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":32},{\"unified\":\"231B\",\"name\":\"HOURGLASS\",\"short_names\":[\"hourglass\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":33},{\"unified\":\"2328-FE0F\",\"name\":null,\"short_names\":[\"keyboard\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":34},{\"unified\":\"23CF-FE0F\",\"name\":null,\"short_names\":[\"eject\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":35},{\"unified\":\"23E9\",\"name\":\"BLACK RIGHT-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"fast_forward\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":36},{\"unified\":\"23EA\",\"name\":\"BLACK LEFT-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"rewind\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":37},{\"unified\":\"23EB\",\"name\":\"BLACK UP-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"arrow_double_up\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":38},{\"unified\":\"23EC\",\"name\":\"BLACK DOWN-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"arrow_double_down\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":39},{\"unified\":\"23ED-FE0F\",\"name\":null,\"short_names\":[\"black_right_pointing_double_triangle_with_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":40},{\"unified\":\"23EE-FE0F\",\"name\":null,\"short_names\":[\"black_left_pointing_double_triangle_with_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":41},{\"unified\":\"23EF-FE0F\",\"name\":null,\"short_names\":[\"black_right_pointing_triangle_with_double_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":42},{\"unified\":\"23F0\",\"name\":\"ALARM CLOCK\",\"short_names\":[\"alarm_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":43},{\"unified\":\"23F1-FE0F\",\"name\":null,\"short_names\":[\"stopwatch\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":44},{\"unified\":\"23F2-FE0F\",\"name\":null,\"short_names\":[\"timer_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":45},{\"unified\":\"23F3\",\"name\":\"HOURGLASS WITH FLOWING SAND\",\"short_names\":[\"hourglass_flowing_sand\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":46},{\"unified\":\"23F8-FE0F\",\"name\":null,\"short_names\":[\"double_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":47},{\"unified\":\"23F9-FE0F\",\"name\":null,\"short_names\":[\"black_square_for_stop\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":48},{\"unified\":\"23FA-FE0F\",\"name\":null,\"short_names\":[\"black_circle_for_record\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":49},{\"unified\":\"24C2-FE0F\",\"name\":\"CIRCLED LATIN CAPITAL LETTER M\",\"short_names\":[\"m\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":50},{\"unified\":\"25AA-FE0F\",\"name\":\"BLACK SMALL SQUARE\",\"short_names\":[\"black_small_square\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":51},{\"unified\":\"25AB-FE0F\",\"name\":\"WHITE SMALL SQUARE\",\"short_names\":[\"white_small_square\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":52},{\"unified\":\"25B6-FE0F\",\"name\":\"BLACK RIGHT-POINTING TRIANGLE\",\"short_names\":[\"arrow_forward\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":0},{\"unified\":\"25C0-FE0F\",\"name\":\"BLACK LEFT-POINTING TRIANGLE\",\"short_names\":[\"arrow_backward\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":1},{\"unified\":\"25FB-FE0F\",\"name\":\"WHITE MEDIUM SQUARE\",\"short_names\":[\"white_medium_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":2},{\"unified\":\"25FC-FE0F\",\"name\":\"BLACK MEDIUM SQUARE\",\"short_names\":[\"black_medium_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":3},{\"unified\":\"25FD\",\"name\":\"WHITE MEDIUM SMALL SQUARE\",\"short_names\":[\"white_medium_small_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":4},{\"unified\":\"25FE\",\"name\":\"BLACK MEDIUM SMALL SQUARE\",\"short_names\":[\"black_medium_small_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":5},{\"unified\":\"2600-FE0F\",\"name\":\"BLACK SUN WITH RAYS\",\"short_names\":[\"sunny\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":6},{\"unified\":\"2601-FE0F\",\"name\":\"CLOUD\",\"short_names\":[\"cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":7},{\"unified\":\"2602-FE0F\",\"name\":null,\"short_names\":[\"umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":8},{\"unified\":\"2603-FE0F\",\"name\":null,\"short_names\":[\"snowman\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":9},{\"unified\":\"2604-FE0F\",\"name\":null,\"short_names\":[\"comet\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":10},{\"unified\":\"260E-FE0F\",\"name\":\"BLACK TELEPHONE\",\"short_names\":[\"phone\",\"telephone\"],\"category\":\"Objects\",\"sheet_x\":49,\"sheet_y\":11},{\"unified\":\"2611-FE0F\",\"name\":\"BALLOT BOX WITH CHECK\",\"short_names\":[\"ballot_box_with_check\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":12},{\"unified\":\"2614\",\"name\":\"UMBRELLA WITH RAIN DROPS\",\"short_names\":[\"umbrella_with_rain_drops\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":13},{\"unified\":\"2615\",\"name\":\"HOT BEVERAGE\",\"short_names\":[\"coffee\"],\"category\":\"Food & Drink\",\"sheet_x\":49,\"sheet_y\":14},{\"unified\":\"2618-FE0F\",\"name\":null,\"short_names\":[\"shamrock\"],\"category\":\"Animals & Nature\",\"sheet_x\":49,\"sheet_y\":15},{\"unified\":\"261D-FE0F\",\"name\":\"WHITE UP POINTING INDEX\",\"short_names\":[\"point_up\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":16},{\"unified\":\"2620-FE0F\",\"name\":null,\"short_names\":[\"skull_and_crossbones\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":22},{\"unified\":\"2622-FE0F\",\"name\":null,\"short_names\":[\"radioactive_sign\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":23},{\"unified\":\"2623-FE0F\",\"name\":null,\"short_names\":[\"biohazard_sign\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":24},{\"unified\":\"2626-FE0F\",\"name\":null,\"short_names\":[\"orthodox_cross\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":25},{\"unified\":\"262A-FE0F\",\"name\":null,\"short_names\":[\"star_and_crescent\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":26},{\"unified\":\"262E-FE0F\",\"name\":null,\"short_names\":[\"peace_symbol\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":27},{\"unified\":\"262F-FE0F\",\"name\":null,\"short_names\":[\"yin_yang\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":28},{\"unified\":\"2638-FE0F\",\"name\":null,\"short_names\":[\"wheel_of_dharma\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":29},{\"unified\":\"2639-FE0F\",\"name\":null,\"short_names\":[\"white_frowning_face\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":30},{\"unified\":\"263A-FE0F\",\"name\":\"WHITE SMILING FACE\",\"short_names\":[\"relaxed\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":31},{\"unified\":\"2648\",\"name\":\"ARIES\",\"short_names\":[\"aries\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":34},{\"unified\":\"2649\",\"name\":\"TAURUS\",\"short_names\":[\"taurus\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":35},{\"unified\":\"264A\",\"name\":\"GEMINI\",\"short_names\":[\"gemini\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":36},{\"unified\":\"264B\",\"name\":\"CANCER\",\"short_names\":[\"cancer\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":37},{\"unified\":\"264C\",\"name\":\"LEO\",\"short_names\":[\"leo\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":38},{\"unified\":\"264D\",\"name\":\"VIRGO\",\"short_names\":[\"virgo\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":39},{\"unified\":\"264E\",\"name\":\"LIBRA\",\"short_names\":[\"libra\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":40},{\"unified\":\"264F\",\"name\":\"SCORPIUS\",\"short_names\":[\"scorpius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":41},{\"unified\":\"2650\",\"name\":\"SAGITTARIUS\",\"short_names\":[\"sagittarius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":42},{\"unified\":\"2651\",\"name\":\"CAPRICORN\",\"short_names\":[\"capricorn\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":43},{\"unified\":\"2652\",\"name\":\"AQUARIUS\",\"short_names\":[\"aquarius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":44},{\"unified\":\"2653\",\"name\":\"PISCES\",\"short_names\":[\"pisces\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":45},{\"unified\":\"2660-FE0F\",\"name\":\"BLACK SPADE SUIT\",\"short_names\":[\"spades\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":47},{\"unified\":\"2663-FE0F\",\"name\":\"BLACK CLUB SUIT\",\"short_names\":[\"clubs\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":48},{\"unified\":\"2665-FE0F\",\"name\":\"BLACK HEART SUIT\",\"short_names\":[\"hearts\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":49},{\"unified\":\"2666-FE0F\",\"name\":\"BLACK DIAMOND SUIT\",\"short_names\":[\"diamonds\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":50},{\"unified\":\"2668-FE0F\",\"name\":\"HOT SPRINGS\",\"short_names\":[\"hotsprings\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":51},{\"unified\":\"267B-FE0F\",\"name\":\"BLACK UNIVERSAL RECYCLING SYMBOL\",\"short_names\":[\"recycle\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":52},{\"unified\":\"267F\",\"name\":\"WHEELCHAIR SYMBOL\",\"short_names\":[\"wheelchair\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":1},{\"unified\":\"2692-FE0F\",\"name\":null,\"short_names\":[\"hammer_and_pick\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":2},{\"unified\":\"2693\",\"name\":\"ANCHOR\",\"short_names\":[\"anchor\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":3},{\"unified\":\"2694-FE0F\",\"name\":null,\"short_names\":[\"crossed_swords\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":4},{\"unified\":\"2696-FE0F\",\"name\":null,\"short_names\":[\"scales\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":6},{\"unified\":\"2697-FE0F\",\"name\":null,\"short_names\":[\"alembic\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":7},{\"unified\":\"2699-FE0F\",\"name\":null,\"short_names\":[\"gear\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":8},{\"unified\":\"269B-FE0F\",\"name\":null,\"short_names\":[\"atom_symbol\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":9},{\"unified\":\"269C-FE0F\",\"name\":null,\"short_names\":[\"fleur_de_lis\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":10},{\"unified\":\"26A0-FE0F\",\"name\":\"WARNING SIGN\",\"short_names\":[\"warning\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":11},{\"unified\":\"26A1\",\"name\":\"HIGH VOLTAGE SIGN\",\"short_names\":[\"zap\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":12},{\"unified\":\"26AA\",\"name\":\"MEDIUM WHITE CIRCLE\",\"short_names\":[\"white_circle\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":13},{\"unified\":\"26AB\",\"name\":\"MEDIUM BLACK CIRCLE\",\"short_names\":[\"black_circle\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":14},{\"unified\":\"26B0-FE0F\",\"name\":null,\"short_names\":[\"coffin\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":15},{\"unified\":\"26B1-FE0F\",\"name\":null,\"short_names\":[\"funeral_urn\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":16},{\"unified\":\"26BD\",\"name\":\"SOCCER BALL\",\"short_names\":[\"soccer\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":17},{\"unified\":\"26BE\",\"name\":\"BASEBALL\",\"short_names\":[\"baseball\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":18},{\"unified\":\"26C4\",\"name\":\"SNOWMAN WITHOUT SNOW\",\"short_names\":[\"snowman_without_snow\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":19},{\"unified\":\"26C5\",\"name\":\"SUN BEHIND CLOUD\",\"short_names\":[\"partly_sunny\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":20},{\"unified\":\"26C8-FE0F\",\"name\":null,\"short_names\":[\"thunder_cloud_and_rain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":21},{\"unified\":\"26CE\",\"name\":\"OPHIUCHUS\",\"short_names\":[\"ophiuchus\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":22},{\"unified\":\"26CF-FE0F\",\"name\":null,\"short_names\":[\"pick\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":23},{\"unified\":\"26D1-FE0F\",\"name\":null,\"short_names\":[\"helmet_with_white_cross\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":24},{\"unified\":\"26D3-FE0F\",\"name\":null,\"short_names\":[\"chains\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":25},{\"unified\":\"26D4\",\"name\":\"NO ENTRY\",\"short_names\":[\"no_entry\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":26},{\"unified\":\"26E9-FE0F\",\"name\":null,\"short_names\":[\"shinto_shrine\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":27},{\"unified\":\"26EA\",\"name\":\"CHURCH\",\"short_names\":[\"church\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":28},{\"unified\":\"26F0-FE0F\",\"name\":null,\"short_names\":[\"mountain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":29},{\"unified\":\"26F1-FE0F\",\"name\":null,\"short_names\":[\"umbrella_on_ground\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":30},{\"unified\":\"26F2\",\"name\":\"FOUNTAIN\",\"short_names\":[\"fountain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":31},{\"unified\":\"26F3\",\"name\":\"FLAG IN HOLE\",\"short_names\":[\"golf\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":32},{\"unified\":\"26F4-FE0F\",\"name\":null,\"short_names\":[\"ferry\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":33},{\"unified\":\"26F5\",\"name\":\"SAILBOAT\",\"short_names\":[\"boat\",\"sailboat\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":34},{\"unified\":\"26F7-FE0F\",\"name\":null,\"short_names\":[\"skier\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":35},{\"unified\":\"26F8-FE0F\",\"name\":null,\"short_names\":[\"ice_skate\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":36},{\"unified\":\"26F9-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-bouncing-ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":37},{\"unified\":\"26F9-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-bouncing-ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":43},{\"unified\":\"26F9-FE0F\",\"name\":null,\"short_names\":[\"person_with_ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":49},{\"unified\":\"26FA\",\"name\":\"TENT\",\"short_names\":[\"tent\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":2},{\"unified\":\"26FD\",\"name\":\"FUEL PUMP\",\"short_names\":[\"fuelpump\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":3},{\"unified\":\"2702-FE0F\",\"name\":\"BLACK SCISSORS\",\"short_names\":[\"scissors\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":4},{\"unified\":\"2705\",\"name\":\"WHITE HEAVY CHECK MARK\",\"short_names\":[\"white_check_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":5},{\"unified\":\"2708-FE0F\",\"name\":\"AIRPLANE\",\"short_names\":[\"airplane\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":6},{\"unified\":\"2709-FE0F\",\"name\":\"ENVELOPE\",\"short_names\":[\"email\",\"envelope\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":7},{\"unified\":\"270A\",\"name\":\"RAISED FIST\",\"short_names\":[\"fist\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":8},{\"unified\":\"270B\",\"name\":\"RAISED HAND\",\"short_names\":[\"hand\",\"raised_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":14},{\"unified\":\"270C-FE0F\",\"name\":\"VICTORY HAND\",\"short_names\":[\"v\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":20},{\"unified\":\"270D-FE0F\",\"name\":null,\"short_names\":[\"writing_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":26},{\"unified\":\"270F-FE0F\",\"name\":\"PENCIL\",\"short_names\":[\"pencil2\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":32},{\"unified\":\"2712-FE0F\",\"name\":\"BLACK NIB\",\"short_names\":[\"black_nib\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":33},{\"unified\":\"2714-FE0F\",\"name\":\"HEAVY CHECK MARK\",\"short_names\":[\"heavy_check_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":34},{\"unified\":\"2716-FE0F\",\"name\":\"HEAVY MULTIPLICATION X\",\"short_names\":[\"heavy_multiplication_x\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":35},{\"unified\":\"271D-FE0F\",\"name\":null,\"short_names\":[\"latin_cross\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":36},{\"unified\":\"2721-FE0F\",\"name\":null,\"short_names\":[\"star_of_david\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":37},{\"unified\":\"2728\",\"name\":\"SPARKLES\",\"short_names\":[\"sparkles\"],\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":38},{\"unified\":\"2733-FE0F\",\"name\":\"EIGHT SPOKED ASTERISK\",\"short_names\":[\"eight_spoked_asterisk\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":39},{\"unified\":\"2734-FE0F\",\"name\":\"EIGHT POINTED BLACK STAR\",\"short_names\":[\"eight_pointed_black_star\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":40},{\"unified\":\"2744-FE0F\",\"name\":\"SNOWFLAKE\",\"short_names\":[\"snowflake\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":41},{\"unified\":\"2747-FE0F\",\"name\":\"SPARKLE\",\"short_names\":[\"sparkle\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":42},{\"unified\":\"274C\",\"name\":\"CROSS MARK\",\"short_names\":[\"x\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":43},{\"unified\":\"274E\",\"name\":\"NEGATIVE SQUARED CROSS MARK\",\"short_names\":[\"negative_squared_cross_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":44},{\"unified\":\"2753\",\"name\":\"BLACK QUESTION MARK ORNAMENT\",\"short_names\":[\"question\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":45},{\"unified\":\"2754\",\"name\":\"WHITE QUESTION MARK ORNAMENT\",\"short_names\":[\"grey_question\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":46},{\"unified\":\"2755\",\"name\":\"WHITE EXCLAMATION MARK ORNAMENT\",\"short_names\":[\"grey_exclamation\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":47},{\"unified\":\"2757\",\"name\":\"HEAVY EXCLAMATION MARK SYMBOL\",\"short_names\":[\"exclamation\",\"heavy_exclamation_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":48},{\"unified\":\"2763-FE0F\",\"name\":null,\"short_names\":[\"heavy_heart_exclamation_mark_ornament\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":49},{\"unified\":\"2764-FE0F\",\"name\":\"HEAVY BLACK HEART\",\"short_names\":[\"heart\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":50},{\"unified\":\"2795\",\"name\":\"HEAVY PLUS SIGN\",\"short_names\":[\"heavy_plus_sign\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":51},{\"unified\":\"2796\",\"name\":\"HEAVY MINUS SIGN\",\"short_names\":[\"heavy_minus_sign\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":52},{\"unified\":\"2797\",\"name\":\"HEAVY DIVISION SIGN\",\"short_names\":[\"heavy_division_sign\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":0},{\"unified\":\"27A1-FE0F\",\"name\":\"BLACK RIGHTWARDS ARROW\",\"short_names\":[\"arrow_right\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":1},{\"unified\":\"27B0\",\"name\":\"CURLY LOOP\",\"short_names\":[\"curly_loop\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":2},{\"unified\":\"27BF\",\"name\":\"DOUBLE CURLY LOOP\",\"short_names\":[\"loop\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":3},{\"unified\":\"2934-FE0F\",\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS\",\"short_names\":[\"arrow_heading_up\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":4},{\"unified\":\"2935-FE0F\",\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS\",\"short_names\":[\"arrow_heading_down\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":5},{\"unified\":\"2B05-FE0F\",\"name\":\"LEFTWARDS BLACK ARROW\",\"short_names\":[\"arrow_left\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":6},{\"unified\":\"2B06-FE0F\",\"name\":\"UPWARDS BLACK ARROW\",\"short_names\":[\"arrow_up\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":7},{\"unified\":\"2B07-FE0F\",\"name\":\"DOWNWARDS BLACK ARROW\",\"short_names\":[\"arrow_down\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":8},{\"unified\":\"2B1B\",\"name\":\"BLACK LARGE SQUARE\",\"short_names\":[\"black_large_square\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":9},{\"unified\":\"2B1C\",\"name\":\"WHITE LARGE SQUARE\",\"short_names\":[\"white_large_square\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":10},{\"unified\":\"2B50\",\"name\":\"WHITE MEDIUM STAR\",\"short_names\":[\"star\"],\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":11},{\"unified\":\"2B55\",\"name\":\"HEAVY LARGE CIRCLE\",\"short_names\":[\"o\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":12},{\"unified\":\"3030-FE0F\",\"name\":\"WAVY DASH\",\"short_names\":[\"wavy_dash\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":13},{\"unified\":\"303D-FE0F\",\"name\":\"PART ALTERNATION MARK\",\"short_names\":[\"part_alternation_mark\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":14},{\"unified\":\"3297-FE0F\",\"name\":\"CIRCLED IDEOGRAPH CONGRATULATION\",\"short_names\":[\"congratulations\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":15},{\"unified\":\"3299-FE0F\",\"name\":\"CIRCLED IDEOGRAPH SECRET\",\"short_names\":[\"secret\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":16}]\r\n };\r\n}\r\n\r\nConfig.Schema = Config.Schema || {};\r\n\r\nConfig.Schema.MTProto = {\"constructors\":[{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"85337187\",\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector<long>\"}],\"type\":\"ResPQ\"},{\"id\":\"-2083955988\",\"predicate\":\"p_q_inner_data\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"1013613780\",\"predicate\":\"p_q_inner_data_temp\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"2043348061\",\"predicate\":\"server_DH_params_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash\",\"type\":\"int128\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-790100132\",\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-1249309254\",\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":\"1715713620\",\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":\"1003222836\",\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1188831161\",\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-1499615742\",\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-212046591\",\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":\"558156313\",\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":\"1579864942\",\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-847714938\",\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1539647305\",\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"155834844\",\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":\"-1370486635\",\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector<future_salt>\"}],\"type\":\"FutureSalts\"},{\"id\":\"880243653\",\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-501201412\",\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"1658015945\",\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1631450872\",\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":\"1945237724\",\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":\"1538843921\",\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":\"-530561358\",\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":\"812830625\",\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":\"1658238041\",\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsAck\"},{\"id\":\"-1477445615\",\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"-307542917\",\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"2105940488\",\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgResendReq\"},{\"id\":\"-630588590\",\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsStateReq\"},{\"id\":\"81704317\",\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":\"-1933520591\",\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":\"661470918\",\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"-2137147681\",\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"1973679973\",\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"}],\"methods\":[{\"id\":\"1615239032\",\"method\":\"req_pq\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":\"-686627650\",\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-184262881\",\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1491380032\",\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1188971260\",\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":\"2059302892\",\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-213746804\",\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":\"-414113498\",\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1835453025\",\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"}]};\r\n\r\nConfig.Schema.API = {\"constructors\":[{\"id\":\"-1132882121\",\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1720552011\",\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1072550713\",\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"-994444869\",\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":\"1450380236\",\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":\"2134579434\",\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"2107670217\",\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"396093539\",\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1182234929\",\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-138301121\",\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-208488460\",\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":\"-181407105\",\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"-1771768449\",\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":\"505969924\",\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1279654347\",\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-104578748\",\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":\"-122978821\",\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"480546647\",\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":\"-1837345356\",\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-1991004873\",\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-457104426\",\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":\"-206066487\",\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"}],\"type\":\"InputGeoPoint\"},{\"id\":\"483901197\",\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":\"1001634122\",\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":\"-539317279\",\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-1649296275\",\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1160714821\",\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1432995067\",\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1086091090\",\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"8322574\",\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-891180321\",\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"172975040\",\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1373745011\",\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1384777335\",\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1258941372\",\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1278304028\",\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"276907596\",\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"537022650\",\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"User\"},{\"id\":\"1326562017\",\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":\"-321430132\",\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"164646985\",\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-306628279\",\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"9203775\",\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"-1683826688\",\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Chat\"},{\"id\":\"1004149726\",\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":\"120753115\",\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":\"461151667\",\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector<BotInfo>\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"ChatFull\"},{\"id\":\"-925415106\",\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-57668565\",\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":\"1061556205\",\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChatParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":\"935395612\",\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":\"1197267925\",\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":\"-2082087340\",\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Message\"},{\"id\":\"1160515173\",\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector<RestrictionReason>\"}],\"type\":\"Message\"},{\"id\":\"-1642487306\",\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"}],\"type\":\"Message\"},{\"id\":\"1038967584\",\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"1766936791\",\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1457575028\",\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":\"-873313984\",\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1618676578\",\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"-1230047312\",\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1503425638\",\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1247687078\",\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"2144015272\",\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":\"-1780220945\",\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1217033015\",\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1297179892\",\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"739712882\",\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":\"590459437\",\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":\"-797637467\",\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":\"236446268\",\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":\"2009052699\",\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":\"-374917894\",\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"286776671\",\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":\"43446532\",\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"GeoPoint\"},{\"id\":\"1577067778\",\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-855308010\",\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-543777747\",\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-1195615476\",\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":\"423314455\",\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"1251338318\",\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-1673717362\",\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":\"-1353671392\",\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-2122045747\",\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1539849235\",\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":\"1490799288\",\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"505595789\",\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"777640226\",\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-1376497949\",\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-512463606\",\"predicate\":\"inputReportReasonOther\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"ReportReason\"},{\"id\":\"-302941166\",\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"user\",\"type\":\"User\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"UserFull\"},{\"id\":\"-116274796\",\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":\"-805141448\",\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":\"1444661369\",\"predicate\":\"contactBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ContactBlocked\"},{\"id\":\"-748155807\",\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":\"-1219778094\",\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":\"-353862078\",\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<Contact>\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"2010127419\",\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector<ImportedContact>\"},{\"name\":\"popular_invites\",\"type\":\"Vector<PopularContact>\"},{\"name\":\"retry_contacts\",\"type\":\"Vector<long>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"471043349\",\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"-1878523231\",\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"364538944\",\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"1910543603\",\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-1938715001\",\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-923939298\",\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"1694474197\",\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-438840932\",\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-1269012015\",\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"1474492012\",\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1777752804\",\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1614803355\",\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1458172132\",\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1629621880\",\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"2129714567\",\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-3644025\",\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"522914557\",\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1318109142\",\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-1576161051\",\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1548249383\",\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"-1704596961\",\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"125178264\",\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":\"469489699\",\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":\"-1489818765\",\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"-1791935732\",\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"-1519637954\",\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":\"1567990072\",\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"16030880\",\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-1459938943\",\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-484987010\",\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"-1857044719\",\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"377562760\",\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"int\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"2027216577\",\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1918567619\",\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1957577280\",\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1916114267\",\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"352657236\",\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"539045032\",\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photo\"},{\"id\":\"157948117\",\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":\"414687501\",\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":\"856375399\",\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":\"-1910892683\",\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":\"497489295\",\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"help.AppUpdate\"},{\"id\":\"-1000708810\",\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":\"415997816\",\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":\"314359194\",\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"386986326\",\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1264392051\",\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"956179895\",\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1417756512\",\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1006044124\",\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-931638658\",\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-94974410\",\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"332848423\",\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-247351839\",\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":\"-1038136962\",\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":\"1248893260\",\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":\"406307684\",\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":\"1690108678\",\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"1511503333\",\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-182231723\",\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-317144808\",\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"594758406\",\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"-1058912715\",\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"740433629\",\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"1443858741\",\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1802240206\",\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-95482955\",\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"767652808\",\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-364179876\",\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1851755554\",\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1906403213\",\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"}],\"type\":\"Update\"},{\"id\":\"1530447553\",\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"598418386\",\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1666158377\",\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1928391342\",\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":\"448771445\",\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":\"-1160743548\",\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":\"922273905\",\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":\"-1683841855\",\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector<PhotoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"Document\"},{\"id\":\"398898678\",\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":\"-1613493288\",\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":\"-1261946036\",\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-1073230141\",\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-2131957734\",\"predicate\":\"updateUserBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"-1094555409\",\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":\"381645902\",\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-44119819\",\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1584933265\",\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-378127636\",\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-718310409\",\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-212740181\",\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-774682074\",\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-1441998364\",\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"393186209\",\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"1653390447\",\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1290580579\",\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector<Peer>\"},{\"name\":\"results\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Found\"},{\"id\":\"-337352679\",\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"Update\"},{\"id\":\"-496024847\",\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"129960444\",\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"2011940674\",\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-298113238\",\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"}],\"type\":\"Update\"},{\"id\":\"1335282456\",\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-1137792208\",\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"218751099\",\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"407582158\",\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"320652927\",\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"195371015\",\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-697604407\",\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-1877932953\",\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"-123988\",\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1698855810\",\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1297858060\",\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-125240806\",\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"-1955338397\",\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"209668535\",\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"1352683077\",\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-1194283041\",\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":\"314130811\",\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"1815593308\",\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"297109817\",\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1662637586\",\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"250621158\",\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-1739392570\",\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"358154344\",\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-244016606\",\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":\"-463889475\",\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.Stickers\"},{\"id\":\"313694676\",\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector<long>\"}],\"type\":\"StickerPack\"},{\"id\":\"-395967805\",\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":\"-302170017\",\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSet>\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-1667805217\",\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"791617983\",\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-2066640507\",\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"2139689491\",\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-350980120\",\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":\"-981018084\",\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"-94051982\",\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"documents\",\"type\":\"flags.11?Vector<Document>\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"}],\"type\":\"WebPage\"},{\"id\":\"-1557277184\",\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1392388579\",\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":\"307276766\",\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<Authorization>\"}],\"type\":\"account.Authorizations\"},{\"id\":\"-1390001672\",\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"}],\"type\":\"account.Password\"},{\"id\":\"-1705233435\",\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-1036572727\",\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":\"326715557\",\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"-1052959727\",\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"784356159\",\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1551583367\",\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":\"1776236393\",\"predicate\":\"chatInviteEmpty\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":\"-64092740\",\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1516793212\",\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":\"-540871282\",\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector<User>\"}],\"type\":\"ChatInvite\"},{\"id\":\"-123931160\",\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1757493555\",\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-4838507\",\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":\"-1645763991\",\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-2044933984\",\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-290164953\",\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.4?PhotoSize\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":\"-1240849242\",\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-1820043071\",\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector<RestrictionReason>\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":\"-1032140601\",\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":\"-1729618630\",\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"BotInfo\"},{\"id\":\"-1560655744\",\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"2002815875\",\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector<KeyboardButton>\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":\"-1606526075\",\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"-200242528\",\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"889353612\",\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"2072935910\",\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"-668391402\",\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":\"-1148011883\",\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-100378723\",\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1868782349\",\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1827637959\",\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1859134776\",\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1692693954\",\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1117713463\",\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-2106619040\",\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"681706865\",\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1938967520\",\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"1990644519\",\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"301019932\",\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"-292807034\",\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":\"-1343524562\",\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":\"-1109531342\",\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"548253432\",\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"-753232354\",\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector<RestrictionReason>\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":\"681420594\",\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":\"2131196633\",\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"763976820\",\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.12?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?int\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?int\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"ChatFull\"},{\"id\":\"182649427\",\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":\"-1725551049\",\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1781355374\",\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"-352032773\",\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":\"-1227598250\",\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1656358105\",\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"856380452\",\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1015733815\",\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1734268085\",\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1041346555\",\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1531132162\",\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"543450958\",\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1798033689\",\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"-847783593\",\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector<MessageRange>\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"367766557\",\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-1557620115\",\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-2138237532\",\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-566281095\",\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1268741783\",\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1548400251\",\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-177282392\",\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChannelParticipant>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"-791039645\",\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"-636267638\",\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-489233354\",\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-1232070311\",\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1371385889\",\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1336546578\",\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1328445861\",\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"2013922064\",\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":\"1753886890\",\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":\"196268545\",\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":\"1135492588\",\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":\"372165663\",\"predicate\":\"foundGif\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"thumb_url\",\"type\":\"string\"},{\"name\":\"content_url\",\"type\":\"string\"},{\"name\":\"content_type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"FoundGif\"},{\"id\":\"-1670052855\",\"predicate\":\"foundGifCached\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"FoundGif\"},{\"id\":\"1212395773\",\"predicate\":\"inputMediaGifExternal\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"1158290442\",\"predicate\":\"messages.foundGifs\",\"params\":[{\"name\":\"next_offset\",\"type\":\"int\"},{\"name\":\"results\",\"type\":\"Vector<FoundGif>\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-402498398\",\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":\"772213157\",\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"gifs\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"-1821035490\",\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":\"864077702\",\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"1036876423\",\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-2000710887\",\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"1984755728\",\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1937807902\",\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"295067450\",\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1803769784\",\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector<BotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.BotResults\"},{\"id\":\"1417832080\",\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"239663460\",\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":\"1358283666\",\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"928101534\",\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1107622874\",\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1343122938\",\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"1571494644\",\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"-332168592\",\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"flags.1?int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"}],\"type\":\"MessageFwdHeader\"},{\"id\":\"457133559\",\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1738988427\",\"predicate\":\"updateChannelPinnedMessage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1799538451\",\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1923290508\",\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1948046307\",\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"577556219\",\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1035688326\",\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1073693790\",\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"1398007207\",\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1425815847\",\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"629866245\",\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1748655686\",\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1318425559\",\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-59151553\",\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"90744648\",\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1218642516\",\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"911761060\",\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-415938591\",\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"649453030\",\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"-469536605\",\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1045340827\",\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"1098628881\",\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1494368259\",\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1222451611\",\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1970903652\",\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"416402882\",\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1462213465\",\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"-459324\",\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"400266251\",\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1995686519\",\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":\"-103646630\",\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"1008755359\",\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":\"863093588\",\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-305282981\",\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":\"-1419371685\",\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"344356834\",\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"104314861\",\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-1122524854\",\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"371037736\",\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-75283823\",\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector<TopPeer>\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":\"-567906571\",\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":\"1891070632\",\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector<TopPeerCategoryPeers>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"892193368\",\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"546203849\",\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":\"975236280\",\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"634833351\",\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-299124375\",\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":\"453805082\",\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":\"-40996577\",\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":\"-1615153660\",\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"82699215\",\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"-123893531\",\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"},{\"name\":\"unread\",\"type\":\"Vector<long>\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1461528386\",\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"186120336\",\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":\"586395571\",\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"},{\"name\":\"dates\",\"type\":\"Vector<int>\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"-1706939360\",\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"1338747336\",\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"946083368\",\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"904138920\",\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"1678812626\",\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1574314746\",\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":\"861169551\",\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-440664550\",\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-78455655\",\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"872932635\",\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1361650766\",\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":\"-1744710921\",\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1251549527\",\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"70813275\",\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"-1107729093\",\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":\"1336154098\",\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"1262639204\",\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-38694904\",\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":\"-750828557\",\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":\"53231223\",\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":\"-1020139510\",\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":\"1358175439\",\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1834538890\",\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1493171408\",\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":\"-1707344487\",\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector<HighScore>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.HighScores\"},{\"id\":\"1258196845\",\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"1081547008\",\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1663561404\",\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-599948721\",\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":\"1950782688\",\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"1730456516\",\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-653089380\",\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1054465340\",\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1678197867\",\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1816074681\",\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1009288385\",\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":\"-564523562\",\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"2120376535\",\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector<RichText>\"}],\"type\":\"RichText\"},{\"id\":\"324435594\",\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"1890305021\",\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1879401953\",\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1162877472\",\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":\"-1076861716\",\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-248793375\",\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1182402406\",\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1066346178\",\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"1216809369\",\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-618614392\",\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"-837994576\",\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"-454524911\",\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListItem>\"}],\"type\":\"PageBlock\"},{\"id\":\"641563686\",\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1329878739\",\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"391759200\",\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":\"2089805750\",\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"972174080\",\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":\"-1468953147\",\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-229005301\",\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"1705048653\",\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"52401552\",\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-2054908813\",\"predicate\":\"webPageNotModified\",\"params\":[],\"type\":\"WebPage\"},{\"id\":\"-88417185\",\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1030105979\",\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-580219064\",\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-2048646399\",\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-527056480\",\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"1471006352\",\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-84416311\",\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"1852826908\",\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":\"-99664734\",\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector<DialogPeer>\"}],\"type\":\"Update\"},{\"id\":\"2104790276\",\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":\"-2095595325\",\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":\"-1684914010\",\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-886477832\",\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":\"-1022713000\",\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"Invoice\"},{\"id\":\"-186607933\",\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"-368917890\",\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":\"-1892568281\",\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":\"-2074799289\",\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"512535275\",\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":\"-1868808300\",\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":\"-1344716869\",\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1080663248\",\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":\"-842892769\",\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":\"475467473\",\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":\"-1678949555\",\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"InputWebDocument\"},{\"id\":\"-1036396922\",\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":\"568808380\",\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":\"1062645411\",\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-784000893\",\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"1314881805\",\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1342771681\",\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"-74456004\",\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":\"-1056001329\",\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"873977640\",\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-614138572\",\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"-1239335713\",\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"ShippingOption\"},{\"id\":\"-523384512\",\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":\"1563376297\",\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-6249322\",\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":\"-1425052898\",\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":\"506920429\",\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":\"1399245077\",\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":\"462375633\",\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-2014659757\",\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1719909046\",\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"-2025673089\",\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector<PhoneConnection>\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":\"1355435489\",\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1655957568\",\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":\"-1564789301\",\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":\"-326966976\",\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"-2134272152\",\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":\"-2132731265\",\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":\"2054952868\",\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1253451181\",\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1997373508\",\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"608050278\",\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-242427324\",\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector<FileHash>\"}],\"type\":\"upload.File\"},{\"id\":\"-290921362\",\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-1449145777\",\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-914167110\",\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":\"1462101002\",\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector<CdnPublicKey>\"}],\"type\":\"CdnConfig\"},{\"id\":\"-283684427\",\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":\"-892239370\",\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"1816636575\",\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"695856818\",\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"-209337866\",\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector<LangPackString>\"}],\"type\":\"LangPackDifference\"},{\"id\":\"-288727837\",\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":\"1180041828\",\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"1442983757\",\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":\"-859915345\",\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?int\"},{\"name\":\"promoted_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"470789295\",\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"kicked_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"338142689\",\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"106343499\",\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-421545947\",\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1427671598\",\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1783299128\",\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1129042607\",\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"460916654\",\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"648939889\",\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-370660328\",\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1889215493\",\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1121994683\",\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"405815507\",\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-124291086\",\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-484690728\",\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-422036098\",\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-714643696\",\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"995769920\",\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":\"-309659827\",\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<ChannelAdminLogEvent>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"-368018716\",\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":\"511092620\",\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-2143067670\",\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"1558266229\",\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":\"1200788123\",\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1634752813\",\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":\"-209768682\",\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-451831443\",\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1987495099\",\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":\"-1040652646\",\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1887741886\",\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1312568665\",\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-85549226\",\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"178373535\",\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-905587442\",\"predicate\":\"inputPaymentCredentialsAndroidPay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"},{\"name\":\"google_transaction_id\",\"type\":\"string\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-419271411\",\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-530392189\",\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1893427255\",\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1599903217\",\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-833715459\",\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"2084316681\",\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1189204285\",\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1917045962\",\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1608834311\",\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-347535331\",\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1140172836\",\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"235081943\",\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector<RecentMeUrl>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-266911767\",\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1951620897\",\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"482797855\",\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector<MessageEntity>\"}],\"type\":\"InputSingleMedia\"},{\"id\":\"-892779534\",\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":\"-313079300\",\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<WebAuthorization>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":\"-1502174430\",\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":\"-1160215659\",\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":\"-2037963464\",\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":\"-1687559349\",\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1280209983\",\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1410748418\",\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"-55902537\",\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":\"-445792507\",\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":\"223655517\",\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"1359533640\",\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"1648543603\",\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":\"-104284986\",\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":\"1968737087\",\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":\"-526508104\",\"predicate\":\"help.proxyDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.ProxyData\"},{\"id\":\"737668643\",\"predicate\":\"help.proxyDataPromo\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.ProxyData\"},{\"id\":\"-483352705\",\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"686618977\",\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"859091184\",\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":\"1399317950\",\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":\"-876089816\",\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"1679398724\",\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":\"-534283678\",\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":\"-1964327229\",\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":\"2103482845\",\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":\"569137759\",\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":\"-1658158621\",\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"1034709504\",\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"115615172\",\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1596951477\",\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1717268701\",\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-874308058\",\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-63531698\",\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1995211763\",\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1954007928\",\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1713143702\",\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-368907213\",\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1289704741\",\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1908627474\",\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"411017418\",\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<SecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<SecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":\"-618540889\",\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<InputSecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<InputSecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":\"-316748368\",\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":\"-391902247\",\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"12467706\",\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-2037765467\",\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-449327402\",\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"2054162547\",\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"1717706985\",\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"871426631\",\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":\"-1389486888\",\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector<SecureRequiredType>\"},{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":\"-2128640689\",\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":\"455635795\",\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":\"-648257196\",\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"MessageAction\"},{\"id\":\"1722786150\",\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"1783556146\",\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"289586518\",\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":\"1304052993\",\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":\"700340377\",\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":\"-513517117\",\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":\"-253500010\",\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-1625153079\",\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":\"-1255369827\",\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":\"-1685456582\",\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-732254058\",\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":\"4883767\",\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"-1141711456\",\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"-2042159726\",\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"354925740\",\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":\"982592842\",\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":\"-1736378792\",\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":\"-763367294\",\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":\"-2036501105\",\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-1592506512\",\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"878931416\",\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-2103600678\",\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":\"41187252\",\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureRequiredType>\"}],\"type\":\"SecureRequiredType\"},{\"id\":\"-1078332329\",\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":\"-1600596305\",\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":\"488313413\",\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":\"-1059185703\",\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":\"1064139624\",\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":\"-952869270\",\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":\"736157604\",\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":\"-1222740358\",\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":\"-146520221\",\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONValue>\"}],\"type\":\"JSONValue\"},{\"id\":\"-1715350371\",\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONObjectValue>\"}],\"type\":\"JSONValue\"},{\"id\":\"1279515160\",\"predicate\":\"updateUserPinnedMessage\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-519195831\",\"predicate\":\"updateChatPinnedMessage\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1311015810\",\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-703403793\",\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-311786236\",\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-939827711\",\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"55281185\",\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"483104362\",\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"136105807\",\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":\"504660880\",\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"878078826\",\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":\"-524237339\",\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector<PageTableCell>\"}],\"type\":\"PageTableRow\"},{\"id\":\"-1085412734\",\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector<PageTableRow>\"}],\"type\":\"PageBlock\"},{\"id\":\"1869903447\",\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":\"-1188055347\",\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":\"635466748\",\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListItem\"},{\"id\":\"1577484359\",\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":\"-1730311882\",\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListOrderedItem\"},{\"id\":\"-1702174239\",\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListOrderedItem>\"}],\"type\":\"PageBlock\"},{\"id\":\"1987480557\",\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1282352120\",\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":\"370236054\",\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector<PageRelatedArticle>\"}],\"type\":\"PageBlock\"},{\"id\":\"-1538310410\",\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-1366746132\",\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"Page\"},{\"id\":\"-610373422\",\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"961092808\",\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"894777186\",\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"-1945767479\",\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":\"-206688531\",\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":\"32192344\",\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":\"-202219658\",\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1398708869\",\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":\"1823064809\",\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":\"-716006138\",\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector<PollAnswer>\"}],\"type\":\"Poll\"},{\"id\":\"997055186\",\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":\"1465219162\",\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector<PollAnswerVoters>\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"}],\"type\":\"PollResults\"},{\"id\":\"112424539\",\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"}],\"type\":\"InputMedia\"},{\"id\":\"1272375192\",\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":\"-264117680\",\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":\"1202287072\",\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":\"-525288402\",\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"1605510357\",\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":\"-1626209256\",\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":\"1421875280\",\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-433014407\",\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":\"1913199744\",\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":\"-1150621555\",\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"771095562\",\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-1895328189\",\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"471437699\",\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":\"1881892265\",\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"wallpapers\",\"type\":\"Vector<WallPaper>\"}],\"type\":\"account.WallPapers\"},{\"id\":\"-557924733\",\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"}],\"type\":\"CodeSettings\"},{\"id\":\"-1590738760\",\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":\"-767099577\",\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":\"1674235686\",\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":\"-709641735\",\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":\"594408994\",\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":\"1556570557\",\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector<EmojiKeyword>\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"-1519029347\",\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":\"-1275374751\",\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":\"-1529000952\",\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1777096355\",\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"1461304012\",\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-1777000467\",\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-1132476723\",\"predicate\":\"fileLocationToBeDeprecated\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"FileLocation\"},{\"id\":\"1075322878\",\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-667654413\",\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"668375447\",\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":\"230353641\",\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-11252123\",\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":\"1908216652\",\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":\"1684014375\",\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":\"1363483106\",\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":\"-70073706\",\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":\"-373643672\",\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":\"422972864\",\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<FolderPeer>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"756118935\",\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"InputUser\"},{\"id\":\"707290417\",\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"InputChannel\"},{\"id\":\"398123750\",\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1667893317\",\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"55761658\",\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-778378131\",\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-1472172887\",\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-68239120\",\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-1569748965\",\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-398136321\",\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":\"280464681\",\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-802258988\",\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1831650802\",\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-1886646706\",\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-1445536993\",\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":\"1283572154\",\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"-668769361\",\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"415136107\",\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-1397881200\",\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-1672577397\",\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1090087980\",\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"34469328\",\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1786671974\",\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":\"-1078612597\",\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":\"547062491\",\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":\"-901375139\",\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":\"-1263546448\",\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<PeerLocated>\"}],\"type\":\"Update\"},{\"id\":\"241923758\",\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-606798099\",\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"1401984889\",\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1148485274\",\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-666824391\",\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"42402760\",\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":\"967122427\",\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":\"-1870238482\",\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":\"-797791052\",\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":\"1012306921\",\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":\"-175567375\",\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":\"1211967244\",\"predicate\":\"themeDocumentNotModified\",\"params\":[],\"type\":\"Theme\"},{\"id\":\"-136770336\",\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"installs_count\",\"type\":\"int\"}],\"type\":\"Theme\"},{\"id\":\"-199313886\",\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":\"2137482273\",\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"themes\",\"type\":\"Vector<Theme>\"}],\"type\":\"account.Themes\"},{\"id\":\"-2112423005\",\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":\"-786326563\",\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1124062251\",\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"}],\"methods\":[{\"id\":\"-878758099\",\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"1036301552\",\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1502141361\",\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-2131827673\",\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1126886015\",\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"1461180992\",\"method\":\"auth.logOut\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1616179942\",\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-440401971\",\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-470837741\",\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-841733627\",\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"1754754159\",\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"813089983\",\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2067899501\",\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":\"313765169\",\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-612493497\",\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"2018596725\",\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":\"1713919532\",\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1430579357\",\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.WallPapers\"},{\"id\":\"-1374118561\",\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"227648840\",\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Vector<User>\"},{\"id\":\"-902781519\",\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"UserFull\"},{\"id\":\"749357634\",\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"Vector<int>\"},{\"id\":\"-995929106\",\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector<ContactStatus>\"},{\"id\":\"-1071414113\",\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"746589157\",\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<InputContact>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"157945344\",\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":\"269745566\",\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector<string>\"}],\"type\":\"Bool\"},{\"id\":\"858475004\",\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-448724803\",\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-176409329\",\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"1673946374\",\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1594999949\",\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-591691168\",\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-2045448344\",\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputUser\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"238054714\",\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"469850889\",\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-443640366\",\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"94983360\",\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector<ReceivedNotifyMessage>\"},{\"id\":\"-1551737264\",\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":\"1376532592\",\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"881978281\",\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-637606386\",\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"grouped\",\"type\":\"flags.9?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"random_id\",\"type\":\"Vector<long>\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-820669733\",\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"913498268\",\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1115507112\",\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"1013621127\",\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"998448230\",\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-599447467\",\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-900957736\",\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"-106911223\",\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-530505962\",\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":\"164303470\",\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-304838614\",\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":\"630429265\",\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"-256159406\",\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"1328726168\",\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"photos.Photo\"},{\"id\":\"-2016444625\",\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputPhoto>\"}],\"type\":\"Vector<long>\"},{\"id\":\"-1291540959\",\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"-1319462148\",\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":\"-990308245\",\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":\"531836966\",\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":\"1378703997\",\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":\"1295590211\",\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":\"-1848823128\",\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":\"651135312\",\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"-162681021\",\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1035731989\",\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-304536635\",\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"2031374829\",\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2135648522\",\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-1451792525\",\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1701831834\",\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"852769188\",\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"1436924774\",\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":\"1259113487\",\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":\"-562337987\",\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"2018609336\",\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1663104819\",\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":\"916930423\",\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"655677548\",\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1040964988\",\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"301470424\",\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":\"-623130288\",\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-906486552\",\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<InputPrivacyRule>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"1099779595\",\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"150761757\",\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":\"608323678\",\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":\"-627372787\",\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-113456221\",\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"-2108208411\",\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1891839707\",\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"71126828\",\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Stickers\"},{\"id\":\"479598769\",\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"954152242\",\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1738800940\",\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1956073268\",\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"MessageMedia\"},{\"id\":\"-484392616\",\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":\"-545786948\",\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":\"1418342645\",\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":\"-1663767815\",\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-1516564433\",\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":\"-779399914\",\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-661144474\",\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"1319464594\",\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1080796745\",\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"234312524\",\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1051570619\",\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":\"1817183516\",\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"639215886\",\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-946871200\",\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"-110209570\",\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"-421563528\",\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-1877938321\",\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-993483427\",\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"Vector<int>\"},{\"id\":\"-871347913\",\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-2067661490\",\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"-787622117\",\"method\":\"channels.deleteUserHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-32999408\",\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-1383294429\",\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":\"306054633\",\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1416484774\",\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"176122811\",\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputChannel>\"}],\"type\":\"messages.Chats\"},{\"id\":\"141781513\",\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"1029681423\",\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":\"-751007486\",\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"1450044624\",\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-248621111\",\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"283557164\",\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"890549214\",\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"615851205\",\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"-130635115\",\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"429865580\",\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":\"-1072619549\",\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"51854712\",\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1444503762\",\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"363051235\",\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1083038300\",\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"2016638777\",\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"864953444\",\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":\"-1080395925\",\"method\":\"messages.searchGifs\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-2084618926\",\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"846868683\",\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"1364105629\",\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":\"-346119674\",\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector<InputBotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":\"570955184\",\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-826838685\",\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"grouped\",\"type\":\"Bool\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"527021574\",\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"1056025023\",\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":\"520357240\",\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-39416522\",\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"1224152952\",\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":\"-2091549254\",\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":\"-2130010132\",\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-712043766\",\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-728224331\",\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"451113900\",\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-462373635\",\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1137057461\",\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":\"1782549861\",\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"766298703\",\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1527873830\",\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"1587647177\",\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"958863608\",\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1986437075\",\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":\"1475442322\",\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"457157256\",\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1596029123\",\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-122669393\",\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":\"1706608543\",\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-866424884\",\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector<StickerSetCovered>\"},{\"id\":\"-1907842680\",\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"-1896289088\",\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"363700068\",\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-400399203\",\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"258170395\",\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"218777796\",\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":\"-341307408\",\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-333262899\",\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"852135825\",\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"-1489903017\",\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":\"991616823\",\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"Bool\"},{\"id\":\"-692498958\",\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1440257555\",\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":\"-434028723\",\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"619086221\",\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":\"-1712285883\",\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-1601001088\",\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"1997180532\",\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"730364339\",\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1151208273\",\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"578650699\",\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":\"-667062079\",\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":\"-436833542\",\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"Bool\"},{\"id\":\"163765653\",\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":\"-1680314774\",\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"Vector<InputStickerSetItem>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-143257775\",\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-4795190\",\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-2041315650\",\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"1369162417\",\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":\"1430593449\",\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":\"1124046573\",\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"1003664544\",\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"788404002\",\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"399855457\",\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":\"-1295269440\",\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"1508562471\",\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"662363518\",\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"536919235\",\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-1691921240\",\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"1375900482\",\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":\"-219008246\",\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":\"-269862909\",\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<LangPackString>\"},{\"id\":\"-845657435\",\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":\"1120311183\",\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector<LangPackLanguage>\"},{\"id\":\"1920559378\",\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":\"870184064\",\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector<InputUser>\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"1302676017\",\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"-914493408\",\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"-359881479\",\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"567151374\",\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-1174420133\",\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-357180360\",\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2020263951\",\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1180140658\",\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1355375294\",\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1036054804\",\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-356796084\",\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"251759059\",\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-1144759543\",\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-872345397\",\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector<InputSingleMedia>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"1347929239\",\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":\"405695855\",\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":\"755087855\",\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":\"1747789204\",\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1028140917\",\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"-956147407\",\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"1031231713\",\"method\":\"help.getProxyData\",\"params\":[],\"type\":\"help.ProxyData\"},{\"id\":\"749019089\",\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"-294455398\",\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"-1299661699\",\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector<SecureValue>\"},{\"id\":\"1936088002\",\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Vector<SecureValue>\"},{\"id\":\"-1986010339\",\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":\"-1199522741\",\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Bool\"},{\"id\":\"-1865902923\",\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"}],\"type\":\"Bool\"},{\"id\":\"-1200903967\",\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":\"-419267436\",\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector<SecureValueHash>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":\"-1516022023\",\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1305716726\",\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1880182943\",\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":\"-323339813\",\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1072547679\",\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"-2098076769\",\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector<SavedContact>\"},{\"id\":\"-2092831552\",\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":\"-262453244\",\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":\"489050862\",\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":\"486505992\",\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector<MessageRange>\"},{\"id\":\"911373810\",\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1398145746\",\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1031349873\",\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":\"585256482\",\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector<DialogPeer>\"},{\"id\":\"-2062238246\",\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2119757468\",\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1735311088\",\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":\"1862465352\",\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<InputAppEvent>\"}],\"type\":\"Bool\"},{\"id\":\"-966677240\",\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":\"1784243458\",\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":\"-760547348\",\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1881204448\",\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"2055154197\",\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1043606090\",\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-748624084\",\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":\"59377875\",\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":\"1723407216\",\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"help.UserInfo\"},{\"id\":\"-1626880216\",\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-806076575\",\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"1398240377\",\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":\"283795844\",\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"}],\"type\":\"Updates\"},{\"id\":\"1941660731\",\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1848369232\",\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":\"-2127811866\",\"method\":\"messages.getStatsURL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"params\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":\"-554301545\",\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-1517917375\",\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":\"-57811990\",\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":\"-578472351\",\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":\"1817860919\",\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":\"-18000023\",\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":\"-1153722364\",\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1457130303\",\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":\"1995661875\",\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":\"899735650\",\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"352892591\",\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"1318675378\",\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<EmojiLanguage>\"},{\"id\":\"-709817306\",\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":\"1749536939\",\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<InputFolderPeer>\"}],\"type\":\"Updates\"},{\"id\":\"472471681\",\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1932455680\",\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector<MessagesFilter>\"}],\"type\":\"Vector<messages.SearchCounter>\"},{\"id\":\"-170208392\",\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":\"1079520178\",\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":\"-482388461\",\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-148247912\",\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"1336717624\",\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-386636848\",\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-130964977\",\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":\"-1892102881\",\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":\"171270230\",\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"Updates\"},{\"id\":\"1491484525\",\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-304832784\",\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-490575781\",\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1111817116\",\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1120369398\",\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":\"1504586518\",\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":\"473805619\",\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":\"729808255\",\"method\":\"account.createTheme\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"InputDocument\"}],\"type\":\"Theme\"},{\"id\":\"999203330\",\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"}],\"type\":\"Theme\"},{\"id\":\"-229175188\",\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2061776695\",\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"format\",\"type\":\"flags.1?string\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"}],\"type\":\"Bool\"},{\"id\":\"-1919060949\",\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":\"676939512\",\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.Themes\"}]};\r\n\r\nConfig.Schema.API.layer = 105;\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nConfig.TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nConfig.LatinizeMap = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','': 'U','': 'V','': 'W','ʏ': 'Y','': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'}\r\n\r\n// ConfigStorage\r\n//;(function (window) {\r\n var keyPrefix = '';\r\n var noPrefix = false;\r\n var cache = {};\r\n var useCs = !!(window.chrome && chrome.storage && chrome.storage.local);\r\n var useLs = !useCs && !!window.localStorage;\r\n\r\n function storageSetPrefix(newPrefix) {\r\n keyPrefix = newPrefix;\r\n }\r\n\r\n function storageSetNoPrefix() {\r\n noPrefix = true;\r\n }\r\n\r\n function storageGetPrefix() {\r\n if(noPrefix) {\r\n noPrefix = false;\r\n return '';\r\n }\r\n\r\n return keyPrefix;\r\n }\r\n\r\n function storageGetValue(keys, callback) {\r\n var single = false;\r\n if(!Array.isArray(keys)) {\r\n keys = Array.prototype.slice.call(arguments);\r\n callback = keys.pop();\r\n single = keys.length == 1;\r\n }\r\n var result = [],\r\n value;\r\n var allFound = true;\r\n var prefix = storageGetPrefix(),\r\n i, key;\r\n\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i] = prefix + keys[i];\r\n if(key.substr(0, 3) != 'xt_' && cache[key] !== undefined) {\r\n result.push(cache[key]);\r\n } else if(useLs) {\r\n try {\r\n value = localStorage.getItem(key);\r\n } catch(e) {\r\n useLs = false;\r\n }\r\n\r\n try {\r\n value = (value === undefined || value === null) ? false : JSON.parse(value);\r\n } catch(e) {\r\n value = false;\r\n }\r\n result.push(cache[key] = value);\r\n } else if(!useCs) {\r\n result.push(cache[key] = false);\r\n } else {\r\n allFound = false;\r\n }\r\n }\r\n\r\n if(allFound) {\r\n return callback(single ? result[0] : result);\r\n }\r\n\r\n chrome.storage.local.get(keys, function(resultObj) {\r\n var value;\r\n result = [];\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i];\r\n value = resultObj[key];\r\n value = value === undefined || value === null ? false : JSON.parse(value);\r\n result.push(cache[key] = value);\r\n }\r\n\r\n callback(single ? result[0] : result);\r\n });\r\n }\r\n\r\n function storageSetValue(obj, callback) {\r\n var keyValues = {};\r\n var prefix = storageGetPrefix(),\r\n key, value;\r\n\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n for(key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n value = obj[key];\r\n key = prefix + key;\r\n cache[key] = value;\r\n value = JSON.stringify(value);\r\n if(useLs) {\r\n try {\r\n localStorage.setItem(key, value);\r\n } catch (e) {\r\n useLs = false;\r\n }\r\n } else {\r\n keyValues[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if(useLs || !useCs) {\r\n if(callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n chrome.storage.local.set(keyValues, callback);\r\n }\r\n\r\n function storageRemoveValue(keys, callback) {\r\n if(!Array.isArray(keys)) {\r\n keys = Array.prototype.slice.call(arguments)\r\n if(typeof keys[keys.length - 1] === 'function') {\r\n callback = keys.pop();\r\n }\r\n }\r\n\r\n var prefix = storageGetPrefix(),\r\n i, key;\r\n\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i] = prefix + keys[i];\r\n delete cache[key];\r\n if(useLs) {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch(e) {\r\n useLs = false;\r\n }\r\n }\r\n }\r\n\r\n if(useCs) {\r\n chrome.storage.local.remove(keys, callback);\r\n } else if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n function storageClear(callback) {\r\n if(useLs) {\r\n try {\r\n localStorage.clear();\r\n } catch (e) {\r\n useLs = false;\r\n }\r\n }\r\n\r\n if(useCs) {\r\n chrome.storage.local.clear(function() {\r\n cache = {};\r\n callback();\r\n })\r\n } else {\r\n cache = {};\r\n callback();\r\n }\r\n }\r\n\r\n \r\n\r\n window.ConfigStorage = {\r\n prefix: storageSetPrefix,\r\n noPrefix: storageSetNoPrefix,\r\n get: storageGetValue,\r\n set: storageSetValue,\r\n remove: storageRemoveValue,\r\n clear: storageClear\r\n };\r\n\r\n Config.Storage = window.ConfigStorage;\r\n\r\n module.exports = Config;\r\n//})(this)\r\n"
},
{
"id": 6,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/misc.ts",
"name": "./src/components/misc.ts",
"index": 37,
"index2": 35,
"size": 410,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"issuerId": 7,
"issuerName": "./src/components/pageIm.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1600,
"building": 228
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "7:13-30"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "../components/misc",
"loc": "41:13-42"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "14:13-30"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "7:13-30"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction putPreloader(elem) {\n var html = \"\\n <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"preloader-circular\\\" viewBox=\\\"25 25 50 50\\\">\\n <circle class=\\\"preloader-path\\\" cx=\\\"50\\\" cy=\\\"50\\\" r=\\\"20\\\" fill=\\\"none\\\" stroke-miterlimit=\\\"10\\\"/>\\n </svg>\";\n elem.innerHTML += html;\n}\nexports.putPreloader = putPreloader;\n"
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"index": 39,
"index2": 39,
"size": 6794,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./components/pageIm",
"loc": "20:31-61"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "18:31-50"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "11:31-50"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "17:31-50"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar services_1 = require(\"../lib/services\");\nvar misc_1 = require(\"./misc\");\nvar overlayscrollbars_1 = __importDefault(require(\"overlayscrollbars\"));\nexports.default = (function () {\n var chatsContainer = document.body.querySelector('.chats-container');\n var d = document.createElement('div');\n d.classList.add('preloader');\n misc_1.putPreloader(d);\n chatsContainer.append(d);\n var pageEl = document.body.getElementsByClassName('page-chats')[0];\n pageEl.style.display = '';\n var loadCount = Math.round(document.body.scrollHeight / 70 * 1.5);\n // @ts-ignore\n var chatsScroll = overlayscrollbars_1.default(chatsContainer, window.scrollbarOptions);\n // @ts-ignore\n var chatScroll = overlayscrollbars_1.default(document.getElementById('bubbles'), window.scrollbarOptions);\n /* chatScroll.options({autoUpdateInterval: 15}); */\n services_1.apiUpdatesManager.attach();\n var offsetIndex = 0;\n var loadDialogsPromise;\n var loadDialogs = function () {\n if (loadDialogsPromise)\n return Promise.resolve();\n chatsContainer.append(d);\n //let offset = appMessagesManager.generateDialogIndex();/* appMessagesManager.dialogsNum */;\n return loadDialogsPromise = services_1.appMessagesManager.getConversations('', offsetIndex, loadCount).then(function (result) {\n console.log('loaded ' + loadCount + ' dialogs by offset:', offsetIndex, result);\n d.remove();\n loadDialogsPromise = undefined;\n if (result && result.dialogs && result.dialogs.length) {\n offsetIndex = result.dialogs[result.dialogs.length - 1].index;\n result.dialogs.forEach(services_1.appDialogsManager.addDialog.bind(services_1.appDialogsManager));\n }\n });\n };\n var onScroll = function () {\n var info = chatsScroll.scroll();\n var yPos = info.position.y;\n var scrollHeight = info.max.y;\n if ((scrollHeight - yPos) <= (70 * 5) && !loadDialogsPromise) {\n loadDialogs();\n }\n };\n chatsScroll.options({\n callbacks: {\n onScroll: onScroll,\n onHostSizeChanged: onScroll\n }\n });\n // @ts-ignore\n document.addEventListener('user_update', function (e) {\n var userID = e.detail;\n var user = services_1.appUsersManager.getUser(userID);\n var dialog = services_1.appMessagesManager.getDialogByPeerID(user.id)[0];\n console.log('updating user:', user, dialog);\n if (dialog && !services_1.appUsersManager.isBot(dialog.peerID)) {\n var online = user.status._ == 'userStatusOnline';\n var dom = services_1.appDialogsManager.getDialogDom(dialog.peerID);\n if (dom) {\n if (online) {\n dom.avatarDiv.classList.add('is-online');\n }\n else {\n dom.avatarDiv.classList.remove('is-online');\n }\n }\n }\n if (services_1.appImManager.peerID == user.id) {\n services_1.appImManager.setPeerStatus();\n }\n });\n // @ts-ignore\n document.addEventListener('history_multiappend', function (e) {\n var msgIDsByPeer = e.detail;\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener(/* 'history_delete' */ 'dialog_top', function (e) {\n var dialog = e.detail;\n services_1.appDialogsManager.setLastMessage(dialog);\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener('history_delete', function (e) {\n var detail = e.detail;\n services_1.appImManager.deleteMessagesByIDs(Object.keys(detail.msgs).map(function (s) { return +s; }));\n });\n // @ts-ignore\n document.addEventListener('dialogs_multiupdate', function (e) {\n var dialogs = e.detail;\n for (var id in dialogs) {\n var dialog = dialogs[id];\n console.log('updating dialog:', dialog);\n if (!(dialog.peerID in services_1.appDialogsManager.doms)) {\n services_1.appDialogsManager.addDialog(dialog);\n continue;\n }\n services_1.appDialogsManager.setLastMessage(dialog);\n }\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener('dialog_unread', function (e) {\n var info = e.detail;\n var dialog = services_1.appMessagesManager.getDialogByPeerID(info.peerID)[0];\n services_1.appDialogsManager.setUnreadMessages(dialog);\n if (dialog.peerID == services_1.appImManager.peerID) {\n services_1.appImManager.updateUnreadByDialog(dialog);\n }\n });\n /*\n loadDialogs().then(result => {\n //appImManager.setScroll(chatScroll);\n });\n return;\n */\n var messageInput = document.getElementById('input-message') /* HTMLInputElement */;\n messageInput.addEventListener('keydown', function (e) {\n console.log(e);\n if (e.key == 'Enter') {\n if (e.shiftKey) {\n return;\n }\n var message = this.innerText;\n services_1.appMessagesManager.sendText(services_1.appImManager.peerID, message);\n this.innerText = '';\n /* appImManager.renderMessage({\n message: message,\n fromID: appImManager.peerID,\n date: Date.now() / 1000,\n pFlags: {\n unread: true\n }\n }); */\n }\n });\n messageInput.addEventListener('input', function (e) {\n if (!this.innerText.trim())\n this.innerHTML = '';\n });\n messageInput.addEventListener('paste', function (e) {\n e.preventDefault();\n // @ts-ignore\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\n window.document.execCommand('insertText', false, text);\n });\n var inputMessageContainer = document.getElementsByClassName('input-message-container')[0];\n var inputScroll = overlayscrollbars_1.default(inputMessageContainer, \n // @ts-ignore\n Object.assign({}, window.scrollbarOptions, { autoUpdate: false }));\n /* window.addEventListener('click', function(this, e) {\n // @ts-ignore\n let isInput = e.target.tagName == 'INPUT';\n if(!isInput && !window.getSelection().toString()) {\n console.log('click');\n messageInput.focus();\n }\n }); */\n loadDialogs().then(function (result) {\n services_1.appImManager.setScroll(chatScroll);\n });\n});\n"
},
{
"id": 8,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
"name": "./src/lib/storage.ts",
"index": 21,
"index2": 18,
"size": 2741,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "56:32-52"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "39:32-52"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "18:32-52"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar config_1 = require(\"./config\");\nvar AppStorage = /** @class */ (function () {\n function AppStorage() {\n if (config_1.Modes.test) {\n this.setPrefix('t_');\n }\n }\n AppStorage.prototype.setPrefix = function (newPrefix) {\n config_1.Storage.prefix(newPrefix);\n };\n AppStorage.prototype.noPrefix = function () {\n config_1.Storage.noPrefix();\n };\n AppStorage.prototype.proxy = function (methodName) {\n var _args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n _args[_i - 1] = arguments[_i];\n }\n var args = Array.prototype.slice.call(_args);\n var promise = new Promise(function (resolve, reject) {\n args.push(function (result) {\n resolve(result);\n });\n config_1.Storage[methodName].apply(config_1.Storage, args);\n });\n return promise;\n };\n AppStorage.prototype.get = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['get'], args));\n };\n AppStorage.prototype.set = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['set'], args));\n };\n AppStorage.prototype.remove = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['remove'], args));\n };\n AppStorage.prototype.clear = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['clear'], args));\n };\n return AppStorage;\n}());\nexports.default = new AppStorage();\n//export const appStorage = new AppStorage();\n"
},
{
"id": 9,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/filemanager.ts",
"name": "./src/lib/filemanager.ts",
"index": 33,
"index2": 30,
"size": 9753,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "61:36-60"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "42:36-60"
},
{
"moduleId": 38,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"module": "./src/lib/idb.ts",
"moduleName": "./src/lib/idb.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "7:36-60"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar FileManager = /** @class */ (function () {\n function FileManager() {\n /* $window.URL = $window.URL || $window.webkitURL\n $window.BlobBuilder = $window.BlobBuilder || $window.WebKitBlobBuilder || $window.MozBlobBuilder */\n this.isSafari = 'safari' in window;\n this.safariVersion = parseFloat(this.isSafari && (navigator.userAgent.match(/Version\\/(\\d+\\.\\d+).* Safari/) || [])[1]);\n this.safariWithDownload = this.isSafari && this.safariVersion >= 11.0;\n this.buggyUnknownBlob = this.isSafari && !this.safariWithDownload;\n this.blobSupported = true;\n try {\n bin_utils_1.blobConstruct([], '');\n }\n catch (e) {\n this.blobSupported = false;\n }\n }\n FileManager.prototype.isAvailable = function () {\n return this.blobSupported;\n };\n FileManager.prototype.copy = function (fromFileEntry, toFileEntry) {\n var _this = this;\n return this.getFileWriter(toFileEntry).then(function (fileWriter) {\n return _this.write(fileWriter, fromFileEntry).then(function () {\n return fileWriter;\n }, function (error) {\n try {\n // @ts-ignore\n fileWriter.truncate(0);\n }\n catch (e) { }\n return Promise.reject(error);\n });\n });\n };\n FileManager.prototype.write = function (fileWriter, bytes) {\n return new Promise(function (resolve, reject) {\n fileWriter.onwriteend = function (e) {\n resolve();\n };\n fileWriter.onerror = function (e) {\n reject(e);\n };\n if (bytes.file) {\n bytes.file(function (file) {\n fileWriter.write(file);\n }, reject);\n }\n else if (bytes instanceof Blob) { // is file bytes\n fileWriter.write(bytes);\n }\n else {\n try {\n var blob = bin_utils_1.blobConstruct([bin_utils_1.bytesToArrayBuffer(bytes)]);\n fileWriter.write(blob);\n }\n catch (e) {\n reject(e);\n }\n }\n });\n };\n FileManager.prototype.chooseSaveFile = function (fileName, ext, mimeType) {\n return Promise.reject();\n /* if(!window.chrome || !chrome.fileSystem || !chrome.fileSystem.chooseEntry) {\n //return qSync.reject()\n return Promise.reject();\n }\n var deferred = $q.defer()\n \n chrome.fileSystem.chooseEntry({\n type: 'saveFile',\n suggestedName: fileName,\n accepts: [{\n mimeTypes: [mimeType],\n extensions: [ext]\n }]\n }, function (writableFileEntry) {\n deferred.resolve(writableFileEntry)\n })\n \n return deferred.promise */\n };\n FileManager.prototype.getFileWriter = function (fileEntry) {\n return new Promise(function (resolve, reject) {\n fileEntry.createWriter(resolve, reject);\n });\n };\n FileManager.prototype.getFakeFileWriter = function (mimeType, saveFileCallback) {\n var _this = this;\n var blobParts = [];\n var fakeFileWriter = {\n write: function (blob) {\n if (!_this.blobSupported) {\n if (fakeFileWriter.onerror) {\n fakeFileWriter.onerror(new Error('Blob not supported by browser'));\n }\n return false;\n }\n blobParts.push(blob);\n setTimeout(function () {\n if (fakeFileWriter.onwriteend) {\n fakeFileWriter.onwriteend();\n }\n }, 0);\n },\n truncate: function () {\n blobParts = [];\n },\n finalize: function () {\n var blob = bin_utils_1.blobConstruct(blobParts, mimeType);\n if (saveFileCallback) {\n saveFileCallback(blob);\n }\n return blob;\n }\n };\n return fakeFileWriter;\n };\n FileManager.prototype.getUrl = function (fileData, mimeType) {\n var safeMimeType = bin_utils_1.blobSafeMimeType(mimeType);\n // console.log(dT(), 'get url', fileData, mimeType, fileData.toURL !== undefined, fileData instanceof Blob)\n if (fileData.toURL !== undefined) {\n return fileData.toURL(safeMimeType);\n }\n if (fileData instanceof Blob) {\n return URL.createObjectURL(fileData);\n }\n return 'data:' + safeMimeType + ';base64,' + bin_utils_1.bytesToBase64(fileData);\n };\n FileManager.prototype.getByteArray = function (fileData) {\n var _this = this;\n if (fileData instanceof Blob) {\n return new Promise(function (resolve, reject) {\n try {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n // @ts-ignore\n resolve(new Uint8Array(e.target.result));\n };\n reader.onerror = function (e) {\n reject(e);\n };\n reader.readAsArrayBuffer(fileData);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n else if (fileData.file) {\n return new Promise(function (resolve, reject) {\n fileData.file(function (blob) {\n _this.getByteArray(blob).then(resolve, reject);\n }, reject);\n });\n }\n return Promise.resolve(fileData);\n //return $q.when(fileData);\n };\n FileManager.prototype.getDataUrl = function (blob) {\n return new Promise(function (resolve, reject) {\n try {\n var reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result);\n };\n reader.readAsDataURL(blob);\n }\n catch (e) {\n reject(e);\n }\n });\n };\n FileManager.prototype.getFileCorrectUrl = function (blob, mimeType) {\n if (this.buggyUnknownBlob && blob instanceof Blob) {\n // @ts-ignore\n mimeType = blob.type || blob.mimeType || mimeType || '';\n if (!mimeType.match(/image\\/(jpeg|gif|png|bmp)|video\\/quicktime/)) {\n return this.getDataUrl(blob);\n }\n }\n return Promise.resolve(this.getUrl(blob, mimeType));\n };\n // downloadFile\n FileManager.prototype.download = function (blob, mimeType, fileName) {\n var _this = this;\n if (window.navigator && navigator.msSaveBlob !== undefined) {\n window.navigator.msSaveBlob(blob, fileName);\n return false;\n }\n if (window.navigator && 'getDeviceStorage' in navigator) {\n var storageName = 'sdcard';\n var subdir = 'telegram/';\n switch (mimeType.split('/')[0]) {\n case 'video':\n storageName = 'videos';\n break;\n case 'audio':\n storageName = 'music';\n break;\n case 'image':\n storageName = 'pictures';\n break;\n }\n // @ts-ignore\n var deviceStorage = navigator.getDeviceStorage(storageName);\n var request = deviceStorage.addNamed(blob, subdir + fileName);\n request.onsuccess = function () {\n console.log('Device storage save result', this.result);\n };\n request.onerror = function () { };\n return;\n }\n var popup;\n if (this.isSafari && !this.safariWithDownload) {\n popup = window.open();\n }\n this.getFileCorrectUrl(blob, mimeType).then(function (url) {\n if (popup) {\n try {\n // @ts-ignore\n popup.location.href = url;\n return;\n }\n catch (e) { }\n }\n var anchor = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');\n anchor.href = url;\n if (!_this.safariWithDownload) {\n anchor.target = '_blank';\n }\n anchor.download = fileName;\n if (anchor.dataset) {\n anchor.dataset.downloadurl = ['video/quicktime', fileName, url].join(':');\n }\n anchor.style.position = 'absolute';\n anchor.style.top = '1px';\n anchor.style.left = '1px';\n document.body.append(anchor);\n try {\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n anchor.dispatchEvent(clickEvent);\n }\n catch (e) {\n console.error('Download click error', e);\n try {\n anchor.click();\n }\n catch (e) {\n window.open(url, '_blank');\n }\n }\n setTimeout(function () {\n anchor.remove();\n }, 100);\n });\n };\n return FileManager;\n}());\nexports.default = new FileManager();\n"
},
{
"id": 10,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/lottie-web/build/player/lottie.js",
"name": "./node_modules/lottie-web/build/player/lottie.js",
"index": 38,
"index2": 36,
"size": 545874,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"issuerId": 12,
"issuerName": "./src/lib/services.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1102,
"building": 243,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "44:35-56"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "22:106-127"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "20:97-118"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(typeof navigator !== \"undefined\") && (function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(function() {\r\n return factory(root);\r\n });\r\n } else if (typeof module === \"object\" && module.exports) {\r\n module.exports = factory(root);\r\n } else {\r\n root.lottie = factory(root);\r\n root.bodymovin = root.lottie;\r\n }\r\n}((window || {}), function(window) {\r\n \"use strict\";\r\n var svgNS = \"http://www.w3.org/2000/svg\";\r\n\r\nvar locationHref = '';\r\n\r\nvar initialDefaultFrame = -999999;\r\n\r\nvar subframeEnabled = true;\r\nvar expressionsPlugin;\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\nvar cachedColors = {};\r\nvar bm_rounder = Math.round;\r\nvar bm_rnd;\r\nvar bm_pow = Math.pow;\r\nvar bm_sqrt = Math.sqrt;\r\nvar bm_abs = Math.abs;\r\nvar bm_floor = Math.floor;\r\nvar bm_max = Math.max;\r\nvar bm_min = Math.min;\r\nvar blitter = 10;\r\n\r\nvar BMMath = {};\r\n(function(){\r\n var propertyNames = [\"abs\", \"acos\", \"acosh\", \"asin\", \"asinh\", \"atan\", \"atanh\", \"atan2\", \"ceil\", \"cbrt\", \"expm1\", \"clz32\", \"cos\", \"cosh\", \"exp\", \"floor\", \"fround\", \"hypot\", \"imul\", \"log\", \"log1p\", \"log2\", \"log10\", \"max\", \"min\", \"pow\", \"random\", \"round\", \"sign\", \"sin\", \"sinh\", \"sqrt\", \"tan\", \"tanh\", \"trunc\", \"E\", \"LN10\", \"LN2\", \"LOG10E\", \"LOG2E\", \"PI\", \"SQRT1_2\", \"SQRT2\"];\r\n var i, len = propertyNames.length;\r\n for(i=0;i<len;i+=1){\r\n BMMath[propertyNames[i]] = Math[propertyNames[i]];\r\n }\r\n}());\r\n\r\nfunction ProjectInterface(){return {};}\r\n\r\nBMMath.random = Math.random;\r\nBMMath.abs = function(val){\r\n var tOfVal = typeof val;\r\n if(tOfVal === 'object' && val.length){\r\n var absArr = createSizedArray(val.length);\r\n var i, len = val.length;\r\n for(i=0;i<len;i+=1){\r\n absArr[i] = Math.abs(val[i]);\r\n }\r\n return absArr;\r\n }\r\n return Math.abs(val);\r\n\r\n};\r\nvar defaultCurveSegments = 150;\r\nvar degToRads = Math.PI/180;\r\nvar roundCorner = 0.5519;\r\n\r\nfunction roundValues(flag){\r\n if(flag){\r\n bm_rnd = Math.round;\r\n }else{\r\n bm_rnd = function(val){\r\n return val;\r\n };\r\n }\r\n}\r\nroundValues(false);\r\n\r\nfunction styleDiv(element){\r\n element.style.position = 'absolute';\r\n element.style.top = 0;\r\n element.style.left = 0;\r\n element.style.display = 'block';\r\n element.style.transformOrigin = element.style.webkitTransformOrigin = '0 0';\r\n element.style.backfaceVisibility = element.style.webkitBackfaceVisibility = 'visible';\r\n element.style.transformStyle = element.style.webkitTransformStyle = element.style.mozTransformStyle = \"preserve-3d\";\r\n}\r\n\r\nfunction BMEnterFrameEvent(type, currentTime, totalTime, frameMultiplier){\r\n this.type = type;\r\n this.currentTime = currentTime;\r\n this.totalTime = totalTime;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMCompleteEvent(type, frameMultiplier){\r\n this.type = type;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMCompleteLoopEvent(type, totalLoops, currentLoop, frameMultiplier){\r\n this.type = type;\r\n this.currentLoop = currentLoop;\r\n this.totalLoops = totalLoops;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMSegmentStartEvent(type, firstFrame, totalFrames){\r\n this.type = type;\r\n this.firstFrame = firstFrame;\r\n this.totalFrames = totalFrames;\r\n}\r\n\r\nfunction BMDestroyEvent(type, target){\r\n this.type = type;\r\n this.target = target;\r\n}\r\n\r\nfunction BMRenderFrameErrorEvent(nativeError, currentTime) {\r\n this.type = 'renderFrameError';\r\n this.nativeError = nativeError;\r\n this.currentTime = currentTime;\r\n}\r\n\r\nfunction BMConfigErrorEvent(nativeError) {\r\n this.type = 'configError';\r\n this.nativeError = nativeError;\r\n}\r\n\r\nfunction BMAnimationConfigErrorEvent(type, nativeError) {\r\n this.type = type;\r\n this.nativeError = nativeError;\r\n this.currentTime = currentTime;\r\n}\r\n\r\nvar createElementID = (function(){\r\n var _count = 0;\r\n return function createID() {\r\n return '__lottie_element_' + ++_count\r\n }\r\n}())\r\n\r\nfunction HSVtoRGB(h, s, v) {\r\n var r, g, b, i, f, p, q, t;\r\n i = Math.floor(h * 6);\r\n f = h * 6 - i;\r\n p = v * (1 - s);\r\n q = v * (1 - f * s);\r\n t = v * (1 - (1 - f) * s);\r\n switch (i % 6) {\r\n case 0: r = v; g = t; b = p; break;\r\n case 1: r = q; g = v; b = p; break;\r\n case 2: r = p; g = v; b = t; break;\r\n case 3: r = p; g = q; b = v; break;\r\n case 4: r = t; g = p; b = v; break;\r\n case 5: r = v; g = p; b = q; break;\r\n }\r\n return [ r,\r\n g,\r\n b ];\r\n}\r\n\r\nfunction RGBtoHSV(r, g, b) {\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b),\r\n d = max - min,\r\n h,\r\n s = (max === 0 ? 0 : d / max),\r\n v = max / 255;\r\n\r\n switch (max) {\r\n case min: h = 0; break;\r\n case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;\r\n case g: h = (b - r) + d * 2; h /= 6 * d; break;\r\n case b: h = (r - g) + d * 4; h /= 6 * d; break;\r\n }\r\n\r\n return [\r\n h,\r\n s,\r\n v\r\n ];\r\n}\r\n\r\nfunction addSaturationToRGB(color,offset){\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[1] += offset;\r\n if (hsv[1] > 1) {\r\n hsv[1] = 1;\r\n }\r\n else if (hsv[1] <= 0) {\r\n hsv[1] = 0;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nfunction addBrightnessToRGB(color,offset){\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[2] += offset;\r\n if (hsv[2] > 1) {\r\n hsv[2] = 1;\r\n }\r\n else if (hsv[2] < 0) {\r\n hsv[2] = 0;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nfunction addHueToRGB(color,offset) {\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[0] += offset/360;\r\n if (hsv[0] > 1) {\r\n hsv[0] -= 1;\r\n }\r\n else if (hsv[0] < 0) {\r\n hsv[0] += 1;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nvar rgbToHex = (function(){\r\n var colorMap = [];\r\n var i;\r\n var hex;\r\n for(i=0;i<256;i+=1){\r\n hex = i.toString(16);\r\n colorMap[i] = hex.length == 1 ? '0' + hex : hex;\r\n }\r\n\r\n return function(r, g, b) {\r\n if(r<0){\r\n r = 0;\r\n }\r\n if(g<0){\r\n g = 0;\r\n }\r\n if(b<0){\r\n b = 0;\r\n }\r\n return '#' + colorMap[r] + colorMap[g] + colorMap[b];\r\n };\r\n}());\r\nfunction BaseEvent(){}\r\nBaseEvent.prototype = {\r\n\ttriggerEvent: function (eventName, args) {\r\n\t if (this._cbs[eventName]) {\r\n\t var len = this._cbs[eventName].length;\r\n\t for (var i = 0; i < len; i++){\r\n\t this._cbs[eventName][i](args);\r\n\t }\r\n\t }\r\n\t},\r\n\taddEventListener: function (eventName, callback) {\r\n\t if (!this._cbs[eventName]){\r\n\t this._cbs[eventName] = [];\r\n\t }\r\n\t this._cbs[eventName].push(callback);\r\n\r\n\t\treturn function() {\r\n\t\t\tthis.removeEventListener(eventName, callback);\r\n\t\t}.bind(this);\r\n\t},\r\n\tremoveEventListener: function (eventName,callback){\r\n\t if (!callback){\r\n\t this._cbs[eventName] = null;\r\n\t }else if(this._cbs[eventName]){\r\n\t var i = 0, len = this._cbs[eventName].length;\r\n\t while(i<len){\r\n\t if(this._cbs[eventName][i] === callback){\r\n\t this._cbs[eventName].splice(i,1);\r\n\t i -=1;\r\n\t len -= 1;\r\n\t }\r\n\t i += 1;\r\n\t }\r\n\t if(!this._cbs[eventName].length){\r\n\t this._cbs[eventName] = null;\r\n\t }\r\n\t }\r\n\t}\r\n};\r\nvar createTypedArray = (function(){\r\n\tfunction createRegularArray(type, len){\r\n\t\tvar i = 0, arr = [], value;\r\n\t\tswitch(type) {\r\n\t\t\tcase 'int16':\r\n\t\t\tcase 'uint8c':\r\n\t\t\t\tvalue = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tvalue = 1.1;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tarr.push(value);\r\n\t\t}\r\n\t\treturn arr;\r\n\t}\r\n\tfunction createTypedArray(type, len){\r\n\t\tif(type === 'float32') {\r\n\t\t\treturn new Float32Array(len);\r\n\t\t} else if(type === 'int16') {\r\n\t\t\treturn new Int16Array(len);\r\n\t\t} else if(type === 'uint8c') {\r\n\t\t\treturn new Uint8ClampedArray(len);\r\n\t\t}\r\n\t}\r\n\tif(typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {\r\n\t\treturn createTypedArray;\r\n\t} else {\r\n\t\treturn createRegularArray;\r\n\t}\r\n}());\r\n\r\nfunction createSizedArray(len) {\r\n\treturn Array.apply(null,{length:len});\r\n}\r\nfunction createNS(type) {\r\n\t//return {appendChild:function(){},setAttribute:function(){},style:{}}\r\n\treturn document.createElementNS(svgNS, type);\r\n}\r\nfunction createTag(type) {\r\n\t//return {appendChild:function(){},setAttribute:function(){},style:{}}\r\n\treturn document.createElement(type);\r\n}\r\nfunction DynamicPropertyContainer(){};\r\nDynamicPropertyContainer.prototype = {\r\n\taddDynamicProperty: function(prop) {\r\n\t\tif(this.dynamicProperties.indexOf(prop) === -1) {\r\n\t this.dynamicProperties.push(prop);\r\n\t this.container.addDynamicProperty(this);\r\n\t \tthis._isAnimated = true;\r\n\t }\r\n\t},\r\n\titerateDynamicProperties: function(){\r\n\t this._mdf = false;\r\n\t var i, len = this.dynamicProperties.length;\r\n\t for(i=0;i<len;i+=1){\r\n\t this.dynamicProperties[i].getValue();\r\n\t if(this.dynamicProperties[i]._mdf) {\r\n\t this._mdf = true;\r\n\t }\r\n\t }\r\n\t},\r\n\tinitDynamicPropertyContainer: function(container){\r\n\t this.container = container;\r\n\t this.dynamicProperties = [];\r\n\t this._mdf = false;\r\n\t this._isAnimated = false;\r\n\t}\r\n}\r\nvar getBlendMode = (function() {\r\n\r\n\tvar blendModeEnums = {\r\n 0:'source-over',\r\n 1:'multiply',\r\n 2:'screen',\r\n 3:'overlay',\r\n 4:'darken',\r\n 5:'lighten',\r\n 6:'color-dodge',\r\n 7:'color-burn',\r\n 8:'hard-light',\r\n 9:'soft-light',\r\n 10:'difference',\r\n 11:'exclusion',\r\n 12:'hue',\r\n 13:'saturation',\r\n 14:'color',\r\n 15:'luminosity'\r\n }\r\n\r\n\treturn function(mode) {\r\n\t\treturn blendModeEnums[mode] || '';\r\n\t}\r\n}())\r\n/*!\r\n Transformation Matrix v2.0\r\n (c) Epistemex 2014-2015\r\n www.epistemex.com\r\n By Ken Fyrstenberg\r\n Contributions by leeoniya.\r\n License: MIT, header required.\r\n */\r\n\r\n/**\r\n * 2D transformation matrix object initialized with identity matrix.\r\n *\r\n * The matrix can synchronize a canvas context by supplying the context\r\n * as an argument, or later apply current absolute transform to an\r\n * existing context.\r\n *\r\n * All values are handled as floating point values.\r\n *\r\n * @param {CanvasRenderingContext2D} [context] - Optional context to sync with Matrix\r\n * @prop {number} a - scale x\r\n * @prop {number} b - shear y\r\n * @prop {number} c - shear x\r\n * @prop {number} d - scale y\r\n * @prop {number} e - translate x\r\n * @prop {number} f - translate y\r\n * @prop {CanvasRenderingContext2D|null} [context=null] - set or get current canvas context\r\n * @constructor\r\n */\r\n\r\nvar Matrix = (function(){\r\n\r\n var _cos = Math.cos;\r\n var _sin = Math.sin;\r\n var _tan = Math.tan;\r\n var _rnd = Math.round;\r\n\r\n function reset(){\r\n this.props[0] = 1;\r\n this.props[1] = 0;\r\n this.props[2] = 0;\r\n this.props[3] = 0;\r\n this.props[4] = 0;\r\n this.props[5] = 1;\r\n this.props[6] = 0;\r\n this.props[7] = 0;\r\n this.props[8] = 0;\r\n this.props[9] = 0;\r\n this.props[10] = 1;\r\n this.props[11] = 0;\r\n this.props[12] = 0;\r\n this.props[13] = 0;\r\n this.props[14] = 0;\r\n this.props[15] = 1;\r\n return this;\r\n }\r\n\r\n function rotate(angle) {\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateX(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(1, 0, 0, 0, 0, mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateY(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, 0, mSin, 0, 0, 1, 0, 0, -mSin, 0, mCos, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateZ(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function shear(sx,sy){\r\n return this._t(1, sy, sx, 1, 0, 0);\r\n }\r\n\r\n function skew(ax, ay){\r\n return this.shear(_tan(ax), _tan(ay));\r\n }\r\n\r\n function skewFromAxis(ax, angle){\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, mSin, 0, 0, -mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)\r\n ._t(1, 0, 0, 0, _tan(ax), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)\r\n ._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n //return this._t(mCos, mSin, -mSin, mCos, 0, 0)._t(1, 0, _tan(ax), 1, 0, 0)._t(mCos, -mSin, mSin, mCos, 0, 0);\r\n }\r\n\r\n function scale(sx, sy, sz) {\r\n if(!sz && sz !== 0) {\r\n sz = 1;\r\n }\r\n if(sx === 1 && sy === 1 && sz === 1){\r\n return this;\r\n }\r\n return this._t(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function setTransform(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {\r\n this.props[0] = a;\r\n this.props[1] = b;\r\n this.props[2] = c;\r\n this.props[3] = d;\r\n this.props[4] = e;\r\n this.props[5] = f;\r\n this.props[6] = g;\r\n this.props[7] = h;\r\n this.props[8] = i;\r\n this.props[9] = j;\r\n this.props[10] = k;\r\n this.props[11] = l;\r\n this.props[12] = m;\r\n this.props[13] = n;\r\n this.props[14] = o;\r\n this.props[15] = p;\r\n return this;\r\n }\r\n\r\n function translate(tx, ty, tz) {\r\n tz = tz || 0;\r\n if(tx !== 0 || ty !== 0 || tz !== 0){\r\n return this._t(1,0,0,0,0,1,0,0,0,0,1,0,tx,ty,tz,1);\r\n }\r\n return this;\r\n }\r\n\r\n function transform(a2, b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2) {\r\n\r\n var _p = this.props;\r\n\r\n if(a2 === 1 && b2 === 0 && c2 === 0 && d2 === 0 && e2 === 0 && f2 === 1 && g2 === 0 && h2 === 0 && i2 === 0 && j2 === 0 && k2 === 1 && l2 === 0){\r\n //NOTE: commenting this condition because TurboFan deoptimizes code when present\r\n //if(m2 !== 0 || n2 !== 0 || o2 !== 0){\r\n _p[12] = _p[12] * a2 + _p[15] * m2;\r\n _p[13] = _p[13] * f2 + _p[15] * n2;\r\n _p[14] = _p[14] * k2 + _p[15] * o2;\r\n _p[15] = _p[15] * p2;\r\n //}\r\n this._identityCalculated = false;\r\n return this;\r\n }\r\n\r\n var a1 = _p[0];\r\n var b1 = _p[1];\r\n var c1 = _p[2];\r\n var d1 = _p[3];\r\n var e1 = _p[4];\r\n var f1 = _p[5];\r\n var g1 = _p[6];\r\n var h1 = _p[7];\r\n var i1 = _p[8];\r\n var j1 = _p[9];\r\n var k1 = _p[10];\r\n var l1 = _p[11];\r\n var m1 = _p[12];\r\n var n1 = _p[13];\r\n var o1 = _p[14];\r\n var p1 = _p[15];\r\n\r\n /* matrix order (canvas compatible):\r\n * ace\r\n * bdf\r\n * 001\r\n */\r\n _p[0] = a1 * a2 + b1 * e2 + c1 * i2 + d1 * m2;\r\n _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2 ;\r\n _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2 ;\r\n _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2 ;\r\n\r\n _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2 ;\r\n _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2 ;\r\n _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2 ;\r\n _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2 ;\r\n\r\n _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2 ;\r\n _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2 ;\r\n _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2 ;\r\n _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2 ;\r\n\r\n _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2 ;\r\n _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2 ;\r\n _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;\r\n _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;\r\n\r\n this._identityCalculated = false;\r\n return this;\r\n }\r\n\r\n function isIdentity() {\r\n if(!this._identityCalculated){\r\n this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0 || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0 || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0 || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);\r\n this._identityCalculated = true;\r\n }\r\n return this._identity;\r\n }\r\n\r\n function equals(matr){\r\n var i = 0;\r\n while (i < 16) {\r\n if(matr.props[i] !== this.props[i]) {\r\n return false;\r\n }\r\n i+=1;\r\n }\r\n return true;\r\n }\r\n\r\n function clone(matr){\r\n var i;\r\n for(i=0;i<16;i+=1){\r\n matr.props[i] = this.props[i];\r\n }\r\n }\r\n\r\n function cloneFromProps(props){\r\n var i;\r\n for(i=0;i<16;i+=1){\r\n this.props[i] = props[i];\r\n }\r\n }\r\n\r\n function applyToPoint(x, y, z) {\r\n\r\n return {\r\n x: x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],\r\n y: x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],\r\n z: x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]\r\n };\r\n /*return {\r\n x: x * me.a + y * me.c + me.e,\r\n y: x * me.b + y * me.d + me.f\r\n };*/\r\n }\r\n function applyToX(x, y, z) {\r\n return x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12];\r\n }\r\n function applyToY(x, y, z) {\r\n return x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13];\r\n }\r\n function applyToZ(x, y, z) {\r\n return x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14];\r\n }\r\n\r\n function inversePoint(pt) {\r\n var determinant = this.props[0] * this.props[5] - this.props[1] * this.props[4];\r\n var a = this.props[5]/determinant;\r\n var b = - this.props[1]/determinant;\r\n var c = - this.props[4]/determinant;\r\n var d = this.props[0]/determinant;\r\n var e = (this.props[4] * this.props[13] - this.props[5] * this.props[12])/determinant;\r\n var f = - (this.props[0] * this.props[13] - this.props[1] * this.props[12])/determinant;\r\n return [pt[0] * a + pt[1] * c + e, pt[0] * b + pt[1] * d + f, 0];\r\n }\r\n\r\n function inversePoints(pts){\r\n var i, len = pts.length, retPts = [];\r\n for(i=0;i<len;i+=1){\r\n retPts[i] = inversePoint(pts[i]);\r\n }\r\n return retPts;\r\n }\r\n\r\n function applyToTriplePoints(pt1, pt2, pt3) {\r\n var arr = createTypedArray('float32', 6);\r\n if(this.isIdentity()) {\r\n arr[0] = pt1[0];\r\n arr[1] = pt1[1];\r\n arr[2] = pt2[0];\r\n arr[3] = pt2[1];\r\n arr[4] = pt3[0];\r\n arr[5] = pt3[1];\r\n } else {\r\n var p0 = this.props[0], p1 = this.props[1], p4 = this.props[4], p5 = this.props[5], p12 = this.props[12], p13 = this.props[13];\r\n arr[0] = pt1[0] * p0 + pt1[1] * p4 + p12;\r\n arr[1] = pt1[0] * p1 + pt1[1] * p5 + p13;\r\n arr[2] = pt2[0] * p0 + pt2[1] * p4 + p12;\r\n arr[3] = pt2[0] * p1 + pt2[1] * p5 + p13;\r\n arr[4] = pt3[0] * p0 + pt3[1] * p4 + p12;\r\n arr[5] = pt3[0] * p1 + pt3[1] * p5 + p13;\r\n }\r\n return arr;\r\n }\r\n\r\n function applyToPointArray(x,y,z){\r\n var arr;\r\n if(this.isIdentity()) {\r\n arr = [x,y,z];\r\n } else {\r\n arr = [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];\r\n }\r\n return arr;\r\n }\r\n\r\n function applyToPointStringified(x, y) {\r\n if(this.isIdentity()) {\r\n return x + ',' + y;\r\n }\r\n var _p = this.props;\r\n return Math.round((x * _p[0] + y * _p[4] + _p[12]) * 100) / 100+','+ Math.round((x * _p[1] + y * _p[5] + _p[13]) * 100) / 100;\r\n }\r\n\r\n function toCSS() {\r\n //Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\r\n /*if(this.isIdentity()) {\r\n return '';\r\n }*/\r\n var i = 0;\r\n var props = this.props;\r\n var cssValue = 'matrix3d(';\r\n var v = 10000;\r\n while(i<16){\r\n cssValue += _rnd(props[i]*v)/v;\r\n cssValue += i === 15 ? ')':',';\r\n i += 1;\r\n }\r\n return cssValue;\r\n }\r\n\r\n function roundMatrixProperty(val) {\r\n var v = 10000;\r\n if((val < 0.000001 && val > 0) || (val > -0.000001 && val < 0)) {\r\n return _rnd(val * v) / v;\r\n }\r\n return val;\r\n }\r\n\r\n function to2dCSS() {\r\n //Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\r\n /*if(this.isIdentity()) {\r\n return '';\r\n }*/\r\n var props = this.props;\r\n var _a = roundMatrixProperty(props[0]);\r\n var _b = roundMatrixProperty(props[1]);\r\n var _c = roundMatrixProperty(props[4]);\r\n var _d = roundMatrixProperty(props[5]);\r\n var _e = roundMatrixProperty(props[12]);\r\n var _f = roundMatrixProperty(props[13]);\r\n return \"matrix(\" + _a + ',' + _b + ',' + _c + ',' + _d + ',' + _e + ',' + _f + \")\";\r\n }\r\n\r\n return function(){\r\n this.reset = reset;\r\n this.rotate = rotate;\r\n this.rotateX = rotateX;\r\n this.rotateY = rotateY;\r\n this.rotateZ = rotateZ;\r\n this.skew = skew;\r\n this.skewFromAxis = skewFromAxis;\r\n this.shear = shear;\r\n this.scale = scale;\r\n this.setTransform = setTransform;\r\n this.translate = translate;\r\n this.transform = transform;\r\n this.applyToPoint = applyToPoint;\r\n this.applyToX = applyToX;\r\n this.applyToY = applyToY;\r\n this.applyToZ = applyToZ;\r\n this.applyToPointArray = applyToPointArray;\r\n this.applyToTriplePoints = applyToTriplePoints;\r\n this.applyToPointStringified = applyToPointStringified;\r\n this.toCSS = toCSS;\r\n this.to2dCSS = to2dCSS;\r\n this.clone = clone;\r\n this.cloneFromProps = cloneFromProps;\r\n this.equals = equals;\r\n this.inversePoints = inversePoints;\r\n this.inversePoint = inversePoint;\r\n this._t = this.transform;\r\n this.isIdentity = isIdentity;\r\n this._identity = true;\r\n this._identityCalculated = false;\r\n\r\n this.props = createTypedArray('float32', 16);\r\n this.reset();\r\n };\r\n}());\r\n\r\n/*\r\n Copyright 2014 David Bau.\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining\r\n a copy of this software and associated documentation files (the\r\n \"Software\"), to deal in the Software without restriction, including\r\n without limitation the rights to use, copy, modify, merge, publish,\r\n distribute, sublicense, and/or sell copies of the Software, and to\r\n permit persons to whom the Software is furnished to do so, subject to\r\n the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be\r\n included in all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n */\r\n\r\n(function (pool, math) {\r\n//\r\n// The following constants are related to IEEE 754 limits.\r\n//\r\n var global = this,\r\n width = 256, // each RC4 output is 0 <= x < 256\r\n chunks = 6, // at least six RC4 outputs for each double\r\n digits = 52, // there are 52 significant digits in a double\r\n rngname = 'random', // rngname: name for Math.random and Math.seedrandom\r\n startdenom = math.pow(width, chunks),\r\n significance = math.pow(2, digits),\r\n overflow = significance * 2,\r\n mask = width - 1,\r\n nodecrypto; // node.js crypto module, initialized at the bottom.\r\n\r\n//\r\n// seedrandom()\r\n// This is the seedrandom function described above.\r\n//\r\n function seedrandom(seed, options, callback) {\r\n var key = [];\r\n options = (options === true) ? { entropy: true } : (options || {});\r\n\r\n // Flatten the seed string or build one from local entropy if needed.\r\n var shortseed = mixkey(flatten(\r\n options.entropy ? [seed, tostring(pool)] :\r\n (seed === null) ? autoseed() : seed, 3), key);\r\n\r\n // Use the seed to initialize an ARC4 generator.\r\n var arc4 = new ARC4(key);\r\n\r\n // This function returns a random double in [0, 1) that contains\r\n // randomness in every bit of the mantissa of the IEEE 754 value.\r\n var prng = function() {\r\n var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48\r\n d = startdenom, // and denominator d = 2 ^ 48.\r\n x = 0; // and no 'extra last byte'.\r\n while (n < significance) { // Fill up all significant digits by\r\n n = (n + x) * width; // shifting numerator and\r\n d *= width; // denominator and generating a\r\n x = arc4.g(1); // new least-significant-byte.\r\n }\r\n while (n >= overflow) { // To avoid rounding up, before adding\r\n n /= 2; // last byte, shift everything\r\n d /= 2; // right using integer math until\r\n x >>>= 1; // we have exactly the desired bits.\r\n }\r\n return (n + x) / d; // Form the number within [0, 1).\r\n };\r\n\r\n prng.int32 = function() { return arc4.g(4) | 0; };\r\n prng.quick = function() { return arc4.g(4) / 0x100000000; };\r\n prng.double = prng;\r\n\r\n // Mix the randomness into accumulated entropy.\r\n mixkey(tostring(arc4.S), pool);\r\n\r\n // Calling convention: what to return as a function of prng, seed, is_math.\r\n return (options.pass || callback ||\r\n function(prng, seed, is_math_call, state) {\r\n if (state) {\r\n // Load the arc4 state from the given state if it has an S array.\r\n if (state.S) { copy(state, arc4); }\r\n // Only provide the .state method if requested via options.state.\r\n prng.state = function() { return copy(arc4, {}); };\r\n }\r\n\r\n // If called as a method of Math (Math.seedrandom()), mutate\r\n // Math.random because that is how seedrandom.js has worked since v1.0.\r\n if (is_math_call) { math[rngname] = prng; return seed; }\r\n\r\n // Otherwise, it is a newer calling convention, so return the\r\n // prng directly.\r\n else return prng;\r\n })(\r\n prng,\r\n shortseed,\r\n 'global' in options ? options.global : (this == math),\r\n options.state);\r\n }\r\n math['seed' + rngname] = seedrandom;\r\n\r\n//\r\n// ARC4\r\n//\r\n// An ARC4 implementation. The constructor takes a key in the form of\r\n// an array of at most (width) integers that should be 0 <= x < (width).\r\n//\r\n// The g(count) method returns a pseudorandom integer that concatenates\r\n// the next (count) outputs from ARC4. Its return value is a number x\r\n// that is in the range 0 <= x < (width ^ count).\r\n//\r\n function ARC4(key) {\r\n var t, keylen = key.length,\r\n me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\r\n\r\n // The empty key [] is treated as [0].\r\n if (!keylen) { key = [keylen++]; }\r\n\r\n // Set up S using the standard key scheduling algorithm.\r\n while (i < width) {\r\n s[i] = i++;\r\n }\r\n for (i = 0; i < width; i++) {\r\n s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\r\n s[j] = t;\r\n }\r\n\r\n // The \"g\" method returns the next (count) outputs as one number.\r\n me.g = function(count) {\r\n // Using instance members instead of closure state nearly doubles speed.\r\n var t, r = 0,\r\n i = me.i, j = me.j, s = me.S;\r\n while (count--) {\r\n t = s[i = mask & (i + 1)];\r\n r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\r\n }\r\n me.i = i; me.j = j;\r\n return r;\r\n // For robust unpredictability, the function call below automatically\r\n // discards an initial batch of values. This is called RC4-drop[256].\r\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\r\n };\r\n }\r\n\r\n//\r\n// copy()\r\n// Copies internal state of ARC4 to or from a plain object.\r\n//\r\n function copy(f, t) {\r\n t.i = f.i;\r\n t.j = f.j;\r\n t.S = f.S.slice();\r\n return t;\r\n }\r\n\r\n//\r\n// flatten()\r\n// Converts an object tree to nested arrays of strings.\r\n//\r\n function flatten(obj, depth) {\r\n var result = [], typ = (typeof obj), prop;\r\n if (depth && typ == 'object') {\r\n for (prop in obj) {\r\n try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\r\n }\r\n }\r\n return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\r\n }\r\n\r\n//\r\n// mixkey()\r\n// Mixes a string seed into a key that is an array of integers, and\r\n// returns a shortened string seed that is equivalent to the result key.\r\n//\r\n function mixkey(seed, key) {\r\n var stringseed = seed + '', smear, j = 0;\r\n while (j < stringseed.length) {\r\n key[mask & j] =\r\n mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\r\n }\r\n return tostring(key);\r\n }\r\n\r\n//\r\n// autoseed()\r\n// Returns an object for autoseeding, using window.crypto and Node crypto\r\n// module if available.\r\n//\r\n function autoseed() {\r\n try {\r\n if (nodecrypto) { return tostring(nodecrypto.randomBytes(width)); }\r\n var out = new Uint8Array(width);\r\n (global.crypto || global.msCrypto).getRandomValues(out);\r\n return tostring(out);\r\n } catch (e) {\r\n var browser = global.navigator,\r\n plugins = browser && browser.plugins;\r\n return [+new Date(), global, plugins, global.screen, tostring(pool)];\r\n }\r\n }\r\n\r\n//\r\n// tostring()\r\n// Converts an array of charcodes to a string\r\n//\r\n function tostring(a) {\r\n return String.fromCharCode.apply(0, a);\r\n }\r\n\r\n//\r\n// When seedrandom.js is loaded, we immediately mix a few bits\r\n// from the built-in RNG into the entropy pool. Because we do\r\n// not want to interfere with deterministic PRNG state later,\r\n// seedrandom will not call math.random on its own again after\r\n// initialization.\r\n//\r\n mixkey(math.random(), pool);\r\n\r\n//\r\n// Nodejs and AMD support: export the implementation as a module using\r\n// either convention.\r\n//\r\n\r\n// End anonymous scope, and pass initial values.\r\n})(\r\n [], // pool: entropy pool starts empty\r\n BMMath // math: package containing random, pow, and seedrandom\r\n);\r\nvar BezierFactory = (function(){\r\n /**\r\n * BezierEasing - use bezier curve for transition easing function\r\n * by Gaëtan Renaudeau 2014 - 2015 MIT License\r\n *\r\n * Credits: is based on Firefox's nsSMILKeySpline.cpp\r\n * Usage:\r\n * var spline = BezierEasing([ 0.25, 0.1, 0.25, 1.0 ])\r\n * spline.get(x) => returns the easing value | x must be in [0, 1] range\r\n *\r\n */\r\n\r\n var ob = {};\r\n ob.getBezierEasing = getBezierEasing;\r\n var beziers = {};\r\n\r\n function getBezierEasing(a,b,c,d,nm){\r\n var str = nm || ('bez_' + a+'_'+b+'_'+c+'_'+d).replace(/\\./g, 'p');\r\n if(beziers[str]){\r\n return beziers[str];\r\n }\r\n var bezEasing = new BezierEasing([a,b,c,d]);\r\n beziers[str] = bezEasing;\r\n return bezEasing;\r\n }\r\n\r\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\r\n var NEWTON_ITERATIONS = 4;\r\n var NEWTON_MIN_SLOPE = 0.001;\r\n var SUBDIVISION_PRECISION = 0.0000001;\r\n var SUBDIVISION_MAX_ITERATIONS = 10;\r\n\r\n var kSplineTableSize = 11;\r\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\r\n\r\n var float32ArraySupported = typeof Float32Array === \"function\";\r\n\r\n function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\r\n function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\r\n function C (aA1) { return 3.0 * aA1; }\r\n\r\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\r\n function calcBezier (aT, aA1, aA2) {\r\n return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT;\r\n }\r\n\r\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\r\n function getSlope (aT, aA1, aA2) {\r\n return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\r\n }\r\n\r\n function binarySubdivide (aX, aA, aB, mX1, mX2) {\r\n var currentX, currentT, i = 0;\r\n do {\r\n currentT = aA + (aB - aA) / 2.0;\r\n currentX = calcBezier(currentT, mX1, mX2) - aX;\r\n if (currentX > 0.0) {\r\n aB = currentT;\r\n } else {\r\n aA = currentT;\r\n }\r\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\r\n return currentT;\r\n }\r\n\r\n function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\r\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\r\n var currentSlope = getSlope(aGuessT, mX1, mX2);\r\n if (currentSlope === 0.0) return aGuessT;\r\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\r\n aGuessT -= currentX / currentSlope;\r\n }\r\n return aGuessT;\r\n }\r\n\r\n /**\r\n * points is an array of [ mX1, mY1, mX2, mY2 ]\r\n */\r\n function BezierEasing (points) {\r\n this._p = points;\r\n this._mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\r\n this._precomputed = false;\r\n\r\n this.get = this.get.bind(this);\r\n }\r\n\r\n BezierEasing.prototype = {\r\n\r\n get: function (x) {\r\n var mX1 = this._p[0],\r\n mY1 = this._p[1],\r\n mX2 = this._p[2],\r\n mY2 = this._p[3];\r\n if (!this._precomputed) this._precompute();\r\n if (mX1 === mY1 && mX2 === mY2) return x; // linear\r\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\r\n if (x === 0) return 0;\r\n if (x === 1) return 1;\r\n return calcBezier(this._getTForX(x), mY1, mY2);\r\n },\r\n\r\n // Private part\r\n\r\n _precompute: function () {\r\n var mX1 = this._p[0],\r\n mY1 = this._p[1],\r\n mX2 = this._p[2],\r\n mY2 = this._p[3];\r\n this._precomputed = true;\r\n if (mX1 !== mY1 || mX2 !== mY2)\r\n this._calcSampleValues();\r\n },\r\n\r\n _calcSampleValues: function () {\r\n var mX1 = this._p[0],\r\n mX2 = this._p[2];\r\n for (var i = 0; i < kSplineTableSize; ++i) {\r\n this._mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\r\n }\r\n },\r\n\r\n /**\r\n * getTForX chose the fastest heuristic to determine the percentage value precisely from a given X projection.\r\n */\r\n _getTForX: function (aX) {\r\n var mX1 = this._p[0],\r\n mX2 = this._p[2],\r\n mSampleValues = this._mSampleValues;\r\n\r\n var intervalStart = 0.0;\r\n var currentSample = 1;\r\n var lastSample = kSplineTableSize - 1;\r\n\r\n for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\r\n intervalStart += kSampleStepSize;\r\n }\r\n --currentSample;\r\n\r\n // Interpolate to provide an initial guess for t\r\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample+1] - mSampleValues[currentSample]);\r\n var guessForT = intervalStart + dist * kSampleStepSize;\r\n\r\n var initialSlope = getSlope(guessForT, mX1, mX2);\r\n if (initialSlope >= NEWTON_MIN_SLOPE) {\r\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\r\n } else if (initialSlope === 0.0) {\r\n return guessForT;\r\n } else {\r\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\r\n }\r\n }\r\n };\r\n\r\n return ob;\r\n\r\n}());\r\n(function () {\r\n var lastTime = 0;\r\n var vendors = ['ms', 'moz', 'webkit', 'o'];\r\n for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\r\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\r\n }\r\n if(!window.requestAnimationFrame)\r\n window.requestAnimationFrame = function (callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function () {\r\n callback(currTime + timeToCall);\r\n },\r\n timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n if(!window.cancelAnimationFrame)\r\n window.cancelAnimationFrame = function (id) {\r\n clearTimeout(id);\r\n };\r\n}());\r\n\r\nfunction extendPrototype(sources,destination){\r\n var i, len = sources.length, sourcePrototype;\r\n for (i = 0;i < len;i += 1) {\r\n sourcePrototype = sources[i].prototype;\r\n for (var attr in sourcePrototype) {\r\n if (sourcePrototype.hasOwnProperty(attr)) destination.prototype[attr] = sourcePrototype[attr];\r\n }\r\n }\r\n}\r\n\r\nfunction getDescriptor(object, prop) {\r\n return Object.getOwnPropertyDescriptor(object, prop);\r\n}\r\n\r\nfunction createProxyFunction(prototype) {\r\n\tfunction ProxyFunction(){}\r\n\tProxyFunction.prototype = prototype;\r\n\treturn ProxyFunction;\r\n}\r\nfunction bezFunction(){\r\n\r\n var easingFunctions = [];\r\n var math = Math;\r\n\r\n function pointOnLine2D(x1,y1, x2,y2, x3,y3){\r\n var det1 = (x1*y2) + (y1*x3) + (x2*y3) - (x3*y2) - (y3*x1) - (x2*y1);\r\n return det1 > -0.001 && det1 < 0.001;\r\n }\r\n\r\n function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){\r\n if(z1 === 0 && z2 === 0 && z3 === 0) {\r\n return pointOnLine2D(x1,y1, x2,y2, x3,y3);\r\n }\r\n var dist1 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2));\r\n var dist2 = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2) + Math.pow(z3 - z1, 2));\r\n var dist3 = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2) + Math.pow(z3 - z2, 2));\r\n var diffDist;\r\n if(dist1 > dist2){\r\n if(dist1 > dist3){\r\n diffDist = dist1 - dist2 - dist3;\r\n } else {\r\n diffDist = dist3 - dist2 - dist1;\r\n }\r\n } else if(dist3 > dist2){\r\n diffDist = dist3 - dist2 - dist1;\r\n } else {\r\n diffDist = dist2 - dist1 - dist3;\r\n }\r\n return diffDist > -0.0001 && diffDist < 0.0001;\r\n }\r\n\r\n var getBezierLength = (function(){\r\n\r\n return function(pt1,pt2,pt3,pt4){\r\n var curveSegments = defaultCurveSegments;\r\n var k;\r\n var i, len;\r\n var ptCoord,perc,addedLength = 0;\r\n var ptDistance;\r\n var point = [],lastPoint = [];\r\n var lengthData = bezier_length_pool.newElement();\r\n len = pt3.length;\r\n for(k=0;k<curveSegments;k+=1){\r\n perc = k/(curveSegments-1);\r\n ptDistance = 0;\r\n for(i=0;i<len;i+=1){\r\n ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*pt3[i]+3*(1-perc)*bm_pow(perc,2)*pt4[i]+bm_pow(perc,3)*pt2[i];\r\n point[i] = ptCoord;\r\n if(lastPoint[i] !== null){\r\n ptDistance += bm_pow(point[i] - lastPoint[i],2);\r\n }\r\n lastPoint[i] = point[i];\r\n }\r\n if(ptDistance){\r\n ptDistance = bm_sqrt(ptDistance);\r\n addedLength += ptDistance;\r\n }\r\n lengthData.percents[k] = perc;\r\n lengthData.lengths[k] = addedLength;\r\n }\r\n lengthData.addedLength = addedLength;\r\n return lengthData;\r\n };\r\n }());\r\n\r\n function getSegmentsLength(shapeData) {\r\n var segmentsLength = segments_length_pool.newElement();\r\n var closed = shapeData.c;\r\n var pathV = shapeData.v;\r\n var pathO = shapeData.o;\r\n var pathI = shapeData.i;\r\n var i, len = shapeData._length;\r\n var lengths = segmentsLength.lengths;\r\n var totalLength = 0;\r\n for(i=0;i<len-1;i+=1){\r\n lengths[i] = getBezierLength(pathV[i],pathV[i+1],pathO[i],pathI[i+1]);\r\n totalLength += lengths[i].addedLength;\r\n }\r\n if(closed && len){\r\n lengths[i] = getBezierLength(pathV[i],pathV[0],pathO[i],pathI[0]);\r\n totalLength += lengths[i].addedLength;\r\n }\r\n segmentsLength.totalLength = totalLength;\r\n return segmentsLength;\r\n }\r\n\r\n function BezierData(length){\r\n this.segmentLength = 0;\r\n this.points = new Array(length);\r\n }\r\n\r\n function PointData(partial,point){\r\n this.partialLength = partial;\r\n this.point = point;\r\n }\r\n\r\n var buildBezierData = (function(){\r\n\r\n var storedData = {};\r\n\r\n return function (pt1, pt2, pt3, pt4){\r\n var bezierName = (pt1[0]+'_'+pt1[1]+'_'+pt2[0]+'_'+pt2[1]+'_'+pt3[0]+'_'+pt3[1]+'_'+pt4[0]+'_'+pt4[1]).replace(/\\./g, 'p');\r\n if(!storedData[bezierName]){\r\n var curveSegments = defaultCurveSegments;\r\n var k, i, len;\r\n var ptCoord,perc,addedLength = 0;\r\n var ptDistance;\r\n var point,lastPoint = null;\r\n if (pt1.length === 2 && (pt1[0] != pt2[0] || pt1[1] != pt2[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){\r\n curveSegments = 2;\r\n }\r\n var bezierData = new BezierData(curveSegments);\r\n len = pt3.length;\r\n for (k = 0; k < curveSegments; k += 1) {\r\n point = createSizedArray(len);\r\n perc = k / (curveSegments - 1);\r\n ptDistance = 0;\r\n for (i = 0; i < len; i += 1){\r\n ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*(pt1[i] + pt3[i])+3*(1-perc)*bm_pow(perc,2)*(pt2[i] + pt4[i])+bm_pow(perc,3)*pt2[i];\r\n point[i] = ptCoord;\r\n if(lastPoint !== null){\r\n ptDistance += bm_pow(point[i] - lastPoint[i],2);\r\n }\r\n }\r\n ptDistance = bm_sqrt(ptDistance);\r\n addedLength += ptDistance;\r\n bezierData.points[k] = new PointData(ptDistance, point);\r\n lastPoint = point;\r\n }\r\n bezierData.segmentLength = addedLength;\r\n storedData[bezierName] = bezierData;\r\n }\r\n return storedData[bezierName];\r\n };\r\n }());\r\n\r\n function getDistancePerc(perc,bezierData){\r\n var percents = bezierData.percents;\r\n var lengths = bezierData.lengths;\r\n var len = percents.length;\r\n var initPos = bm_floor((len-1)*perc);\r\n var lengthPos = perc*bezierData.addedLength;\r\n var lPerc = 0;\r\n if(initPos === len - 1 || initPos === 0 || lengthPos === lengths[initPos]){\r\n return percents[initPos];\r\n }else{\r\n var dir = lengths[initPos] > lengthPos ? -1 : 1;\r\n var flag = true;\r\n while(flag){\r\n if(lengths[initPos] <= lengthPos && lengths[initPos+1] > lengthPos){\r\n lPerc = (lengthPos - lengths[initPos]) / (lengths[initPos+1] - lengths[initPos]);\r\n flag = false;\r\n }else{\r\n initPos += dir;\r\n }\r\n if(initPos < 0 || initPos >= len - 1){\r\n //FIX for TypedArrays that don't store floating point values with enough accuracy\r\n if(initPos === len - 1) {\r\n return percents[initPos];\r\n }\r\n flag = false;\r\n }\r\n }\r\n return percents[initPos] + (percents[initPos+1] - percents[initPos])*lPerc;\r\n }\r\n }\r\n\r\n function getPointInSegment(pt1, pt2, pt3, pt4, percent, bezierData) {\r\n var t1 = getDistancePerc(percent,bezierData);\r\n var u0 = 1;\r\n var u1 = 1 - t1;\r\n var ptX = Math.round((u1*u1*u1* pt1[0] + (t1*u1*u1 + u1*t1*u1 + u1*u1*t1)* pt3[0] + (t1*t1*u1 + u1*t1*t1 + t1*u1*t1)*pt4[0] + t1*t1*t1* pt2[0])* 1000) / 1000;\r\n var ptY = Math.round((u1*u1*u1* pt1[1] + (t1*u1*u1 + u1*t1*u1 + u1*u1*t1)* pt3[1] + (t1*t1*u1 + u1*t1*t1 + t1*u1*t1)*pt4[1] + t1*t1*t1* pt2[1])* 1000) / 1000;\r\n return [ptX, ptY];\r\n }\r\n\r\n function getSegmentArray() {\r\n\r\n }\r\n\r\n var bezier_segment_points = createTypedArray('float32', 8);\r\n\r\n function getNewSegment(pt1,pt2,pt3,pt4,startPerc,endPerc, bezierData){\r\n\r\n startPerc = startPerc < 0 ? 0 : startPerc > 1 ? 1 : startPerc;\r\n var t0 = getDistancePerc(startPerc,bezierData);\r\n endPerc = endPerc > 1 ? 1 : endPerc;\r\n var t1 = getDistancePerc(endPerc,bezierData);\r\n var i, len = pt1.length;\r\n var u0 = 1 - t0;\r\n var u1 = 1 - t1;\r\n var u0u0u0 = u0*u0*u0;\r\n var t0u0u0_3 = t0*u0*u0*3;\r\n var t0t0u0_3 = t0*t0*u0*3;\r\n var t0t0t0 = t0*t0*t0;\r\n //\r\n var u0u0u1 = u0*u0*u1;\r\n var t0u0u1_3 = t0*u0*u1 + u0*t0*u1 + u0*u0*t1;\r\n var t0t0u1_3 = t0*t0*u1 + u0*t0*t1 + t0*u0*t1;\r\n var t0t0t1 = t0*t0*t1;\r\n //\r\n var u0u1u1 = u0*u1*u1;\r\n var t0u1u1_3 = t0*u1*u1 + u0*t1*u1 + u0*u1*t1;\r\n var t0t1u1_3 = t0*t1*u1 + u0*t1*t1 + t0*u1*t1;\r\n var t0t1t1 = t0*t1*t1;\r\n //\r\n var u1u1u1 = u1*u1*u1;\r\n var t1u1u1_3 = t1*u1*u1 + u1*t1*u1 + u1*u1*t1;\r\n var t1t1u1_3 = t1*t1*u1 + u1*t1*t1 + t1*u1*t1;\r\n var t1t1t1 = t1*t1*t1;\r\n for(i=0;i<len;i+=1){\r\n bezier_segment_points[i * 4] = Math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 1] = Math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 2] = Math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 3] = Math.round((u1u1u1 * pt1[i] + t1u1u1_3 * pt3[i] + t1t1u1_3 * pt4[i] + t1t1t1 * pt2[i]) * 1000) / 1000;\r\n }\r\n\r\n return bezier_segment_points;\r\n }\r\n\r\n return {\r\n getSegmentsLength : getSegmentsLength,\r\n getNewSegment : getNewSegment,\r\n getPointInSegment : getPointInSegment,\r\n buildBezierData : buildBezierData,\r\n pointOnLine2D : pointOnLine2D,\r\n pointOnLine3D : pointOnLine3D\r\n };\r\n}\r\n\r\nvar bez = bezFunction();\r\nfunction dataFunctionManager(){\r\n\r\n //var tCanvasHelper = createTag('canvas').getContext('2d');\r\n\r\n function completeLayers(layers, comps, fontManager){\r\n var layerData;\r\n var animArray, lastFrame;\r\n var i, len = layers.length;\r\n var j, jLen, k, kLen;\r\n for(i=0;i<len;i+=1){\r\n layerData = layers[i];\r\n if(!('ks' in layerData) || layerData.completed){\r\n continue;\r\n }\r\n layerData.completed = true;\r\n if(layerData.tt){\r\n layers[i-1].td = layerData.tt;\r\n }\r\n animArray = [];\r\n lastFrame = -1;\r\n if(layerData.hasMask){\r\n var maskProps = layerData.masksProperties;\r\n jLen = maskProps.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(maskProps[j].pt.k.i){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k);\r\n }else{\r\n kLen = maskProps[j].pt.k.length;\r\n for(k=0;k<kLen;k+=1){\r\n if(maskProps[j].pt.k[k].s){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);\r\n }\r\n if(maskProps[j].pt.k[k].e){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if(layerData.ty===0){\r\n layerData.layers = findCompLayers(layerData.refId, comps);\r\n completeLayers(layerData.layers,comps, fontManager);\r\n }else if(layerData.ty === 4){\r\n completeShapes(layerData.shapes);\r\n }else if(layerData.ty == 5){\r\n completeText(layerData, fontManager);\r\n }\r\n }\r\n }\r\n\r\n function findCompLayers(id,comps){\r\n var i = 0, len = comps.length;\r\n while(i<len){\r\n if(comps[i].id === id){\r\n if(!comps[i].layers.__used) {\r\n comps[i].layers.__used = true;\r\n return comps[i].layers;\r\n }\r\n return JSON.parse(JSON.stringify(comps[i].layers));\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function completeShapes(arr){\r\n var i, len = arr.length;\r\n var j, jLen;\r\n var hasPaths = false;\r\n for(i=len-1;i>=0;i-=1){\r\n if(arr[i].ty == 'sh'){\r\n if(arr[i].ks.k.i){\r\n convertPathsToAbsoluteValues(arr[i].ks.k);\r\n }else{\r\n jLen = arr[i].ks.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(arr[i].ks.k[j].s){\r\n convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);\r\n }\r\n if(arr[i].ks.k[j].e){\r\n convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]);\r\n }\r\n }\r\n }\r\n hasPaths = true;\r\n }else if(arr[i].ty == 'gr'){\r\n completeShapes(arr[i].it);\r\n }\r\n }\r\n /*if(hasPaths){\r\n //mx: distance\r\n //ss: sensitivity\r\n //dc: decay\r\n arr.splice(arr.length-1,0,{\r\n \"ty\": \"ms\",\r\n \"mx\":20,\r\n \"ss\":10,\r\n \"dc\":0.001,\r\n \"maxDist\":200\r\n });\r\n }*/\r\n }\r\n\r\n function convertPathsToAbsoluteValues(path){\r\n var i, len = path.i.length;\r\n for(i=0;i<len;i+=1){\r\n path.i[i][0] += path.v[i][0];\r\n path.i[i][1] += path.v[i][1];\r\n path.o[i][0] += path.v[i][0];\r\n path.o[i][1] += path.v[i][1];\r\n }\r\n }\r\n\r\n function checkVersion(minimum,animVersionString){\r\n var animVersion = animVersionString ? animVersionString.split('.') : [100,100,100];\r\n if(minimum[0]>animVersion[0]){\r\n return true;\r\n } else if(animVersion[0] > minimum[0]){\r\n return false;\r\n }\r\n if(minimum[1]>animVersion[1]){\r\n return true;\r\n } else if(animVersion[1] > minimum[1]){\r\n return false;\r\n }\r\n if(minimum[2]>animVersion[2]){\r\n return true;\r\n } else if(animVersion[2] > minimum[2]){\r\n return false;\r\n }\r\n }\r\n\r\n var checkText = (function(){\r\n var minimumVersion = [4,4,14];\r\n\r\n function updateTextLayer(textLayer){\r\n var documentData = textLayer.t.d;\r\n textLayer.t.d = {\r\n k: [\r\n {\r\n s:documentData,\r\n t:0\r\n }\r\n ]\r\n };\r\n }\r\n\r\n function iterateLayers(layers){\r\n var i, len = layers.length;\r\n for(i=0;i<len;i+=1){\r\n if(layers[i].ty === 5){\r\n updateTextLayer(layers[i]);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkChars = (function() {\r\n var minimumVersion = [4,7,99];\r\n return function (animationData){\r\n if(animationData.chars && !checkVersion(minimumVersion,animationData.v)){\r\n var i, len = animationData.chars.length, j, jLen, k, kLen;\r\n var pathData, paths;\r\n for(i = 0; i < len; i += 1) {\r\n if(animationData.chars[i].data && animationData.chars[i].data.shapes) {\r\n paths = animationData.chars[i].data.shapes[0].it;\r\n jLen = paths.length;\r\n\r\n for(j = 0; j < jLen; j += 1) {\r\n pathData = paths[j].ks.k;\r\n if(!pathData.__converted) {\r\n convertPathsToAbsoluteValues(paths[j].ks.k);\r\n pathData.__converted = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkColors = (function(){\r\n var minimumVersion = [4,1,9];\r\n\r\n function iterateShapes(shapes){\r\n var i, len = shapes.length;\r\n var j, jLen;\r\n for(i=0;i<len;i+=1){\r\n if(shapes[i].ty === 'gr'){\r\n iterateShapes(shapes[i].it);\r\n }else if(shapes[i].ty === 'fl' || shapes[i].ty === 'st'){\r\n if(shapes[i].c.k && shapes[i].c.k[0].i){\r\n jLen = shapes[i].c.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(shapes[i].c.k[j].s){\r\n shapes[i].c.k[j].s[0] /= 255;\r\n shapes[i].c.k[j].s[1] /= 255;\r\n shapes[i].c.k[j].s[2] /= 255;\r\n shapes[i].c.k[j].s[3] /= 255;\r\n }\r\n if(shapes[i].c.k[j].e){\r\n shapes[i].c.k[j].e[0] /= 255;\r\n shapes[i].c.k[j].e[1] /= 255;\r\n shapes[i].c.k[j].e[2] /= 255;\r\n shapes[i].c.k[j].e[3] /= 255;\r\n }\r\n }\r\n } else {\r\n shapes[i].c.k[0] /= 255;\r\n shapes[i].c.k[1] /= 255;\r\n shapes[i].c.k[2] /= 255;\r\n shapes[i].c.k[3] /= 255;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function iterateLayers(layers){\r\n var i, len = layers.length;\r\n for(i=0;i<len;i+=1){\r\n if(layers[i].ty === 4){\r\n iterateShapes(layers[i].shapes);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkShapes = (function(){\r\n var minimumVersion = [4,4,18];\r\n\r\n\r\n\r\n function completeShapes(arr){\r\n var i, len = arr.length;\r\n var j, jLen;\r\n var hasPaths = false;\r\n for(i=len-1;i>=0;i-=1){\r\n if(arr[i].ty == 'sh'){\r\n if(arr[i].ks.k.i){\r\n arr[i].ks.k.c = arr[i].closed;\r\n }else{\r\n jLen = arr[i].ks.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(arr[i].ks.k[j].s){\r\n arr[i].ks.k[j].s[0].c = arr[i].closed;\r\n }\r\n if(arr[i].ks.k[j].e){\r\n arr[i].ks.k[j].e[0].c = arr[i].closed;\r\n }\r\n }\r\n }\r\n hasPaths = true;\r\n }else if(arr[i].ty == 'gr'){\r\n completeShapes(arr[i].it);\r\n }\r\n }\r\n }\r\n\r\n function iterateLayers(layers){\r\n var layerData;\r\n var i, len = layers.length;\r\n var j, jLen, k, kLen;\r\n for(i=0;i<len;i+=1){\r\n layerData = layers[i];\r\n if(layerData.hasMask){\r\n var maskProps = layerData.masksProperties;\r\n jLen = maskProps.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(maskProps[j].pt.k.i){\r\n maskProps[j].pt.k.c = maskProps[j].cl;\r\n }else{\r\n kLen = maskProps[j].pt.k.length;\r\n for(k=0;k<kLen;k+=1){\r\n if(maskProps[j].pt.k[k].s){\r\n maskProps[j].pt.k[k].s[0].c = maskProps[j].cl;\r\n }\r\n if(maskProps[j].pt.k[k].e){\r\n maskProps[j].pt.k[k].e[0].c = maskProps[j].cl;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if(layerData.ty === 4){\r\n completeShapes(layerData.shapes);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n function completeData(animationData, fontManager){\r\n if(animationData.__complete){\r\n return;\r\n }\r\n checkColors(animationData);\r\n checkText(animationData);\r\n checkChars(animationData);\r\n checkShapes(animationData);\r\n completeLayers(animationData.layers, animationData.assets, fontManager);\r\n animationData.__complete = true;\r\n //blitAnimation(animationData, animationData.assets, fontManager);\r\n }\r\n\r\n function completeText(data, fontManager){\r\n if(data.t.a.length === 0 && !('m' in data.t.p)){\r\n data.singleShape = true;\r\n }\r\n }\r\n\r\n var moduleOb = {};\r\n moduleOb.completeData = completeData;\r\n\r\n return moduleOb;\r\n}\r\n\r\nvar dataManager = dataFunctionManager();\r\nvar FontManager = (function(){\r\n\r\n var maxWaitingTime = 5000;\r\n var emptyChar = {\r\n w: 0,\r\n size:0,\r\n shapes:[]\r\n };\r\n var combinedCharacters = [];\r\n //Hindi characters\r\n combinedCharacters = combinedCharacters.concat([2304, 2305, 2306, 2307, 2362, 2363, 2364, 2364, 2366\r\n , 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379\r\n , 2380, 2381, 2382, 2383, 2387, 2388, 2389, 2390, 2391, 2402, 2403]);\r\n\r\n function setUpNode(font, family){\r\n var parentNode = createTag('span');\r\n parentNode.style.fontFamily = family;\r\n var node = createTag('span');\r\n // Characters that vary significantly among different fonts\r\n node.innerHTML = 'giItT1WQy@!-/#';\r\n // Visible - so we can measure it - but not on the screen\r\n parentNode.style.position = 'absolute';\r\n parentNode.style.left = '-10000px';\r\n parentNode.style.top = '-10000px';\r\n // Large font size makes even subtle changes obvious\r\n parentNode.style.fontSize = '300px';\r\n // Reset any font properties\r\n parentNode.style.fontVariant = 'normal';\r\n parentNode.style.fontStyle = 'normal';\r\n parentNode.style.fontWeight = 'normal';\r\n parentNode.style.letterSpacing = '0';\r\n parentNode.appendChild(node);\r\n document.body.appendChild(parentNode);\r\n\r\n // Remember width with no applied web font\r\n var width = node.offsetWidth;\r\n node.style.fontFamily = font + ', '+family;\r\n return {node:node, w:width, parent:parentNode};\r\n }\r\n\r\n function checkLoadedFonts() {\r\n var i, len = this.fonts.length;\r\n var node, w;\r\n var loadedCount = len;\r\n for(i=0;i<len; i+= 1){\r\n if(this.fonts[i].loaded){\r\n loadedCount -= 1;\r\n continue;\r\n }\r\n if(this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0){\r\n this.fonts[i].loaded = true;\r\n } else{\r\n node = this.fonts[i].monoCase.node;\r\n w = this.fonts[i].monoCase.w;\r\n if(node.offsetWidth !== w){\r\n loadedCount -= 1;\r\n this.fonts[i].loaded = true;\r\n }else{\r\n node = this.fonts[i].sansCase.node;\r\n w = this.fonts[i].sansCase.w;\r\n if(node.offsetWidth !== w){\r\n loadedCount -= 1;\r\n this.fonts[i].loaded = true;\r\n }\r\n }\r\n if(this.fonts[i].loaded){\r\n this.fonts[i].sansCase.parent.parentNode.removeChild(this.fonts[i].sansCase.parent);\r\n this.fonts[i].monoCase.parent.parentNode.removeChild(this.fonts[i].monoCase.parent);\r\n }\r\n }\r\n }\r\n\r\n if(loadedCount !== 0 && Date.now() - this.initTime < maxWaitingTime){\r\n setTimeout(this.checkLoadedFonts.bind(this),20);\r\n }else{\r\n setTimeout(function(){this.isLoaded = true;}.bind(this),0);\r\n\r\n }\r\n }\r\n\r\n function createHelper(def, fontData){\r\n var tHelper = createNS('text');\r\n tHelper.style.fontSize = '100px';\r\n //tHelper.style.fontFamily = fontData.fFamily;\r\n tHelper.setAttribute('font-family', fontData.fFamily);\r\n tHelper.setAttribute('font-style', fontData.fStyle);\r\n tHelper.setAttribute('font-weight', fontData.fWeight);\r\n tHelper.textContent = '1';\r\n if(fontData.fClass){\r\n tHelper.style.fontFamily = 'inherit';\r\n tHelper.setAttribute('class', fontData.fClass);\r\n } else {\r\n tHelper.style.fontFamily = fontData.fFamily;\r\n }\r\n def.appendChild(tHelper);\r\n var tCanvasHelper = createTag('canvas').getContext('2d');\r\n tCanvasHelper.font = fontData.fWeight + ' ' + fontData.fStyle + ' 100px '+ fontData.fFamily;\r\n //tCanvasHelper.font = ' 100px '+ fontData.fFamily;\r\n return tHelper;\r\n }\r\n\r\n function addFonts(fontData, defs){\r\n if(!fontData){\r\n this.isLoaded = true;\r\n return;\r\n }\r\n if(this.chars){\r\n this.isLoaded = true;\r\n this.fonts = fontData.list;\r\n return;\r\n }\r\n\r\n\r\n var fontArr = fontData.list;\r\n var i, len = fontArr.length;\r\n var _pendingFonts = len;\r\n for(i=0; i<len; i+= 1){\r\n var shouldLoadFont = true;\r\n var loadedSelector;\r\n var j;\r\n fontArr[i].loaded = false;\r\n fontArr[i].monoCase = setUpNode(fontArr[i].fFamily,'monospace');\r\n fontArr[i].sansCase = setUpNode(fontArr[i].fFamily,'sans-serif');\r\n if(!fontArr[i].fPath) {\r\n fontArr[i].loaded = true;\r\n _pendingFonts -= 1;\r\n }else if(fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3){\r\n loadedSelector = document.querySelectorAll('style[f-forigin=\"p\"][f-family=\"'+ fontArr[i].fFamily +'\"], style[f-origin=\"3\"][f-family=\"'+ fontArr[i].fFamily +'\"]');\r\n\r\n if (loadedSelector.length > 0) {\r\n shouldLoadFont = false;\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var s = createTag('style');\r\n s.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n s.setAttribute('f-origin', fontArr[i].origin);\r\n s.setAttribute('f-family', fontArr[i].fFamily);\r\n s.type = \"text/css\";\r\n s.innerHTML = \"@font-face {\" + \"font-family: \"+fontArr[i].fFamily+\"; font-style: normal; src: url('\"+fontArr[i].fPath+\"');}\";\r\n defs.appendChild(s);\r\n }\r\n } else if(fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1){\r\n loadedSelector = document.querySelectorAll('link[f-forigin=\"g\"], link[f-origin=\"1\"]');\r\n\r\n for (j = 0; j < loadedSelector.length; j++) {\r\n if (loadedSelector[j].href.indexOf(fontArr[i].fPath) !== -1) {\r\n // Font is already loaded\r\n shouldLoadFont = false;\r\n }\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var l = createTag('link');\r\n l.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n l.setAttribute('f-origin', fontArr[i].origin);\r\n l.type = \"text/css\";\r\n l.rel = \"stylesheet\";\r\n l.href = fontArr[i].fPath;\r\n document.body.appendChild(l);\r\n }\r\n } else if(fontArr[i].fOrigin === 't' || fontArr[i].origin === 2){\r\n loadedSelector = document.querySelectorAll('script[f-forigin=\"t\"], script[f-origin=\"2\"]');\r\n\r\n for (j = 0; j < loadedSelector.length; j++) {\r\n if (fontArr[i].fPath === loadedSelector[j].src) {\r\n // Font is already loaded\r\n shouldLoadFont = false;\r\n }\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var sc = createTag('link');\r\n sc.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n sc.setAttribute('f-origin', fontArr[i].origin);\r\n sc.setAttribute('rel','stylesheet');\r\n sc.setAttribute('href',fontArr[i].fPath);\r\n defs.appendChild(sc);\r\n }\r\n }\r\n fontArr[i].helper = createHelper(defs,fontArr[i]);\r\n fontArr[i].cache = {};\r\n this.fonts.push(fontArr[i]);\r\n }\r\n if (_pendingFonts === 0) {\r\n this.isLoaded = true;\r\n } else {\r\n //On some cases even if the font is loaded, it won't load correctly when measuring text on canvas.\r\n //Adding this timeout seems to fix it\r\n setTimeout(this.checkLoadedFonts.bind(this), 100);\r\n }\r\n }\r\n\r\n function addChars(chars){\r\n if(!chars){\r\n return;\r\n }\r\n if(!this.chars){\r\n this.chars = [];\r\n }\r\n var i, len = chars.length;\r\n var j, jLen = this.chars.length, found;\r\n for(i=0;i<len;i+=1){\r\n j = 0;\r\n found = false;\r\n while(j<jLen){\r\n if(this.chars[j].style === chars[i].style && this.chars[j].fFamily === chars[i].fFamily && this.chars[j].ch === chars[i].ch){\r\n found = true;\r\n }\r\n j += 1;\r\n }\r\n if(!found){\r\n this.chars.push(chars[i]);\r\n jLen += 1;\r\n }\r\n }\r\n }\r\n\r\n function getCharData(char, style, font){\r\n var i = 0, len = this.chars.length;\r\n while( i < len) {\r\n if(this.chars[i].ch === char && this.chars[i].style === style && this.chars[i].fFamily === font){\r\n\r\n return this.chars[i];\r\n }\r\n i+= 1;\r\n }\r\n if((typeof char === 'string' && char.charCodeAt(0) !== 13 || !char) && console && console.warn) {\r\n console.warn('Missing character from exported characters list: ', char, style, font);\r\n }\r\n return emptyChar;\r\n }\r\n\r\n function measureText(char, fontName, size) {\r\n var fontData = this.getFontByName(fontName);\r\n var index = char.charCodeAt(0);\r\n if(!fontData.cache[index + 1]) {\r\n var tHelper = fontData.helper;\r\n //Canvas version\r\n //fontData.cache[index] = tHelper.measureText(char).width / 100;\r\n //SVG version\r\n //console.log(tHelper.getBBox().width)\r\n if (char === ' ') {\r\n tHelper.textContent = '|' + char + '|';\r\n var doubleSize = tHelper.getComputedTextLength();\r\n tHelper.textContent = '||';\r\n var singleSize = tHelper.getComputedTextLength();\r\n fontData.cache[index + 1] = (doubleSize - singleSize)/100;\r\n } else {\r\n tHelper.textContent = char;\r\n fontData.cache[index + 1] = (tHelper.getComputedTextLength())/100;\r\n }\r\n }\r\n return fontData.cache[index + 1] * size;\r\n }\r\n\r\n function getFontByName(name){\r\n var i = 0, len = this.fonts.length;\r\n while(i<len){\r\n if(this.fonts[i].fName === name) {\r\n return this.fonts[i];\r\n }\r\n i += 1;\r\n }\r\n return this.fonts[0];\r\n }\r\n\r\n function getCombinedCharacterCodes() {\r\n return combinedCharacters;\r\n }\r\n\r\n function loaded() {\r\n return this.isLoaded;\r\n }\r\n\r\n var Font = function(){\r\n this.fonts = [];\r\n this.chars = null;\r\n this.typekitLoaded = 0;\r\n this.isLoaded = false;\r\n this.initTime = Date.now();\r\n };\r\n //TODO: for now I'm adding these methods to the Class and not the prototype. Think of a better way to implement it. \r\n Font.getCombinedCharacterCodes = getCombinedCharacterCodes;\r\n\r\n Font.prototype.addChars = addChars;\r\n Font.prototype.addFonts = addFonts;\r\n Font.prototype.getCharData = getCharData;\r\n Font.prototype.getFontByName = getFontByName;\r\n Font.prototype.measureText = measureText;\r\n Font.prototype.checkLoadedFonts = checkLoadedFonts;\r\n Font.prototype.loaded = loaded;\r\n\r\n return Font;\r\n\r\n}());\r\nvar PropertyFactory = (function(){\r\n\r\n var initFrame = initialDefaultFrame;\r\n var math_abs = Math.abs;\r\n\r\n function interpolateValue(frameNum, caching) {\r\n var offsetTime = this.offsetTime;\r\n var newValue;\r\n if (this.propType === 'multidimensional') {\r\n newValue = createTypedArray('float32', this.pv.length);\r\n }\r\n var iterationIndex = caching.lastIndex;\r\n var i = iterationIndex;\r\n var len = this.keyframes.length - 1, flag = true;\r\n var keyData, nextKeyData;\r\n\r\n while (flag) {\r\n keyData = this.keyframes[i];\r\n nextKeyData = this.keyframes[i + 1];\r\n if (i === len - 1 && frameNum >= nextKeyData.t - offsetTime){\r\n if(keyData.h){\r\n keyData = nextKeyData;\r\n }\r\n iterationIndex = 0;\r\n break;\r\n }\r\n if ((nextKeyData.t - offsetTime) > frameNum){\r\n iterationIndex = i;\r\n break;\r\n }\r\n if (i < len - 1){\r\n i += 1;\r\n } else {\r\n iterationIndex = 0;\r\n flag = false;\r\n }\r\n }\r\n\r\n var k, kLen, perc, jLen, j, fnc;\r\n var nextKeyTime = nextKeyData.t - offsetTime;\r\n var keyTime = keyData.t - offsetTime;\r\n var endValue;\r\n if (keyData.to) {\r\n if (!keyData.bezierData) {\r\n keyData.bezierData = bez.buildBezierData(keyData.s, nextKeyData.s || keyData.e, keyData.to, keyData.ti);\r\n }\r\n var bezierData = keyData.bezierData;\r\n if (frameNum >= nextKeyTime || frameNum < keyTime) {\r\n var ind = frameNum >= nextKeyTime ? bezierData.points.length - 1 : 0;\r\n kLen = bezierData.points[ind].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[ind].point[k];\r\n }\r\n // caching._lastKeyframeIndex = -1;\r\n } else {\r\n if (keyData.__fnct) {\r\n fnc = keyData.__fnct;\r\n } else {\r\n fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y, keyData.n).get;\r\n keyData.__fnct = fnc;\r\n }\r\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime));\r\n var distanceInLine = bezierData.segmentLength*perc;\r\n\r\n var segmentPerc;\r\n var addedLength = (caching.lastFrame < frameNum && caching._lastKeyframeIndex === i) ? caching._lastAddedLength : 0;\r\n j = (caching.lastFrame < frameNum && caching._lastKeyframeIndex === i) ? caching._lastPoint : 0;\r\n flag = true;\r\n jLen = bezierData.points.length;\r\n while (flag) {\r\n addedLength += bezierData.points[j].partialLength;\r\n if (distanceInLine === 0 || perc === 0 || j === bezierData.points.length - 1) {\r\n kLen = bezierData.points[j].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[j].point[k];\r\n }\r\n break;\r\n } else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {\r\n segmentPerc = (distanceInLine - addedLength) / bezierData.points[j + 1].partialLength;\r\n kLen = bezierData.points[j].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc;\r\n }\r\n break;\r\n }\r\n if (j < jLen - 1){\r\n j += 1;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n caching._lastPoint = j;\r\n caching._lastAddedLength = addedLength - bezierData.points[j].partialLength;\r\n caching._lastKeyframeIndex = i;\r\n }\r\n } else {\r\n var outX, outY, inX, inY, keyValue;\r\n len = keyData.s.length;\r\n endValue = nextKeyData.s || keyData.e;\r\n if (this.sh && keyData.h !== 1) {\r\n if (frameNum >= nextKeyTime) {\r\n newValue[0] = endValue[0];\r\n newValue[1] = endValue[1];\r\n newValue[2] = endValue[2];\r\n } else if (frameNum <= keyTime) {\r\n newValue[0] = keyData.s[0];\r\n newValue[1] = keyData.s[1];\r\n newValue[2] = keyData.s[2];\r\n } else {\r\n var quatStart = createQuaternion(keyData.s);\r\n var quatEnd = createQuaternion(endValue);\r\n var time = (frameNum - keyTime) / (nextKeyTime - keyTime);\r\n quaternionToEuler(newValue, slerp(quatStart, quatEnd, time));\r\n }\r\n \r\n } else {\r\n for(i = 0; i < len; i += 1) {\r\n if (keyData.h !== 1) {\r\n if (frameNum >= nextKeyTime) {\r\n perc = 1;\r\n } else if(frameNum < keyTime) {\r\n perc = 0;\r\n } else {\r\n if(keyData.o.x.constructor === Array) {\r\n if (!keyData.__fnct) {\r\n keyData.__fnct = [];\r\n }\r\n if (!keyData.__fnct[i]) {\r\n outX = (typeof keyData.o.x[i] === 'undefined') ? keyData.o.x[0] : keyData.o.x[i];\r\n outY = (typeof keyData.o.y[i] === 'undefined') ? keyData.o.y[0] : keyData.o.y[i];\r\n inX = (typeof keyData.i.x[i] === 'undefined') ? keyData.i.x[0] : keyData.i.x[i];\r\n inY = (typeof keyData.i.y[i] === 'undefined') ? keyData.i.y[0] : keyData.i.y[i];\r\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\r\n keyData.__fnct[i] = fnc;\r\n } else {\r\n fnc = keyData.__fnct[i];\r\n }\r\n } else {\r\n if (!keyData.__fnct) {\r\n outX = keyData.o.x;\r\n outY = keyData.o.y;\r\n inX = keyData.i.x;\r\n inY = keyData.i.y;\r\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\r\n keyData.__fnct = fnc;\r\n } else {\r\n fnc = keyData.__fnct;\r\n }\r\n }\r\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime ));\r\n }\r\n }\r\n\r\n endValue = nextKeyData.s || keyData.e;\r\n keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (endValue[i] - keyData.s[i]) * perc;\r\n\r\n if (this.propType === 'multidimensional') {\r\n newValue[i] = keyValue;\r\n } else {\r\n newValue = keyValue;\r\n }\r\n }\r\n }\r\n }\r\n caching.lastIndex = iterationIndex;\r\n return newValue;\r\n }\r\n\r\n //based on @Toji's https://github.com/toji/gl-matrix/\r\n function slerp(a, b, t) {\r\n var out = [];\r\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\r\n bx = b[0], by = b[1], bz = b[2], bw = b[3]\r\n\r\n var omega, cosom, sinom, scale0, scale1;\r\n\r\n cosom = ax * bx + ay * by + az * bz + aw * bw;\r\n if (cosom < 0.0) {\r\n cosom = -cosom;\r\n bx = -bx;\r\n by = -by;\r\n bz = -bz;\r\n bw = -bw;\r\n }\r\n if ((1.0 - cosom) > 0.000001) {\r\n omega = Math.acos(cosom);\r\n sinom = Math.sin(omega);\r\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\r\n scale1 = Math.sin(t * omega) / sinom;\r\n } else {\r\n scale0 = 1.0 - t;\r\n scale1 = t;\r\n }\r\n out[0] = scale0 * ax + scale1 * bx;\r\n out[1] = scale0 * ay + scale1 * by;\r\n out[2] = scale0 * az + scale1 * bz;\r\n out[3] = scale0 * aw + scale1 * bw;\r\n\r\n return out;\r\n }\r\n\r\n function quaternionToEuler(out, quat) {\r\n var qx = quat[0];\r\n var qy = quat[1];\r\n var qz = quat[2];\r\n var qw = quat[3];\r\n var heading = Math.atan2(2*qy*qw-2*qx*qz , 1 - 2*qy*qy - 2*qz*qz)\r\n var attitude = Math.asin(2*qx*qy + 2*qz*qw) \r\n var bank = Math.atan2(2*qx*qw-2*qy*qz , 1 - 2*qx*qx - 2*qz*qz);\r\n out[0] = heading/degToRads;\r\n out[1] = attitude/degToRads;\r\n out[2] = bank/degToRads;\r\n }\r\n\r\n function createQuaternion(values) {\r\n var heading = values[0] * degToRads;\r\n var attitude = values[1] * degToRads;\r\n var bank = values[2] * degToRads;\r\n var c1 = Math.cos(heading / 2);\r\n var c2 = Math.cos(attitude / 2);\r\n var c3 = Math.cos(bank / 2);\r\n var s1 = Math.sin(heading / 2);\r\n var s2 = Math.sin(attitude / 2);\r\n var s3 = Math.sin(bank / 2);\r\n var w = c1 * c2 * c3 - s1 * s2 * s3;\r\n var x = s1 * s2 * c3 + c1 * c2 * s3;\r\n var y = s1 * c2 * c3 + c1 * s2 * s3;\r\n var z = c1 * s2 * c3 - s1 * c2 * s3;\r\n\r\n return [x,y,z,w];\r\n }\r\n\r\n function getValueAtCurrentTime(){\r\n var frameNum = this.comp.renderedFrame - this.offsetTime;\r\n var initTime = this.keyframes[0].t - this.offsetTime;\r\n var endTime = this.keyframes[this.keyframes.length- 1].t-this.offsetTime;\r\n if(!(frameNum === this._caching.lastFrame || (this._caching.lastFrame !== initFrame && ((this._caching.lastFrame >= endTime && frameNum >= endTime) || (this._caching.lastFrame < initTime && frameNum < initTime))))){\r\n if(this._caching.lastFrame >= frameNum) {\r\n this._caching._lastKeyframeIndex = -1;\r\n this._caching.lastIndex = 0;\r\n }\r\n\r\n var renderResult = this.interpolateValue(frameNum, this._caching);\r\n this.pv = renderResult;\r\n }\r\n this._caching.lastFrame = frameNum;\r\n return this.pv;\r\n }\r\n\r\n function setVValue(val) {\r\n var multipliedValue;\r\n if(this.propType === 'unidimensional') {\r\n multipliedValue = val * this.mult;\r\n if(math_abs(this.v - multipliedValue) > 0.00001) {\r\n this.v = multipliedValue;\r\n this._mdf = true;\r\n }\r\n } else {\r\n var i = 0, len = this.v.length;\r\n while (i < len) {\r\n multipliedValue = val[i] * this.mult;\r\n if (math_abs(this.v[i] - multipliedValue) > 0.00001) {\r\n this.v[i] = multipliedValue;\r\n this._mdf = true;\r\n }\r\n i += 1;\r\n }\r\n }\r\n }\r\n\r\n function processEffectsSequence() {\r\n if (this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) {\r\n return;\r\n }\r\n if(this.lock) {\r\n this.setVValue(this.pv);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = this._isFirstFrame;\r\n var multipliedValue;\r\n var i, len = this.effectsSequence.length;\r\n var finalValue = this.kf ? this.pv : this.data.k;\r\n for(i = 0; i < len; i += 1) {\r\n finalValue = this.effectsSequence[i](finalValue);\r\n }\r\n this.setVValue(finalValue);\r\n this._isFirstFrame = false;\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n }\r\n\r\n function addEffect(effectFunction) {\r\n this.effectsSequence.push(effectFunction);\r\n this.container.addDynamicProperty(this);\r\n }\r\n\r\n function ValueProperty(elem, data, mult, container){\r\n this.propType = 'unidimensional';\r\n this.mult = mult || 1;\r\n this.data = data;\r\n this.v = mult ? data.k * mult : data.k;\r\n this.pv = data.k;\r\n this._mdf = false;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.k = false;\r\n this.kf = false;\r\n this.vel = 0;\r\n this.effectsSequence = [];\r\n this._isFirstFrame = true;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function MultiDimensionalProperty(elem, data, mult, container) {\r\n this.propType = 'multidimensional';\r\n this.mult = mult || 1;\r\n this.data = data;\r\n this._mdf = false;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.k = false;\r\n this.kf = false;\r\n this.frameId = -1;\r\n var i, len = data.k.length;\r\n this.v = createTypedArray('float32', len);\r\n this.pv = createTypedArray('float32', len);\r\n var arr = createTypedArray('float32', len);\r\n this.vel = createTypedArray('float32', len);\r\n for (i = 0; i < len; i += 1) {\r\n this.v[i] = data.k[i] * this.mult;\r\n this.pv[i] = data.k[i];\r\n }\r\n this._isFirstFrame = true;\r\n this.effectsSequence = [];\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function KeyframedValueProperty(elem, data, mult, container) {\r\n this.propType = 'unidimensional';\r\n this.keyframes = data.k;\r\n this.offsetTime = elem.data.st;\r\n this.frameId = -1;\r\n this._caching = {lastFrame: initFrame, lastIndex: 0, value: 0, _lastKeyframeIndex: -1};\r\n this.k = true;\r\n this.kf = true;\r\n this.data = data;\r\n this.mult = mult || 1;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.v = initFrame;\r\n this.pv = initFrame;\r\n this._isFirstFrame = true;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.interpolateValue = interpolateValue;\r\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function KeyframedMultidimensionalProperty(elem, data, mult, container){\r\n this.propType = 'multidimensional';\r\n var i, len = data.k.length;\r\n var s, e,to,ti;\r\n for (i = 0; i < len - 1; i += 1) {\r\n if (data.k[i].to && data.k[i].s && data.k[i].e) {\r\n s = data.k[i].s;\r\n e = data.k[i].e;\r\n to = data.k[i].to;\r\n ti = data.k[i].ti;\r\n if((s.length === 2 && !(s[0] === e[0] && s[1] === e[1]) && bez.pointOnLine2D(s[0],s[1],e[0],e[1],s[0] + to[0],s[1] + to[1]) && bez.pointOnLine2D(s[0],s[1],e[0],e[1],e[0] + ti[0],e[1] + ti[1])) || (s.length === 3 && !(s[0] === e[0] && s[1] === e[1] && s[2] === e[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],s[0] + to[0],s[1] + to[1],s[2] + to[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],e[0] + ti[0],e[1] + ti[1],e[2] + ti[2]))){\r\n data.k[i].to = null;\r\n data.k[i].ti = null;\r\n }\r\n if(s[0] === e[0] && s[1] === e[1] && to[0] === 0 && to[1] === 0 && ti[0] === 0 && ti[1] === 0) {\r\n if(s.length === 2 || (s[2] === e[2] && to[2] === 0 && ti[2] === 0)) {\r\n data.k[i].to = null;\r\n data.k[i].ti = null;\r\n }\r\n }\r\n }\r\n }\r\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\r\n this.keyframes = data.k;\r\n this.offsetTime = elem.data.st;\r\n this.k = true;\r\n this.kf = true;\r\n this._isFirstFrame = true;\r\n this.mult = mult || 1;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.interpolateValue = interpolateValue;\r\n this.frameId = -1;\r\n var arrLen = data.k[0].s.length;\r\n this.v = createTypedArray('float32', arrLen);\r\n this.pv = createTypedArray('float32', arrLen);\r\n for (i = 0; i < arrLen; i += 1) {\r\n this.v[i] = initFrame;\r\n this.pv[i] = initFrame;\r\n }\r\n this._caching={lastFrame:initFrame,lastIndex:0,value:createTypedArray('float32', arrLen)};\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function getProp(elem,data,type, mult, container) {\r\n var p;\r\n if(!data.k.length){\r\n p = new ValueProperty(elem,data, mult, container);\r\n }else if(typeof(data.k[0]) === 'number'){\r\n p = new MultiDimensionalProperty(elem,data, mult, container);\r\n }else{\r\n switch(type){\r\n case 0:\r\n p = new KeyframedValueProperty(elem,data,mult, container);\r\n break;\r\n case 1:\r\n p = new KeyframedMultidimensionalProperty(elem,data,mult, container);\r\n break;\r\n }\r\n }\r\n if(p.effectsSequence.length){\r\n container.addDynamicProperty(p);\r\n }\r\n return p;\r\n }\r\n\r\n var ob = {\r\n getProp: getProp\r\n };\r\n return ob;\r\n}());\r\nvar TransformPropertyFactory = (function() {\r\n\r\n function applyToMatrix(mat) {\r\n var _mdf = this._mdf;\r\n this.iterateDynamicProperties();\r\n this._mdf = this._mdf || _mdf;\r\n if (this.a) {\r\n mat.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n }\r\n if (this.s) {\r\n mat.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n }\r\n if (this.sk) {\r\n mat.skewFromAxis(-this.sk.v, this.sa.v);\r\n }\r\n if (this.r) {\r\n mat.rotate(-this.r.v);\r\n } else {\r\n mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n }\r\n if (this.data.p.s) {\r\n if (this.data.p.z) {\r\n mat.translate(this.px.v, this.py.v, -this.pz.v);\r\n } else {\r\n mat.translate(this.px.v, this.py.v, 0);\r\n }\r\n } else {\r\n mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);\r\n }\r\n }\r\n function processKeys(forceRender){\r\n if (this.elem.globalData.frameId === this.frameId) {\r\n return;\r\n }\r\n if(this._isDirty) {\r\n this.precalculateMatrix();\r\n this._isDirty = false;\r\n }\r\n\r\n this.iterateDynamicProperties();\r\n\r\n if (this._mdf || forceRender) {\r\n this.v.cloneFromProps(this.pre.props);\r\n if (this.appliedTransformations < 1) {\r\n this.v.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n }\r\n if(this.appliedTransformations < 2) {\r\n this.v.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n }\r\n if (this.sk && this.appliedTransformations < 3) {\r\n this.v.skewFromAxis(-this.sk.v, this.sa.v);\r\n }\r\n if (this.r && this.appliedTransformations < 4) {\r\n this.v.rotate(-this.r.v);\r\n } else if (!this.r && this.appliedTransformations < 4){\r\n this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n }\r\n if (this.autoOriented) {\r\n var v1,v2, frameRate = this.elem.globalData.frameRate;\r\n if(this.p && this.p.keyframes && this.p.getValueAtTime) {\r\n if (this.p._caching.lastFrame+this.p.offsetTime <= this.p.keyframes[0].t) {\r\n v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / frameRate,0);\r\n v2 = this.p.getValueAtTime(this.p.keyframes[0].t / frameRate, 0);\r\n } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {\r\n v1 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t / frameRate), 0);\r\n v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.05) / frameRate, 0);\r\n } else {\r\n v1 = this.p.pv;\r\n v2 = this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / frameRate, this.p.offsetTime);\r\n }\r\n } else if(this.px && this.px.keyframes && this.py.keyframes && this.px.getValueAtTime && this.py.getValueAtTime) {\r\n v1 = [];\r\n v2 = [];\r\n var px = this.px, py = this.py, frameRate;\r\n if (px._caching.lastFrame+px.offsetTime <= px.keyframes[0].t) {\r\n v1[0] = px.getValueAtTime((px.keyframes[0].t + 0.01) / frameRate,0);\r\n v1[1] = py.getValueAtTime((py.keyframes[0].t + 0.01) / frameRate,0);\r\n v2[0] = px.getValueAtTime((px.keyframes[0].t) / frameRate,0);\r\n v2[1] = py.getValueAtTime((py.keyframes[0].t) / frameRate,0);\r\n } else if(px._caching.lastFrame+px.offsetTime >= px.keyframes[px.keyframes.length - 1].t) {\r\n v1[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t / frameRate),0);\r\n v1[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t / frameRate),0);\r\n v2[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t - 0.01) / frameRate,0);\r\n v2[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t - 0.01) / frameRate,0);\r\n } else {\r\n v1 = [px.pv, py.pv];\r\n v2[0] = px.getValueAtTime((px._caching.lastFrame+px.offsetTime - 0.01) / frameRate,px.offsetTime);\r\n v2[1] = py.getValueAtTime((py._caching.lastFrame+py.offsetTime - 0.01) / frameRate,py.offsetTime);\r\n }\r\n }\r\n this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));\r\n }\r\n if(this.data.p && this.data.p.s){\r\n if(this.data.p.z) {\r\n this.v.translate(this.px.v, this.py.v, -this.pz.v);\r\n } else {\r\n this.v.translate(this.px.v, this.py.v, 0);\r\n }\r\n }else{\r\n this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2]);\r\n }\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n }\r\n\r\n function precalculateMatrix() {\r\n if(!this.a.k) {\r\n this.pre.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n this.appliedTransformations = 1;\r\n } else {\r\n return;\r\n }\r\n if(!this.s.effectsSequence.length) {\r\n this.pre.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n this.appliedTransformations = 2;\r\n } else {\r\n return;\r\n }\r\n if(this.sk) {\r\n if(!this.sk.effectsSequence.length && !this.sa.effectsSequence.length) {\r\n this.pre.skewFromAxis(-this.sk.v, this.sa.v);\r\n this.appliedTransformations = 3;\r\n } else {\r\n return;\r\n }\r\n }\r\n if (this.r) {\r\n if(!this.r.effectsSequence.length) {\r\n this.pre.rotate(-this.r.v);\r\n this.appliedTransformations = 4;\r\n } else {\r\n return;\r\n }\r\n } else if(!this.rz.effectsSequence.length && !this.ry.effectsSequence.length && !this.rx.effectsSequence.length && !this.or.effectsSequence.length) {\r\n this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n this.appliedTransformations = 4;\r\n }\r\n }\r\n\r\n function autoOrient(){\r\n //\r\n //var prevP = this.getValueAtTime();\r\n }\r\n\r\n function addDynamicProperty(prop) {\r\n this._addDynamicProperty(prop);\r\n this.elem.addDynamicProperty(prop);\r\n this._isDirty = true;\r\n }\r\n\r\n function TransformProperty(elem,data,container){\r\n this.elem = elem;\r\n this.frameId = -1;\r\n this.propType = 'transform';\r\n this.data = data;\r\n this.v = new Matrix();\r\n //Precalculated matrix with non animated properties\r\n this.pre = new Matrix();\r\n this.appliedTransformations = 0;\r\n this.initDynamicPropertyContainer(container || elem);\r\n if(data.p && data.p.s){\r\n this.px = PropertyFactory.getProp(elem,data.p.x,0,0,this);\r\n this.py = PropertyFactory.getProp(elem,data.p.y,0,0,this);\r\n if(data.p.z){\r\n this.pz = PropertyFactory.getProp(elem,data.p.z,0,0,this);\r\n }\r\n }else{\r\n this.p = PropertyFactory.getProp(elem,data.p || {k:[0,0,0]},1,0,this);\r\n }\r\n if(data.rx) {\r\n this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);\r\n this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this);\r\n this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);\r\n if(data.or.k[0].ti) {\r\n var i, len = data.or.k.length;\r\n for(i=0;i<len;i+=1) {\r\n data.or.k[i].to = data.or.k[i].ti = null;\r\n }\r\n }\r\n this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this);\r\n //sh Indicates it needs to be capped between -180 and 180\r\n this.or.sh = true;\r\n } else {\r\n this.r = PropertyFactory.getProp(elem, data.r || {k: 0}, 0, degToRads, this);\r\n }\r\n if(data.sk){\r\n this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);\r\n this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);\r\n }\r\n this.a = PropertyFactory.getProp(elem,data.a || {k:[0,0,0]},1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s || {k:[100,100,100]},1,0.01,this);\r\n // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.\r\n if(data.o){\r\n this.o = PropertyFactory.getProp(elem,data.o,0,0.01,elem);\r\n } else {\r\n this.o = {_mdf:false,v:1};\r\n }\r\n this._isDirty = true;\r\n if(!this.dynamicProperties.length){\r\n this.getValue(true);\r\n }\r\n }\r\n\r\n TransformProperty.prototype = {\r\n applyToMatrix: applyToMatrix,\r\n getValue: processKeys,\r\n precalculateMatrix: precalculateMatrix,\r\n autoOrient: autoOrient\r\n }\r\n\r\n extendPrototype([DynamicPropertyContainer], TransformProperty);\r\n TransformProperty.prototype.addDynamicProperty = addDynamicProperty;\r\n TransformProperty.prototype._addDynamicProperty = DynamicPropertyContainer.prototype.addDynamicProperty;\r\n\r\n function getTransformProperty(elem,data,container){\r\n return new TransformProperty(elem,data,container);\r\n }\r\n\r\n return {\r\n getTransformProperty: getTransformProperty\r\n };\r\n\r\n}());\r\nfunction ShapePath(){\r\n\tthis.c = false;\r\n\tthis._length = 0;\r\n\tthis._maxLength = 8;\r\n\tthis.v = createSizedArray(this._maxLength);\r\n\tthis.o = createSizedArray(this._maxLength);\r\n\tthis.i = createSizedArray(this._maxLength);\r\n}\r\n\r\nShapePath.prototype.setPathData = function(closed, len) {\r\n\tthis.c = closed;\r\n\tthis.setLength(len);\r\n\tvar i = 0;\r\n\twhile(i < len){\r\n\t\tthis.v[i] = point_pool.newElement();\r\n\t\tthis.o[i] = point_pool.newElement();\r\n\t\tthis.i[i] = point_pool.newElement();\r\n\t\ti += 1;\r\n\t}\r\n};\r\n\r\nShapePath.prototype.setLength = function(len) {\r\n\twhile(this._maxLength < len) {\r\n\t\tthis.doubleArrayLength();\r\n\t}\r\n\tthis._length = len;\r\n};\r\n\r\nShapePath.prototype.doubleArrayLength = function() {\r\n\tthis.v = this.v.concat(createSizedArray(this._maxLength));\r\n\tthis.i = this.i.concat(createSizedArray(this._maxLength));\r\n\tthis.o = this.o.concat(createSizedArray(this._maxLength));\r\n\tthis._maxLength *= 2;\r\n};\r\n\r\nShapePath.prototype.setXYAt = function(x, y, type, pos, replace) {\r\n\tvar arr;\r\n\tthis._length = Math.max(this._length, pos + 1);\r\n\tif(this._length >= this._maxLength) {\r\n\t\tthis.doubleArrayLength();\r\n\t}\r\n\tswitch(type){\r\n\t\tcase 'v':\r\n\t\t\tarr = this.v;\r\n\t\t\tbreak;\r\n\t\tcase 'i':\r\n\t\t\tarr = this.i;\r\n\t\t\tbreak;\r\n\t\tcase 'o':\r\n\t\t\tarr = this.o;\r\n\t\t\tbreak;\r\n\t}\r\n\tif(!arr[pos] || (arr[pos] && !replace)){\r\n\t\tarr[pos] = point_pool.newElement();\r\n\t}\r\n\tarr[pos][0] = x;\r\n\tarr[pos][1] = y;\r\n};\r\n\r\nShapePath.prototype.setTripleAt = function(vX,vY,oX,oY,iX,iY,pos, replace) {\r\n\tthis.setXYAt(vX,vY,'v',pos, replace);\r\n\tthis.setXYAt(oX,oY,'o',pos, replace);\r\n\tthis.setXYAt(iX,iY,'i',pos, replace);\r\n};\r\n\r\nShapePath.prototype.reverse = function() {\r\n\tvar newPath = new ShapePath();\r\n\tnewPath.setPathData(this.c, this._length);\r\n\tvar vertices = this.v, outPoints = this.o, inPoints = this.i;\r\n\tvar init = 0;\r\n\tif (this.c) {\r\n\t\tnewPath.setTripleAt(vertices[0][0], vertices[0][1], inPoints[0][0], inPoints[0][1], outPoints[0][0], outPoints[0][1], 0, false);\r\n init = 1;\r\n }\r\n var cnt = this._length - 1;\r\n var len = this._length;\r\n\r\n var i;\r\n for (i = init; i < len; i += 1) {\r\n \tnewPath.setTripleAt(vertices[cnt][0], vertices[cnt][1], inPoints[cnt][0], inPoints[cnt][1], outPoints[cnt][0], outPoints[cnt][1], i, false);\r\n cnt -= 1;\r\n }\r\n return newPath;\r\n};\r\nvar ShapePropertyFactory = (function(){\r\n\r\n var initFrame = -999999;\r\n\r\n function interpolateShape(frameNum, previousValue, caching) {\r\n var iterationIndex = caching.lastIndex;\r\n var keyPropS,keyPropE,isHold, j, k, jLen, kLen, perc, vertexValue;\r\n var kf = this.keyframes;\r\n if(frameNum < kf[0].t-this.offsetTime){\r\n keyPropS = kf[0].s[0];\r\n isHold = true;\r\n iterationIndex = 0;\r\n }else if(frameNum >= kf[kf.length - 1].t-this.offsetTime){\r\n keyPropS = kf[kf.length - 1].s ? kf[kf.length - 1].s[0] : kf[kf.length - 2].e[0];\r\n /*if(kf[kf.length - 1].s){\r\n keyPropS = kf[kf.length - 1].s[0];\r\n }else{\r\n keyPropS = kf[kf.length - 2].e[0];\r\n }*/\r\n isHold = true;\r\n }else{\r\n var i = iterationIndex;\r\n var len = kf.length- 1,flag = true,keyData,nextKeyData;\r\n while(flag){\r\n keyData = kf[i];\r\n nextKeyData = kf[i+1];\r\n if((nextKeyData.t - this.offsetTime) > frameNum){\r\n break;\r\n }\r\n if(i < len - 1){\r\n i += 1;\r\n }else{\r\n flag = false;\r\n }\r\n }\r\n isHold = keyData.h === 1;\r\n iterationIndex = i;\r\n if(!isHold){\r\n if(frameNum >= nextKeyData.t-this.offsetTime){\r\n perc = 1;\r\n }else if(frameNum < keyData.t-this.offsetTime){\r\n perc = 0;\r\n }else{\r\n var fnc;\r\n if(keyData.__fnct){\r\n fnc = keyData.__fnct;\r\n }else{\r\n fnc = BezierFactory.getBezierEasing(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y).get;\r\n keyData.__fnct = fnc;\r\n }\r\n perc = fnc((frameNum-(keyData.t-this.offsetTime))/((nextKeyData.t-this.offsetTime)-(keyData.t-this.offsetTime)));\r\n }\r\n keyPropE = nextKeyData.s ? nextKeyData.s[0] : keyData.e[0];\r\n }\r\n keyPropS = keyData.s[0];\r\n }\r\n jLen = previousValue._length;\r\n kLen = keyPropS.i[0].length;\r\n caching.lastIndex = iterationIndex;\r\n\r\n for(j=0;j<jLen;j+=1){\r\n for(k=0;k<kLen;k+=1){\r\n vertexValue = isHold ? keyPropS.i[j][k] : keyPropS.i[j][k]+(keyPropE.i[j][k]-keyPropS.i[j][k])*perc;\r\n previousValue.i[j][k] = vertexValue;\r\n vertexValue = isHold ? keyPropS.o[j][k] : keyPropS.o[j][k]+(keyPropE.o[j][k]-keyPropS.o[j][k])*perc;\r\n previousValue.o[j][k] = vertexValue;\r\n vertexValue = isHold ? keyPropS.v[j][k] : keyPropS.v[j][k]+(keyPropE.v[j][k]-keyPropS.v[j][k])*perc;\r\n previousValue.v[j][k] = vertexValue;\r\n }\r\n }\r\n }\r\n\r\n function interpolateShapeCurrentTime(){\r\n var frameNum = this.comp.renderedFrame - this.offsetTime;\r\n var initTime = this.keyframes[0].t - this.offsetTime;\r\n var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;\r\n var lastFrame = this._caching.lastFrame;\r\n if(!(lastFrame !== initFrame && ((lastFrame < initTime && frameNum < initTime) || (lastFrame > endTime && frameNum > endTime)))){\r\n ////\r\n this._caching.lastIndex = lastFrame < frameNum ? this._caching.lastIndex : 0;\r\n this.interpolateShape(frameNum, this.pv, this._caching);\r\n ////\r\n }\r\n this._caching.lastFrame = frameNum;\r\n return this.pv;\r\n }\r\n\r\n function resetShape(){\r\n this.paths = this.localShapeCollection;\r\n }\r\n\r\n function shapesEqual(shape1, shape2) {\r\n if(shape1._length !== shape2._length || shape1.c !== shape2.c){\r\n return false;\r\n }\r\n var i, len = shape1._length;\r\n for(i = 0; i < len; i += 1) {\r\n if(shape1.v[i][0] !== shape2.v[i][0] \r\n || shape1.v[i][1] !== shape2.v[i][1] \r\n || shape1.o[i][0] !== shape2.o[i][0] \r\n || shape1.o[i][1] !== shape2.o[i][1] \r\n || shape1.i[i][0] !== shape2.i[i][0] \r\n || shape1.i[i][1] !== shape2.i[i][1]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function setVValue(newPath) {\r\n if(!shapesEqual(this.v, newPath)) {\r\n this.v = shape_pool.clone(newPath);\r\n this.localShapeCollection.releaseShapes();\r\n this.localShapeCollection.addShape(this.v);\r\n this._mdf = true;\r\n this.paths = this.localShapeCollection;\r\n }\r\n }\r\n\r\n function processEffectsSequence() {\r\n if (this.elem.globalData.frameId === this.frameId) {\r\n return;\r\n } else if (!this.effectsSequence.length) {\r\n this._mdf = false;\r\n return;\r\n }\r\n if (this.lock) {\r\n this.setVValue(this.pv);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = false;\r\n var finalValue = this.kf ? this.pv : this.data.ks ? this.data.ks.k : this.data.pt.k;\r\n var i, len = this.effectsSequence.length;\r\n for(i = 0; i < len; i += 1) {\r\n finalValue = this.effectsSequence[i](finalValue);\r\n }\r\n this.setVValue(finalValue);\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n };\r\n\r\n function ShapeProperty(elem, data, type){\r\n this.propType = 'shape';\r\n this.comp = elem.comp;\r\n this.container = elem;\r\n this.elem = elem;\r\n this.data = data;\r\n this.k = false;\r\n this.kf = false;\r\n this._mdf = false;\r\n var pathData = type === 3 ? data.pt.k : data.ks.k;\r\n this.v = shape_pool.clone(pathData);\r\n this.pv = shape_pool.clone(this.v);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.paths.addShape(this.v);\r\n this.reset = resetShape;\r\n this.effectsSequence = [];\r\n }\r\n\r\n function addEffect(effectFunction) {\r\n this.effectsSequence.push(effectFunction);\r\n this.container.addDynamicProperty(this);\r\n }\r\n\r\n ShapeProperty.prototype.interpolateShape = interpolateShape;\r\n ShapeProperty.prototype.getValue = processEffectsSequence;\r\n ShapeProperty.prototype.setVValue = setVValue;\r\n ShapeProperty.prototype.addEffect = addEffect;\r\n\r\n function KeyframedShapeProperty(elem,data,type){\r\n this.propType = 'shape';\r\n this.comp = elem.comp;\r\n this.elem = elem;\r\n this.container = elem;\r\n this.offsetTime = elem.data.st;\r\n this.keyframes = type === 3 ? data.pt.k : data.ks.k;\r\n this.k = true;\r\n this.kf = true;\r\n var i, len = this.keyframes[0].s[0].i.length;\r\n var jLen = this.keyframes[0].s[0].i[0].length;\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(this.keyframes[0].s[0].c, len);\r\n this.pv = shape_pool.clone(this.v);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.paths.addShape(this.v);\r\n this.lastFrame = initFrame;\r\n this.reset = resetShape;\r\n this._caching = {lastFrame: initFrame, lastIndex: 0};\r\n this.effectsSequence = [interpolateShapeCurrentTime.bind(this)];\r\n }\r\n KeyframedShapeProperty.prototype.getValue = processEffectsSequence;\r\n KeyframedShapeProperty.prototype.interpolateShape = interpolateShape;\r\n KeyframedShapeProperty.prototype.setVValue = setVValue;\r\n KeyframedShapeProperty.prototype.addEffect = addEffect;\r\n\r\n var EllShapeProperty = (function(){\r\n\r\n var cPoint = roundCorner;\r\n\r\n function EllShapeProperty(elem,data) {\r\n /*this.v = {\r\n v: createSizedArray(4),\r\n i: createSizedArray(4),\r\n o: createSizedArray(4),\r\n c: true\r\n };*/\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(true, 4);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.localShapeCollection.addShape(this.v);\r\n this.d = data.d;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.frameId = -1;\r\n this.initDynamicPropertyContainer(elem);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,0,this);\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertEllToPath();\r\n }\r\n };\r\n\r\n EllShapeProperty.prototype = {\r\n reset: resetShape,\r\n getValue: function (){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n\r\n if(this._mdf){\r\n this.convertEllToPath();\r\n }\r\n },\r\n convertEllToPath: function() {\r\n var p0 = this.p.v[0], p1 = this.p.v[1], s0 = this.s.v[0]/2, s1 = this.s.v[1]/2;\r\n var _cw = this.d !== 3;\r\n var _v = this.v;\r\n _v.v[0][0] = p0;\r\n _v.v[0][1] = p1 - s1;\r\n _v.v[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.v[1][1] = p1;\r\n _v.v[2][0] = p0;\r\n _v.v[2][1] = p1 + s1;\r\n _v.v[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.v[3][1] = p1;\r\n _v.i[0][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\r\n _v.i[0][1] = p1 - s1;\r\n _v.i[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.i[1][1] = p1 - s1 * cPoint;\r\n _v.i[2][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\r\n _v.i[2][1] = p1 + s1;\r\n _v.i[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.i[3][1] = p1 + s1 * cPoint;\r\n _v.o[0][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\r\n _v.o[0][1] = p1 - s1;\r\n _v.o[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.o[1][1] = p1 + s1 * cPoint;\r\n _v.o[2][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\r\n _v.o[2][1] = p1 + s1;\r\n _v.o[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.o[3][1] = p1 - s1 * cPoint;\r\n }\r\n }\r\n\r\n extendPrototype([DynamicPropertyContainer], EllShapeProperty);\r\n\r\n return EllShapeProperty;\r\n }());\r\n\r\n var StarShapeProperty = (function() {\r\n\r\n function StarShapeProperty(elem,data) {\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(true, 0);\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.data = data;\r\n this.frameId = -1;\r\n this.d = data.d;\r\n this.initDynamicPropertyContainer(elem);\r\n if(data.sy === 1){\r\n this.ir = PropertyFactory.getProp(elem,data.ir,0,0,this);\r\n this.is = PropertyFactory.getProp(elem,data.is,0,0.01,this);\r\n this.convertToPath = this.convertStarToPath;\r\n } else {\r\n this.convertToPath = this.convertPolygonToPath;\r\n }\r\n this.pt = PropertyFactory.getProp(elem,data.pt,0,0,this);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.r = PropertyFactory.getProp(elem,data.r,0,degToRads,this);\r\n this.or = PropertyFactory.getProp(elem,data.or,0,0,this);\r\n this.os = PropertyFactory.getProp(elem,data.os,0,0.01,this);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.localShapeCollection.addShape(this.v);\r\n this.paths = this.localShapeCollection;\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertToPath();\r\n }\r\n };\r\n\r\n StarShapeProperty.prototype = {\r\n reset: resetShape,\r\n getValue: function() {\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n if(this._mdf){\r\n this.convertToPath();\r\n }\r\n },\r\n convertStarToPath: function() {\r\n var numPts = Math.floor(this.pt.v)*2;\r\n var angle = Math.PI*2/numPts;\r\n /*this.v.v.length = numPts;\r\n this.v.i.length = numPts;\r\n this.v.o.length = numPts;*/\r\n var longFlag = true;\r\n var longRad = this.or.v;\r\n var shortRad = this.ir.v;\r\n var longRound = this.os.v;\r\n var shortRound = this.is.v;\r\n var longPerimSegment = 2*Math.PI*longRad/(numPts*2);\r\n var shortPerimSegment = 2*Math.PI*shortRad/(numPts*2);\r\n var i, rad,roundness,perimSegment, currentAng = -Math.PI/ 2;\r\n currentAng += this.r.v;\r\n var dir = this.data.d === 3 ? -1 : 1;\r\n this.v._length = 0;\r\n for(i=0;i<numPts;i+=1){\r\n rad = longFlag ? longRad : shortRad;\r\n roundness = longFlag ? longRound : shortRound;\r\n perimSegment = longFlag ? longPerimSegment : shortPerimSegment;\r\n var x = rad * Math.cos(currentAng);\r\n var y = rad * Math.sin(currentAng);\r\n var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);\r\n var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);\r\n x += + this.p.v[0];\r\n y += + this.p.v[1];\r\n this.v.setTripleAt(x,y,x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir,x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir, i, true);\r\n\r\n /*this.v.v[i] = [x,y];\r\n this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];\r\n this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];\r\n this.v._length = numPts;*/\r\n longFlag = !longFlag;\r\n currentAng += angle*dir;\r\n }\r\n },\r\n convertPolygonToPath: function() {\r\n var numPts = Math.floor(this.pt.v);\r\n var angle = Math.PI*2/numPts;\r\n var rad = this.or.v;\r\n var roundness = this.os.v;\r\n var perimSegment = 2*Math.PI*rad/(numPts*4);\r\n var i, currentAng = -Math.PI/ 2;\r\n var dir = this.data.d === 3 ? -1 : 1;\r\n currentAng += this.r.v;\r\n this.v._length = 0;\r\n for(i=0;i<numPts;i+=1){\r\n var x = rad * Math.cos(currentAng);\r\n var y = rad * Math.sin(currentAng);\r\n var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);\r\n var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);\r\n x += + this.p.v[0];\r\n y += + this.p.v[1];\r\n this.v.setTripleAt(x,y,x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir,x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir, i, true);\r\n currentAng += angle*dir;\r\n }\r\n this.paths.length = 0;\r\n this.paths[0] = this.v;\r\n }\r\n\r\n }\r\n extendPrototype([DynamicPropertyContainer], StarShapeProperty);\r\n\r\n return StarShapeProperty;\r\n }());\r\n\r\n var RectShapeProperty = (function() {\r\n\r\n function RectShapeProperty(elem,data) {\r\n this.v = shape_pool.newElement();\r\n this.v.c = true;\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.localShapeCollection.addShape(this.v);\r\n this.paths = this.localShapeCollection;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.frameId = -1;\r\n this.d = data.d;\r\n this.initDynamicPropertyContainer(elem);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,0,this);\r\n this.r = PropertyFactory.getProp(elem,data.r,0,0,this);\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertRectToPath();\r\n }\r\n };\r\n\r\n RectShapeProperty.prototype = {\r\n convertRectToPath: function (){\r\n var p0 = this.p.v[0], p1 = this.p.v[1], v0 = this.s.v[0]/2, v1 = this.s.v[1]/2;\r\n var round = bm_min(v0,v1,this.r.v);\r\n var cPoint = round*(1-roundCorner);\r\n this.v._length = 0;\r\n\r\n if(this.d === 2 || this.d === 1) {\r\n this.v.setTripleAt(p0+v0, p1-v1+round,p0+v0, p1-v1+round,p0+v0,p1-v1+cPoint,0, true);\r\n this.v.setTripleAt(p0+v0, p1+v1-round,p0+v0, p1+v1-cPoint,p0+v0, p1+v1-round,1, true);\r\n if(round!== 0){\r\n this.v.setTripleAt(p0+v0-round, p1+v1,p0+v0-round,p1+v1,p0+v0-cPoint,p1+v1,2, true);\r\n this.v.setTripleAt(p0-v0+round,p1+v1,p0-v0+cPoint,p1+v1,p0-v0+round,p1+v1,3, true);\r\n this.v.setTripleAt(p0-v0,p1+v1-round,p0-v0,p1+v1-round,p0-v0,p1+v1-cPoint,4, true);\r\n this.v.setTripleAt(p0-v0,p1-v1+round,p0-v0,p1-v1+cPoint,p0-v0,p1-v1+round,5, true);\r\n this.v.setTripleAt(p0-v0+round,p1-v1,p0-v0+round,p1-v1,p0-v0+cPoint,p1-v1,6, true);\r\n this.v.setTripleAt(p0+v0-round,p1-v1,p0+v0-cPoint,p1-v1,p0+v0-round,p1-v1,7, true);\r\n } else {\r\n this.v.setTripleAt(p0-v0,p1+v1,p0-v0+cPoint,p1+v1,p0-v0,p1+v1,2);\r\n this.v.setTripleAt(p0-v0,p1-v1,p0-v0,p1-v1+cPoint,p0-v0,p1-v1,3);\r\n }\r\n }else{\r\n this.v.setTripleAt(p0+v0,p1-v1+round,p0+v0,p1-v1+cPoint,p0+v0,p1-v1+round,0, true);\r\n if(round!== 0){\r\n this.v.setTripleAt(p0+v0-round,p1-v1,p0+v0-round,p1-v1,p0+v0-cPoint,p1-v1,1, true);\r\n this.v.setTripleAt(p0-v0+round,p1-v1,p0-v0+cPoint,p1-v1,p0-v0+round,p1-v1,2, true);\r\n this.v.setTripleAt(p0-v0,p1-v1+round,p0-v0,p1-v1+round,p0-v0,p1-v1+cPoint,3, true);\r\n this.v.setTripleAt(p0-v0,p1+v1-round,p0-v0,p1+v1-cPoint,p0-v0,p1+v1-round,4, true);\r\n this.v.setTripleAt(p0-v0+round,p1+v1,p0-v0+round,p1+v1,p0-v0+cPoint,p1+v1,5, true);\r\n this.v.setTripleAt(p0+v0-round,p1+v1,p0+v0-cPoint,p1+v1,p0+v0-round,p1+v1,6, true);\r\n this.v.setTripleAt(p0+v0,p1+v1-round,p0+v0,p1+v1-round,p0+v0,p1+v1-cPoint,7, true);\r\n } else {\r\n this.v.setTripleAt(p0-v0,p1-v1,p0-v0+cPoint,p1-v1,p0-v0,p1-v1,1, true);\r\n this.v.setTripleAt(p0-v0,p1+v1,p0-v0,p1+v1-cPoint,p0-v0,p1+v1,2, true);\r\n this.v.setTripleAt(p0+v0,p1+v1,p0+v0-cPoint,p1+v1,p0+v0,p1+v1,3, true);\r\n\r\n }\r\n }\r\n },\r\n getValue: function(frameNum){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n if(this._mdf){\r\n this.convertRectToPath();\r\n }\r\n\r\n },\r\n reset: resetShape\r\n }\r\n extendPrototype([DynamicPropertyContainer], RectShapeProperty);\r\n\r\n return RectShapeProperty;\r\n }());\r\n\r\n function getShapeProp(elem,data,type){\r\n var prop;\r\n if(type === 3 || type === 4){\r\n var dataProp = type === 3 ? data.pt : data.ks;\r\n var keys = dataProp.k;\r\n if(keys.length){\r\n prop = new KeyframedShapeProperty(elem, data, type);\r\n }else{\r\n prop = new ShapeProperty(elem, data, type);\r\n }\r\n }else if(type === 5){\r\n prop = new RectShapeProperty(elem, data);\r\n }else if(type === 6){\r\n prop = new EllShapeProperty(elem, data);\r\n }else if(type === 7){\r\n prop = new StarShapeProperty(elem, data);\r\n }\r\n if(prop.k){\r\n elem.addDynamicProperty(prop);\r\n }\r\n return prop;\r\n }\r\n\r\n function getConstructorFunction() {\r\n return ShapeProperty;\r\n }\r\n\r\n function getKeyframedConstructorFunction() {\r\n return KeyframedShapeProperty;\r\n }\r\n\r\n var ob = {};\r\n ob.getShapeProp = getShapeProp;\r\n ob.getConstructorFunction = getConstructorFunction;\r\n ob.getKeyframedConstructorFunction = getKeyframedConstructorFunction;\r\n return ob;\r\n}());\r\nvar ShapeModifiers = (function(){\r\n var ob = {};\r\n var modifiers = {};\r\n ob.registerModifier = registerModifier;\r\n ob.getModifier = getModifier;\r\n\r\n function registerModifier(nm,factory){\r\n if(!modifiers[nm]){\r\n modifiers[nm] = factory;\r\n }\r\n }\r\n\r\n function getModifier(nm,elem, data){\r\n return new modifiers[nm](elem, data);\r\n }\r\n\r\n return ob;\r\n}());\r\n\r\nfunction ShapeModifier(){}\r\nShapeModifier.prototype.initModifierProperties = function(){};\r\nShapeModifier.prototype.addShapeToModifier = function(){};\r\nShapeModifier.prototype.addShape = function(data){\r\n if (!this.closed) {\r\n // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick.\r\n data.sh.container.addDynamicProperty(data.sh);\r\n var shapeData = {shape:data.sh, data: data, localShapeCollection:shapeCollection_pool.newShapeCollection()};\r\n this.shapes.push(shapeData);\r\n this.addShapeToModifier(shapeData);\r\n if (this._isAnimated) {\r\n data.setAsAnimated();\r\n }\r\n }\r\n};\r\nShapeModifier.prototype.init = function(elem,data){\r\n this.shapes = [];\r\n this.elem = elem;\r\n this.initDynamicPropertyContainer(elem);\r\n this.initModifierProperties(elem,data);\r\n this.frameId = initialDefaultFrame;\r\n this.closed = false;\r\n this.k = false;\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.getValue(true);\r\n }\r\n};\r\nShapeModifier.prototype.processKeys = function(){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], ShapeModifier);\r\nfunction TrimModifier(){\r\n}\r\nextendPrototype([ShapeModifier], TrimModifier);\r\nTrimModifier.prototype.initModifierProperties = function(elem, data) {\r\n this.s = PropertyFactory.getProp(elem, data.s, 0, 0.01, this);\r\n this.e = PropertyFactory.getProp(elem, data.e, 0, 0.01, this);\r\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0, this);\r\n this.sValue = 0;\r\n this.eValue = 0;\r\n this.getValue = this.processKeys;\r\n this.m = data.m;\r\n this._isAnimated = !!this.s.effectsSequence.length || !!this.e.effectsSequence.length || !!this.o.effectsSequence.length;\r\n};\r\n\r\nTrimModifier.prototype.addShapeToModifier = function(shapeData){\r\n shapeData.pathsData = [];\r\n};\r\n\r\nTrimModifier.prototype.calculateShapeEdges = function(s, e, shapeLength, addedLength, totalModifierLength) {\r\n var segments = [];\r\n if (e <= 1) {\r\n segments.push({\r\n s: s,\r\n e: e\r\n });\r\n } else if (s >= 1) {\r\n segments.push({\r\n s: s - 1,\r\n e: e - 1\r\n });\r\n } else {\r\n segments.push({\r\n s: s,\r\n e: 1\r\n });\r\n segments.push({\r\n s: 0,\r\n e: e - 1\r\n });\r\n }\r\n var shapeSegments = [];\r\n var i, len = segments.length, segmentOb;\r\n for (i = 0; i < len; i += 1) {\r\n segmentOb = segments[i];\r\n if (segmentOb.e * totalModifierLength < addedLength || segmentOb.s * totalModifierLength > addedLength + shapeLength) {\r\n \r\n } else {\r\n var shapeS, shapeE;\r\n if (segmentOb.s * totalModifierLength <= addedLength) {\r\n shapeS = 0;\r\n } else {\r\n shapeS = (segmentOb.s * totalModifierLength - addedLength) / shapeLength;\r\n }\r\n if(segmentOb.e * totalModifierLength >= addedLength + shapeLength) {\r\n shapeE = 1;\r\n } else {\r\n shapeE = ((segmentOb.e * totalModifierLength - addedLength) / shapeLength);\r\n }\r\n shapeSegments.push([shapeS, shapeE]);\r\n }\r\n }\r\n if (!shapeSegments.length) {\r\n shapeSegments.push([0, 0]);\r\n }\r\n return shapeSegments;\r\n};\r\n\r\nTrimModifier.prototype.releasePathsData = function(pathsData) {\r\n var i, len = pathsData.length;\r\n for (i = 0; i < len; i += 1) {\r\n segments_length_pool.release(pathsData[i]);\r\n }\r\n pathsData.length = 0;\r\n return pathsData;\r\n};\r\n\r\nTrimModifier.prototype.processShapes = function(_isFirstFrame) {\r\n var s, e;\r\n if (this._mdf || _isFirstFrame) {\r\n var o = (this.o.v % 360) / 360;\r\n if (o < 0) {\r\n o += 1;\r\n }\r\n s = (this.s.v > 1 ? 1 : this.s.v < 0 ? 0 : this.s.v) + o;\r\n e = (this.e.v > 1 ? 1 : this.e.v < 0 ? 0 : this.e.v) + o;\r\n if (s === e) {\r\n\r\n }\r\n if (s > e) {\r\n var _s = s;\r\n s = e;\r\n e = _s;\r\n }\r\n s = Math.round(s * 10000) * 0.0001;\r\n e = Math.round(e * 10000) * 0.0001;\r\n this.sValue = s;\r\n this.eValue = e;\r\n } else {\r\n s = this.sValue;\r\n e = this.eValue;\r\n }\r\n var shapePaths;\r\n var i, len = this.shapes.length, j, jLen;\r\n var pathsData, pathData, totalShapeLength, totalModifierLength = 0;\r\n\r\n if (e === s) {\r\n for (i = 0; i < len; i += 1) {\r\n this.shapes[i].localShapeCollection.releaseShapes();\r\n this.shapes[i].shape._mdf = true;\r\n this.shapes[i].shape.paths = this.shapes[i].localShapeCollection;\r\n }\r\n } else if (!((e === 1 && s === 0) || (e===0 && s === 1))){\r\n var segments = [], shapeData, localShapeCollection;\r\n for (i = 0; i < len; i += 1) {\r\n shapeData = this.shapes[i];\r\n // if shape hasn't changed and trim properties haven't changed, cached previous path can be used\r\n if (!shapeData.shape._mdf && !this._mdf && !_isFirstFrame && this.m !== 2) {\r\n shapeData.shape.paths = shapeData.localShapeCollection;\r\n } else {\r\n shapePaths = shapeData.shape.paths;\r\n jLen = shapePaths._length;\r\n totalShapeLength = 0;\r\n if (!shapeData.shape._mdf && shapeData.pathsData.length) {\r\n totalShapeLength = shapeData.totalShapeLength;\r\n } else {\r\n pathsData = this.releasePathsData(shapeData.pathsData);\r\n for (j = 0; j < jLen; j += 1) {\r\n pathData = bez.getSegmentsLength(shapePaths.shapes[j]);\r\n pathsData.push(pathData);\r\n totalShapeLength += pathData.totalLength;\r\n }\r\n shapeData.totalShapeLength = totalShapeLength;\r\n shapeData.pathsData = pathsData;\r\n }\r\n\r\n totalModifierLength += totalShapeLength;\r\n shapeData.shape._mdf = true;\r\n }\r\n }\r\n var shapeS = s, shapeE = e, addedLength = 0, edges;\r\n for (i = len - 1; i >= 0; i -= 1) {\r\n shapeData = this.shapes[i];\r\n if (shapeData.shape._mdf) {\r\n localShapeCollection = shapeData.localShapeCollection;\r\n localShapeCollection.releaseShapes();\r\n //if m === 2 means paths are trimmed individually so edges need to be found for this specific shape relative to whoel group\r\n if (this.m === 2 && len > 1) {\r\n edges = this.calculateShapeEdges(s, e, shapeData.totalShapeLength, addedLength, totalModifierLength);\r\n addedLength += shapeData.totalShapeLength;\r\n } else {\r\n edges = [[shapeS, shapeE]];\r\n }\r\n jLen = edges.length;\r\n for (j = 0; j < jLen; j += 1) {\r\n shapeS = edges[j][0];\r\n shapeE = edges[j][1];\r\n segments.length = 0;\r\n if (shapeE <= 1) {\r\n segments.push({\r\n s:shapeData.totalShapeLength * shapeS,\r\n e:shapeData.totalShapeLength * shapeE\r\n });\r\n } else if (shapeS >= 1) {\r\n segments.push({\r\n s:shapeData.totalShapeLength * (shapeS - 1),\r\n e:shapeData.totalShapeLength * (shapeE - 1)\r\n });\r\n } else {\r\n segments.push({\r\n s:shapeData.totalShapeLength * shapeS,\r\n e:shapeData.totalShapeLength\r\n });\r\n segments.push({\r\n s:0,\r\n e:shapeData.totalShapeLength * (shapeE - 1)\r\n });\r\n }\r\n var newShapesData = this.addShapes(shapeData,segments[0]);\r\n if (segments[0].s !== segments[0].e) {\r\n if (segments.length > 1) {\r\n var lastShapeInCollection = shapeData.shape.paths.shapes[shapeData.shape.paths._length - 1];\r\n if (lastShapeInCollection.c) {\r\n var lastShape = newShapesData.pop();\r\n this.addPaths(newShapesData, localShapeCollection);\r\n newShapesData = this.addShapes(shapeData, segments[1], lastShape);\r\n } else {\r\n this.addPaths(newShapesData, localShapeCollection);\r\n newShapesData = this.addShapes(shapeData, segments[1]);\r\n }\r\n } \r\n this.addPaths(newShapesData, localShapeCollection);\r\n }\r\n \r\n }\r\n shapeData.shape.paths = localShapeCollection;\r\n }\r\n }\r\n } else if (this._mdf) {\r\n for (i = 0; i < len; i += 1) {\r\n //Releasign Trim Cached paths data when no trim applied in case shapes are modified inbetween.\r\n //Don't remove this even if it's losing cached info.\r\n this.shapes[i].pathsData.length = 0;\r\n this.shapes[i].shape._mdf = true;\r\n }\r\n }\r\n};\r\n\r\nTrimModifier.prototype.addPaths = function(newPaths, localShapeCollection) {\r\n var i, len = newPaths.length;\r\n for (i = 0; i < len; i += 1) {\r\n localShapeCollection.addShape(newPaths[i]);\r\n }\r\n};\r\n\r\nTrimModifier.prototype.addSegment = function(pt1, pt2, pt3, pt4, shapePath, pos, newShape) {\r\n shapePath.setXYAt(pt2[0], pt2[1], 'o', pos);\r\n shapePath.setXYAt(pt3[0], pt3[1], 'i', pos + 1);\r\n if(newShape){\r\n shapePath.setXYAt(pt1[0], pt1[1], 'v', pos);\r\n }\r\n shapePath.setXYAt(pt4[0], pt4[1], 'v', pos + 1);\r\n};\r\n\r\nTrimModifier.prototype.addSegmentFromArray = function(points, shapePath, pos, newShape) {\r\n shapePath.setXYAt(points[1], points[5], 'o', pos);\r\n shapePath.setXYAt(points[2], points[6], 'i', pos + 1);\r\n if(newShape){\r\n shapePath.setXYAt(points[0], points[4], 'v', pos);\r\n }\r\n shapePath.setXYAt(points[3], points[7], 'v', pos + 1);\r\n};\r\n\r\nTrimModifier.prototype.addShapes = function(shapeData, shapeSegment, shapePath) {\r\n var pathsData = shapeData.pathsData;\r\n var shapePaths = shapeData.shape.paths.shapes;\r\n var i, len = shapeData.shape.paths._length, j, jLen;\r\n var addedLength = 0;\r\n var currentLengthData,segmentCount;\r\n var lengths;\r\n var segment;\r\n var shapes = [];\r\n var initPos;\r\n var newShape = true;\r\n if (!shapePath) {\r\n shapePath = shape_pool.newElement();\r\n segmentCount = 0;\r\n initPos = 0;\r\n } else {\r\n segmentCount = shapePath._length;\r\n initPos = shapePath._length;\r\n }\r\n shapes.push(shapePath);\r\n for (i = 0; i < len; i += 1) {\r\n lengths = pathsData[i].lengths;\r\n shapePath.c = shapePaths[i].c;\r\n jLen = shapePaths[i].c ? lengths.length : lengths.length + 1;\r\n for (j = 1; j < jLen; j +=1) {\r\n currentLengthData = lengths[j-1];\r\n if (addedLength + currentLengthData.addedLength < shapeSegment.s) {\r\n addedLength += currentLengthData.addedLength;\r\n shapePath.c = false;\r\n } else if(addedLength > shapeSegment.e) {\r\n shapePath.c = false;\r\n break;\r\n } else {\r\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + currentLengthData.addedLength) {\r\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[j], shapePaths[i].v[j], shapePath, segmentCount, newShape);\r\n newShape = false;\r\n } else {\r\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[j], shapePaths[i].o[j - 1], shapePaths[i].i[j], (shapeSegment.s - addedLength)/currentLengthData.addedLength,(shapeSegment.e - addedLength)/currentLengthData.addedLength, lengths[j-1]);\r\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape);\r\n // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\r\n newShape = false;\r\n shapePath.c = false;\r\n }\r\n addedLength += currentLengthData.addedLength;\r\n segmentCount += 1;\r\n }\r\n }\r\n if (shapePaths[i].c && lengths.length) {\r\n currentLengthData = lengths[j - 1];\r\n if (addedLength <= shapeSegment.e) {\r\n var segmentLength = lengths[j - 1].addedLength;\r\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + segmentLength) {\r\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[0], shapePaths[i].v[0], shapePath, segmentCount, newShape);\r\n newShape = false;\r\n } else {\r\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[0], shapePaths[i].o[j - 1], shapePaths[i].i[0], (shapeSegment.s - addedLength) / segmentLength, (shapeSegment.e - addedLength) / segmentLength, lengths[j - 1]);\r\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape);\r\n // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\r\n newShape = false;\r\n shapePath.c = false;\r\n }\r\n } else {\r\n shapePath.c = false;\r\n }\r\n addedLength += currentLengthData.addedLength;\r\n segmentCount += 1;\r\n }\r\n if (shapePath._length) {\r\n shapePath.setXYAt(shapePath.v[initPos][0], shapePath.v[initPos][1], 'i', initPos);\r\n shapePath.setXYAt(shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1],'o', shapePath._length - 1);\r\n }\r\n if (addedLength > shapeSegment.e) {\r\n break;\r\n }\r\n if (i < len - 1) {\r\n shapePath = shape_pool.newElement();\r\n newShape = true;\r\n shapes.push(shapePath);\r\n segmentCount = 0;\r\n }\r\n }\r\n return shapes;\r\n};\r\n\r\n\r\nShapeModifiers.registerModifier('tm', TrimModifier);\r\nfunction RoundCornersModifier(){}\r\nextendPrototype([ShapeModifier],RoundCornersModifier);\r\nRoundCornersModifier.prototype.initModifierProperties = function(elem,data){\r\n this.getValue = this.processKeys;\r\n this.rd = PropertyFactory.getProp(elem,data.r,0,null,this);\r\n this._isAnimated = !!this.rd.effectsSequence.length;\r\n};\r\n\r\nRoundCornersModifier.prototype.processPath = function(path, round){\r\n var cloned_path = shape_pool.newElement();\r\n cloned_path.c = path.c;\r\n var i, len = path._length;\r\n var currentV,currentI,currentO,closerV, newV,newO,newI,distance,newPosPerc,index = 0;\r\n var vX,vY,oX,oY,iX,iY;\r\n for(i=0;i<len;i+=1){\r\n currentV = path.v[i];\r\n currentO = path.o[i];\r\n currentI = path.i[i];\r\n if(currentV[0]===currentO[0] && currentV[1]===currentO[1] && currentV[0]===currentI[0] && currentV[1]===currentI[1]){\r\n if((i===0 || i === len - 1) && !path.c){\r\n cloned_path.setTripleAt(currentV[0],currentV[1],currentO[0],currentO[1],currentI[0],currentI[1],index);\r\n /*cloned_path.v[index] = currentV;\r\n cloned_path.o[index] = currentO;\r\n cloned_path.i[index] = currentI;*/\r\n index += 1;\r\n } else {\r\n if(i===0){\r\n closerV = path.v[len-1];\r\n } else {\r\n closerV = path.v[i-1];\r\n }\r\n distance = Math.sqrt(Math.pow(currentV[0]-closerV[0],2)+Math.pow(currentV[1]-closerV[1],2));\r\n newPosPerc = distance ? Math.min(distance/2,round)/distance : 0;\r\n vX = iX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc;\r\n vY = iY = currentV[1]-(currentV[1]-closerV[1])*newPosPerc;\r\n oX = vX-(vX-currentV[0])*roundCorner;\r\n oY = vY-(vY-currentV[1])*roundCorner;\r\n cloned_path.setTripleAt(vX,vY,oX,oY,iX,iY,index);\r\n index += 1;\r\n\r\n if(i === len - 1){\r\n closerV = path.v[0];\r\n } else {\r\n closerV = path.v[i+1];\r\n }\r\n distance = Math.sqrt(Math.pow(currentV[0]-closerV[0],2)+Math.pow(currentV[1]-closerV[1],2));\r\n newPosPerc = distance ? Math.min(distance/2,round)/distance : 0;\r\n vX = oX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc;\r\n vY = oY = currentV[1]+(closerV[1]-currentV[1])*newPosPerc;\r\n iX = vX-(vX-currentV[0])*roundCorner;\r\n iY = vY-(vY-currentV[1])*roundCorner;\r\n cloned_path.setTripleAt(vX,vY,oX,oY,iX,iY,index);\r\n index += 1;\r\n }\r\n } else {\r\n cloned_path.setTripleAt(path.v[i][0],path.v[i][1],path.o[i][0],path.o[i][1],path.i[i][0],path.i[i][1],index);\r\n index += 1;\r\n }\r\n }\r\n return cloned_path;\r\n};\r\n\r\nRoundCornersModifier.prototype.processShapes = function(_isFirstFrame){\r\n var shapePaths;\r\n var i, len = this.shapes.length;\r\n var j, jLen;\r\n var rd = this.rd.v;\r\n\r\n if(rd !== 0){\r\n var shapeData, newPaths, localShapeCollection;\r\n for(i=0;i<len;i+=1){\r\n shapeData = this.shapes[i];\r\n newPaths = shapeData.shape.paths;\r\n localShapeCollection = shapeData.localShapeCollection;\r\n if(!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)){\r\n localShapeCollection.releaseShapes();\r\n shapeData.shape._mdf = true;\r\n shapePaths = shapeData.shape.paths.shapes;\r\n jLen = shapeData.shape.paths._length;\r\n for(j=0;j<jLen;j+=1){\r\n localShapeCollection.addShape(this.processPath(shapePaths[j],rd));\r\n }\r\n }\r\n shapeData.shape.paths = shapeData.localShapeCollection;\r\n }\r\n\r\n }\r\n if(!this.dynamicProperties.length){\r\n this._mdf = false;\r\n }\r\n};\r\n\r\nShapeModifiers.registerModifier('rd',RoundCornersModifier);\r\nfunction RepeaterModifier(){}\r\nextendPrototype([ShapeModifier], RepeaterModifier);\r\n\r\nRepeaterModifier.prototype.initModifierProperties = function(elem,data){\r\n this.getValue = this.processKeys;\r\n this.c = PropertyFactory.getProp(elem,data.c,0,null,this);\r\n this.o = PropertyFactory.getProp(elem,data.o,0,null,this);\r\n this.tr = TransformPropertyFactory.getTransformProperty(elem,data.tr,this);\r\n this.so = PropertyFactory.getProp(elem,data.tr.so,0,0.01,this);\r\n this.eo = PropertyFactory.getProp(elem,data.tr.eo,0,0.01,this);\r\n this.data = data;\r\n if(!this.dynamicProperties.length){\r\n this.getValue(true);\r\n }\r\n this._isAnimated = !!this.dynamicProperties.length;\r\n this.pMatrix = new Matrix();\r\n this.rMatrix = new Matrix();\r\n this.sMatrix = new Matrix();\r\n this.tMatrix = new Matrix();\r\n this.matrix = new Matrix();\r\n};\r\n\r\nRepeaterModifier.prototype.applyTransforms = function(pMatrix, rMatrix, sMatrix, transform, perc, inv){\r\n var dir = inv ? -1 : 1;\r\n var scaleX = transform.s.v[0] + (1 - transform.s.v[0]) * (1 - perc);\r\n var scaleY = transform.s.v[1] + (1 - transform.s.v[1]) * (1 - perc);\r\n pMatrix.translate(transform.p.v[0] * dir * perc, transform.p.v[1] * dir * perc, transform.p.v[2]);\r\n rMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\r\n rMatrix.rotate(-transform.r.v * dir * perc);\r\n rMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\r\n sMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\r\n sMatrix.scale(inv ? 1/scaleX : scaleX, inv ? 1/scaleY : scaleY);\r\n sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\r\n};\r\n\r\nRepeaterModifier.prototype.init = function(elem, arr, pos, elemsData) {\r\n this.elem = elem;\r\n this.arr = arr;\r\n this.pos = pos;\r\n this.elemsData = elemsData;\r\n this._currentCopies = 0;\r\n this._elements = [];\r\n this._groups = [];\r\n this.frameId = -1;\r\n this.initDynamicPropertyContainer(elem);\r\n this.initModifierProperties(elem,arr[pos]);\r\n var cont = 0;\r\n while(pos>0){\r\n pos -= 1;\r\n //this._elements.unshift(arr.splice(pos,1)[0]);\r\n this._elements.unshift(arr[pos]);\r\n cont += 1;\r\n }\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.getValue(true);\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.resetElements = function(elements){\r\n var i, len = elements.length;\r\n for(i = 0; i < len; i += 1) {\r\n elements[i]._processed = false;\r\n if(elements[i].ty === 'gr'){\r\n this.resetElements(elements[i].it);\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.cloneElements = function(elements){\r\n var i, len = elements.length;\r\n var newElements = JSON.parse(JSON.stringify(elements));\r\n this.resetElements(newElements);\r\n return newElements;\r\n};\r\n\r\nRepeaterModifier.prototype.changeGroupRender = function(elements, renderFlag) {\r\n var i, len = elements.length;\r\n for(i = 0; i < len; i += 1) {\r\n elements[i]._render = renderFlag;\r\n if(elements[i].ty === 'gr') {\r\n this.changeGroupRender(elements[i].it, renderFlag);\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.processShapes = function(_isFirstFrame) {\r\n var items, itemsTransform, i, dir, cont;\r\n if(this._mdf || _isFirstFrame){\r\n var copies = Math.ceil(this.c.v);\r\n if(this._groups.length < copies){\r\n while(this._groups.length < copies){\r\n var group = {\r\n it:this.cloneElements(this._elements),\r\n ty:'gr'\r\n };\r\n group.it.push({\"a\":{\"a\":0,\"ix\":1,\"k\":[0,0]},\"nm\":\"Transform\",\"o\":{\"a\":0,\"ix\":7,\"k\":100},\"p\":{\"a\":0,\"ix\":2,\"k\":[0,0]},\"r\":{\"a\":1,\"ix\":6,\"k\":[{s:0,e:0,t:0},{s:0,e:0,t:1}]},\"s\":{\"a\":0,\"ix\":3,\"k\":[100,100]},\"sa\":{\"a\":0,\"ix\":5,\"k\":0},\"sk\":{\"a\":0,\"ix\":4,\"k\":0},\"ty\":\"tr\"});\r\n \r\n this.arr.splice(0,0,group);\r\n this._groups.splice(0,0,group);\r\n this._currentCopies += 1;\r\n }\r\n this.elem.reloadShapes();\r\n }\r\n cont = 0;\r\n var renderFlag;\r\n for(i = 0; i <= this._groups.length - 1; i += 1){\r\n renderFlag = cont < copies;\r\n this._groups[i]._render = renderFlag;\r\n this.changeGroupRender(this._groups[i].it, renderFlag);\r\n cont += 1;\r\n }\r\n \r\n this._currentCopies = copies;\r\n ////\r\n\r\n var offset = this.o.v;\r\n var offsetModulo = offset%1;\r\n var roundOffset = offset > 0 ? Math.floor(offset) : Math.ceil(offset);\r\n var k;\r\n var tMat = this.tr.v.props;\r\n var pProps = this.pMatrix.props;\r\n var rProps = this.rMatrix.props;\r\n var sProps = this.sMatrix.props;\r\n this.pMatrix.reset();\r\n this.rMatrix.reset();\r\n this.sMatrix.reset();\r\n this.tMatrix.reset();\r\n this.matrix.reset();\r\n var iteration = 0;\r\n\r\n if(offset > 0) {\r\n while(iteration<roundOffset){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\r\n iteration += 1;\r\n }\r\n if(offsetModulo){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, offsetModulo, false);\r\n iteration += offsetModulo;\r\n }\r\n } else if(offset < 0) {\r\n while(iteration>roundOffset){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, true);\r\n iteration -= 1;\r\n }\r\n if(offsetModulo){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, - offsetModulo, true);\r\n iteration -= offsetModulo;\r\n }\r\n }\r\n i = this.data.m === 1 ? 0 : this._currentCopies - 1;\r\n dir = this.data.m === 1 ? 1 : -1;\r\n cont = this._currentCopies;\r\n var j, jLen;\r\n while(cont){\r\n items = this.elemsData[i].it;\r\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\r\n jLen = itemsTransform.length;\r\n items[items.length - 1].transform.mProps._mdf = true;\r\n items[items.length - 1].transform.op._mdf = true;\r\n items[items.length - 1].transform.op.v = this.so.v + (this.eo.v - this.so.v) * (i / (this._currentCopies - 1));\r\n if(iteration !== 0){\r\n if((i !== 0 && dir === 1) || (i !== this._currentCopies - 1 && dir === -1)){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\r\n }\r\n this.matrix.transform(rProps[0],rProps[1],rProps[2],rProps[3],rProps[4],rProps[5],rProps[6],rProps[7],rProps[8],rProps[9],rProps[10],rProps[11],rProps[12],rProps[13],rProps[14],rProps[15]);\r\n this.matrix.transform(sProps[0],sProps[1],sProps[2],sProps[3],sProps[4],sProps[5],sProps[6],sProps[7],sProps[8],sProps[9],sProps[10],sProps[11],sProps[12],sProps[13],sProps[14],sProps[15]);\r\n this.matrix.transform(pProps[0],pProps[1],pProps[2],pProps[3],pProps[4],pProps[5],pProps[6],pProps[7],pProps[8],pProps[9],pProps[10],pProps[11],pProps[12],pProps[13],pProps[14],pProps[15]);\r\n \r\n for(j=0;j<jLen;j+=1) {\r\n itemsTransform[j] = this.matrix.props[j];\r\n }\r\n this.matrix.reset();\r\n } else {\r\n this.matrix.reset();\r\n for(j=0;j<jLen;j+=1) {\r\n itemsTransform[j] = this.matrix.props[j];\r\n }\r\n }\r\n iteration += 1;\r\n cont -= 1;\r\n i += dir;\r\n }\r\n } else {\r\n cont = this._currentCopies;\r\n i = 0;\r\n dir = 1;\r\n while(cont){\r\n items = this.elemsData[i].it;\r\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\r\n items[items.length - 1].transform.mProps._mdf = false;\r\n items[items.length - 1].transform.op._mdf = false;\r\n cont -= 1;\r\n i += dir;\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.addShape = function(){};\r\n\r\nShapeModifiers.registerModifier('rp',RepeaterModifier);\r\nfunction ShapeCollection(){\r\n\tthis._length = 0;\r\n\tthis._maxLength = 4;\r\n\tthis.shapes = createSizedArray(this._maxLength);\r\n}\r\n\r\nShapeCollection.prototype.addShape = function(shapeData){\r\n\tif(this._length === this._maxLength){\r\n\t\tthis.shapes = this.shapes.concat(createSizedArray(this._maxLength));\r\n\t\tthis._maxLength *= 2;\r\n\t}\r\n\tthis.shapes[this._length] = shapeData;\r\n\tthis._length += 1;\r\n};\r\n\r\nShapeCollection.prototype.releaseShapes = function(){\r\n\tvar i;\r\n\tfor(i = 0; i < this._length; i += 1) {\r\n\t\tshape_pool.release(this.shapes[i]);\r\n\t}\r\n\tthis._length = 0;\r\n};\r\nfunction DashProperty(elem, data, renderer, container) {\r\n this.elem = elem;\r\n this.frameId = -1;\r\n this.dataProps = createSizedArray(data.length);\r\n this.renderer = renderer;\r\n this.k = false;\r\n this.dashStr = '';\r\n this.dashArray = createTypedArray('float32', data.length ? data.length - 1 : 0);\r\n this.dashoffset = createTypedArray('float32', 1);\r\n this.initDynamicPropertyContainer(container);\r\n var i, len = data.length || 0, prop;\r\n for(i = 0; i < len; i += 1) {\r\n prop = PropertyFactory.getProp(elem,data[i].v,0, 0, this);\r\n this.k = prop.k || this.k;\r\n this.dataProps[i] = {n:data[i].n,p:prop};\r\n }\r\n if(!this.k){\r\n this.getValue(true);\r\n }\r\n this._isAnimated = this.k;\r\n}\r\n\r\nDashProperty.prototype.getValue = function(forceRender) {\r\n if(this.elem.globalData.frameId === this.frameId && !forceRender){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n this._mdf = this._mdf || forceRender;\r\n if (this._mdf) {\r\n var i = 0, len = this.dataProps.length;\r\n if(this.renderer === 'svg') {\r\n this.dashStr = '';\r\n }\r\n for(i=0;i<len;i+=1){\r\n if(this.dataProps[i].n != 'o'){\r\n if(this.renderer === 'svg') {\r\n this.dashStr += ' ' + this.dataProps[i].p.v;\r\n }else{\r\n this.dashArray[i] = this.dataProps[i].p.v;\r\n }\r\n }else{\r\n this.dashoffset[0] = this.dataProps[i].p.v;\r\n }\r\n }\r\n }\r\n};\r\nextendPrototype([DynamicPropertyContainer], DashProperty);\r\nfunction GradientProperty(elem,data,container){\r\n this.data = data;\r\n this.c = createTypedArray('uint8c', data.p*4);\r\n var cLength = data.k.k[0].s ? (data.k.k[0].s.length - data.p*4) : data.k.k.length - data.p*4;\r\n this.o = createTypedArray('float32', cLength);\r\n this._cmdf = false;\r\n this._omdf = false;\r\n this._collapsable = this.checkCollapsable();\r\n this._hasOpacity = cLength;\r\n this.initDynamicPropertyContainer(container);\r\n this.prop = PropertyFactory.getProp(elem,data.k,1,null,this);\r\n this.k = this.prop.k;\r\n this.getValue(true);\r\n}\r\n\r\nGradientProperty.prototype.comparePoints = function(values, points) {\r\n var i = 0, len = this.o.length/2, diff;\r\n while(i < len) {\r\n diff = Math.abs(values[i*4] - values[points*4 + i*2]);\r\n if(diff > 0.01){\r\n return false;\r\n }\r\n i += 1;\r\n }\r\n return true;\r\n};\r\n\r\nGradientProperty.prototype.checkCollapsable = function() {\r\n if (this.o.length/2 !== this.c.length/4) {\r\n return false;\r\n }\r\n if (this.data.k.k[0].s) {\r\n var i = 0, len = this.data.k.k.length;\r\n while (i < len) {\r\n if (!this.comparePoints(this.data.k.k[i].s, this.data.p)) {\r\n return false;\r\n }\r\n i += 1;\r\n }\r\n } else if(!this.comparePoints(this.data.k.k, this.data.p)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nGradientProperty.prototype.getValue = function(forceRender){\r\n this.prop.getValue();\r\n this._mdf = false;\r\n this._cmdf = false;\r\n this._omdf = false;\r\n if(this.prop._mdf || forceRender){\r\n var i, len = this.data.p*4;\r\n var mult, val;\r\n for(i=0;i<len;i+=1){\r\n mult = i%4 === 0 ? 100 : 255;\r\n val = Math.round(this.prop.v[i]*mult);\r\n if(this.c[i] !== val){\r\n this.c[i] = val;\r\n this._cmdf = !forceRender;\r\n }\r\n }\r\n if(this.o.length){\r\n len = this.prop.v.length;\r\n for(i=this.data.p*4;i<len;i+=1){\r\n mult = i%2 === 0 ? 100 : 1;\r\n val = i%2 === 0 ? Math.round(this.prop.v[i]*100):this.prop.v[i];\r\n if(this.o[i-this.data.p*4] !== val){\r\n this.o[i-this.data.p*4] = val;\r\n this._omdf = !forceRender;\r\n }\r\n }\r\n }\r\n this._mdf = !forceRender;\r\n }\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], GradientProperty);\r\nvar buildShapeString = function(pathNodes, length, closed, mat) {\r\n\tif(length === 0) {\r\n return '';\r\n }\r\n var _o = pathNodes.o;\r\n var _i = pathNodes.i;\r\n var _v = pathNodes.v;\r\n var i, shapeString = \" M\" + mat.applyToPointStringified(_v[0][0], _v[0][1]);\r\n for(i = 1; i < length; i += 1) {\r\n shapeString += \" C\" + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + \" \" + mat.applyToPointStringified(_i[i][0], _i[i][1]) + \" \" + mat.applyToPointStringified(_v[i][0], _v[i][1]);\r\n }\r\n if (closed && length) {\r\n shapeString += \" C\" + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + \" \" + mat.applyToPointStringified(_i[0][0], _i[0][1]) + \" \" + mat.applyToPointStringified(_v[0][0], _v[0][1]);\r\n shapeString += 'z';\r\n }\r\n return shapeString;\r\n}\r\nvar ImagePreloader = (function(){\r\n\r\n var proxyImage = (function(){\r\n var canvas = createTag('canvas');\r\n canvas.width = 1;\r\n canvas.height = 1;\r\n var ctx = canvas.getContext('2d');\r\n ctx.fillStyle = 'rgba(0,0,0,0)';\r\n ctx.fillRect(0, 0, 1, 1);\r\n return canvas;\r\n }())\r\n\r\n function imageLoaded(){\r\n this.loadedAssets += 1;\r\n if(this.loadedAssets === this.totalImages){\r\n if(this.imagesLoadedCb) {\r\n this.imagesLoadedCb(null);\r\n }\r\n }\r\n }\r\n\r\n function getAssetsPath(assetData, assetsPath, original_path) {\r\n var path = '';\r\n if (assetData.e) {\r\n path = assetData.p;\r\n } else if(assetsPath) {\r\n var imagePath = assetData.p;\r\n if (imagePath.indexOf('images/') !== -1) {\r\n imagePath = imagePath.split('/')[1];\r\n }\r\n path = assetsPath + imagePath;\r\n } else {\r\n path = original_path;\r\n path += assetData.u ? assetData.u : '';\r\n path += assetData.p;\r\n }\r\n return path;\r\n }\r\n\r\n function createImageData(assetData) {\r\n var path = getAssetsPath(assetData, this.assetsPath, this.path);\r\n var img = createTag('img');\r\n img.crossOrigin = 'anonymous';\r\n img.addEventListener('load', this._imageLoaded.bind(this), false);\r\n img.addEventListener('error', function() {\r\n ob.img = proxyImage;\r\n this._imageLoaded();\r\n }.bind(this), false);\r\n img.src = path;\r\n var ob = {\r\n img: img,\r\n assetData: assetData\r\n }\r\n return ob;\r\n }\r\n\r\n function loadAssets(assets, cb){\r\n this.imagesLoadedCb = cb;\r\n var i, len = assets.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!assets[i].layers){\r\n this.totalImages += 1;\r\n this.images.push(this._createImageData(assets[i]));\r\n }\r\n }\r\n }\r\n\r\n function setPath(path){\r\n this.path = path || '';\r\n }\r\n\r\n function setAssetsPath(path){\r\n this.assetsPath = path || '';\r\n }\r\n\r\n function getImage(assetData) {\r\n var i = 0, len = this.images.length;\r\n while (i < len) {\r\n if (this.images[i].assetData === assetData) {\r\n return this.images[i].img;\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function destroy() {\r\n this.imagesLoadedCb = null;\r\n this.images.length = 0;\r\n }\r\n\r\n function loaded() {\r\n return this.totalImages === this.loadedAssets;\r\n }\r\n\r\n return function ImagePreloader(){\r\n this.loadAssets = loadAssets;\r\n this.setAssetsPath = setAssetsPath;\r\n this.setPath = setPath;\r\n this.loaded = loaded;\r\n this.destroy = destroy;\r\n this.getImage = getImage;\r\n this._createImageData = createImageData;\r\n this._imageLoaded = imageLoaded;\r\n this.assetsPath = '';\r\n this.path = '';\r\n this.totalImages = 0;\r\n this.loadedAssets = 0;\r\n this.imagesLoadedCb = null;\r\n this.images = [];\r\n };\r\n}());\r\nvar featureSupport = (function(){\r\n\tvar ob = {\r\n\t\tmaskType: true\r\n\t};\r\n\tif (/MSIE 10/i.test(navigator.userAgent) || /MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)) {\r\n\t ob.maskType = false;\r\n\t}\r\n\treturn ob;\r\n}());\r\nvar filtersFactory = (function(){\r\n\tvar ob = {};\r\n\tob.createFilter = createFilter;\r\n\tob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter;\r\n\r\n\tfunction createFilter(filId){\r\n \tvar fil = createNS('filter');\r\n \tfil.setAttribute('id',filId);\r\n fil.setAttribute('filterUnits','objectBoundingBox');\r\n fil.setAttribute('x','0%');\r\n fil.setAttribute('y','0%');\r\n fil.setAttribute('width','100%');\r\n fil.setAttribute('height','100%');\r\n return fil;\r\n\t}\r\n\r\n\tfunction createAlphaToLuminanceFilter(){\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1');\r\n return feColorMatrix;\r\n\t}\r\n\r\n\treturn ob;\r\n}());\r\nvar assetLoader = (function(){\r\n\r\n\tfunction formatResponse(xhr) {\r\n\t\tif(xhr.response && typeof xhr.response === 'object') {\r\n\t\t\treturn xhr.response;\r\n\t\t} else if(xhr.response && typeof xhr.response === 'string') {\r\n\t\t\treturn JSON.parse(xhr.response);\r\n\t\t} else if(xhr.responseText) {\r\n\t\t\treturn JSON.parse(xhr.responseText);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadAsset(path, callback, errorCallback) {\r\n\t\tvar response;\r\n\t\tvar xhr = new XMLHttpRequest();\r\n\t\txhr.open('GET', path, true);\r\n\t\t// set responseType after calling open or IE will break.\r\n\t\ttry {\r\n\t\t // This crashes on Android WebView prior to KitKat\r\n\t\t xhr.responseType = \"json\";\r\n\t\t} catch (err) {}\r\n\t xhr.send();\r\n\t xhr.onreadystatechange = function () {\r\n\t if (xhr.readyState == 4) {\r\n\t if(xhr.status == 200){\r\n\t \tresponse = formatResponse(xhr);\r\n\t \tcallback(response);\r\n\t }else{\r\n\t try{\r\n\t \t\tresponse = formatResponse(xhr);\r\n\t \t\tcallback(response);\r\n\t }catch(err){\r\n\t \tif(errorCallback) {\r\n\t \t\terrorCallback(err);\r\n\t \t}\r\n\t }\r\n\t }\r\n\t }\r\n\t };\r\n\t}\r\n\treturn {\r\n\t\tload: loadAsset\r\n\t}\r\n}())\r\n\r\nfunction TextAnimatorProperty(textData, renderType, elem){\r\n this._isFirstFrame = true;\r\n\tthis._hasMaskedPath = false;\r\n\tthis._frameId = -1;\r\n\tthis._textData = textData;\r\n\tthis._renderType = renderType;\r\n this._elem = elem;\r\n\tthis._animatorsData = createSizedArray(this._textData.a.length);\r\n\tthis._pathData = {};\r\n\tthis._moreOptions = {\r\n\t\talignment: {}\r\n\t};\r\n\tthis.renderedLetters = [];\r\n this.lettersChangedFlag = false;\r\n this.initDynamicPropertyContainer(elem);\r\n\r\n}\r\n\r\nTextAnimatorProperty.prototype.searchProperties = function(){\r\n var i, len = this._textData.a.length, animatorProps;\r\n var getProp = PropertyFactory.getProp;\r\n for(i=0;i<len;i+=1){\r\n animatorProps = this._textData.a[i];\r\n this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this);\r\n }\r\n if(this._textData.p && 'm' in this._textData.p){\r\n this._pathData = {\r\n f: getProp(this._elem,this._textData.p.f,0,0,this),\r\n l: getProp(this._elem,this._textData.p.l,0,0,this),\r\n r: this._textData.p.r,\r\n m: this._elem.maskManager.getMaskProperty(this._textData.p.m)\r\n };\r\n this._hasMaskedPath = true;\r\n } else {\r\n this._hasMaskedPath = false;\r\n }\r\n this._moreOptions.alignment = getProp(this._elem,this._textData.m.a,1,0,this);\r\n};\r\n\r\nTextAnimatorProperty.prototype.getMeasures = function(documentData, lettersChangedFlag){\r\n this.lettersChangedFlag = lettersChangedFlag;\r\n if(!this._mdf && !this._isFirstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m._mdf)) {\r\n return;\r\n }\r\n this._isFirstFrame = false;\r\n var alignment = this._moreOptions.alignment.v;\r\n var animators = this._animatorsData;\r\n var textData = this._textData;\r\n var matrixHelper = this.mHelper;\r\n var renderType = this._renderType;\r\n var renderedLettersCount = this.renderedLetters.length;\r\n var data = this.data;\r\n var xPos,yPos;\r\n var i, len;\r\n var letters = documentData.l, pathInfo, currentLength, currentPoint, segmentLength, flag, pointInd, segmentInd, prevPoint, points, segments, partialLength, totalLength, perc, tanAngle, mask;\r\n if(this._hasMaskedPath) {\r\n mask = this._pathData.m;\r\n if(!this._pathData.n || this._pathData._mdf){\r\n var paths = mask.v;\r\n if(this._pathData.r){\r\n paths = paths.reverse();\r\n }\r\n // TODO: release bezier data cached from previous pathInfo: this._pathData.pi\r\n pathInfo = {\r\n tLength: 0,\r\n segments: []\r\n };\r\n len = paths._length - 1;\r\n var bezierData;\r\n totalLength = 0;\r\n for (i = 0; i < len; i += 1) {\r\n bezierData = bez.buildBezierData(paths.v[i]\r\n , paths.v[i + 1]\r\n , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]\r\n , [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]);\r\n pathInfo.tLength += bezierData.segmentLength;\r\n pathInfo.segments.push(bezierData);\r\n totalLength += bezierData.segmentLength;\r\n }\r\n i = len;\r\n if (mask.v.c) {\r\n bezierData = bez.buildBezierData(paths.v[i]\r\n , paths.v[0]\r\n , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]\r\n , [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]);\r\n pathInfo.tLength += bezierData.segmentLength;\r\n pathInfo.segments.push(bezierData);\r\n totalLength += bezierData.segmentLength;\r\n }\r\n this._pathData.pi = pathInfo;\r\n }\r\n pathInfo = this._pathData.pi;\r\n\r\n currentLength = this._pathData.f.v;\r\n segmentInd = 0;\r\n pointInd = 1;\r\n segmentLength = 0;\r\n flag = true;\r\n segments = pathInfo.segments;\r\n if (currentLength < 0 && mask.v.c) {\r\n if (pathInfo.tLength < Math.abs(currentLength)) {\r\n currentLength = -Math.abs(currentLength) % pathInfo.tLength;\r\n }\r\n segmentInd = segments.length - 1;\r\n points = segments[segmentInd].points;\r\n pointInd = points.length - 1;\r\n while (currentLength < 0) {\r\n currentLength += points[pointInd].partialLength;\r\n pointInd -= 1;\r\n if (pointInd < 0) {\r\n segmentInd -= 1;\r\n points = segments[segmentInd].points;\r\n pointInd = points.length - 1;\r\n }\r\n }\r\n\r\n }\r\n points = segments[segmentInd].points;\r\n prevPoint = points[pointInd - 1];\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n }\r\n\r\n\r\n len = letters.length;\r\n xPos = 0;\r\n yPos = 0;\r\n var yOff = documentData.finalSize * 1.2 * 0.714;\r\n var firstLine = true;\r\n var animatorProps, animatorSelector;\r\n var j, jLen;\r\n var letterValue;\r\n\r\n jLen = animators.length;\r\n var lastLetter;\r\n\r\n var mult, ind = -1, offf, xPathPos, yPathPos;\r\n var initPathPos = currentLength,initSegmentInd = segmentInd, initPointInd = pointInd, currentLine = -1;\r\n var elemOpacity;\r\n var sc,sw,fc,k;\r\n var lineLength = 0;\r\n var letterSw, letterSc, letterFc, letterM = '', letterP = this.defaultPropsArray, letterO;\r\n\r\n //\r\n if(documentData.j === 2 || documentData.j === 1) {\r\n var animatorJustifyOffset = 0;\r\n var animatorFirstCharOffset = 0;\r\n var justifyOffsetMult = documentData.j === 2 ? -0.5 : -1;\r\n var lastIndex = 0;\r\n var isNewLine = true;\r\n\r\n for (i = 0; i < len; i += 1) {\r\n if (letters[i].n) {\r\n if(animatorJustifyOffset) {\r\n animatorJustifyOffset += animatorFirstCharOffset;\r\n }\r\n while (lastIndex < i) {\r\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\r\n lastIndex += 1;\r\n }\r\n animatorJustifyOffset = 0;\r\n isNewLine = true;\r\n } else {\r\n for (j = 0; j < jLen; j += 1) {\r\n animatorProps = animators[j].a;\r\n if (animatorProps.t.propType) {\r\n if (isNewLine && documentData.j === 2) {\r\n animatorFirstCharOffset += animatorProps.t.v * justifyOffsetMult;\r\n }\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\r\n if (mult.length) {\r\n animatorJustifyOffset += animatorProps.t.v*mult[0] * justifyOffsetMult;\r\n } else {\r\n animatorJustifyOffset += animatorProps.t.v*mult * justifyOffsetMult;\r\n }\r\n }\r\n }\r\n isNewLine = false;\r\n }\r\n }\r\n if(animatorJustifyOffset) {\r\n animatorJustifyOffset += animatorFirstCharOffset;\r\n }\r\n while(lastIndex < i) {\r\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\r\n lastIndex += 1;\r\n }\r\n }\r\n //\r\n\r\n for( i = 0; i < len; i += 1) {\r\n\r\n matrixHelper.reset();\r\n elemOpacity = 1;\r\n if(letters[i].n) {\r\n xPos = 0;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n currentLength = initPathPos ;\r\n firstLine = false;\r\n lineLength = 0;\r\n if(this._hasMaskedPath) {\r\n segmentInd = initSegmentInd;\r\n pointInd = initPointInd;\r\n points = segments[segmentInd].points;\r\n prevPoint = points[pointInd - 1];\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n segmentLength = 0;\r\n }\r\n letterO = letterSw = letterFc = letterM = '';\r\n letterP = this.defaultPropsArray;\r\n }else{\r\n if(this._hasMaskedPath) {\r\n if(currentLine !== letters[i].line){\r\n switch(documentData.j){\r\n case 1:\r\n currentLength += totalLength - documentData.lineWidths[letters[i].line];\r\n break;\r\n case 2:\r\n currentLength += (totalLength - documentData.lineWidths[letters[i].line])/2;\r\n break;\r\n }\r\n currentLine = letters[i].line;\r\n }\r\n if (ind !== letters[i].ind) {\r\n if (letters[ind]) {\r\n currentLength += letters[ind].extra;\r\n }\r\n currentLength += letters[i].an / 2;\r\n ind = letters[i].ind;\r\n }\r\n currentLength += alignment[0] * letters[i].an / 200;\r\n var animatorOffset = 0;\r\n for (j = 0; j < jLen; j += 1) {\r\n animatorProps = animators[j].a;\r\n if (animatorProps.p.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n animatorOffset += animatorProps.p.v[0] * mult[0];\r\n } else{\r\n animatorOffset += animatorProps.p.v[0] * mult;\r\n }\r\n\r\n }\r\n if (animatorProps.a.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n animatorOffset += animatorProps.a.v[0] * mult[0];\r\n } else{\r\n animatorOffset += animatorProps.a.v[0] * mult;\r\n }\r\n\r\n }\r\n }\r\n flag = true;\r\n while (flag) {\r\n if (segmentLength + partialLength >= currentLength + animatorOffset || !points) {\r\n perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength;\r\n xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc;\r\n yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc;\r\n matrixHelper.translate(-alignment[0]*letters[i].an/200, -(alignment[1] * yOff / 100));\r\n flag = false;\r\n } else if (points) {\r\n segmentLength += currentPoint.partialLength;\r\n pointInd += 1;\r\n if (pointInd >= points.length) {\r\n pointInd = 0;\r\n segmentInd += 1;\r\n if (!segments[segmentInd]) {\r\n if (mask.v.c) {\r\n pointInd = 0;\r\n segmentInd = 0;\r\n points = segments[segmentInd].points;\r\n } else {\r\n segmentLength -= currentPoint.partialLength;\r\n points = null;\r\n }\r\n } else {\r\n points = segments[segmentInd].points;\r\n }\r\n }\r\n if (points) {\r\n prevPoint = currentPoint;\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n }\r\n }\r\n }\r\n offf = letters[i].an / 2 - letters[i].add;\r\n matrixHelper.translate(-offf, 0, 0);\r\n } else {\r\n offf = letters[i].an/2 - letters[i].add;\r\n matrixHelper.translate(-offf,0,0);\r\n\r\n // Grouping alignment\r\n matrixHelper.translate(-alignment[0]*letters[i].an/200, -alignment[1]*yOff/100, 0);\r\n }\r\n\r\n lineLength += letters[i].l/2;\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.t.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n //This condition is to prevent applying tracking to first character in each line. Might be better to use a boolean \"isNewLine\"\r\n if(xPos !== 0 || documentData.j !== 0) {\r\n if(this._hasMaskedPath) {\r\n if(mult.length) {\r\n currentLength += animatorProps.t.v*mult[0];\r\n } else {\r\n currentLength += animatorProps.t.v*mult;\r\n }\r\n }else{\r\n if(mult.length) {\r\n xPos += animatorProps.t.v*mult[0];\r\n } else {\r\n xPos += animatorProps.t.v*mult;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n lineLength += letters[i].l/2;\r\n if(documentData.strokeWidthAnim) {\r\n sw = documentData.sw || 0;\r\n }\r\n if(documentData.strokeColorAnim) {\r\n if(documentData.sc){\r\n sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]];\r\n }else{\r\n sc = [0,0,0];\r\n }\r\n }\r\n if(documentData.fillColorAnim && documentData.fc) {\r\n fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];\r\n }\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.a.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n\r\n if(mult.length){\r\n matrixHelper.translate(-animatorProps.a.v[0]*mult[0], -animatorProps.a.v[1]*mult[1], animatorProps.a.v[2]*mult[2]);\r\n } else {\r\n matrixHelper.translate(-animatorProps.a.v[0]*mult, -animatorProps.a.v[1]*mult, animatorProps.a.v[2]*mult);\r\n }\r\n }\r\n }\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.s.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n matrixHelper.scale(1+((animatorProps.s.v[0]-1)*mult[0]),1+((animatorProps.s.v[1]-1)*mult[1]),1);\r\n } else {\r\n matrixHelper.scale(1+((animatorProps.s.v[0]-1)*mult),1+((animatorProps.s.v[1]-1)*mult),1);\r\n }\r\n }\r\n }\r\n for(j=0;j<jLen;j+=1) {\r\n animatorProps = animators[j].a;\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if (animatorProps.sk.propType) {\r\n if(mult.length) {\r\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult[0], animatorProps.sa.v * mult[1]);\r\n } else {\r\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult, animatorProps.sa.v * mult);\r\n }\r\n }\r\n if (animatorProps.r.propType) {\r\n if(mult.length) {\r\n matrixHelper.rotateZ(-animatorProps.r.v * mult[2]);\r\n } else {\r\n matrixHelper.rotateZ(-animatorProps.r.v * mult);\r\n }\r\n }\r\n if (animatorProps.ry.propType) {\r\n\r\n if(mult.length) {\r\n matrixHelper.rotateY(animatorProps.ry.v*mult[1]);\r\n }else{\r\n matrixHelper.rotateY(animatorProps.ry.v*mult);\r\n }\r\n }\r\n if (animatorProps.rx.propType) {\r\n if(mult.length) {\r\n matrixHelper.rotateX(animatorProps.rx.v*mult[0]);\r\n } else {\r\n matrixHelper.rotateX(animatorProps.rx.v*mult);\r\n }\r\n }\r\n if (animatorProps.o.propType) {\r\n if(mult.length) {\r\n elemOpacity += ((animatorProps.o.v)*mult[0] - elemOpacity)*mult[0];\r\n } else {\r\n elemOpacity += ((animatorProps.o.v)*mult - elemOpacity)*mult;\r\n }\r\n }\r\n if (documentData.strokeWidthAnim && animatorProps.sw.propType) {\r\n if(mult.length) {\r\n sw += animatorProps.sw.v*mult[0];\r\n } else {\r\n sw += animatorProps.sw.v*mult;\r\n }\r\n }\r\n if (documentData.strokeColorAnim && animatorProps.sc.propType) {\r\n for(k=0;k<3;k+=1){\r\n if(mult.length) {\r\n sc[k] = sc[k] + (animatorProps.sc.v[k] - sc[k])*mult[0];\r\n } else {\r\n sc[k] = sc[k] + (animatorProps.sc.v[k] - sc[k])*mult;\r\n }\r\n }\r\n }\r\n if (documentData.fillColorAnim && documentData.fc) {\r\n if(animatorProps.fc.propType){\r\n for(k=0;k<3;k+=1){\r\n if(mult.length) {\r\n fc[k] = fc[k] + (animatorProps.fc.v[k] - fc[k])*mult[0];\r\n } else {\r\n fc[k] = fc[k] + (animatorProps.fc.v[k] - fc[k])*mult;\r\n }\r\n }\r\n }\r\n if(animatorProps.fh.propType){\r\n if(mult.length) {\r\n fc = addHueToRGB(fc,animatorProps.fh.v*mult[0]);\r\n } else {\r\n fc = addHueToRGB(fc,animatorProps.fh.v*mult);\r\n }\r\n }\r\n if(animatorProps.fs.propType){\r\n if(mult.length) {\r\n fc = addSaturationToRGB(fc,animatorProps.fs.v*mult[0]);\r\n } else {\r\n fc = addSaturationToRGB(fc,animatorProps.fs.v*mult);\r\n }\r\n }\r\n if(animatorProps.fb.propType){\r\n if(mult.length) {\r\n fc = addBrightnessToRGB(fc,animatorProps.fb.v*mult[0]);\r\n } else {\r\n fc = addBrightnessToRGB(fc,animatorProps.fb.v*mult);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n\r\n if (animatorProps.p.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(this._hasMaskedPath) {\r\n if(mult.length) {\r\n matrixHelper.translate(0, animatorProps.p.v[1] * mult[0], -animatorProps.p.v[2] * mult[1]);\r\n } else {\r\n matrixHelper.translate(0, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\r\n }\r\n }else{\r\n if(mult.length) {\r\n matrixHelper.translate(animatorProps.p.v[0] * mult[0], animatorProps.p.v[1] * mult[1], -animatorProps.p.v[2] * mult[2]);\r\n } else {\r\n matrixHelper.translate(animatorProps.p.v[0] * mult, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\r\n \r\n }\r\n }\r\n }\r\n }\r\n if(documentData.strokeWidthAnim){\r\n letterSw = sw < 0 ? 0 : sw;\r\n }\r\n if(documentData.strokeColorAnim){\r\n letterSc = 'rgb('+Math.round(sc[0]*255)+','+Math.round(sc[1]*255)+','+Math.round(sc[2]*255)+')';\r\n }\r\n if(documentData.fillColorAnim && documentData.fc){\r\n letterFc = 'rgb('+Math.round(fc[0]*255)+','+Math.round(fc[1]*255)+','+Math.round(fc[2]*255)+')';\r\n }\r\n\r\n if(this._hasMaskedPath) {\r\n matrixHelper.translate(0,-documentData.ls);\r\n\r\n matrixHelper.translate(0, alignment[1]*yOff/100 + yPos,0);\r\n if (textData.p.p) {\r\n tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]);\r\n var rot = Math.atan(tanAngle) * 180 / Math.PI;\r\n if (currentPoint.point[0] < prevPoint.point[0]) {\r\n rot += 180;\r\n }\r\n matrixHelper.rotate(-rot * Math.PI / 180);\r\n }\r\n matrixHelper.translate(xPathPos, yPathPos, 0);\r\n currentLength -= alignment[0]*letters[i].an/200;\r\n if(letters[i+1] && ind !== letters[i+1].ind){\r\n currentLength += letters[i].an / 2;\r\n currentLength += documentData.tr/1000*documentData.finalSize;\r\n }\r\n }else{\r\n\r\n matrixHelper.translate(xPos,yPos,0);\r\n\r\n if(documentData.ps){\r\n //matrixHelper.translate(documentData.ps[0],documentData.ps[1],0);\r\n matrixHelper.translate(documentData.ps[0],documentData.ps[1] + documentData.ascent,0);\r\n }\r\n switch(documentData.j){\r\n case 1:\r\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]),0,0);\r\n break;\r\n case 2:\r\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line])/2,0,0);\r\n break;\r\n }\r\n matrixHelper.translate(0,-documentData.ls);\r\n matrixHelper.translate(offf,0,0);\r\n matrixHelper.translate(alignment[0]*letters[i].an/200,alignment[1]*yOff/100,0);\r\n xPos += letters[i].l + documentData.tr/1000*documentData.finalSize;\r\n }\r\n if(renderType === 'html'){\r\n letterM = matrixHelper.toCSS();\r\n }else if(renderType === 'svg'){\r\n letterM = matrixHelper.to2dCSS();\r\n }else{\r\n letterP = [matrixHelper.props[0],matrixHelper.props[1],matrixHelper.props[2],matrixHelper.props[3],matrixHelper.props[4],matrixHelper.props[5],matrixHelper.props[6],matrixHelper.props[7],matrixHelper.props[8],matrixHelper.props[9],matrixHelper.props[10],matrixHelper.props[11],matrixHelper.props[12],matrixHelper.props[13],matrixHelper.props[14],matrixHelper.props[15]];\r\n }\r\n letterO = elemOpacity;\r\n }\r\n\r\n if(renderedLettersCount <= i) {\r\n letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,letterM,letterP);\r\n this.renderedLetters.push(letterValue);\r\n renderedLettersCount += 1;\r\n this.lettersChangedFlag = true;\r\n } else {\r\n letterValue = this.renderedLetters[i];\r\n this.lettersChangedFlag = letterValue.update(letterO, letterSw, letterSc, letterFc, letterM, letterP) || this.lettersChangedFlag;\r\n }\r\n }\r\n};\r\n\r\nTextAnimatorProperty.prototype.getValue = function(){\r\n\tif(this._elem.globalData.frameId === this._frameId){\r\n return;\r\n }\r\n this._frameId = this._elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n};\r\n\r\nTextAnimatorProperty.prototype.mHelper = new Matrix();\r\nTextAnimatorProperty.prototype.defaultPropsArray = [];\r\nextendPrototype([DynamicPropertyContainer], TextAnimatorProperty);\r\nfunction TextAnimatorDataProperty(elem, animatorProps, container) {\r\n\tvar defaultData = {propType:false};\r\n\tvar getProp = PropertyFactory.getProp;\r\n\tvar textAnimator_animatables = animatorProps.a;\r\n\tthis.a = {\r\n\t\tr: textAnimator_animatables.r ? getProp(elem, textAnimator_animatables.r, 0, degToRads, container) : defaultData,\r\n\t\trx: textAnimator_animatables.rx ? getProp(elem, textAnimator_animatables.rx, 0, degToRads, container) : defaultData,\r\n\t\try: textAnimator_animatables.ry ? getProp(elem, textAnimator_animatables.ry, 0, degToRads, container) : defaultData,\r\n\t\tsk: textAnimator_animatables.sk ? getProp(elem, textAnimator_animatables.sk, 0, degToRads, container) : defaultData,\r\n\t\tsa: textAnimator_animatables.sa ? getProp(elem, textAnimator_animatables.sa, 0, degToRads, container) : defaultData,\r\n\t\ts: textAnimator_animatables.s ? getProp(elem, textAnimator_animatables.s, 1, 0.01, container) : defaultData,\r\n\t\ta: textAnimator_animatables.a ? getProp(elem, textAnimator_animatables.a, 1, 0, container) : defaultData,\r\n\t\to: textAnimator_animatables.o ? getProp(elem, textAnimator_animatables.o, 0, 0.01, container) : defaultData,\r\n\t\tp: textAnimator_animatables.p ? getProp(elem,textAnimator_animatables.p, 1, 0, container) : defaultData,\r\n\t\tsw: textAnimator_animatables.sw ? getProp(elem, textAnimator_animatables.sw, 0, 0, container) : defaultData,\r\n\t\tsc: textAnimator_animatables.sc ? getProp(elem, textAnimator_animatables.sc, 1, 0, container) : defaultData,\r\n\t\tfc: textAnimator_animatables.fc ? getProp(elem, textAnimator_animatables.fc, 1, 0, container) : defaultData,\r\n\t\tfh: textAnimator_animatables.fh ? getProp(elem, textAnimator_animatables.fh, 0, 0, container) : defaultData,\r\n\t\tfs: textAnimator_animatables.fs ? getProp(elem, textAnimator_animatables.fs, 0, 0.01, container) : defaultData,\r\n\t\tfb: textAnimator_animatables.fb ? getProp(elem, textAnimator_animatables.fb, 0, 0.01, container) : defaultData,\r\n\t\tt: textAnimator_animatables.t ? getProp(elem, textAnimator_animatables.t, 0, 0, container) : defaultData\r\n\t};\r\n\r\n\tthis.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, container);\r\n this.s.t = animatorProps.s.t;\r\n}\r\nfunction LetterProps(o, sw, sc, fc, m, p){\r\n this.o = o;\r\n this.sw = sw;\r\n this.sc = sc;\r\n this.fc = fc;\r\n this.m = m;\r\n this.p = p;\r\n this._mdf = {\r\n \to: true,\r\n \tsw: !!sw,\r\n \tsc: !!sc,\r\n \tfc: !!fc,\r\n \tm: true,\r\n \tp: true\r\n };\r\n}\r\n\r\nLetterProps.prototype.update = function(o, sw, sc, fc, m, p) {\r\n\tthis._mdf.o = false;\r\n\tthis._mdf.sw = false;\r\n\tthis._mdf.sc = false;\r\n\tthis._mdf.fc = false;\r\n\tthis._mdf.m = false;\r\n\tthis._mdf.p = false;\r\n\tvar updated = false;\r\n\r\n\tif(this.o !== o) {\r\n\t\tthis.o = o;\r\n\t\tthis._mdf.o = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.sw !== sw) {\r\n\t\tthis.sw = sw;\r\n\t\tthis._mdf.sw = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.sc !== sc) {\r\n\t\tthis.sc = sc;\r\n\t\tthis._mdf.sc = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.fc !== fc) {\r\n\t\tthis.fc = fc;\r\n\t\tthis._mdf.fc = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.m !== m) {\r\n\t\tthis.m = m;\r\n\t\tthis._mdf.m = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(p.length && (this.p[0] !== p[0] || this.p[1] !== p[1] || this.p[4] !== p[4] || this.p[5] !== p[5] || this.p[12] !== p[12] || this.p[13] !== p[13])) {\r\n\t\tthis.p = p;\r\n\t\tthis._mdf.p = true;\r\n\t\tupdated = true;\r\n\t}\r\n\treturn updated;\r\n};\r\nfunction TextProperty(elem, data){\r\n\tthis._frameId = initialDefaultFrame;\r\n\tthis.pv = '';\r\n\tthis.v = '';\r\n\tthis.kf = false;\r\n\tthis._isFirstFrame = true;\r\n\tthis._mdf = false;\r\n this.data = data;\r\n\tthis.elem = elem;\r\n this.comp = this.elem.comp;\r\n\tthis.keysIndex = 0;\r\n this.canResize = false;\r\n this.minimumFontSize = 1;\r\n this.effectsSequence = [];\r\n\tthis.currentData = {\r\n\t\tascent: 0,\r\n boxWidth: this.defaultBoxWidth,\r\n f: '',\r\n fStyle: '',\r\n fWeight: '',\r\n fc: '',\r\n j: '',\r\n justifyOffset: '',\r\n l: [],\r\n lh: 0,\r\n lineWidths: [],\r\n ls: '',\r\n of: '',\r\n s: '',\r\n sc: '',\r\n sw: 0,\r\n t: 0,\r\n tr: 0,\r\n sz:0,\r\n ps:null,\r\n fillColorAnim: false,\r\n strokeColorAnim: false,\r\n strokeWidthAnim: false,\r\n yOffset: 0,\r\n finalSize:0,\r\n finalText:[],\r\n finalLineHeight: 0,\r\n __complete: false\r\n\r\n\t};\r\n this.copyData(this.currentData, this.data.d.k[0].s);\r\n\r\n if(!this.searchProperty()) {\r\n this.completeTextData(this.currentData);\r\n }\r\n}\r\n\r\nTextProperty.prototype.defaultBoxWidth = [0,0];\r\n\r\nTextProperty.prototype.copyData = function(obj, data) {\r\n for(var s in data) {\r\n if(data.hasOwnProperty(s)) {\r\n obj[s] = data[s];\r\n }\r\n }\r\n return obj;\r\n}\r\n\r\nTextProperty.prototype.setCurrentData = function(data){\r\n if(!data.__complete) {\r\n this.completeTextData(data);\r\n }\r\n this.currentData = data;\r\n this.currentData.boxWidth = this.currentData.boxWidth || this.defaultBoxWidth;\r\n this._mdf = true;\r\n};\r\n\r\nTextProperty.prototype.searchProperty = function() {\r\n return this.searchKeyframes();\r\n};\r\n\r\nTextProperty.prototype.searchKeyframes = function() {\r\n this.kf = this.data.d.k.length > 1;\r\n if(this.kf) {\r\n this.addEffect(this.getKeyframeValue.bind(this));\r\n }\r\n return this.kf;\r\n}\r\n\r\nTextProperty.prototype.addEffect = function(effectFunction) {\r\n\tthis.effectsSequence.push(effectFunction);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.getValue = function(_finalValue) {\r\n if((this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) && !_finalValue) {\r\n return;\r\n }\r\n this.currentData.t = this.data.d.k[this.keysIndex].s.t;\r\n var currentValue = this.currentData;\r\n var currentIndex = this.keysIndex;\r\n if(this.lock) {\r\n this.setCurrentData(this.currentData);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = false;\r\n var multipliedValue;\r\n var i, len = this.effectsSequence.length;\r\n var finalValue = _finalValue || this.data.d.k[this.keysIndex].s;\r\n for(i = 0; i < len; i += 1) {\r\n //Checking if index changed to prevent creating a new object every time the expression updates.\r\n if(currentIndex !== this.keysIndex) {\r\n finalValue = this.effectsSequence[i](finalValue, finalValue.t);\r\n } else {\r\n finalValue = this.effectsSequence[i](this.currentData, finalValue.t);\r\n }\r\n }\r\n if(currentValue !== finalValue) {\r\n this.setCurrentData(finalValue);\r\n }\r\n this.pv = this.v = this.currentData;\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n}\r\n\r\nTextProperty.prototype.getKeyframeValue = function() {\r\n var textKeys = this.data.d.k, textDocumentData;\r\n var frameNum = this.elem.comp.renderedFrame;\r\n var i = 0, len = textKeys.length;\r\n while(i <= len - 1) {\r\n textDocumentData = textKeys[i].s;\r\n if(i === len - 1 || textKeys[i+1].t > frameNum){\r\n break;\r\n }\r\n i += 1;\r\n }\r\n if(this.keysIndex !== i) {\r\n this.keysIndex = i;\r\n }\r\n return this.data.d.k[this.keysIndex].s;\r\n};\r\n\r\nTextProperty.prototype.buildFinalText = function(text) {\r\n var combinedCharacters = FontManager.getCombinedCharacterCodes();\r\n var charactersArray = [];\r\n var i = 0, len = text.length;\r\n var charCode;\r\n while (i < len) {\r\n charCode = text.charCodeAt(i);\r\n if (combinedCharacters.indexOf(charCode) !== -1) {\r\n charactersArray[charactersArray.length - 1] += text.charAt(i);\r\n } else {\r\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\r\n charCode = text.charCodeAt(i + 1);\r\n if (charCode >= 0xDC00 && charCode <= 0xDFFF) {\r\n charactersArray.push(text.substr(i, 2));\r\n ++i;\r\n } else {\r\n charactersArray.push(text.charAt(i));\r\n }\r\n } else {\r\n charactersArray.push(text.charAt(i));\r\n }\r\n }\r\n i += 1;\r\n }\r\n return charactersArray;\r\n}\r\n\r\nTextProperty.prototype.completeTextData = function(documentData) {\r\n documentData.__complete = true;\r\n var fontManager = this.elem.globalData.fontManager;\r\n var data = this.data;\r\n var letters = [];\r\n var i, len;\r\n var newLineFlag, index = 0, val;\r\n var anchorGrouping = data.m.g;\r\n var currentSize = 0, currentPos = 0, currentLine = 0, lineWidths = [];\r\n var lineWidth = 0;\r\n var maxLineWidth = 0;\r\n var j, jLen;\r\n var fontData = fontManager.getFontByName(documentData.f);\r\n var charData, cLength = 0;\r\n var styles = fontData.fStyle ? fontData.fStyle.split(' ') : [];\r\n\r\n var fWeight = 'normal', fStyle = 'normal';\r\n len = styles.length;\r\n var styleName;\r\n for(i=0;i<len;i+=1){\r\n styleName = styles[i].toLowerCase();\r\n switch(styleName) {\r\n case 'italic':\r\n fStyle = 'italic';\r\n break;\r\n case 'bold':\r\n fWeight = '700';\r\n break;\r\n case 'black':\r\n fWeight = '900';\r\n break;\r\n case 'medium':\r\n fWeight = '500';\r\n break;\r\n case 'regular':\r\n case 'normal':\r\n fWeight = '400';\r\n break;\r\n case 'light':\r\n case 'thin':\r\n fWeight = '200';\r\n break;\r\n }\r\n }\r\n documentData.fWeight = fontData.fWeight || fWeight;\r\n documentData.fStyle = fStyle;\r\n documentData.finalSize = documentData.s;\r\n documentData.finalText = this.buildFinalText(documentData.t);\r\n len = documentData.finalText.length;\r\n documentData.finalLineHeight = documentData.lh;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var charCode;\r\n if(documentData.sz){\r\n var flag = true;\r\n var boxWidth = documentData.sz[0];\r\n var boxHeight = documentData.sz[1];\r\n var currentHeight, finalText;\r\n while(flag) {\r\n finalText = this.buildFinalText(documentData.t);\r\n currentHeight = 0;\r\n lineWidth = 0;\r\n len = finalText.length;\r\n trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var lastSpaceIndex = -1;\r\n for(i=0;i<len;i+=1){\r\n charCode = finalText[i].charCodeAt(0);\r\n newLineFlag = false;\r\n if(finalText[i] === ' '){\r\n lastSpaceIndex = i;\r\n }else if(charCode === 13 || charCode === 3){\r\n lineWidth = 0;\r\n newLineFlag = true;\r\n currentHeight += documentData.finalLineHeight || documentData.finalSize*1.2;\r\n }\r\n if(fontManager.chars){\r\n charData = fontManager.getCharData(finalText[i], fontData.fStyle, fontData.fFamily);\r\n cLength = newLineFlag ? 0 : charData.w*documentData.finalSize/100;\r\n }else{\r\n //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;\r\n cLength = fontManager.measureText(finalText[i], documentData.f, documentData.finalSize);\r\n }\r\n if(lineWidth + cLength > boxWidth && finalText[i] !== ' '){\r\n if(lastSpaceIndex === -1){\r\n len += 1;\r\n } else {\r\n i = lastSpaceIndex;\r\n }\r\n currentHeight += documentData.finalLineHeight || documentData.finalSize*1.2;\r\n finalText.splice(i, lastSpaceIndex === i ? 1 : 0,\"\\r\");\r\n //finalText = finalText.substr(0,i) + \"\\r\" + finalText.substr(i === lastSpaceIndex ? i + 1 : i);\r\n lastSpaceIndex = -1;\r\n lineWidth = 0;\r\n }else {\r\n lineWidth += cLength;\r\n lineWidth += trackingOffset;\r\n }\r\n }\r\n currentHeight += fontData.ascent*documentData.finalSize/100;\r\n if(this.canResize && documentData.finalSize > this.minimumFontSize && boxHeight < currentHeight) {\r\n documentData.finalSize -= 1;\r\n documentData.finalLineHeight = documentData.finalSize * documentData.lh / documentData.s;\r\n } else {\r\n documentData.finalText = finalText;\r\n len = documentData.finalText.length;\r\n flag = false;\r\n }\r\n }\r\n\r\n }\r\n lineWidth = - trackingOffset;\r\n cLength = 0;\r\n var uncollapsedSpaces = 0;\r\n var currentChar;\r\n for (i = 0;i < len ;i += 1) {\r\n newLineFlag = false;\r\n currentChar = documentData.finalText[i];\r\n charCode = currentChar.charCodeAt(0);\r\n if (currentChar === ' '){\r\n val = '\\u00A0';\r\n } else if (charCode === 13 || charCode === 3) {\r\n uncollapsedSpaces = 0;\r\n lineWidths.push(lineWidth);\r\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\r\n lineWidth = - 2 * trackingOffset;\r\n val = '';\r\n newLineFlag = true;\r\n currentLine += 1;\r\n }else{\r\n val = documentData.finalText[i];\r\n }\r\n if(fontManager.chars){\r\n charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);\r\n cLength = newLineFlag ? 0 : charData.w*documentData.finalSize/100;\r\n }else{\r\n //var charWidth = fontManager.measureText(val, documentData.f, documentData.finalSize);\r\n //tCanvasHelper.font = documentData.finalSize + 'px '+ fontManager.getFontByName(documentData.f).fFamily;\r\n cLength = fontManager.measureText(val, documentData.f, documentData.finalSize);\r\n }\r\n\r\n //\r\n if(currentChar === ' '){\r\n uncollapsedSpaces += cLength + trackingOffset;\r\n } else {\r\n lineWidth += cLength + trackingOffset + uncollapsedSpaces;\r\n uncollapsedSpaces = 0;\r\n }\r\n letters.push({l:cLength,an:cLength,add:currentSize,n:newLineFlag, anIndexes:[], val: val, line: currentLine, animatorJustifyOffset: 0});\r\n if(anchorGrouping == 2){\r\n currentSize += cLength;\r\n if(val === '' || val === '\\u00A0' || i === len - 1){\r\n if(val === '' || val === '\\u00A0'){\r\n currentSize -= cLength;\r\n }\r\n while(currentPos<=i){\r\n letters[currentPos].an = currentSize;\r\n letters[currentPos].ind = index;\r\n letters[currentPos].extra = cLength;\r\n currentPos += 1;\r\n }\r\n index += 1;\r\n currentSize = 0;\r\n }\r\n }else if(anchorGrouping == 3){\r\n currentSize += cLength;\r\n if(val === '' || i === len - 1){\r\n if(val === ''){\r\n currentSize -= cLength;\r\n }\r\n while(currentPos<=i){\r\n letters[currentPos].an = currentSize;\r\n letters[currentPos].ind = index;\r\n letters[currentPos].extra = cLength;\r\n currentPos += 1;\r\n }\r\n currentSize = 0;\r\n index += 1;\r\n }\r\n }else{\r\n letters[index].ind = index;\r\n letters[index].extra = 0;\r\n index += 1;\r\n }\r\n }\r\n documentData.l = letters;\r\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\r\n lineWidths.push(lineWidth);\r\n if(documentData.sz){\r\n documentData.boxWidth = documentData.sz[0];\r\n documentData.justifyOffset = 0;\r\n }else{\r\n documentData.boxWidth = maxLineWidth;\r\n switch(documentData.j){\r\n case 1:\r\n documentData.justifyOffset = - documentData.boxWidth;\r\n break;\r\n case 2:\r\n documentData.justifyOffset = - documentData.boxWidth/2;\r\n break;\r\n default:\r\n documentData.justifyOffset = 0;\r\n }\r\n }\r\n documentData.lineWidths = lineWidths;\r\n\r\n var animators = data.a, animatorData, letterData;\r\n jLen = animators.length;\r\n var based, ind, indexes = [];\r\n for(j=0;j<jLen;j+=1){\r\n animatorData = animators[j];\r\n if(animatorData.a.sc){\r\n documentData.strokeColorAnim = true;\r\n }\r\n if(animatorData.a.sw){\r\n documentData.strokeWidthAnim = true;\r\n }\r\n if(animatorData.a.fc || animatorData.a.fh || animatorData.a.fs || animatorData.a.fb){\r\n documentData.fillColorAnim = true;\r\n }\r\n ind = 0;\r\n based = animatorData.s.b;\r\n for(i=0;i<len;i+=1){\r\n letterData = letters[i];\r\n letterData.anIndexes[j] = ind;\r\n if((based == 1 && letterData.val !== '') || (based == 2 && letterData.val !== '' && letterData.val !== '\\u00A0') || (based == 3 && (letterData.n || letterData.val == '\\u00A0' || i == len - 1)) || (based == 4 && (letterData.n || i == len - 1))){\r\n if(animatorData.s.rn === 1){\r\n indexes.push(ind);\r\n }\r\n ind += 1;\r\n }\r\n }\r\n data.a[j].s.totalChars = ind;\r\n var currentInd = -1, newInd;\r\n if(animatorData.s.rn === 1){\r\n for(i = 0; i < len; i += 1){\r\n letterData = letters[i];\r\n if(currentInd != letterData.anIndexes[j]){\r\n currentInd = letterData.anIndexes[j];\r\n newInd = indexes.splice(Math.floor(Math.random()*indexes.length),1)[0];\r\n }\r\n letterData.anIndexes[j] = newInd;\r\n }\r\n }\r\n }\r\n documentData.yOffset = documentData.finalLineHeight || documentData.finalSize*1.2;\r\n documentData.ls = documentData.ls || 0;\r\n documentData.ascent = fontData.ascent*documentData.finalSize/100;\r\n};\r\n\r\nTextProperty.prototype.updateDocumentData = function(newData, index) {\r\n\tindex = index === undefined ? this.keysIndex : index;\r\n var dData = this.copyData({}, this.data.d.k[index].s);\r\n dData = this.copyData(dData, newData);\r\n this.data.d.k[index].s = dData;\r\n this.recalculate(index);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.recalculate = function(index) {\r\n var dData = this.data.d.k[index].s;\r\n dData.__complete = false;\r\n this.keysIndex = 0;\r\n this._isFirstFrame = true;\r\n this.getValue(dData);\r\n}\r\n\r\nTextProperty.prototype.canResizeFont = function(_canResize) {\r\n this.canResize = _canResize;\r\n this.recalculate(this.keysIndex);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.setMinimumFontSize = function(_fontValue) {\r\n this.minimumFontSize = Math.floor(_fontValue) || 1;\r\n this.recalculate(this.keysIndex);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nvar TextSelectorProp = (function(){\r\n var max = Math.max;\r\n var min = Math.min;\r\n var floor = Math.floor;\r\n\r\n function TextSelectorProp(elem,data){\r\n this._currentTextLength = -1;\r\n this.k = false;\r\n this.data = data;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.finalS = 0;\r\n this.finalE = 0;\r\n this.initDynamicPropertyContainer(elem);\r\n this.s = PropertyFactory.getProp(elem,data.s || {k:0},0,0,this);\r\n if('e' in data){\r\n this.e = PropertyFactory.getProp(elem,data.e,0,0,this);\r\n }else{\r\n this.e = {v:100};\r\n }\r\n this.o = PropertyFactory.getProp(elem,data.o || {k:0},0,0,this);\r\n this.xe = PropertyFactory.getProp(elem,data.xe || {k:0},0,0,this);\r\n this.ne = PropertyFactory.getProp(elem,data.ne || {k:0},0,0,this);\r\n this.a = PropertyFactory.getProp(elem,data.a,0,0.01,this);\r\n if(!this.dynamicProperties.length){\r\n this.getValue();\r\n }\r\n }\r\n\r\n TextSelectorProp.prototype = {\r\n getMult: function(ind) {\r\n if(this._currentTextLength !== this.elem.textProperty.currentData.l.length) {\r\n this.getValue();\r\n }\r\n //var easer = bez.getEasingCurve(this.ne.v/100,0,1-this.xe.v/100,1);\r\n var easer = BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get;\r\n var mult = 0;\r\n var s = this.finalS;\r\n var e = this.finalE;\r\n var type = this.data.sh;\r\n if(type == 2){\r\n if(e === s){\r\n mult = ind >= e ? 1 : 0;\r\n }else{\r\n mult = max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n }\r\n mult = easer(mult);\r\n }else if(type == 3){\r\n if(e === s){\r\n mult = ind >= e ? 0 : 1;\r\n }else{\r\n mult = 1 - max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n }\r\n\r\n mult = easer(mult);\r\n }else if(type == 4){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n mult = max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n if(mult<0.5){\r\n mult *= 2;\r\n }else{\r\n mult = 1 - 2*(mult-0.5);\r\n }\r\n }\r\n mult = easer(mult);\r\n }else if(type == 5){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n var tot = e - s;\r\n /*ind += 0.5;\r\n mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind;*/\r\n ind = min(max(0,ind+0.5-s),e-s);\r\n var x = -tot/2+ind;\r\n var a = tot/2;\r\n mult = Math.sqrt(1 - (x*x)/(a*a));\r\n }\r\n mult = easer(mult);\r\n }else if(type == 6){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n ind = min(max(0,ind+0.5-s),e-s);\r\n mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind)/(e-s)))))/2;\r\n /*\r\n ind = Math.min(Math.max(s,ind),e-1);\r\n mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind-s)/(e-1-s)))))/2;\r\n mult = Math.max(mult,(1/(e-1-s))/(e-1-s));*/\r\n }\r\n mult = easer(mult);\r\n }else {\r\n if(ind >= floor(s)){\r\n if(ind-s < 0){\r\n mult = 1 - (s - ind);\r\n }else{\r\n mult = max(0,min(e-ind,1));\r\n }\r\n }\r\n mult = easer(mult);\r\n }\r\n return mult*this.a.v;\r\n },\r\n getValue: function(newCharsFlag) {\r\n this.iterateDynamicProperties();\r\n this._mdf = newCharsFlag || this._mdf;\r\n this._currentTextLength = this.elem.textProperty.currentData.l.length || 0;\r\n if(newCharsFlag && this.data.r === 2) {\r\n this.e.v = this._currentTextLength;\r\n }\r\n var divisor = this.data.r === 2 ? 1 : 100 / this.data.totalChars;\r\n var o = this.o.v/divisor;\r\n var s = this.s.v/divisor + o;\r\n var e = (this.e.v/divisor) + o;\r\n if(s>e){\r\n var _s = s;\r\n s = e;\r\n e = _s;\r\n }\r\n this.finalS = s;\r\n this.finalE = e;\r\n }\r\n }\r\n extendPrototype([DynamicPropertyContainer], TextSelectorProp);\r\n\r\n function getTextSelectorProp(elem, data,arr) {\r\n return new TextSelectorProp(elem, data, arr);\r\n }\r\n\r\n return {\r\n getTextSelectorProp: getTextSelectorProp\r\n };\r\n}());\r\n\r\n \r\nvar pool_factory = (function() {\r\n\treturn function(initialLength, _create, _release, _clone) {\r\n\r\n\t\tvar _length = 0;\r\n\t\tvar _maxLength = initialLength;\r\n\t\tvar pool = createSizedArray(_maxLength);\r\n\r\n\t\tvar ob = {\r\n\t\t\tnewElement: newElement,\r\n\t\t\trelease: release\r\n\t\t};\r\n\r\n\t\tfunction newElement(){\r\n\t\t\tvar element;\r\n\t\t\tif(_length){\r\n\t\t\t\t_length -= 1;\r\n\t\t\t\telement = pool[_length];\r\n\t\t\t} else {\r\n\t\t\t\telement = _create();\r\n\t\t\t}\r\n\t\t\treturn element;\r\n\t\t}\r\n\r\n\t\tfunction release(element) {\r\n\t\t\tif(_length === _maxLength) {\r\n\t\t\t\tpool = pooling.double(pool);\r\n\t\t\t\t_maxLength = _maxLength*2;\r\n\t\t\t}\r\n\t\t\tif (_release) {\r\n\t\t\t\t_release(element);\r\n\t\t\t}\r\n\t\t\tpool[_length] = element;\r\n\t\t\t_length += 1;\r\n\t\t}\r\n\r\n\t\tfunction clone() {\r\n\t\t\tvar clonedElement = newElement();\r\n\t\t\treturn _clone(clonedElement);\r\n\t\t}\r\n\r\n\t\treturn ob;\r\n\t};\r\n}());\r\n\r\nvar pooling = (function(){\r\n\r\n\tfunction double(arr){\r\n\t\treturn arr.concat(createSizedArray(arr.length));\r\n\t}\r\n\r\n\treturn {\r\n\t\tdouble: double\r\n\t};\r\n}());\r\nvar point_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn createTypedArray('float32', 2);\r\n\t}\r\n\treturn pool_factory(8, create);\r\n}());\r\nvar shape_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn new ShapePath();\r\n\t}\r\n\r\n\tfunction release(shapePath) {\r\n\t\tvar len = shapePath._length, i;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tpoint_pool.release(shapePath.v[i]);\r\n\t\t\tpoint_pool.release(shapePath.i[i]);\r\n\t\t\tpoint_pool.release(shapePath.o[i]);\r\n\t\t\tshapePath.v[i] = null;\r\n\t\t\tshapePath.i[i] = null;\r\n\t\t\tshapePath.o[i] = null;\r\n\t\t}\r\n\t\tshapePath._length = 0;\r\n\t\tshapePath.c = false;\r\n\t}\r\n\r\n\tfunction clone(shape) {\r\n\t\tvar cloned = factory.newElement();\r\n\t\tvar i, len = shape._length === undefined ? shape.v.length : shape._length;\r\n\t\tcloned.setLength(len);\r\n\t\tcloned.c = shape.c;\r\n\t\tvar pt;\r\n\t\t\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tcloned.setTripleAt(shape.v[i][0],shape.v[i][1],shape.o[i][0],shape.o[i][1],shape.i[i][0],shape.i[i][1], i);\r\n\t\t}\r\n\t\treturn cloned;\r\n\t}\r\n\r\n\tvar factory = pool_factory(4, create, release);\r\n\tfactory.clone = clone;\r\n\r\n\treturn factory;\r\n}());\r\nvar shapeCollection_pool = (function(){\r\n\tvar ob = {\r\n\t\tnewShapeCollection: newShapeCollection,\r\n\t\trelease: release\r\n\t};\r\n\r\n\tvar _length = 0;\r\n\tvar _maxLength = 4;\r\n\tvar pool = createSizedArray(_maxLength);\r\n\r\n\tfunction newShapeCollection(){\r\n\t\tvar shapeCollection;\r\n\t\tif(_length){\r\n\t\t\t_length -= 1;\r\n\t\t\tshapeCollection = pool[_length];\r\n\t\t} else {\r\n\t\t\tshapeCollection = new ShapeCollection();\r\n\t\t}\r\n\t\treturn shapeCollection;\r\n\t}\r\n\r\n\tfunction release(shapeCollection) {\r\n\t\tvar i, len = shapeCollection._length;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tshape_pool.release(shapeCollection.shapes[i]);\r\n\t\t}\r\n\t\tshapeCollection._length = 0;\r\n\r\n\t\tif(_length === _maxLength) {\r\n\t\t\tpool = pooling.double(pool);\r\n\t\t\t_maxLength = _maxLength*2;\r\n\t\t}\r\n\t\tpool[_length] = shapeCollection;\r\n\t\t_length += 1;\r\n\t}\r\n\r\n\treturn ob;\r\n}());\r\nvar segments_length_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn {\r\n\t\t\tlengths: [],\r\n\t\t\ttotalLength: 0\r\n\t\t};\r\n\t}\r\n\r\n\tfunction release(element) {\r\n\t\tvar i, len = element.lengths.length;\r\n\t\tfor(i=0;i<len;i+=1) {\r\n\t\t\tbezier_length_pool.release(element.lengths[i]);\r\n\t\t}\r\n\t\telement.lengths.length = 0;\r\n\t}\r\n\r\n\treturn pool_factory(8, create, release);\r\n}());\r\nvar bezier_length_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn {\r\n addedLength: 0,\r\n percents: createTypedArray('float32', defaultCurveSegments),\r\n lengths: createTypedArray('float32', defaultCurveSegments),\r\n };\r\n\t}\r\n\treturn pool_factory(8, create);\r\n}());\r\nfunction BaseRenderer(){}\r\nBaseRenderer.prototype.checkLayers = function(num){\r\n var i, len = this.layers.length, data;\r\n this.completeLayers = true;\r\n for (i = len - 1; i >= 0; i--) {\r\n if (!this.elements[i]) {\r\n data = this.layers[i];\r\n if(data.ip - data.st <= (num - this.layers[i].st) && data.op - data.st > (num - this.layers[i].st))\r\n {\r\n this.buildItem(i);\r\n }\r\n }\r\n this.completeLayers = this.elements[i] ? this.completeLayers:false;\r\n }\r\n this.checkPendingElements();\r\n};\r\n\r\nBaseRenderer.prototype.createItem = function(layer){\r\n switch(layer.ty){\r\n case 2:\r\n return this.createImage(layer);\r\n case 0:\r\n return this.createComp(layer);\r\n case 1:\r\n return this.createSolid(layer);\r\n case 3:\r\n return this.createNull(layer);\r\n case 4:\r\n return this.createShape(layer);\r\n case 5:\r\n return this.createText(layer);\r\n case 13:\r\n return this.createCamera(layer);\r\n }\r\n return this.createNull(layer);\r\n};\r\n\r\nBaseRenderer.prototype.createCamera = function(){\r\n throw new Error('You\\'re using a 3d camera. Try the html renderer.');\r\n};\r\n\r\nBaseRenderer.prototype.buildAllItems = function(){\r\n var i, len = this.layers.length;\r\n for(i=0;i<len;i+=1){\r\n this.buildItem(i);\r\n }\r\n this.checkPendingElements();\r\n};\r\n\r\nBaseRenderer.prototype.includeLayers = function(newLayers){\r\n this.completeLayers = false;\r\n var i, len = newLayers.length;\r\n var j, jLen = this.layers.length;\r\n for(i=0;i<len;i+=1){\r\n j = 0;\r\n while(j<jLen){\r\n if(this.layers[j].id == newLayers[i].id){\r\n this.layers[j] = newLayers[i];\r\n break;\r\n }\r\n j += 1;\r\n }\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.setProjectInterface = function(pInterface){\r\n this.globalData.projectInterface = pInterface;\r\n};\r\n\r\nBaseRenderer.prototype.initItems = function(){\r\n if(!this.globalData.progressiveLoad){\r\n this.buildAllItems();\r\n }\r\n};\r\nBaseRenderer.prototype.buildElementParenting = function(element, parentName, hierarchy) {\r\n var elements = this.elements;\r\n var layers = this.layers;\r\n var i=0, len = layers.length;\r\n while (i < len) {\r\n if (layers[i].ind == parentName) {\r\n if (!elements[i] || elements[i] === true) {\r\n this.buildItem(i);\r\n this.addPendingElement(element);\r\n } else {\r\n hierarchy.push(elements[i]);\r\n elements[i].setAsParent();\r\n if(layers[i].parent !== undefined) {\r\n this.buildElementParenting(element, layers[i].parent, hierarchy);\r\n } else {\r\n element.setHierarchy(hierarchy);\r\n }\r\n }\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.addPendingElement = function(element){\r\n this.pendingElements.push(element);\r\n};\r\n\r\nBaseRenderer.prototype.searchExtraCompositions = function(assets){\r\n var i, len = assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(assets[i].xt){\r\n var comp = this.createComp(assets[i]);\r\n comp.initExpressions();\r\n this.globalData.projectInterface.registerComposition(comp);\r\n }\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.setupGlobalData = function(animData, fontsContainer) {\r\n this.globalData.fontManager = new FontManager();\r\n this.globalData.fontManager.addChars(animData.chars);\r\n this.globalData.fontManager.addFonts(animData.fonts, fontsContainer);\r\n this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);\r\n this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);\r\n this.globalData.imageLoader = this.animationItem.imagePreloader;\r\n this.globalData.frameId = 0;\r\n this.globalData.frameRate = animData.fr;\r\n this.globalData.nm = animData.nm;\r\n this.globalData.compSize = {\r\n w: animData.w,\r\n h: animData.h\r\n }\r\n}\r\nfunction SVGRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.layers = null;\r\n this.renderedFrame = -1;\r\n this.svgElement = createNS('svg');\r\n var ariaLabel = '';\r\n if (config && config.title) {\r\n var titleElement = createNS('title');\r\n var titleId = createElementID();\r\n titleElement.setAttribute('id', titleId);\r\n titleElement.textContent = config.title;\r\n this.svgElement.appendChild(titleElement);\r\n ariaLabel += titleId;\r\n }\r\n if (config && config.description) {\r\n var descElement = createNS('desc');\r\n var descId = createElementID();\r\n descElement.setAttribute('id', descId);\r\n descElement.textContent = config.description;\r\n this.svgElement.appendChild(descElement);\r\n ariaLabel += ' ' + descId;\r\n }\r\n if (ariaLabel) {\r\n this.svgElement.setAttribute('aria-labelledby', ariaLabel)\r\n }\r\n var defs = createNS( 'defs');\r\n this.svgElement.appendChild(defs);\r\n var maskElement = createNS('g');\r\n this.svgElement.appendChild(maskElement);\r\n this.layerElement = maskElement;\r\n this.renderConfig = {\r\n preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n progressiveLoad: (config && config.progressiveLoad) || false,\r\n hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true,\r\n viewBoxOnly: (config && config.viewBoxOnly) || false,\r\n viewBoxSize: (config && config.viewBoxSize) || false,\r\n className: (config && config.className) || '',\r\n focusable: config && config.focusable\r\n };\r\n\r\n this.globalData = {\r\n _mdf: false,\r\n frameNum: -1,\r\n defs: defs,\r\n renderConfig: this.renderConfig\r\n };\r\n this.elements = [];\r\n this.pendingElements = [];\r\n this.destroyed = false;\r\n this.rendererType = 'svg';\r\n\r\n}\r\n\r\nextendPrototype([BaseRenderer],SVGRenderer);\r\n\r\nSVGRenderer.prototype.createNull = function (data) {\r\n return new NullElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createShape = function (data) {\r\n return new SVGShapeElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createText = function (data) {\r\n return new SVGTextElement(data,this.globalData,this);\r\n\r\n};\r\n\r\nSVGRenderer.prototype.createImage = function (data) {\r\n return new IImageElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createComp = function (data) {\r\n return new SVGCompElement(data,this.globalData,this);\r\n\r\n};\r\n\r\nSVGRenderer.prototype.createSolid = function (data) {\r\n return new ISolidElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.configAnimation = function(animData){\r\n this.svgElement.setAttribute('xmlns','http://www.w3.org/2000/svg');\r\n if(this.renderConfig.viewBoxSize) {\r\n this.svgElement.setAttribute('viewBox',this.renderConfig.viewBoxSize);\r\n } else {\r\n this.svgElement.setAttribute('viewBox','0 0 '+animData.w+' '+animData.h);\r\n }\r\n\r\n if(!this.renderConfig.viewBoxOnly) {\r\n this.svgElement.setAttribute('width',animData.w);\r\n this.svgElement.setAttribute('height',animData.h);\r\n this.svgElement.style.width = '100%';\r\n this.svgElement.style.height = '100%';\r\n this.svgElement.style.transform = 'translate3d(0,0,0)';\r\n }\r\n if(this.renderConfig.className) {\r\n this.svgElement.setAttribute('class', this.renderConfig.className);\r\n }\r\n if(this.renderConfig.focusable !== undefined) {\r\n this.svgElement.setAttribute('focusable', this.renderConfig.focusable);\r\n }\r\n this.svgElement.setAttribute('preserveAspectRatio',this.renderConfig.preserveAspectRatio);\r\n //this.layerElement.style.transform = 'translate3d(0,0,0)';\r\n //this.layerElement.style.transformOrigin = this.layerElement.style.mozTransformOrigin = this.layerElement.style.webkitTransformOrigin = this.layerElement.style['-webkit-transform'] = \"0px 0px 0px\";\r\n this.animationItem.wrapper.appendChild(this.svgElement);\r\n //Mask animation\r\n var defs = this.globalData.defs;\r\n\r\n this.setupGlobalData(animData, defs);\r\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\r\n this.data = animData;\r\n\r\n var maskElement = createNS( 'clipPath');\r\n var rect = createNS('rect');\r\n rect.setAttribute('width',animData.w);\r\n rect.setAttribute('height',animData.h);\r\n rect.setAttribute('x',0);\r\n rect.setAttribute('y',0);\r\n var maskId = createElementID();\r\n maskElement.setAttribute('id', maskId);\r\n maskElement.appendChild(rect);\r\n this.layerElement.setAttribute(\"clip-path\", \"url(\" + locationHref + \"#\"+maskId+\")\");\r\n\r\n defs.appendChild(maskElement);\r\n this.layers = animData.layers;\r\n this.elements = createSizedArray(animData.layers.length);\r\n};\r\n\r\n\r\nSVGRenderer.prototype.destroy = function () {\r\n this.animationItem.wrapper.innerHTML = '';\r\n this.layerElement = null;\r\n this.globalData.defs = null;\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = 0; i < len; i++) {\r\n if(this.elements[i]){\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.elements.length = 0;\r\n this.destroyed = true;\r\n this.animationItem = null;\r\n};\r\n\r\nSVGRenderer.prototype.updateContainerSize = function () {\r\n};\r\n\r\nSVGRenderer.prototype.buildItem = function(pos){\r\n var elements = this.elements;\r\n if(elements[pos] || this.layers[pos].ty == 99){\r\n return;\r\n }\r\n elements[pos] = true;\r\n var element = this.createItem(this.layers[pos]);\r\n\r\n elements[pos] = element;\r\n if(expressionsPlugin){\r\n if(this.layers[pos].ty === 0){\r\n this.globalData.projectInterface.registerComposition(element);\r\n }\r\n element.initExpressions();\r\n }\r\n this.appendElementInPos(element,pos);\r\n if(this.layers[pos].tt){\r\n if(!this.elements[pos - 1] || this.elements[pos - 1] === true){\r\n this.buildItem(pos - 1);\r\n this.addPendingElement(element);\r\n } else {\r\n element.setMatte(elements[pos - 1].layerId);\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n if(element.data.tt){\r\n var i = 0, len = this.elements.length;\r\n while(i<len){\r\n if(this.elements[i] === element){\r\n element.setMatte(this.elements[i - 1].layerId);\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.renderFrame = function(num){\r\n if(this.renderedFrame === num || this.destroyed){\r\n return;\r\n }\r\n if(num === null){\r\n num = this.renderedFrame;\r\n }else{\r\n this.renderedFrame = num;\r\n }\r\n // console.log('-------');\r\n // console.log('FRAME ',num);\r\n this.globalData.frameNum = num;\r\n this.globalData.frameId += 1;\r\n this.globalData.projectInterface.currentFrame = num;\r\n this.globalData._mdf = false;\r\n var i, len = this.layers.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(num);\r\n }\r\n for (i = len - 1; i >= 0; i--) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(num - this.layers[i].st);\r\n }\r\n }\r\n if(this.globalData._mdf) {\r\n for (i = 0; i < len; i += 1) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.appendElementInPos = function(element, pos){\r\n var newElement = element.getBaseElement();\r\n if(!newElement){\r\n return;\r\n }\r\n var i = 0;\r\n var nextElement;\r\n while(i<pos){\r\n if(this.elements[i] && this.elements[i]!== true && this.elements[i].getBaseElement()){\r\n nextElement = this.elements[i].getBaseElement();\r\n }\r\n i += 1;\r\n }\r\n if(nextElement){\r\n this.layerElement.insertBefore(newElement, nextElement);\r\n } else {\r\n this.layerElement.appendChild(newElement);\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.hide = function(){\r\n this.layerElement.style.display = 'none';\r\n};\r\n\r\nSVGRenderer.prototype.show = function(){\r\n this.layerElement.style.display = 'block';\r\n};\r\n\r\nfunction CanvasRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.renderConfig = {\r\n clearCanvas: (config && config.clearCanvas !== undefined) ? config.clearCanvas : true,\r\n context: (config && config.context) || null,\r\n progressiveLoad: (config && config.progressiveLoad) || false,\r\n preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n className: (config && config.className) || ''\r\n };\r\n this.renderConfig.dpr = (config && config.dpr) || 1;\r\n if (this.animationItem.wrapper) {\r\n this.renderConfig.dpr = (config && config.dpr) || window.devicePixelRatio || 1;\r\n }\r\n this.renderedFrame = -1;\r\n this.globalData = {\r\n frameNum: -1,\r\n _mdf: false,\r\n renderConfig: this.renderConfig,\r\n currentGlobalAlpha: -1\r\n };\r\n this.contextData = new CVContextData();\r\n this.elements = [];\r\n this.pendingElements = [];\r\n this.transformMat = new Matrix();\r\n this.completeLayers = false;\r\n this.rendererType = 'canvas';\r\n}\r\nextendPrototype([BaseRenderer],CanvasRenderer);\r\n\r\nCanvasRenderer.prototype.createShape = function (data) {\r\n return new CVShapeElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createText = function (data) {\r\n return new CVTextElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createImage = function (data) {\r\n return new CVImageElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createComp = function (data) {\r\n return new CVCompElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createSolid = function (data) {\r\n return new CVSolidElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createNull = SVGRenderer.prototype.createNull;\r\n\r\nCanvasRenderer.prototype.ctxTransform = function(props){\r\n if(props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0){\r\n return;\r\n }\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.transform(props[0],props[1],props[4],props[5],props[12],props[13]);\r\n return;\r\n }\r\n this.transformMat.cloneFromProps(props);\r\n var cProps = this.contextData.cTr.props;\r\n this.transformMat.transform(cProps[0],cProps[1],cProps[2],cProps[3],cProps[4],cProps[5],cProps[6],cProps[7],cProps[8],cProps[9],cProps[10],cProps[11],cProps[12],cProps[13],cProps[14],cProps[15]);\r\n //this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n this.contextData.cTr.cloneFromProps(this.transformMat.props);\r\n var trProps = this.contextData.cTr.props;\r\n this.canvasContext.setTransform(trProps[0],trProps[1],trProps[4],trProps[5],trProps[12],trProps[13]);\r\n};\r\n\r\nCanvasRenderer.prototype.ctxOpacity = function(op){\r\n /*if(op === 1){\r\n return;\r\n }*/\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.globalAlpha *= op < 0 ? 0 : op;\r\n this.globalData.currentGlobalAlpha = this.contextData.cO;\r\n return;\r\n }\r\n this.contextData.cO *= op < 0 ? 0 : op;\r\n if(this.globalData.currentGlobalAlpha !== this.contextData.cO) {\r\n this.canvasContext.globalAlpha = this.contextData.cO;\r\n this.globalData.currentGlobalAlpha = this.contextData.cO;\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.reset = function(){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.restore();\r\n return;\r\n }\r\n this.contextData.reset();\r\n};\r\n\r\nCanvasRenderer.prototype.save = function(actionFlag){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.save();\r\n return;\r\n }\r\n if(actionFlag){\r\n this.canvasContext.save();\r\n }\r\n var props = this.contextData.cTr.props;\r\n if(this.contextData._length <= this.contextData.cArrPos) {\r\n this.contextData.duplicate();\r\n }\r\n var i, arr = this.contextData.saved[this.contextData.cArrPos];\r\n for (i = 0; i < 16; i += 1) {\r\n arr[i] = props[i];\r\n }\r\n this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO;\r\n this.contextData.cArrPos += 1;\r\n};\r\n\r\nCanvasRenderer.prototype.restore = function(actionFlag){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.restore();\r\n return;\r\n }\r\n if(actionFlag){\r\n this.canvasContext.restore();\r\n this.globalData.blendMode = 'source-over';\r\n }\r\n this.contextData.cArrPos -= 1;\r\n var popped = this.contextData.saved[this.contextData.cArrPos];\r\n var i,arr = this.contextData.cTr.props;\r\n for(i=0;i<16;i+=1){\r\n arr[i] = popped[i];\r\n }\r\n this.canvasContext.setTransform(popped[0],popped[1],popped[4],popped[5],popped[12],popped[13]);\r\n popped = this.contextData.savedOp[this.contextData.cArrPos];\r\n this.contextData.cO = popped;\r\n if(this.globalData.currentGlobalAlpha !== popped) {\r\n this.canvasContext.globalAlpha = popped;\r\n this.globalData.currentGlobalAlpha = popped;\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.configAnimation = function(animData){\r\n if(this.animationItem.wrapper){\r\n this.animationItem.container = createTag('canvas');\r\n this.animationItem.container.style.width = '100%';\r\n this.animationItem.container.style.height = '100%';\r\n //this.animationItem.container.style.transform = 'translate3d(0,0,0)';\r\n //this.animationItem.container.style.webkitTransform = 'translate3d(0,0,0)';\r\n this.animationItem.container.style.transformOrigin = this.animationItem.container.style.mozTransformOrigin = this.animationItem.container.style.webkitTransformOrigin = this.animationItem.container.style['-webkit-transform'] = \"0px 0px 0px\";\r\n this.animationItem.wrapper.appendChild(this.animationItem.container);\r\n this.canvasContext = this.animationItem.container.getContext('2d');\r\n if(this.renderConfig.className) {\r\n this.animationItem.container.setAttribute('class', this.renderConfig.className);\r\n }\r\n }else{\r\n this.canvasContext = this.renderConfig.context;\r\n }\r\n this.data = animData;\r\n this.layers = animData.layers;\r\n this.transformCanvas = {\r\n w: animData.w,\r\n h:animData.h,\r\n sx:0,\r\n sy:0,\r\n tx:0,\r\n ty:0\r\n };\r\n this.setupGlobalData(animData, document.body);\r\n this.globalData.canvasContext = this.canvasContext;\r\n this.globalData.renderer = this;\r\n this.globalData.isDashed = false;\r\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\r\n this.globalData.transformCanvas = this.transformCanvas;\r\n this.elements = createSizedArray(animData.layers.length);\r\n\r\n this.updateContainerSize();\r\n};\r\n\r\nCanvasRenderer.prototype.updateContainerSize = function () {\r\n this.reset();\r\n var elementWidth,elementHeight;\r\n if(this.animationItem.wrapper && this.animationItem.container){\r\n elementWidth = this.animationItem.wrapper.offsetWidth;\r\n elementHeight = this.animationItem.wrapper.offsetHeight;\r\n this.animationItem.container.setAttribute('width',elementWidth * this.renderConfig.dpr );\r\n this.animationItem.container.setAttribute('height',elementHeight * this.renderConfig.dpr);\r\n }else{\r\n elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr;\r\n elementHeight = this.canvasContext.canvas.height * this.renderConfig.dpr;\r\n }\r\n var elementRel,animationRel;\r\n if(this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1){\r\n var par = this.renderConfig.preserveAspectRatio.split(' ');\r\n var fillType = par[1] || 'meet';\r\n var pos = par[0] || 'xMidYMid';\r\n var xPos = pos.substr(0,4);\r\n var yPos = pos.substr(4);\r\n elementRel = elementWidth/elementHeight;\r\n animationRel = this.transformCanvas.w/this.transformCanvas.h;\r\n if(animationRel>elementRel && fillType === 'meet' || animationRel<elementRel && fillType === 'slice'){\r\n this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n }else{\r\n this.transformCanvas.sx = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);\r\n }\r\n\r\n if(xPos === 'xMid' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){\r\n this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))/2*this.renderConfig.dpr;\r\n } else if(xPos === 'xMax' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){\r\n this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))*this.renderConfig.dpr;\r\n } else {\r\n this.transformCanvas.tx = 0;\r\n }\r\n if(yPos === 'YMid' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){\r\n this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w))/2)*this.renderConfig.dpr;\r\n } else if(yPos === 'YMax' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){\r\n this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w)))*this.renderConfig.dpr;\r\n } else {\r\n this.transformCanvas.ty = 0;\r\n }\r\n\r\n }else if(this.renderConfig.preserveAspectRatio == 'none'){\r\n this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementHeight/(this.transformCanvas.h/this.renderConfig.dpr);\r\n this.transformCanvas.tx = 0;\r\n this.transformCanvas.ty = 0;\r\n }else{\r\n this.transformCanvas.sx = this.renderConfig.dpr;\r\n this.transformCanvas.sy = this.renderConfig.dpr;\r\n this.transformCanvas.tx = 0;\r\n this.transformCanvas.ty = 0;\r\n }\r\n this.transformCanvas.props = [this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1];\r\n /*var i, len = this.elements.length;\r\n for(i=0;i<len;i+=1){\r\n if(this.elements[i] && this.elements[i].data.ty === 0){\r\n this.elements[i].resize(this.globalData.transformCanvas);\r\n }\r\n }*/\r\n this.ctxTransform(this.transformCanvas.props);\r\n this.canvasContext.beginPath();\r\n this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h);\r\n this.canvasContext.closePath();\r\n this.canvasContext.clip();\r\n\r\n this.renderFrame(this.renderedFrame, true);\r\n};\r\n\r\nCanvasRenderer.prototype.destroy = function () {\r\n if(this.renderConfig.clearCanvas) {\r\n this.animationItem.wrapper.innerHTML = '';\r\n }\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = len - 1; i >= 0; i-=1) {\r\n if(this.elements[i]) {\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.elements.length = 0;\r\n this.globalData.canvasContext = null;\r\n this.animationItem.container = null;\r\n this.destroyed = true;\r\n};\r\n\r\nCanvasRenderer.prototype.renderFrame = function(num, forceRender){\r\n if((this.renderedFrame === num && this.renderConfig.clearCanvas === true && !forceRender) || this.destroyed || num === -1){\r\n return;\r\n }\r\n this.renderedFrame = num;\r\n this.globalData.frameNum = num - this.animationItem._isFirstFrame;\r\n this.globalData.frameId += 1;\r\n this.globalData._mdf = !this.renderConfig.clearCanvas || forceRender;\r\n this.globalData.projectInterface.currentFrame = num;\r\n\r\n // console.log('--------');\r\n // console.log('NEW: ',num);\r\n var i, len = this.layers.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(num);\r\n }\r\n\r\n for (i = 0; i < len; i++) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(num - this.layers[i].st);\r\n }\r\n }\r\n if(this.globalData._mdf) {\r\n if(this.renderConfig.clearCanvas === true){\r\n this.canvasContext.clearRect(0, 0, this.transformCanvas.w, this.transformCanvas.h);\r\n }else{\r\n this.save();\r\n }\r\n for (i = len - 1; i >= 0; i-=1) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n if(this.renderConfig.clearCanvas !== true){\r\n this.restore();\r\n }\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.buildItem = function(pos){\r\n var elements = this.elements;\r\n if(elements[pos] || this.layers[pos].ty == 99){\r\n return;\r\n }\r\n var element = this.createItem(this.layers[pos], this,this.globalData);\r\n elements[pos] = element;\r\n element.initExpressions();\r\n /*if(this.layers[pos].ty === 0){\r\n element.resize(this.globalData.transformCanvas);\r\n }*/\r\n};\r\n\r\nCanvasRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.hide = function(){\r\n this.animationItem.container.style.display = 'none';\r\n};\r\n\r\nCanvasRenderer.prototype.show = function(){\r\n this.animationItem.container.style.display = 'block';\r\n};\r\n\r\nfunction HybridRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.layers = null;\r\n this.renderedFrame = -1;\r\n this.renderConfig = {\r\n className: (config && config.className) || '',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true\r\n };\r\n this.globalData = {\r\n _mdf: false,\r\n frameNum: -1,\r\n renderConfig: this.renderConfig\r\n };\r\n this.pendingElements = [];\r\n this.elements = [];\r\n this.threeDElements = [];\r\n this.destroyed = false;\r\n this.camera = null;\r\n this.supports3d = true;\r\n this.rendererType = 'html';\r\n\r\n}\r\n\r\nextendPrototype([BaseRenderer],HybridRenderer);\r\n\r\nHybridRenderer.prototype.buildItem = SVGRenderer.prototype.buildItem;\r\n\r\nHybridRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.appendElementInPos = function(element, pos){\r\n var newDOMElement = element.getBaseElement();\r\n if(!newDOMElement){\r\n return;\r\n }\r\n var layer = this.layers[pos];\r\n if(!layer.ddd || !this.supports3d){\r\n if(this.threeDElements) {\r\n this.addTo3dContainer(newDOMElement,pos);\r\n } else {\r\n var i = 0;\r\n var nextDOMElement, nextLayer, tmpDOMElement;\r\n while(i<pos){\r\n if(this.elements[i] && this.elements[i]!== true && this.elements[i].getBaseElement){\r\n nextLayer = this.elements[i];\r\n tmpDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.getBaseElement();\r\n nextDOMElement = tmpDOMElement || nextDOMElement;\r\n }\r\n i += 1;\r\n }\r\n if(nextDOMElement){\r\n if(!layer.ddd || !this.supports3d){\r\n this.layerElement.insertBefore(newDOMElement, nextDOMElement);\r\n }\r\n } else {\r\n if(!layer.ddd || !this.supports3d){\r\n this.layerElement.appendChild(newDOMElement);\r\n }\r\n }\r\n }\r\n \r\n } else {\r\n this.addTo3dContainer(newDOMElement,pos);\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.createShape = function (data) {\r\n if(!this.supports3d){\r\n return new SVGShapeElement(data, this.globalData, this);\r\n }\r\n return new HShapeElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createText = function (data) {\r\n if(!this.supports3d){\r\n return new SVGTextElement(data, this.globalData, this);\r\n }\r\n return new HTextElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createCamera = function (data) {\r\n this.camera = new HCameraElement(data, this.globalData, this);\r\n return this.camera;\r\n};\r\n\r\nHybridRenderer.prototype.createImage = function (data) {\r\n if(!this.supports3d){\r\n return new IImageElement(data, this.globalData, this);\r\n }\r\n return new HImageElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createComp = function (data) {\r\n if(!this.supports3d){\r\n return new SVGCompElement(data, this.globalData, this);\r\n }\r\n return new HCompElement(data, this.globalData, this);\r\n\r\n};\r\n\r\nHybridRenderer.prototype.createSolid = function (data) {\r\n if(!this.supports3d){\r\n return new ISolidElement(data, this.globalData, this);\r\n }\r\n return new HSolidElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createNull = SVGRenderer.prototype.createNull;\r\n\r\nHybridRenderer.prototype.getThreeDContainerByPos = function(pos){\r\n var i = 0, len = this.threeDElements.length;\r\n while(i<len) {\r\n if(this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {\r\n return this.threeDElements[i].perspectiveElem;\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.createThreeDContainer = function(pos, type){\r\n var perspectiveElem = createTag('div');\r\n styleDiv(perspectiveElem);\r\n var container = createTag('div');\r\n styleDiv(container);\r\n if(type === '3d') {\r\n perspectiveElem.style.width = this.globalData.compSize.w+'px';\r\n perspectiveElem.style.height = this.globalData.compSize.h+'px';\r\n perspectiveElem.style.transformOrigin = perspectiveElem.style.mozTransformOrigin = perspectiveElem.style.webkitTransformOrigin = \"50% 50%\";\r\n container.style.transform = container.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\r\n }\r\n \r\n perspectiveElem.appendChild(container);\r\n //this.resizerElem.appendChild(perspectiveElem);\r\n var threeDContainerData = {\r\n container:container,\r\n perspectiveElem:perspectiveElem,\r\n startPos: pos,\r\n endPos: pos,\r\n type: type\r\n };\r\n this.threeDElements.push(threeDContainerData);\r\n return threeDContainerData;\r\n};\r\n\r\nHybridRenderer.prototype.build3dContainers = function(){\r\n var i, len = this.layers.length;\r\n var lastThreeDContainerData;\r\n var currentContainer = '';\r\n for(i=0;i<len;i+=1){\r\n if(this.layers[i].ddd && this.layers[i].ty !== 3){\r\n if(currentContainer !== '3d'){\r\n currentContainer = '3d';\r\n lastThreeDContainerData = this.createThreeDContainer(i,'3d');\r\n }\r\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);\r\n } else {\r\n if(currentContainer !== '2d'){\r\n currentContainer = '2d';\r\n lastThreeDContainerData = this.createThreeDContainer(i,'2d');\r\n }\r\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);\r\n }\r\n }\r\n len = this.threeDElements.length;\r\n for(i = len - 1; i >= 0; i --) {\r\n this.resizerElem.appendChild(this.threeDElements[i].perspectiveElem);\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.addTo3dContainer = function(elem,pos){\r\n var i = 0, len = this.threeDElements.length;\r\n while(i<len){\r\n if(pos <= this.threeDElements[i].endPos){\r\n var j = this.threeDElements[i].startPos;\r\n var nextElement;\r\n while(j<pos){\r\n if(this.elements[j] && this.elements[j].getBaseElement){\r\n nextElement = this.elements[j].getBaseElement();\r\n }\r\n j += 1;\r\n }\r\n if(nextElement){\r\n this.threeDElements[i].container.insertBefore(elem, nextElement);\r\n } else {\r\n this.threeDElements[i].container.appendChild(elem);\r\n }\r\n break;\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.configAnimation = function(animData){\r\n var resizerElem = createTag('div');\r\n var wrapper = this.animationItem.wrapper;\r\n resizerElem.style.width = animData.w+'px';\r\n resizerElem.style.height = animData.h+'px';\r\n this.resizerElem = resizerElem;\r\n styleDiv(resizerElem);\r\n resizerElem.style.transformStyle = resizerElem.style.webkitTransformStyle = resizerElem.style.mozTransformStyle = \"flat\";\r\n if(this.renderConfig.className) {\r\n resizerElem.setAttribute('class', this.renderConfig.className);\r\n }\r\n wrapper.appendChild(resizerElem);\r\n\r\n resizerElem.style.overflow = 'hidden';\r\n var svg = createNS('svg');\r\n svg.setAttribute('width','1');\r\n svg.setAttribute('height','1');\r\n styleDiv(svg);\r\n this.resizerElem.appendChild(svg);\r\n var defs = createNS('defs');\r\n svg.appendChild(defs);\r\n this.data = animData;\r\n //Mask animation\r\n this.setupGlobalData(animData, svg);\r\n this.globalData.defs = defs;\r\n this.layers = animData.layers;\r\n this.layerElement = this.resizerElem;\r\n this.build3dContainers();\r\n this.updateContainerSize();\r\n};\r\n\r\nHybridRenderer.prototype.destroy = function () {\r\n this.animationItem.wrapper.innerHTML = '';\r\n this.animationItem.container = null;\r\n this.globalData.defs = null;\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = 0; i < len; i++) {\r\n this.elements[i].destroy();\r\n }\r\n this.elements.length = 0;\r\n this.destroyed = true;\r\n this.animationItem = null;\r\n};\r\n\r\nHybridRenderer.prototype.updateContainerSize = function () {\r\n var elementWidth = this.animationItem.wrapper.offsetWidth;\r\n var elementHeight = this.animationItem.wrapper.offsetHeight;\r\n var elementRel = elementWidth/elementHeight;\r\n var animationRel = this.globalData.compSize.w/this.globalData.compSize.h;\r\n var sx,sy,tx,ty;\r\n if(animationRel>elementRel){\r\n sx = elementWidth/(this.globalData.compSize.w);\r\n sy = elementWidth/(this.globalData.compSize.w);\r\n tx = 0;\r\n ty = ((elementHeight-this.globalData.compSize.h*(elementWidth/this.globalData.compSize.w))/2);\r\n }else{\r\n sx = elementHeight/(this.globalData.compSize.h);\r\n sy = elementHeight/(this.globalData.compSize.h);\r\n tx = (elementWidth-this.globalData.compSize.w*(elementHeight/this.globalData.compSize.h))/2;\r\n ty = 0;\r\n }\r\n this.resizerElem.style.transform = this.resizerElem.style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,'+sy+',0,0,0,0,1,0,'+tx+','+ty+',0,1)';\r\n};\r\n\r\nHybridRenderer.prototype.renderFrame = SVGRenderer.prototype.renderFrame;\r\n\r\nHybridRenderer.prototype.hide = function(){\r\n this.resizerElem.style.display = 'none';\r\n};\r\n\r\nHybridRenderer.prototype.show = function(){\r\n this.resizerElem.style.display = 'block';\r\n};\r\n\r\nHybridRenderer.prototype.initItems = function(){\r\n this.buildAllItems();\r\n if(this.camera){\r\n this.camera.setup();\r\n } else {\r\n var cWidth = this.globalData.compSize.w;\r\n var cHeight = this.globalData.compSize.h;\r\n var i, len = this.threeDElements.length;\r\n for(i=0;i<len;i+=1){\r\n this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth,2) + Math.pow(cHeight,2)) + 'px';\r\n }\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.searchExtraCompositions = function(assets){\r\n var i, len = assets.length;\r\n var floatingContainer = createTag('div');\r\n for(i=0;i<len;i+=1){\r\n if(assets[i].xt){\r\n var comp = this.createComp(assets[i],floatingContainer,this.globalData.comp,null);\r\n comp.initExpressions();\r\n this.globalData.projectInterface.registerComposition(comp);\r\n }\r\n }\r\n};\r\n\r\nfunction MaskElement(data,element,globalData) {\r\n this.data = data;\r\n this.element = element;\r\n this.globalData = globalData;\r\n this.storedData = [];\r\n this.masksProperties = this.data.masksProperties || [];\r\n this.maskElement = null;\r\n var defs = this.globalData.defs;\r\n var i, len = this.masksProperties ? this.masksProperties.length : 0;\r\n this.viewData = createSizedArray(len);\r\n this.solidPath = '';\r\n\r\n\r\n var path, properties = this.masksProperties;\r\n var count = 0;\r\n var currentMasks = [];\r\n var j, jLen;\r\n var layerId = createElementID();\r\n var rect, expansor, feMorph,x;\r\n var maskType = 'clipPath', maskRef = 'clip-path';\r\n for (i = 0; i < len; i++) {\r\n if((properties[i].mode !== 'a' && properties[i].mode !== 'n')|| properties[i].inv || properties[i].o.k !== 100 || properties[i].o.x){\r\n maskType = 'mask';\r\n maskRef = 'mask';\r\n }\r\n\r\n if((properties[i].mode == 's' || properties[i].mode == 'i') && count === 0){\r\n rect = createNS( 'rect');\r\n rect.setAttribute('fill', '#ffffff');\r\n rect.setAttribute('width', this.element.comp.data.w || 0);\r\n rect.setAttribute('height', this.element.comp.data.h || 0);\r\n currentMasks.push(rect);\r\n } else {\r\n rect = null;\r\n }\r\n\r\n path = createNS( 'path');\r\n if(properties[i].mode == 'n') {\r\n // TODO move this to a factory or to a constructor\r\n this.viewData[i] = {\r\n op: PropertyFactory.getProp(this.element,properties[i].o,0,0.01,this.element),\r\n prop: ShapePropertyFactory.getShapeProp(this.element,properties[i],3),\r\n elem: path,\r\n lastPath: ''\r\n };\r\n defs.appendChild(path);\r\n continue;\r\n }\r\n count += 1;\r\n\r\n path.setAttribute('fill', properties[i].mode === 's' ? '#000000':'#ffffff');\r\n path.setAttribute('clip-rule','nonzero');\r\n var filterID;\r\n\r\n if (properties[i].x.k !== 0) {\r\n maskType = 'mask';\r\n maskRef = 'mask';\r\n x = PropertyFactory.getProp(this.element,properties[i].x,0,null,this.element);\r\n filterID = createElementID();\r\n expansor = createNS('filter');\r\n expansor.setAttribute('id',filterID);\r\n feMorph = createNS('feMorphology');\r\n feMorph.setAttribute('operator','erode');\r\n feMorph.setAttribute('in','SourceGraphic');\r\n feMorph.setAttribute('radius','0');\r\n expansor.appendChild(feMorph);\r\n defs.appendChild(expansor);\r\n path.setAttribute('stroke', properties[i].mode === 's' ? '#000000':'#ffffff');\r\n } else {\r\n feMorph = null;\r\n x = null;\r\n }\r\n\r\n // TODO move this to a factory or to a constructor\r\n this.storedData[i] = {\r\n elem: path,\r\n x: x,\r\n expan: feMorph,\r\n lastPath: '',\r\n lastOperator:'',\r\n filterId:filterID,\r\n lastRadius:0\r\n };\r\n if(properties[i].mode == 'i'){\r\n jLen = currentMasks.length;\r\n var g = createNS('g');\r\n for(j=0;j<jLen;j+=1){\r\n g.appendChild(currentMasks[j]);\r\n }\r\n var mask = createNS('mask');\r\n mask.setAttribute('mask-type','alpha');\r\n mask.setAttribute('id',layerId+'_'+count);\r\n mask.appendChild(path);\r\n defs.appendChild(mask);\r\n g.setAttribute('mask','url(' + locationHref + '#'+layerId+'_'+count+')');\r\n\r\n currentMasks.length = 0;\r\n currentMasks.push(g);\r\n }else{\r\n currentMasks.push(path);\r\n }\r\n if(properties[i].inv && !this.solidPath){\r\n this.solidPath = this.createLayerSolidPath();\r\n }\r\n // TODO move this to a factory or to a constructor\r\n this.viewData[i] = {\r\n elem: path,\r\n lastPath: '',\r\n op: PropertyFactory.getProp(this.element,properties[i].o,0,0.01,this.element),\r\n prop:ShapePropertyFactory.getShapeProp(this.element,properties[i],3),\r\n invRect: rect\r\n };\r\n if(!this.viewData[i].prop.k){\r\n this.drawPath(properties[i],this.viewData[i].prop.v,this.viewData[i]);\r\n }\r\n }\r\n\r\n this.maskElement = createNS( maskType);\r\n\r\n len = currentMasks.length;\r\n for(i=0;i<len;i+=1){\r\n this.maskElement.appendChild(currentMasks[i]);\r\n }\r\n\r\n if(count > 0){\r\n this.maskElement.setAttribute('id', layerId);\r\n this.element.maskedElement.setAttribute(maskRef, \"url(\" + locationHref + \"#\" + layerId + \")\");\r\n defs.appendChild(this.maskElement);\r\n }\r\n if (this.viewData.length) {\r\n this.element.addRenderableComponent(this);\r\n }\r\n\r\n}\r\n\r\nMaskElement.prototype.getMaskProperty = function(pos){\r\n return this.viewData[pos].prop;\r\n};\r\n\r\nMaskElement.prototype.renderFrame = function (isFirstFrame) {\r\n var finalMat = this.element.finalTransform.mat;\r\n var i, len = this.masksProperties.length;\r\n for (i = 0; i < len; i++) {\r\n if(this.viewData[i].prop._mdf || isFirstFrame){\r\n this.drawPath(this.masksProperties[i],this.viewData[i].prop.v,this.viewData[i]);\r\n }\r\n if(this.viewData[i].op._mdf || isFirstFrame){\r\n this.viewData[i].elem.setAttribute('fill-opacity',this.viewData[i].op.v);\r\n }\r\n if(this.masksProperties[i].mode !== 'n'){\r\n if(this.viewData[i].invRect && (this.element.finalTransform.mProp._mdf || isFirstFrame)){\r\n this.viewData[i].invRect.setAttribute('x', -finalMat.props[12]);\r\n this.viewData[i].invRect.setAttribute('y', -finalMat.props[13]);\r\n }\r\n if(this.storedData[i].x && (this.storedData[i].x._mdf || isFirstFrame)){\r\n var feMorph = this.storedData[i].expan;\r\n if(this.storedData[i].x.v < 0){\r\n if(this.storedData[i].lastOperator !== 'erode'){\r\n this.storedData[i].lastOperator = 'erode';\r\n this.storedData[i].elem.setAttribute('filter','url(' + locationHref + '#'+this.storedData[i].filterId+')');\r\n }\r\n feMorph.setAttribute('radius',-this.storedData[i].x.v);\r\n }else{\r\n if(this.storedData[i].lastOperator !== 'dilate'){\r\n this.storedData[i].lastOperator = 'dilate';\r\n this.storedData[i].elem.setAttribute('filter',null);\r\n }\r\n this.storedData[i].elem.setAttribute('stroke-width', this.storedData[i].x.v*2);\r\n\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nMaskElement.prototype.getMaskelement = function () {\r\n return this.maskElement;\r\n};\r\n\r\nMaskElement.prototype.createLayerSolidPath = function(){\r\n var path = 'M0,0 ';\r\n path += ' h' + this.globalData.compSize.w ;\r\n path += ' v' + this.globalData.compSize.h ;\r\n path += ' h-' + this.globalData.compSize.w ;\r\n path += ' v-' + this.globalData.compSize.h + ' ';\r\n return path;\r\n};\r\n\r\nMaskElement.prototype.drawPath = function(pathData,pathNodes,viewData){\r\n var pathString = \" M\"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n var i, len;\r\n len = pathNodes._length;\r\n for(i=1;i<len;i+=1){\r\n //pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[i][0]+','+pathNodes.i[i][1] + \" \"+pathNodes.v[i][0]+','+pathNodes.v[i][1];\r\n pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[i][0]+','+pathNodes.i[i][1] + \" \"+pathNodes.v[i][0]+','+pathNodes.v[i][1];\r\n }\r\n //pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[0][0]+','+pathNodes.i[0][1] + \" \"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n if(pathNodes.c && len > 1){\r\n pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[0][0]+','+pathNodes.i[0][1] + \" \"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n }\r\n //pathNodes.__renderedString = pathString;\r\n\r\n if(viewData.lastPath !== pathString){\r\n var pathShapeValue = '';\r\n if(viewData.elem){\r\n if(pathNodes.c){\r\n pathShapeValue = pathData.inv ? this.solidPath + pathString : pathString;\r\n }\r\n viewData.elem.setAttribute('d',pathShapeValue);\r\n }\r\n viewData.lastPath = pathString;\r\n }\r\n};\r\n\r\nMaskElement.prototype.destroy = function(){\r\n this.element = null;\r\n this.globalData = null;\r\n this.maskElement = null;\r\n this.data = null;\r\n this.masksProperties = null;\r\n};\r\n\r\n/**\r\n * @file \r\n * Handles AE's layer parenting property.\r\n *\r\n */\r\n\r\nfunction HierarchyElement(){}\r\n\r\nHierarchyElement.prototype = {\r\n\t/**\r\n * @function \r\n * Initializes hierarchy properties\r\n *\r\n */\r\n\tinitHierarchy: function() {\r\n\t\t//element's parent list\r\n\t this.hierarchy = [];\r\n\t //if element is parent of another layer _isParent will be true\r\n\t this._isParent = false;\r\n\t this.checkParenting();\r\n\t},\r\n\t/**\r\n * @function \r\n * Sets layer's hierarchy.\r\n * @param {array} hierarch\r\n * layer's parent list\r\n *\r\n */ \r\n\tsetHierarchy: function(hierarchy){\r\n\t this.hierarchy = hierarchy;\r\n\t},\r\n\t/**\r\n * @function \r\n * Sets layer as parent.\r\n *\r\n */ \r\n\tsetAsParent: function() {\r\n\t this._isParent = true;\r\n\t},\r\n\t/**\r\n * @function \r\n * Searches layer's parenting chain\r\n *\r\n */ \r\n\tcheckParenting: function(){\r\n\t if (this.data.parent !== undefined){\r\n\t this.comp.buildElementParenting(this, this.data.parent, []);\r\n\t }\r\n\t}\r\n};\r\n/**\r\n * @file \r\n * Handles element's layer frame update.\r\n * Checks layer in point and out point\r\n *\r\n */\r\n\r\nfunction FrameElement(){}\r\n\r\nFrameElement.prototype = {\r\n /**\r\n * @function \r\n * Initializes frame related properties.\r\n *\r\n */\r\n initFrame: function(){\r\n //set to true when inpoint is rendered\r\n this._isFirstFrame = false;\r\n //list of animated properties\r\n this.dynamicProperties = [];\r\n // If layer has been modified in current tick this will be true\r\n this._mdf = false;\r\n },\r\n /**\r\n * @function \r\n * Calculates all dynamic values\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n * @param {boolean} isVisible\r\n * if layers is currently in range\r\n * \r\n */\r\n prepareProperties: function(num, isVisible) {\r\n var i, len = this.dynamicProperties.length;\r\n for (i = 0;i < len; i += 1) {\r\n if (isVisible || (this._isParent && this.dynamicProperties[i].propType === 'transform')) {\r\n this.dynamicProperties[i].getValue();\r\n if (this.dynamicProperties[i]._mdf) {\r\n this.globalData._mdf = true;\r\n this._mdf = true;\r\n }\r\n }\r\n }\r\n },\r\n addDynamicProperty: function(prop) {\r\n if(this.dynamicProperties.indexOf(prop) === -1) {\r\n this.dynamicProperties.push(prop);\r\n }\r\n }\r\n};\r\nfunction TransformElement(){}\r\n\r\nTransformElement.prototype = {\r\n initTransform: function() {\r\n this.finalTransform = {\r\n mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : {o:0},\r\n _matMdf: false,\r\n _opMdf: false,\r\n mat: new Matrix()\r\n };\r\n if (this.data.ao) {\r\n this.finalTransform.mProp.autoOriented = true;\r\n }\r\n\r\n //TODO: check TYPE 11: Guided elements\r\n if (this.data.ty !== 11) {\r\n //this.createElements();\r\n }\r\n },\r\n renderTransform: function() {\r\n\r\n this.finalTransform._opMdf = this.finalTransform.mProp.o._mdf || this._isFirstFrame;\r\n this.finalTransform._matMdf = this.finalTransform.mProp._mdf || this._isFirstFrame;\r\n\r\n if (this.hierarchy) {\r\n var mat;\r\n var finalMat = this.finalTransform.mat;\r\n var i = 0, len = this.hierarchy.length;\r\n //Checking if any of the transformation matrices in the hierarchy chain has changed.\r\n if (!this.finalTransform._matMdf) {\r\n while (i < len) {\r\n if (this.hierarchy[i].finalTransform.mProp._mdf) {\r\n this.finalTransform._matMdf = true;\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n \r\n if (this.finalTransform._matMdf) {\r\n mat = this.finalTransform.mProp.v.props;\r\n finalMat.cloneFromProps(mat);\r\n for (i = 0; i < len; i += 1) {\r\n mat = this.hierarchy[i].finalTransform.mProp.v.props;\r\n finalMat.transform(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5], mat[6], mat[7], mat[8], mat[9], mat[10], mat[11], mat[12], mat[13], mat[14], mat[15]);\r\n }\r\n }\r\n }\r\n },\r\n globalToLocal: function(pt) {\r\n var transforms = [];\r\n transforms.push(this.finalTransform);\r\n var flag = true;\r\n var comp = this.comp;\r\n while (flag) {\r\n if (comp.finalTransform) {\r\n if (comp.data.hasMask) {\r\n transforms.splice(0, 0, comp.finalTransform);\r\n }\r\n comp = comp.comp;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n var i, len = transforms.length,ptNew;\r\n for (i = 0; i < len; i += 1) {\r\n ptNew = transforms[i].mat.applyToPointArray(0, 0, 0);\r\n //ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);\r\n pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0];\r\n }\r\n return pt;\r\n },\r\n mHelper: new Matrix()\r\n};\r\nfunction RenderableElement(){\r\n\r\n}\r\n\r\nRenderableElement.prototype = {\r\n initRenderable: function() {\r\n //layer's visibility related to inpoint and outpoint. Rename isVisible to isInRange\r\n this.isInRange = false;\r\n //layer's display state\r\n this.hidden = false;\r\n // If layer's transparency equals 0, it can be hidden\r\n this.isTransparent = false;\r\n //list of animated components\r\n this.renderableComponents = [];\r\n },\r\n addRenderableComponent: function(component) {\r\n if(this.renderableComponents.indexOf(component) === -1) {\r\n this.renderableComponents.push(component);\r\n }\r\n },\r\n removeRenderableComponent: function(component) {\r\n if(this.renderableComponents.indexOf(component) !== -1) {\r\n this.renderableComponents.splice(this.renderableComponents.indexOf(component), 1);\r\n }\r\n },\r\n prepareRenderableFrame: function(num) {\r\n this.checkLayerLimits(num);\r\n },\r\n checkTransparency: function(){\r\n if(this.finalTransform.mProp.o.v <= 0) {\r\n if(!this.isTransparent && this.globalData.renderConfig.hideOnTransparent){\r\n this.isTransparent = true;\r\n this.hide();\r\n }\r\n } else if(this.isTransparent) {\r\n this.isTransparent = false;\r\n this.show();\r\n }\r\n },\r\n /**\r\n * @function \r\n * Initializes frame related properties.\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n * \r\n */\r\n checkLayerLimits: function(num) {\r\n if(this.data.ip - this.data.st <= num && this.data.op - this.data.st > num)\r\n {\r\n if(this.isInRange !== true){\r\n this.globalData._mdf = true;\r\n this._mdf = true;\r\n this.isInRange = true;\r\n this.show();\r\n }\r\n } else {\r\n if(this.isInRange !== false){\r\n this.globalData._mdf = true;\r\n this.isInRange = false;\r\n this.hide();\r\n }\r\n }\r\n },\r\n renderRenderable: function() {\r\n var i, len = this.renderableComponents.length;\r\n for(i = 0; i < len; i += 1) {\r\n this.renderableComponents[i].renderFrame(this._isFirstFrame);\r\n }\r\n /*this.maskManager.renderFrame(this.finalTransform.mat);\r\n this.renderableEffectsManager.renderFrame(this._isFirstFrame);*/\r\n },\r\n sourceRectAtTime: function(){\r\n return {\r\n top:0,\r\n left:0,\r\n width:100,\r\n height:100\r\n };\r\n },\r\n getLayerSize: function(){\r\n if(this.data.ty === 5){\r\n return {w:this.data.textData.width,h:this.data.textData.height};\r\n }else{\r\n return {w:this.data.width,h:this.data.height};\r\n }\r\n }\r\n};\r\nfunction RenderableDOMElement() {}\r\n\r\n(function(){\r\n var _prototype = {\r\n initElement: function(data,globalData,comp) {\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n this.initRenderable();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n this.createContent();\r\n this.hide();\r\n },\r\n hide: function(){\r\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\r\n var elem = this.baseElement || this.layerElement;\r\n elem.style.display = 'none';\r\n this.hidden = true;\r\n }\r\n },\r\n show: function(){\r\n if (this.isInRange && !this.isTransparent){\r\n if (!this.data.hd) {\r\n var elem = this.baseElement || this.layerElement;\r\n elem.style.display = 'block';\r\n }\r\n this.hidden = false;\r\n this._isFirstFrame = true;\r\n }\r\n },\r\n renderFrame: function() {\r\n //If it is exported as hidden (data.hd === true) no need to render\r\n //If it is not visible no need to render\r\n if (this.data.hd || this.hidden) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.renderElement();\r\n this.renderInnerContent();\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n renderInnerContent: function() {},\r\n prepareFrame: function(num) {\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n this.checkTransparency();\r\n },\r\n destroy: function(){\r\n this.innerElem = null;\r\n this.destroyBaseElement();\r\n }\r\n };\r\n extendPrototype([RenderableElement, createProxyFunction(_prototype)], RenderableDOMElement);\r\n}());\r\nfunction ProcessedElement(element, position) {\r\n\tthis.elem = element;\r\n\tthis.pos = position;\r\n}\r\nfunction SVGStyleData(data, level) {\r\n\tthis.data = data;\r\n\tthis.type = data.ty;\r\n\tthis.d = '';\r\n\tthis.lvl = level;\r\n\tthis._mdf = false;\r\n\tthis.closed = data.hd === true;\r\n\tthis.pElem = createNS('path');\r\n\tthis.msElem = null;\r\n}\r\n\r\nSVGStyleData.prototype.reset = function() {\r\n\tthis.d = '';\r\n\tthis._mdf = false;\r\n};\r\nfunction SVGShapeData(transformers, level, shape) {\r\n this.caches = [];\r\n this.styles = [];\r\n this.transformers = transformers;\r\n this.lStr = '';\r\n this.sh = shape;\r\n this.lvl = level;\r\n //TODO find if there are some cases where _isAnimated can be false. \r\n // For now, since shapes add up with other shapes. They have to be calculated every time.\r\n // One way of finding out is checking if all styles associated to this shape depend only of this shape\r\n this._isAnimated = !!shape.k;\r\n // TODO: commenting this for now since all shapes are animated\r\n var i = 0, len = transformers.length;\r\n while(i < len) {\r\n \tif(transformers[i].mProps.dynamicProperties.length) {\r\n \t\tthis._isAnimated = true;\r\n \t\tbreak;\r\n \t}\r\n \ti += 1;\r\n }\r\n}\r\n\r\nSVGShapeData.prototype.setAsAnimated = function() {\r\n this._isAnimated = true;\r\n}\r\nfunction SVGTransformData(mProps, op, container) {\r\n\tthis.transform = {\r\n\t\tmProps: mProps,\r\n\t\top: op,\r\n\t\tcontainer: container\r\n\t};\r\n\tthis.elements = [];\r\n this._isAnimated = this.transform.mProps.dynamicProperties.length || this.transform.op.effectsSequence.length;\r\n}\r\nfunction SVGStrokeStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n\tthis.w = PropertyFactory.getProp(elem,data.w,0,null,this);\r\n\tthis.d = new DashProperty(elem,data.d||{},'svg',this);\r\n\tthis.c = PropertyFactory.getProp(elem,data.c,1,255,this);\r\n\tthis.style = styleOb;\r\n this._isAnimated = !!this._isAnimated;\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGStrokeStyleData);\r\nfunction SVGFillStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n\tthis.c = PropertyFactory.getProp(elem,data.c,1,255,this);\r\n\tthis.style = styleOb;\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGFillStyleData);\r\nfunction SVGGradientFillStyleData(elem, data, styleOb){\r\n this.initDynamicPropertyContainer(elem);\r\n this.getValue = this.iterateDynamicProperties;\r\n this.initGradientData(elem, data, styleOb);\r\n}\r\n\r\nSVGGradientFillStyleData.prototype.initGradientData = function(elem, data, styleOb){\r\n this.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,null,this);\r\n this.e = PropertyFactory.getProp(elem,data.e,1,null,this);\r\n this.h = PropertyFactory.getProp(elem,data.h||{k:0},0,0.01,this);\r\n this.a = PropertyFactory.getProp(elem,data.a||{k:0},0,degToRads,this);\r\n this.g = new GradientProperty(elem,data.g,this);\r\n this.style = styleOb;\r\n this.stops = [];\r\n this.setGradientData(styleOb.pElem, data);\r\n this.setGradientOpacity(data, styleOb);\r\n this._isAnimated = !!this._isAnimated;\r\n\r\n};\r\n\r\nSVGGradientFillStyleData.prototype.setGradientData = function(pathElement,data){\r\n\r\n var gradientId = createElementID();\r\n var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\r\n gfill.setAttribute('id',gradientId);\r\n gfill.setAttribute('spreadMethod','pad');\r\n gfill.setAttribute('gradientUnits','userSpaceOnUse');\r\n var stops = [];\r\n var stop, j, jLen;\r\n jLen = data.g.p*4;\r\n for(j=0;j<jLen;j+=4){\r\n stop = createNS('stop');\r\n gfill.appendChild(stop);\r\n stops.push(stop);\r\n }\r\n pathElement.setAttribute( data.ty === 'gf' ? 'fill':'stroke','url(' + locationHref + '#'+gradientId+')');\r\n \r\n this.gf = gfill;\r\n this.cst = stops;\r\n};\r\n\r\nSVGGradientFillStyleData.prototype.setGradientOpacity = function(data, styleOb){\r\n if(this.g._hasOpacity && !this.g._collapsable){\r\n var stop, j, jLen;\r\n var mask = createNS(\"mask\");\r\n var maskElement = createNS( 'path');\r\n mask.appendChild(maskElement);\r\n var opacityId = createElementID();\r\n var maskId = createElementID();\r\n mask.setAttribute('id',maskId);\r\n var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\r\n opFill.setAttribute('id',opacityId);\r\n opFill.setAttribute('spreadMethod','pad');\r\n opFill.setAttribute('gradientUnits','userSpaceOnUse');\r\n jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;\r\n var stops = this.stops;\r\n for(j=data.g.p*4;j<jLen;j+=2){\r\n stop = createNS('stop');\r\n stop.setAttribute('stop-color','rgb(255,255,255)');\r\n opFill.appendChild(stop);\r\n stops.push(stop);\r\n }\r\n maskElement.setAttribute( data.ty === 'gf' ? 'fill':'stroke','url(' + locationHref + '#'+opacityId+')');\r\n this.of = opFill;\r\n this.ms = mask;\r\n this.ost = stops;\r\n this.maskId = maskId;\r\n styleOb.msElem = maskElement;\r\n }\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGGradientFillStyleData);\r\nfunction SVGGradientStrokeStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.w = PropertyFactory.getProp(elem,data.w,0,null,this);\r\n\tthis.d = new DashProperty(elem,data.d||{},'svg',this);\r\n this.initGradientData(elem, data, styleOb);\r\n this._isAnimated = !!this._isAnimated;\r\n}\r\n\r\nextendPrototype([SVGGradientFillStyleData, DynamicPropertyContainer], SVGGradientStrokeStyleData);\r\nfunction ShapeGroupData() {\r\n\tthis.it = [];\r\n this.prevViewData = [];\r\n this.gr = createNS('g');\r\n}\r\nvar SVGElementsRenderer = (function() {\r\n\tvar _identityMatrix = new Matrix();\r\n\tvar _matrixHelper = new Matrix();\r\n\r\n\tvar ob = {\r\n\t\tcreateRenderFunction: createRenderFunction\r\n\t}\r\n\r\n\tfunction createRenderFunction(data) {\r\n\t var ty = data.ty;\r\n\t switch(data.ty) {\r\n\t case 'fl':\r\n\t return renderFill;\r\n\t case 'gf':\r\n\t return renderGradient;\r\n\t case 'gs':\r\n\t return renderGradientStroke;\r\n\t case 'st':\r\n\t return renderStroke;\r\n\t case 'sh':\r\n\t case 'el':\r\n\t case 'rc':\r\n\t case 'sr':\r\n\t return renderPath;\r\n\t case 'tr':\r\n\t return renderContentTransform;\r\n\t }\r\n\t}\r\n\r\n\tfunction renderContentTransform(styleData, itemData, isFirstFrame) {\r\n\t if(isFirstFrame || itemData.transform.op._mdf){\r\n\t itemData.transform.container.setAttribute('opacity',itemData.transform.op.v);\r\n\t }\r\n\t if(isFirstFrame || itemData.transform.mProps._mdf){\r\n\t itemData.transform.container.setAttribute('transform',itemData.transform.mProps.v.to2dCSS());\r\n\t }\r\n\t}\r\n\r\n\tfunction renderPath(styleData, itemData, isFirstFrame) {\r\n\t var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;\r\n\t var lvl = itemData.lvl;\r\n\t var paths, mat, props, iterations, k;\r\n\t for(l=0;l<lLen;l+=1){\r\n\t redraw = itemData.sh._mdf || isFirstFrame;\r\n\t if(itemData.styles[l].lvl < lvl){\r\n\t mat = _matrixHelper.reset();\r\n\t iterations = lvl - itemData.styles[l].lvl;\r\n\t k = itemData.transformers.length-1;\r\n\t while(!redraw && iterations > 0) {\r\n\t redraw = itemData.transformers[k].mProps._mdf || redraw;\r\n\t iterations --;\r\n\t k --;\r\n\t }\r\n\t if(redraw) {\r\n\t iterations = lvl - itemData.styles[l].lvl;\r\n\t k = itemData.transformers.length-1;\r\n\t while(iterations > 0) {\r\n\t props = itemData.transformers[k].mProps.v.props;\r\n\t mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n\t iterations --;\r\n\t k --;\r\n\t }\r\n\t }\r\n\t } else {\r\n\t mat = _identityMatrix;\r\n\t }\r\n\t paths = itemData.sh.paths;\r\n\t jLen = paths._length;\r\n\t if(redraw){\r\n\t pathStringTransformed = '';\r\n\t for(j=0;j<jLen;j+=1){\r\n\t pathNodes = paths.shapes[j];\r\n\t if(pathNodes && pathNodes._length){\r\n\t pathStringTransformed += buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);\r\n\t }\r\n\t }\r\n\t itemData.caches[l] = pathStringTransformed;\r\n\t } else {\r\n\t pathStringTransformed = itemData.caches[l];\r\n\t }\r\n\t itemData.styles[l].d += styleData.hd === true ? '' : pathStringTransformed;\r\n\t itemData.styles[l]._mdf = redraw || itemData.styles[l]._mdf;\r\n\t }\r\n\t}\r\n\r\n\tfunction renderFill (styleData,itemData, isFirstFrame){\r\n\t var styleElem = itemData.style;\r\n\r\n\t if(itemData.c._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');\r\n\t }\r\n\t if(itemData.o._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);\r\n\t }\r\n\t};\r\n\r\n\tfunction renderGradientStroke (styleData, itemData, isFirstFrame) {\r\n\t renderGradient(styleData, itemData, isFirstFrame);\r\n\t renderStroke(styleData, itemData, isFirstFrame);\r\n\t}\r\n\r\n\tfunction renderGradient(styleData, itemData, isFirstFrame) {\r\n\t var gfill = itemData.gf;\r\n\t var hasOpacity = itemData.g._hasOpacity;\r\n\t var pt1 = itemData.s.v, pt2 = itemData.e.v;\r\n\r\n\t if (itemData.o._mdf || isFirstFrame) {\r\n\t var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';\r\n\t itemData.style.pElem.setAttribute(attr, itemData.o.v);\r\n\t }\r\n\t if (itemData.s._mdf || isFirstFrame) {\r\n\t var attr1 = styleData.t === 1 ? 'x1' : 'cx';\r\n\t var attr2 = attr1 === 'x1' ? 'y1' : 'cy';\r\n\t gfill.setAttribute(attr1, pt1[0]);\r\n\t gfill.setAttribute(attr2, pt1[1]);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute(attr1, pt1[0]);\r\n\t itemData.of.setAttribute(attr2, pt1[1]);\r\n\t }\r\n\t }\r\n\t var stops, i, len, stop;\r\n\t if (itemData.g._cmdf || isFirstFrame) {\r\n\t stops = itemData.cst;\r\n\t var cValues = itemData.g.c;\r\n\t len = stops.length;\r\n\t for (i = 0; i < len; i += 1){\r\n\t stop = stops[i];\r\n\t stop.setAttribute('offset', cValues[i * 4] + '%');\r\n\t stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');\r\n\t }\r\n\t }\r\n\t if (hasOpacity && (itemData.g._omdf || isFirstFrame)) {\r\n\t var oValues = itemData.g.o;\r\n\t if(itemData.g._collapsable) {\r\n\t stops = itemData.cst;\r\n\t } else {\r\n\t stops = itemData.ost;\r\n\t }\r\n\t len = stops.length;\r\n\t for (i = 0; i < len; i += 1) {\r\n\t stop = stops[i];\r\n\t if(!itemData.g._collapsable) {\r\n\t stop.setAttribute('offset', oValues[i * 2] + '%');\r\n\t }\r\n\t stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);\r\n\t }\r\n\t }\r\n\t if (styleData.t === 1) {\r\n\t if (itemData.e._mdf || isFirstFrame) {\r\n\t gfill.setAttribute('x2', pt2[0]);\r\n\t gfill.setAttribute('y2', pt2[1]);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute('x2', pt2[0]);\r\n\t itemData.of.setAttribute('y2', pt2[1]);\r\n\t }\r\n\t }\r\n\t } else {\r\n\t var rad;\r\n\t if (itemData.s._mdf || itemData.e._mdf || isFirstFrame) {\r\n\t rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n\t gfill.setAttribute('r', rad);\r\n\t if(hasOpacity && !itemData.g._collapsable){\r\n\t itemData.of.setAttribute('r', rad);\r\n\t }\r\n\t }\r\n\t if (itemData.e._mdf || itemData.h._mdf || itemData.a._mdf || isFirstFrame) {\r\n\t if (!rad) {\r\n\t rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n\t }\r\n\t var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\r\n\r\n\t var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;\r\n\t var dist = rad * percent;\r\n\t var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\r\n\t var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\r\n\t gfill.setAttribute('fx', x);\r\n\t gfill.setAttribute('fy', y);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute('fx', x);\r\n\t itemData.of.setAttribute('fy', y);\r\n\t }\r\n\t }\r\n\t //gfill.setAttribute('fy','200');\r\n\t }\r\n\t};\r\n\r\n\tfunction renderStroke(styleData, itemData, isFirstFrame) {\r\n\t var styleElem = itemData.style;\r\n\t var d = itemData.d;\r\n\t if (d && (d._mdf || isFirstFrame) && d.dashStr) {\r\n\t styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);\r\n\t styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);\r\n\t }\r\n\t if(itemData.c && (itemData.c._mdf || isFirstFrame)){\r\n\t styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');\r\n\t }\r\n\t if(itemData.o._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);\r\n\t }\r\n\t if(itemData.w._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('stroke-width', itemData.w.v);\r\n\t if(styleElem.msElem){\r\n\t styleElem.msElem.setAttribute('stroke-width', itemData.w.v);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\treturn ob;\r\n}())\r\nfunction ShapeTransformManager() {\r\n\tthis.sequences = {};\r\n\tthis.sequenceList = [];\r\n this.transform_key_count = 0;\r\n}\r\n\r\nShapeTransformManager.prototype = {\r\n\taddTransformSequence: function(transforms) {\r\n\t\tvar i, len = transforms.length;\r\n\t\tvar key = '_';\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tkey += transforms[i].transform.key + '_';\r\n\t\t}\r\n\t\tvar sequence = this.sequences[key];\r\n\t\tif(!sequence) {\r\n\t\t\tsequence = {\r\n\t\t\t\ttransforms: [].concat(transforms),\r\n\t\t\t\tfinalTransform: new Matrix(),\r\n\t\t\t\t_mdf: false\r\n\t\t\t};\r\n\t\t\tthis.sequences[key] = sequence;\r\n\t\t\tthis.sequenceList.push(sequence);\r\n\t\t}\r\n\t\treturn sequence;\r\n\t},\r\n\tprocessSequence: function(sequence, isFirstFrame) {\r\n\t\tvar i = 0, len = sequence.transforms.length, _mdf = isFirstFrame;\r\n\t\twhile (i < len && !isFirstFrame) {\r\n\t\t\tif (sequence.transforms[i].transform.mProps._mdf) {\r\n\t\t\t\t_mdf = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\ti += 1\r\n\t\t}\r\n\t\tif (_mdf) {\r\n\t\t\tvar props;\r\n\t\t\tsequence.finalTransform.reset();\r\n\t\t\tfor (i = len - 1; i >= 0; i -= 1) {\r\n\t\t props = sequence.transforms[i].transform.mProps.v.props;\r\n\t\t sequence.finalTransform.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsequence._mdf = _mdf;\r\n\t\t\r\n\t},\r\n\tprocessSequences: function(isFirstFrame) {\r\n\t\tvar i, len = this.sequenceList.length;\r\n\t\tfor (i = 0; i < len; i += 1) {\r\n\t\t\tthis.processSequence(this.sequenceList[i], isFirstFrame);\r\n\t\t}\r\n\r\n\t},\r\n\tgetNewKey: function() {\r\n\t\treturn '_' + this.transform_key_count++;\r\n\t}\r\n}\r\nfunction CVShapeData(element, data, styles, transformsManager) {\r\n this.styledShapes = [];\r\n this.tr = [0,0,0,0,0,0];\r\n var ty = 4;\r\n if(data.ty == 'rc'){\r\n ty = 5;\r\n }else if(data.ty == 'el'){\r\n ty = 6;\r\n }else if(data.ty == 'sr'){\r\n ty = 7;\r\n }\r\n this.sh = ShapePropertyFactory.getShapeProp(element,data,ty,element);\r\n var i , len = styles.length,styledShape;\r\n for (i = 0; i < len; i += 1) {\r\n if (!styles[i].closed) {\r\n styledShape = {\r\n transforms: transformsManager.addTransformSequence(styles[i].transforms),\r\n trNodes: []\r\n }\r\n this.styledShapes.push(styledShape);\r\n styles[i].elements.push(styledShape);\r\n }\r\n }\r\n}\r\n\r\nCVShapeData.prototype.setAsAnimated = SVGShapeData.prototype.setAsAnimated;\r\nfunction BaseElement(){\r\n}\r\n\r\nBaseElement.prototype = {\r\n checkMasks: function(){\r\n if(!this.data.hasMask){\r\n return false;\r\n }\r\n var i = 0, len = this.data.masksProperties.length;\r\n while(i<len) {\r\n if((this.data.masksProperties[i].mode !== 'n' && this.data.masksProperties[i].cl !== false)) {\r\n return true;\r\n }\r\n i += 1;\r\n }\r\n return false;\r\n },\r\n initExpressions: function(){\r\n this.layerInterface = LayerExpressionInterface(this);\r\n if(this.data.hasMask && this.maskManager) {\r\n this.layerInterface.registerMaskInterface(this.maskManager);\r\n }\r\n var effectsInterface = EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);\r\n this.layerInterface.registerEffectsInterface(effectsInterface);\r\n\r\n if(this.data.ty === 0 || this.data.xt){\r\n this.compInterface = CompExpressionInterface(this);\r\n } else if(this.data.ty === 4){\r\n this.layerInterface.shapeInterface = ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface);\r\n this.layerInterface.content = this.layerInterface.shapeInterface;\r\n } else if(this.data.ty === 5){\r\n this.layerInterface.textInterface = TextExpressionInterface(this);\r\n this.layerInterface.text = this.layerInterface.textInterface;\r\n }\r\n },\r\n setBlendMode: function(){\r\n var blendModeValue = getBlendMode(this.data.bm);\r\n var elem = this.baseElement || this.layerElement;\r\n\r\n elem.style['mix-blend-mode'] = blendModeValue;\r\n },\r\n initBaseData: function(data, globalData, comp){\r\n this.globalData = globalData;\r\n this.comp = comp;\r\n this.data = data;\r\n this.layerId = createElementID();\r\n \r\n //Stretch factor for old animations missing this property.\r\n if(!this.data.sr){\r\n this.data.sr = 1;\r\n }\r\n // effects manager\r\n this.effectsManager = new EffectsManager(this.data,this,this.dynamicProperties);\r\n \r\n },\r\n getType: function(){\r\n return this.type;\r\n }\r\n ,sourceRectAtTime: function(){}\r\n}\r\nfunction NullElement(data,globalData,comp){\r\n this.initFrame();\r\n\tthis.initBaseData(data, globalData, comp);\r\n this.initFrame();\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n}\r\n\r\nNullElement.prototype.prepareFrame = function(num) {\r\n this.prepareProperties(num, true);\r\n};\r\n\r\nNullElement.prototype.renderFrame = function() {\r\n};\r\n\r\nNullElement.prototype.getBaseElement = function() {\r\n\treturn null;\r\n};\r\n\r\nNullElement.prototype.destroy = function() {\r\n};\r\n\r\nNullElement.prototype.sourceRectAtTime = function() {\r\n};\r\n\r\nNullElement.prototype.hide = function() {\r\n};\r\n\r\nextendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement], NullElement);\r\n\r\nfunction SVGBaseElement(){\r\n}\r\n\r\nSVGBaseElement.prototype = {\r\n initRendererElement: function() {\r\n this.layerElement = createNS('g');\r\n },\r\n createContainerElements: function(){\r\n this.matteElement = createNS('g');\r\n this.transformedElement = this.layerElement;\r\n this.maskedElement = this.layerElement;\r\n this._sizeChanged = false;\r\n var layerElementParent = null;\r\n //If this layer acts as a mask for the following layer\r\n var filId, fil, gg;\r\n if (this.data.td) {\r\n if (this.data.td == 3 || this.data.td == 1) {\r\n var masker = createNS('mask');\r\n masker.setAttribute('id', this.layerId);\r\n masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');\r\n masker.appendChild(this.layerElement);\r\n layerElementParent = masker;\r\n this.globalData.defs.appendChild(masker);\r\n // This is only for IE and Edge when mask if of type alpha\r\n if (!featureSupport.maskType && this.data.td == 1) {\r\n masker.setAttribute('mask-type', 'luminance');\r\n filId = createElementID();\r\n fil = filtersFactory.createFilter(filId);\r\n this.globalData.defs.appendChild(fil);\r\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\r\n gg = createNS('g');\r\n gg.appendChild(this.layerElement);\r\n layerElementParent = gg;\r\n masker.appendChild(gg);\r\n gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');\r\n }\r\n } else if(this.data.td == 2) {\r\n var maskGroup = createNS('mask');\r\n maskGroup.setAttribute('id', this.layerId);\r\n maskGroup.setAttribute('mask-type','alpha');\r\n var maskGrouper = createNS('g');\r\n maskGroup.appendChild(maskGrouper);\r\n filId = createElementID();\r\n fil = filtersFactory.createFilter(filId);\r\n ////\r\n\r\n // This solution doesn't work on Android when meta tag with viewport attribute is set\r\n /*var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type', 'matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');\r\n fil.appendChild(feColorMatrix);*/\r\n ////\r\n var feCTr = createNS('feComponentTransfer');\r\n feCTr.setAttribute('in','SourceGraphic');\r\n fil.appendChild(feCTr);\r\n var feFunc = createNS('feFuncA');\r\n feFunc.setAttribute('type','table');\r\n feFunc.setAttribute('tableValues','1.0 0.0');\r\n feCTr.appendChild(feFunc);\r\n ////\r\n this.globalData.defs.appendChild(fil);\r\n var alphaRect = createNS('rect');\r\n alphaRect.setAttribute('width', this.comp.data.w);\r\n alphaRect.setAttribute('height', this.comp.data.h);\r\n alphaRect.setAttribute('x','0');\r\n alphaRect.setAttribute('y','0');\r\n alphaRect.setAttribute('fill','#ffffff');\r\n alphaRect.setAttribute('opacity','0');\r\n maskGrouper.setAttribute('filter', 'url(' + locationHref + '#'+filId+')');\r\n maskGrouper.appendChild(alphaRect);\r\n maskGrouper.appendChild(this.layerElement);\r\n layerElementParent = maskGrouper;\r\n if (!featureSupport.maskType) {\r\n maskGroup.setAttribute('mask-type', 'luminance');\r\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\r\n gg = createNS('g');\r\n maskGrouper.appendChild(alphaRect);\r\n gg.appendChild(this.layerElement);\r\n layerElementParent = gg;\r\n maskGrouper.appendChild(gg);\r\n }\r\n this.globalData.defs.appendChild(maskGroup);\r\n }\r\n } else if (this.data.tt) {\r\n this.matteElement.appendChild(this.layerElement);\r\n layerElementParent = this.matteElement;\r\n this.baseElement = this.matteElement;\r\n } else {\r\n this.baseElement = this.layerElement;\r\n }\r\n if (this.data.ln) {\r\n this.layerElement.setAttribute('id', this.data.ln);\r\n }\r\n if (this.data.cl) {\r\n this.layerElement.setAttribute('class', this.data.cl);\r\n }\r\n //Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped\r\n if (this.data.ty === 0 && !this.data.hd) {\r\n var cp = createNS( 'clipPath');\r\n var pt = createNS('path');\r\n pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');\r\n var clipId = createElementID();\r\n cp.setAttribute('id',clipId);\r\n cp.appendChild(pt);\r\n this.globalData.defs.appendChild(cp);\r\n\r\n if (this.checkMasks()) {\r\n var cpGroup = createNS('g');\r\n cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');\r\n cpGroup.appendChild(this.layerElement);\r\n this.transformedElement = cpGroup;\r\n if (layerElementParent) {\r\n layerElementParent.appendChild(this.transformedElement);\r\n } else {\r\n this.baseElement = this.transformedElement;\r\n }\r\n } else {\r\n this.layerElement.setAttribute('clip-path','url(' + locationHref + '#'+clipId+')');\r\n }\r\n \r\n }\r\n if (this.data.bm !== 0) {\r\n this.setBlendMode();\r\n }\r\n\r\n },\r\n renderElement: function() {\r\n if (this.finalTransform._matMdf) {\r\n this.transformedElement.setAttribute('transform', this.finalTransform.mat.to2dCSS());\r\n }\r\n if (this.finalTransform._opMdf) {\r\n this.transformedElement.setAttribute('opacity', this.finalTransform.mProp.o.v);\r\n }\r\n },\r\n destroyBaseElement: function() {\r\n this.layerElement = null;\r\n this.matteElement = null;\r\n this.maskManager.destroy();\r\n },\r\n getBaseElement: function() {\r\n if (this.data.hd) {\r\n return null;\r\n }\r\n return this.baseElement;\r\n },\r\n createRenderableComponents: function() {\r\n this.maskManager = new MaskElement(this.data, this, this.globalData);\r\n this.renderableEffectsManager = new SVGEffects(this);\r\n },\r\n setMatte: function(id) {\r\n if (!this.matteElement) {\r\n return;\r\n }\r\n this.matteElement.setAttribute(\"mask\", \"url(\" + locationHref + \"#\" + id + \")\");\r\n }\r\n};\r\nfunction IShapeElement(){\r\n}\r\n\r\nIShapeElement.prototype = {\r\n addShapeToModifiers: function(data) {\r\n var i, len = this.shapeModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n this.shapeModifiers[i].addShape(data);\r\n }\r\n },\r\n isShapeInAnimatedModifiers: function(data) {\r\n var i = 0, len = this.shapeModifiers.length;\r\n while(i < len) {\r\n if(this.shapeModifiers[i].isAnimatedWithShape(data)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n renderModifiers: function() {\r\n if(!this.shapeModifiers.length){\r\n return;\r\n }\r\n var i, len = this.shapes.length;\r\n for(i=0;i<len;i+=1){\r\n this.shapes[i].sh.reset();\r\n }\r\n\r\n len = this.shapeModifiers.length;\r\n for(i=len-1;i>=0;i-=1){\r\n this.shapeModifiers[i].processShapes(this._isFirstFrame);\r\n }\r\n },\r\n lcEnum: {\r\n '1': 'butt',\r\n '2': 'round',\r\n '3': 'square'\r\n },\r\n ljEnum: {\r\n '1': 'miter',\r\n '2': 'round',\r\n '3': 'bevel'\r\n },\r\n searchProcessedElement: function(elem){\r\n var elements = this.processedElements;\r\n var i = 0, len = elements.length;\r\n while (i < len) {\r\n if (elements[i].elem === elem) {\r\n return elements[i].pos;\r\n }\r\n i += 1;\r\n }\r\n return 0;\r\n },\r\n addProcessedElement: function(elem, pos){\r\n var elements = this.processedElements;\r\n var i = elements.length;\r\n while(i) {\r\n i -= 1;\r\n if (elements[i].elem === elem) {\r\n elements[i].pos = pos;\r\n return;\r\n }\r\n }\r\n elements.push(new ProcessedElement(elem, pos));\r\n },\r\n prepareFrame: function(num) {\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n }\r\n};\r\nfunction ITextElement(){\r\n}\r\n\r\nITextElement.prototype.initElement = function(data,globalData,comp){\r\n this.lettersChangedFlag = true;\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.textProperty = new TextProperty(this, data.t, this.dynamicProperties);\r\n this.textAnimator = new TextAnimatorProperty(data.t, this.renderType, this);\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n this.initRenderable();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n this.createContent();\r\n this.hide();\r\n this.textAnimator.searchProperties(this.dynamicProperties);\r\n};\r\n\r\nITextElement.prototype.prepareFrame = function(num) {\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n if(this.textProperty._mdf || this.textProperty._isFirstFrame) {\r\n this.buildNewText();\r\n this.textProperty._isFirstFrame = false;\r\n this.textProperty._mdf = false;\r\n }\r\n};\r\n\r\nITextElement.prototype.createPathShape = function(matrixHelper, shapes) {\r\n var j,jLen = shapes.length;\r\n var k, kLen, pathNodes;\r\n var shapeStr = '';\r\n for(j=0;j<jLen;j+=1){\r\n pathNodes = shapes[j].ks.k;\r\n shapeStr += buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);\r\n }\r\n return shapeStr;\r\n};\r\n\r\nITextElement.prototype.updateDocumentData = function(newData, index) {\r\n this.textProperty.updateDocumentData(newData, index);\r\n};\r\n\r\nITextElement.prototype.canResizeFont = function(_canResize) {\r\n this.textProperty.canResizeFont(_canResize);\r\n};\r\n\r\nITextElement.prototype.setMinimumFontSize = function(_fontSize) {\r\n this.textProperty.setMinimumFontSize(_fontSize);\r\n};\r\n\r\nITextElement.prototype.applyTextPropertiesToMatrix = function(documentData, matrixHelper, lineNumber, xPos, yPos) {\r\n if(documentData.ps){\r\n matrixHelper.translate(documentData.ps[0],documentData.ps[1] + documentData.ascent,0);\r\n }\r\n matrixHelper.translate(0,-documentData.ls,0);\r\n switch(documentData.j){\r\n case 1:\r\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]),0,0);\r\n break;\r\n case 2:\r\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber] )/2,0,0);\r\n break;\r\n }\r\n matrixHelper.translate(xPos, yPos, 0);\r\n};\r\n\r\n\r\nITextElement.prototype.buildColor = function(colorData) {\r\n return 'rgb(' + Math.round(colorData[0]*255) + ',' + Math.round(colorData[1]*255) + ',' + Math.round(colorData[2]*255) + ')';\r\n};\r\n\r\nITextElement.prototype.emptyProp = new LetterProps();\r\n\r\nITextElement.prototype.destroy = function(){\r\n \r\n};\r\nfunction ICompElement(){}\r\n\r\nextendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement, RenderableDOMElement], ICompElement);\r\n\r\nICompElement.prototype.initElement = function(data,globalData,comp) {\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.initTransform(data, globalData, comp);\r\n this.initRenderable();\r\n this.initHierarchy();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n if(this.data.xt || !globalData.progressiveLoad){\r\n this.buildAllItems();\r\n }\r\n this.hide();\r\n};\r\n\r\n/*ICompElement.prototype.hide = function(){\r\n if(!this.hidden){\r\n this.hideElement();\r\n var i,len = this.elements.length;\r\n for( i = 0; i < len; i+=1 ){\r\n if(this.elements[i]){\r\n this.elements[i].hide();\r\n }\r\n }\r\n }\r\n};*/\r\n\r\nICompElement.prototype.prepareFrame = function(num){\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n if(!this.isInRange && !this.data.xt){\r\n return;\r\n }\r\n\r\n if (!this.tm._placeholder) {\r\n var timeRemapped = this.tm.v;\r\n if(timeRemapped === this.data.op){\r\n timeRemapped = this.data.op - 1;\r\n }\r\n this.renderedFrame = timeRemapped;\r\n } else {\r\n this.renderedFrame = num/this.data.sr;\r\n }\r\n var i,len = this.elements.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(this.renderedFrame);\r\n }\r\n //This iteration needs to be backwards because of how expressions connect between each other\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(this.renderedFrame - this.layers[i].st);\r\n if(this.elements[i]._mdf) {\r\n this._mdf = true;\r\n }\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.renderInnerContent = function() {\r\n var i,len = this.layers.length;\r\n for( i = 0; i < len; i += 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.setElements = function(elems){\r\n this.elements = elems;\r\n};\r\n\r\nICompElement.prototype.getElements = function(){\r\n return this.elements;\r\n};\r\n\r\nICompElement.prototype.destroyElements = function(){\r\n var i,len = this.layers.length;\r\n for( i = 0; i < len; i+=1 ){\r\n if(this.elements[i]){\r\n this.elements[i].destroy();\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.destroy = function(){\r\n this.destroyElements();\r\n this.destroyBaseElement();\r\n};\r\n\r\nfunction IImageElement(data,globalData,comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.initElement(data,globalData,comp);\r\n this.sourceRect = {top:0,left:0,width:this.assetData.w,height:this.assetData.h};\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement], IImageElement);\r\n\r\nIImageElement.prototype.createContent = function(){\r\n\r\n var assetPath = this.globalData.getAssetsPath(this.assetData);\r\n\r\n this.innerElem = createNS('image');\r\n this.innerElem.setAttribute('width',this.assetData.w+\"px\");\r\n this.innerElem.setAttribute('height',this.assetData.h+\"px\");\r\n this.innerElem.setAttribute('preserveAspectRatio',this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio);\r\n this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);\r\n \r\n this.layerElement.appendChild(this.innerElem);\r\n};\r\n\r\nIImageElement.prototype.sourceRectAtTime = function() {\r\n\treturn this.sourceRect;\r\n}\r\nfunction ISolidElement(data,globalData,comp){\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([IImageElement], ISolidElement);\r\n\r\nISolidElement.prototype.createContent = function(){\r\n\r\n var rect = createNS('rect');\r\n ////rect.style.width = this.data.sw;\r\n ////rect.style.height = this.data.sh;\r\n ////rect.style.fill = this.data.sc;\r\n rect.setAttribute('width',this.data.sw);\r\n rect.setAttribute('height',this.data.sh);\r\n rect.setAttribute('fill',this.data.sc);\r\n this.layerElement.appendChild(rect);\r\n};\r\nfunction SVGCompElement(data,globalData,comp){\r\n this.layers = data.layers;\r\n this.supports3d = true;\r\n this.completeLayers = false;\r\n this.pendingElements = [];\r\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\r\n //this.layerElement = createNS('g');\r\n this.initElement(data,globalData,comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([SVGRenderer, ICompElement, SVGBaseElement], SVGCompElement);\r\nfunction SVGTextElement(data,globalData,comp){\r\n this.textSpans = [];\r\n this.renderType = 'svg';\r\n this.initElement(data,globalData,comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], SVGTextElement);\r\n\r\nSVGTextElement.prototype.createContent = function(){\r\n\r\n if (this.data.singleShape && !this.globalData.fontManager.chars) {\r\n this.textContainer = createNS('text');\r\n }\r\n};\r\n\r\nSVGTextElement.prototype.buildTextContents = function(textArray) {\r\n var i = 0, len = textArray.length;\r\n var textContents = [], currentTextContent = '';\r\n while (i < len) {\r\n if(textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) {\r\n textContents.push(currentTextContent);\r\n currentTextContent = '';\r\n } else {\r\n currentTextContent += textArray[i];\r\n }\r\n i += 1;\r\n }\r\n textContents.push(currentTextContent);\r\n return textContents;\r\n}\r\n\r\nSVGTextElement.prototype.buildNewText = function(){\r\n var i, len;\r\n\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0);\r\n if(documentData.fc) {\r\n this.layerElement.setAttribute('fill', this.buildColor(documentData.fc));\r\n }else{\r\n this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)');\r\n }\r\n if(documentData.sc){\r\n this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc));\r\n this.layerElement.setAttribute('stroke-width', documentData.sw);\r\n }\r\n this.layerElement.setAttribute('font-size', documentData.finalSize);\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n if(fontData.fClass){\r\n this.layerElement.setAttribute('class',fontData.fClass);\r\n } else {\r\n this.layerElement.setAttribute('font-family', fontData.fFamily);\r\n var fWeight = documentData.fWeight, fStyle = documentData.fStyle;\r\n this.layerElement.setAttribute('font-style', fStyle);\r\n this.layerElement.setAttribute('font-weight', fWeight);\r\n }\r\n this.layerElement.setAttribute('aria-label', documentData.t);\r\n\r\n var letters = documentData.l || [];\r\n var usesGlyphs = !!this.globalData.fontManager.chars;\r\n len = letters.length;\r\n\r\n var tSpan;\r\n var matrixHelper = this.mHelper;\r\n var shapes, shapeStr = '', singleShape = this.data.singleShape;\r\n var xPos = 0, yPos = 0, firstLine = true;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n if(singleShape && !usesGlyphs && !documentData.sz) {\r\n var tElement = this.textContainer;\r\n var justify = 'start';\r\n switch(documentData.j) {\r\n case 1:\r\n justify = 'end';\r\n break;\r\n case 2:\r\n justify = 'middle';\r\n break;\r\n }\r\n tElement.setAttribute('text-anchor',justify);\r\n tElement.setAttribute('letter-spacing',trackingOffset);\r\n var textContent = this.buildTextContents(documentData.finalText);\r\n len = textContent.length;\r\n yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;\r\n for ( i = 0; i < len; i += 1) {\r\n tSpan = this.textSpans[i] || createNS('tspan');\r\n tSpan.textContent = textContent[i];\r\n tSpan.setAttribute('x', 0);\r\n tSpan.setAttribute('y', yPos);\r\n tSpan.style.display = 'inherit';\r\n tElement.appendChild(tSpan);\r\n this.textSpans[i] = tSpan;\r\n yPos += documentData.finalLineHeight;\r\n }\r\n \r\n this.layerElement.appendChild(tElement);\r\n } else {\r\n var cachedSpansLength = this.textSpans.length;\r\n var shapeData, charData;\r\n for (i = 0; i < len; i += 1) {\r\n if(!usesGlyphs || !singleShape || i === 0){\r\n tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text');\r\n if (cachedSpansLength <= i) {\r\n tSpan.setAttribute('stroke-linecap', 'butt');\r\n tSpan.setAttribute('stroke-linejoin','round');\r\n tSpan.setAttribute('stroke-miterlimit','4');\r\n this.textSpans[i] = tSpan;\r\n this.layerElement.appendChild(tSpan);\r\n }\r\n tSpan.style.display = 'inherit';\r\n }\r\n \r\n matrixHelper.reset();\r\n matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100);\r\n if (singleShape) {\r\n if(letters[i].n) {\r\n xPos = -trackingOffset;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n firstLine = false;\r\n }\r\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\r\n xPos += letters[i].l || 0;\r\n //xPos += letters[i].val === ' ' ? 0 : trackingOffset;\r\n xPos += trackingOffset;\r\n }\r\n if(usesGlyphs) {\r\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n shapeData = charData && charData.data || {};\r\n shapes = shapeData.shapes ? shapeData.shapes[0].it : [];\r\n if(!singleShape){\r\n tSpan.setAttribute('d',this.createPathShape(matrixHelper,shapes));\r\n } else {\r\n shapeStr += this.createPathShape(matrixHelper,shapes);\r\n }\r\n } else {\r\n if(singleShape) {\r\n tSpan.setAttribute(\"transform\", \"translate(\" + matrixHelper.props[12] + \",\" + matrixHelper.props[13] + \")\");\r\n }\r\n tSpan.textContent = letters[i].val;\r\n tSpan.setAttributeNS(\"http://www.w3.org/XML/1998/namespace\", \"xml:space\",\"preserve\");\r\n }\r\n //\r\n }\r\n if (singleShape && tSpan) {\r\n tSpan.setAttribute('d',shapeStr);\r\n }\r\n }\r\n while (i < this.textSpans.length){\r\n this.textSpans[i].style.display = 'none';\r\n i += 1;\r\n }\r\n \r\n this._sizeChanged = true;\r\n};\r\n\r\nSVGTextElement.prototype.sourceRectAtTime = function(time){\r\n this.prepareFrame(this.comp.renderedFrame - this.data.st);\r\n this.renderInnerContent();\r\n if(this._sizeChanged){\r\n this._sizeChanged = false;\r\n var textBox = this.layerElement.getBBox();\r\n this.bbox = {\r\n top: textBox.y,\r\n left: textBox.x,\r\n width: textBox.width,\r\n height: textBox.height\r\n };\r\n }\r\n return this.bbox;\r\n};\r\n\r\nSVGTextElement.prototype.renderInnerContent = function(){\r\n\r\n if(!this.data.singleShape){\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n if(this.lettersChangedFlag || this.textAnimator.lettersChangedFlag){\r\n this._sizeChanged = true;\r\n var i,len;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter, textSpan;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n continue;\r\n }\r\n renderedLetter = renderedLetters[i];\r\n textSpan = this.textSpans[i];\r\n if(renderedLetter._mdf.m) {\r\n textSpan.setAttribute('transform',renderedLetter.m);\r\n }\r\n if(renderedLetter._mdf.o) {\r\n textSpan.setAttribute('opacity',renderedLetter.o);\r\n }\r\n if(renderedLetter._mdf.sw){\r\n textSpan.setAttribute('stroke-width',renderedLetter.sw);\r\n }\r\n if(renderedLetter._mdf.sc){\r\n textSpan.setAttribute('stroke',renderedLetter.sc);\r\n }\r\n if(renderedLetter._mdf.fc){\r\n textSpan.setAttribute('fill',renderedLetter.fc);\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nfunction SVGShapeElement(data,globalData,comp){\r\n //List of drawable elements\r\n this.shapes = [];\r\n // Full shape data\r\n this.shapesData = data.shapes;\r\n //List of styles that will be applied to shapes\r\n this.stylesList = [];\r\n //List of modifiers that will be applied to shapes\r\n this.shapeModifiers = [];\r\n //List of items in shape tree\r\n this.itemsData = [];\r\n //List of items in previous shape tree\r\n this.processedElements = [];\r\n // List of animated components\r\n this.animatedContents = [];\r\n this.initElement(data,globalData,comp);\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n // List of elements that have been created\r\n this.prevViewData = [];\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement], SVGShapeElement);\r\n\r\nSVGShapeElement.prototype.initSecondaryElement = function() {\r\n};\r\n\r\nSVGShapeElement.prototype.identityMatrix = new Matrix();\r\n\r\nSVGShapeElement.prototype.buildExpressionInterface = function(){};\r\n\r\nSVGShapeElement.prototype.createContent = function(){\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);\r\n this.filterUniqueShapes();\r\n};\r\n\r\n/*\r\nThis method searches for multiple shapes that affect a single element and one of them is animated\r\n*/\r\nSVGShapeElement.prototype.filterUniqueShapes = function(){\r\n var i, len = this.shapes.length, shape;\r\n var j, jLen = this.stylesList.length;\r\n var style, count = 0;\r\n var tempShapes = [];\r\n var areAnimated = false;\r\n for(j = 0; j < jLen; j += 1) {\r\n style = this.stylesList[j];\r\n areAnimated = false;\r\n tempShapes.length = 0;\r\n for(i = 0; i < len; i += 1) {\r\n shape = this.shapes[i];\r\n if(shape.styles.indexOf(style) !== -1) {\r\n tempShapes.push(shape);\r\n areAnimated = shape._isAnimated || areAnimated;\r\n }\r\n }\r\n if(tempShapes.length > 1 && areAnimated) {\r\n this.setShapesAsAnimated(tempShapes);\r\n }\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.setShapesAsAnimated = function(shapes){\r\n var i, len = shapes.length;\r\n for(i = 0; i < len; i += 1) {\r\n shapes[i].setAsAnimated();\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.createStyleElement = function(data, level){\r\n //TODO: prevent drawing of hidden styles\r\n var elementData;\r\n var styleOb = new SVGStyleData(data, level);\r\n\r\n var pathElement = styleOb.pElem;\r\n if(data.ty === 'st') {\r\n elementData = new SVGStrokeStyleData(this, data, styleOb);\r\n } else if(data.ty === 'fl') {\r\n elementData = new SVGFillStyleData(this, data, styleOb);\r\n } else if(data.ty === 'gf' || data.ty === 'gs') {\r\n var gradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData;\r\n elementData = new gradientConstructor(this, data, styleOb);\r\n this.globalData.defs.appendChild(elementData.gf);\r\n if (elementData.maskId) {\r\n this.globalData.defs.appendChild(elementData.ms);\r\n this.globalData.defs.appendChild(elementData.of);\r\n pathElement.setAttribute('mask','url(' + locationHref + '#' + elementData.maskId + ')');\r\n }\r\n }\r\n \r\n if(data.ty === 'st' || data.ty === 'gs') {\r\n pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');\r\n pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');\r\n pathElement.setAttribute('fill-opacity','0');\r\n if(data.lj === 1) {\r\n pathElement.setAttribute('stroke-miterlimit',data.ml);\r\n }\r\n }\r\n\r\n if(data.r === 2) {\r\n pathElement.setAttribute('fill-rule', 'evenodd');\r\n }\r\n\r\n if(data.ln){\r\n pathElement.setAttribute('id',data.ln);\r\n }\r\n if(data.cl){\r\n pathElement.setAttribute('class',data.cl);\r\n }\r\n if(data.bm){\r\n pathElement.style['mix-blend-mode'] = getBlendMode(data.bm);\r\n }\r\n this.stylesList.push(styleOb);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createGroupElement = function(data) {\r\n var elementData = new ShapeGroupData();\r\n if(data.ln){\r\n elementData.gr.setAttribute('id',data.ln);\r\n }\r\n if(data.cl){\r\n elementData.gr.setAttribute('class',data.cl);\r\n }\r\n if(data.bm){\r\n elementData.gr.style['mix-blend-mode'] = getBlendMode(data.bm);\r\n }\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createTransformElement = function(data, container) {\r\n var transformProperty = TransformPropertyFactory.getTransformProperty(this,data,this);\r\n var elementData = new SVGTransformData(transformProperty, transformProperty.o, container);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createShapeElement = function(data, ownTransformers, level) {\r\n var ty = 4;\r\n if(data.ty === 'rc'){\r\n ty = 5;\r\n }else if(data.ty === 'el'){\r\n ty = 6;\r\n }else if(data.ty === 'sr'){\r\n ty = 7;\r\n }\r\n var shapeProperty = ShapePropertyFactory.getShapeProp(this,data,ty,this);\r\n var elementData = new SVGShapeData(ownTransformers, level, shapeProperty);\r\n this.shapes.push(elementData);\r\n this.addShapeToModifiers(elementData);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.addToAnimatedContents = function(data, element) {\r\n var i = 0, len = this.animatedContents.length;\r\n while(i < len) {\r\n if(this.animatedContents[i].element === element) {\r\n return;\r\n }\r\n i += 1;\r\n }\r\n this.animatedContents.push({\r\n fn: SVGElementsRenderer.createRenderFunction(data),\r\n element: element,\r\n data: data\r\n });\r\n};\r\n\r\nSVGShapeElement.prototype.setElementStyles = function(elementData){\r\n var arr = elementData.styles;\r\n var j, jLen = this.stylesList.length;\r\n for (j = 0; j < jLen; j += 1) {\r\n if (!this.stylesList[j].closed) {\r\n arr.push(this.stylesList[j]);\r\n }\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.reloadShapes = function(){\r\n this._isFirstFrame = true;\r\n var i, len = this.itemsData.length;\r\n for( i = 0; i < len; i += 1) {\r\n this.prevViewData[i] = this.itemsData[i];\r\n }\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);\r\n this.filterUniqueShapes();\r\n len = this.dynamicProperties.length;\r\n for(i = 0; i < len; i += 1) {\r\n this.dynamicProperties[i].getValue();\r\n }\r\n this.renderModifiers();\r\n};\r\n\r\nSVGShapeElement.prototype.searchShapes = function(arr,itemsData,prevViewData,container, level, transformers, render){\r\n var ownTransformers = [].concat(transformers);\r\n var i, len = arr.length - 1;\r\n var j, jLen;\r\n var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;\r\n for(i=len;i>=0;i-=1){\r\n processedPos = this.searchProcessedElement(arr[i]);\r\n if(!processedPos){\r\n arr[i]._render = render;\r\n } else {\r\n itemsData[i] = prevViewData[processedPos - 1];\r\n }\r\n if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){\r\n if(!processedPos){\r\n itemsData[i] = this.createStyleElement(arr[i], level);\r\n } else {\r\n itemsData[i].style.closed = false;\r\n }\r\n if(arr[i]._render){\r\n container.appendChild(itemsData[i].style.pElem);\r\n }\r\n ownStyles.push(itemsData[i].style);\r\n }else if(arr[i].ty == 'gr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createGroupElement(arr[i]);\r\n } else {\r\n jLen = itemsData[i].it.length;\r\n for(j=0;j<jLen;j+=1){\r\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\r\n }\r\n }\r\n this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr, level + 1, ownTransformers, render);\r\n if(arr[i]._render){\r\n container.appendChild(itemsData[i].gr);\r\n }\r\n }else if(arr[i].ty == 'tr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createTransformElement(arr[i], container);\r\n }\r\n currentTransform = itemsData[i].transform;\r\n ownTransformers.push(currentTransform);\r\n }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level);\r\n }\r\n this.setElementStyles(itemsData[i]);\r\n\r\n }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n modifier.init(this,arr[i]);\r\n itemsData[i] = modifier;\r\n this.shapeModifiers.push(modifier);\r\n } else {\r\n modifier = itemsData[i];\r\n modifier.closed = false;\r\n }\r\n ownModifiers.push(modifier);\r\n }else if(arr[i].ty == 'rp'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n itemsData[i] = modifier;\r\n modifier.init(this,arr,i,itemsData);\r\n this.shapeModifiers.push(modifier);\r\n render = false;\r\n }else{\r\n modifier = itemsData[i];\r\n modifier.closed = true;\r\n }\r\n ownModifiers.push(modifier);\r\n }\r\n this.addProcessedElement(arr[i], i + 1);\r\n }\r\n len = ownStyles.length;\r\n for(i=0;i<len;i+=1){\r\n ownStyles[i].closed = true;\r\n }\r\n len = ownModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n ownModifiers[i].closed = true;\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.renderInnerContent = function() {\r\n this.renderModifiers();\r\n var i, len = this.stylesList.length;\r\n for(i=0;i<len;i+=1){\r\n this.stylesList[i].reset();\r\n }\r\n this.renderShape();\r\n\r\n for (i = 0; i < len; i += 1) {\r\n if (this.stylesList[i]._mdf || this._isFirstFrame) {\r\n if(this.stylesList[i].msElem){\r\n this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);\r\n //Adding M0 0 fixes same mask bug on all browsers\r\n this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;\r\n }\r\n this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');\r\n }\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.renderShape = function() {\r\n var i, len = this.animatedContents.length;\r\n var animatedContent;\r\n for(i = 0; i < len; i += 1) {\r\n animatedContent = this.animatedContents[i];\r\n if((this._isFirstFrame || animatedContent.element._isAnimated) && animatedContent.data !== true) {\r\n animatedContent.fn(animatedContent.data, animatedContent.element, this._isFirstFrame);\r\n }\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.destroy = function(){\r\n this.destroyBaseElement();\r\n this.shapesData = null;\r\n this.itemsData = null;\r\n};\r\n\r\nfunction SVGTintFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');\r\n feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f1');\r\n filter.appendChild(feColorMatrix);\r\n feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f2');\r\n filter.appendChild(feColorMatrix);\r\n this.matrixFilter = feColorMatrix;\r\n if(filterManager.effectElements[2].p.v !== 100 || filterManager.effectElements[2].p.k){\r\n var feMerge = createNS('feMerge');\r\n filter.appendChild(feMerge);\r\n var feMergeNode;\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','SourceGraphic');\r\n feMerge.appendChild(feMergeNode);\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','f2');\r\n feMerge.appendChild(feMergeNode);\r\n }\r\n}\r\n\r\nSVGTintFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var colorBlack = this.filterManager.effectElements[0].p.v;\r\n var colorWhite = this.filterManager.effectElements[1].p.v;\r\n var opacity = this.filterManager.effectElements[2].p.v/100;\r\n this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');\r\n }\r\n};\r\nfunction SVGFillFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\r\n filter.appendChild(feColorMatrix);\r\n this.matrixFilter = feColorMatrix;\r\n}\r\nSVGFillFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var color = this.filterManager.effectElements[2].p.v;\r\n var opacity = this.filterManager.effectElements[6].p.v;\r\n this.matrixFilter.setAttribute('values','0 0 0 0 '+color[0]+' 0 0 0 0 '+color[1]+' 0 0 0 0 '+color[2]+' 0 0 0 '+opacity+' 0');\r\n }\r\n};\r\nfunction SVGGaussianBlurEffect(filter, filterManager){\r\n // Outset the filter region by 100% on all sides to accommodate blur expansion.\r\n filter.setAttribute('x','-100%');\r\n filter.setAttribute('y','-100%');\r\n filter.setAttribute('width','300%');\r\n filter.setAttribute('height','300%');\r\n\r\n this.filterManager = filterManager;\r\n var feGaussianBlur = createNS('feGaussianBlur');\r\n filter.appendChild(feGaussianBlur);\r\n this.feGaussianBlur = feGaussianBlur;\r\n}\r\n\r\nSVGGaussianBlurEffect.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n // Empirical value, matching AE's blur appearance.\r\n var kBlurrinessToSigma = 0.3;\r\n var sigma = this.filterManager.effectElements[0].p.v * kBlurrinessToSigma;\r\n\r\n // Dimensions mapping:\r\n //\r\n // 1 -> horizontal & vertical\r\n // 2 -> horizontal only\r\n // 3 -> vertical only\r\n //\r\n var dimensions = this.filterManager.effectElements[1].p.v;\r\n var sigmaX = (dimensions == 3) ? 0 : sigma;\r\n var sigmaY = (dimensions == 2) ? 0 : sigma;\r\n\r\n this.feGaussianBlur.setAttribute('stdDeviation', sigmaX + \" \" + sigmaY);\r\n\r\n // Repeat edges mapping:\r\n //\r\n // 0 -> off -> duplicate\r\n // 1 -> on -> wrap\r\n var edgeMode = (this.filterManager.effectElements[2].p.v == 1) ? 'wrap' : 'duplicate';\r\n this.feGaussianBlur.setAttribute('edgeMode', edgeMode);\r\n }\r\n}\r\nfunction SVGStrokeEffect(elem, filterManager){\r\n this.initialized = false;\r\n this.filterManager = filterManager;\r\n this.elem = elem;\r\n this.paths = [];\r\n}\r\n\r\nSVGStrokeEffect.prototype.initialize = function(){\r\n\r\n var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\r\n var path,groupPath, i, len;\r\n if(this.filterManager.effectElements[1].p.v === 1){\r\n len = this.elem.maskManager.masksProperties.length;\r\n i = 0;\r\n } else {\r\n i = this.filterManager.effectElements[0].p.v - 1;\r\n len = i + 1;\r\n }\r\n groupPath = createNS('g'); \r\n groupPath.setAttribute('fill','none');\r\n groupPath.setAttribute('stroke-linecap','round');\r\n groupPath.setAttribute('stroke-dashoffset',1);\r\n for(i;i<len;i+=1){\r\n path = createNS('path');\r\n groupPath.appendChild(path);\r\n this.paths.push({p:path,m:i});\r\n }\r\n if(this.filterManager.effectElements[10].p.v === 3){\r\n var mask = createNS('mask');\r\n var id = createElementID();\r\n mask.setAttribute('id',id);\r\n mask.setAttribute('mask-type','alpha');\r\n mask.appendChild(groupPath);\r\n this.elem.globalData.defs.appendChild(mask);\r\n var g = createNS('g');\r\n g.setAttribute('mask','url(' + locationHref + '#'+id+')');\r\n while (elemChildren[0]) {\r\n g.appendChild(elemChildren[0]);\r\n }\r\n this.elem.layerElement.appendChild(g);\r\n this.masker = mask;\r\n groupPath.setAttribute('stroke','#fff');\r\n } else if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){\r\n if(this.filterManager.effectElements[10].p.v === 2){\r\n elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\r\n while(elemChildren.length){\r\n this.elem.layerElement.removeChild(elemChildren[0]);\r\n }\r\n }\r\n this.elem.layerElement.appendChild(groupPath);\r\n this.elem.layerElement.removeAttribute('mask');\r\n groupPath.setAttribute('stroke','#fff');\r\n }\r\n this.initialized = true;\r\n this.pathMasker = groupPath;\r\n};\r\n\r\nSVGStrokeEffect.prototype.renderFrame = function(forceRender){\r\n if(!this.initialized){\r\n this.initialize();\r\n }\r\n var i, len = this.paths.length;\r\n var mask, path;\r\n for(i=0;i<len;i+=1){\r\n if(this.paths[i].m === -1) {\r\n continue;\r\n }\r\n mask = this.elem.maskManager.viewData[this.paths[i].m];\r\n path = this.paths[i].p;\r\n if(forceRender || this.filterManager._mdf || mask.prop._mdf){\r\n path.setAttribute('d',mask.lastPath);\r\n }\r\n if(forceRender || this.filterManager.effectElements[9].p._mdf || this.filterManager.effectElements[4].p._mdf || this.filterManager.effectElements[7].p._mdf || this.filterManager.effectElements[8].p._mdf || mask.prop._mdf){\r\n var dasharrayValue;\r\n if(this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100){\r\n var s = Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;\r\n var e = Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;\r\n var l = path.getTotalLength();\r\n dasharrayValue = '0 0 0 ' + l*s + ' ';\r\n var lineLength = l*(e-s);\r\n var segment = 1+this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;\r\n var units = Math.floor(lineLength/segment);\r\n var j;\r\n for(j=0;j<units;j+=1){\r\n dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100 + ' ';\r\n }\r\n dasharrayValue += '0 ' + l*10 + ' 0 0';\r\n } else {\r\n dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;\r\n }\r\n path.setAttribute('stroke-dasharray',dasharrayValue);\r\n }\r\n }\r\n if(forceRender || this.filterManager.effectElements[4].p._mdf){\r\n this.pathMasker.setAttribute('stroke-width',this.filterManager.effectElements[4].p.v*2);\r\n }\r\n \r\n if(forceRender || this.filterManager.effectElements[6].p._mdf){\r\n this.pathMasker.setAttribute('opacity',this.filterManager.effectElements[6].p.v);\r\n }\r\n if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){\r\n if(forceRender || this.filterManager.effectElements[3].p._mdf){\r\n var color = this.filterManager.effectElements[3].p.v;\r\n this.pathMasker.setAttribute('stroke','rgb('+bm_floor(color[0]*255)+','+bm_floor(color[1]*255)+','+bm_floor(color[2]*255)+')');\r\n }\r\n }\r\n};\r\nfunction SVGTritoneFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');\r\n feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f1');\r\n filter.appendChild(feColorMatrix);\r\n var feComponentTransfer = createNS('feComponentTransfer');\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n this.matrixFilter = feComponentTransfer;\r\n var feFuncR = createNS('feFuncR');\r\n feFuncR.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncR);\r\n this.feFuncR = feFuncR;\r\n var feFuncG = createNS('feFuncG');\r\n feFuncG.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncG);\r\n this.feFuncG = feFuncG;\r\n var feFuncB = createNS('feFuncB');\r\n feFuncB.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncB);\r\n this.feFuncB = feFuncB;\r\n}\r\n\r\nSVGTritoneFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var color1 = this.filterManager.effectElements[0].p.v;\r\n var color2 = this.filterManager.effectElements[1].p.v;\r\n var color3 = this.filterManager.effectElements[2].p.v;\r\n var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0];\r\n var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1];\r\n var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2];\r\n this.feFuncR.setAttribute('tableValues', tableR);\r\n this.feFuncG.setAttribute('tableValues', tableG);\r\n this.feFuncB.setAttribute('tableValues', tableB);\r\n //var opacity = this.filterManager.effectElements[2].p.v/100;\r\n //this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');\r\n }\r\n};\r\nfunction SVGProLevelsFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var effectElements = this.filterManager.effectElements;\r\n var feComponentTransfer = createNS('feComponentTransfer');\r\n var feFuncR, feFuncG, feFuncB;\r\n \r\n if(effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1){\r\n this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer);\r\n }\r\n if(effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1){\r\n this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer);\r\n }\r\n if(effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1){\r\n this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer);\r\n }\r\n if(effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1){\r\n this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer);\r\n }\r\n \r\n if(this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA){\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n feComponentTransfer = createNS('feComponentTransfer');\r\n }\r\n\r\n if(effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1){\r\n\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n this.feFuncRComposed = this.createFeFunc('feFuncR', feComponentTransfer);\r\n this.feFuncGComposed = this.createFeFunc('feFuncG', feComponentTransfer);\r\n this.feFuncBComposed = this.createFeFunc('feFuncB', feComponentTransfer);\r\n }\r\n}\r\n\r\nSVGProLevelsFilter.prototype.createFeFunc = function(type, feComponentTransfer) {\r\n var feFunc = createNS(type);\r\n feFunc.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFunc);\r\n return feFunc;\r\n};\r\n\r\nSVGProLevelsFilter.prototype.getTableValue = function(inputBlack, inputWhite, gamma, outputBlack, outputWhite) {\r\n var cnt = 0;\r\n var segments = 256;\r\n var perc;\r\n var min = Math.min(inputBlack, inputWhite);\r\n var max = Math.max(inputBlack, inputWhite);\r\n var table = Array.call(null,{length:segments});\r\n var colorValue;\r\n var pos = 0;\r\n var outputDelta = outputWhite - outputBlack; \r\n var inputDelta = inputWhite - inputBlack; \r\n while(cnt <= 256) {\r\n perc = cnt/256;\r\n if(perc <= min){\r\n colorValue = inputDelta < 0 ? outputWhite : outputBlack;\r\n } else if(perc >= max){\r\n colorValue = inputDelta < 0 ? outputBlack : outputWhite;\r\n } else {\r\n colorValue = (outputBlack + outputDelta * Math.pow((perc - inputBlack) / inputDelta, 1 / gamma));\r\n }\r\n table[pos++] = colorValue;\r\n cnt += 256/(segments-1);\r\n }\r\n return table.join(' ');\r\n};\r\n\r\nSVGProLevelsFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var val, cnt, perc, bezier;\r\n var effectElements = this.filterManager.effectElements;\r\n if(this.feFuncRComposed && (forceRender || effectElements[3].p._mdf || effectElements[4].p._mdf || effectElements[5].p._mdf || effectElements[6].p._mdf || effectElements[7].p._mdf)){\r\n val = this.getTableValue(effectElements[3].p.v,effectElements[4].p.v,effectElements[5].p.v,effectElements[6].p.v,effectElements[7].p.v);\r\n this.feFuncRComposed.setAttribute('tableValues',val);\r\n this.feFuncGComposed.setAttribute('tableValues',val);\r\n this.feFuncBComposed.setAttribute('tableValues',val);\r\n }\r\n\r\n\r\n if(this.feFuncR && (forceRender || effectElements[10].p._mdf || effectElements[11].p._mdf || effectElements[12].p._mdf || effectElements[13].p._mdf || effectElements[14].p._mdf)){\r\n val = this.getTableValue(effectElements[10].p.v,effectElements[11].p.v,effectElements[12].p.v,effectElements[13].p.v,effectElements[14].p.v);\r\n this.feFuncR.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncG && (forceRender || effectElements[17].p._mdf || effectElements[18].p._mdf || effectElements[19].p._mdf || effectElements[20].p._mdf || effectElements[21].p._mdf)){\r\n val = this.getTableValue(effectElements[17].p.v,effectElements[18].p.v,effectElements[19].p.v,effectElements[20].p.v,effectElements[21].p.v);\r\n this.feFuncG.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncB && (forceRender || effectElements[24].p._mdf || effectElements[25].p._mdf || effectElements[26].p._mdf || effectElements[27].p._mdf || effectElements[28].p._mdf)){\r\n val = this.getTableValue(effectElements[24].p.v,effectElements[25].p.v,effectElements[26].p.v,effectElements[27].p.v,effectElements[28].p.v);\r\n this.feFuncB.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncA && (forceRender || effectElements[31].p._mdf || effectElements[32].p._mdf || effectElements[33].p._mdf || effectElements[34].p._mdf || effectElements[35].p._mdf)){\r\n val = this.getTableValue(effectElements[31].p.v,effectElements[32].p.v,effectElements[33].p.v,effectElements[34].p.v,effectElements[35].p.v);\r\n this.feFuncA.setAttribute('tableValues',val);\r\n }\r\n \r\n }\r\n};\r\nfunction SVGDropShadowEffect(filter, filterManager){\r\n filter.setAttribute('x','-100%');\r\n filter.setAttribute('y','-100%');\r\n filter.setAttribute('width','400%');\r\n filter.setAttribute('height','400%');\r\n this.filterManager = filterManager;\r\n\r\n var feGaussianBlur = createNS('feGaussianBlur');\r\n feGaussianBlur.setAttribute('in','SourceAlpha');\r\n feGaussianBlur.setAttribute('result','drop_shadow_1');\r\n feGaussianBlur.setAttribute('stdDeviation','0');\r\n this.feGaussianBlur = feGaussianBlur;\r\n filter.appendChild(feGaussianBlur);\r\n\r\n var feOffset = createNS('feOffset');\r\n feOffset.setAttribute('dx','25');\r\n feOffset.setAttribute('dy','0');\r\n feOffset.setAttribute('in','drop_shadow_1');\r\n feOffset.setAttribute('result','drop_shadow_2');\r\n this.feOffset = feOffset;\r\n filter.appendChild(feOffset);\r\n var feFlood = createNS('feFlood');\r\n feFlood.setAttribute('flood-color','#00ff00');\r\n feFlood.setAttribute('flood-opacity','1');\r\n feFlood.setAttribute('result','drop_shadow_3');\r\n this.feFlood = feFlood;\r\n filter.appendChild(feFlood);\r\n\r\n var feComposite = createNS('feComposite');\r\n feComposite.setAttribute('in','drop_shadow_3');\r\n feComposite.setAttribute('in2','drop_shadow_2');\r\n feComposite.setAttribute('operator','in');\r\n feComposite.setAttribute('result','drop_shadow_4');\r\n filter.appendChild(feComposite);\r\n\r\n\r\n var feMerge = createNS('feMerge');\r\n filter.appendChild(feMerge);\r\n var feMergeNode;\r\n feMergeNode = createNS('feMergeNode');\r\n feMerge.appendChild(feMergeNode);\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','SourceGraphic');\r\n this.feMergeNode = feMergeNode;\r\n this.feMerge = feMerge;\r\n this.originalNodeAdded = false;\r\n feMerge.appendChild(feMergeNode);\r\n}\r\n\r\nSVGDropShadowEffect.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n if(forceRender || this.filterManager.effectElements[4].p._mdf){\r\n this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);\r\n }\r\n if(forceRender || this.filterManager.effectElements[0].p._mdf){\r\n var col = this.filterManager.effectElements[0].p.v;\r\n this.feFlood.setAttribute('flood-color',rgbToHex(Math.round(col[0]*255),Math.round(col[1]*255),Math.round(col[2]*255)));\r\n }\r\n if(forceRender || this.filterManager.effectElements[1].p._mdf){\r\n this.feFlood.setAttribute('flood-opacity',this.filterManager.effectElements[1].p.v/255);\r\n }\r\n if(forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf){\r\n var distance = this.filterManager.effectElements[3].p.v;\r\n var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads;\r\n var x = distance * Math.cos(angle);\r\n var y = distance * Math.sin(angle);\r\n this.feOffset.setAttribute('dx', x);\r\n this.feOffset.setAttribute('dy', y);\r\n }\r\n /*if(forceRender || this.filterManager.effectElements[5].p._mdf){\r\n if(this.filterManager.effectElements[5].p.v === 1 && this.originalNodeAdded) {\r\n this.feMerge.removeChild(this.feMergeNode);\r\n this.originalNodeAdded = false;\r\n } else if(this.filterManager.effectElements[5].p.v === 0 && !this.originalNodeAdded) {\r\n this.feMerge.appendChild(this.feMergeNode);\r\n this.originalNodeAdded = true;\r\n }\r\n }*/\r\n }\r\n};\r\nvar _svgMatteSymbols = [];\r\n\r\nfunction SVGMatte3Effect(filterElem, filterManager, elem){\r\n this.initialized = false;\r\n this.filterManager = filterManager;\r\n this.filterElem = filterElem;\r\n this.elem = elem;\r\n elem.matteElement = createNS('g');\r\n elem.matteElement.appendChild(elem.layerElement);\r\n elem.matteElement.appendChild(elem.transformedElement);\r\n elem.baseElement = elem.matteElement;\r\n}\r\n\r\nSVGMatte3Effect.prototype.findSymbol = function(mask) {\r\n var i = 0, len = _svgMatteSymbols.length;\r\n while(i < len) {\r\n if(_svgMatteSymbols[i] === mask) {\r\n return _svgMatteSymbols[i];\r\n }\r\n i += 1;\r\n }\r\n return null;\r\n};\r\n\r\nSVGMatte3Effect.prototype.replaceInParent = function(mask, symbolId) {\r\n var parentNode = mask.layerElement.parentNode;\r\n if(!parentNode) {\r\n return;\r\n }\r\n var children = parentNode.children;\r\n var i = 0, len = children.length;\r\n while (i < len) {\r\n if (children[i] === mask.layerElement) {\r\n break;\r\n }\r\n i += 1;\r\n }\r\n var nextChild;\r\n if (i <= len - 2) {\r\n nextChild = children[i + 1];\r\n }\r\n var useElem = createNS('use');\r\n useElem.setAttribute('href', '#' + symbolId);\r\n if(nextChild) {\r\n parentNode.insertBefore(useElem, nextChild);\r\n } else {\r\n parentNode.appendChild(useElem);\r\n }\r\n};\r\n\r\nSVGMatte3Effect.prototype.setElementAsMask = function(elem, mask) {\r\n if(!this.findSymbol(mask)) {\r\n var symbolId = createElementID();\r\n var masker = createNS('mask');\r\n masker.setAttribute('id', mask.layerId);\r\n masker.setAttribute('mask-type', 'alpha');\r\n _svgMatteSymbols.push(mask);\r\n var defs = elem.globalData.defs;\r\n defs.appendChild(masker);\r\n var symbol = createNS('symbol');\r\n symbol.setAttribute('id', symbolId);\r\n this.replaceInParent(mask, symbolId);\r\n symbol.appendChild(mask.layerElement);\r\n defs.appendChild(symbol);\r\n var useElem = createNS('use');\r\n useElem.setAttribute('href', '#' + symbolId);\r\n masker.appendChild(useElem);\r\n mask.data.hd = false;\r\n mask.show();\r\n }\r\n elem.setMatte(mask.layerId);\r\n};\r\n\r\nSVGMatte3Effect.prototype.initialize = function() {\r\n var ind = this.filterManager.effectElements[0].p.v;\r\n var elements = this.elem.comp.elements;\r\n var i = 0, len = elements.length;\r\n while (i < len) {\r\n \tif (elements[i] && elements[i].data.ind === ind) {\r\n \t\tthis.setElementAsMask(this.elem, elements[i]);\r\n \t}\r\n \ti += 1;\r\n }\r\n this.initialized = true;\r\n};\r\n\r\nSVGMatte3Effect.prototype.renderFrame = function() {\r\n\tif(!this.initialized) {\r\n\t\tthis.initialize();\r\n\t}\r\n};\r\nfunction SVGEffects(elem){\r\n var i, len = elem.data.ef ? elem.data.ef.length : 0;\r\n var filId = createElementID();\r\n var fil = filtersFactory.createFilter(filId);\r\n var count = 0;\r\n this.filters = [];\r\n var filterManager;\r\n for(i=0;i<len;i+=1){\r\n filterManager = null;\r\n if(elem.data.ef[i].ty === 20){\r\n count += 1;\r\n filterManager = new SVGTintFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 21){\r\n count += 1;\r\n filterManager = new SVGFillFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 22){\r\n filterManager = new SVGStrokeEffect(elem, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 23){\r\n count += 1;\r\n filterManager = new SVGTritoneFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 24){\r\n count += 1;\r\n filterManager = new SVGProLevelsFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 25){\r\n count += 1;\r\n filterManager = new SVGDropShadowEffect(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 28){\r\n //count += 1;\r\n filterManager = new SVGMatte3Effect(fil, elem.effectsManager.effectElements[i], elem);\r\n }else if(elem.data.ef[i].ty === 29){\r\n count += 1;\r\n filterManager = new SVGGaussianBlurEffect(fil, elem.effectsManager.effectElements[i]);\r\n }\r\n if(filterManager) {\r\n this.filters.push(filterManager);\r\n }\r\n }\r\n if(count){\r\n elem.globalData.defs.appendChild(fil);\r\n elem.layerElement.setAttribute('filter','url(' + locationHref + '#'+filId+')');\r\n }\r\n if (this.filters.length) {\r\n elem.addRenderableComponent(this);\r\n }\r\n}\r\n\r\nSVGEffects.prototype.renderFrame = function(_isFirstFrame){\r\n var i, len = this.filters.length;\r\n for(i=0;i<len;i+=1){\r\n this.filters[i].renderFrame(_isFirstFrame);\r\n }\r\n};\r\nfunction CVContextData() {\r\n\tthis.saved = [];\r\n this.cArrPos = 0;\r\n this.cTr = new Matrix();\r\n this.cO = 1;\r\n var i, len = 15;\r\n this.savedOp = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n this.saved[i] = createTypedArray('float32', 16);\r\n }\r\n this._length = len;\r\n}\r\n\r\nCVContextData.prototype.duplicate = function() {\r\n\tvar newLength = this._length * 2;\r\n\tvar currentSavedOp = this.savedOp;\r\n this.savedOp = createTypedArray('float32', newLength);\r\n this.savedOp.set(currentSavedOp);\r\n var i = 0;\r\n for(i = this._length; i < newLength; i += 1) {\r\n this.saved[i] = createTypedArray('float32', 16);\r\n }\r\n this._length = newLength;\r\n};\r\n\r\nCVContextData.prototype.reset = function() {\r\n\tthis.cArrPos = 0;\r\n\tthis.cTr.reset();\r\n this.cO = 1;\r\n};\r\nfunction CVBaseElement(){\r\n}\r\n\r\nCVBaseElement.prototype = {\r\n createElements: function(){},\r\n initRendererElement: function(){},\r\n createContainerElements: function(){\r\n this.canvasContext = this.globalData.canvasContext;\r\n this.renderableEffectsManager = new CVEffects(this);\r\n },\r\n createContent: function(){},\r\n setBlendMode: function(){\r\n var globalData = this.globalData;\r\n if(globalData.blendMode !== this.data.bm) {\r\n globalData.blendMode = this.data.bm;\r\n var blendModeValue = getBlendMode(this.data.bm);\r\n globalData.canvasContext.globalCompositeOperation = blendModeValue;\r\n }\r\n },\r\n createRenderableComponents: function(){\r\n this.maskManager = new CVMaskElement(this.data, this);\r\n },\r\n hideElement: function(){\r\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\r\n this.hidden = true;\r\n }\r\n },\r\n showElement: function(){\r\n if (this.isInRange && !this.isTransparent){\r\n this.hidden = false;\r\n this._isFirstFrame = true;\r\n this.maskManager._isFirstFrame = true;\r\n }\r\n },\r\n renderFrame: function() {\r\n if (this.hidden || this.data.hd) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.setBlendMode();\r\n var forceRealStack = this.data.ty === 0;\r\n this.globalData.renderer.save(forceRealStack);\r\n this.globalData.renderer.ctxTransform(this.finalTransform.mat.props);\r\n this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v);\r\n this.renderInnerContent();\r\n this.globalData.renderer.restore(forceRealStack);\r\n if(this.maskManager.hasMasks) {\r\n this.globalData.renderer.restore(true);\r\n }\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n destroy: function(){\r\n this.canvasContext = null;\r\n this.data = null;\r\n this.globalData = null;\r\n this.maskManager.destroy();\r\n },\r\n mHelper: new Matrix()\r\n};\r\nCVBaseElement.prototype.hide = CVBaseElement.prototype.hideElement;\r\nCVBaseElement.prototype.show = CVBaseElement.prototype.showElement;\r\n\r\nfunction CVImageElement(data, globalData, comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.img = globalData.imageLoader.getImage(this.assetData);\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVImageElement);\r\n\r\nCVImageElement.prototype.initElement = SVGShapeElement.prototype.initElement;\r\nCVImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\r\n\r\nCVImageElement.prototype.createContent = function(){\r\n\r\n if (this.img.width && (this.assetData.w !== this.img.width || this.assetData.h !== this.img.height)) {\r\n var canvas = createTag('canvas');\r\n canvas.width = this.assetData.w;\r\n canvas.height = this.assetData.h;\r\n var ctx = canvas.getContext('2d');\r\n\r\n var imgW = this.img.width;\r\n var imgH = this.img.height;\r\n var imgRel = imgW / imgH;\r\n var canvasRel = this.assetData.w/this.assetData.h;\r\n var widthCrop, heightCrop;\r\n var par = this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio;\r\n if((imgRel > canvasRel && par === 'xMidYMid slice') || (imgRel < canvasRel && par !== 'xMidYMid slice')) {\r\n heightCrop = imgH;\r\n widthCrop = heightCrop*canvasRel;\r\n } else {\r\n widthCrop = imgW;\r\n heightCrop = widthCrop/canvasRel;\r\n }\r\n ctx.drawImage(this.img,(imgW-widthCrop)/2,(imgH-heightCrop)/2,widthCrop,heightCrop,0,0,this.assetData.w,this.assetData.h);\r\n this.img = canvas;\r\n }\r\n\r\n};\r\n\r\nCVImageElement.prototype.renderInnerContent = function(parentMatrix){\r\n this.canvasContext.drawImage(this.img, 0, 0);\r\n};\r\n\r\nCVImageElement.prototype.destroy = function(){\r\n this.img = null;\r\n};\r\nfunction CVCompElement(data, globalData, comp) {\r\n this.completeLayers = false;\r\n this.layers = data.layers;\r\n this.pendingElements = [];\r\n this.elements = createSizedArray(this.layers.length);\r\n this.initElement(data, globalData, comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate, this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([CanvasRenderer, ICompElement, CVBaseElement], CVCompElement);\r\n\r\nCVCompElement.prototype.renderInnerContent = function() {\r\n var ctx = this.canvasContext;\r\n ctx.beginPath();\r\n ctx.moveTo(0, 0);\r\n ctx.lineTo(this.data.w, 0);\r\n ctx.lineTo(this.data.w, this.data.h);\r\n ctx.lineTo(0, this.data.h);\r\n ctx.lineTo(0, 0);\r\n ctx.clip();\r\n var i,len = this.layers.length;\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n};\r\n\r\nCVCompElement.prototype.destroy = function(){\r\n var i,len = this.layers.length;\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.elements[i]) {\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.layers = null;\r\n this.elements = null;\r\n};\r\n\r\nfunction CVMaskElement(data,element){\r\n this.data = data;\r\n this.element = element;\r\n this.masksProperties = this.data.masksProperties || [];\r\n this.viewData = createSizedArray(this.masksProperties.length);\r\n var i, len = this.masksProperties.length, hasMasks = false;\r\n for (i = 0; i < len; i++) {\r\n if(this.masksProperties[i].mode !== 'n'){\r\n hasMasks = true;\r\n }\r\n this.viewData[i] = ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[i],3);\r\n }\r\n this.hasMasks = hasMasks;\r\n if(hasMasks) {\r\n this.element.addRenderableComponent(this);\r\n }\r\n}\r\n\r\nCVMaskElement.prototype.renderFrame = function () {\r\n if(!this.hasMasks){\r\n return;\r\n }\r\n var transform = this.element.finalTransform.mat;\r\n var ctx = this.element.canvasContext;\r\n var i, len = this.masksProperties.length;\r\n var pt,pts,data;\r\n ctx.beginPath();\r\n for (i = 0; i < len; i++) {\r\n if(this.masksProperties[i].mode !== 'n'){\r\n if (this.masksProperties[i].inv) {\r\n ctx.moveTo(0, 0);\r\n ctx.lineTo(this.element.globalData.compSize.w, 0);\r\n ctx.lineTo(this.element.globalData.compSize.w, this.element.globalData.compSize.h);\r\n ctx.lineTo(0, this.element.globalData.compSize.h);\r\n ctx.lineTo(0, 0);\r\n }\r\n data = this.viewData[i].v;\r\n pt = transform.applyToPointArray(data.v[0][0],data.v[0][1],0);\r\n ctx.moveTo(pt[0], pt[1]);\r\n var j, jLen = data._length;\r\n for (j = 1; j < jLen; j++) {\r\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[j], data.v[j]);\r\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\r\n }\r\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[0], data.v[0]);\r\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\r\n }\r\n }\r\n this.element.globalData.renderer.save(true);\r\n ctx.clip();\r\n};\r\n\r\nCVMaskElement.prototype.getMaskProperty = MaskElement.prototype.getMaskProperty;\r\n\r\nCVMaskElement.prototype.destroy = function(){\r\n this.element = null;\r\n};\r\nfunction CVShapeElement(data, globalData, comp) {\r\n this.shapes = [];\r\n this.shapesData = data.shapes;\r\n this.stylesList = [];\r\n this.itemsData = [];\r\n this.prevViewData = [];\r\n this.shapeModifiers = [];\r\n this.processedElements = [];\r\n this.transformsManager = new ShapeTransformManager();\r\n this.initElement(data, globalData, comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement], CVShapeElement);\r\n\r\nCVShapeElement.prototype.initElement = RenderableDOMElement.prototype.initElement;\r\n\r\nCVShapeElement.prototype.transformHelper = {opacity:1,_opMdf:false};\r\n\r\nCVShapeElement.prototype.dashResetter = [];\r\n\r\nCVShapeElement.prototype.createContent = function(){\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData, true, []);\r\n};\r\n\r\nCVShapeElement.prototype.createStyleElement = function(data, transforms) {\r\n var styleElem = {\r\n data: data,\r\n type: data.ty,\r\n preTransforms: this.transformsManager.addTransformSequence(transforms),\r\n transforms: [],\r\n elements: [],\r\n closed: data.hd === true\r\n };\r\n var elementData = {};\r\n if(data.ty == 'fl' || data.ty == 'st'){\r\n elementData.c = PropertyFactory.getProp(this,data.c,1,255,this);\r\n if(!elementData.c.k){\r\n styleElem.co = 'rgb('+bm_floor(elementData.c.v[0])+','+bm_floor(elementData.c.v[1])+','+bm_floor(elementData.c.v[2])+')';\r\n }\r\n } else if (data.ty === 'gf' || data.ty === 'gs') {\r\n elementData.s = PropertyFactory.getProp(this,data.s,1,null,this);\r\n elementData.e = PropertyFactory.getProp(this,data.e,1,null,this);\r\n elementData.h = PropertyFactory.getProp(this,data.h||{k:0},0,0.01,this);\r\n elementData.a = PropertyFactory.getProp(this,data.a||{k:0},0,degToRads,this);\r\n elementData.g = new GradientProperty(this,data.g,this);\r\n }\r\n elementData.o = PropertyFactory.getProp(this,data.o,0,0.01,this);\r\n if(data.ty == 'st' || data.ty == 'gs') {\r\n styleElem.lc = this.lcEnum[data.lc] || 'round';\r\n styleElem.lj = this.ljEnum[data.lj] || 'round';\r\n if(data.lj == 1) {\r\n styleElem.ml = data.ml;\r\n }\r\n elementData.w = PropertyFactory.getProp(this,data.w,0,null,this);\r\n if(!elementData.w.k){\r\n styleElem.wi = elementData.w.v;\r\n }\r\n if(data.d){\r\n var d = new DashProperty(this,data.d,'canvas', this);\r\n elementData.d = d;\r\n if(!elementData.d.k){\r\n styleElem.da = elementData.d.dashArray;\r\n styleElem.do = elementData.d.dashoffset[0];\r\n }\r\n }\r\n } else {\r\n styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';\r\n }\r\n this.stylesList.push(styleElem);\r\n elementData.style = styleElem;\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createGroupElement = function(data) {\r\n var elementData = {\r\n it: [],\r\n prevViewData: []\r\n };\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createTransformElement = function(data) {\r\n var elementData = {\r\n transform : {\r\n opacity: 1,\r\n _opMdf:false,\r\n key: this.transformsManager.getNewKey(),\r\n op: PropertyFactory.getProp(this,data.o,0,0.01,this),\r\n mProps: TransformPropertyFactory.getTransformProperty(this,data,this)\r\n }\r\n };\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createShapeElement = function(data) {\r\n var elementData = new CVShapeData(this, data, this.stylesList, this.transformsManager);\r\n \r\n this.shapes.push(elementData);\r\n this.addShapeToModifiers(elementData);\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.reloadShapes = function() {\r\n this._isFirstFrame = true;\r\n var i, len = this.itemsData.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.prevViewData[i] = this.itemsData[i];\r\n }\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData, true, []);\r\n len = this.dynamicProperties.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.dynamicProperties[i].getValue();\r\n }\r\n this.renderModifiers();\r\n this.transformsManager.processSequences(this._isFirstFrame);\r\n};\r\n\r\nCVShapeElement.prototype.addTransformToStyleList = function(transform) {\r\n var i, len = this.stylesList.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!this.stylesList[i].closed) {\r\n this.stylesList[i].transforms.push(transform);\r\n }\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.removeTransformFromStyleList = function() {\r\n var i, len = this.stylesList.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!this.stylesList[i].closed) {\r\n this.stylesList[i].transforms.pop();\r\n }\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.closeStyles = function(styles) {\r\n var i, len = styles.length, j, jLen;\r\n for (i = 0; i < len; i += 1) {\r\n styles[i].closed = true;\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.searchShapes = function(arr,itemsData, prevViewData, shouldRender, transforms){\r\n var i, len = arr.length - 1;\r\n var j, jLen;\r\n var ownStyles = [], ownModifiers = [], processedPos, modifier, currentTransform;\r\n var ownTransforms = [].concat(transforms);\r\n for(i=len;i>=0;i-=1){\r\n processedPos = this.searchProcessedElement(arr[i]);\r\n if(!processedPos){\r\n arr[i]._shouldRender = shouldRender;\r\n } else {\r\n itemsData[i] = prevViewData[processedPos - 1];\r\n }\r\n if(arr[i].ty == 'fl' || arr[i].ty == 'st'|| arr[i].ty == 'gf'|| arr[i].ty == 'gs'){\r\n if(!processedPos){\r\n itemsData[i] = this.createStyleElement(arr[i], ownTransforms);\r\n } else {\r\n itemsData[i].style.closed = false;\r\n }\r\n \r\n ownStyles.push(itemsData[i].style);\r\n }else if(arr[i].ty == 'gr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createGroupElement(arr[i]);\r\n } else {\r\n jLen = itemsData[i].it.length;\r\n for(j=0;j<jLen;j+=1){\r\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\r\n }\r\n }\r\n this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData, shouldRender, ownTransforms);\r\n }else if(arr[i].ty == 'tr'){\r\n if(!processedPos){\r\n currentTransform = this.createTransformElement(arr[i]);\r\n itemsData[i] = currentTransform;\r\n }\r\n ownTransforms.push(itemsData[i]);\r\n this.addTransformToStyleList(itemsData[i]);\r\n }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createShapeElement(arr[i]);\r\n }\r\n \r\n }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n modifier.init(this,arr[i]);\r\n itemsData[i] = modifier;\r\n this.shapeModifiers.push(modifier);\r\n } else {\r\n modifier = itemsData[i];\r\n modifier.closed = false;\r\n }\r\n ownModifiers.push(modifier);\r\n } else if(arr[i].ty == 'rp'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n itemsData[i] = modifier;\r\n modifier.init(this,arr,i,itemsData);\r\n this.shapeModifiers.push(modifier);\r\n shouldRender = false;\r\n }else{\r\n modifier = itemsData[i];\r\n modifier.closed = true;\r\n }\r\n ownModifiers.push(modifier);\r\n }\r\n this.addProcessedElement(arr[i], i + 1);\r\n }\r\n this.removeTransformFromStyleList();\r\n this.closeStyles(ownStyles);\r\n len = ownModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n ownModifiers[i].closed = true;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderInnerContent = function() {\r\n this.transformHelper.opacity = 1;\r\n this.transformHelper._opMdf = false;\r\n this.renderModifiers();\r\n this.transformsManager.processSequences(this._isFirstFrame);\r\n this.renderShape(this.transformHelper,this.shapesData,this.itemsData,true);\r\n};\r\n\r\nCVShapeElement.prototype.renderShapeTransform = function(parentTransform, groupTransform) {\r\n var props, groupMatrix;\r\n if(parentTransform._opMdf || groupTransform.op._mdf || this._isFirstFrame) {\r\n groupTransform.opacity = parentTransform.opacity;\r\n groupTransform.opacity *= groupTransform.op.v;\r\n groupTransform._opMdf = true;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.drawLayer = function() {\r\n var i, len = this.stylesList.length;\r\n var j, jLen, k, kLen,elems,nodes, renderer = this.globalData.renderer, ctx = this.globalData.canvasContext, type, currentStyle;\r\n for(i=0;i<len;i+=1){\r\n currentStyle = this.stylesList[i];\r\n type = currentStyle.type;\r\n\r\n //Skipping style when\r\n //Stroke width equals 0\r\n //style should not be rendered (extra unused repeaters)\r\n //current opacity equals 0\r\n //global opacity equals 0\r\n if(((type === 'st' || type === 'gs') && currentStyle.wi === 0) || !currentStyle.data._shouldRender || currentStyle.coOp === 0 || this.globalData.currentGlobalAlpha === 0){\r\n continue;\r\n }\r\n renderer.save();\r\n elems = currentStyle.elements;\r\n if(type === 'st' || type === 'gs'){\r\n ctx.strokeStyle = type === 'st' ? currentStyle.co : currentStyle.grd;\r\n ctx.lineWidth = currentStyle.wi;\r\n ctx.lineCap = currentStyle.lc;\r\n ctx.lineJoin = currentStyle.lj;\r\n ctx.miterLimit = currentStyle.ml || 0;\r\n } else {\r\n ctx.fillStyle = type === 'fl' ? currentStyle.co : currentStyle.grd;\r\n }\r\n renderer.ctxOpacity(currentStyle.coOp);\r\n if(type !== 'st' && type !== 'gs'){\r\n ctx.beginPath();\r\n }\r\n renderer.ctxTransform(currentStyle.preTransforms.finalTransform.props);\r\n jLen = elems.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(type === 'st' || type === 'gs'){\r\n ctx.beginPath();\r\n if(currentStyle.da){\r\n ctx.setLineDash(currentStyle.da);\r\n ctx.lineDashOffset = currentStyle.do;\r\n }\r\n }\r\n nodes = elems[j].trNodes;\r\n kLen = nodes.length;\r\n\r\n for(k=0;k<kLen;k+=1){\r\n if(nodes[k].t == 'm'){\r\n ctx.moveTo(nodes[k].p[0],nodes[k].p[1]);\r\n }else if(nodes[k].t == 'c'){\r\n ctx.bezierCurveTo(nodes[k].pts[0],nodes[k].pts[1],nodes[k].pts[2],nodes[k].pts[3],nodes[k].pts[4],nodes[k].pts[5]);\r\n }else{\r\n ctx.closePath();\r\n }\r\n }\r\n if(type === 'st' || type === 'gs'){\r\n ctx.stroke();\r\n if(currentStyle.da){\r\n ctx.setLineDash(this.dashResetter);\r\n }\r\n }\r\n }\r\n if(type !== 'st' && type !== 'gs'){\r\n ctx.fill(currentStyle.r);\r\n }\r\n renderer.restore();\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderShape = function(parentTransform,items,data,isMain){\r\n var i, len = items.length - 1;\r\n var groupTransform;\r\n groupTransform = parentTransform;\r\n for(i=len;i>=0;i-=1){\r\n if(items[i].ty == 'tr'){\r\n groupTransform = data[i].transform;\r\n this.renderShapeTransform(parentTransform, groupTransform);\r\n }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){\r\n this.renderPath(items[i],data[i]);\r\n }else if(items[i].ty == 'fl'){\r\n this.renderFill(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'st'){\r\n this.renderStroke(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'gf' || items[i].ty == 'gs'){\r\n this.renderGradientFill(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'gr'){\r\n this.renderShape(groupTransform,items[i].it,data[i].it);\r\n }else if(items[i].ty == 'tm'){\r\n //\r\n }\r\n }\r\n if(isMain){\r\n this.drawLayer();\r\n }\r\n \r\n};\r\n\r\nCVShapeElement.prototype.renderStyledShape = function(styledShape, shape){\r\n if(this._isFirstFrame || shape._mdf || styledShape.transforms._mdf) {\r\n var shapeNodes = styledShape.trNodes;\r\n var paths = shape.paths;\r\n var i, len, j, jLen = paths._length;\r\n shapeNodes.length = 0;\r\n var groupTransformMat = styledShape.transforms.finalTransform;\r\n for (j = 0; j < jLen; j += 1) {\r\n var pathNodes = paths.shapes[j];\r\n if(pathNodes && pathNodes.v){\r\n len = pathNodes._length;\r\n for (i = 1; i < len; i += 1) {\r\n if (i === 1) {\r\n shapeNodes.push({\r\n t: 'm',\r\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\r\n });\r\n }\r\n shapeNodes.push({\r\n t: 'c',\r\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[i], pathNodes.v[i])\r\n });\r\n }\r\n if (len === 1) {\r\n shapeNodes.push({\r\n t: 'm',\r\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\r\n });\r\n }\r\n if (pathNodes.c && len) {\r\n shapeNodes.push({\r\n t: 'c',\r\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[0], pathNodes.v[0])\r\n });\r\n shapeNodes.push({\r\n t: 'z'\r\n });\r\n }\r\n }\r\n }\r\n styledShape.trNodes = shapeNodes;\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.renderPath = function(pathData,itemData){\r\n if(pathData.hd !== true && pathData._shouldRender) {\r\n var i, len = itemData.styledShapes.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.renderStyledShape(itemData.styledShapes[i], itemData.sh);\r\n }\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderFill = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n\r\n if (itemData.c._mdf || this._isFirstFrame) {\r\n styleElem.co = 'rgb(' \r\n + bm_floor(itemData.c.v[0]) + ',' \r\n + bm_floor(itemData.c.v[1]) + ',' \r\n + bm_floor(itemData.c.v[2]) + ')';\r\n }\r\n if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) {\r\n styleElem.coOp = itemData.o.v * groupTransform.opacity;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderGradientFill = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n if(!styleElem.grd || itemData.g._mdf || itemData.s._mdf || itemData.e._mdf || (styleData.t !== 1 && (itemData.h._mdf || itemData.a._mdf))) {\r\n var ctx = this.globalData.canvasContext;\r\n var grd;\r\n var pt1 = itemData.s.v, pt2 = itemData.e.v;\r\n if (styleData.t === 1) {\r\n grd = ctx.createLinearGradient(pt1[0], pt1[1], pt2[0], pt2[1]);\r\n } else {\r\n var rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\r\n\r\n var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;\r\n var dist = rad * percent;\r\n var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\r\n var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\r\n var grd = ctx.createRadialGradient(x, y, 0, pt1[0], pt1[1], rad);\r\n }\r\n\r\n var i, len = styleData.g.p;\r\n var cValues = itemData.g.c;\r\n var opacity = 1;\r\n\r\n for (i = 0; i < len; i += 1){\r\n if(itemData.g._hasOpacity && itemData.g._collapsable) {\r\n opacity = itemData.g.o[i*2 + 1];\r\n }\r\n grd.addColorStop(cValues[i * 4] / 100,'rgba('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ',' + opacity + ')');\r\n }\r\n styleElem.grd = grd;\r\n }\r\n styleElem.coOp = itemData.o.v*groupTransform.opacity;\r\n \r\n};\r\n\r\nCVShapeElement.prototype.renderStroke = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n var d = itemData.d;\r\n if(d && (d._mdf || this._isFirstFrame)){\r\n styleElem.da = d.dashArray;\r\n styleElem.do = d.dashoffset[0];\r\n }\r\n if(itemData.c._mdf || this._isFirstFrame){\r\n styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';\r\n }\r\n if(itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame){\r\n styleElem.coOp = itemData.o.v*groupTransform.opacity;\r\n }\r\n if(itemData.w._mdf || this._isFirstFrame){\r\n styleElem.wi = itemData.w.v;\r\n }\r\n};\r\n\r\n\r\nCVShapeElement.prototype.destroy = function(){\r\n this.shapesData = null;\r\n this.globalData = null;\r\n this.canvasContext = null;\r\n this.stylesList.length = 0;\r\n this.itemsData.length = 0;\r\n};\r\n\r\n\r\nfunction CVSolidElement(data, globalData, comp) {\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVSolidElement);\r\n\r\nCVSolidElement.prototype.initElement = SVGShapeElement.prototype.initElement;\r\nCVSolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\r\n\r\nCVSolidElement.prototype.renderInnerContent = function() {\r\n var ctx = this.canvasContext;\r\n ctx.fillStyle = this.data.sc;\r\n ctx.fillRect(0, 0, this.data.sw, this.data.sh);\r\n //\r\n};\r\nfunction CVTextElement(data, globalData, comp){\r\n this.textSpans = [];\r\n this.yOffset = 0;\r\n this.fillColorAnim = false;\r\n this.strokeColorAnim = false;\r\n this.strokeWidthAnim = false;\r\n this.stroke = false;\r\n this.fill = false;\r\n this.justifyOffset = 0;\r\n this.currentRender = null;\r\n this.renderType = 'canvas';\r\n this.values = {\r\n fill: 'rgba(0,0,0,0)',\r\n stroke: 'rgba(0,0,0,0)',\r\n sWidth: 0,\r\n fValue: ''\r\n };\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement,ITextElement], CVTextElement);\r\n\r\nCVTextElement.prototype.tHelper = createTag('canvas').getContext('2d');\r\n\r\nCVTextElement.prototype.buildNewText = function(){\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\r\n\r\n var hasFill = false;\r\n if(documentData.fc) {\r\n hasFill = true;\r\n this.values.fill = this.buildColor(documentData.fc);\r\n }else{\r\n this.values.fill = 'rgba(0,0,0,0)';\r\n }\r\n this.fill = hasFill;\r\n var hasStroke = false;\r\n if(documentData.sc){\r\n hasStroke = true;\r\n this.values.stroke = this.buildColor(documentData.sc);\r\n this.values.sWidth = documentData.sw;\r\n }\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n var i, len;\r\n var letters = documentData.l;\r\n var matrixHelper = this.mHelper;\r\n this.stroke = hasStroke;\r\n this.values.fValue = documentData.finalSize + 'px '+ this.globalData.fontManager.getFontByName(documentData.f).fFamily;\r\n len = documentData.finalText.length;\r\n //this.tHelper.font = this.values.fValue;\r\n var charData, shapeData, k, kLen, shapes, j, jLen, pathNodes, commands, pathArr, singleShape = this.data.singleShape;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var xPos = 0, yPos = 0, firstLine = true;\r\n var cnt = 0;\r\n for (i = 0; i < len; i += 1) {\r\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n shapeData = charData && charData.data || {};\r\n matrixHelper.reset();\r\n if(singleShape && letters[i].n) {\r\n xPos = -trackingOffset;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n firstLine = false;\r\n }\r\n\r\n shapes = shapeData.shapes ? shapeData.shapes[0].it : [];\r\n jLen = shapes.length;\r\n matrixHelper.scale(documentData.finalSize/100,documentData.finalSize/100);\r\n if(singleShape){\r\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\r\n }\r\n commands = createSizedArray(jLen);\r\n for(j=0;j<jLen;j+=1){\r\n kLen = shapes[j].ks.k.i.length;\r\n pathNodes = shapes[j].ks.k;\r\n pathArr = [];\r\n for(k=1;k<kLen;k+=1){\r\n if(k==1){\r\n pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));\r\n }\r\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToY(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToX(pathNodes.v[k][0],pathNodes.v[k][1],0),matrixHelper.applyToY(pathNodes.v[k][0],pathNodes.v[k][1],0));\r\n }\r\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToY(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));\r\n commands[j] = pathArr;\r\n }\r\n if(singleShape){\r\n xPos += letters[i].l;\r\n xPos += trackingOffset;\r\n }\r\n if(this.textSpans[cnt]){\r\n this.textSpans[cnt].elem = commands;\r\n } else {\r\n this.textSpans[cnt] = {elem: commands};\r\n }\r\n cnt +=1;\r\n }\r\n};\r\n\r\nCVTextElement.prototype.renderInnerContent = function(){\r\n var ctx = this.canvasContext;\r\n var finalMat = this.finalTransform.mat.props;\r\n ctx.font = this.values.fValue;\r\n ctx.lineCap = 'butt';\r\n ctx.lineJoin = 'miter';\r\n ctx.miterLimit = 4;\r\n\r\n if(!this.data.singleShape){\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n }\r\n\r\n var i,len, j, jLen, k, kLen;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter;\r\n var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n continue;\r\n }\r\n renderedLetter = renderedLetters[i];\r\n if(renderedLetter){\r\n this.globalData.renderer.save();\r\n this.globalData.renderer.ctxTransform(renderedLetter.p);\r\n this.globalData.renderer.ctxOpacity(renderedLetter.o);\r\n }\r\n if(this.fill){\r\n if(renderedLetter && renderedLetter.fc){\r\n if(lastFill !== renderedLetter.fc){\r\n lastFill = renderedLetter.fc;\r\n ctx.fillStyle = renderedLetter.fc;\r\n }\r\n }else if(lastFill !== this.values.fill){\r\n lastFill = this.values.fill;\r\n ctx.fillStyle = this.values.fill;\r\n }\r\n commands = this.textSpans[i].elem;\r\n jLen = commands.length;\r\n this.globalData.canvasContext.beginPath();\r\n for(j=0;j<jLen;j+=1) {\r\n pathArr = commands[j];\r\n kLen = pathArr.length;\r\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\r\n for (k = 2; k < kLen; k += 6) {\r\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\r\n }\r\n }\r\n this.globalData.canvasContext.closePath();\r\n this.globalData.canvasContext.fill();\r\n ///ctx.fillText(this.textSpans[i].val,0,0);\r\n }\r\n if(this.stroke){\r\n if(renderedLetter && renderedLetter.sw){\r\n if(lastStrokeW !== renderedLetter.sw){\r\n lastStrokeW = renderedLetter.sw;\r\n ctx.lineWidth = renderedLetter.sw;\r\n }\r\n }else if(lastStrokeW !== this.values.sWidth){\r\n lastStrokeW = this.values.sWidth;\r\n ctx.lineWidth = this.values.sWidth;\r\n }\r\n if(renderedLetter && renderedLetter.sc){\r\n if(lastStroke !== renderedLetter.sc){\r\n lastStroke = renderedLetter.sc;\r\n ctx.strokeStyle = renderedLetter.sc;\r\n }\r\n }else if(lastStroke !== this.values.stroke){\r\n lastStroke = this.values.stroke;\r\n ctx.strokeStyle = this.values.stroke;\r\n }\r\n commands = this.textSpans[i].elem;\r\n jLen = commands.length;\r\n this.globalData.canvasContext.beginPath();\r\n for(j=0;j<jLen;j+=1) {\r\n pathArr = commands[j];\r\n kLen = pathArr.length;\r\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\r\n for (k = 2; k < kLen; k += 6) {\r\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\r\n }\r\n }\r\n this.globalData.canvasContext.closePath();\r\n this.globalData.canvasContext.stroke();\r\n ///ctx.strokeText(letters[i].val,0,0);\r\n }\r\n if(renderedLetter) {\r\n this.globalData.renderer.restore();\r\n }\r\n }\r\n};\r\nfunction CVEffects() {\r\n\r\n}\r\nCVEffects.prototype.renderFrame = function(){};\r\nfunction HBaseElement(data,globalData,comp){}\r\nHBaseElement.prototype = {\r\n checkBlendMode: function(){},\r\n initRendererElement: function(){\r\n this.baseElement = createTag(this.data.tg || 'div');\r\n if(this.data.hasMask) {\r\n this.svgElement = createNS('svg');\r\n this.layerElement = createNS('g');\r\n this.maskedElement = this.layerElement;\r\n this.svgElement.appendChild(this.layerElement);\r\n this.baseElement.appendChild(this.svgElement);\r\n } else {\r\n this.layerElement = this.baseElement;\r\n }\r\n styleDiv(this.baseElement);\r\n },\r\n createContainerElements: function(){\r\n this.renderableEffectsManager = new CVEffects(this);\r\n this.transformedElement = this.baseElement;\r\n this.maskedElement = this.layerElement;\r\n if (this.data.ln) {\r\n this.layerElement.setAttribute('id',this.data.ln);\r\n }\r\n if (this.data.cl) {\r\n this.layerElement.setAttribute('class', this.data.cl);\r\n }\r\n if (this.data.bm !== 0) {\r\n this.setBlendMode();\r\n }\r\n },\r\n renderElement: function() {\r\n if(this.finalTransform._matMdf){\r\n this.transformedElement.style.transform = this.transformedElement.style.webkitTransform = this.finalTransform.mat.toCSS();\r\n }\r\n if(this.finalTransform._opMdf){\r\n this.transformedElement.style.opacity = this.finalTransform.mProp.o.v;\r\n }\r\n },\r\n renderFrame: function() {\r\n //If it is exported as hidden (data.hd === true) no need to render\r\n //If it is not visible no need to render\r\n if (this.data.hd || this.hidden) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.renderElement();\r\n this.renderInnerContent();\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n destroy: function(){\r\n this.layerElement = null;\r\n this.transformedElement = null;\r\n if(this.matteElement) {\r\n this.matteElement = null;\r\n }\r\n if(this.maskManager) {\r\n this.maskManager.destroy();\r\n this.maskManager = null;\r\n }\r\n },\r\n createRenderableComponents: function(){\r\n this.maskManager = new MaskElement(this.data, this, this.globalData);\r\n },\r\n addEffects: function(){\r\n },\r\n setMatte: function(){}\r\n};\r\nHBaseElement.prototype.getBaseElement = SVGBaseElement.prototype.getBaseElement;\r\nHBaseElement.prototype.destroyBaseElement = HBaseElement.prototype.destroy;\r\nHBaseElement.prototype.buildElementParenting = HybridRenderer.prototype.buildElementParenting;\r\nfunction HSolidElement(data,globalData,comp){\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement], HSolidElement);\r\n\r\nHSolidElement.prototype.createContent = function(){\r\n var rect;\r\n if(this.data.hasMask){\r\n rect = createNS('rect');\r\n rect.setAttribute('width',this.data.sw);\r\n rect.setAttribute('height',this.data.sh);\r\n rect.setAttribute('fill',this.data.sc);\r\n this.svgElement.setAttribute('width',this.data.sw);\r\n this.svgElement.setAttribute('height',this.data.sh);\r\n } else {\r\n rect = createTag('div');\r\n rect.style.width = this.data.sw + 'px';\r\n rect.style.height = this.data.sh + 'px';\r\n rect.style.backgroundColor = this.data.sc;\r\n }\r\n this.layerElement.appendChild(rect);\r\n};\r\n\r\nfunction HCompElement(data,globalData,comp){\r\n this.layers = data.layers;\r\n this.supports3d = !data.hasMask;\r\n this.completeLayers = false;\r\n this.pendingElements = [];\r\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\r\n this.initElement(data,globalData,comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([HybridRenderer, ICompElement, HBaseElement], HCompElement);\r\nHCompElement.prototype._createBaseContainerElements = HCompElement.prototype.createContainerElements;\r\n\r\nHCompElement.prototype.createContainerElements = function(){\r\n this._createBaseContainerElements();\r\n //divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';\r\n if(this.data.hasMask){\r\n this.svgElement.setAttribute('width',this.data.w);\r\n this.svgElement.setAttribute('height',this.data.h);\r\n this.transformedElement = this.baseElement;\r\n } else {\r\n this.transformedElement = this.layerElement;\r\n }\r\n};\r\n\r\nHCompElement.prototype.addTo3dContainer = function(elem,pos) {\r\n var j = 0;\r\n var nextElement;\r\n while(j<pos){\r\n if(this.elements[j] && this.elements[j].getBaseElement){\r\n nextElement = this.elements[j].getBaseElement();\r\n }\r\n j += 1;\r\n }\r\n if(nextElement){\r\n this.layerElement.insertBefore(elem, nextElement);\r\n } else {\r\n this.layerElement.appendChild(elem);\r\n }\r\n}\r\n\r\nfunction HShapeElement(data,globalData,comp){\r\n //List of drawable elements\r\n this.shapes = [];\r\n // Full shape data\r\n this.shapesData = data.shapes;\r\n //List of styles that will be applied to shapes\r\n this.stylesList = [];\r\n //List of modifiers that will be applied to shapes\r\n this.shapeModifiers = [];\r\n //List of items in shape tree\r\n this.itemsData = [];\r\n //List of items in previous shape tree\r\n this.processedElements = [];\r\n // List of animated components\r\n this.animatedContents = [];\r\n this.shapesContainer = createNS('g');\r\n this.initElement(data,globalData,comp);\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n // List of elements that have been created\r\n this.prevViewData = [];\r\n this.currentBBox = {\r\n x:999999,\r\n y: -999999,\r\n h: 0,\r\n w: 0\r\n };\r\n}\r\nextendPrototype([BaseElement,TransformElement,HSolidElement,SVGShapeElement,HBaseElement,HierarchyElement,FrameElement,RenderableElement], HShapeElement);\r\nHShapeElement.prototype._renderShapeFrame = HShapeElement.prototype.renderInnerContent;\r\n\r\nHShapeElement.prototype.createContent = function(){\r\n var cont;\r\n this.baseElement.style.fontSize = 0;\r\n if (this.data.hasMask) {\r\n this.layerElement.appendChild(this.shapesContainer);\r\n cont = this.svgElement;\r\n } else {\r\n cont = createNS('svg');\r\n var size = this.comp.data ? this.comp.data : this.globalData.compSize;\r\n cont.setAttribute('width',size.w);\r\n cont.setAttribute('height',size.h);\r\n cont.appendChild(this.shapesContainer);\r\n this.layerElement.appendChild(cont);\r\n }\r\n\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,0, [], true);\r\n this.filterUniqueShapes();\r\n this.shapeCont = cont;\r\n};\r\n\r\nHShapeElement.prototype.getTransformedPoint = function(transformers, point) {\r\n var i, len = transformers.length;\r\n for(i = 0; i < len; i += 1) {\r\n point = transformers[i].mProps.v.applyToPointArray(point[0], point[1], 0);\r\n }\r\n return point;\r\n}\r\n\r\nHShapeElement.prototype.calculateShapeBoundingBox = function(item, boundingBox) {\r\n var shape = item.sh.v;\r\n var transformers = item.transformers;\r\n var i, len = shape._length, vPoint, oPoint, nextIPoint, nextVPoint, bounds;\r\n if (len <= 1) {\r\n return;\r\n }\r\n for (i = 0; i < len - 1; i += 1) {\r\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\r\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\r\n nextIPoint = this.getTransformedPoint(transformers, shape.i[i + 1]);\r\n nextVPoint = this.getTransformedPoint(transformers, shape.v[i + 1]);\r\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\r\n }\r\n if(shape.c) {\r\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\r\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\r\n nextIPoint = this.getTransformedPoint(transformers, shape.i[0]);\r\n nextVPoint = this.getTransformedPoint(transformers, shape.v[0]);\r\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\r\n }\r\n}\r\n\r\nHShapeElement.prototype.checkBounds = function(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox) {\r\n this.getBoundsOfCurve(vPoint, oPoint, nextIPoint, nextVPoint);\r\n var bounds = this.shapeBoundingBox;\r\n boundingBox.x = bm_min(bounds.left, boundingBox.x);\r\n boundingBox.xMax = bm_max(bounds.right, boundingBox.xMax);\r\n boundingBox.y = bm_min(bounds.top, boundingBox.y);\r\n boundingBox.yMax = bm_max(bounds.bottom, boundingBox.yMax);\r\n}\r\n\r\nHShapeElement.prototype.shapeBoundingBox = {\r\n left:0,\r\n right:0,\r\n top:0,\r\n bottom:0,\r\n}\r\n\r\nHShapeElement.prototype.tempBoundingBox = {\r\n x:0,\r\n xMax:0,\r\n y:0,\r\n yMax:0,\r\n width:0,\r\n height:0\r\n}\r\n\r\nHShapeElement.prototype.getBoundsOfCurve = function(p0, p1, p2, p3) {\r\n\r\n var bounds = [[p0[0],p3[0]], [p0[1],p3[1]]];\r\n\r\n for (var a, b, c, t, b2ac, t1, t2, i = 0; i < 2; ++i) {\r\n\r\n b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\r\n a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\r\n c = 3 * p1[i] - 3 * p0[i];\r\n\r\n b = b | 0;\r\n a = a | 0;\r\n c = c | 0;\r\n\r\n if (a === 0) {\r\n\r\n if (b === 0) {\r\n continue;\r\n }\r\n\r\n t = -c / b;\r\n\r\n if (0 < t && t < 1) {\r\n bounds[i].push(this.calculateF(t,p0,p1,p2,p3,i));\r\n }\r\n continue;\r\n }\r\n\r\n b2ac = b * b - 4 * c * a;\r\n\r\n if (b2ac < 0) {\r\n continue;\r\n }\r\n\r\n t1 = (-b + bm_sqrt(b2ac))/(2 * a);\r\n if (0 < t1 && t1 < 1) bounds[i].push(this.calculateF(t1,p0,p1,p2,p3,i));\r\n\r\n t2 = (-b - bm_sqrt(b2ac))/(2 * a);\r\n if (0 < t2 && t2 < 1) bounds[i].push(this.calculateF(t2,p0,p1,p2,p3,i));\r\n\r\n }\r\n\r\n this.shapeBoundingBox.left = bm_min.apply(null, bounds[0]);\r\n this.shapeBoundingBox.top = bm_min.apply(null, bounds[1]);\r\n this.shapeBoundingBox.right = bm_max.apply(null, bounds[0]);\r\n this.shapeBoundingBox.bottom = bm_max.apply(null, bounds[1]);\r\n };\r\n\r\n HShapeElement.prototype.calculateF = function(t, p0, p1, p2, p3, i) {\r\n return bm_pow(1-t, 3) * p0[i]\r\n + 3 * bm_pow(1-t, 2) * t * p1[i]\r\n + 3 * (1-t) * bm_pow(t, 2) * p2[i]\r\n + bm_pow(t, 3) * p3[i];\r\n }\r\n\r\nHShapeElement.prototype.calculateBoundingBox = function(itemsData, boundingBox) {\r\n var i, len = itemsData.length, path;\r\n for(i = 0; i < len; i += 1) {\r\n if(itemsData[i] && itemsData[i].sh) {\r\n this.calculateShapeBoundingBox(itemsData[i], boundingBox)\r\n } else if(itemsData[i] && itemsData[i].it) {\r\n this.calculateBoundingBox(itemsData[i].it, boundingBox)\r\n }\r\n }\r\n}\r\n\r\nHShapeElement.prototype.currentBoxContains = function(box) {\r\n return this.currentBBox.x <= box.x \r\n && this.currentBBox.y <= box.y \r\n && this.currentBBox.width + this.currentBBox.x >= box.x + box.width\r\n && this.currentBBox.height + this.currentBBox.y >= box.y + box.height\r\n}\r\n\r\nHShapeElement.prototype.renderInnerContent = function() {\r\n this._renderShapeFrame();\r\n\r\n if(!this.hidden && (this._isFirstFrame || this._mdf)) {\r\n var tempBoundingBox = this.tempBoundingBox;\r\n var max = 999999;\r\n tempBoundingBox.x = max;\r\n tempBoundingBox.xMax = -max;\r\n tempBoundingBox.y = max;\r\n tempBoundingBox.yMax = -max;\r\n this.calculateBoundingBox(this.itemsData, tempBoundingBox);\r\n tempBoundingBox.width = tempBoundingBox.xMax < tempBoundingBox.x ? 0 : tempBoundingBox.xMax - tempBoundingBox.x;\r\n tempBoundingBox.height = tempBoundingBox.yMax < tempBoundingBox.y ? 0 : tempBoundingBox.yMax - tempBoundingBox.y;\r\n //var tempBoundingBox = this.shapeCont.getBBox();\r\n if(this.currentBoxContains(tempBoundingBox)) {\r\n return;\r\n }\r\n var changed = false;\r\n if(this.currentBBox.w !== tempBoundingBox.width){\r\n this.currentBBox.w = tempBoundingBox.width;\r\n this.shapeCont.setAttribute('width',tempBoundingBox.width);\r\n changed = true;\r\n }\r\n if(this.currentBBox.h !== tempBoundingBox.height){\r\n this.currentBBox.h = tempBoundingBox.height;\r\n this.shapeCont.setAttribute('height',tempBoundingBox.height);\r\n changed = true;\r\n }\r\n if(changed || this.currentBBox.x !== tempBoundingBox.x || this.currentBBox.y !== tempBoundingBox.y){\r\n this.currentBBox.w = tempBoundingBox.width;\r\n this.currentBBox.h = tempBoundingBox.height;\r\n this.currentBBox.x = tempBoundingBox.x;\r\n this.currentBBox.y = tempBoundingBox.y;\r\n\r\n this.shapeCont.setAttribute('viewBox',this.currentBBox.x+' '+this.currentBBox.y+' '+this.currentBBox.w+' '+this.currentBBox.h);\r\n this.shapeCont.style.transform = this.shapeCont.style.webkitTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\r\n }\r\n }\r\n\r\n};\r\nfunction HTextElement(data,globalData,comp){\r\n this.textSpans = [];\r\n this.textPaths = [];\r\n this.currentBBox = {\r\n x:999999,\r\n y: -999999,\r\n h: 0,\r\n w: 0\r\n };\r\n this.renderType = 'svg';\r\n this.isMasked = false;\r\n this.initElement(data,globalData,comp);\r\n\r\n}\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], HTextElement);\r\n\r\nHTextElement.prototype.createContent = function(){\r\n this.isMasked = this.checkMasks();\r\n if(this.isMasked){\r\n this.renderType = 'svg';\r\n this.compW = this.comp.data.w;\r\n this.compH = this.comp.data.h;\r\n this.svgElement.setAttribute('width',this.compW);\r\n this.svgElement.setAttribute('height',this.compH);\r\n var g = createNS('g');\r\n this.maskedElement.appendChild(g);\r\n this.innerElem = g;\r\n } else {\r\n this.renderType = 'html';\r\n this.innerElem = this.layerElement;\r\n }\r\n\r\n this.checkParenting();\r\n\r\n};\r\n\r\nHTextElement.prototype.buildNewText = function(){\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\r\n var innerElemStyle = this.innerElem.style;\r\n innerElemStyle.color = innerElemStyle.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';\r\n if(documentData.sc){\r\n innerElemStyle.stroke = this.buildColor(documentData.sc);\r\n innerElemStyle.strokeWidth = documentData.sw+'px';\r\n }\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n if(!this.globalData.fontManager.chars){\r\n innerElemStyle.fontSize = documentData.finalSize+'px';\r\n innerElemStyle.lineHeight = documentData.finalSize+'px';\r\n if(fontData.fClass){\r\n this.innerElem.className = fontData.fClass;\r\n } else {\r\n innerElemStyle.fontFamily = fontData.fFamily;\r\n var fWeight = documentData.fWeight, fStyle = documentData.fStyle;\r\n innerElemStyle.fontStyle = fStyle;\r\n innerElemStyle.fontWeight = fWeight;\r\n }\r\n }\r\n var i, len;\r\n\r\n var letters = documentData.l;\r\n len = letters.length;\r\n var tSpan,tParent,tCont;\r\n var matrixHelper = this.mHelper;\r\n var shapes, shapeStr = '';\r\n var cnt = 0;\r\n for (i = 0;i < len ;i += 1) {\r\n if(this.globalData.fontManager.chars){\r\n if(!this.textPaths[cnt]){\r\n tSpan = createNS('path');\r\n tSpan.setAttribute('stroke-linecap', 'butt');\r\n tSpan.setAttribute('stroke-linejoin','round');\r\n tSpan.setAttribute('stroke-miterlimit','4');\r\n } else {\r\n tSpan = this.textPaths[cnt];\r\n }\r\n if(!this.isMasked){\r\n if(this.textSpans[cnt]){\r\n tParent = this.textSpans[cnt];\r\n tCont = tParent.children[0];\r\n } else {\r\n\r\n tParent = createTag('div');\r\n tParent.style.lineHeight = 0;\r\n tCont = createNS('svg');\r\n tCont.appendChild(tSpan);\r\n styleDiv(tParent);\r\n }\r\n }\r\n }else{\r\n if(!this.isMasked){\r\n if(this.textSpans[cnt]){\r\n tParent = this.textSpans[cnt];\r\n tSpan = this.textPaths[cnt];\r\n } else {\r\n tParent = createTag('span');\r\n styleDiv(tParent);\r\n tSpan = createTag('span');\r\n styleDiv(tSpan);\r\n tParent.appendChild(tSpan);\r\n }\r\n } else {\r\n tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text');\r\n }\r\n }\r\n //tSpan.setAttribute('visibility', 'hidden');\r\n if(this.globalData.fontManager.chars){\r\n var charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n var shapeData;\r\n if(charData){\r\n shapeData = charData.data;\r\n } else {\r\n shapeData = null;\r\n }\r\n matrixHelper.reset();\r\n if(shapeData && shapeData.shapes){\r\n shapes = shapeData.shapes[0].it;\r\n matrixHelper.scale(documentData.finalSize/100,documentData.finalSize/100);\r\n shapeStr = this.createPathShape(matrixHelper,shapes);\r\n tSpan.setAttribute('d',shapeStr);\r\n }\r\n if(!this.isMasked){\r\n this.innerElem.appendChild(tParent);\r\n if(shapeData && shapeData.shapes){\r\n\r\n //document.body.appendChild is needed to get exact measure of shape\r\n document.body.appendChild(tCont);\r\n var boundingBox = tCont.getBBox();\r\n tCont.setAttribute('width',boundingBox.width + 2);\r\n tCont.setAttribute('height',boundingBox.height + 2);\r\n tCont.setAttribute('viewBox',(boundingBox.x-1)+' '+ (boundingBox.y-1)+' '+ (boundingBox.width+2)+' '+ (boundingBox.height+2));\r\n tCont.style.transform = tCont.style.webkitTransform = 'translate(' + (boundingBox.x-1) + 'px,' + (boundingBox.y-1) + 'px)';\r\n\r\n letters[i].yOffset = boundingBox.y-1;\r\n\r\n } else{\r\n tCont.setAttribute('width',1);\r\n tCont.setAttribute('height',1);\r\n }\r\n tParent.appendChild(tCont);\r\n }else{\r\n this.innerElem.appendChild(tSpan);\r\n }\r\n }else{\r\n tSpan.textContent = letters[i].val;\r\n tSpan.setAttributeNS(\"http://www.w3.org/XML/1998/namespace\", \"xml:space\",\"preserve\");\r\n if(!this.isMasked){\r\n this.innerElem.appendChild(tParent);\r\n //\r\n tSpan.style.transform = tSpan.style.webkitTransform = 'translate3d(0,'+ -documentData.finalSize/1.2+'px,0)';\r\n } else {\r\n this.innerElem.appendChild(tSpan);\r\n }\r\n }\r\n //\r\n if(!this.isMasked){\r\n this.textSpans[cnt] = tParent;\r\n }else{\r\n this.textSpans[cnt] = tSpan;\r\n }\r\n this.textSpans[cnt].style.display = 'block';\r\n this.textPaths[cnt] = tSpan;\r\n cnt += 1;\r\n }\r\n while(cnt < this.textSpans.length){\r\n this.textSpans[cnt].style.display = 'none';\r\n cnt += 1;\r\n }\r\n};\r\n\r\nHTextElement.prototype.renderInnerContent = function() {\r\n\r\n if(this.data.singleShape){\r\n if(!this._isFirstFrame && !this.lettersChangedFlag){\r\n return;\r\n } else {\r\n // Todo Benchmark if using this is better than getBBox\r\n if(this.isMasked && this.finalTransform._matMdf){\r\n this.svgElement.setAttribute('viewBox',-this.finalTransform.mProp.p.v[0]+' '+ -this.finalTransform.mProp.p.v[1]+' '+this.compW+' '+this.compH);\r\n this.svgElement.style.transform = this.svgElement.style.webkitTransform = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';\r\n }\r\n }\r\n }\r\n\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n if(!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag){\r\n return;\r\n }\r\n var i,len, count = 0;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter, textSpan, textPath;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n count += 1;\r\n continue;\r\n }\r\n textSpan = this.textSpans[i];\r\n textPath = this.textPaths[i];\r\n renderedLetter = renderedLetters[count];\r\n count += 1;\r\n if(renderedLetter._mdf.m) {\r\n if(!this.isMasked){\r\n textSpan.style.transform = textSpan.style.webkitTransform = renderedLetter.m;\r\n }else{\r\n textSpan.setAttribute('transform',renderedLetter.m);\r\n }\r\n }\r\n ////textSpan.setAttribute('opacity',renderedLetter.o);\r\n textSpan.style.opacity = renderedLetter.o;\r\n if(renderedLetter.sw && renderedLetter._mdf.sw){\r\n textPath.setAttribute('stroke-width',renderedLetter.sw);\r\n }\r\n if(renderedLetter.sc && renderedLetter._mdf.sc){\r\n textPath.setAttribute('stroke',renderedLetter.sc);\r\n }\r\n if(renderedLetter.fc && renderedLetter._mdf.fc){\r\n textPath.setAttribute('fill',renderedLetter.fc);\r\n textPath.style.color = renderedLetter.fc;\r\n }\r\n }\r\n\r\n if(this.innerElem.getBBox && !this.hidden && (this._isFirstFrame || this._mdf)){\r\n var boundingBox = this.innerElem.getBBox();\r\n\r\n if(this.currentBBox.w !== boundingBox.width){\r\n this.currentBBox.w = boundingBox.width;\r\n this.svgElement.setAttribute('width',boundingBox.width);\r\n }\r\n if(this.currentBBox.h !== boundingBox.height){\r\n this.currentBBox.h = boundingBox.height;\r\n this.svgElement.setAttribute('height',boundingBox.height);\r\n }\r\n\r\n var margin = 1;\r\n if(this.currentBBox.w !== (boundingBox.width + margin*2) || this.currentBBox.h !== (boundingBox.height + margin*2) || this.currentBBox.x !== (boundingBox.x - margin) || this.currentBBox.y !== (boundingBox.y - margin)){\r\n this.currentBBox.w = boundingBox.width + margin*2;\r\n this.currentBBox.h = boundingBox.height + margin*2;\r\n this.currentBBox.x = boundingBox.x - margin;\r\n this.currentBBox.y = boundingBox.y - margin;\r\n\r\n this.svgElement.setAttribute('viewBox',this.currentBBox.x+' '+this.currentBBox.y+' '+this.currentBBox.w+' '+this.currentBBox.h);\r\n this.svgElement.style.transform = this.svgElement.style.webkitTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\r\n }\r\n }\r\n};\r\nfunction HImageElement(data,globalData,comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.initElement(data,globalData,comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HSolidElement,HierarchyElement,FrameElement,RenderableElement], HImageElement);\r\n\r\n\r\nHImageElement.prototype.createContent = function(){\r\n var assetPath = this.globalData.getAssetsPath(this.assetData);\r\n var img = new Image();\r\n\r\n if(this.data.hasMask){\r\n this.imageElem = createNS('image');\r\n this.imageElem.setAttribute('width',this.assetData.w+\"px\");\r\n this.imageElem.setAttribute('height',this.assetData.h+\"px\");\r\n this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);\r\n this.layerElement.appendChild(this.imageElem);\r\n this.baseElement.setAttribute('width',this.assetData.w);\r\n this.baseElement.setAttribute('height',this.assetData.h);\r\n } else {\r\n this.layerElement.appendChild(img);\r\n }\r\n img.src = assetPath;\r\n if(this.data.ln){\r\n this.baseElement.setAttribute('id',this.data.ln);\r\n }\r\n};\r\nfunction HCameraElement(data,globalData,comp){\r\n this.initFrame();\r\n this.initBaseData(data,globalData,comp);\r\n this.initHierarchy();\r\n var getProp = PropertyFactory.getProp;\r\n this.pe = getProp(this,data.pe,0,0,this);\r\n if(data.ks.p.s){\r\n this.px = getProp(this,data.ks.p.x,1,0,this);\r\n this.py = getProp(this,data.ks.p.y,1,0,this);\r\n this.pz = getProp(this,data.ks.p.z,1,0,this);\r\n }else{\r\n this.p = getProp(this,data.ks.p,1,0,this);\r\n }\r\n if(data.ks.a){\r\n this.a = getProp(this,data.ks.a,1,0,this);\r\n }\r\n if(data.ks.or.k.length && data.ks.or.k[0].to){\r\n var i,len = data.ks.or.k.length;\r\n for(i=0;i<len;i+=1){\r\n data.ks.or.k[i].to = null;\r\n data.ks.or.k[i].ti = null;\r\n }\r\n }\r\n this.or = getProp(this,data.ks.or,1,degToRads,this);\r\n this.or.sh = true;\r\n this.rx = getProp(this,data.ks.rx,0,degToRads,this);\r\n this.ry = getProp(this,data.ks.ry,0,degToRads,this);\r\n this.rz = getProp(this,data.ks.rz,0,degToRads,this);\r\n this.mat = new Matrix();\r\n this._prevMat = new Matrix();\r\n this._isFirstFrame = true;\r\n \r\n // TODO: find a better way to make the HCamera element to be compatible with the LayerInterface and TransformInterface.\r\n this.finalTransform = {\r\n mProp: this\r\n };\r\n}\r\nextendPrototype([BaseElement, FrameElement, HierarchyElement], HCameraElement);\r\n\r\nHCameraElement.prototype.setup = function() {\r\n var i, len = this.comp.threeDElements.length, comp;\r\n for(i=0;i<len;i+=1){\r\n //[perspectiveElem,container]\r\n comp = this.comp.threeDElements[i];\r\n if(comp.type === '3d') {\r\n comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';\r\n comp.container.style.transformOrigin = comp.container.style.mozTransformOrigin = comp.container.style.webkitTransformOrigin = \"0px 0px 0px\";\r\n comp.perspectiveElem.style.transform = comp.perspectiveElem.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\r\n }\r\n }\r\n};\r\n\r\nHCameraElement.prototype.createElements = function(){\r\n};\r\n\r\nHCameraElement.prototype.hide = function(){\r\n};\r\n\r\nHCameraElement.prototype.renderFrame = function(){\r\n var _mdf = this._isFirstFrame;\r\n var i, len;\r\n if(this.hierarchy){\r\n len = this.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf;\r\n }\r\n }\r\n if(_mdf || this.pe._mdf || (this.p && this.p._mdf) || (this.px && (this.px._mdf || this.py._mdf || this.pz._mdf)) || this.rx._mdf || this.ry._mdf || this.rz._mdf || this.or._mdf || (this.a && this.a._mdf)) {\r\n this.mat.reset();\r\n\r\n if(this.hierarchy){\r\n var mat;\r\n len = this.hierarchy.length - 1;\r\n for (i = len; i >= 0; i -= 1) {\r\n var mTransf = this.hierarchy[i].finalTransform.mProp;\r\n this.mat.translate(-mTransf.p.v[0],-mTransf.p.v[1],mTransf.p.v[2]);\r\n this.mat.rotateX(-mTransf.or.v[0]).rotateY(-mTransf.or.v[1]).rotateZ(mTransf.or.v[2]);\r\n this.mat.rotateX(-mTransf.rx.v).rotateY(-mTransf.ry.v).rotateZ(mTransf.rz.v);\r\n this.mat.scale(1/mTransf.s.v[0],1/mTransf.s.v[1],1/mTransf.s.v[2]);\r\n this.mat.translate(mTransf.a.v[0],mTransf.a.v[1],mTransf.a.v[2]);\r\n }\r\n }\r\n if (this.p) {\r\n this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]);\r\n } else {\r\n this.mat.translate(-this.px.v,-this.py.v,this.pz.v);\r\n }\r\n if (this.a) {\r\n var diffVector\r\n if (this.p) {\r\n diffVector = [this.p.v[0] - this.a.v[0], this.p.v[1] - this.a.v[1], this.p.v[2] - this.a.v[2]];\r\n } else {\r\n diffVector = [this.px.v - this.a.v[0], this.py.v - this.a.v[1], this.pz.v - this.a.v[2]];\r\n }\r\n var mag = Math.sqrt(Math.pow(diffVector[0],2)+Math.pow(diffVector[1],2)+Math.pow(diffVector[2],2));\r\n //var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));\r\n var lookDir = [diffVector[0]/mag,diffVector[1]/mag,diffVector[2]/mag];\r\n var lookLengthOnXZ = Math.sqrt( lookDir[2]*lookDir[2] + lookDir[0]*lookDir[0] );\r\n var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));\r\n var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));\r\n this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);\r\n\r\n }\r\n this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v);\r\n this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]);\r\n this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0);\r\n this.mat.translate(0,0,this.pe.v);\r\n\r\n\r\n \r\n\r\n var hasMatrixChanged = !this._prevMat.equals(this.mat);\r\n if((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) {\r\n len = this.comp.threeDElements.length;\r\n var comp;\r\n for(i=0;i<len;i+=1){\r\n comp = this.comp.threeDElements[i];\r\n if(comp.type === '3d') {\r\n if(hasMatrixChanged) {\r\n comp.container.style.transform = comp.container.style.webkitTransform = this.mat.toCSS();\r\n }\r\n if(this.pe._mdf) {\r\n comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';\r\n }\r\n }\r\n }\r\n this.mat.clone(this._prevMat);\r\n }\r\n }\r\n this._isFirstFrame = false;\r\n};\r\n\r\nHCameraElement.prototype.prepareFrame = function(num) {\r\n this.prepareProperties(num, true);\r\n};\r\n\r\nHCameraElement.prototype.destroy = function(){\r\n};\r\nHCameraElement.prototype.getBaseElement = function(){return null;};\r\nfunction HEffects() {\r\n}\r\nHEffects.prototype.renderFrame = function(){};\r\nvar animationManager = (function(){\r\n var moduleOb = {};\r\n var registeredAnimations = [];\r\n var initTime = 0;\r\n var len = 0;\r\n var playingAnimationsNum = 0;\r\n var _stopped = true;\r\n var _isFrozen = false;\r\n\r\n function removeElement(ev){\r\n var i = 0;\r\n var animItem = ev.target;\r\n while(i<len) {\r\n if (registeredAnimations[i].animation === animItem) {\r\n registeredAnimations.splice(i, 1);\r\n i -= 1;\r\n len -= 1;\r\n if(!animItem.isPaused){\r\n subtractPlayingCount();\r\n }\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function registerAnimation(element, animationData){\r\n if(!element){\r\n return null;\r\n }\r\n var i=0;\r\n while(i<len){\r\n if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ){\r\n return registeredAnimations[i].animation;\r\n }\r\n i+=1;\r\n }\r\n var animItem = new AnimationItem();\r\n setupAnimation(animItem, element);\r\n animItem.setData(element, animationData);\r\n return animItem;\r\n }\r\n\r\n function getRegisteredAnimations() {\r\n var i, len = registeredAnimations.length;\r\n var animations = [];\r\n for(i = 0; i < len; i += 1) {\r\n animations.push(registeredAnimations[i].animation);\r\n }\r\n return animations;\r\n }\r\n\r\n function addPlayingCount(){\r\n playingAnimationsNum += 1;\r\n activate();\r\n }\r\n\r\n function subtractPlayingCount(){\r\n playingAnimationsNum -= 1;\r\n }\r\n\r\n function setupAnimation(animItem, element){\r\n animItem.addEventListener('destroy',removeElement);\r\n animItem.addEventListener('_active',addPlayingCount);\r\n animItem.addEventListener('_idle',subtractPlayingCount);\r\n registeredAnimations.push({elem: element,animation:animItem});\r\n len += 1;\r\n }\r\n\r\n function loadAnimation(params){\r\n var animItem = new AnimationItem();\r\n setupAnimation(animItem, null);\r\n animItem.setParams(params);\r\n return animItem;\r\n }\r\n\r\n\r\n function setSpeed(val,animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.setSpeed(val, animation);\r\n }\r\n }\r\n\r\n function setDirection(val, animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.setDirection(val, animation);\r\n }\r\n }\r\n\r\n function play(animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.play(animation);\r\n }\r\n }\r\n function resume(nowTime) {\r\n var elapsedTime = nowTime - initTime;\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.advanceTime(elapsedTime);\r\n }\r\n initTime = nowTime;\r\n if(playingAnimationsNum && !_isFrozen) {\r\n window.requestAnimationFrame(resume);\r\n } else {\r\n _stopped = true;\r\n }\r\n }\r\n\r\n function first(nowTime){\r\n initTime = nowTime;\r\n window.requestAnimationFrame(resume);\r\n }\r\n\r\n function pause(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.pause(animation);\r\n }\r\n }\r\n\r\n function goToAndStop(value,isFrame,animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.goToAndStop(value,isFrame,animation);\r\n }\r\n }\r\n\r\n function stop(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.stop(animation);\r\n }\r\n }\r\n\r\n function togglePause(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.togglePause(animation);\r\n }\r\n }\r\n\r\n function destroy(animation) {\r\n var i;\r\n for(i=(len-1);i>=0;i-=1){\r\n registeredAnimations[i].animation.destroy(animation);\r\n }\r\n }\r\n\r\n function searchAnimations(animationData, standalone, renderer){\r\n var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')),\r\n [].slice.call(document.getElementsByClassName('bodymovin')));\r\n var i, len = animElements.length;\r\n for(i=0;i<len;i+=1){\r\n if(renderer){\r\n animElements[i].setAttribute('data-bm-type',renderer);\r\n }\r\n registerAnimation(animElements[i], animationData);\r\n }\r\n if(standalone && len === 0){\r\n if(!renderer){\r\n renderer = 'svg';\r\n }\r\n var body = document.getElementsByTagName('body')[0];\r\n body.innerHTML = '';\r\n var div = createTag('div');\r\n div.style.width = '100%';\r\n div.style.height = '100%';\r\n div.setAttribute('data-bm-type',renderer);\r\n body.appendChild(div);\r\n registerAnimation(div, animationData);\r\n }\r\n }\r\n\r\n function resize(){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.resize();\r\n }\r\n }\r\n\r\n function activate(){\r\n if(!_isFrozen && playingAnimationsNum){\r\n if(_stopped) {\r\n window.requestAnimationFrame(first);\r\n _stopped = false;\r\n }\r\n }\r\n }\r\n\r\n function freeze() {\r\n _isFrozen = true;\r\n }\r\n\r\n function unfreeze() {\r\n _isFrozen = false;\r\n activate();\r\n }\r\n\r\n moduleOb.registerAnimation = registerAnimation;\r\n moduleOb.loadAnimation = loadAnimation;\r\n moduleOb.setSpeed = setSpeed;\r\n moduleOb.setDirection = setDirection;\r\n moduleOb.play = play;\r\n moduleOb.pause = pause;\r\n moduleOb.stop = stop;\r\n moduleOb.togglePause = togglePause;\r\n moduleOb.searchAnimations = searchAnimations;\r\n moduleOb.resize = resize;\r\n //moduleOb.start = start;\r\n moduleOb.goToAndStop = goToAndStop;\r\n moduleOb.destroy = destroy;\r\n moduleOb.freeze = freeze;\r\n moduleOb.unfreeze = unfreeze;\r\n moduleOb.getRegisteredAnimations = getRegisteredAnimations;\r\n return moduleOb;\r\n}());\r\n\r\nvar AnimationItem = function () {\r\n this._cbs = [];\r\n this.name = '';\r\n this.path = '';\r\n this.isLoaded = false;\r\n this.currentFrame = 0;\r\n this.currentRawFrame = 0;\r\n this.totalFrames = 0;\r\n this.frameRate = 0;\r\n this.frameMult = 0;\r\n this.playSpeed = 1;\r\n this.playDirection = 1;\r\n this.playCount = 0;\r\n this.animationData = {};\r\n this.assets = [];\r\n this.isPaused = true;\r\n this.autoplay = false;\r\n this.loop = true;\r\n this.renderer = null;\r\n this.animationID = createElementID();\r\n this.assetsPath = '';\r\n this.timeCompleted = 0;\r\n this.segmentPos = 0;\r\n this.subframeEnabled = subframeEnabled;\r\n this.segments = [];\r\n this._idle = true;\r\n this._completedLoop = false;\r\n this.projectInterface = ProjectInterface();\r\n this.imagePreloader = new ImagePreloader();\r\n};\r\n\r\nextendPrototype([BaseEvent], AnimationItem);\r\n\r\nAnimationItem.prototype.setParams = function(params) {\r\n if(params.context){\r\n this.context = params.context;\r\n }\r\n if(params.wrapper || params.container){\r\n this.wrapper = params.wrapper || params.container;\r\n }\r\n var animType = params.animType ? params.animType : params.renderer ? params.renderer : 'svg';\r\n switch(animType){\r\n case 'canvas':\r\n this.renderer = new CanvasRenderer(this, params.rendererSettings);\r\n break;\r\n case 'svg':\r\n this.renderer = new SVGRenderer(this, params.rendererSettings);\r\n break;\r\n default:\r\n this.renderer = new HybridRenderer(this, params.rendererSettings);\r\n break;\r\n }\r\n this.renderer.setProjectInterface(this.projectInterface);\r\n this.animType = animType;\r\n\r\n if(params.loop === '' || params.loop === null){\r\n }else if(params.loop === false){\r\n this.loop = false;\r\n }else if(params.loop === true){\r\n this.loop = true;\r\n }else{\r\n this.loop = parseInt(params.loop);\r\n }\r\n this.autoplay = 'autoplay' in params ? params.autoplay : true;\r\n this.name = params.name ? params.name : '';\r\n this.autoloadSegments = params.hasOwnProperty('autoloadSegments') ? params.autoloadSegments : true;\r\n this.assetsPath = params.assetsPath;\r\n if (params.animationData) {\r\n this.configAnimation(params.animationData);\r\n } else if(params.path){\r\n\r\n if( params.path.lastIndexOf('\\\\') !== -1){\r\n this.path = params.path.substr(0,params.path.lastIndexOf('\\\\')+1);\r\n } else {\r\n this.path = params.path.substr(0,params.path.lastIndexOf('/')+1);\r\n }\r\n this.fileName = params.path.substr(params.path.lastIndexOf('/')+1);\r\n this.fileName = this.fileName.substr(0,this.fileName.lastIndexOf('.json'));\r\n\r\n assetLoader.load(params.path, this.configAnimation.bind(this), function() {\r\n this.trigger('data_failed');\r\n }.bind(this));\r\n }\r\n};\r\n\r\nAnimationItem.prototype.setData = function (wrapper, animationData) {\r\n var params = {\r\n wrapper: wrapper,\r\n animationData: animationData ? (typeof animationData === \"object\") ? animationData : JSON.parse(animationData) : null\r\n };\r\n var wrapperAttributes = wrapper.attributes;\r\n\r\n params.path = wrapperAttributes.getNamedItem('data-animation-path') ? wrapperAttributes.getNamedItem('data-animation-path').value : wrapperAttributes.getNamedItem('data-bm-path') ? wrapperAttributes.getNamedItem('data-bm-path').value : wrapperAttributes.getNamedItem('bm-path') ? wrapperAttributes.getNamedItem('bm-path').value : '';\r\n params.animType = wrapperAttributes.getNamedItem('data-anim-type') ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') ? wrapperAttributes.getNamedItem('bm-type').value : wrapperAttributes.getNamedItem('data-bm-renderer') ? wrapperAttributes.getNamedItem('data-bm-renderer').value : wrapperAttributes.getNamedItem('bm-renderer') ? wrapperAttributes.getNamedItem('bm-renderer').value : 'canvas';\r\n\r\n var loop = wrapperAttributes.getNamedItem('data-anim-loop') ? wrapperAttributes.getNamedItem('data-anim-loop').value : wrapperAttributes.getNamedItem('data-bm-loop') ? wrapperAttributes.getNamedItem('data-bm-loop').value : wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : '';\r\n if(loop === ''){\r\n }else if(loop === 'false'){\r\n params.loop = false;\r\n }else if(loop === 'true'){\r\n params.loop = true;\r\n }else{\r\n params.loop = parseInt(loop);\r\n }\r\n var autoplay = wrapperAttributes.getNamedItem('data-anim-autoplay') ? wrapperAttributes.getNamedItem('data-anim-autoplay').value : wrapperAttributes.getNamedItem('data-bm-autoplay') ? wrapperAttributes.getNamedItem('data-bm-autoplay').value : wrapperAttributes.getNamedItem('bm-autoplay') ? wrapperAttributes.getNamedItem('bm-autoplay').value : true;\r\n params.autoplay = autoplay !== \"false\";\r\n\r\n params.name = wrapperAttributes.getNamedItem('data-name') ? wrapperAttributes.getNamedItem('data-name').value : wrapperAttributes.getNamedItem('data-bm-name') ? wrapperAttributes.getNamedItem('data-bm-name').value : wrapperAttributes.getNamedItem('bm-name') ? wrapperAttributes.getNamedItem('bm-name').value : '';\r\n var prerender = wrapperAttributes.getNamedItem('data-anim-prerender') ? wrapperAttributes.getNamedItem('data-anim-prerender').value : wrapperAttributes.getNamedItem('data-bm-prerender') ? wrapperAttributes.getNamedItem('data-bm-prerender').value : wrapperAttributes.getNamedItem('bm-prerender') ? wrapperAttributes.getNamedItem('bm-prerender').value : '';\r\n\r\n if(prerender === 'false'){\r\n params.prerender = false;\r\n }\r\n this.setParams(params);\r\n};\r\n\r\nAnimationItem.prototype.includeLayers = function(data) {\r\n if(data.op > this.animationData.op){\r\n this.animationData.op = data.op;\r\n this.totalFrames = Math.floor(data.op - this.animationData.ip);\r\n }\r\n var layers = this.animationData.layers;\r\n var i, len = layers.length;\r\n var newLayers = data.layers;\r\n var j, jLen = newLayers.length;\r\n for(j=0;j<jLen;j+=1){\r\n i = 0;\r\n while(i<len){\r\n if(layers[i].id == newLayers[j].id){\r\n layers[i] = newLayers[j];\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n if(data.chars || data.fonts){\r\n this.renderer.globalData.fontManager.addChars(data.chars);\r\n this.renderer.globalData.fontManager.addFonts(data.fonts, this.renderer.globalData.defs);\r\n }\r\n if(data.assets){\r\n len = data.assets.length;\r\n for(i = 0; i < len; i += 1){\r\n this.animationData.assets.push(data.assets[i]);\r\n }\r\n }\r\n this.animationData.__complete = false;\r\n dataManager.completeData(this.animationData,this.renderer.globalData.fontManager);\r\n this.renderer.includeLayers(data.layers);\r\n if(expressionsPlugin){\r\n expressionsPlugin.initExpressions(this);\r\n }\r\n this.loadNextSegment();\r\n};\r\n\r\nAnimationItem.prototype.loadNextSegment = function() {\r\n var segments = this.animationData.segments;\r\n if(!segments || segments.length === 0 || !this.autoloadSegments){\r\n this.trigger('data_ready');\r\n this.timeCompleted = this.totalFrames;\r\n return;\r\n }\r\n var segment = segments.shift();\r\n this.timeCompleted = segment.time * this.frameRate;\r\n var segmentPath = this.path+this.fileName+'_' + this.segmentPos + '.json';\r\n this.segmentPos += 1;\r\n assetLoader.load(segmentPath, this.includeLayers.bind(this), function() {\r\n this.trigger('data_failed');\r\n }.bind(this));\r\n};\r\n\r\nAnimationItem.prototype.loadSegments = function() {\r\n var segments = this.animationData.segments;\r\n if(!segments) {\r\n this.timeCompleted = this.totalFrames;\r\n }\r\n this.loadNextSegment();\r\n};\r\n\r\nAnimationItem.prototype.imagesLoaded = function() {\r\n this.trigger('loaded_images');\r\n this.checkLoaded()\r\n}\r\n\r\nAnimationItem.prototype.preloadImages = function() {\r\n this.imagePreloader.setAssetsPath(this.assetsPath);\r\n this.imagePreloader.setPath(this.path);\r\n this.imagePreloader.loadAssets(this.animationData.assets, this.imagesLoaded.bind(this));\r\n}\r\n\r\nAnimationItem.prototype.configAnimation = function (animData) {\r\n if(!this.renderer){\r\n return;\r\n }\r\n try {\r\n this.animationData = animData;\r\n this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip);\r\n this.renderer.configAnimation(animData);\r\n if(!animData.assets){\r\n animData.assets = [];\r\n }\r\n\r\n this.assets = this.animationData.assets;\r\n this.frameRate = this.animationData.fr;\r\n this.firstFrame = Math.round(this.animationData.ip);\r\n this.frameMult = this.animationData.fr / 1000;\r\n this.renderer.searchExtraCompositions(animData.assets);\r\n this.trigger('config_ready');\r\n this.preloadImages();\r\n this.loadSegments();\r\n this.updaFrameModifier();\r\n this.waitForFontsLoaded();\r\n } catch(error) {\r\n this.triggerConfigError(error);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.waitForFontsLoaded = function(){\r\n if(!this.renderer) {\r\n return;\r\n }\r\n if(this.renderer.globalData.fontManager.loaded()){\r\n this.checkLoaded();\r\n }else{\r\n setTimeout(this.waitForFontsLoaded.bind(this),20);\r\n }\r\n}\r\n\r\nAnimationItem.prototype.checkLoaded = function () {\r\n if (!this.isLoaded && this.renderer.globalData.fontManager.loaded() && (this.imagePreloader.loaded() || this.renderer.rendererType !== 'canvas')) {\r\n this.isLoaded = true;\r\n dataManager.completeData(this.animationData, this.renderer.globalData.fontManager);\r\n if(expressionsPlugin){\r\n expressionsPlugin.initExpressions(this);\r\n }\r\n this.renderer.initItems();\r\n setTimeout(function() {\r\n this.trigger('DOMLoaded');\r\n }.bind(this), 0);\r\n this.gotoFrame();\r\n if(this.autoplay){\r\n this.play();\r\n }\r\n }\r\n};\r\n\r\nAnimationItem.prototype.resize = function () {\r\n this.renderer.updateContainerSize();\r\n};\r\n\r\nAnimationItem.prototype.setSubframe = function(flag){\r\n this.subframeEnabled = flag ? true : false;\r\n};\r\n\r\nAnimationItem.prototype.gotoFrame = function () {\r\n this.currentFrame = this.subframeEnabled ? this.currentRawFrame : ~~this.currentRawFrame;\r\n\r\n if(this.timeCompleted !== this.totalFrames && this.currentFrame > this.timeCompleted){\r\n this.currentFrame = this.timeCompleted;\r\n }\r\n this.trigger('enterFrame');\r\n this.renderFrame();\r\n};\r\n\r\nAnimationItem.prototype.renderFrame = function () {\r\n if(this.isLoaded === false){\r\n return;\r\n }\r\n try {\r\n this.renderer.renderFrame(this.currentFrame + this.firstFrame);\r\n } catch(error) {\r\n this.triggerRenderFrameError(error);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.play = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === true){\r\n this.isPaused = false;\r\n if(this._idle){\r\n this._idle = false;\r\n this.trigger('_active');\r\n }\r\n }\r\n};\r\n\r\nAnimationItem.prototype.pause = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === false){\r\n this.isPaused = true;\r\n this._idle = true;\r\n this.trigger('_idle');\r\n }\r\n};\r\n\r\nAnimationItem.prototype.togglePause = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === true){\r\n this.play();\r\n }else{\r\n this.pause();\r\n }\r\n};\r\n\r\nAnimationItem.prototype.stop = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n this.pause();\r\n this.playCount = 0;\r\n this._completedLoop = false;\r\n this.setCurrentRawFrameValue(0);\r\n};\r\n\r\nAnimationItem.prototype.goToAndStop = function (value, isFrame, name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(isFrame){\r\n this.setCurrentRawFrameValue(value);\r\n }else{\r\n this.setCurrentRawFrameValue(value * this.frameModifier);\r\n }\r\n this.pause();\r\n};\r\n\r\nAnimationItem.prototype.goToAndPlay = function (value, isFrame, name) {\r\n this.goToAndStop(value, isFrame, name);\r\n this.play();\r\n};\r\n\r\nAnimationItem.prototype.advanceTime = function (value) {\r\n if (this.isPaused === true || this.isLoaded === false) {\r\n return;\r\n }\r\n var nextValue = this.currentRawFrame + value * this.frameModifier;\r\n var _isComplete = false;\r\n // Checking if nextValue > totalFrames - 1 for addressing non looping and looping animations.\r\n // If animation won't loop, it should stop at totalFrames - 1. If it will loop it should complete the last frame and then loop.\r\n if (nextValue >= this.totalFrames - 1 && this.frameModifier > 0) {\r\n if (!this.loop || this.playCount === this.loop) {\r\n if (!this.checkSegments(nextValue > this.totalFrames ? nextValue % this.totalFrames : 0)) {\r\n _isComplete = true;\r\n nextValue = this.totalFrames - 1;\r\n }\r\n } else if (nextValue >= this.totalFrames) {\r\n this.playCount += 1;\r\n if (!this.checkSegments(nextValue % this.totalFrames)) {\r\n this.setCurrentRawFrameValue(nextValue % this.totalFrames);\r\n this._completedLoop = true;\r\n this.trigger('loopComplete');\r\n }\r\n } else {\r\n this.setCurrentRawFrameValue(nextValue);\r\n }\r\n } else if(nextValue < 0) {\r\n if (!this.checkSegments(nextValue % this.totalFrames)) {\r\n if (this.loop && !(this.playCount-- <= 0 && this.loop !== true)) {\r\n this.setCurrentRawFrameValue(this.totalFrames + (nextValue % this.totalFrames));\r\n if(!this._completedLoop) {\r\n this._completedLoop = true;\r\n } else {\r\n this.trigger('loopComplete');\r\n }\r\n } else {\r\n _isComplete = true;\r\n nextValue = 0;\r\n }\r\n }\r\n } else {\r\n this.setCurrentRawFrameValue(nextValue);\r\n }\r\n if (_isComplete) {\r\n this.setCurrentRawFrameValue(nextValue);\r\n this.pause();\r\n this.trigger('complete');\r\n }\r\n};\r\n\r\nAnimationItem.prototype.adjustSegment = function(arr, offset){\r\n this.playCount = 0;\r\n if(arr[1] < arr[0]){\r\n if(this.frameModifier > 0){\r\n if(this.playSpeed < 0){\r\n this.setSpeed(-this.playSpeed);\r\n } else {\r\n this.setDirection(-1);\r\n }\r\n }\r\n this.timeCompleted = this.totalFrames = arr[0] - arr[1];\r\n this.firstFrame = arr[1];\r\n this.setCurrentRawFrameValue(this.totalFrames - 0.001 - offset);\r\n } else if(arr[1] > arr[0]){\r\n if(this.frameModifier < 0){\r\n if(this.playSpeed < 0){\r\n this.setSpeed(-this.playSpeed);\r\n } else {\r\n this.setDirection(1);\r\n }\r\n }\r\n this.timeCompleted = this.totalFrames = arr[1] - arr[0];\r\n this.firstFrame = arr[0];\r\n this.setCurrentRawFrameValue(0.001 + offset);\r\n }\r\n this.trigger('segmentStart');\r\n};\r\nAnimationItem.prototype.setSegment = function (init,end) {\r\n var pendingFrame = -1;\r\n if(this.isPaused) {\r\n if (this.currentRawFrame + this.firstFrame < init) {\r\n pendingFrame = init;\r\n } else if (this.currentRawFrame + this.firstFrame > end) {\r\n pendingFrame = end - init;\r\n }\r\n }\r\n\r\n this.firstFrame = init;\r\n this.timeCompleted = this.totalFrames = end - init;\r\n if(pendingFrame !== -1) {\r\n this.goToAndStop(pendingFrame,true);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.playSegments = function (arr, forceFlag) {\r\n if (forceFlag) {\r\n this.segments.length = 0;\r\n }\r\n if (typeof arr[0] === 'object') {\r\n var i, len = arr.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.segments.push(arr[i]);\r\n }\r\n } else {\r\n this.segments.push(arr);\r\n }\r\n if (this.segments.length && forceFlag) {\r\n this.adjustSegment(this.segments.shift(), 0);\r\n }\r\n if (this.isPaused) {\r\n this.play();\r\n }\r\n};\r\n\r\nAnimationItem.prototype.resetSegments = function (forceFlag) {\r\n this.segments.length = 0;\r\n this.segments.push([this.animationData.ip,this.animationData.op]);\r\n //this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op - this.animationData.ip+this.animationData.ip*this.frameRate)]);\r\n if (forceFlag) {\r\n this.checkSegments(0);\r\n }\r\n};\r\nAnimationItem.prototype.checkSegments = function(offset) {\r\n if (this.segments.length) {\r\n this.adjustSegment(this.segments.shift(), offset);\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nAnimationItem.prototype.destroy = function (name) {\r\n if ((name && this.name != name) || !this.renderer) {\r\n return;\r\n }\r\n this.renderer.destroy();\r\n this.imagePreloader.destroy();\r\n this.trigger('destroy');\r\n this._cbs = null;\r\n this.onEnterFrame = this.onLoopComplete = this.onComplete = this.onSegmentStart = this.onDestroy = null;\r\n this.renderer = null;\r\n};\r\n\r\nAnimationItem.prototype.setCurrentRawFrameValue = function(value){\r\n this.currentRawFrame = value;\r\n this.gotoFrame();\r\n};\r\n\r\nAnimationItem.prototype.setSpeed = function (val) {\r\n this.playSpeed = val;\r\n this.updaFrameModifier();\r\n};\r\n\r\nAnimationItem.prototype.setDirection = function (val) {\r\n this.playDirection = val < 0 ? -1 : 1;\r\n this.updaFrameModifier();\r\n};\r\n\r\nAnimationItem.prototype.updaFrameModifier = function () {\r\n this.frameModifier = this.frameMult * this.playSpeed * this.playDirection;\r\n};\r\n\r\nAnimationItem.prototype.getPath = function () {\r\n return this.path;\r\n};\r\n\r\nAnimationItem.prototype.getAssetsPath = function (assetData) {\r\n var path = '';\r\n if(assetData.e) {\r\n path = assetData.p;\r\n } else if(this.assetsPath){\r\n var imagePath = assetData.p;\r\n if(imagePath.indexOf('images/') !== -1){\r\n imagePath = imagePath.split('/')[1];\r\n }\r\n path = this.assetsPath + imagePath;\r\n } else {\r\n path = this.path;\r\n path += assetData.u ? assetData.u : '';\r\n path += assetData.p;\r\n }\r\n return path;\r\n};\r\n\r\nAnimationItem.prototype.getAssetData = function (id) {\r\n var i = 0, len = this.assets.length;\r\n while (i < len) {\r\n if(id == this.assets[i].id){\r\n return this.assets[i];\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nAnimationItem.prototype.hide = function () {\r\n this.renderer.hide();\r\n};\r\n\r\nAnimationItem.prototype.show = function () {\r\n this.renderer.show();\r\n};\r\n\r\nAnimationItem.prototype.getDuration = function (isFrame) {\r\n return isFrame ? this.totalFrames : this.totalFrames / this.frameRate;\r\n};\r\n\r\nAnimationItem.prototype.trigger = function(name){\r\n if(this._cbs && this._cbs[name]){\r\n switch(name){\r\n case 'enterFrame':\r\n this.triggerEvent(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameModifier));\r\n break;\r\n case 'loopComplete':\r\n this.triggerEvent(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));\r\n break;\r\n case 'complete':\r\n this.triggerEvent(name,new BMCompleteEvent(name,this.frameMult));\r\n break;\r\n case 'segmentStart':\r\n this.triggerEvent(name,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));\r\n break;\r\n case 'destroy':\r\n this.triggerEvent(name,new BMDestroyEvent(name,this));\r\n break;\r\n default:\r\n this.triggerEvent(name);\r\n }\r\n }\r\n if(name === 'enterFrame' && this.onEnterFrame){\r\n this.onEnterFrame.call(this,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));\r\n }\r\n if(name === 'loopComplete' && this.onLoopComplete){\r\n this.onLoopComplete.call(this,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));\r\n }\r\n if(name === 'complete' && this.onComplete){\r\n this.onComplete.call(this,new BMCompleteEvent(name,this.frameMult));\r\n }\r\n if(name === 'segmentStart' && this.onSegmentStart){\r\n this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));\r\n }\r\n if(name === 'destroy' && this.onDestroy){\r\n this.onDestroy.call(this,new BMDestroyEvent(name,this));\r\n }\r\n};\r\n\r\nAnimationItem.prototype.triggerRenderFrameError = function(nativeError) {\r\n\r\n var error = new BMRenderFrameErrorEvent(nativeError, this.currentFrame);\r\n this.triggerEvent('error', error);\r\n\r\n if (this.onError) {\r\n this.onError.call(this, error);\r\n }\r\n}\r\n\r\nAnimationItem.prototype.triggerConfigError = function(nativeError) {\r\n\r\n var error = new BMConfigErrorEvent(nativeError, this.currentFrame);\r\n this.triggerEvent('error', error);\r\n\r\n if (this.onError) {\r\n this.onError.call(this, error);\r\n }\r\n}\r\nvar Expressions = (function(){\r\n var ob = {};\r\n ob.initExpressions = initExpressions;\r\n\r\n\r\n function initExpressions(animation){\r\n\r\n \tvar stackCount = 0;\r\n \tvar registers = [];\r\n\r\n \tfunction pushExpression() {\r\n\t\t\tstackCount += 1;\r\n \t}\r\n\r\n \tfunction popExpression() {\r\n\t\t\tstackCount -= 1;\r\n\t\t\tif (stackCount === 0) {\r\n\t\t\t\treleaseInstances();\r\n\t\t\t}\r\n \t}\r\n\r\n \tfunction registerExpressionProperty(expression) {\r\n \t\tif (registers.indexOf(expression) === -1) {\r\n\t\t\t\tregisters.push(expression)\r\n \t\t}\r\n \t}\r\n\r\n \tfunction releaseInstances() {\r\n \t\tvar i, len = registers.length;\r\n \t\tfor (i = 0; i < len; i += 1) {\r\n\t\t\t\tregisters[i].release();\r\n \t\t}\r\n \t\tregisters.length = 0;\r\n \t}\r\n\r\n animation.renderer.compInterface = CompExpressionInterface(animation.renderer);\r\n animation.renderer.globalData.projectInterface.registerComposition(animation.renderer);\r\n animation.renderer.globalData.pushExpression = pushExpression;\r\n animation.renderer.globalData.popExpression = popExpression;\r\n animation.renderer.globalData.registerExpressionProperty = registerExpressionProperty;\r\n }\r\n return ob;\r\n}());\r\n\r\nexpressionsPlugin = Expressions;\r\n\r\nvar ExpressionManager = (function(){\r\n 'use strict';\r\n var ob = {};\r\n var Math = BMMath;\r\n var window = null;\r\n var document = null;\r\n\r\n function $bm_isInstanceOfArray(arr) {\r\n return arr.constructor === Array || arr.constructor === Float32Array;\r\n }\r\n\r\n function isNumerable(tOfV, v) {\r\n return tOfV === 'number' || tOfV === 'boolean' || tOfV === 'string' || v instanceof Number;\r\n }\r\n\r\n function $bm_neg(a){\r\n var tOfA = typeof a;\r\n if(tOfA === 'number' || tOfA === 'boolean' || a instanceof Number ){\r\n return -a;\r\n }\r\n if($bm_isInstanceOfArray(a)){\r\n var i, lenA = a.length;\r\n var retArr = [];\r\n for(i=0;i<lenA;i+=1){\r\n retArr[i] = -a[i];\r\n }\r\n return retArr;\r\n }\r\n if (a.propType) {\r\n return a.v;\r\n }\r\n }\r\n\r\n var easeInBez = BezierFactory.getBezierEasing(0.333,0,.833,.833, 'easeIn').get;\r\n var easeOutBez = BezierFactory.getBezierEasing(0.167,0.167,.667,1, 'easeOut').get;\r\n var easeInOutBez = BezierFactory.getBezierEasing(.33,0,.667,1, 'easeInOut').get;\r\n\r\n function sum(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n if(tOfA === 'string' || tOfB === 'string'){\r\n return a + b;\r\n }\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a + b;\r\n }\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n a = a.slice(0);\r\n a[0] = a[0] + b;\r\n return a;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n b = b.slice(0);\r\n b[0] = a + b[0];\r\n return b;\r\n }\r\n if($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)){\r\n \r\n var i = 0, lenA = a.length, lenB = b.length;\r\n var retArr = [];\r\n while(i<lenA || i < lenB){\r\n if((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)){\r\n retArr[i] = a[i] + b[i];\r\n }else{\r\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\r\n }\r\n i += 1;\r\n }\r\n return retArr;\r\n }\r\n return 0;\r\n }\r\n var add = sum;\r\n\r\n function sub(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n if(tOfA === 'string') {\r\n a = parseInt(a);\r\n }\r\n if(tOfB === 'string') {\r\n b = parseInt(b);\r\n }\r\n return a - b;\r\n }\r\n if( $bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n a = a.slice(0);\r\n a[0] = a[0] - b;\r\n return a;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n b = b.slice(0);\r\n b[0] = a - b[0];\r\n return b;\r\n }\r\n if($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)){\r\n var i = 0, lenA = a.length, lenB = b.length;\r\n var retArr = [];\r\n while(i<lenA || i < lenB){\r\n if((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)){\r\n retArr[i] = a[i] - b[i];\r\n }else{\r\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\r\n }\r\n i += 1;\r\n }\r\n return retArr;\r\n }\r\n return 0;\r\n }\r\n\r\n function mul(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n var arr;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a * b;\r\n }\r\n\r\n var i, len;\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n len = a.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a[i] * b;\r\n }\r\n return arr;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n len = b.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a * b[i];\r\n }\r\n return arr;\r\n }\r\n return 0;\r\n }\r\n\r\n function div(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n var arr;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a / b;\r\n }\r\n var i, len;\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n len = a.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a[i] / b;\r\n }\r\n return arr;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n len = b.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a / b[i];\r\n }\r\n return arr;\r\n }\r\n return 0;\r\n }\r\n function mod(a,b) {\r\n if(typeof a === 'string') {\r\n a = parseInt(a);\r\n }\r\n if(typeof b === 'string') {\r\n b = parseInt(b);\r\n }\r\n return a % b;\r\n }\r\n var $bm_sum = sum;\r\n var $bm_sub = sub;\r\n var $bm_mul = mul;\r\n var $bm_div = div;\r\n var $bm_mod = mod;\r\n\r\n function clamp(num, min, max) {\r\n if(min > max){\r\n var mm = max;\r\n max = min;\r\n min = mm;\r\n }\r\n return Math.min(Math.max(num, min), max);\r\n }\r\n\r\n function radiansToDegrees(val) {\r\n return val/degToRads;\r\n }\r\n var radians_to_degrees = radiansToDegrees;\r\n\r\n function degreesToRadians(val) {\r\n return val*degToRads;\r\n }\r\n var degrees_to_radians = radiansToDegrees;\r\n\r\n var helperLengthArray = [0,0,0,0,0,0];\r\n\r\n function length(arr1, arr2) {\r\n if (typeof arr1 === 'number' || arr1 instanceof Number) {\r\n arr2 = arr2 || 0;\r\n return Math.abs(arr1 - arr2);\r\n }\r\n if(!arr2) {\r\n arr2 = helperLengthArray;\r\n }\r\n var i, len = Math.min(arr1.length, arr2.length);\r\n var addedLength = 0;\r\n for (i = 0; i < len; i += 1) {\r\n addedLength += Math.pow(arr2[i] - arr1[i], 2);\r\n }\r\n return Math.sqrt(addedLength);\r\n }\r\n\r\n function normalize(vec) {\r\n return div(vec, length(vec));\r\n }\r\n\r\n function rgbToHsl(val) {\r\n var r = val[0]; var g = val[1]; var b = val[2];\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b);\r\n var h, s, l = (max + min) / 2;\r\n\r\n if(max == min){\r\n h = s = 0; // achromatic\r\n }else{\r\n var d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch(max){\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return [h, s, l,val[3]];\r\n }\r\n\r\n function hue2rgb(p, q, t){\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n function hslToRgb(val){\r\n var h = val[0];\r\n var s = val[1];\r\n var l = val[2];\r\n\r\n var r, g, b;\r\n\r\n if(s === 0){\r\n r = g = b = l; // achromatic\r\n }else{\r\n\r\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n var p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [r, g , b, val[3]];\r\n }\r\n\r\n function linear(t, tMin, tMax, value1, value2){\r\n if(value1 === undefined || value2 === undefined){\r\n value1 = tMin;\r\n value2 = tMax;\r\n tMin = 0;\r\n tMax = 1;\r\n }\r\n if(tMax < tMin) {\r\n var _tMin = tMax;\r\n tMax = tMin;\r\n tMin = _tMin;\r\n }\r\n if(t <= tMin) {\r\n return value1;\r\n }else if(t >= tMax){\r\n return value2;\r\n }\r\n var perc = tMax === tMin ? 0 : (t-tMin)/(tMax-tMin);\r\n if(!value1.length){\r\n return value1 + (value2-value1)*perc;\r\n }\r\n var i, len = value1.length;\r\n var arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = value1[i] + (value2[i]-value1[i])*perc;\r\n }\r\n return arr;\r\n }\r\n function random(min,max){\r\n if(max === undefined){\r\n if(min === undefined){\r\n min = 0;\r\n max = 1;\r\n } else {\r\n max = min;\r\n min = undefined;\r\n }\r\n }\r\n if(max.length){\r\n var i, len = max.length;\r\n if(!min){\r\n min = createTypedArray('float32', len);\r\n }\r\n var arr = createTypedArray('float32', len);\r\n var rnd = BMMath.random();\r\n for(i=0;i<len;i+=1){\r\n arr[i] = min[i] + rnd*(max[i]-min[i]);\r\n }\r\n return arr;\r\n }\r\n if(min === undefined){\r\n min = 0;\r\n }\r\n var rndm = BMMath.random();\r\n return min + rndm*(max-min);\r\n }\r\n\r\n function createPath(points, inTangents, outTangents, closed) {\r\n var i, len = points.length;\r\n var path = shape_pool.newElement();\r\n path.setPathData(!!closed, len);\r\n var arrPlaceholder = [0,0], inVertexPoint, outVertexPoint;\r\n for(i = 0; i < len; i += 1) {\r\n inVertexPoint = (inTangents && inTangents[i]) ? inTangents[i] : arrPlaceholder;\r\n outVertexPoint = (outTangents && outTangents[i]) ? outTangents[i] : arrPlaceholder;\r\n path.setTripleAt(points[i][0],points[i][1],outVertexPoint[0] + points[i][0],outVertexPoint[1] + points[i][1],inVertexPoint[0] + points[i][0],inVertexPoint[1] + points[i][1],i,true);\r\n }\r\n return path;\r\n }\r\n\r\n function initiateExpression(elem,data,property){\r\n var val = data.x;\r\n var needsVelocity = /velocity(?![\\w\\d])/.test(val);\r\n var _needsRandom = val.indexOf('random') !== -1;\r\n var elemType = elem.data.ty;\r\n var transform,$bm_transform,content,effect;\r\n var thisProperty = property;\r\n thisProperty.valueAtTime = thisProperty.getValueAtTime;\r\n Object.defineProperty(thisProperty, 'value', {\r\n get: function() {\r\n return thisProperty.v\r\n }\r\n })\r\n elem.comp.frameDuration = 1/elem.comp.globalData.frameRate;\r\n elem.comp.displayStartTime = 0;\r\n var inPoint = elem.data.ip/elem.comp.globalData.frameRate;\r\n var outPoint = elem.data.op/elem.comp.globalData.frameRate;\r\n var width = elem.data.sw ? elem.data.sw : 0;\r\n var height = elem.data.sh ? elem.data.sh : 0;\r\n var name = elem.data.nm;\r\n var loopIn, loop_in, loopOut, loop_out, smooth;\r\n var toWorld,fromWorld,fromComp,toComp,fromCompToSurface, position, rotation, anchorPoint, scale, thisLayer, thisComp,mask,valueAtTime,velocityAtTime;\r\n var __expression_functions = [];\r\n if(data.xf) {\r\n var i, len = data.xf.length;\r\n for(i = 0; i < len; i += 1) {\r\n __expression_functions[i] = eval('(function(){ return ' + data.xf[i] + '}())');\r\n }\r\n }\r\n\r\n var scoped_bm_rt;\r\n var expression_function = eval('[function _expression_function(){' + val+';scoped_bm_rt=$bm_rt}' + ']')[0];\r\n var numKeys = property.kf ? data.k.length : 0;\r\n\r\n var active = !this.data || this.data.hd !== true;\r\n\r\n var wiggle = function wiggle(freq,amp){\r\n var i,j, len = this.pv.length ? this.pv.length : 1;\r\n var addedAmps = createTypedArray('float32', len);\r\n freq = 5;\r\n var iterations = Math.floor(time*freq);\r\n i = 0;\r\n j = 0;\r\n while(i<iterations){\r\n //var rnd = BMMath.random();\r\n for(j=0;j<len;j+=1){\r\n addedAmps[j] += -amp + amp*2*BMMath.random();\r\n //addedAmps[j] += -amp + amp*2*rnd;\r\n }\r\n i += 1;\r\n }\r\n //var rnd2 = BMMath.random();\r\n var periods = time*freq;\r\n var perc = periods - Math.floor(periods);\r\n var arr = createTypedArray('float32', len);\r\n if(len>1){\r\n for(j=0;j<len;j+=1){\r\n arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*BMMath.random())*perc;\r\n //arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;\r\n //arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);\r\n }\r\n return arr;\r\n } else {\r\n return this.pv + addedAmps[0] + (-amp + amp*2*BMMath.random())*perc;\r\n }\r\n }.bind(this);\r\n\r\n if(thisProperty.loopIn) {\r\n loopIn = thisProperty.loopIn.bind(thisProperty);\r\n loop_in = loopIn;\r\n }\r\n\r\n if(thisProperty.loopOut) {\r\n loopOut = thisProperty.loopOut.bind(thisProperty);\r\n loop_out = loopOut;\r\n }\r\n\r\n if(thisProperty.smooth) {\r\n smooth = thisProperty.smooth.bind(thisProperty);\r\n }\r\n\r\n function loopInDuration(type,duration){\r\n return loopIn(type,duration,true);\r\n }\r\n\r\n function loopOutDuration(type,duration){\r\n return loopOut(type,duration,true);\r\n }\r\n\r\n if(this.getValueAtTime) {\r\n valueAtTime = this.getValueAtTime.bind(this);\r\n }\r\n\r\n if(this.getVelocityAtTime) {\r\n velocityAtTime = this.getVelocityAtTime.bind(this);\r\n }\r\n\r\n var comp = elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);\r\n\r\n function lookAt(elem1,elem2){\r\n var fVec = [elem2[0]-elem1[0],elem2[1]-elem1[1],elem2[2]-elem1[2]];\r\n var pitch = Math.atan2(fVec[0],Math.sqrt(fVec[1]*fVec[1]+fVec[2]*fVec[2]))/degToRads;\r\n var yaw = -Math.atan2(fVec[1],fVec[2])/degToRads;\r\n return [yaw,pitch,0];\r\n }\r\n\r\n function easeOut(t, tMin, tMax, val1, val2){\r\n return applyEase(easeOutBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function easeIn(t, tMin, tMax, val1, val2){\r\n return applyEase(easeInBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function ease(t, tMin, tMax, val1, val2){\r\n return applyEase(easeInOutBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function applyEase(fn, t, tMin, tMax, val1, val2) {\r\n if(val1 === undefined){\r\n val1 = tMin;\r\n val2 = tMax;\r\n } else {\r\n t = (t - tMin) / (tMax - tMin);\r\n }\r\n t = t > 1 ? 1 : t < 0 ? 0 : t;\r\n var mult = fn(t);\r\n if($bm_isInstanceOfArray(val1)) {\r\n var i, len = val1.length;\r\n var arr = createTypedArray('float32', len);\r\n for (i = 0; i < len; i += 1) {\r\n arr[i] = (val2[i] - val1[i]) * mult + val1[i];\r\n }\r\n return arr;\r\n } else {\r\n return (val2 - val1) * mult + val1;\r\n }\r\n }\r\n\r\n function nearestKey(time){\r\n var i, len = data.k.length,index,keyTime;\r\n if(!data.k.length || typeof(data.k[0]) === 'number'){\r\n index = 0;\r\n keyTime = 0;\r\n } else {\r\n index = -1;\r\n time *= elem.comp.globalData.frameRate;\r\n if (time < data.k[0].t) {\r\n index = 1;\r\n keyTime = data.k[0].t;\r\n } else {\r\n for(i=0;i<len-1;i+=1){\r\n if(time === data.k[i].t){\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n break;\r\n }else if(time>data.k[i].t && time<data.k[i+1].t){\r\n if(time-data.k[i].t > data.k[i+1].t - time){\r\n index = i + 2;\r\n keyTime = data.k[i+1].t;\r\n } else {\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n }\r\n break;\r\n }\r\n }\r\n if(index === -1){\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n }\r\n }\r\n \r\n }\r\n var ob = {};\r\n ob.index = index;\r\n ob.time = keyTime/elem.comp.globalData.frameRate;\r\n return ob;\r\n }\r\n\r\n function key(ind){\r\n var ob, i, len;\r\n if(!data.k.length || typeof(data.k[0]) === 'number'){\r\n throw new Error('The property has no keyframe at index ' + ind);\r\n }\r\n ind -= 1;\r\n ob = {\r\n time: data.k[ind].t/elem.comp.globalData.frameRate,\r\n value: []\r\n };\r\n var arr = data.k[ind].hasOwnProperty('s') ? data.k[ind].s : data.k[ind - 1].e;\r\n\r\n len = arr.length;\r\n for(i=0;i<len;i+=1){\r\n ob[i] = arr[i];\r\n ob.value[i] = arr[i]\r\n }\r\n return ob;\r\n }\r\n\r\n function framesToTime(frames, fps) { \r\n if (!fps) {\r\n fps = elem.comp.globalData.frameRate;\r\n }\r\n return frames / fps;\r\n }\r\n\r\n function timeToFrames(t, fps) {\r\n if (!t && t !== 0) {\r\n t = time;\r\n }\r\n if (!fps) {\r\n fps = elem.comp.globalData.frameRate;\r\n }\r\n return t * fps;\r\n }\r\n\r\n function seedRandom(seed){\r\n BMMath.seedrandom(randSeed + seed);\r\n }\r\n\r\n function sourceRectAtTime() {\r\n return elem.sourceRectAtTime();\r\n }\r\n\r\n function substring(init, end) {\r\n if(typeof value === 'string') {\r\n if(end === undefined) {\r\n return value.substring(init)\r\n }\r\n return value.substring(init, end)\r\n }\r\n return '';\r\n }\r\n\r\n function substr(init, end) {\r\n if(typeof value === 'string') {\r\n if(end === undefined) {\r\n return value.substr(init)\r\n }\r\n return value.substr(init, end)\r\n }\r\n return '';\r\n }\r\n\r\n var time, velocity, value, text, textIndex, textTotal, selectorValue;\r\n var index = elem.data.ind;\r\n var hasParent = !!(elem.hierarchy && elem.hierarchy.length);\r\n var parent;\r\n var randSeed = Math.floor(Math.random()*1000000);\r\n var globalData = elem.globalData;\r\n function executeExpression(_value) {\r\n // globalData.pushExpression();\r\n value = _value;\r\n if (_needsRandom) {\r\n seedRandom(randSeed);\r\n }\r\n if (this.frameExpressionId === elem.globalData.frameId && this.propType !== 'textSelector') {\r\n return value;\r\n }\r\n if(this.propType === 'textSelector'){\r\n textIndex = this.textIndex;\r\n textTotal = this.textTotal;\r\n selectorValue = this.selectorValue;\r\n }\r\n if (!thisLayer) {\r\n text = elem.layerInterface.text;\r\n thisLayer = elem.layerInterface;\r\n thisComp = elem.comp.compInterface;\r\n toWorld = thisLayer.toWorld.bind(thisLayer);\r\n fromWorld = thisLayer.fromWorld.bind(thisLayer);\r\n fromComp = thisLayer.fromComp.bind(thisLayer);\r\n toComp = thisLayer.toComp.bind(thisLayer);\r\n mask = thisLayer.mask ? thisLayer.mask.bind(thisLayer) : null;\r\n fromCompToSurface = fromComp;\r\n }\r\n if (!transform) {\r\n transform = elem.layerInterface(\"ADBE Transform Group\");\r\n $bm_transform = transform;\r\n if(transform) {\r\n anchorPoint = transform.anchorPoint;\r\n /*position = transform.position;\r\n rotation = transform.rotation;\r\n scale = transform.scale;*/\r\n }\r\n }\r\n \r\n if (elemType === 4 && !content) {\r\n content = thisLayer(\"ADBE Root Vectors Group\");\r\n }\r\n if (!effect) {\r\n effect = thisLayer(4);\r\n }\r\n hasParent = !!(elem.hierarchy && elem.hierarchy.length);\r\n if (hasParent && !parent) {\r\n parent = elem.hierarchy[0].layerInterface;\r\n }\r\n time = this.comp.renderedFrame/this.comp.globalData.frameRate;\r\n if (needsVelocity) {\r\n velocity = velocityAtTime(time);\r\n }\r\n expression_function();\r\n this.frameExpressionId = elem.globalData.frameId;\r\n\r\n\r\n //TODO: Check if it's possible to return on ShapeInterface the .v value\r\n if (scoped_bm_rt.propType === \"shape\") {\r\n scoped_bm_rt = scoped_bm_rt.v;\r\n }\r\n // globalData.popExpression();\r\n return scoped_bm_rt;\r\n }\r\n return executeExpression;\r\n }\r\n\r\n ob.initiateExpression = initiateExpression;\r\n return ob;\r\n}());\r\nvar expressionHelpers = (function(){\r\n\r\n function searchExpressions(elem,data,prop){\r\n if(data.x){\r\n prop.k = true;\r\n prop.x = true;\r\n prop.initiateExpression = ExpressionManager.initiateExpression;\r\n prop.effectsSequence.push(prop.initiateExpression(elem,data,prop).bind(prop));\r\n }\r\n }\r\n\r\n function getValueAtTime(frameNum) {\r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastFrame) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;\r\n this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime);\r\n this._cachingAtTime.lastFrame = frameNum;\r\n }\r\n return this._cachingAtTime.value;\r\n\r\n }\r\n\r\n function getSpeedAtTime(frameNum) {\r\n var delta = -0.01;\r\n var v1 = this.getValueAtTime(frameNum);\r\n var v2 = this.getValueAtTime(frameNum + delta);\r\n var speed = 0;\r\n if(v1.length){\r\n var i;\r\n for(i=0;i<v1.length;i+=1){\r\n speed += Math.pow(v2[i] - v1[i], 2);\r\n }\r\n speed = Math.sqrt(speed) * 100;\r\n } else {\r\n speed = 0;\r\n }\r\n return speed;\r\n }\r\n\r\n function getVelocityAtTime(frameNum) {\r\n if(this.vel !== undefined){\r\n return this.vel;\r\n }\r\n var delta = -0.001;\r\n //frameNum += this.elem.data.st;\r\n var v1 = this.getValueAtTime(frameNum);\r\n var v2 = this.getValueAtTime(frameNum + delta);\r\n var velocity;\r\n if(v1.length){\r\n velocity = createTypedArray('float32', v1.length);\r\n var i;\r\n for(i=0;i<v1.length;i+=1){\r\n //removing frameRate\r\n //if needed, don't add it here\r\n //velocity[i] = this.elem.globalData.frameRate*((v2[i] - v1[i])/delta);\r\n velocity[i] = (v2[i] - v1[i])/delta;\r\n }\r\n } else {\r\n velocity = (v2 - v1)/delta;\r\n }\r\n return velocity;\r\n }\r\n\r\n function getStaticValueAtTime() {\r\n return this.pv;\r\n }\r\n\r\n function setGroupProperty(propertyGroup){\r\n this.propertyGroup = propertyGroup;\r\n }\r\n\r\n\treturn {\r\n\t\tsearchExpressions: searchExpressions,\r\n\t\tgetSpeedAtTime: getSpeedAtTime,\r\n\t\tgetVelocityAtTime: getVelocityAtTime,\r\n\t\tgetValueAtTime: getValueAtTime,\r\n\t\tgetStaticValueAtTime: getStaticValueAtTime,\r\n\t\tsetGroupProperty: setGroupProperty,\r\n\t}\r\n}());\r\n(function addPropertyDecorator() {\r\n\r\n function loopOut(type,duration,durationFlag){\r\n if(!this.k || !this.keyframes){\r\n return this.pv;\r\n }\r\n type = type ? type.toLowerCase() : '';\r\n var currentFrame = this.comp.renderedFrame;\r\n var keyframes = this.keyframes;\r\n var lastKeyFrame = keyframes[keyframes.length - 1].t;\r\n if(currentFrame<=lastKeyFrame){\r\n return this.pv;\r\n }else{\r\n var cycleDuration, firstKeyFrame;\r\n if(!durationFlag){\r\n if(!duration || duration > keyframes.length - 1){\r\n duration = keyframes.length - 1;\r\n }\r\n firstKeyFrame = keyframes[keyframes.length - 1 - duration].t;\r\n cycleDuration = lastKeyFrame - firstKeyFrame;\r\n } else {\r\n if(!duration){\r\n cycleDuration = Math.max(0,lastKeyFrame - this.elem.data.ip);\r\n } else {\r\n cycleDuration = Math.abs(lastKeyFrame - elem.comp.globalData.frameRate*duration);\r\n }\r\n firstKeyFrame = lastKeyFrame - cycleDuration;\r\n }\r\n var i, len, ret;\r\n if(type === 'pingpong') {\r\n var iterations = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);\r\n if(iterations % 2 !== 0){\r\n return this.getValueAtTime(((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n } else if(type === 'offset'){\r\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0);\r\n var repeats = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);\r\n if(this.pv.length){\r\n ret = new Array(initV.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = (endV[i]-initV[i])*repeats + current[i];\r\n }\r\n return ret;\r\n }\r\n return (endV-initV)*repeats + current;\r\n } else if(type === 'continue'){\r\n var lastValue = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp.globalData.frameRate, 0);\r\n if(this.pv.length){\r\n ret = new Array(lastValue.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = lastValue[i] + (lastValue[i]-nextLastValue[i])*((currentFrame - lastKeyFrame)/ this.comp.globalData.frameRate)/0.0005;\r\n }\r\n return ret;\r\n }\r\n return lastValue + (lastValue-nextLastValue)*(((currentFrame - lastKeyFrame))/0.001);\r\n }\r\n return this.getValueAtTime((((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n }\r\n\r\n function loopIn(type,duration, durationFlag) {\r\n if(!this.k){\r\n return this.pv;\r\n }\r\n type = type ? type.toLowerCase() : '';\r\n var currentFrame = this.comp.renderedFrame;\r\n var keyframes = this.keyframes;\r\n var firstKeyFrame = keyframes[0].t;\r\n if(currentFrame>=firstKeyFrame){\r\n return this.pv;\r\n }else{\r\n var cycleDuration, lastKeyFrame;\r\n if(!durationFlag){\r\n if(!duration || duration > keyframes.length - 1){\r\n duration = keyframes.length - 1;\r\n }\r\n lastKeyFrame = keyframes[duration].t;\r\n cycleDuration = lastKeyFrame - firstKeyFrame;\r\n } else {\r\n if(!duration){\r\n cycleDuration = Math.max(0,this.elem.data.op - firstKeyFrame);\r\n } else {\r\n cycleDuration = Math.abs(elem.comp.globalData.frameRate*duration);\r\n }\r\n lastKeyFrame = firstKeyFrame + cycleDuration;\r\n }\r\n var i, len, ret;\r\n if(type === 'pingpong') {\r\n var iterations = Math.floor((firstKeyFrame - currentFrame)/cycleDuration);\r\n if(iterations % 2 === 0){\r\n return this.getValueAtTime((((firstKeyFrame - currentFrame)%cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n } else if(type === 'offset'){\r\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame)%cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0);\r\n var repeats = Math.floor((firstKeyFrame - currentFrame)/cycleDuration)+1;\r\n if(this.pv.length){\r\n ret = new Array(initV.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = current[i]-(endV[i]-initV[i])*repeats;\r\n }\r\n return ret;\r\n }\r\n return current-(endV-initV)*repeats;\r\n } else if(type === 'continue'){\r\n var firstValue = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp.globalData.frameRate, 0);\r\n if(this.pv.length){\r\n ret = new Array(firstValue.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = firstValue[i] + (firstValue[i]-nextFirstValue[i])*(firstKeyFrame - currentFrame)/0.001;\r\n }\r\n return ret;\r\n }\r\n return firstValue + (firstValue-nextFirstValue)*(firstKeyFrame - currentFrame)/0.001;\r\n }\r\n return this.getValueAtTime(((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n }\r\n\r\n function smooth(width, samples) {\r\n if (!this.k){\r\n return this.pv;\r\n }\r\n width = (width || 0.4) * 0.5;\r\n samples = Math.floor(samples || 5);\r\n if (samples <= 1) {\r\n return this.pv;\r\n }\r\n var currentTime = this.comp.renderedFrame / this.comp.globalData.frameRate;\r\n var initFrame = currentTime - width;\r\n var endFrame = currentTime + width;\r\n var sampleFrequency = samples > 1 ? (endFrame - initFrame) / (samples - 1) : 1;\r\n var i = 0, j = 0;\r\n var value;\r\n if (this.pv.length) {\r\n value = createTypedArray('float32', this.pv.length);\r\n } else {\r\n value = 0;\r\n }\r\n var sampleValue;\r\n while (i < samples) {\r\n sampleValue = this.getValueAtTime(initFrame + i * sampleFrequency);\r\n if(this.pv.length) {\r\n for (j = 0; j < this.pv.length; j += 1) {\r\n value[j] += sampleValue[j];\r\n }\r\n } else {\r\n value += sampleValue;\r\n }\r\n i += 1;\r\n }\r\n if(this.pv.length) {\r\n for (j = 0; j < this.pv.length; j += 1) {\r\n value[j] /= samples;\r\n }\r\n } else {\r\n value /= samples;\r\n }\r\n return value;\r\n }\r\n\r\n function getValueAtTime(frameNum) {\r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastFrame) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;\r\n this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime);\r\n this._cachingAtTime.lastFrame = frameNum;\r\n }\r\n return this._cachingAtTime.value;\r\n\r\n }\r\n\r\n function getTransformValueAtTime(time) {\r\n console.warn('Transform at time not supported');\r\n }\r\n\r\n function getTransformStaticValueAtTime(time) {\r\n\r\n }\r\n\r\n var getTransformProperty = TransformPropertyFactory.getTransformProperty;\r\n TransformPropertyFactory.getTransformProperty = function(elem, data, container) {\r\n var prop = getTransformProperty(elem, data, container);\r\n if(prop.dynamicProperties.length) {\r\n prop.getValueAtTime = getTransformValueAtTime.bind(prop);\r\n } else {\r\n prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);\r\n }\r\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\r\n return prop;\r\n };\r\n\r\n var propertyGetProp = PropertyFactory.getProp;\r\n PropertyFactory.getProp = function(elem,data,type, mult, container){\r\n var prop = propertyGetProp(elem,data,type, mult, container);\r\n //prop.getVelocityAtTime = getVelocityAtTime;\r\n //prop.loopOut = loopOut;\r\n //prop.loopIn = loopIn;\r\n if(prop.kf){\r\n prop.getValueAtTime = expressionHelpers.getValueAtTime.bind(prop);\r\n } else {\r\n prop.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(prop);\r\n }\r\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\r\n prop.loopOut = loopOut;\r\n prop.loopIn = loopIn;\r\n prop.smooth = smooth;\r\n prop.getVelocityAtTime = expressionHelpers.getVelocityAtTime.bind(prop);\r\n prop.getSpeedAtTime = expressionHelpers.getSpeedAtTime.bind(prop);\r\n prop.numKeys = data.a === 1 ? data.k.length : 0;\r\n prop.propertyIndex = data.ix;\r\n var value = 0;\r\n if(type !== 0) {\r\n value = createTypedArray('float32', data.a === 1 ? data.k[0].s.length : data.k.length);\r\n }\r\n prop._cachingAtTime = {\r\n lastFrame: initialDefaultFrame,\r\n lastIndex: 0,\r\n value: value\r\n };\r\n expressionHelpers.searchExpressions(elem,data,prop);\r\n if(prop.k){\r\n container.addDynamicProperty(prop);\r\n }\r\n\r\n return prop;\r\n };\r\n\r\n function getShapeValueAtTime(frameNum) {\r\n //For now this caching object is created only when needed instead of creating it when the shape is initialized.\r\n if (!this._cachingAtTime) {\r\n this._cachingAtTime = {\r\n shapeValue: shape_pool.clone(this.pv),\r\n lastIndex: 0,\r\n lastTime: initialDefaultFrame\r\n };\r\n }\r\n \r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastTime) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastTime < frameNum ? this._caching.lastIndex : 0;\r\n this._cachingAtTime.lastTime = frameNum;\r\n this.interpolateShape(frameNum, this._cachingAtTime.shapeValue, this._cachingAtTime);\r\n }\r\n return this._cachingAtTime.shapeValue;\r\n }\r\n\r\n var ShapePropertyConstructorFunction = ShapePropertyFactory.getConstructorFunction();\r\n var KeyframedShapePropertyConstructorFunction = ShapePropertyFactory.getKeyframedConstructorFunction();\r\n\r\n function ShapeExpressions(){}\r\n ShapeExpressions.prototype = {\r\n vertices: function(prop, time){\r\n if (this.k) {\r\n this.getValue();\r\n }\r\n var shapePath = this.v;\r\n if(time !== undefined) {\r\n shapePath = this.getValueAtTime(time, 0);\r\n }\r\n var i, len = shapePath._length;\r\n var vertices = shapePath[prop];\r\n var points = shapePath.v;\r\n var arr = createSizedArray(len);\r\n for(i = 0; i < len; i += 1) {\r\n if(prop === 'i' || prop === 'o') {\r\n arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]];\r\n } else {\r\n arr[i] = [vertices[i][0], vertices[i][1]];\r\n }\r\n \r\n }\r\n return arr;\r\n },\r\n points: function(time){\r\n return this.vertices('v', time);\r\n },\r\n inTangents: function(time){\r\n return this.vertices('i', time);\r\n },\r\n outTangents: function(time){\r\n return this.vertices('o', time);\r\n },\r\n isClosed: function(){\r\n return this.v.c;\r\n },\r\n pointOnPath: function(perc, time){\r\n var shapePath = this.v;\r\n if(time !== undefined) {\r\n shapePath = this.getValueAtTime(time, 0);\r\n }\r\n if(!this._segmentsLength) {\r\n this._segmentsLength = bez.getSegmentsLength(shapePath);\r\n }\r\n\r\n var segmentsLength = this._segmentsLength;\r\n var lengths = segmentsLength.lengths;\r\n var lengthPos = segmentsLength.totalLength * perc;\r\n var i = 0, len = lengths.length;\r\n var j = 0, jLen;\r\n var accumulatedLength = 0, pt;\r\n while(i < len) {\r\n if(accumulatedLength + lengths[i].addedLength > lengthPos) {\r\n var initIndex = i;\r\n var endIndex = (shapePath.c && i === len - 1) ? 0 : i + 1;\r\n var segmentPerc = (lengthPos - accumulatedLength)/lengths[i].addedLength;\r\n pt = bez.getPointInSegment(shapePath.v[initIndex], shapePath.v[endIndex], shapePath.o[initIndex], shapePath.i[endIndex], segmentPerc, lengths[i]);\r\n break;\r\n } else {\r\n accumulatedLength += lengths[i].addedLength;\r\n }\r\n i += 1;\r\n }\r\n if(!pt){\r\n pt = shapePath.c ? [shapePath.v[0][0],shapePath.v[0][1]]:[shapePath.v[shapePath._length-1][0],shapePath.v[shapePath._length-1][1]];\r\n }\r\n return pt;\r\n },\r\n vectorOnPath: function(perc, time, vectorType){\r\n //perc doesn't use triple equality because it can be a Number object as well as a primitive.\r\n perc = perc == 1 ? this.v.c ? 0 : 0.999 : perc;\r\n var pt1 = this.pointOnPath(perc, time);\r\n var pt2 = this.pointOnPath(perc + 0.001, time);\r\n var xLength = pt2[0] - pt1[0];\r\n var yLength = pt2[1] - pt1[1];\r\n var magnitude = Math.sqrt(Math.pow(xLength,2) + Math.pow(yLength,2));\r\n if (magnitude === 0) {\r\n return [0,0];\r\n }\r\n var unitVector = vectorType === 'tangent' ? [xLength/magnitude, yLength/magnitude] : [-yLength/magnitude, xLength/magnitude];\r\n return unitVector;\r\n },\r\n tangentOnPath: function(perc, time){\r\n return this.vectorOnPath(perc, time, 'tangent');\r\n },\r\n normalOnPath: function(perc, time){\r\n return this.vectorOnPath(perc, time, 'normal');\r\n },\r\n setGroupProperty: expressionHelpers.setGroupProperty,\r\n getValueAtTime: expressionHelpers.getStaticValueAtTime\r\n };\r\n extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction);\r\n extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction);\r\n KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime;\r\n KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression;\r\n\r\n var propertyGetShapeProp = ShapePropertyFactory.getShapeProp;\r\n ShapePropertyFactory.getShapeProp = function(elem,data,type, arr, trims){\r\n var prop = propertyGetShapeProp(elem,data,type, arr, trims);\r\n prop.propertyIndex = data.ix;\r\n prop.lock = false;\r\n if(type === 3){\r\n expressionHelpers.searchExpressions(elem,data.pt,prop);\r\n } else if(type === 4){\r\n expressionHelpers.searchExpressions(elem,data.ks,prop);\r\n }\r\n if(prop.k){\r\n elem.addDynamicProperty(prop);\r\n }\r\n return prop;\r\n };\r\n}());\r\n(function addDecorator() {\r\n\r\n function searchExpressions(){\r\n if(this.data.d.x){\r\n this.calculateExpression = ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this);\r\n this.addEffect(this.getExpressionValue.bind(this));\r\n return true;\r\n }\r\n }\r\n\r\n TextProperty.prototype.getExpressionValue = function(currentValue, text) {\r\n var newValue = this.calculateExpression(text);\r\n if(currentValue.t !== newValue) {\r\n var newData = {};\r\n this.copyData(newData, currentValue);\r\n newData.t = newValue.toString();\r\n newData.__complete = false;\r\n return newData;\r\n }\r\n return currentValue;\r\n }\r\n\r\n TextProperty.prototype.searchProperty = function(){\r\n\r\n var isKeyframed = this.searchKeyframes();\r\n var hasExpressions = this.searchExpressions();\r\n this.kf = isKeyframed || hasExpressions;\r\n return this.kf;\r\n };\r\n\r\n TextProperty.prototype.searchExpressions = searchExpressions;\r\n \r\n}());\r\nvar ShapeExpressionInterface = (function(){\r\n\r\n function iterateElements(shapes,view, propertyGroup){\r\n var arr = [];\r\n var i, len = shapes ? shapes.length : 0;\r\n for(i=0;i<len;i+=1){\r\n if(shapes[i].ty == 'gr'){\r\n arr.push(groupInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'fl'){\r\n arr.push(fillInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'st'){\r\n arr.push(strokeInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'tm'){\r\n arr.push(trimInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'tr'){\r\n //arr.push(transformInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'el'){\r\n arr.push(ellipseInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'sr'){\r\n arr.push(starInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'sh'){\r\n arr.push(pathInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rc'){\r\n arr.push(rectInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rd'){\r\n arr.push(roundedInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rp'){\r\n arr.push(repeaterInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function contentsInterfaceFactory(shape,view, propertyGroup){\r\n var interfaces;\r\n var interfaceFunction = function _interfaceFunction(value){\r\n var i = 0, len = interfaces.length;\r\n while(i<len){\r\n if(interfaces[i]._name === value || interfaces[i].mn === value || interfaces[i].propertyIndex === value || interfaces[i].ix === value || interfaces[i].ind === value){\r\n return interfaces[i];\r\n }\r\n i+=1;\r\n }\r\n if(typeof value === 'number'){\r\n return interfaces[value-1];\r\n }\r\n };\r\n interfaceFunction.propertyGroup = function(val){\r\n if(val === 1){\r\n return interfaceFunction;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n };\r\n interfaces = iterateElements(shape.it, view.it, interfaceFunction.propertyGroup);\r\n interfaceFunction.numProperties = interfaces.length;\r\n interfaceFunction.propertyIndex = shape.cix;\r\n interfaceFunction._name = shape.nm;\r\n\r\n return interfaceFunction;\r\n }\r\n\r\n function groupInterfaceFactory(shape,view, propertyGroup){\r\n var interfaceFunction = function _interfaceFunction(value){\r\n switch(value){\r\n case 'ADBE Vectors Group':\r\n case 'Contents':\r\n case 2:\r\n return interfaceFunction.content;\r\n //Not necessary for now. Keeping them here in case a new case appears\r\n //case 'ADBE Vector Transform Group':\r\n //case 3:\r\n default:\r\n return interfaceFunction.transform;\r\n }\r\n };\r\n interfaceFunction.propertyGroup = function(val){\r\n if(val === 1){\r\n return interfaceFunction;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n };\r\n var content = contentsInterfaceFactory(shape,view,interfaceFunction.propertyGroup);\r\n var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1],view.it[view.it.length - 1],interfaceFunction.propertyGroup);\r\n interfaceFunction.content = content;\r\n interfaceFunction.transform = transformInterface;\r\n Object.defineProperty(interfaceFunction, '_name', {\r\n get: function(){\r\n return shape.nm;\r\n }\r\n });\r\n //interfaceFunction.content = interfaceFunction;\r\n interfaceFunction.numProperties = shape.np;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n interfaceFunction.nm = shape.nm;\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function fillInterfaceFactory(shape,view,propertyGroup){\r\n function interfaceFunction(val){\r\n if(val === 'Color' || val === 'color'){\r\n return interfaceFunction.color;\r\n } else if(val === 'Opacity' || val === 'opacity'){\r\n return interfaceFunction.opacity;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'color': {\r\n get: ExpressionPropertyInterface(view.c)\r\n },\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n '_name': { value: shape.nm },\r\n 'mn': { value: shape.mn }\r\n });\r\n\r\n view.c.setGroupProperty(propertyGroup);\r\n view.o.setGroupProperty(propertyGroup);\r\n return interfaceFunction;\r\n }\r\n\r\n function strokeInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val === 1){\r\n return ob;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n }\r\n function _dashPropertyGroup(val){\r\n if(val === 1){\r\n return dashOb;\r\n } else{\r\n return _propertyGroup(val-1);\r\n }\r\n }\r\n function addPropertyToDashOb(i) {\r\n Object.defineProperty(dashOb, shape.d[i].nm, {\r\n get: ExpressionPropertyInterface(view.d.dataProps[i].p)\r\n });\r\n }\r\n var i, len = shape.d ? shape.d.length : 0;\r\n var dashOb = {};\r\n for (i = 0; i < len; i += 1) {\r\n addPropertyToDashOb(i);\r\n view.d.dataProps[i].p.setGroupProperty(_dashPropertyGroup);\r\n }\r\n\r\n function interfaceFunction(val){\r\n if(val === 'Color' || val === 'color'){\r\n return interfaceFunction.color;\r\n } else if(val === 'Opacity' || val === 'opacity'){\r\n return interfaceFunction.opacity;\r\n } else if(val === 'Stroke Width' || val === 'stroke width'){\r\n return interfaceFunction.strokeWidth;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'color': {\r\n get: ExpressionPropertyInterface(view.c)\r\n },\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n 'strokeWidth': {\r\n get: ExpressionPropertyInterface(view.w)\r\n },\r\n 'dash': {\r\n get: function() {\r\n return dashOb;\r\n }\r\n },\r\n '_name': { value: shape.nm },\r\n 'mn': { value: shape.mn }\r\n });\r\n\r\n view.c.setGroupProperty(_propertyGroup);\r\n view.o.setGroupProperty(_propertyGroup);\r\n view.w.setGroupProperty(_propertyGroup);\r\n return interfaceFunction;\r\n }\r\n\r\n function trimInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n\r\n view.s.setGroupProperty(_propertyGroup);\r\n view.e.setGroupProperty(_propertyGroup);\r\n view.o.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(val){\r\n if(val === shape.e.ix || val === 'End' || val === 'end'){\r\n return interfaceFunction.end;\r\n }\r\n if(val === shape.s.ix){\r\n return interfaceFunction.start;\r\n }\r\n if(val === shape.o.ix){\r\n return interfaceFunction.offset;\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n interfaceFunction.propertyGroup = propertyGroup;\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'start': {\r\n get: ExpressionPropertyInterface(view.s)\r\n },\r\n 'end': {\r\n get: ExpressionPropertyInterface(view.e)\r\n },\r\n 'offset': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function transformInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n view.transform.mProps.o.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.p.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.a.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.s.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.r.setGroupProperty(_propertyGroup);\r\n if(view.transform.mProps.sk){\r\n view.transform.mProps.sk.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.sa.setGroupProperty(_propertyGroup);\r\n }\r\n view.transform.op.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.a.ix === value || value === 'Anchor Point'){\r\n return interfaceFunction.anchorPoint;\r\n }\r\n if(shape.o.ix === value || value === 'Opacity'){\r\n return interfaceFunction.opacity;\r\n }\r\n if(shape.p.ix === value || value === 'Position'){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value || value === 'Rotation' || value === 'ADBE Vector Rotation'){\r\n return interfaceFunction.rotation;\r\n }\r\n if(shape.s.ix === value || value === 'Scale'){\r\n return interfaceFunction.scale;\r\n }\r\n if(shape.sk && shape.sk.ix === value || value === 'Skew'){\r\n return interfaceFunction.skew;\r\n }\r\n if(shape.sa && shape.sa.ix === value || value === 'Skew Axis'){\r\n return interfaceFunction.skewAxis;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.o)\r\n },\r\n 'position': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.p)\r\n },\r\n 'anchorPoint': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.a)\r\n },\r\n 'scale': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.s)\r\n },\r\n 'rotation': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.r)\r\n },\r\n 'skew': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.sk)\r\n },\r\n 'skewAxis': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.sa)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.ty = 'tr';\r\n interfaceFunction.mn = shape.mn;\r\n interfaceFunction.propertyGroup = propertyGroup;\r\n return interfaceFunction;\r\n }\r\n\r\n function ellipseInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n prop.s.setGroupProperty(_propertyGroup);\r\n prop.p.setGroupProperty(_propertyGroup);\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.s.ix === value){\r\n return interfaceFunction.size;\r\n }\r\n }\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'size': {\r\n get: ExpressionPropertyInterface(prop.s)\r\n },\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function starInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.or.setGroupProperty(_propertyGroup);\r\n prop.os.setGroupProperty(_propertyGroup);\r\n prop.pt.setGroupProperty(_propertyGroup);\r\n prop.p.setGroupProperty(_propertyGroup);\r\n prop.r.setGroupProperty(_propertyGroup);\r\n if(shape.ir){\r\n prop.ir.setGroupProperty(_propertyGroup);\r\n prop.is.setGroupProperty(_propertyGroup);\r\n }\r\n\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value){\r\n return interfaceFunction.rotation;\r\n }\r\n if(shape.pt.ix === value){\r\n return interfaceFunction.points;\r\n }\r\n if(shape.or.ix === value || 'ADBE Vector Star Outer Radius' === value){\r\n return interfaceFunction.outerRadius;\r\n }\r\n if(shape.os.ix === value){\r\n return interfaceFunction.outerRoundness;\r\n }\r\n if(shape.ir && (shape.ir.ix === value || 'ADBE Vector Star Inner Radius' === value)){\r\n return interfaceFunction.innerRadius;\r\n }\r\n if(shape.is && shape.is.ix === value){\r\n return interfaceFunction.innerRoundness;\r\n }\r\n\r\n }\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n 'rotation': {\r\n get: ExpressionPropertyInterface(prop.r)\r\n },\r\n 'points': {\r\n get: ExpressionPropertyInterface(prop.pt)\r\n },\r\n 'outerRadius': {\r\n get: ExpressionPropertyInterface(prop.or)\r\n },\r\n 'outerRoundness': {\r\n get: ExpressionPropertyInterface(prop.os)\r\n },\r\n 'innerRadius': {\r\n get: ExpressionPropertyInterface(prop.ir)\r\n },\r\n 'innerRoundness': {\r\n get: ExpressionPropertyInterface(prop.is)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function rectInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.p.setGroupProperty(_propertyGroup);\r\n prop.s.setGroupProperty(_propertyGroup);\r\n prop.r.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value){\r\n return interfaceFunction.roundness;\r\n }\r\n if(shape.s.ix === value || value === 'Size' || value === 'ADBE Vector Rect Size'){\r\n return interfaceFunction.size;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n 'roundness': {\r\n get: ExpressionPropertyInterface(prop.r)\r\n },\r\n 'size': {\r\n get: ExpressionPropertyInterface(prop.s)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function roundedInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.rd.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.r.ix === value || 'Round Corners 1' === value){\r\n return interfaceFunction.radius;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'radius': {\r\n get: ExpressionPropertyInterface(prop.rd)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function repeaterInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.c.setGroupProperty(_propertyGroup);\r\n prop.o.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.c.ix === value || 'Copies' === value){\r\n return interfaceFunction.copies;\r\n } else if(shape.o.ix === value || 'Offset' === value){\r\n return interfaceFunction.offset;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'copies': {\r\n get: ExpressionPropertyInterface(prop.c)\r\n },\r\n 'offset': {\r\n get: ExpressionPropertyInterface(prop.o)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function pathInterfaceFactory(shape,view,propertyGroup){\r\n var prop = view.sh;\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n prop.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(val){\r\n if(val === 'Shape' || val === 'shape' || val === 'Path' || val === 'path' || val === 'ADBE Vector Shape' || val === 2){\r\n return interfaceFunction.path;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'path': {\r\n get: function(){\r\n if(prop.k){\r\n prop.getValue();\r\n }\r\n return prop;\r\n }\r\n },\r\n 'shape': {\r\n get: function(){\r\n if(prop.k){\r\n prop.getValue();\r\n }\r\n return prop;\r\n }\r\n },\r\n '_name': { value: shape.nm },\r\n 'ix': { value: shape.ix },\r\n 'propertyIndex': { value: shape.ix },\r\n 'mn': { value: shape.mn }\r\n });\r\n return interfaceFunction;\r\n }\r\n\r\n return function(shapes,view,propertyGroup) {\r\n var interfaces;\r\n function _interfaceFunction(value){\r\n if(typeof value === 'number'){\r\n return interfaces[value-1];\r\n } else {\r\n var i = 0, len = interfaces.length;\r\n while(i<len){\r\n if(interfaces[i]._name === value){\r\n return interfaces[i];\r\n }\r\n i+=1;\r\n }\r\n }\r\n }\r\n _interfaceFunction.propertyGroup = propertyGroup;\r\n interfaces = iterateElements(shapes, view, _interfaceFunction);\r\n _interfaceFunction.numProperties = interfaces.length;\r\n return _interfaceFunction;\r\n };\r\n}());\r\n\r\nvar TextExpressionInterface = (function(){\r\n\treturn function(elem){\r\n var _prevValue, _sourceText;\r\n function _thisLayerFunction(){\r\n }\r\n Object.defineProperty(_thisLayerFunction, \"sourceText\", {\r\n get: function(){\r\n elem.textProperty.getValue()\r\n var stringValue = elem.textProperty.currentData.t;\r\n if(stringValue !== _prevValue) {\r\n elem.textProperty.currentData.t = _prevValue;\r\n _sourceText = new String(stringValue);\r\n //If stringValue is an empty string, eval returns undefined, so it has to be returned as a String primitive\r\n _sourceText.value = stringValue ? stringValue : new String(stringValue);\r\n }\r\n return _sourceText;\r\n }\r\n });\r\n return _thisLayerFunction;\r\n };\r\n}());\r\nvar LayerExpressionInterface = (function (){\r\n function toWorld(arr, time){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n var transformMat;\r\n if(time) {\r\n //Todo implement value at time on transform properties\r\n //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);\r\n transformMat = this._elem.finalTransform.mProp;\r\n } else {\r\n transformMat = this._elem.finalTransform.mProp;\r\n }\r\n transformMat.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);\r\n }\r\n return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);\r\n }\r\n function fromWorld(arr, time){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n var transformMat;\r\n if(time) {\r\n //Todo implement value at time on transform properties\r\n //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);\r\n transformMat = this._elem.finalTransform.mProp;\r\n } else {\r\n transformMat = this._elem.finalTransform.mProp;\r\n }\r\n transformMat.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n function fromComp(arr){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n\r\n function sampleImage() {\r\n return [1,1,1,1];\r\n }\r\n\r\n\r\n return function(elem){\r\n\r\n var transformInterface;\r\n\r\n function _registerMaskInterface(maskManager){\r\n _thisLayerFunction.mask = new MaskManagerInterface(maskManager, elem);\r\n }\r\n function _registerEffectsInterface(effects){\r\n _thisLayerFunction.effect = effects;\r\n }\r\n\r\n function _thisLayerFunction(name){\r\n switch(name){\r\n case \"ADBE Root Vectors Group\":\r\n case \"Contents\":\r\n case 2:\r\n return _thisLayerFunction.shapeInterface;\r\n case 1:\r\n case 6:\r\n case \"Transform\":\r\n case \"transform\":\r\n case \"ADBE Transform Group\":\r\n return transformInterface;\r\n case 4:\r\n case \"ADBE Effect Parade\":\r\n case \"effects\":\r\n case \"Effects\":\r\n return _thisLayerFunction.effect;\r\n }\r\n }\r\n _thisLayerFunction.toWorld = toWorld;\r\n _thisLayerFunction.fromWorld = fromWorld;\r\n _thisLayerFunction.toComp = toWorld;\r\n _thisLayerFunction.fromComp = fromComp;\r\n _thisLayerFunction.sampleImage = sampleImage;\r\n _thisLayerFunction.sourceRectAtTime = elem.sourceRectAtTime.bind(elem);\r\n _thisLayerFunction._elem = elem;\r\n transformInterface = TransformExpressionInterface(elem.finalTransform.mProp);\r\n var anchorPointDescriptor = getDescriptor(transformInterface, 'anchorPoint');\r\n Object.defineProperties(_thisLayerFunction,{\r\n hasParent: {\r\n get: function(){\r\n return elem.hierarchy.length;\r\n }\r\n },\r\n parent: {\r\n get: function(){\r\n return elem.hierarchy[0].layerInterface;\r\n }\r\n },\r\n rotation: getDescriptor(transformInterface, 'rotation'),\r\n scale: getDescriptor(transformInterface, 'scale'),\r\n position: getDescriptor(transformInterface, 'position'),\r\n opacity: getDescriptor(transformInterface, 'opacity'),\r\n anchorPoint: anchorPointDescriptor,\r\n anchor_point: anchorPointDescriptor,\r\n transform: {\r\n get: function () {\r\n return transformInterface;\r\n }\r\n },\r\n active: {\r\n get: function(){\r\n return elem.isInRange;\r\n }\r\n }\r\n });\r\n\r\n _thisLayerFunction.startTime = elem.data.st;\r\n _thisLayerFunction.index = elem.data.ind;\r\n _thisLayerFunction.source = elem.data.refId;\r\n _thisLayerFunction.height = elem.data.ty === 0 ? elem.data.h : 100;\r\n _thisLayerFunction.width = elem.data.ty === 0 ? elem.data.w : 100;\r\n _thisLayerFunction.inPoint = elem.data.ip/elem.comp.globalData.frameRate;\r\n _thisLayerFunction.outPoint = elem.data.op/elem.comp.globalData.frameRate;\r\n _thisLayerFunction._name = elem.data.nm;\r\n\r\n _thisLayerFunction.registerMaskInterface = _registerMaskInterface;\r\n _thisLayerFunction.registerEffectsInterface = _registerEffectsInterface;\r\n return _thisLayerFunction;\r\n };\r\n}());\r\n\r\nvar CompExpressionInterface = (function () {\r\n return function(comp) {\r\n function _thisLayerFunction(name) {\r\n var i = 0, len = comp.layers.length;\r\n while ( i < len) {\r\n if (comp.layers[i].nm === name || comp.layers[i].ind === name) {\r\n return comp.elements[i].layerInterface;\r\n }\r\n i += 1;\r\n }\r\n return null;\r\n //return {active:false};\r\n }\r\n Object.defineProperty(_thisLayerFunction, \"_name\", { value: comp.data.nm });\r\n _thisLayerFunction.layer = _thisLayerFunction;\r\n _thisLayerFunction.pixelAspect = 1;\r\n _thisLayerFunction.height = comp.data.h || comp.globalData.compSize.h;\r\n _thisLayerFunction.width = comp.data.w || comp.globalData.compSize.w;\r\n _thisLayerFunction.pixelAspect = 1;\r\n _thisLayerFunction.frameDuration = 1 / comp.globalData.frameRate;\r\n _thisLayerFunction.displayStartTime = 0;\r\n _thisLayerFunction.numLayers = comp.layers.length;\r\n return _thisLayerFunction;\r\n };\r\n}());\r\nvar TransformExpressionInterface = (function (){\r\n return function(transform){\r\n function _thisFunction(name){\r\n switch(name){\r\n case \"scale\":\r\n case \"Scale\":\r\n case \"ADBE Scale\":\r\n case 6:\r\n return _thisFunction.scale;\r\n case \"rotation\":\r\n case \"Rotation\":\r\n case \"ADBE Rotation\":\r\n case \"ADBE Rotate Z\":\r\n case 10:\r\n return _thisFunction.rotation;\r\n case \"ADBE Rotate X\":\r\n return _thisFunction.xRotation;\r\n case \"ADBE Rotate Y\":\r\n return _thisFunction.yRotation;\r\n case \"position\":\r\n case \"Position\":\r\n case \"ADBE Position\":\r\n case 2:\r\n return _thisFunction.position;\r\n case 'ADBE Position_0':\r\n return _thisFunction.xPosition;\r\n case 'ADBE Position_1':\r\n return _thisFunction.yPosition;\r\n case 'ADBE Position_2':\r\n return _thisFunction.zPosition;\r\n case \"anchorPoint\":\r\n case \"AnchorPoint\":\r\n case \"Anchor Point\":\r\n case \"ADBE AnchorPoint\":\r\n case 1:\r\n return _thisFunction.anchorPoint;\r\n case \"opacity\":\r\n case \"Opacity\":\r\n case 11:\r\n return _thisFunction.opacity;\r\n }\r\n }\r\n\r\n Object.defineProperty(_thisFunction, \"rotation\", {\r\n get: ExpressionPropertyInterface(transform.r || transform.rz)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"zRotation\", {\r\n get: ExpressionPropertyInterface(transform.rz || transform.r)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"xRotation\", {\r\n get: ExpressionPropertyInterface(transform.rx)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"yRotation\", {\r\n get: ExpressionPropertyInterface(transform.ry)\r\n });\r\n Object.defineProperty(_thisFunction, \"scale\", {\r\n get: ExpressionPropertyInterface(transform.s)\r\n });\r\n\r\n if(transform.p) {\r\n var _transformFactory = ExpressionPropertyInterface(transform.p);\r\n }\r\n Object.defineProperty(_thisFunction, \"position\", {\r\n get: function () {\r\n if(transform.p) {\r\n return _transformFactory();\r\n } else {\r\n return [transform.px.v, transform.py.v, transform.pz ? transform.pz.v : 0];\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"xPosition\", {\r\n get: ExpressionPropertyInterface(transform.px)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"yPosition\", {\r\n get: ExpressionPropertyInterface(transform.py)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"zPosition\", {\r\n get: ExpressionPropertyInterface(transform.pz)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"anchorPoint\", {\r\n get: ExpressionPropertyInterface(transform.a)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"opacity\", {\r\n get: ExpressionPropertyInterface(transform.o)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"skew\", {\r\n get: ExpressionPropertyInterface(transform.sk)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"skewAxis\", {\r\n get: ExpressionPropertyInterface(transform.sa)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"orientation\", {\r\n get: ExpressionPropertyInterface(transform.or)\r\n });\r\n\r\n return _thisFunction;\r\n };\r\n}());\r\nvar ProjectInterface = (function (){\r\n\r\n function registerComposition(comp){\r\n this.compositions.push(comp);\r\n }\r\n\r\n return function(){\r\n function _thisProjectFunction(name){\r\n var i = 0, len = this.compositions.length;\r\n while(i<len){\r\n if(this.compositions[i].data && this.compositions[i].data.nm === name){\r\n if(this.compositions[i].prepareFrame && this.compositions[i].data.xt) {\r\n this.compositions[i].prepareFrame(this.currentFrame);\r\n }\r\n return this.compositions[i].compInterface;\r\n }\r\n i+=1;\r\n }\r\n }\r\n\r\n _thisProjectFunction.compositions = [];\r\n _thisProjectFunction.currentFrame = 0;\r\n\r\n _thisProjectFunction.registerComposition = registerComposition;\r\n\r\n\r\n\r\n return _thisProjectFunction;\r\n };\r\n}());\r\nvar EffectsExpressionInterface = (function (){\r\n var ob = {\r\n createEffectsInterface: createEffectsInterface\r\n };\r\n\r\n function createEffectsInterface(elem, propertyGroup){\r\n if(elem.effectsManager){\r\n\r\n var effectElements = [];\r\n var effectsData = elem.data.ef;\r\n var i, len = elem.effectsManager.effectElements.length;\r\n for(i=0;i<len;i+=1){\r\n effectElements.push(createGroupInterface(effectsData[i],elem.effectsManager.effectElements[i],propertyGroup,elem));\r\n }\r\n\r\n return function(name){\r\n var effects = elem.data.ef || [], i = 0, len = effects.length;\r\n while(i<len) {\r\n if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){\r\n return effectElements[i];\r\n }\r\n i += 1;\r\n }\r\n };\r\n }\r\n }\r\n\r\n function createGroupInterface(data,elements, propertyGroup, elem){\r\n var effectElements = [];\r\n var i, len = data.ef.length;\r\n for(i=0;i<len;i+=1){\r\n if(data.ef[i].ty === 5){\r\n effectElements.push(createGroupInterface(data.ef[i],elements.effectElements[i],elements.effectElements[i].propertyGroup, elem));\r\n } else {\r\n effectElements.push(createValueInterface(elements.effectElements[i],data.ef[i].ty, elem, _propertyGroup));\r\n }\r\n }\r\n\r\n function _propertyGroup(val) {\r\n if(val === 1){\r\n return groupInterface;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n }\r\n\r\n var groupInterface = function(name){\r\n var effects = data.ef, i = 0, len = effects.length;\r\n while(i<len) {\r\n if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){\r\n if(effects[i].ty === 5){\r\n return effectElements[i];\r\n } else {\r\n return effectElements[i]();\r\n }\r\n }\r\n i += 1;\r\n }\r\n return effectElements[0]();\r\n };\r\n\r\n groupInterface.propertyGroup = _propertyGroup;\r\n\r\n if(data.mn === 'ADBE Color Control'){\r\n Object.defineProperty(groupInterface, 'color', {\r\n get: function(){\r\n return effectElements[0]();\r\n }\r\n });\r\n }\r\n Object.defineProperty(groupInterface, 'numProperties', {\r\n get: function(){\r\n return data.np;\r\n }\r\n });\r\n groupInterface.active = groupInterface.enabled = data.en !== 0;\r\n return groupInterface;\r\n }\r\n\r\n function createValueInterface(element, type, elem, propertyGroup){\r\n var expressionProperty = ExpressionPropertyInterface(element.p);\r\n function interfaceFunction(){\r\n if(type === 10){\r\n return elem.comp.compInterface(element.p.v);\r\n }\r\n return expressionProperty();\r\n }\r\n\r\n if(element.p.setGroupProperty) {\r\n element.p.setGroupProperty(propertyGroup);\r\n }\r\n\r\n return interfaceFunction;\r\n }\r\n\r\n return ob;\r\n\r\n}());\r\nvar MaskManagerInterface = (function(){\r\n\r\n\tfunction MaskInterface(mask, data){\r\n\t\tthis._mask = mask;\r\n\t\tthis._data = data;\r\n\t}\r\n\tObject.defineProperty(MaskInterface.prototype, 'maskPath', {\r\n get: function(){\r\n if(this._mask.prop.k){\r\n this._mask.prop.getValue();\r\n }\r\n return this._mask.prop;\r\n }\r\n });\r\n\tObject.defineProperty(MaskInterface.prototype, 'maskOpacity', {\r\n get: function(){\r\n if(this._mask.op.k){\r\n this._mask.op.getValue();\r\n }\r\n return this._mask.op.v * 100;\r\n }\r\n });\r\n\r\n\tvar MaskManager = function(maskManager, elem){\r\n\t\tvar _maskManager = maskManager;\r\n\t\tvar _elem = elem;\r\n\t\tvar _masksInterfaces = createSizedArray(maskManager.viewData.length);\r\n\t\tvar i, len = maskManager.viewData.length;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\t_masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);\r\n\t\t}\r\n\r\n\t\tvar maskFunction = function(name){\r\n\t\t\ti = 0;\r\n\t\t while(i<len){\r\n\t\t if(maskManager.masksProperties[i].nm === name){\r\n\t\t return _masksInterfaces[i];\r\n\t\t }\r\n\t\t i += 1;\r\n\t\t }\r\n\t\t};\r\n\t\treturn maskFunction;\r\n\t};\r\n\treturn MaskManager;\r\n}());\r\n\r\nvar ExpressionPropertyInterface = (function() {\r\n\r\n var defaultUnidimensionalValue = {pv:0, v:0, mult: 1}\r\n var defaultMultidimensionalValue = {pv:[0,0,0], v:[0,0,0], mult: 1}\r\n\r\n function completeProperty(expressionValue, property, type) {\r\n Object.defineProperty(expressionValue, 'velocity', {\r\n get: function(){\r\n return property.getVelocityAtTime(property.comp.currentFrame);\r\n }\r\n });\r\n expressionValue.numKeys = property.keyframes ? property.keyframes.length : 0;\r\n expressionValue.key = function(pos) {\r\n if (!expressionValue.numKeys) {\r\n return 0;\r\n } else {\r\n var value = '';\r\n if ('s' in property.keyframes[pos-1]) {\r\n value = property.keyframes[pos-1].s;\r\n } else if ('e' in property.keyframes[pos-2]) {\r\n value = property.keyframes[pos-2].e;\r\n } else {\r\n value = property.keyframes[pos-2].s;\r\n }\r\n var valueProp = type === 'unidimensional' ? new Number(value) : Object.assign({}, value);\r\n valueProp.time = property.keyframes[pos-1].t / property.elem.comp.globalData.frameRate;\r\n return valueProp;\r\n }\r\n };\r\n expressionValue.valueAtTime = property.getValueAtTime;\r\n expressionValue.speedAtTime = property.getSpeedAtTime;\r\n expressionValue.velocityAtTime = property.getVelocityAtTime;\r\n expressionValue.propertyGroup = property.propertyGroup;\r\n }\r\n\r\n function UnidimensionalPropertyInterface(property) {\r\n if(!property || !('pv' in property)) {\r\n property = defaultUnidimensionalValue;\r\n }\r\n var mult = 1 / property.mult;\r\n var val = property.pv * mult;\r\n var expressionValue = new Number(val);\r\n expressionValue.value = val;\r\n completeProperty(expressionValue, property, 'unidimensional');\r\n\r\n return function() {\r\n if (property.k) {\r\n property.getValue();\r\n }\r\n val = property.v * mult;\r\n if(expressionValue.value !== val) {\r\n expressionValue = new Number(val);\r\n expressionValue.value = val;\r\n completeProperty(expressionValue, property, 'unidimensional');\r\n }\r\n return expressionValue;\r\n }\r\n }\r\n\r\n function MultidimensionalPropertyInterface(property) {\r\n if(!property || !('pv' in property)) {\r\n property = defaultMultidimensionalValue;\r\n }\r\n var mult = 1 / property.mult;\r\n var len = property.pv.length;\r\n var expressionValue = createTypedArray('float32', len);\r\n var arrValue = createTypedArray('float32', len);\r\n expressionValue.value = arrValue;\r\n completeProperty(expressionValue, property, 'multidimensional');\r\n\r\n return function() {\r\n if (property.k) {\r\n property.getValue();\r\n }\r\n for (var i = 0; i < len; i += 1) {\r\n expressionValue[i] = arrValue[i] = property.v[i] * mult;\r\n }\r\n return expressionValue;\r\n }\r\n }\r\n\r\n //TODO: try to avoid using this getter\r\n function defaultGetter() {\r\n return defaultUnidimensionalValue;\r\n }\r\n \r\n return function(property) {\r\n if(!property) {\r\n return defaultGetter;\r\n } else if (property.propType === 'unidimensional') {\r\n return UnidimensionalPropertyInterface(property);\r\n } else {\r\n return MultidimensionalPropertyInterface(property);\r\n }\r\n }\r\n}());\r\n\r\n(function(){\r\n\r\n var TextExpressionSelectorProp = (function(){\r\n\r\n function getValueProxy(index,total){\r\n this.textIndex = index+1;\r\n this.textTotal = total;\r\n this.v = this.getValue() * this.mult;\r\n return this.v;\r\n }\r\n\r\n return function TextExpressionSelectorProp(elem,data){\r\n this.pv = 1;\r\n this.comp = elem.comp;\r\n this.elem = elem;\r\n this.mult = 0.01;\r\n this.propType = 'textSelector';\r\n this.textTotal = data.totalChars;\r\n this.selectorValue = 100;\r\n this.lastValue = [1,1,1];\r\n this.k = true;\r\n this.x = true;\r\n this.getValue = ExpressionManager.initiateExpression.bind(this)(elem,data,this);\r\n this.getMult = getValueProxy;\r\n this.getVelocityAtTime = expressionHelpers.getVelocityAtTime;\r\n if(this.kf){\r\n this.getValueAtTime = expressionHelpers.getValueAtTime.bind(this);\r\n } else {\r\n this.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(this);\r\n }\r\n this.setGroupProperty = expressionHelpers.setGroupProperty;\r\n };\r\n }());\r\n\r\n\tvar propertyGetTextProp = TextSelectorProp.getTextSelectorProp;\r\n\tTextSelectorProp.getTextSelectorProp = function(elem, data,arr){\r\n\t if(data.t === 1){\r\n\t return new TextExpressionSelectorProp(elem, data,arr);\r\n\t } else {\r\n\t return propertyGetTextProp(elem,data,arr);\r\n\t }\r\n\t};\r\n}());\r\nfunction SliderEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction AngleEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction ColorEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,1,0,container);\r\n}\r\nfunction PointEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,1,0,container);\r\n}\r\nfunction LayerIndexEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction MaskIndexEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction CheckboxEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction NoValueEffect(){\r\n this.p = {};\r\n}\r\nfunction EffectsManager(){}\r\nfunction EffectsManager(data,element){\r\n var effects = data.ef || [];\r\n this.effectElements = [];\r\n var i,len = effects.length;\r\n var effectItem;\r\n for(i=0;i<len;i++) {\r\n effectItem = new GroupEffect(effects[i],element);\r\n this.effectElements.push(effectItem);\r\n }\r\n}\r\n\r\nfunction GroupEffect(data,element){\r\n this.init(data,element);\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], GroupEffect);\r\n\r\nGroupEffect.prototype.getValue = GroupEffect.prototype.iterateDynamicProperties;\r\n\r\nGroupEffect.prototype.init = function(data,element){\r\n this.data = data;\r\n this.effectElements = [];\r\n this.initDynamicPropertyContainer(element);\r\n var i, len = this.data.ef.length;\r\n var eff, effects = this.data.ef;\r\n for(i=0;i<len;i+=1){\r\n eff = null;\r\n switch(effects[i].ty){\r\n case 0:\r\n eff = new SliderEffect(effects[i],element,this);\r\n break;\r\n case 1:\r\n eff = new AngleEffect(effects[i],element,this);\r\n break;\r\n case 2:\r\n eff = new ColorEffect(effects[i],element,this);\r\n break;\r\n case 3:\r\n eff = new PointEffect(effects[i],element,this);\r\n break;\r\n case 4:\r\n case 7:\r\n eff = new CheckboxEffect(effects[i],element,this);\r\n break;\r\n case 10:\r\n eff = new LayerIndexEffect(effects[i],element,this);\r\n break;\r\n case 11:\r\n eff = new MaskIndexEffect(effects[i],element,this);\r\n break;\r\n case 5:\r\n eff = new EffectsManager(effects[i],element,this);\r\n break;\r\n //case 6:\r\n default:\r\n eff = new NoValueEffect(effects[i],element,this);\r\n break;\r\n }\r\n if(eff) {\r\n this.effectElements.push(eff);\r\n }\r\n }\r\n};\r\n\r\n var lottiejs = {};\r\n\r\n var _isFrozen = false;\r\n\r\n function setLocationHref (href) {\r\n locationHref = href;\r\n }\r\n\r\n function searchAnimations() {\r\n if (standalone === true) {\r\n animationManager.searchAnimations(animationData, standalone, renderer);\r\n } else {\r\n animationManager.searchAnimations();\r\n }\r\n }\r\n\r\n function setSubframeRendering(flag) {\r\n subframeEnabled = flag;\r\n }\r\n\r\n function loadAnimation(params) {\r\n if (standalone === true) {\r\n params.animationData = JSON.parse(animationData);\r\n }\r\n return animationManager.loadAnimation(params);\r\n }\r\n\r\n function setQuality(value) {\r\n if (typeof value === 'string') {\r\n switch (value) {\r\n case 'high':\r\n defaultCurveSegments = 200;\r\n break;\r\n case 'medium':\r\n defaultCurveSegments = 50;\r\n break;\r\n case 'low':\r\n defaultCurveSegments = 10;\r\n break;\r\n }\r\n } else if (!isNaN(value) && value > 1) {\r\n defaultCurveSegments = value;\r\n }\r\n if (defaultCurveSegments >= 50) {\r\n roundValues(false);\r\n } else {\r\n roundValues(true);\r\n }\r\n }\r\n\r\n function inBrowser() {\r\n return typeof navigator !== 'undefined';\r\n }\r\n\r\n function installPlugin(type, plugin) {\r\n if (type === 'expressions') {\r\n expressionsPlugin = plugin;\r\n }\r\n }\r\n\r\n function getFactory(name) {\r\n switch (name) {\r\n case \"propertyFactory\":\r\n return PropertyFactory;\r\n case \"shapePropertyFactory\":\r\n return ShapePropertyFactory;\r\n case \"matrix\":\r\n return Matrix;\r\n }\r\n }\r\n\r\n lottiejs.play = animationManager.play;\r\n lottiejs.pause = animationManager.pause;\r\n lottiejs.setLocationHref = setLocationHref;\r\n lottiejs.togglePause = animationManager.togglePause;\r\n lottiejs.setSpeed = animationManager.setSpeed;\r\n lottiejs.setDirection = animationManager.setDirection;\r\n lottiejs.stop = animationManager.stop;\r\n lottiejs.searchAnimations = searchAnimations;\r\n lottiejs.registerAnimation = animationManager.registerAnimation;\r\n lottiejs.loadAnimation = loadAnimation;\r\n lottiejs.setSubframeRendering = setSubframeRendering;\r\n lottiejs.resize = animationManager.resize;\r\n //lottiejs.start = start;\r\n lottiejs.goToAndStop = animationManager.goToAndStop;\r\n lottiejs.destroy = animationManager.destroy;\r\n lottiejs.setQuality = setQuality;\r\n lottiejs.inBrowser = inBrowser;\r\n lottiejs.installPlugin = installPlugin;\r\n lottiejs.freeze = animationManager.freeze;\r\n lottiejs.unfreeze = animationManager.unfreeze;\r\n lottiejs.getRegisteredAnimations = animationManager.getRegisteredAnimations;\r\n lottiejs.__getFactory = getFactory;\r\n lottiejs.version = '5.5.9';\r\n\r\n function checkReady() {\r\n if (document.readyState === \"complete\") {\r\n clearInterval(readyStateCheckInterval);\r\n searchAnimations();\r\n }\r\n }\r\n\r\n function getQueryVariable(variable) {\r\n var vars = queryString.split('&');\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split('=');\r\n if (decodeURIComponent(pair[0]) == variable) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n }\r\n var standalone = '__[STANDALONE]__';\r\n var animationData = '__[ANIMATIONDATA]__';\r\n var renderer = '';\r\n if (standalone) {\r\n var scripts = document.getElementsByTagName('script');\r\n var index = scripts.length - 1;\r\n var myScript = scripts[index] || {\r\n src: ''\r\n };\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n renderer = getQueryVariable('renderer');\r\n }\r\n var readyStateCheckInterval = setInterval(checkReady, 100);\r\n return lottiejs;\r\n}));\r\n"
},
{
"id": 11,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/runtime/getUrl.js",
"name": "./node_modules/css-loader/dist/runtime/getUrl.js",
"index": 9,
"index2": 6,
"size": 626,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/getUrl.js",
"loc": "3:13-76"
},
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/getUrl.js",
"loc": "3:13-76"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\n\nmodule.exports = function (url, needQuotes) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n url = url.__esModule ? url.default : url;\n\n if (typeof url !== 'string') {\n return url;\n } // If url is already wrapped in quotes, remove them\n\n\n if (/^['\"].*['\"]$/.test(url)) {\n // eslint-disable-next-line no-param-reassign\n url = url.slice(1, -1);\n } // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n\n\n if (/[\"'() \\t\\n]/.test(url) || needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n'), \"\\\"\");\n }\n\n return url;\n};"
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"index": 18,
"index2": 37,
"size": 229721,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "../lib/services",
"loc": "6:17-43"
},
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./lib/services",
"loc": "10:17-42"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"./mtproto\");\nvar utils_1 = require(\"./utils\");\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar richtextprocessor_1 = require(\"./richtextprocessor\");\nvar misc_1 = require(\"../components/misc\");\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar bin_utils_1 = require(\"./bin_utils\");\nvar lottie_web_1 = __importDefault(require(\"lottie-web\"));\nlottie_web_1.default.setQuality('low');\nvar _ = function (str) { return str; };\nvar $rootScope = {\n $broadcast: function (name, detail) {\n console.log(utils_1.dT(), 'Broadcasting ' + name + ' event, with args:', detail);\n //console.trace();\n var myCustomEvent = new CustomEvent(name, { detail: detail });\n document.dispatchEvent(myCustomEvent);\n },\n $on: function (name, callback) {\n document.addEventListener(name, callback);\n },\n selectedPeerID: 0,\n idle: {\n isIDLE: false\n }\n};\nvar AppUsersManager = /** @class */ (function () {\n function AppUsersManager() {\n var _this = this;\n this.users = {};\n this.usernames = {};\n this.userAccess = {};\n this.cachedPhotoLocations = {};\n this.contactsIndex = utils_1.SearchIndexManager.createIndex();\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n setInterval(this.updateUsersStatuses.bind(this), 60000);\n $rootScope.$on('stateSynchronized', this.updateUsersStatuses.bind(this));\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n console.log('on apiUpdate', update);\n switch (update._) {\n case 'updateUserStatus':\n var userID = update.user_id;\n var user = _this.users[userID];\n if (user) {\n user.status = update.status;\n if (user.status) {\n if (user.status.expires) {\n user.status.expires -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (user.status.was_online) {\n user.status.was_online -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n }\n user.sortStatus = _this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', userID);\n }\n else\n console.warn('No user by id:', userID);\n break;\n case 'updateUserPhoto':\n var userID = update.user_id;\n var user = _this.users[userID];\n if (user) {\n _this.forceUserOnline(userID);\n if (!user.photo) {\n user.photo = update.photo;\n }\n else {\n utils_1.safeReplaceObject(user.photo, update.photo);\n }\n if (_this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(_this.cachedPhotoLocations[userID], update.photo ?\n update.photo : { empty: true });\n }\n $rootScope.$broadcast('user_update', userID);\n }\n else\n console.warn('No user by id:', userID);\n break;\n case 'updateContactLink':\n _this.onContactUpdated(update.user_id, update.my_link._ == 'contactLinkContact');\n break;\n }\n });\n }\n /* public fillContacts () {\n if(this.contactsFillPromise) {\n return this.contactsFillPromise;\n }\n \n return this.contactsFillPromise = MTProto.apiManager.invokeApi('contacts.getContacts', {\n hash: 0\n }).then((result: any) => {\n var userID, searchText;\n var i;\n this.contactsList = [];\n this.saveApiUsers(result.users);\n \n for(var i = 0; i < result.contacts.length; i++) {\n userID = result.contacts[i].user_id\n this.contactsList.push(userID);\n //SearchIndexManager.indexObject(userID, getUserSearchText(userID), contactsIndex); WARNING\n }\n \n return this.contactsList;\n })\n } */\n AppUsersManager.prototype.getUserSearchText = function (id) {\n var user = this.users[id];\n if (!user) {\n return false;\n }\n var serviceText = '';\n if (user.pFlags.self) {\n serviceText = 'user_name_saved_msgs_raw';\n }\n return (user.first_name || '') +\n ' ' + (user.last_name || '') +\n ' ' + (user.phone || '') +\n ' ' + (user.username || '') +\n ' ' + serviceText;\n };\n /* function getContacts (query) {\n return fillContacts().then(function (contactsList) {\n if (angular.isString(query) && query.length) {\n var results = SearchIndexManager.search(query, contactsIndex)\n var filteredContactsList = []\n \n for (var i = 0; i < contactsList.length; i++) {\n if (results[contactsList[i]]) {\n filteredContactsList.push(contactsList[i])\n }\n }\n contactsList = filteredContactsList\n }\n \n contactsList.sort(function (userID1, userID2) {\n var sortName1 = (users[userID1] || {}.sortName) || ''\n var sortName2 = (users[userID2] || {}.sortName) || ''\n if (sortName1 == sortName2) {\n return 0\n }\n return sortName1 > sortName2 ? 1 : -1\n })\n \n return contactsList\n })\n } */\n AppUsersManager.prototype.resolveUsername = function (username) {\n return this.usernames[username] || 0;\n };\n AppUsersManager.prototype.saveApiUsers = function (apiUsers) {\n // @ts-ignore\n apiUsers.forEach(this.saveApiUser.bind(this));\n };\n AppUsersManager.prototype.saveApiUser = function (apiUser, noReplace) {\n if (!utils_1.isObject(apiUser) ||\n noReplace && utils_1.isObject(this.users[apiUser.id]) && this.users[apiUser.id].first_name) {\n return;\n }\n var userID = apiUser.id;\n var result = this.users[userID];\n if (apiUser.pFlags === undefined) {\n apiUser.pFlags = {};\n }\n if (apiUser.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiUser.phone) {\n //apiUser.rPhone = $filter('phoneNumber')(apiUser.phone); // warning\n }\n apiUser.num = (Math.abs(userID) % 8) + 1;\n if (apiUser.first_name) {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name, { noLinks: true, noLinebreaks: true });\n apiUser.rFullName = apiUser.last_name ? richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name + ' ' + (apiUser.last_name || ''), { noLinks: true, noLinebreaks: true }) : apiUser.rFirstName;\n }\n else {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_first_name_deleted';\n apiUser.rFullName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_name_deleted';\n }\n if (apiUser.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiUser.username);\n this.usernames[searchUsername] = userID;\n }\n apiUser.sortName = apiUser.pFlags.deleted ? '' : utils_1.SearchIndexManager.cleanSearchText(apiUser.first_name + ' ' + (apiUser.last_name || ''));\n var nameWords = apiUser.sortName.split(' ');\n var firstWord = nameWords.shift();\n var lastWord = nameWords.pop();\n apiUser.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n if (apiUser.status) {\n if (apiUser.status.expires) {\n apiUser.status.expires -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (apiUser.status.was_online) {\n apiUser.status.was_online -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n }\n if (apiUser.pFlags.bot) {\n apiUser.sortStatus = -1;\n }\n else {\n apiUser.sortStatus = this.getUserStatusForSort(apiUser.status);\n }\n var result = this.users[userID];\n if (result === undefined) {\n result = this.users[userID] = apiUser;\n }\n else {\n utils_1.safeReplaceObject(result, apiUser);\n }\n $rootScope.$broadcast('user_update', userID);\n if (this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[userID], apiUser &&\n apiUser.photo ? apiUser.photo : { empty: true });\n }\n };\n AppUsersManager.prototype.saveUserAccess = function (id, accessHash) {\n this.userAccess[id] = accessHash;\n };\n AppUsersManager.prototype.getUserStatusForSort = function (status) {\n if (status) {\n var expires = status.expires || status.was_online;\n if (expires) {\n return expires;\n }\n var timeNow = utils_1.tsNow(true);\n switch (status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n }\n }\n return 0;\n };\n AppUsersManager.prototype.getUser = function (id) {\n if (utils_1.isObject(id)) {\n return id;\n }\n return this.users[id] || { id: id, deleted: true, num: 1, access_hash: this.userAccess[id] };\n };\n AppUsersManager.prototype.getSelf = function () {\n return this.getUser(this.myID);\n };\n AppUsersManager.prototype.isBot = function (id) {\n return this.users[id] && this.users[id].pFlags.bot;\n };\n AppUsersManager.prototype.hasUser = function (id, allowMin) {\n var user = this.users[id];\n return utils_1.isObject(user) && (allowMin || !user.pFlags.min);\n };\n AppUsersManager.prototype.getUserPhoto = function (id) {\n var user = this.getUser(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = user && user.photo ? user.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n };\n AppUsersManager.prototype.getUserString = function (id) {\n var user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n };\n AppUsersManager.prototype.getUserInput = function (id) {\n var user = this.getUser(id);\n if (user.pFlags.self) {\n return { _: 'inputUserSelf' };\n }\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash || 0\n };\n };\n AppUsersManager.prototype.updateUsersStatuses = function () {\n var timestampNow = utils_1.tsNow(true);\n for (var i in this.users) {\n var user = this.users[i];\n if (user.status &&\n user.status._ == 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = user.status.wasStatus || { _: 'userStatusOffline', was_online: user.status.expires };\n delete user.status.wasStatus;\n $rootScope.$broadcast('user_update', user.id);\n }\n }\n };\n AppUsersManager.prototype.forceUserOnline = function (id) {\n if (this.isBot(id)) {\n return;\n }\n var user = this.getUser(id);\n if (user &&\n user.status &&\n user.status._ != 'userStatusOnline' &&\n user.status._ != 'userStatusEmpty') {\n var wasStatus;\n if (user.status._ != 'userStatusOffline') {\n delete user.status.wasStatus;\n wasStatus = utils_1.copy(user.status);\n }\n user.status = {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 60,\n wasStatus: wasStatus\n };\n user.sortStatus = this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', id);\n }\n };\n AppUsersManager.prototype.wrapForFull = function (id) {\n var user = this.getUser(id);\n return user;\n };\n /* public openUser(userID: number, override) {\n var scope = $rootScope.$new()\n scope.userID = userID\n scope.override = override || {}\n \n var modalInstance = $modal.open({\n templateUrl: templateUrl('user_modal'),\n controller: 'UserModalController',\n scope: scope,\n windowClass: 'user_modal_window mobile_modal',\n backdrop: 'single'\n })\n } */\n /* function importContact (phone, firstName, lastName) {\n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: [{\n _: 'inputPhoneContact',\n client_id: '1',\n phone: phone,\n first_name: firstName,\n last_name: lastName\n }],\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var foundUserID = false\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(foundUserID = importedContact.user_id, true)\n })\n \n return foundUserID || false\n })\n }\n \n function importContacts (contacts) {\n var inputContacts = [],\n i\n var j\n \n for (i = 0; i < contacts.length; i++) {\n for (j = 0; j < contacts[i].phones.length; j++) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n })\n }\n }\n \n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts,\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var result = []\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(importedContact.user_id, true)\n result.push(importedContact.user_id)\n })\n \n return result\n })\n } */\n AppUsersManager.prototype.deleteContacts = function (userIDs) {\n var _this = this;\n var ids = [];\n userIDs.forEach(function (userID) {\n ids.push(_this.getUserInput(userID));\n });\n return mtproto_1.MTProto.apiManager.invokeApi('contacts.deleteContacts', {\n id: ids\n }).then(function () {\n userIDs.forEach(function (userID) {\n _this.onContactUpdated(userID, false);\n });\n });\n };\n AppUsersManager.prototype.onContactUpdated = function (userID, isContact) {\n userID = parseInt('' + userID);\n if (Array.isArray(this.contactsList)) {\n var curPos = this.contactsList.indexOf(userID);\n var curIsContact = curPos != -1;\n if (isContact != curIsContact) {\n if (isContact) {\n this.contactsList.push(userID);\n utils_1.SearchIndexManager.indexObject(userID, this.getUserSearchText(userID), this.contactsIndex);\n }\n else {\n this.contactsList.splice(curPos, 1);\n }\n $rootScope.$broadcast('contacts_update', userID);\n }\n }\n };\n /* function openImportContact () {\n return $modal.open({\n templateUrl: templateUrl('import_contact_modal'),\n controller: 'ImportContactModalController',\n windowClass: 'md_simple_modal_window mobile_modal'\n }).result.then(function (foundUserID) {\n if (!foundUserID) {\n return $q.reject()\n }\n return foundUserID\n })\n } */\n AppUsersManager.prototype.setUserStatus = function (userID, offline) {\n if (this.isBot(userID)) {\n return;\n }\n var user = this.users[userID];\n if (user) {\n var status = offline ? {\n _: 'userStatusOffline',\n was_online: utils_1.tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 500\n };\n user.status = status;\n user.sortStatus = this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', userID);\n }\n };\n return AppUsersManager;\n}());\nvar AppChatsManager = /** @class */ (function () {\n function AppChatsManager() {\n this.chats = {};\n this.usernames = {};\n this.channelAccess = {};\n this.megagroups = {};\n this.cachedPhotoLocations = {};\n $rootScope.$on('apiUpdate', function (e) {\n // console.log('on apiUpdate', update)\n var update = e.detail;\n switch (update._) {\n case 'updateChannel':\n var channelID = update.channel_id;\n $rootScope.$broadcast('channel_settings', { channelID: channelID });\n break;\n }\n });\n }\n AppChatsManager.prototype.saveApiChats = function (apiChats) {\n apiChats.forEach(this.saveApiChat.bind(this));\n };\n AppChatsManager.prototype.saveApiChat = function (apiChat) {\n if (!utils_1.isObject(apiChat)) {\n return;\n }\n apiChat.rTitle = apiChat.title || 'chat_title_deleted';\n apiChat.rTitle = richtextprocessor_1.RichTextProcessor.wrapRichText(apiChat.title, { noLinks: true, noLinebreaks: true }) || 'chat_title_deleted';\n var result = this.chats[apiChat.id];\n var titleWords = utils_1.SearchIndexManager.cleanSearchText(apiChat.title || '').split(' ');\n var firstWord = titleWords.shift();\n var lastWord = titleWords.pop();\n apiChat.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n apiChat.num = (Math.abs(apiChat.id >> 1) % 8) + 1;\n if (apiChat.pFlags === undefined) {\n apiChat.pFlags = {};\n }\n if (apiChat.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiChat._ == 'channel' &&\n apiChat.participants_count === undefined &&\n result !== undefined &&\n result.participants_count) {\n apiChat.participants_count = result.participants_count;\n }\n if (apiChat.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiChat.username);\n this.usernames[searchUsername] = apiChat.id;\n }\n if (result === undefined) {\n result = this.chats[apiChat.id] = apiChat;\n }\n else {\n utils_1.safeReplaceObject(result, apiChat);\n $rootScope.$broadcast('chat_update', apiChat.id);\n }\n if (this.cachedPhotoLocations[apiChat.id] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[apiChat.id], apiChat &&\n apiChat.photo ? apiChat.photo : { empty: true });\n }\n };\n AppChatsManager.prototype.getChat = function (id) {\n return this.chats[id] || { id: id, deleted: true, access_hash: this.channelAccess[id] };\n };\n AppChatsManager.prototype.hasRights = function (id, action) {\n if (!(id in this.chats)) {\n return false;\n }\n var chat = this.getChat(id);\n if (chat._ == 'chatForbidden' ||\n chat._ == 'channelForbidden' ||\n chat.pFlags.kicked ||\n chat.pFlags.left) {\n return false;\n }\n if (chat.pFlags.creator) {\n return true;\n }\n switch (action) {\n case 'send':\n if (chat._ == 'channel' &&\n !chat.pFlags.megagroup &&\n !chat.pFlags.editor) {\n return false;\n }\n break;\n case 'edit_title':\n case 'edit_photo':\n case 'invite':\n if (chat._ == 'channel') {\n if (chat.pFlags.megagroup) {\n if (!chat.pFlags.editor &&\n !(action == 'invite' && chat.pFlags.democracy)) {\n return false;\n }\n }\n else {\n return false;\n }\n }\n else {\n if (chat.pFlags.admins_enabled &&\n !chat.pFlags.admin) {\n return false;\n }\n }\n break;\n }\n return true;\n };\n AppChatsManager.prototype.resolveUsername = function (username) {\n return this.usernames[username] || 0;\n };\n AppChatsManager.prototype.saveChannelAccess = function (id, accessHash) {\n this.channelAccess[id] = accessHash;\n };\n AppChatsManager.prototype.saveIsMegagroup = function (id) {\n this.megagroups[id] = true;\n };\n AppChatsManager.prototype.isChannel = function (id) {\n var chat = this.chats[id];\n if (chat && (chat._ == 'channel' || chat._ == 'channelForbidden') ||\n this.channelAccess[id]) {\n return true;\n }\n return false;\n };\n AppChatsManager.prototype.isMegagroup = function (id) {\n if (this.megagroups[id]) {\n return true;\n }\n var chat = this.chats[id];\n if (chat && chat._ == 'channel' && chat.pFlags.megagroup) {\n return true;\n }\n return false;\n };\n AppChatsManager.prototype.isBroadcast = function (id) {\n return this.isChannel(id) && !this.isMegagroup(id);\n };\n AppChatsManager.prototype.getChatInput = function (id) {\n return id || 0;\n };\n AppChatsManager.prototype.getChannelInput = function (id) {\n if (!id) {\n return { _: 'inputChannelEmpty' };\n }\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash || this.channelAccess[id] || 0\n };\n };\n AppChatsManager.prototype.hasChat = function (id, allowMin) {\n var chat = this.chats[id];\n return utils_1.isObject(chat) && (allowMin || !chat.pFlags.min);\n };\n AppChatsManager.prototype.getChatPhoto = function (id) {\n var chat = this.getChat(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = chat && chat.photo ? chat.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n };\n AppChatsManager.prototype.getChatString = function (id) {\n var chat = this.getChat(id);\n if (this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n };\n AppChatsManager.prototype.wrapForFull = function (id, fullChat) {\n var chatFull = utils_1.copy(fullChat);\n var chat = this.getChat(id);\n if (!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n if (chatFull.participants &&\n chatFull.participants._ == 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n if (chatFull.about) {\n chatFull.rAbout = richtextprocessor_1.RichTextProcessor.wrapRichText(chatFull.about, { noLinebreaks: true });\n }\n chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n return chatFull;\n };\n AppChatsManager.prototype.wrapParticipants = function (id, participants) {\n var chat = this.getChat(id);\n var myID = exports.appUsersManager.getSelf().id;\n if (this.isChannel(id)) {\n var isAdmin = chat.pFlags.creator || chat.pFlags.editor || chat.pFlags.moderator;\n participants.forEach(function (participant) {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = isAdmin && participant._ == 'channelParticipant';\n // just for order by last seen\n participant.user = exports.appUsersManager.getUser(participant.user_id);\n });\n }\n else {\n var isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach(function (participant) {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = !participant.canLeave && (chat.pFlags.creator ||\n participant._ == 'chatParticipant' && (isAdmin || myID == participant.inviter_id));\n // just for order by last seen\n participant.user = exports.appUsersManager.getUser(participant.user_id);\n });\n }\n return participants;\n };\n return AppChatsManager;\n}());\nexports.appUsersManager = new AppUsersManager();\nexports.appChatsManager = new AppChatsManager();\nexports.appPeersManager = {\n getPeerPhoto: function (peerID) {\n return peerID > 0\n ? exports.appUsersManager.getUserPhoto(peerID)\n : exports.appChatsManager.getChatPhoto(-peerID);\n },\n getPeerMigratedTo: function (peerID) {\n if (peerID >= 0) {\n return false;\n }\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n return exports.appPeersManager.getPeerID(chat.migrated_to);\n }\n return false;\n },\n getPeerTitle: function (peerID) {\n var peer = {};\n if (!utils_1.isObject(peerID)) {\n peer = exports.appPeersManager.getPeer(peerID);\n }\n else\n peer = peerID;\n var title = '';\n if (peerID > 0) {\n if (peer.first_name)\n title += peer.first_name;\n if (peer.last_name)\n title += ' ' + peer.last_name;\n if (!title)\n title = peer.pFlags.deleted ? 'Deleted account' : peer.username;\n else\n title = title.trim();\n }\n else {\n title = peer.title;\n }\n return title;\n },\n getOutputPeer: function (peerID) {\n if (peerID > 0) {\n return { _: 'peerUser', user_id: peerID };\n }\n var chatID = -peerID;\n if (exports.appChatsManager.isChannel(chatID)) {\n return { _: 'peerChannel', channel_id: chatID };\n }\n return { _: 'peerChat', chat_id: chatID };\n },\n getPeerString: function (peerID) {\n if (peerID > 0) {\n return exports.appUsersManager.getUserString(peerID);\n }\n return exports.appChatsManager.getChatString(-peerID);\n },\n getPeer: function (peerID) {\n return peerID > 0\n ? exports.appUsersManager.getUser(peerID)\n : exports.appChatsManager.getChat(-peerID);\n },\n getPeerID: function (peerString) {\n if (utils_1.isObject(peerString)) {\n return peerString.user_id\n ? peerString.user_id\n : -(peerString.channel_id || peerString.chat_id);\n }\n var isUser = peerString.charAt(0) == 'u';\n var peerParams = peerString.substr(1).split('_');\n return isUser ? peerParams[0] : -peerParams[0] || 0;\n },\n isChannel: function (peerID) {\n return (peerID < 0) && exports.appChatsManager.isChannel(-peerID);\n },\n getInputPeerByID: function (peerID) {\n if (!peerID) {\n return { _: 'inputPeerEmpty' };\n }\n if (peerID < 0) {\n var chatID = -peerID;\n if (!exports.appChatsManager.isChannel(chatID)) {\n return {\n _: 'inputPeerChat',\n chat_id: chatID\n };\n }\n else {\n return {\n _: 'inputPeerChannel',\n channel_id: chatID,\n access_hash: exports.appChatsManager.getChat(chatID).access_hash || 0\n };\n }\n }\n return {\n _: 'inputPeerUser',\n user_id: peerID,\n access_hash: exports.appUsersManager.getUser(peerID).access_hash || 0\n };\n },\n isMegagroup: function (peerID) {\n return (peerID < 0) && exports.appChatsManager.isMegagroup(-peerID);\n },\n getPeerSearchText: function (peerID) {\n var text;\n if (peerID > 0) {\n text = '%pu ' + exports.appUsersManager.getUserSearchText(peerID);\n }\n else if (peerID < 0) {\n var chat = exports.appChatsManager.getChat(-peerID);\n text = '%pg ' + (chat.title || '');\n }\n return text;\n }\n};\nvar AppMessagesIDsManager = /** @class */ (function () {\n function AppMessagesIDsManager() {\n this.channelLocals = {};\n this.channelsByLocals = {};\n this.channelCurLocal = 0;\n this.fullMsgIDModulus = 4294967296;\n }\n AppMessagesIDsManager.prototype.getFullMessageID = function (msgID, channelID) {\n if (!channelID || msgID <= 0) {\n return msgID;\n }\n msgID = this.getMessageLocalID(msgID);\n var localStart = this.channelLocals[channelID];\n if (!localStart) {\n localStart = (++this.channelCurLocal) * this.fullMsgIDModulus;\n this.channelsByLocals[localStart] = channelID;\n this.channelLocals[channelID] = localStart;\n }\n return localStart + msgID;\n };\n AppMessagesIDsManager.prototype.getMessageIDInfo = function (fullMsgID) {\n if (fullMsgID < this.fullMsgIDModulus) {\n return [fullMsgID, 0];\n }\n var msgID = fullMsgID % this.fullMsgIDModulus;\n var channelID = this.channelsByLocals[fullMsgID - msgID];\n return [msgID, channelID];\n };\n AppMessagesIDsManager.prototype.getMessageLocalID = function (fullMsgID) {\n if (!fullMsgID) {\n return 0;\n }\n return fullMsgID % this.fullMsgIDModulus;\n };\n AppMessagesIDsManager.prototype.splitMessageIDsByChannels = function (mids) {\n var msgIDsByChannels = {};\n var midsByChannels = {};\n var i;\n var mid, msgChannel;\n var channelID;\n for (i = 0; i < mids.length; i++) {\n mid = mids[i];\n msgChannel = this.getMessageIDInfo(mid);\n channelID = msgChannel[1];\n if (msgIDsByChannels[channelID] === undefined) {\n msgIDsByChannels[channelID] = [];\n midsByChannels[channelID] = [];\n }\n msgIDsByChannels[channelID].push(msgChannel[0]);\n midsByChannels[channelID].push(mid);\n }\n return {\n msgIDs: msgIDsByChannels,\n mids: midsByChannels\n };\n };\n return AppMessagesIDsManager;\n}());\n;\nvar AppProfileManager = /** @class */ (function () {\n function AppProfileManager() {\n var _this = this;\n this.botInfos = {};\n this.chatsFull = {};\n this.chatFullPromises = {};\n this.chatParticipantsPromises = {};\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n // console.log('on apiUpdate', update)\n switch (update._) {\n case 'updateChatParticipants':\n var participants = update.participants;\n var chatFull = _this.chatsFull[participants.id];\n if (chatFull !== undefined) {\n chatFull.participants = update.participants;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n }\n break;\n case 'updateChatParticipantAdd':\n var chatFull = _this.chatsFull[update.chat_id];\n if (chatFull !== undefined) {\n var participants = chatFull.participants.participants || [];\n for (var i = 0, length = participants.length; i < length; i++) {\n if (participants[i].user_id == update.user_id) {\n return;\n }\n }\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: utils_1.tsNow(true)\n });\n chatFull.participants.version = update.version;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n }\n break;\n case 'updateChatParticipantDelete':\n var chatFull = _this.chatsFull[update.chat_id];\n if (chatFull !== undefined) {\n var participants = chatFull.participants.participants || [];\n for (var i = 0, length = participants.length; i < length; i++) {\n if (participants[i].user_id == update.user_id) {\n participants.splice(i, 1);\n chatFull.participants.version = update.version;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n break;\n case 'updateChannelPinnedMessage':\n var channelID = update.channel_id;\n var fullChannel = _this.chatsFull[channelID];\n if (fullChannel !== undefined) {\n fullChannel.pinned_msg_id = exports.appMessagesIDsManager.getFullMessageID(update.id, channelID);\n $rootScope.$broadcast('peer_pinned_message', -channelID);\n }\n break;\n }\n });\n $rootScope.$on('chat_update', function (e) {\n var chatID = e.detail;\n var fullChat = _this.chatsFull[chatID];\n var chat = exports.appChatsManager.getChat(chatID);\n if (!chat.photo || !fullChat) {\n return;\n }\n var emptyPhoto = chat.photo._ == 'chatPhotoEmpty';\n console.log('chat_update:', fullChat);\n if (fullChat.chat_photo && emptyPhoto != (fullChat.chat_photo._ == 'photoEmpty')) {\n delete _this.chatsFull[chatID];\n $rootScope.$broadcast('chat_full_update', chatID);\n return;\n }\n if (emptyPhoto) {\n return;\n }\n var smallUserpic = chat.photo.photo_small;\n var smallPhotoSize = exports.appPhotosManager.choosePhotoSize(fullChat.chat_photo, 0, 0);\n if (JSON.stringify(smallUserpic) !== JSON.stringify(smallPhotoSize.location)) {\n delete _this.chatsFull[chatID];\n $rootScope.$broadcast('chat_full_update', chatID);\n }\n });\n }\n AppProfileManager.prototype.saveBotInfo = function (botInfo) {\n var botID = botInfo && botInfo.user_id;\n if (!botID) {\n return false;\n }\n var commands = {};\n botInfo.commands.forEach(function (botCommand) {\n commands[botCommand.command] = botCommand.description;\n });\n return this.botInfos[botID] = {\n id: botID,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n };\n AppProfileManager.prototype.getProfile = function (id, override) {\n var _this = this;\n return mtproto_1.MTProto.apiManager.invokeApi('users.getFullUser', {\n id: exports.appUsersManager.getUserInput(id)\n }).then(function (userFull) {\n if (override && override.phone_number) {\n userFull.user.phone = override.phone_number;\n if (override.first_name || override.last_name) {\n userFull.user.first_name = override.first_name;\n userFull.user.last_name = override.last_name;\n }\n exports.appUsersManager.saveApiUser(userFull.user);\n }\n else {\n exports.appUsersManager.saveApiUser(userFull.user, true);\n }\n if (userFull.profile_photo) {\n exports.appPhotosManager.savePhoto(userFull.profile_photo, {\n user_id: id\n });\n }\n if (userFull.about !== undefined) {\n userFull.rAbout = richtextprocessor_1.RichTextProcessor.wrapRichText(userFull.about, { noLinebreaks: true });\n }\n // NotificationsManager.savePeerSettings(id, userFull.notify_settings); // warning\n if (userFull.bot_info) {\n userFull.bot_info = _this.saveBotInfo(userFull.bot_info);\n }\n return userFull;\n });\n };\n AppProfileManager.prototype.getPeerBots = function (peerID) {\n var _this = this;\n var peerBots = [];\n if (peerID >= 0 && !exports.appUsersManager.isBot(peerID) ||\n (exports.appPeersManager.isChannel(peerID) && !exports.appPeersManager.isMegagroup(peerID))) {\n return Promise.resolve(peerBots);\n }\n if (peerID >= 0) {\n return this.getProfile(peerID).then(function (userFull) {\n var botInfo = userFull.bot_info;\n if (botInfo && botInfo._ != 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n return this.getChatFull(-peerID).then(function (chatFull) {\n chatFull.bot_info.forEach(function (botInfo) {\n peerBots.push(_this.saveBotInfo(botInfo));\n });\n return peerBots;\n });\n };\n AppProfileManager.prototype.getChatFull = function (id) {\n var _this = this;\n if (exports.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id);\n }\n if (this.chatsFull[id] !== undefined) {\n var chat = exports.appChatsManager.getChat(id);\n if (chat.version == this.chatsFull[id].participants.version ||\n chat.pFlags.left) {\n return Promise.resolve(this.chatsFull[id]);\n }\n }\n if (this.chatFullPromises[id] !== undefined) {\n return this.chatFullPromises[id];\n }\n // console.trace(dT(), 'Get chat full', id, appChatsManager.getChat(id))\n return this.chatFullPromises[id] = mtproto_1.MTProto.apiManager.invokeApi('messages.getFullChat', {\n chat_id: exports.appChatsManager.getChatInput(id)\n }).then(function (result) {\n exports.appChatsManager.saveApiChats(result.chats);\n exports.appUsersManager.saveApiUsers(result.users);\n var fullChat = result.full_chat;\n if (fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n exports.appPhotosManager.savePhoto(fullChat.chat_photo);\n }\n /* NotificationsManager.savePeerSettings(-id, fullChat.notify_settings); */ // warning\n delete _this.chatFullPromises[id];\n _this.chatsFull[id] = fullChat;\n $rootScope.$broadcast('chat_full_update', id);\n return fullChat;\n });\n };\n AppProfileManager.prototype.getChatInviteLink = function (id, force) {\n var _this = this;\n return this.getChatFull(id).then(function (chatFull) {\n if (!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n var promise;\n if (exports.appChatsManager.isChannel(id)) {\n promise = mtproto_1.MTProto.apiManager.invokeApi('channels.exportInvite', {\n channel: exports.appChatsManager.getChannelInput(id)\n });\n }\n else {\n promise = mtproto_1.MTProto.apiManager.invokeApi('messages.exportChatInvite', {\n chat_id: exports.appChatsManager.getChatInput(id)\n });\n }\n return promise.then(function (exportedInvite) {\n if (_this.chatsFull[id] !== undefined) {\n _this.chatsFull[id].exported_invite = exportedInvite;\n }\n return exportedInvite.link;\n });\n });\n };\n AppProfileManager.prototype.getChannelParticipants = function (id, filter, limit, offset) {\n filter = filter || { _: 'channelParticipantsRecent' };\n limit = limit || 200;\n offset = offset || 0;\n var promiseKey = [id, filter._, offset, limit].join('_');\n var promiseData = this.chatParticipantsPromises[promiseKey];\n if (filter._ == 'channelParticipantsRecent') {\n var chat = exports.appChatsManager.getChat(id);\n if (chat &&\n chat.pFlags && (chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights)) {\n return Promise.reject();\n }\n }\n var fetchParticipants = function (cachedParticipants) {\n var hash = 0;\n if (cachedParticipants) {\n var userIDs = [];\n cachedParticipants.forEach(function (participant) {\n userIDs.push(participant.user_id);\n });\n userIDs.sort();\n userIDs.forEach(function (userID) {\n hash = ((hash * 20261) + 0x80000000 + userID) % 0x80000000;\n });\n }\n return mtproto_1.MTProto.apiManager.invokeApi('channels.getParticipants', {\n channel: exports.appChatsManager.getChannelInput(id),\n filter: filter,\n offset: offset,\n limit: limit,\n hash: hash\n }).then(function (result) {\n if (result._ == 'channels.channelParticipantsNotModified') {\n return cachedParticipants;\n }\n exports.appUsersManager.saveApiUsers(result.users);\n return result.participants;\n });\n };\n var maybeAddSelf = function (participants) {\n var chat = exports.appChatsManager.getChat(id);\n var selfMustBeFirst = filter._ == 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n if (selfMustBeFirst) {\n participants = utils_1.copy(participants);\n var myID = exports.appUsersManager.getSelf().id;\n var myIndex = false;\n var myParticipant;\n for (var i = 0, len = participants.length; i < len; i++) {\n if (participants[i].user_id == myID) {\n myIndex = i;\n break;\n }\n }\n if (myIndex !== false) {\n myParticipant = participants[i];\n participants.splice(i, 1);\n }\n else {\n myParticipant = { _: 'channelParticipantSelf', user_id: myID };\n }\n participants.unshift(myParticipant);\n }\n return participants;\n };\n var timeNow = utils_1.tsNow();\n if (promiseData !== undefined) {\n var promise = promiseData[1];\n if (promiseData[0] > timeNow - 60000) {\n return promise;\n }\n var newPromise_1 = promise.then(function (cachedParticipants) {\n return fetchParticipants(cachedParticipants).then(maybeAddSelf);\n });\n this.chatParticipantsPromises[promiseKey] = [timeNow, newPromise_1];\n return newPromise_1;\n }\n var newPromise = fetchParticipants().then(maybeAddSelf);\n this.chatParticipantsPromises[promiseKey] = [timeNow, newPromise];\n return newPromise;\n };\n AppProfileManager.prototype.getChannelFull = function (id, force) {\n var _this = this;\n if (this.chatsFull[id] !== undefined && !force) {\n return Promise.resolve(this.chatsFull[id]);\n }\n if (this.chatFullPromises[id] !== undefined) {\n return this.chatFullPromises[id];\n }\n return this.chatFullPromises[id] = mtproto_1.MTProto.apiManager.invokeApi('channels.getFullChannel', {\n channel: exports.appChatsManager.getChannelInput(id)\n }).then(function (result) {\n exports.appChatsManager.saveApiChats(result.chats);\n exports.appUsersManager.saveApiUsers(result.users);\n var fullChannel = result.full_chat;\n if (fullChannel && fullChannel.chat_photo.id) {\n exports.appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n /* NotificationsManager.savePeerSettings(-id, fullChannel.notify_settings) */ // warning\n if (fullChannel.pinned_msg_id) {\n fullChannel.pinned_msg_id = exports.appMessagesIDsManager.getFullMessageID(fullChannel.pinned_msg_id, id);\n }\n delete _this.chatFullPromises[id];\n _this.chatsFull[id] = fullChannel;\n $rootScope.$broadcast('chat_full_update', id);\n return fullChannel;\n }, function (error) {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n var channel = exports.appChatsManager.getChat(id);\n channel = { _: 'channelForbidden', access_hash: channel.access_hash, title: channel.title };\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n return Promise.reject(error);\n });\n };\n AppProfileManager.prototype.invalidateChannelParticipants = function (id) {\n delete this.chatsFull[id];\n delete this.chatFullPromises[id];\n for (var key in this.chatParticipantsPromises) {\n var val = this.chatParticipantsPromises[key];\n if (+key.split('_')[0] == id) {\n delete this.chatParticipantsPromises[key];\n }\n }\n $rootScope.$broadcast('chat_full_update', id);\n };\n AppProfileManager.prototype.getChannelPinnedMessage = function (id) {\n return this.getChannelFull(id).then(function (fullChannel) {\n var pinnedMessageID = fullChannel && fullChannel.pinned_msg_id;\n if (!pinnedMessageID) {\n return false;\n }\n return storage_1.default.get('pinned_hidden' + id).then(function (hiddenMessageID) {\n if (exports.appMessagesIDsManager.getMessageLocalID(pinnedMessageID) == hiddenMessageID) {\n return false;\n }\n return pinnedMessageID;\n });\n });\n };\n AppProfileManager.prototype.hideChannelPinnedMessage = function (id, pinnedMessageID) {\n var setKeys = {};\n setKeys['pinned_hidden' + id] = exports.appMessagesIDsManager.getMessageLocalID(pinnedMessageID);\n storage_1.default.set(setKeys);\n $rootScope.$broadcast('peer_pinned_message', -id);\n };\n return AppProfileManager;\n}());\nvar ApiUpdatesManager = /** @class */ (function () {\n function ApiUpdatesManager() {\n var _this = this;\n this.updatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: false,\n syncLoading: true\n };\n this.channelStates = {};\n this.myID = 0;\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n }\n ApiUpdatesManager.prototype.popPendingSeqUpdate = function () {\n var nextSeq = this.updatesState.seq + 1;\n var pendingUpdatesData = this.updatesState.pendingSeqUpdates[nextSeq];\n if (!pendingUpdatesData) {\n return false;\n }\n var updates = pendingUpdatesData.updates;\n var length;\n for (var i = 0, length = updates.length; i < length; i++) {\n this.saveUpdate(updates[i]);\n }\n this.updatesState.seq = pendingUpdatesData.seq;\n if (pendingUpdatesData.date && this.updatesState.date < pendingUpdatesData.date) {\n this.updatesState.date = pendingUpdatesData.date;\n }\n delete this.updatesState.pendingSeqUpdates[nextSeq];\n if (!this.popPendingSeqUpdate() &&\n this.updatesState.syncPending &&\n this.updatesState.syncPending.seqAwaiting &&\n this.updatesState.seq >= this.updatesState.syncPending.seqAwaiting) {\n if (!this.updatesState.syncPending.ptsAwaiting) {\n clearTimeout(this.updatesState.syncPending.timeout);\n this.updatesState.syncPending = false;\n }\n else {\n delete this.updatesState.syncPending.seqAwaiting;\n }\n }\n return true;\n };\n ApiUpdatesManager.prototype.popPendingPtsUpdate = function (channelID) {\n var curState = channelID ? this.getChannelState(channelID) : this.updatesState;\n if (!curState.pendingPtsUpdates.length) {\n return false;\n }\n curState.pendingPtsUpdates.sort(function (a, b) {\n return a.pts - b.pts;\n });\n // console.log(dT(), 'pop update', channelID, curState.pendingPtsUpdates)\n var curPts = curState.pts;\n var goodPts = false;\n var goodIndex = 0;\n var update;\n for (var i = 0, length = curState.pendingPtsUpdates.length; i < length; i++) {\n update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if (curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n if (!goodPts) {\n return false;\n }\n console.log(utils_1.dT(), 'pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n curState.pts = goodPts;\n for (i = 0; i <= goodIndex; i++) {\n update = curState.pendingPtsUpdates[i];\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n if (!curState.pendingPtsUpdates.length && curState.syncPending) {\n if (!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = false;\n }\n else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n return true;\n };\n ApiUpdatesManager.prototype.forceGetDifference = function () {\n if (!this.updatesState.syncLoading) {\n this.getDifference();\n }\n };\n ApiUpdatesManager.prototype.processUpdateMessage = function (updateMessage) {\n var _this = this;\n // return forceGetDifference()\n var processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n };\n switch (updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n var isOut = updateMessage.flags & 2;\n var fromID = updateMessage.from_id || (isOut ? this.myID : updateMessage.user_id);\n var toID = updateMessage.chat_id\n ? -updateMessage.chat_id\n : (isOut ? updateMessage.user_id : this.myID);\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n flags: updateMessage.flags,\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(toID),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to_msg_id: updateMessage.reply_to_msg_id,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n case 'updatesCombined':\n case 'updates':\n exports.appUsersManager.saveApiUsers(updateMessage.users);\n exports.appChatsManager.saveApiChats(updateMessage.chats);\n updateMessage.updates.forEach(function (update) {\n _this.processUpdate(update, processOpts);\n });\n break;\n default:\n console.warn(utils_1.dT(), 'Unknown update message', updateMessage);\n }\n };\n ApiUpdatesManager.prototype.getDifference = function () {\n var _this = this;\n // console.trace(dT(), 'Get full diff')\n var updatesState = this.updatesState;\n if (!updatesState.syncLoading) {\n updatesState.syncLoading = true;\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n if (updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = false;\n }\n mtproto_1.MTProto.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then(function (differenceResult) {\n if (differenceResult._ == 'updates.differenceEmpty') {\n console.log(utils_1.dT(), 'apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n updatesState.syncLoading = false;\n $rootScope.$broadcast('stateSynchronized');\n return false;\n }\n exports.appUsersManager.saveApiUsers(differenceResult.users);\n exports.appChatsManager.saveApiChats(differenceResult.chats);\n // Should be first because of updateMessageID\n // console.log(dT(), 'applying', differenceResult.other_updates.length, 'other updates')\n differenceResult.other_updates.forEach(function (update) {\n switch (update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n _this.processUpdate(update);\n return;\n }\n _this.saveUpdate(update);\n });\n // console.log(dT(), 'applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach(function (apiMessage) {\n _this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n var nextState = differenceResult.intermediate_state || differenceResult.state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n // console.log(dT(), 'apply diff', updatesState.seq, updatesState.pts)\n if (differenceResult._ == 'updates.differenceSlice') {\n _this.getDifference();\n }\n else {\n // console.log(dT(), 'finished get diff')\n $rootScope.$broadcast('stateSynchronized');\n updatesState.syncLoading = false;\n }\n }, function () {\n updatesState.syncLoading = false;\n });\n };\n ApiUpdatesManager.prototype.getChannelDifference = function (channelID) {\n var _this = this;\n var channelState = this.getChannelState(channelID);\n if (!channelState.syncLoading) {\n channelState.syncLoading = true;\n channelState.pendingPtsUpdates = [];\n }\n if (channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = false;\n }\n // console.log(dT(), 'Get channel diff', appChatsManager.getChat(channelID), channelState.pts)\n mtproto_1.MTProto.apiManager.invokeApi('updates.getChannelDifference', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n filter: { _: 'channelMessagesFilterEmpty' },\n pts: channelState.pts,\n limit: 30\n }, { timeout: 0x7fffffff }).then(function (differenceResult) {\n // console.log(dT(), 'channel diff result', differenceResult)\n channelState.pts = differenceResult.pts;\n if (differenceResult._ == 'updates.channelDifferenceEmpty') {\n console.log(utils_1.dT(), 'apply channel empty diff', differenceResult);\n channelState.syncLoading = false;\n $rootScope.$broadcast('stateSynchronized');\n return false;\n }\n if (differenceResult._ == 'updates.channelDifferenceTooLong') {\n console.log(utils_1.dT(), 'channel diff too long', differenceResult);\n channelState.syncLoading = false;\n delete _this.channelStates[channelID];\n _this.saveUpdate({ _: 'updateChannelReload', channel_id: channelID });\n return false;\n }\n exports.appUsersManager.saveApiUsers(differenceResult.users);\n exports.appChatsManager.saveApiChats(differenceResult.chats);\n // Should be first because of updateMessageID\n console.log(utils_1.dT(), 'applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach(function (update) {\n _this.saveUpdate(update);\n });\n console.log(utils_1.dT(), 'applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach(function (apiMessage) {\n _this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n console.log(utils_1.dT(), 'apply channel diff', channelState.pts);\n if (differenceResult._ == 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n _this.getChannelDifference(channelID);\n }\n else {\n console.log(utils_1.dT(), 'finished channel get diff');\n $rootScope.$broadcast('stateSynchronized');\n channelState.syncLoading = false;\n }\n }, function () {\n channelState.syncLoading = false;\n });\n };\n ApiUpdatesManager.prototype.addChannelState = function (channelID, pts) {\n if (!pts) {\n throw new Error('Add channel state without pts ' + channelID);\n }\n if (!(channelID in this.channelStates)) {\n this.channelStates[channelID] = {\n pts: pts,\n pendingPtsUpdates: [],\n syncPending: false,\n syncLoading: false\n };\n return true;\n }\n return false;\n };\n ApiUpdatesManager.prototype.getChannelState = function (channelID, pts) {\n if (this.channelStates[channelID] === undefined) {\n this.addChannelState(channelID, pts);\n }\n return this.channelStates[channelID];\n };\n ApiUpdatesManager.prototype.processUpdate = function (update, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n var channelID = false;\n switch (update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelID = -exports.appPeersManager.getPeerID(update.message.to_id);\n break;\n case 'updateDeleteChannelMessages':\n channelID = update.channel_id;\n break;\n case 'updateChannelTooLong':\n channelID = update.channel_id;\n if (!(channelID in this.channelStates)) {\n return false;\n }\n break;\n }\n var curState = channelID ? this.getChannelState(channelID, update.pts) : this.updatesState;\n // console.log(dT(), 'process', channelID, curState.pts, update)\n if (curState.syncLoading) {\n return false;\n }\n if (update._ == 'updateChannelTooLong') {\n if (!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < utils_1.tsNow() - 10000) {\n // console.trace(dT(), 'channel too long, get diff', channelID, update)\n this.getChannelDifference(channelID);\n }\n return false;\n }\n if (update._ == 'updateNewMessage' ||\n update._ == 'updateEditMessage' ||\n update._ == 'updateNewChannelMessage' ||\n update._ == 'updateEditChannelMessage') {\n var message = update.message;\n var toPeerID = exports.appPeersManager.getPeerID(message.to_id);\n var fwdHeader = message.fwd_from || {};\n var reason = false;\n if (message.from_id && !exports.appUsersManager.hasUser(message.from_id, message.pFlags.post /* || channelID*/) && (reason = 'author') ||\n fwdHeader.from_id && !exports.appUsersManager.hasUser(fwdHeader.from_id, !!fwdHeader.channel_id) && (reason = 'fwdAuthor') ||\n fwdHeader.channel_id && !exports.appChatsManager.hasChat(fwdHeader.channel_id, true) && (reason = 'fwdChannel') ||\n toPeerID > 0 && !exports.appUsersManager.hasUser(toPeerID) && (reason = 'toPeer User') ||\n toPeerID < 0 && !exports.appChatsManager.hasChat(-toPeerID) && (reason = 'toPeer Chat')) {\n console.warn(utils_1.dT(), 'Not enough data for message update', toPeerID, reason, message);\n if (channelID && exports.appChatsManager.hasChat(channelID)) {\n this.getChannelDifference(channelID);\n }\n else {\n this.forceGetDifference();\n }\n return false;\n }\n }\n else if (channelID && !exports.appChatsManager.hasChat(channelID)) {\n // console.log(dT(), 'skip update, missing channel', channelID, update)\n return false;\n }\n var popPts;\n var popSeq;\n if (update.pts) {\n var newPts = curState.pts + (update.pts_count || 0);\n if (newPts < update.pts) {\n console.warn(utils_1.dT(), 'Pts hole', curState, update, channelID && exports.appChatsManager.getChat(channelID));\n curState.pendingPtsUpdates.push(update);\n if (!curState.syncPending) {\n curState.syncPending = {\n timeout: setTimeout(function () {\n if (channelID) {\n _this.getChannelDifference(channelID);\n }\n else {\n _this.getDifference();\n }\n }, 5000)\n };\n }\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n if (update.pts > curState.pts) {\n curState.pts = update.pts;\n popPts = true;\n curState.lastPtsUpdateTime = utils_1.tsNow();\n }\n else if (update.pts_count) {\n // console.warn(dT(), 'Duplicate update', update)\n return false;\n }\n if (channelID && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n }\n else if (!channelID && options.seq > 0) {\n var seq = options.seq;\n var seqStart = options.seqStart || seq;\n if (seqStart != curState.seq + 1) {\n if (seqStart > curState.seq) {\n console.warn(utils_1.dT(), 'Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n if (curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = { seq: seq, date: options.date, updates: [] };\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n if (!curState.syncPending) {\n curState.syncPending = {\n timeout: setTimeout(function () {\n _this.getDifference();\n }, 5000)\n };\n }\n if (!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n if (curState.seq != seq) {\n curState.seq = seq;\n if (options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n popSeq = true;\n }\n }\n this.saveUpdate(update);\n if (popPts) {\n this.popPendingPtsUpdate(channelID);\n }\n else if (popSeq) {\n this.popPendingSeqUpdate();\n }\n };\n ApiUpdatesManager.prototype.saveUpdate = function (update) {\n $rootScope.$broadcast('apiUpdate', update);\n };\n ApiUpdatesManager.prototype.attach = function () {\n var _this = this;\n mtproto_1.MTProto.networkerFactory.setUpdatesProcessor(this.processUpdateMessage.bind(this));\n mtproto_1.MTProto.apiManager.invokeApi('updates.getState', {}, { noErrorBox: true }).then(function (stateResult) {\n _this.updatesState.seq = stateResult.seq;\n _this.updatesState.pts = stateResult.pts;\n _this.updatesState.date = stateResult.date;\n setTimeout(function () {\n _this.updatesState.syncLoading = false;\n }, 1000);\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n };\n return ApiUpdatesManager;\n}());\nexports.appMessagesIDsManager = new AppMessagesIDsManager();\nexports.apiUpdatesManager = new ApiUpdatesManager();\nvar AppPhotosManager = /** @class */ (function () {\n function AppPhotosManager() {\n this.photos = {};\n this.windowW = document.body.scrollWidth;\n this.windowH = document.body.scrollHeight;\n /* $rootScope.openPhoto = openPhoto\n $rootScope.preloadPhoto = preloadPhoto; */\n }\n AppPhotosManager.prototype.savePhoto = function (apiPhoto, context) {\n if (context) {\n Object.assign(apiPhoto, context);\n }\n this.photos[apiPhoto.id] = apiPhoto;\n apiPhoto.sizes.forEach(function (photoSize) {\n if (photoSize._ == 'photoCachedSize') {\n mtproto_1.MTProto.apiFileManager.saveSmallFile(photoSize.location, photoSize.bytes);\n // Memory\n photoSize.size = photoSize.bytes.length;\n delete photoSize.bytes;\n photoSize._ = 'photoSize';\n }\n });\n };\n AppPhotosManager.prototype.choosePhotoSize = function (photo, width, height) {\n if (width === void 0) { width = 0; }\n if (height === void 0) { height = 0; }\n if (Config.Navigator.retina) {\n width *= 2;\n height *= 2;\n }\n var bestPhotoSize = { _: 'photoSizeEmpty' };\n var bestDiff = 0xFFFFFF;\n photo.sizes.forEach(function (photoSize) {\n var diff = Math.abs(photoSize.w * photoSize.h - width * height);\n if (diff < bestDiff) {\n bestPhotoSize = photoSize;\n bestDiff = diff;\n }\n });\n // console.log('choosing', photo, width, height, bestPhotoSize)\n return bestPhotoSize;\n };\n AppPhotosManager.prototype.getUserPhotos = function (userID, maxID, limit) {\n var _this = this;\n var inputUser = exports.appUsersManager.getUserInput(userID);\n return mtproto_1.MTProto.apiManager.invokeApi('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit: limit || 20,\n max_id: maxID || 0\n }).then(function (photosResult) {\n exports.appUsersManager.saveApiUsers(photosResult.users);\n var photoIDs = [];\n var context = { user_id: userID };\n for (var i = 0; i < photosResult.photos.length; i++) {\n _this.savePhoto(photosResult.photos[i], context);\n photoIDs.push(photosResult.photos[i].id);\n }\n return {\n count: photosResult.count || photosResult.photos.length,\n photos: photoIDs\n };\n });\n };\n AppPhotosManager.prototype.preloadPhoto = function (photoID) {\n if (!this.photos[photoID]) {\n return Promise.reject();\n }\n var photo = this.photos[photoID];\n var fullWidth = document.body.scrollHeight - (Config.Mobile ? 20 : 32);\n var fullHeight = document.body.scrollWidth - (Config.Mobile ? 150 : 116);\n if (fullWidth > 800) {\n fullWidth -= 208;\n }\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n if (fullPhotoSize /* && !fullPhotoSize.preloaded */) {\n fullPhotoSize.preloaded = true;\n if (fullPhotoSize.size) {\n return mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, {\n _: 'inputPhotoFileLocation',\n id: photoID,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: fullPhotoSize.type\n }, fullPhotoSize.size);\n }\n else {\n console.log('downloadSmallFile exec');\n return mtproto_1.MTProto.apiFileManager.downloadSmallFile(fullPhotoSize.location);\n }\n }\n else\n return Promise.reject('no fullPhotoSize');\n };\n AppPhotosManager.prototype.getPhoto = function (photoID) {\n return this.photos[photoID] || { _: 'photoEmpty' };\n };\n AppPhotosManager.prototype.wrapForHistory = function (photoID, options) {\n if (options === void 0) { options = {}; }\n var photo = utils_1.copy(this.photos[photoID]) || { _: 'photoEmpty' };\n var width = options.website ? 64 : Math.min(this.windowW - 80, Config.Mobile ? 210 : 260);\n var height = options.website ? 64 : Math.min(this.windowH - 100, Config.Mobile ? 210 : 260);\n var thumbPhotoSize = this.choosePhotoSize(photo, width, height);\n var thumb = {\n width: width,\n height: height\n };\n if (options.website && Config.Mobile) {\n width = 50;\n height = 50;\n }\n // console.log('chosen photo size', photoID, thumbPhotoSize)\n if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n var dim = utils_1.calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, width, height);\n thumb.width = dim.w;\n thumb.height = dim.h;\n thumb.location = thumbPhotoSize.location;\n thumb.size = thumbPhotoSize.size;\n }\n else {\n thumb.width = 100;\n thumb.height = 100;\n }\n photo.thumb = thumb;\n return photo;\n };\n AppPhotosManager.prototype.wrapForFull = function (photoID) {\n var photo = this.wrapForHistory(photoID);\n var fullWidth = document.body.scrollWidth - (Config.Mobile ? 0 : 32);\n var fullHeight = document.body.scrollHeight - (Config.Mobile ? 0 : 116);\n if (!Config.Mobile && fullWidth > 800) {\n fullWidth -= 208;\n }\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var full = {};\n full.width = fullWidth;\n full.height = fullHeight;\n if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') {\n var wh = utils_1.calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, true);\n full.width = wh.w;\n full.height = wh.h;\n full.modalWidth = Math.max(full.width, Math.min(400, fullWidth));\n full.location = fullPhotoSize.location;\n full.size = fullPhotoSize.size;\n }\n photo.full = full;\n return photo;\n };\n /* public openPhoto(photoID: number, list: any) {\n if(!photoID || photoID === '0') {\n return false;\n }\n \n var scope = $rootScope.$new(true);\n \n scope.photoID = photoID;\n \n var controller = 'PhotoModalController';\n if (list && list.p > 0) {\n controller = 'UserpicModalController';\n scope.userID = list.p;\n } else if (list && list.p < 0) {\n controller = 'ChatpicModalController';\n scope.chatID = -list.p;\n } else if (list && list.m > 0) {\n scope.messageID = list.m;\n if (list.w) {\n scope.webpageID = list.w;\n }\n }\n \n var modalInstance = $modal.open({\n templateUrl: templateUrl('photo_modal'),\n windowTemplateUrl: templateUrl('media_modal_layout'),\n controller: controller,\n scope: scope,\n windowClass: 'photo_modal_window'\n });\n } */\n AppPhotosManager.prototype.downloadPhoto = function (photoID) {\n var photo = this.photos[photoID];\n var ext = 'jpg';\n var mimeType = 'image/jpeg';\n var fileName = 'photo' + photoID + '.' + ext;\n var fullWidth = Math.max(screen.width || 0, document.body.scrollWidth - 36, 800);\n var fullHeight = Math.max(screen.height || 0, document.body.scrollHeight - 150, 800);\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var inputFileLocation = {\n _: 'inputFileLocation',\n volume_id: fullPhotoSize.location.volume_id,\n local_id: fullPhotoSize.location.local_id,\n secret: fullPhotoSize.location.secret\n };\n filemanager_1.default.chooseSaveFile(fileName, ext, mimeType).then(function (writableFileEntry) {\n if (writableFileEntry) {\n mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, {\n mime: mimeType,\n toFileEntry: writableFileEntry\n }).then(function () {\n // console.log('file save done')\n }, function (e) {\n console.log('photo download failed', e);\n });\n }\n }, function () {\n var cachedBlob = mtproto_1.MTProto.apiFileManager.getCachedFile(inputFileLocation);\n if (cachedBlob) {\n return filemanager_1.default.download(cachedBlob, mimeType, fileName);\n }\n mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, { mime: mimeType }).then(function (blob) {\n filemanager_1.default.download(blob, mimeType, fileName);\n }, function (e) {\n console.log('photo download failed', e);\n });\n });\n };\n return AppPhotosManager;\n}());\nvar AppMessagesManager = /** @class */ (function () {\n function AppMessagesManager() {\n var _this = this;\n this.messagesStorage = {};\n this.messagesForHistory = {};\n this.messagesForDialogs = {};\n this.historiesStorage = {};\n this.dialogsStorage = { count: null, dialogs: [] };\n this.pendingByRandomID = {};\n this.pendingByMessageID = {};\n this.pendingAfterMsgs = {};\n this.pendingTopMsgs = {};\n this.sendFilePromise = Promise.resolve();\n this.tempID = -1;\n this.tempFinalizeCallbacks = {};\n this.dialogsIndex = utils_1.SearchIndexManager.createIndex();\n this.cachedResults = { query: false };\n this.lastSearchFilter = {};\n this.lastSearchResults = [];\n this.needSingleMessages = [];\n this.fetchSingleMessagesTimeout = 0;\n this.incrementedMessageViews = {};\n this.needIncrementMessageViews = [];\n this.incrementMessageViewsTimeout = false;\n this.maxSeenID = 0;\n this.allDialogsLoaded = false;\n this.dialogsOffsetDate = 0;\n this.pinnedIndex = 0;\n this.dialogsNum = 0;\n this.migratedFromTo = {};\n this.migratedToFrom = {};\n this.newMessagesHandlePromise = 0;\n this.newMessagesToHandle = {};\n this.newDialogsHandlePromise = 0;\n this.newDialogsToHandle = {};\n this.notificationsHandlePromise = 0;\n this.notificationsToHandle = {};\n this.newUpdatesAfterReloadToHandle = {};\n this.fwdMessagesPluralize = _('conversation_forwarded_X_messages');\n this.gameScorePluralize = _('conversation_scored_X');\n storage_1.default.get('max_seen_msg').then(function (maxID) {\n if (maxID &&\n !exports.appMessagesIDsManager.getMessageIDInfo(maxID)[1]) {\n _this.maxSeenID = maxID;\n }\n });\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n // if (update._ != 'updateUserStatus') {\n // console.log('on apiUpdate', update)\n // }\n _this.handleUpdate(update);\n });\n /* $rootScope.$on('webpage_updated', (e: CustomEvent) => {\n let eventData = e.detail;\n eventData.msgs((msgID: number) => {\n var historyMessage = this.messagesForHistory[msgID];\n if (historyMessage) {\n historyMessage.media = {\n _: 'messageMediaWebPage',\n webpage: AppWebPagesManager.wrapForHistory(eventData.id)\n };\n \n $rootScope.$broadcast('message_edit', {\n peerID: this.getMessagePeer(historyMessage),\n id: historyMessage.id,\n mid: msgID,\n justMedia: true\n });\n }\n });\n }); */\n $rootScope.$on('draft_updated', function (e) {\n var eventData = e.detail;\n ;\n var peerID = eventData.peerID;\n var draft = eventData.draft;\n var dialog = _this.getDialogByPeerID(peerID)[0];\n if (dialog) {\n var topDate;\n if (draft && draft.date) {\n topDate = draft.date;\n }\n else {\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var topDate = _this.getMessage(dialog.top_message).date;\n if (channelID) {\n var channel = exports.appChatsManager.getChat(channelID);\n if (!topDate || channel.date && channel.date > topDate) {\n topDate = channel.date;\n }\n }\n }\n if (!dialog.pFlags.pinned) {\n dialog.index = _this.generateDialogIndex(topDate);\n }\n _this.pushDialogToStorage(dialog);\n $rootScope.$broadcast('dialog_draft', {\n peerID: peerID,\n draft: draft,\n index: dialog.index\n });\n }\n });\n }\n AppMessagesManager.prototype.getInputEntities = function (entities) {\n var sendEntites = utils_1.copy(entities);\n sendEntites.forEach(function (entity) {\n if (entity._ == 'messageEntityMentionName') {\n entity._ = 'inputMessageEntityMentionName';\n entity.user_id = exports.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n };\n AppMessagesManager.prototype.sendText = function (peerID, text, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (typeof (text) != 'string') {\n return;\n }\n peerID = exports.appPeersManager.getPeerMigratedTo(peerID) || peerID;\n var entities = options.entities || [];\n if (!options.viaBotID) {\n text = richtextprocessor_1.RichTextProcessor.parseMarkdown(text, entities);\n }\n if (!text.length) {\n return;\n }\n var sendEntites = this.getInputEntities(entities);\n var messageID = this.tempID--;\n var randomID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n var randomIDS = bin_utils_1.bigint(randomID[0]).shiftLeft(32).add(bin_utils_1.bigint(randomID[1])).toString();\n var historyStorage = this.historiesStorage[peerID];\n var flags = 0;\n var pFlags = {};\n var replyToMsgID = options.replyToMsgID;\n var isChannel = exports.appPeersManager.isChannel(peerID);\n var isMegagroup = isChannel && exports.appPeersManager.isMegagroup(peerID);\n var asChannel = isChannel && !isMegagroup ? true : false;\n var message;\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = { count: null, history: [], pending: [] };\n }\n var fromID = exports.appUsersManager.getSelf().id;\n if (peerID != fromID) {\n flags |= 2;\n pFlags.out = true;\n if (!isChannel && !exports.appUsersManager.isBot(peerID)) {\n flags |= 1;\n pFlags.unread = true;\n }\n }\n if (replyToMsgID) {\n flags |= 8;\n }\n if (asChannel) {\n fromID = 0;\n pFlags.post = true;\n }\n else {\n flags |= 256;\n }\n message = {\n _: 'message',\n id: messageID,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: flags,\n pFlags: pFlags,\n date: utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n message: text,\n random_id: randomIDS,\n reply_to_msg_id: replyToMsgID,\n via_bot_id: options.viaBotID,\n reply_markup: options.reply_markup,\n entities: entities,\n views: asChannel && 1,\n pending: true\n };\n var toggleError = function (on) {\n var historyMessage = _this.messagesForHistory[messageID];\n if (on) {\n message.error = true;\n if (historyMessage) {\n historyMessage.error = true;\n }\n }\n else {\n delete message.error;\n if (historyMessage) {\n delete historyMessage.error;\n }\n }\n $rootScope.$broadcast('messages_pending');\n };\n message.send = function () {\n toggleError(false);\n var sentRequestOptions = {};\n if (_this.pendingAfterMsgs[peerID]) {\n sentRequestOptions.afterMessageID = _this.pendingAfterMsgs[peerID].messageID;\n }\n var flags = 0;\n if (replyToMsgID) {\n flags |= 1;\n }\n if (asChannel) {\n flags |= 16;\n }\n if (options.clearDraft) {\n flags |= 128;\n }\n var apiPromise;\n if (options.viaBotID) {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.sendInlineBotResult', {\n flags: flags,\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n random_id: randomID,\n reply_to_msg_id: exports.appMessagesIDsManager.getMessageLocalID(replyToMsgID),\n query_id: options.queryID,\n id: options.resultID\n }, sentRequestOptions);\n }\n else {\n if (sendEntites.length) {\n flags |= 8;\n }\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.sendMessage', {\n flags: flags,\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n message: text,\n random_id: randomID,\n reply_to_msg_id: exports.appMessagesIDsManager.getMessageLocalID(replyToMsgID),\n entities: sendEntites\n }, sentRequestOptions);\n }\n // console.log(flags, entities)\n apiPromise.then(function (updates) {\n if (updates._ == 'updateShortSentMessage') {\n message.flags = updates.flags;\n message.date = updates.date;\n message.id = updates.id;\n message.media = updates.media;\n message.entities = updates.entities;\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n updates: [{\n _: 'updateMessageID',\n random_id: randomIDS,\n id: updates.id\n }, {\n _: isChannel\n ? 'updateNewChannelMessage'\n : 'updateNewMessage',\n message: message,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n }\n else if (updates.updates) {\n updates.updates.forEach(function (update) {\n if (update._ == 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n exports.apiUpdatesManager.processUpdateMessage(updates);\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n }, function (error) {\n toggleError(true);\n }).finally(function () {\n if (_this.pendingAfterMsgs[peerID] === sentRequestOptions) {\n delete _this.pendingAfterMsgs[peerID];\n }\n });\n _this.pendingAfterMsgs[peerID] = sentRequestOptions;\n };\n this.saveMessages([message]);\n historyStorage.pending.unshift(messageID);\n $rootScope.$broadcast('history_append', { peerID: peerID, messageID: messageID, my: true });\n setTimeout(function () { return message.send(); }, 0);\n // setTimeout(function () {\n // message.send()\n // }, 5000)\n /* if(options.clearDraft) { // WARNING\n DraftsManager.clearDraft(peerID)\n } */\n this.pendingByRandomID[randomIDS] = [peerID, messageID];\n };\n AppMessagesManager.prototype.getConversations = function (query, offsetIndex, limit) {\n var _this = this;\n if (limit === void 0) { limit = 20; }\n var curDialogStorage = this.dialogsStorage;\n var isSearch = typeof (query) == 'string' && query.length;\n if (isSearch) {\n if (!limit || this.cachedResults.query !== query) {\n this.cachedResults.query = query;\n var results = utils_1.SearchIndexManager.search(query, this.dialogsIndex);\n this.cachedResults.dialogs = [];\n this.dialogsStorage.dialogs.forEach(function (dialog) {\n if (results[dialog.peerID]) {\n _this.cachedResults.dialogs.push(dialog);\n }\n });\n this.cachedResults.count = this.cachedResults.dialogs.length;\n }\n curDialogStorage = this.cachedResults;\n }\n else {\n this.cachedResults.query = false;\n }\n var offset = 0;\n if (offsetIndex > 0) {\n for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n break;\n }\n }\n }\n if (isSearch ||\n this.allDialogsLoaded ||\n curDialogStorage.dialogs.length >= offset + limit) {\n return Promise.resolve({\n dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n });\n }\n return this.getTopMessages(limit).then(function () {\n offset = 0;\n if (offsetIndex > 0) {\n for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n break;\n }\n }\n }\n console.warn(offset, offset + limit, curDialogStorage.dialogs.length, _this.dialogsStorage.dialogs.length);\n return {\n dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n };\n });\n };\n AppMessagesManager.prototype.getTopMessages = function (limit) {\n var _this = this;\n var dialogs = this.dialogsStorage.dialogs;\n var offsetDate = 0;\n var offsetID = 0;\n var offsetPeerID = 0;\n var offsetIndex = 0;\n var flags = 0;\n if (this.dialogsOffsetDate) {\n offsetDate = this.dialogsOffsetDate + mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n offsetIndex = this.dialogsOffsetDate * 0x10000;\n flags |= 1;\n }\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getDialogs', {\n flags: flags,\n offset_date: offsetDate,\n offset_id: exports.appMessagesIDsManager.getMessageLocalID(offsetID),\n offset_peer: exports.appPeersManager.getInputPeerByID(offsetPeerID),\n limit: limit\n }, {\n timeout: 300\n }).then(function (dialogsResult) {\n if (!offsetDate) {\n mtproto_1.telegramMeWebService.setAuthorized(true);\n }\n exports.appUsersManager.saveApiUsers(dialogsResult.users);\n exports.appChatsManager.saveApiChats(dialogsResult.chats);\n _this.saveMessages(dialogsResult.messages);\n var maxSeenIdIncremented = offsetDate ? true : false;\n var hasPrepend = false;\n dialogsResult.dialogs.reverse();\n dialogsResult.dialogs.forEach(function (dialog) {\n _this.saveConversation(dialog);\n if (offsetIndex && dialog.index > offsetIndex) {\n _this.newDialogsToHandle[dialog.peerID] = dialog;\n hasPrepend = true;\n }\n if (!maxSeenIdIncremented &&\n !exports.appPeersManager.isChannel(exports.appPeersManager.getPeerID(dialog.peer))) {\n _this.incrementMaxSeenID(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n });\n dialogsResult.dialogs.reverse();\n if (!dialogsResult.dialogs.length ||\n !dialogsResult.count ||\n dialogs.length >= dialogsResult.count) {\n _this.allDialogsLoaded = true;\n }\n if (hasPrepend &&\n !_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n else {\n $rootScope.$broadcast('dialogs_multiupdate', {});\n }\n });\n };\n AppMessagesManager.prototype.generateDialogIndex = function (date) {\n if (date === undefined) {\n date = utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n return (date * 0x10000) + ((++this.dialogsNum) & 0xFFFF);\n };\n AppMessagesManager.prototype.pushDialogToStorage = function (dialog, offsetDate) {\n var dialogs = this.dialogsStorage.dialogs;\n var pos = this.getDialogByPeerID(dialog.peerID)[1];\n if (pos !== undefined) {\n dialogs.splice(pos, 1);\n }\n if (offsetDate &&\n !dialog.pFlags.pinned &&\n (!this.dialogsOffsetDate || offsetDate < this.dialogsOffsetDate)) {\n if (pos !== undefined) {\n // So the dialog jumped to the last position\n return false;\n }\n this.dialogsOffsetDate = offsetDate;\n }\n var index = dialog.index;\n var i;\n var len = dialogs.length;\n if (!len || index < dialogs[len - 1].index) {\n dialogs.push(dialog);\n }\n else if (index >= dialogs[0].index) {\n dialogs.unshift(dialog);\n }\n else {\n for (i = 0; i < len; i++) {\n if (index > dialogs[i].index) {\n dialogs.splice(i, 0, dialog);\n break;\n }\n }\n }\n };\n AppMessagesManager.prototype.getMessage = function (messageID) {\n return this.messagesStorage[messageID] || {\n _: 'messageEmpty',\n deleted: true,\n pFlags: { out: false, unread: false }\n };\n };\n AppMessagesManager.prototype.getMessagePeer = function (message) {\n var toID = message.to_id && exports.appPeersManager.getPeerID(message.to_id) || 0;\n if (toID < 0) {\n return toID;\n }\n else if (message.pFlags && message.pFlags.out || message.flags & 2) {\n return toID;\n }\n return message.from_id;\n };\n AppMessagesManager.prototype.getDialogByPeerID = function (peerID) {\n for (var i = 0; i < this.dialogsStorage.dialogs.length; i++) {\n if (this.dialogsStorage.dialogs[i].peerID == peerID) {\n return [this.dialogsStorage.dialogs[i], i];\n }\n }\n return [];\n };\n AppMessagesManager.prototype.reloadConversation = function (peerID) {\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getPeerDialogs', {\n peers: [\n exports.appPeersManager.getInputPeerByID(peerID)\n ]\n }).then(this.applyConversations.bind(this));\n };\n AppMessagesManager.prototype.saveMessages = function (apiMessages, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n apiMessages.forEach(function (apiMessage) {\n if (apiMessage.pFlags === undefined) {\n apiMessage.pFlags = {};\n }\n if (!apiMessage.pFlags.out) {\n apiMessage.pFlags.out = false;\n }\n if (!apiMessage.pFlags.unread) {\n apiMessage.pFlags.unread = false;\n }\n if (apiMessage._ == 'messageEmpty') {\n return;\n }\n var peerID = _this.getMessagePeer(apiMessage);\n var isChannel = apiMessage.to_id._ == 'peerChannel';\n var channelID = isChannel ? -peerID : 0;\n var isBroadcast = isChannel && exports.appChatsManager.isBroadcast(channelID);\n var mid = exports.appMessagesIDsManager.getFullMessageID(apiMessage.id, channelID);\n apiMessage.mid = mid;\n var dialog = _this.getDialogByPeerID(peerID)[0];\n if (dialog && mid > 0) {\n var dialogKey = apiMessage.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id';\n apiMessage.pFlags.unread = mid > dialog[dialogKey];\n }\n else if (options.isNew) {\n apiMessage.pFlags.unread = true;\n }\n // console.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n if (apiMessage.reply_to_msg_id) {\n apiMessage.reply_to_mid = exports.appMessagesIDsManager.getFullMessageID(apiMessage.reply_to_msg_id, channelID);\n }\n apiMessage.date -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n apiMessage.peerID = peerID;\n apiMessage.fromID = apiMessage.pFlags.post ? peerID : apiMessage.from_id;\n var fwdHeader = apiMessage.fwd_from;\n if (fwdHeader) {\n if (peerID == exports.appUsersManager.getSelf().id) {\n if (fwdHeader.saved_from_peer && fwdHeader.saved_from_msg_id) {\n var savedFromPeerID = exports.appPeersManager.getPeerID(fwdHeader.saved_from_peer);\n var savedFromMid = exports.appMessagesIDsManager.getFullMessageID(fwdHeader.saved_from_msg_id, exports.appPeersManager.isChannel(savedFromPeerID) ? -savedFromPeerID : 0);\n apiMessage.savedFrom = savedFromPeerID + '_' + savedFromMid;\n }\n apiMessage.fromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id;\n }\n else {\n apiMessage.fwdFromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id;\n apiMessage.fwdPostID = fwdHeader.channel_post;\n }\n fwdHeader.date -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (apiMessage.via_bot_id > 0) {\n apiMessage.viaBotID = apiMessage.via_bot_id;\n }\n var mediaContext = {\n user_id: apiMessage.fromID,\n date: apiMessage.date\n };\n if (apiMessage.media) {\n switch (apiMessage.media._) {\n case 'messageMediaEmpty':\n delete apiMessage.media;\n break;\n case 'messageMediaPhoto':\n if (apiMessage.media.ttl_seconds) {\n apiMessage.media = { _: 'messageMediaUnsupportedWeb' };\n }\n else {\n exports.appPhotosManager.savePhoto(apiMessage.media.photo, mediaContext);\n }\n break;\n /* case 'messageMediaDocument':\n if(apiMessage.media.ttl_seconds) {\n apiMessage.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n AppDocsManager.saveDoc(apiMessage.media.document, mediaContext);\n }\n break;\n case 'messageMediaWebPage':\n AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.mid, mediaContext);\n break;\n case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n case 'messageMediaInvoice':\n apiMessage.media = { _: 'messageMediaUnsupportedWeb' };\n break;\n case 'messageMediaGeoLive':\n apiMessage.media._ = 'messageMediaGeo';\n break;\n }\n }\n if (apiMessage.action) {\n var migrateFrom;\n var migrateTo;\n switch (apiMessage.action._) {\n case 'messageActionChatEditPhoto':\n exports.appPhotosManager.savePhoto(apiMessage.action.photo, mediaContext);\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelEditPhoto';\n }\n break;\n case 'messageActionChatEditTitle':\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelEditTitle';\n }\n break;\n case 'messageActionChatDeletePhoto':\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n case 'messageActionChatAddUser':\n if (apiMessage.action.users.length == 1) {\n apiMessage.action.user_id = apiMessage.action.users[0];\n if (apiMessage.fromID == apiMessage.action.user_id) {\n if (isChannel) {\n apiMessage.action._ = 'messageActionChatJoined';\n }\n else {\n apiMessage.action._ = 'messageActionChatReturn';\n }\n }\n }\n else if (apiMessage.action.users.length > 1) {\n apiMessage.action._ = 'messageActionChatAddUsers';\n }\n break;\n case 'messageActionChatDeleteUser':\n if (apiMessage.fromID == apiMessage.action.user_id) {\n apiMessage.action._ = 'messageActionChatLeave';\n }\n break;\n case 'messageActionChannelMigrateFrom':\n migrateFrom = -apiMessage.action.chat_id;\n migrateTo = -channelID;\n break;\n case 'messageActionChatMigrateTo':\n migrateFrom = -channelID;\n migrateTo = -apiMessage.action.channel_id;\n break;\n case 'messageActionHistoryClear':\n apiMessage.deleted = true;\n apiMessage.clear_history = true;\n apiMessage.pFlags.out = false;\n apiMessage.pFlags.unread = false;\n break;\n case 'messageActionPhoneCall':\n delete apiMessage.fromID;\n apiMessage.action.type =\n (apiMessage.pFlags.out ? 'out_' : 'in_') +\n (apiMessage.action.reason._ == 'phoneCallDiscardReasonMissed' ||\n apiMessage.action.reason._ == 'phoneCallDiscardReasonBusy'\n ? 'missed'\n : 'ok');\n break;\n }\n if (migrateFrom &&\n migrateTo &&\n !_this.migratedFromTo[migrateFrom] &&\n !_this.migratedToFrom[migrateTo]) {\n _this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n if (apiMessage.message && apiMessage.message.length) {\n var myEntities = richtextprocessor_1.RichTextProcessor.parseEntities(apiMessage.message);\n var apiEntities = apiMessage.entities || [];\n apiMessage.totalEntities = richtextprocessor_1.RichTextProcessor.mergeEntities(myEntities, apiEntities, !apiMessage.pending);\n }\n apiMessage.canBeEdited = _this.canMessageBeEdited(apiMessage);\n if (!options.isEdited) {\n _this.messagesStorage[mid] = apiMessage;\n }\n });\n };\n AppMessagesManager.prototype.migrateChecks = function (migrateFrom, migrateTo) {\n var _this = this;\n if (!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n exports.appChatsManager.hasChat(-migrateTo)) {\n var fromChat = exports.appChatsManager.getChat(-migrateFrom);\n if (fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id == -migrateTo) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n setTimeout(function () {\n var foundDialog = _this.getDialogByPeerID(migrateFrom);\n if (foundDialog.length) {\n _this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: migrateFrom });\n }\n $rootScope.$broadcast('dialog_migrate', { migrateFrom: migrateFrom, migrateTo: migrateTo });\n }, 100);\n }\n }\n };\n AppMessagesManager.prototype.canMessageBeEdited = function (message) {\n var goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage',\n 'messageMediaPending'\n ];\n if (message._ != 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) == -1 ||\n message.fromID && exports.appUsersManager.isBot(message.fromID)) {\n return false;\n }\n if (message.media &&\n message.media._ == 'messageMediaDocument' &&\n message.media.document.sticker) {\n return false;\n }\n return true;\n };\n AppMessagesManager.prototype.applyConversations = function (dialogsResult) {\n var _this = this;\n exports.appUsersManager.saveApiUsers(dialogsResult.users);\n exports.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n var updatedDialogs = {};\n var hasUpdated = false;\n dialogsResult.dialogs.forEach(function (dialog) {\n var peerID = exports.appPeersManager.getPeerID(dialog.peer);\n var topMessage = dialog.top_message;\n var topPendingMesage = _this.pendingTopMsgs[peerID];\n if (topPendingMesage) {\n if (!topMessage || _this.getMessage(topPendingMesage).date > _this.getMessage(topMessage).date) {\n dialog.top_message = topMessage = topPendingMesage;\n }\n }\n if (topMessage) {\n var wasBefore = _this.getDialogByPeerID(peerID).length > 0;\n _this.saveConversation(dialog);\n if (wasBefore) {\n _this.clearDialogCache(topMessage);\n $rootScope.$broadcast('dialog_top', dialog);\n }\n else {\n updatedDialogs[peerID] = dialog;\n hasUpdated = true;\n }\n }\n else {\n var foundDialog = _this.getDialogByPeerID(peerID);\n if (foundDialog.length) {\n _this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: peerID });\n }\n }\n if (_this.newUpdatesAfterReloadToHandle[peerID] !== undefined) {\n for (var i in _this.newUpdatesAfterReloadToHandle[peerID]) {\n var update = _this.newUpdatesAfterReloadToHandle[peerID][i];\n _this.handleUpdate(update);\n }\n delete _this.newUpdatesAfterReloadToHandle[peerID];\n }\n });\n if (hasUpdated) {\n $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs);\n }\n };\n AppMessagesManager.prototype.clearDialogCache = function (msgID) {\n delete this.messagesForDialogs[msgID];\n };\n AppMessagesManager.prototype.saveConversation = function (dialog) {\n var peerID = exports.appPeersManager.getPeerID(dialog.peer);\n if (!peerID) {\n return false;\n }\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var peerText = exports.appPeersManager.getPeerSearchText(peerID);\n utils_1.SearchIndexManager.indexObject(peerID, peerText, this.dialogsIndex);\n var isMegagroup = exports.appPeersManager.isMegagroup(channelID);\n if (dialog.top_message) {\n var mid = exports.appMessagesIDsManager.getFullMessageID(dialog.top_message, channelID);\n var message = this.getMessage(mid);\n }\n else {\n var mid = this.tempID--;\n var message = {\n _: 'message',\n id: mid,\n mid: mid,\n from_id: exports.appUsersManager.getSelf().id,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n deleted: true,\n flags: 0,\n pFlags: { unread: false, out: true },\n date: 0,\n message: ''\n };\n this.saveMessages([message]);\n }\n var offsetDate = message.date;\n if (!channelID && peerID < 0) {\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n var migratedToPeer = exports.appPeersManager.getPeerID(chat.migrated_to);\n this.migratedFromTo[peerID] = migratedToPeer;\n this.migratedToFrom[migratedToPeer] = peerID;\n return;\n }\n }\n dialog.top_message = mid;\n dialog.read_inbox_max_id = exports.appMessagesIDsManager.getFullMessageID(dialog.read_inbox_max_id, channelID);\n dialog.read_outbox_max_id = exports.appMessagesIDsManager.getFullMessageID(dialog.read_outbox_max_id, channelID);\n var topDate = message.date;\n if (channelID) {\n var channel = exports.appChatsManager.getChat(channelID);\n if (!topDate || channel.date && channel.date > topDate) {\n topDate = channel.date;\n }\n }\n var savedDraft = {}; // DraftsManager.saveDraft(peerID, dialog.draft); // warning\n if (savedDraft && savedDraft.date > topDate) {\n topDate = savedDraft.date;\n }\n if (dialog.pFlags.pinned) {\n topDate = this.generateDialogPinnedDate();\n }\n dialog.index = this.generateDialogIndex(topDate);\n dialog.peerID = peerID;\n this.pushDialogToStorage(dialog, offsetDate);\n // Because we saved message without dialog present\n var unreadKey = message.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id';\n if (message.mid && message.mid > dialog[unreadKey]) {\n message.pFlags.unread = true;\n }\n if (this.historiesStorage[peerID] === undefined &&\n !message.deleted) {\n var historyStorage = { count: null, history: [], pending: [] };\n historyStorage[mid > 0 ? 'history' : 'pending'].push(mid);\n if (mid < 0 && message.pFlags.unread) {\n dialog.unread_count++;\n }\n this.historiesStorage[peerID] = historyStorage;\n if (this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n }\n //NotificationsManager.savePeerSettings(peerID, dialog.notify_settings); // warning\n if (channelID && dialog.pts) {\n exports.apiUpdatesManager.addChannelState(channelID, dialog.pts);\n }\n if (Config.Modes.packed &&\n !channelID &&\n dialog.unread_count > 0 &&\n this.maxSeenID &&\n dialog.top_message > this.maxSeenID &&\n message.pFlags.unread &&\n !message.pFlags.out) {\n var notifyPeer = message.flags & 16 ? message.from_id : peerID;\n /* NotificationsManager.getPeerMuted(notifyPeer).then((muted: any) => {\n if(!muted) {\n this.notifyAboutMessage(message);\n }\n }); */ // WARNING\n }\n };\n AppMessagesManager.prototype.handleNotifications = function () {\n var _this = this;\n clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n var timeout = $rootScope.idle.isIDLE /* && StatusManager.isOtherDeviceActive() */ ? 30000 : 1000;\n Object.keys(this.notificationsToHandle).forEach(function (key) {\n var notifyPeerToHandle = _this.notificationsToHandle[key];\n notifyPeerToHandle.isMutedPromise.then(function (muted) {\n var topMessage = notifyPeerToHandle.top_message;\n if (muted ||\n !topMessage.pFlags.unread) {\n return;\n }\n setTimeout(function () {\n if (topMessage.pFlags.unread) {\n _this.notifyAboutMessage(topMessage, {\n fwd_count: notifyPeerToHandle.fwd_count\n });\n }\n }, timeout);\n });\n });\n this.notificationsToHandle = {};\n };\n AppMessagesManager.prototype.notifyAboutMessage = function (message, options) {\n if (options === void 0) { options = {}; }\n var peerID = this.getMessagePeer(message);\n var peerString;\n var notification = {};\n var notificationMessage = '', notificationPhoto;\n var notifySettings = {}; //NotificationsManager.getNotifySettings(); // warning\n if (message.fwdFromID && options.fwd_count) {\n notificationMessage = options.fwd_count; // this.fwdMessagesPluralize(options.fwd_count); // warning\n }\n else if (message.message) {\n if (notifySettings.nopreview) {\n notificationMessage = 'conversation_message_sent';\n }\n else {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(message.message);\n }\n }\n else if (message.media) {\n var captionEmoji = '';\n switch (message.media._) {\n case 'messageMediaPhoto':\n notificationMessage = _('conversation_media_photo_raw');\n captionEmoji = 'рџ–ј';\n break;\n case 'messageMediaDocument':\n switch (message.media.document.type) {\n case 'gif':\n notificationMessage = _('conversation_media_gif_raw');\n captionEmoji = 'рџЋ¬';\n break;\n case 'sticker':\n notificationMessage = _('conversation_media_sticker');\n var stickerEmoji = message.media.document.stickerEmojiRaw;\n if (stickerEmoji !== undefined) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(stickerEmoji) + ' ' + notificationMessage;\n }\n break;\n case 'video':\n notificationMessage = _('conversation_media_video_raw');\n captionEmoji = 'рџ“№';\n break;\n case 'round':\n notificationMessage = _('conversation_media_round_raw');\n captionEmoji = 'рџ“№';\n break;\n case 'voice':\n case 'audio':\n notificationMessage = _('conversation_media_audio_raw');\n break;\n default:\n if (message.media.document.file_name) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText('рџ“Ћ ' + message.media.document.file_name);\n }\n else {\n notificationMessage = _('conversation_media_document_raw');\n captionEmoji = 'рџ“Ћ';\n }\n break;\n }\n break;\n case 'messageMediaGeo':\n case 'messageMediaVenue':\n notificationMessage = _('conversation_media_location_raw');\n captionEmoji = 'рџ“Ќ';\n break;\n case 'messageMediaContact':\n notificationMessage = _('conversation_media_contact_raw');\n break;\n case 'messageMediaGame':\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText('рџЋ® ' + message.media.game.title);\n break;\n case 'messageMediaUnsupported':\n notificationMessage = _('conversation_media_unsupported_raw');\n break;\n default:\n notificationMessage = _('conversation_media_attachment_raw');\n break;\n }\n if (captionEmoji != '' &&\n message.media.caption) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(captionEmoji + ' ' + message.media.caption);\n }\n }\n else if (message._ == 'messageService') {\n switch (message.action._) {\n case 'messageActionChatCreate':\n notificationMessage = _('conversation_group_created_raw');\n break;\n case 'messageActionChatEditTitle':\n notificationMessage = _('conversation_group_renamed_raw');\n break;\n case 'messageActionChatEditPhoto':\n notificationMessage = _('conversation_group_photo_updated_raw');\n break;\n case 'messageActionChatDeletePhoto':\n notificationMessage = _('conversation_group_photo_removed_raw');\n break;\n case 'messageActionChatAddUser':\n case 'messageActionChatAddUsers':\n notificationMessage = _('conversation_invited_user_message_raw');\n break;\n case 'messageActionChatReturn':\n notificationMessage = _('conversation_returned_to_group_raw');\n break;\n case 'messageActionChatJoined':\n notificationMessage = _('conversation_joined_group_raw');\n break;\n case 'messageActionChatDeleteUser':\n notificationMessage = _('conversation_kicked_user_message_raw');\n break;\n case 'messageActionChatLeave':\n notificationMessage = _('conversation_left_group_raw');\n break;\n case 'messageActionChatJoinedByLink':\n notificationMessage = _('conversation_joined_by_link_raw');\n break;\n case 'messageActionChannelCreate':\n notificationMessage = _('conversation_created_channel_raw');\n break;\n case 'messageActionChannelEditTitle':\n notificationMessage = _('conversation_changed_channel_name_raw');\n break;\n case 'messageActionChannelEditPhoto':\n notificationMessage = _('conversation_changed_channel_photo_raw');\n break;\n case 'messageActionChannelDeletePhoto':\n notificationMessage = _('conversation_removed_channel_photo_raw');\n break;\n case 'messageActionPinMessage':\n notificationMessage = _('conversation_pinned_message_raw');\n break;\n case 'messageActionGameScore':\n notificationMessage = message.action.score; //this.gameScorePluralize(message.action.score); // warning\n break;\n case 'messageActionPhoneCall':\n switch (message.action.type) {\n case 'out_missed':\n notificationMessage = _('message_service_phonecall_canceled_raw');\n break;\n case 'in_missed':\n notificationMessage = _('message_service_phonecall_missed_raw');\n break;\n case 'out_ok':\n notificationMessage = _('message_service_phonecall_outgoing_raw');\n break;\n case 'in_ok':\n notificationMessage = _('message_service_phonecall_incoming_raw');\n break;\n }\n break;\n }\n }\n if (peerID > 0) {\n var fromUser = exports.appUsersManager.getUser(message.from_id);\n var fromPhoto = exports.appUsersManager.getUserPhoto(message.from_id);\n notification.title = (fromUser.first_name || '') +\n (fromUser.first_name && fromUser.last_name ? ' ' : '') +\n (fromUser.last_name || '');\n if (!notification.title) {\n notification.title = fromUser.phone || _('conversation_unknown_user_raw');\n }\n notificationPhoto = fromPhoto;\n peerString = exports.appUsersManager.getUserString(peerID);\n }\n else {\n notification.title = exports.appChatsManager.getChat(-peerID).title || _('conversation_unknown_chat_raw');\n if (message.from_id > 0) {\n var fromUser = exports.appUsersManager.getUser(message.from_id);\n notification.title = (fromUser.first_name || fromUser.last_name || _('conversation_unknown_user_raw')) +\n ' @ ' +\n notification.title;\n }\n notificationPhoto = exports.appChatsManager.getChatPhoto(-peerID);\n peerString = exports.appChatsManager.getChatString(-peerID);\n }\n notification.title = richtextprocessor_1.RichTextProcessor.wrapPlainText(notification.title);\n notification.onclick = function () {\n $rootScope.$broadcast('history_focus', {\n peerString: peerString,\n messageID: message.flags & 16 ? message.mid : 0\n });\n };\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = message.pFlags.silent || false;\n if (notificationPhoto.location && !notificationPhoto.location.empty) {\n mtproto_1.MTProto.apiFileManager.downloadSmallFile(notificationPhoto.location /* , notificationPhoto.size */)\n .then(function (blob) {\n if (message.pFlags.unread) {\n notification.image = blob;\n // NotificationsManager.notify(notification) // warning\n }\n });\n }\n else {\n // NotificationsManager.notify(notification) // warning\n }\n };\n AppMessagesManager.prototype.mergeReplyKeyboard = function (historyStorage, message) {\n // console.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if (!message.reply_markup &&\n !message.pFlags.out &&\n !message.action) {\n return false;\n }\n if (message.reply_markup &&\n message.reply_markup._ == 'replyInlineMarkup') {\n return false;\n }\n var messageReplyMarkup = message.reply_markup;\n var lastReplyMarkup = historyStorage.reply_markup;\n if (messageReplyMarkup) {\n if (lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n if (messageReplyMarkup.pFlags.selective &&\n !(message.flags & 16)) {\n return false;\n }\n if (historyStorage.maxOutID &&\n message.mid < historyStorage.maxOutID &&\n messageReplyMarkup.pFlags.single_use) {\n messageReplyMarkup.pFlags.hidden = true;\n }\n messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup);\n if (messageReplyMarkup._ != 'replyKeyboardHide') {\n messageReplyMarkup.fromID = message.from_id;\n }\n historyStorage.reply_markup = messageReplyMarkup;\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n if (message.pFlags.out) {\n if (lastReplyMarkup) {\n if (lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.mid < 0) &&\n message.message) {\n lastReplyMarkup.pFlags.hidden = true;\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n }\n else if (!historyStorage.maxOutID ||\n message.mid > historyStorage.maxOutID) {\n historyStorage.maxOutID = message.mid;\n }\n }\n if (message.action &&\n message.action._ == 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id == lastReplyMarkup.fromID\n : exports.appUsersManager.isBot(message.action.user_id))) {\n historyStorage.reply_markup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n flags: 0,\n pFlags: {}\n };\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n return false;\n };\n AppMessagesManager.prototype.generateDialogPinnedDate = function () {\n return 0x7fffff00 + ((this.pinnedIndex++) & 0xff);\n };\n AppMessagesManager.prototype.handleNewMessages = function () {\n clearTimeout(this.newMessagesHandlePromise);\n this.newMessagesHandlePromise = 0;\n $rootScope.$broadcast('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n AppMessagesManager.prototype.handleNewDialogs = function () {\n var _this = this;\n clearTimeout(this.newDialogsHandlePromise);\n this.newDialogsHandlePromise = 0;\n var newMaxSeenID = 0;\n Object.keys(this.newDialogsToHandle).forEach(function (peerID) {\n var dialog = _this.newDialogsToHandle[peerID];\n if (dialog.reload) {\n _this.reloadConversation(+peerID);\n delete _this.newDialogsToHandle[peerID];\n }\n else {\n _this.pushDialogToStorage(dialog);\n if (!exports.appPeersManager.isChannel(+peerID)) {\n newMaxSeenID = Math.max(newMaxSeenID, dialog.top_message || 0);\n }\n }\n });\n if (newMaxSeenID != 0) {\n this.incrementMaxSeenID(newMaxSeenID);\n }\n $rootScope.$broadcast('dialogs_multiupdate', this.newDialogsToHandle);\n this.newDialogsToHandle = {};\n };\n AppMessagesManager.prototype.readHistory = function (peerID, maxID) {\n if (maxID === void 0) { maxID = 0; }\n // console.trace('start read')\n var isChannel = exports.appPeersManager.isChannel(peerID);\n var historyStorage = this.historiesStorage[peerID];\n var foundDialog = this.getDialogByPeerID(peerID)[0];\n if (!foundDialog || !foundDialog.unread_count) {\n if (!historyStorage || !historyStorage.history.length) {\n return false;\n }\n var messageID, message;\n var foundUnread = false;\n for (i = historyStorage.history.length; i >= 0; i--) {\n messageID = historyStorage.history[i];\n message = this.messagesStorage[messageID];\n if (message && !message.pFlags.out && message.pFlags.unread) {\n foundUnread = true;\n break;\n }\n }\n if (!foundUnread) {\n return false;\n }\n }\n if (historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n var apiPromise;\n if (isChannel) {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('channels.readHistory', {\n channel: exports.appChatsManager.getChannelInput(-peerID),\n max_id: maxID\n });\n }\n else {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.readHistory', {\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n max_id: maxID\n }).then(function (affectedMessages) {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n historyStorage.readPromise = apiPromise.then(function () {\n if (foundDialog) {\n // console.log('done read history', peerID)\n var index = -1;\n if (maxID != 0 && historyStorage && historyStorage.history.length) {\n index = historyStorage.history.findIndex(function (mid) { return mid == maxID; });\n }\n foundDialog.unread_count = index == -1 ? 0 : index;\n $rootScope.$broadcast('dialog_unread', { peerID: peerID, count: foundDialog.unread_count });\n $rootScope.$broadcast('messages_read');\n if (historyStorage && historyStorage.history.length) {\n console.warn('readPromise:', index, historyStorage.history[index != -1 ? index : 0]);\n foundDialog.read_inbox_max_id = historyStorage.history[index != -1 ? index : 0];\n }\n }\n /* if (foundDialog) {\n // console.log('done read history', peerID)\n foundDialog.unread_count = 0\n $rootScope.$broadcast('dialog_unread', {peerID: peerID, count: 0})\n $rootScope.$broadcast('messages_read')\n if (historyStorage && historyStorage.history.length) {\n foundDialog.read_inbox_max_id = historyStorage.history[0]\n }\n } */\n }).finally(function () {\n delete historyStorage.readPromise;\n });\n if (historyStorage && historyStorage.history.length) {\n var messageID;\n var message, i;\n var peerID, foundDialog;\n for (i = 0; i < historyStorage.history.length; i++) {\n messageID = historyStorage.history[i];\n message = this.messagesStorage[messageID];\n if (message && !message.pFlags.out) {\n message.pFlags.unread = false;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].pFlags.unread = false;\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].pFlags.unread = false;\n }\n //NotificationsManager.cancel('msg' + messageID); // warning\n }\n if (messageID == maxID)\n break;\n }\n }\n // NotificationsManager.soundReset(AppPeersManager.getPeerString(peerID)) // warning\n return historyStorage.readPromise;\n };\n AppMessagesManager.prototype.readMessages = function (messageIDs) {\n var splitted = exports.appMessagesIDsManager.splitMessageIDsByChannels(messageIDs);\n Object.keys(splitted.msgIDs).forEach(function (channelID) {\n channelID = +channelID;\n var msgIDs = splitted.msgIDs[channelID];\n if (channelID > 0) {\n mtproto_1.MTProto.apiManager.invokeApi('channels.readMessageContents', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n id: msgIDs\n }).then(function () {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelID,\n messages: msgIDs\n }\n });\n });\n }\n else {\n mtproto_1.MTProto.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIDs\n }).then(function (affectedMessages) {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateReadMessagesContents',\n messages: msgIDs,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n });\n };\n AppMessagesManager.prototype.handleUpdate = function (update) {\n var _this = this;\n switch (update._) {\n case 'updateMessageID':\n var randomID = update.random_id;\n var pendingData = this.pendingByRandomID[randomID];\n if (pendingData) {\n var peerID = pendingData[0];\n var tempID = pendingData[1];\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var mid = exports.appMessagesIDsManager.getFullMessageID(update.id, channelID);\n var message = this.messagesStorage[mid];\n if (message) {\n var historyStorage = this.historiesStorage[peerID];\n var pos = historyStorage.pending.indexOf(tempID);\n if (pos != -1) {\n historyStorage.pending.splice(pos, 1);\n }\n delete this.messagesForHistory[tempID];\n delete this.messagesStorage[tempID];\n var msgs = {};\n msgs[tempID] = true;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: msgs });\n this.finalizePendingMessageCallbacks(tempID, mid);\n }\n else {\n this.pendingByMessageID[mid] = randomID;\n }\n }\n break;\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n var message = update.message;\n var peerID = this.getMessagePeer(message);\n var historyStorage = this.historiesStorage[peerID];\n var foundDialog = this.getDialogByPeerID(peerID);\n if (!foundDialog.length) {\n this.newDialogsToHandle[peerID] = { reload: true };\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n if (this.newUpdatesAfterReloadToHandle[peerID] === undefined) {\n this.newUpdatesAfterReloadToHandle[peerID] = [];\n }\n this.newUpdatesAfterReloadToHandle[peerID].push(update);\n break;\n }\n if (update._ == 'updateNewChannelMessage') {\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n break;\n }\n }\n this.saveMessages([message], { isNew: true });\n // console.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = {\n count: null,\n history: [],\n pending: []\n };\n }\n var history = message.mid > 0 ? historyStorage.history : historyStorage.pending;\n if (history.indexOf(message.mid) != -1) {\n return false;\n }\n var topMsgID = history[0];\n history.unshift(message.mid);\n if (message.mid > 0 && message.mid < topMsgID) {\n history.sort(function (a, b) {\n return b - a;\n });\n }\n if (message.mid > 0 &&\n historyStorage.count !== null) {\n historyStorage.count++;\n }\n if (this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n if (!message.pFlags.out && message.from_id) {\n exports.appUsersManager.forceUserOnline(message.from_id);\n }\n var randomID = this.pendingByMessageID[message.mid], pendingMessage;\n if (randomID) {\n if (pendingMessage = this.finalizePendingMessage(randomID, message)) {\n $rootScope.$broadcast('history_update', { peerID: peerID });\n }\n delete this.pendingByMessageID[message.mid];\n }\n if (!pendingMessage) {\n if (this.newMessagesToHandle[peerID] === undefined) {\n this.newMessagesToHandle[peerID] = [];\n }\n this.newMessagesToHandle[peerID].push(message.mid);\n if (!this.newMessagesHandlePromise) {\n this.newMessagesHandlePromise = window.setTimeout(this.handleNewMessages.bind(this), 0);\n }\n }\n var inboxUnread = !message.pFlags.out && message.pFlags.unread;\n var dialog = foundDialog[0];\n dialog.top_message = message.mid;\n if (inboxUnread) {\n dialog.unread_count++;\n }\n if (!dialog.pFlags.pinned || !dialog.index) {\n dialog.index = this.generateDialogIndex(message.date);\n }\n this.newDialogsToHandle[peerID] = dialog;\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n if (inboxUnread &&\n ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE)) {\n var notifyPeer = message.flags & 16 ? message.from_id : peerID;\n var notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if (notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n isMutedPromise: Promise.resolve() /* NotificationsManager.getPeerMuted(notifyPeer) */,\n fwd_count: 0,\n from_id: 0\n };\n }\n if (notifyPeerToHandle.from_id != message.from_id) {\n notifyPeerToHandle.from_id = message.from_id;\n notifyPeerToHandle.fwd_count = 0;\n }\n if (message.fwdFromID) {\n notifyPeerToHandle.fwd_count++;\n }\n notifyPeerToHandle.top_message = message;\n if (!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications.bind(this), 1000);\n }\n }\n break;\n case 'updateDialogPinned':\n var peerID = exports.appPeersManager.getPeerID(update.peer);\n var foundDialog = this.getDialogByPeerID(peerID);\n if (!foundDialog.length || !update.pFlags.pinned) {\n this.newDialogsToHandle[peerID] = { reload: true };\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n break;\n }\n var dialog = foundDialog[0];\n dialog.index = this.generateDialogIndex(this.generateDialogPinnedDate());\n dialog.pFlags.pinned = true;\n break;\n case 'updatePinnedDialogs':\n var newPinned = {};\n if (!update.order) {\n mtproto_1.MTProto.apiManager.invokeApi('messages.getPinnedDialogs', {}).then(function (dialogsResult) {\n dialogsResult.dialogs.reverse();\n _this.applyConversations(dialogsResult);\n dialogsResult.dialogs.forEach(function (dialog) {\n newPinned[dialog.peerID] = true;\n });\n _this.dialogsStorage.dialogs.forEach(function (dialog) {\n var peerID = dialog.peerID;\n if (dialog.pFlags.pinned && !newPinned[peerID]) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n }\n });\n });\n break;\n }\n update.order.reverse();\n update.order.forEach(function (peer) {\n var peerID = exports.appPeersManager.getPeerID(peer);\n newPinned[peerID] = true;\n var foundDialog = _this.getDialogByPeerID(peerID);\n if (!foundDialog.length) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n return;\n }\n var dialog = foundDialog[0];\n dialog.index = _this.generateDialogIndex(_this.generateDialogPinnedDate());\n dialog.pFlags.pinned = true;\n _this.newDialogsToHandle[peerID] = dialog;\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n });\n this.dialogsStorage.dialogs.forEach(function (dialog) {\n var peerID = dialog.peerID;\n if (dialog.pFlags.pinned && !newPinned[peerID]) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n }\n });\n break;\n case 'updateEditMessage':\n case 'updateEditChannelMessage':\n var message = update.message;\n var peerID = this.getMessagePeer(message);\n var channelID = message.to_id._ == 'peerChannel' ? -peerID : 0;\n var mid = exports.appMessagesIDsManager.getFullMessageID(message.id, channelID);\n if (this.messagesStorage[mid] === undefined) {\n break;\n }\n // console.trace(dT(), 'edit message', message)\n this.saveMessages([message], { isEdited: true });\n utils_1.safeReplaceObject(this.messagesStorage[mid], message);\n var wasForHistory = this.messagesForHistory[mid];\n if (wasForHistory !== undefined) {\n delete this.messagesForHistory[mid];\n var newForHistory = this.wrapForHistory(mid);\n utils_1.safeReplaceObject(wasForHistory, newForHistory);\n this.messagesForHistory[mid] = wasForHistory;\n }\n var dialog = this.getDialogByPeerID(peerID)[0];\n var isTopMessage = dialog && dialog.top_message == mid;\n if (message.clear_history) {\n if (isTopMessage) {\n $rootScope.$broadcast('dialog_flush', { peerID: peerID });\n }\n else {\n var msgs = {};\n msgs[mid] = true;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: msgs });\n }\n }\n else {\n $rootScope.$broadcast('message_edit', {\n peerID: peerID,\n id: message.id,\n mid: mid\n });\n if (isTopMessage) {\n var updatedDialogs = {};\n updatedDialogs[peerID] = dialog;\n $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs);\n }\n }\n break;\n case 'updateReadHistoryInbox':\n case 'updateReadHistoryOutbox':\n case 'updateReadChannelInbox':\n case 'updateReadChannelOutbox':\n var isOut = update._ == 'updateReadHistoryOutbox' || update._ == 'updateReadChannelOutbox';\n var channelID = update.channel_id;\n var maxID = exports.appMessagesIDsManager.getFullMessageID(update.max_id, channelID);\n var peerID = channelID ? -channelID : exports.appPeersManager.getPeerID(update.peer);\n var foundDialog = this.getDialogByPeerID(peerID);\n var history = (this.historiesStorage[peerID] || {}).history || [];\n var newUnreadCount = 0;\n var length = history.length;\n var foundAffected = false;\n var messageID, message;\n var i;\n //console.warn(dT(), 'read', peerID, isOut ? 'out' : 'in', maxID)\n if (peerID > 0 && isOut) {\n exports.appUsersManager.forceUserOnline(peerID);\n }\n for (i = 0; i < length; i++) {\n messageID = history[i];\n if (messageID > maxID) {\n continue;\n }\n message = this.messagesStorage[messageID];\n if (message.pFlags.out != isOut) {\n continue;\n }\n if (!message.pFlags.unread) {\n break;\n }\n // console.warn('read', messageID, message.pFlags.unread, message)\n if (message && message.pFlags.unread) {\n message.pFlags.unread = false;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].pFlags.unread = false;\n if (!foundAffected) {\n foundAffected = true;\n }\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].pFlags.unread = false;\n }\n if (!message.pFlags.out) {\n if (foundDialog[0]) {\n newUnreadCount = --foundDialog[0].unread_count;\n }\n //NotificationsManager.cancel('msg' + messageID); // warning\n }\n }\n }\n if (foundDialog[0]) {\n if (!isOut &&\n newUnreadCount &&\n foundDialog[0].top_message <= maxID) {\n newUnreadCount = foundDialog[0].unread_count = 0;\n }\n var dialogKey = isOut ? 'read_outbox_max_id' : 'read_inbox_max_id';\n foundDialog[0][dialogKey] = maxID;\n }\n //if(newUnreadCount != 0 || !isOut) { // fix 16.11.2019 (maybe not)\n console.warn(utils_1.dT(), 'cnt', peerID, newUnreadCount);\n $rootScope.$broadcast('dialog_unread', { peerID: peerID, count: newUnreadCount });\n //}\n if (foundAffected) {\n $rootScope.$broadcast('messages_read');\n }\n break;\n case 'updateChannelReadMessagesContents':\n var channelID = update.channel_id;\n var newMessages = [];\n update.messages.forEach(function (msgID) {\n newMessages.push(exports.appMessagesIDsManager.getFullMessageID(msgID, channelID));\n });\n update.messages = newMessages;\n case 'updateReadMessagesContents':\n var messages = update.messages;\n var len = messages.length;\n var i;\n var messageID, message;\n var historyMessage;\n for (i = 0; i < len; i++) {\n messageID = messages[i];\n if (message = this.messagesStorage[messageID]) {\n delete message.pFlags.media_unread;\n }\n if (historyMessage = this.messagesForHistory[messageID]) {\n delete historyMessage.pFlags.media_unread;\n }\n }\n break;\n case 'updateChannelAvailableMessages':\n var channelID = update.channel_id;\n var messages = [];\n var peerID = -channelID;\n var history = (this.historiesStorage[peerID] || {}).history || [];\n if (history.length) {\n history.forEach(function (msgID) {\n if (!update.available_min_id ||\n exports.appMessagesIDsManager.getMessageLocalID(msgID) <= update.available_min_id) {\n messages.push(msgID);\n }\n });\n }\n update.messages = messages;\n case 'updateDeleteMessages':\n case 'updateDeleteChannelMessages':\n var dialogsUpdated = {};\n var historiesUpdated = {};\n var channelID = update.channel_id;\n var messageID;\n var message, i;\n var peerID, foundDialog;\n var history;\n var peerMessagesToHandle;\n var peerMessagesHandlePos;\n for (i = 0; i < update.messages.length; i++) {\n messageID = exports.appMessagesIDsManager.getFullMessageID(update.messages[i], channelID);\n message = this.messagesStorage[messageID];\n if (message) {\n peerID = this.getMessagePeer(message);\n history = historiesUpdated[peerID] || (historiesUpdated[peerID] = { count: 0, unread: 0, msgs: {} });\n if (!message.pFlags.out && message.pFlags.unread) {\n history.unread++;\n // NotificationsManager.cancel('msg' + messageID); // warning\n }\n history.count++;\n history.msgs[messageID] = true;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].deleted = true;\n delete this.messagesForHistory[messageID];\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].deleted = true;\n delete this.messagesForDialogs[messageID];\n }\n message.deleted = true;\n this.messagesStorage[messageID] = {\n deleted: true,\n id: messageID,\n from_id: message.from_id,\n to_id: message.to_id,\n flags: message.flags,\n pFlags: message.pFlags,\n date: message.date\n };\n peerMessagesToHandle = this.newMessagesToHandle[peerID];\n if (peerMessagesToHandle && peerMessagesToHandle.length) {\n peerMessagesHandlePos = peerMessagesToHandle.indexOf(messageID);\n if (peerMessagesHandlePos != -1) {\n peerMessagesToHandle.splice(peerMessagesHandlePos);\n }\n }\n }\n }\n Object.keys(historiesUpdated).forEach(function (peerID) {\n var updatedData = historiesUpdated[peerID];\n var historyStorage = _this.historiesStorage[peerID];\n if (historyStorage !== undefined) {\n var newHistory = [];\n var newPending = [];\n for (var i = 0; i < historyStorage.history.length; i++) {\n if (!updatedData.msgs[historyStorage.history[i]]) {\n newHistory.push(historyStorage.history[i]);\n }\n }\n historyStorage.history = newHistory;\n if (updatedData.count &&\n historyStorage.count !== null &&\n historyStorage.count > 0) {\n historyStorage.count -= updatedData.count;\n if (historyStorage.count < 0) {\n historyStorage.count = 0;\n }\n }\n for (var i = 0; i < historyStorage.pending.length; i++) {\n if (!updatedData.msgs[historyStorage.pending[i]]) {\n newPending.push(historyStorage.pending[i]);\n }\n }\n historyStorage.pending = newPending;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: updatedData.msgs });\n }\n var foundDialog = _this.getDialogByPeerID(+peerID)[0];\n if (foundDialog) {\n if (updatedData.unread) {\n foundDialog.unread_count -= updatedData.unread;\n $rootScope.$broadcast('dialog_unread', {\n peerID: peerID,\n count: foundDialog.unread_count\n });\n }\n if (updatedData.msgs[foundDialog.top_message]) {\n _this.reloadConversation(+peerID);\n }\n }\n });\n break;\n case 'updateChannel':\n var channelID = update.channel_id;\n var peerID = -channelID;\n var channel = exports.appChatsManager.getChat(channelID);\n var needDialog = channel._ == 'channel' && (!channel.pFlags.left && !channel.pFlags.kicked);\n var foundDialog = this.getDialogByPeerID(peerID);\n var hasDialog = foundDialog.length > 0;\n var canViewHistory = channel._ == 'channel' && (channel.username || !channel.pFlags.left && !channel.pFlags.kicked) && true || false;\n var hasHistory = this.historiesStorage[peerID] !== undefined;\n if (canViewHistory != hasHistory) {\n delete this.historiesStorage[peerID];\n $rootScope.$broadcast('history_forbidden', peerID);\n }\n if (hasDialog != needDialog) {\n if (needDialog) {\n this.reloadConversation(-channelID);\n }\n else {\n if (foundDialog[0]) {\n this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: peerID });\n }\n }\n }\n break;\n case 'updateChannelReload':\n var channelID = update.channel_id;\n var peerID = -channelID;\n var foundDialog = this.getDialogByPeerID(peerID);\n if (foundDialog[0]) {\n this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n }\n delete this.historiesStorage[peerID];\n this.reloadConversation(-channelID).then(function () {\n $rootScope.$broadcast('history_reload', peerID);\n });\n break;\n case 'updateChannelMessageViews':\n var views = update.views;\n var mid = exports.appMessagesIDsManager.getFullMessageID(update.id, update.channel_id);\n var message = this.getMessage(mid);\n if (message && message.views && message.views < views) {\n message.views = views;\n $rootScope.$broadcast('message_views', {\n mid: mid,\n views: views\n });\n }\n break;\n case 'updateServiceNotification':\n // update.inbox_date = tsNow(true)\n // update.pFlags = {popup: true}\n var fromID = 777000;\n var peerID = fromID;\n var messageID = this.tempID--;\n var message = {\n _: 'message',\n id: messageID,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: 0,\n pFlags: { unread: true },\n date: (update.inbox_date || utils_1.tsNow(true)) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if (!exports.appUsersManager.hasUser(fromID)) {\n exports.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromID,\n pFlags: { verified: true },\n access_hash: 0,\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message]);\n if (update.inbox_date) {\n this.pendingTopMsgs[peerID] = messageID;\n this.handleUpdate({\n _: 'updateNewMessage',\n message: message\n });\n }\n if (update.pFlags.popup && update.message) {\n var historyMessage = this.wrapForHistory(messageID);\n //ErrorService.show({error: {code: 400, type: 'UPDATE_SERVICE_NOTIFICATION'}, historyMessage: historyMessage}); // warning\n }\n break;\n }\n };\n AppMessagesManager.prototype.wrapForHistory = function (msgID) {\n if (this.messagesForHistory[msgID] !== undefined) {\n return this.messagesForHistory[msgID];\n }\n var message = utils_1.copy(this.messagesStorage[msgID]) || { id: msgID };\n if (message.media && message.media.progress !== undefined) {\n message.media.progress = this.messagesStorage[msgID].media.progress;\n }\n var fromUser = message.from_id && exports.appUsersManager.getUser(message.from_id);\n var fromBot = fromUser && fromUser.pFlags.bot && fromUser.username || false;\n var withBot = (fromBot ||\n message.to_id && (message.to_id.chat_id ||\n message.to_id.user_id && exports.appUsersManager.isBot(message.to_id.user_id)));\n if (message.media) {\n if (message.media.caption &&\n message.media.caption.length) {\n message.media.rCaption = richtextprocessor_1.RichTextProcessor.wrapRichText(message.media.caption, {\n noCommands: !withBot,\n fromBot: fromBot\n });\n }\n switch (message.media._) {\n case 'messageMediaPhoto':\n message.media.photo = exports.appPhotosManager.wrapForHistory(message.media.photo.id);\n break;\n /* case 'messageMediaDocument':\n message.media.document = AppDocsManager.wrapForHistory(message.media.document.id)\n break */\n case 'messageMediaGeo':\n var mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long'];\n message.media.mapUrl = mapUrl; //$sce.trustAsResourceUrl(mapUrl) // warning\n break;\n case 'messageMediaVenue':\n var mapUrl;\n if (message.media.provider == 'foursquare' &&\n message.media.venue_id) {\n mapUrl = 'https://foursquare.com/v/' + encodeURIComponent(message.media.venue_id);\n }\n else {\n mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long'];\n }\n message.media.mapUrl = mapUrl; //$sce.trustAsResourceUrl(mapUrl) // warning\n break;\n case 'messageMediaContact':\n message.media.rFullName = richtextprocessor_1.RichTextProcessor.wrapRichText(message.media.first_name + ' ' + (message.media.last_name || ''), { noLinks: true, noLinebreaks: true });\n break;\n /* case 'messageMediaWebPage':\n if (!message.media.webpage ||\n message.media.webpage._ == 'webPageEmpty') {\n delete message.media\n break\n }\n message.media.webpage = AppWebPagesManager.wrapForHistory(message.media.webpage.id)\n break\n \n case 'messageMediaGame':\n message.media.game = AppGamesManager.wrapForHistory(message.media.game.id)\n break */\n }\n }\n else if (message.action) {\n switch (message.action._) {\n case 'messageActionChatEditPhoto':\n case 'messageActionChannelEditPhoto':\n message.action.photo = exports.appPhotosManager.wrapForHistory(message.action.photo.id);\n break;\n case 'messageActionChatCreate':\n case 'messageActionChatEditTitle':\n case 'messageActionChannelCreate':\n case 'messageActionChannelEditTitle':\n message.action.rTitle = richtextprocessor_1.RichTextProcessor.wrapRichText(message.action.title, { noLinebreaks: true }) || 'chat_title_deleted';\n break;\n case 'messageActionBotIntro':\n message.action.rDescription = richtextprocessor_1.RichTextProcessor.wrapRichText(message.action.description, {\n noCommands: !withBot,\n fromBot: fromBot\n });\n break;\n }\n }\n return this.messagesForHistory[msgID] = message;\n };\n AppMessagesManager.prototype.finalizePendingMessage = function (randomID, finalMessage) {\n var pendingData = this.pendingByRandomID[randomID];\n // console.log('pdata', randomID, pendingData)\n if (pendingData) {\n var peerID = pendingData[0];\n var tempID = pendingData[1];\n var historyStorage = this.historiesStorage[peerID], message, historyMessage;\n // console.log('pending', randomID, historyStorage.pending)\n var pos = historyStorage.pending.indexOf(tempID);\n if (pos != -1) {\n historyStorage.pending.splice(pos, 1);\n }\n if (message = this.messagesStorage[tempID]) {\n delete message.pending;\n delete message.error;\n delete message.random_id;\n delete message.send;\n }\n if (historyMessage = this.messagesForHistory[tempID]) {\n this.messagesForHistory[finalMessage.mid] = Object.assign(historyMessage, this.wrapForHistory(finalMessage.mid));\n delete historyMessage.pending;\n delete historyMessage.error;\n delete historyMessage.random_id;\n delete historyMessage.send;\n $rootScope.$broadcast('messages_pending');\n }\n delete this.messagesForHistory[tempID];\n delete this.messagesStorage[tempID];\n this.finalizePendingMessageCallbacks(tempID, finalMessage.mid);\n return message;\n }\n return false;\n };\n AppMessagesManager.prototype.finalizePendingMessageCallbacks = function (tempID, mid) {\n var callbacks = this.tempFinalizeCallbacks[tempID];\n console.warn(utils_1.dT(), callbacks, tempID);\n if (callbacks !== undefined) {\n callbacks.forEach(function (callback) {\n callback(mid);\n });\n delete this.tempFinalizeCallbacks[tempID];\n }\n };\n AppMessagesManager.prototype.incrementMaxSeenID = function (maxID) {\n if (!maxID || !(!this.maxSeenID || maxID > this.maxSeenID)) {\n return false;\n }\n storage_1.default.set({\n max_seen_msg: maxID\n });\n mtproto_1.MTProto.apiManager.invokeApi('messages.receivedMessages', {\n max_id: maxID\n });\n };\n AppMessagesManager.prototype.getHistory = function (peerID, maxID, limit, backLimit, prerendered) {\n var _this = this;\n if (this.migratedFromTo[peerID]) {\n peerID = this.migratedFromTo[peerID];\n }\n var historyStorage = this.historiesStorage[peerID];\n var offset = 0;\n var offsetNotFound = false;\n var unreadOffset = 0;\n var unreadSkip = false;\n prerendered = prerendered ? Math.min(50, prerendered) : 0;\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = { count: null, history: [], pending: [] };\n }\n if (maxID < 0) {\n maxID = 0;\n }\n var isMigrated = false;\n var reqPeerID = peerID;\n if (this.migratedToFrom[peerID]) {\n isMigrated = true;\n if (maxID && maxID < exports.appMessagesIDsManager.fullMsgIDModulus) {\n reqPeerID = this.migratedToFrom[peerID];\n }\n }\n if (!limit && !maxID) {\n var foundDialog = this.getDialogByPeerID(peerID)[0];\n if (foundDialog && foundDialog.unread_count > 1) {\n var unreadCount = foundDialog.unread_count;\n if (unreadSkip = (unreadCount > 50)) {\n if (foundDialog.read_inbox_max_id) {\n maxID = foundDialog.read_inbox_max_id;\n backLimit = 16;\n unreadOffset = 16;\n limit = 4;\n }\n else {\n limit = 20;\n unreadOffset = 16;\n offset = unreadCount - unreadOffset;\n }\n }\n else {\n limit = Math.max(10, prerendered, unreadCount + 2);\n unreadOffset = unreadCount;\n }\n }\n else if ('Mobile' in Config) {\n limit = 20;\n }\n }\n if (maxID > 0) {\n offsetNotFound = true;\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n offsetNotFound = false;\n break;\n }\n }\n }\n if (!offsetNotFound && (historyStorage.count !== null && historyStorage.history.length == historyStorage.count ||\n historyStorage.history.length >= offset + (limit || 1))) {\n if (backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n }\n else {\n limit = limit || (offset ? 20 : (prerendered || 5));\n }\n var history = historyStorage.history.slice(offset, offset + limit);\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n }\n if (!backLimit && !limit) {\n limit = prerendered || 20;\n }\n if (offsetNotFound) {\n offset = 0;\n }\n if (backLimit || unreadSkip || maxID && historyStorage.history.indexOf(maxID) == -1) {\n if (backLimit) {\n offset = -backLimit;\n limit += backLimit;\n }\n return this.requestHistory(reqPeerID, maxID, limit, offset).then(function (historyResult) {\n historyStorage.count = historyResult.count || historyResult.messages.length;\n if (isMigrated) {\n historyStorage.count++;\n }\n var history = [];\n historyResult.messages.forEach(function (message) {\n history.push(message.mid);\n });\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return _this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n });\n }\n return this.fillHistoryStorage(peerID, maxID, limit, historyStorage).then(function () {\n offset = 0;\n if (maxID > 0) {\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n break;\n }\n }\n }\n var history = historyStorage.history.slice(offset, offset + limit);\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return _this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n });\n };\n AppMessagesManager.prototype.fillHistoryStorage = function (peerID, maxID, fullLimit, historyStorage) {\n var _this = this;\n // console.log('fill history storage', peerID, maxID, fullLimit, angular.copy(historyStorage))\n var offset = (this.migratedFromTo[peerID] && !maxID) ? 1 : 0;\n return this.requestHistory(peerID, maxID, fullLimit, offset).then(function (historyResult) {\n historyStorage.count = historyResult.count || historyResult.messages.length;\n var offset = 0;\n if (!maxID && historyResult.messages.length) {\n maxID = historyResult.messages[0].mid + 1;\n }\n if (maxID > 0) {\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n break;\n }\n }\n }\n var wasTotalCount = historyStorage.history.length;\n historyStorage.history.splice(offset, historyStorage.history.length - offset);\n historyResult.messages.forEach(function (message) {\n if (_this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n historyStorage.history.push(message.mid);\n });\n var totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n var migratedNextPeer = _this.migratedFromTo[peerID];\n var migratedPrevPeer = _this.migratedToFrom[peerID];\n var isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n if (isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n if (fullLimit > 0) {\n maxID = historyStorage.history[totalCount - 1];\n if (isMigrated) {\n if (!historyResult.messages.length) {\n if (migratedPrevPeer) {\n maxID = 0;\n peerID = migratedPrevPeer;\n }\n else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n return _this.fillHistoryStorage(peerID, maxID, fullLimit, historyStorage);\n }\n else if (totalCount < historyStorage.count) {\n return _this.fillHistoryStorage(peerID, maxID, fullLimit, historyStorage);\n }\n }\n return true;\n });\n };\n AppMessagesManager.prototype.wrapHistoryResult = function (peerID, result) {\n var unreadOffset = result.unreadOffset;\n if (unreadOffset) {\n var i;\n var message;\n for (i = result.history.length - 1; i >= 0; i--) {\n message = this.messagesStorage[result.history[i]];\n if (message && !message.pFlags.out && message.pFlags.unread) {\n result.unreadOffset = i + 1;\n break;\n }\n }\n }\n return Promise.resolve(result);\n };\n AppMessagesManager.prototype.requestHistory = function (peerID, maxID, limit, offset) {\n var _this = this;\n var isChannel = exports.appPeersManager.isChannel(peerID);\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getHistory', {\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n offset_id: maxID ? exports.appMessagesIDsManager.getMessageLocalID(maxID) : 0,\n offset_date: 0,\n add_offset: offset || 0,\n limit: limit || 0,\n max_id: 0,\n min_id: 0,\n hash: 0\n }, {\n timeout: 300,\n noErrorBox: true\n }).then(function (historyResult) {\n exports.appUsersManager.saveApiUsers(historyResult.users);\n exports.appChatsManager.saveApiChats(historyResult.chats);\n _this.saveMessages(historyResult.messages);\n if (isChannel) {\n exports.apiUpdatesManager.addChannelState(-peerID, historyResult.pts);\n }\n var length = historyResult.messages.length;\n if (length &&\n historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n historyResult.count--;\n }\n if (peerID < 0 ||\n !exports.appUsersManager.isBot(peerID) ||\n (length == limit && limit < historyResult.count)) {\n return historyResult;\n }\n return exports.appProfileManager.getProfile(peerID).then(function (userFull) {\n var description = userFull.bot_info && userFull.bot_info.description;\n if (description) {\n var messageID = _this.tempID--;\n var message = {\n _: 'messageService',\n id: messageID,\n from_id: peerID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: 0,\n pFlags: {},\n date: utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n action: {\n _: 'messageActionBotIntro',\n description: description\n }\n };\n _this.saveMessages([message]);\n historyResult.messages.push(message);\n if (historyResult.count) {\n historyResult.count++;\n }\n }\n return historyResult;\n });\n }, function (error) {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n var channel = exports.appChatsManager.getChat(-peerID);\n channel = { _: 'channelForbidden', access_hash: channel.access_hash, title: channel.title };\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: -peerID\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n return Promise.reject(error);\n });\n };\n AppMessagesManager.prototype.wrapForDialog = function (msgID, dialog) {\n var useCache = msgID && dialog !== undefined;\n var unreadCount = dialog && dialog.unread_count;\n if (useCache && this.messagesForDialogs[msgID] !== undefined) {\n delete this.messagesForDialogs[msgID].typing;\n this.messagesForDialogs[msgID].unreadCount = unreadCount;\n return this.messagesForDialogs[msgID];\n }\n var message = utils_1.copy(this.messagesStorage[msgID]);\n if (!message || !message.to_id) {\n if (dialog && dialog.peerID) {\n message = {\n _: 'message',\n to_id: exports.appPeersManager.getOutputPeer(dialog.peerID),\n deleted: true,\n date: utils_1.tsNow(true),\n pFlags: { out: true }\n };\n }\n else {\n return message;\n }\n }\n message.peerID = this.getMessagePeer(message);\n message.peerData = exports.appPeersManager.getPeer(message.peerID);\n message.peerString = exports.appPeersManager.getPeerString(message.peerID);\n message.unreadCount = unreadCount;\n message.index = dialog && dialog.index || (message.date * 0x10000);\n message.pinned = dialog && dialog.pFlags.pinned || false;\n if (message._ == 'messageService' && message.action.user_id) {\n message.action.user = exports.appUsersManager.getUser(message.action.user_id);\n }\n if (message.message && message.message.length) {\n message.richMessage = richtextprocessor_1.RichTextProcessor.wrapRichText(message.message.substr(0, 128), { noLinks: true, noLinebreaks: true });\n }\n message.dateText = message.date; //dateOrTimeFilter(message.date); // warning\n if (useCache) {\n message.draft = ''; //DraftsManager.getServerDraft(message.peerID); // warning\n this.messagesForDialogs[msgID] = message;\n }\n return message;\n };\n AppMessagesManager.prototype.fetchSingleMessages = function () {\n var _this = this;\n if (this.fetchSingleMessagesTimeout !== 0) {\n clearTimeout(this.fetchSingleMessagesTimeout);\n this.fetchSingleMessagesTimeout = 0;\n }\n if (!this.needSingleMessages.length) {\n return;\n }\n var mids = this.needSingleMessages.slice();\n this.needSingleMessages = [];\n var splitted = exports.appMessagesIDsManager.splitMessageIDsByChannels(mids);\n Object.keys(splitted.msgIDs).forEach(function (channelID) {\n var msgIDs = splitted.msgIDs[channelID];\n var promise;\n channelID = +channelID;\n if (channelID > 0) {\n promise = mtproto_1.MTProto.apiManager.invokeApi('channels.getMessages', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n id: msgIDs\n });\n }\n else {\n promise = mtproto_1.MTProto.apiManager.invokeApi('messages.getMessages', {\n id: msgIDs\n });\n }\n promise.then(function (getMessagesResult) {\n exports.appUsersManager.saveApiUsers(getMessagesResult.users);\n exports.appChatsManager.saveApiChats(getMessagesResult.chats);\n _this.saveMessages(getMessagesResult.messages);\n $rootScope.$broadcast('messages_downloaded', splitted.mids[channelID]);\n });\n });\n };\n AppMessagesManager.prototype.wrapSingleMessage = function (msgID) {\n if (this.messagesStorage[msgID]) {\n return this.wrapForDialog(msgID);\n }\n if (this.needSingleMessages.indexOf(msgID) == -1) {\n this.needSingleMessages.push(msgID);\n if (this.fetchSingleMessagesTimeout == 0) {\n this.fetchSingleMessagesTimeout = window.setTimeout(this.fetchSingleMessages.bind(this), 100);\n }\n }\n return { mid: msgID, loading: true };\n };\n return AppMessagesManager;\n}());\nvar AppDialogsManager = /** @class */ (function () {\n function AppDialogsManager() {\n var _this = this;\n this.pinnedChatList = document.getElementById('dialogs-pinned');\n this.chatList = document.getElementById('dialogs');\n this.myID = 0;\n this.doms = {};\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n var findUpTag = function (el, tag) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.tagName === tag)\n return el;\n }\n return null;\n };\n var onClick = function (e) {\n var target = e.target;\n var elem = target.tagName != 'LI' ? findUpTag(target, 'LI') : target;\n document.getElementById('chat-closed').style.display = 'none';\n var peerID = +elem.getAttribute('data-peerID');\n exports.appImManager.setPeer(peerID);\n };\n this.pinnedChatList.addEventListener('click', onClick);\n this.chatList.addEventListener('click', onClick);\n }\n AppDialogsManager.prototype.loadDialogPhoto = function (div, peerID, isDialog) {\n if (isDialog === void 0) { isDialog = false; }\n var inputPeer;\n var location;\n if (typeof (peerID) != 'string') {\n inputPeer = exports.appPeersManager.getInputPeerByID(peerID);\n location = exports.appPeersManager.getPeerPhoto(peerID);\n }\n //console.log('loadDialogPhoto location:', location, inputPeer);\n if (!location || location.empty || !location.photo_small) {\n if (div.firstChild) {\n div.firstChild.remove();\n }\n div.classList.remove('tgico-savedmessages');\n div.style.fontSize = '';\n var abbrSplitted = (typeof (peerID) != 'string' ? exports.appPeersManager.getPeerTitle(peerID) : peerID).split(' ');\n var abbr = (abbrSplitted.length == 2 ?\n abbrSplitted[0][0] + abbrSplitted[1][0] :\n abbrSplitted[0][0]).toUpperCase();\n //div.innerText = peer.initials.toUpperCase();\n div.innerText = abbr.toUpperCase();\n return Promise.resolve(true);\n }\n else if (peerID == this.myID && (isDialog || $rootScope.selectedPeerID == this.myID)) {\n if (div.firstChild) {\n div.firstChild.remove();\n }\n div.style.fontSize = '';\n div.classList.add('tgico-savedmessages');\n return Promise.resolve(true);\n }\n return mtproto_1.MTProto.apiFileManager.downloadSmallFile({\n _: 'inputPeerPhotoFileLocation',\n dc_id: location.dc_id,\n flags: 0,\n peer: inputPeer,\n volume_id: location.photo_small.volume_id,\n local_id: location.photo_small.local_id\n })\n .then(function (res) {\n var img = new Image();\n img.src = URL.createObjectURL(res);\n div.innerHTML = '';\n div.style.fontSize = '0'; // need\n div.append(img);\n return true;\n });\n };\n AppDialogsManager.prototype.sortDom = function () {\n var _this = this;\n var sorted = exports.appMessagesManager.dialogsStorage.dialogs\n .filter(function (d) { return !d.pFlags.pinned; })\n .sort(function (a, b) {\n var timeA = exports.appMessagesManager.getMessage(a.top_message).date;\n var timeB = exports.appMessagesManager.getMessage(b.top_message).date;\n return timeB - timeA;\n })\n .forEach(function (d) {\n var dom = _this.getDialogDom(d.peerID);\n if (!dom)\n return;\n _this.chatList.append(dom.listEl);\n });\n };\n AppDialogsManager.prototype.setLastMessage = function (dialog) {\n var e_1, _a;\n var lastMessage = exports.appMessagesManager.getMessage(dialog.top_message);\n if (lastMessage._ == 'messageEmpty')\n return;\n var dom = exports.appDialogsManager.getDialogDom(dialog.peerID);\n var peer = dialog.peer;\n var peerID = dialog.peerID;\n //let peerID = appMessagesManager.getMessagePeer(lastMessage);\n console.log('setting last message:', lastMessage);\n var lastMessageText = '';\n if (lastMessage.media) {\n switch (lastMessage.media._) {\n case 'messageMediaPhoto':\n lastMessageText += '<i>Photo' + (lastMessage.message ? ', ' : '') + '</i>';\n break;\n case 'messageMediaDocument':\n var document_1 = lastMessage.media.document;\n var found = false;\n try {\n for (var _b = __values(document_1.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {\n var attribute = _c.value;\n if (found)\n break;\n switch (attribute._) {\n case 'documentAttributeSticker':\n lastMessageText += attribute.alt + '<i>Sticker</i>';\n found = true;\n break;\n case 'documentAttributeFilename':\n lastMessageText += '<i>' + attribute.file_name + '</i>';\n found = true;\n break;\n /* default:\n console.warn('Got unknown document type!', lastMessage);\n break; */\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n break;\n default:\n console.warn('Got unknown lastMessage.media type!', lastMessage);\n break;\n }\n }\n dom.lastMessageSpan.innerHTML = lastMessageText +\n (lastMessage.message ? lastMessage.message.replace(/\\n/g, '') : '');\n /* if(lastMessage.from_id == auth.id) { // You: */\n if (peer._ != 'peerUser' && peerID != -lastMessage.from_id) {\n var sender = exports.appUsersManager.getUser(lastMessage.from_id);\n if (sender && sender.id) {\n var senderBold = document.createElement('b');\n senderBold.innerText = (sender.first_name || sender.last_name || sender.username) + ': ';\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n }\n else\n console.log('no sender', lastMessage, peerID);\n }\n var timeStr = '';\n var timestamp = lastMessage.date;\n var now = Date.now() / 1000;\n var time = new Date(lastMessage.date * 1000);\n if ((now - timestamp) < 86400) {\n timeStr = ('0' + time.getHours()).slice(-2) +\n ':' + ('0' + time.getMinutes()).slice(-2);\n }\n else if ((now - timestamp) < (86400 * 7)) {\n var date = new Date(timestamp * 1000);\n timeStr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()];\n }\n else {\n timeStr = ('0' + (time.getMonth() + 1)).slice(-2) +\n '.' + ('0' + time.getDate()).slice(-2);\n }\n dom.lastTimeSpan.innerHTML = timeStr;\n this.setUnreadMessages(dialog);\n };\n AppDialogsManager.prototype.setUnreadMessages = function (dialog) {\n var dom = this.getDialogDom(dialog.peerID);\n dom.statusSpan.innerHTML = '';\n var lastMessage = exports.appMessagesManager.getMessage(dialog.top_message);\n if (lastMessage._ != 'messageEmpty' &&\n lastMessage.from_id == this.myID && lastMessage.peerID != this.myID) {\n var outgoing = (lastMessage.pFlags && lastMessage.pFlags.unread) && dialog.read_outbox_max_id != 0;\n console.log('outgoing', outgoing, lastMessage);\n if (outgoing) {\n dom.statusSpan.classList.remove('tgico-check-read');\n dom.statusSpan.classList.add('tgico-check-sent');\n }\n else {\n dom.statusSpan.classList.remove('tgico-check-sent');\n dom.statusSpan.classList.add('tgico-check-read');\n }\n }\n else\n dom.statusSpan.classList.remove('tgico-check-sent', 'tgico-check-read');\n dom.unreadMessagesSpan.innerHTML = '';\n if (dialog.unread_count) {\n dom.unreadMessagesSpan.innerHTML = dialog.unread_count;\n dom.unreadMessagesSpan.classList.remove('tgico-pinnedchat');\n dom.unreadMessagesSpan.classList.add(new Date(dialog.notify_settings.mute_until * 1000) > new Date() ?\n 'unread-muted' : 'unread');\n }\n else if (dialog.pFlags.pinned) {\n dom.unreadMessagesSpan.classList.remove('unread', 'unread-muted');\n dom.unreadMessagesSpan.classList.add('tgico-pinnedchat');\n }\n };\n AppDialogsManager.prototype.getDialogDom = function (peerID) {\n return this.doms[peerID];\n };\n AppDialogsManager.prototype.addDialog = function (dialog) {\n var peerID = dialog.peerID;\n if (peerID in this.doms)\n return;\n var peer = dialog.peer;\n var title = exports.appPeersManager.getPeerTitle(peerID);\n var avatarDiv = document.createElement('div');\n avatarDiv.classList.add('user-avatar');\n switch (peer._) {\n case 'peerUser':\n var user = exports.appUsersManager.getUser(peerID);\n //console.log('found user', user);\n if (user.status && user.status._ == 'userStatusOnline') {\n avatarDiv.classList.add('is-online');\n }\n break;\n default:\n break;\n }\n var captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n var titleSpan = document.createElement('span');\n titleSpan.classList.add('user-title');\n if (peerID == this.myID) {\n title = 'Saved Messages';\n }\n //console.log('trying to load photo for:', title);\n this.loadDialogPhoto(avatarDiv, dialog.peerID, true);\n titleSpan.innerText = title;\n //p.classList.add('')\n var span = document.createElement('span');\n span.classList.add('user-last-message');\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n var li = document.createElement('li');\n li.classList.add('rp');\n li.append(avatarDiv);\n li.append(captionDiv);\n li.setAttribute('data-peerID', '' + peerID);\n utils_1.ripple(li);\n /* let detailsDiv = document.createElement('div');\n detailsDiv.classList.add('dialog-details'); */\n var statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status');\n var lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n var unreadMessagesSpan = document.createElement('span');\n var titleP = document.createElement('p');\n var rightSpan = document.createElement('span');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpan, rightSpan);\n var messageP = document.createElement('p');\n messageP.append(span, unreadMessagesSpan);\n captionDiv.append(titleP, messageP);\n (dialog.pFlags.pinned ? this.pinnedChatList : this.chatList).append(li);\n var dom = {\n avatarDiv: avatarDiv,\n captionDiv: captionDiv,\n titleSpan: titleSpan,\n statusSpan: statusSpan,\n lastTimeSpan: lastTimeSpan,\n unreadMessagesSpan: unreadMessagesSpan,\n lastMessageSpan: span,\n listEl: li\n };\n this.doms[dialog.peerID] = dom;\n this.setLastMessage(dialog);\n };\n return AppDialogsManager;\n}());\nexports.appPhotosManager = new AppPhotosManager();\nexports.appDialogsManager = new AppDialogsManager();\nexports.appMessagesManager = new AppMessagesManager();\nexports.appProfileManager = new AppProfileManager();\nvar AppImManager = /** @class */ (function () {\n function AppImManager() {\n var _this = this;\n this.avatarEl = document.getElementById('im-avatar');\n this.titleEl = document.getElementById('im-title');\n this.subtitleEl = document.getElementById('im-subtitle');\n this.chatInner = document.getElementById('bubbles-inner');\n this.scroll = false;\n this.scrollTimeout = 0;\n this.myID = 0;\n this.peerID = 0;\n this.bubbles = {};\n this.unreaded = [];\n this.unreadOut = [];\n /* public animations: AnimationItem[] = []; */\n this.animations = {};\n this.offline = false;\n this.updateStatusInterval = 0;\n this.lastYScroll = 0;\n this.loadMediaQueue = [];\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n $rootScope.$on('history_append', function (e) {\n var details = e.detail;\n _this.renderMessagesByIDs([details.messageID]);\n });\n $rootScope.$on('history_multiappend', function (e) {\n var msgIDsByPeer = e.detail;\n if (!(_this.peerID in msgIDsByPeer))\n return;\n var msgIDs = msgIDsByPeer[_this.peerID];\n _this.renderMessagesByIDs(msgIDs);\n });\n window.addEventListener('blur', function () {\n for (var id in _this.animations) {\n _this.animations[id].pause();\n }\n _this.offline = true;\n _this.updateStatus();\n clearInterval(_this.updateStatusInterval);\n window.addEventListener('focus', function () {\n for (var id in _this.animations) {\n _this.animations[id].play();\n }\n _this.offline = false;\n _this.updateStatus();\n _this.updateStatusInterval = window.setInterval(function () { return _this.updateStatus(); }, 50e3);\n }, { once: true });\n });\n this.updateStatusInterval = window.setInterval(function () { return _this.updateStatus(); }, 50e3);\n this.updateStatus();\n setInterval(function () { return _this.setPeerStatus(); }, 60e3);\n this.loadMediaQueueProcess();\n }\n AppImManager.prototype.loadMediaQueueProcess = function () {\n var _this = this;\n Promise.all(this.loadMediaQueue.splice(-5, 5).map(function (f) { return f().then(function (div) {\n /* setTimeout(() => {\n console.log('will scrol by', div.scrollHeight);\n this.scroll.scroll({y: '+= ' + div.scrollHeight + 'px'});\n }, 50); */\n }); })).then(function (results) {\n if (!_this.loadMediaQueue.length)\n setTimeout(function () { return _this.loadMediaQueueProcess(); }, 100);\n else\n _this.loadMediaQueueProcess();\n }).catch(function (err) { return console.error(err); });\n };\n AppImManager.prototype.updateStatus = function () {\n if (!this.myID)\n return Promise.resolve();\n exports.appUsersManager.setUserStatus(this.myID, this.offline);\n return mtproto_1.MTProto.apiManager.invokeApi('account.updateStatus', {\n offline: this.offline\n }, { noErrorBox: true });\n };\n AppImManager.prototype.onScroll = function () {\n var length = this.unreaded.length;\n var readed = [];\n for (var i = length - 1; i >= 0; --i) {\n var msgID = this.unreaded[i];\n var bubble = this.bubbles[msgID];\n if (utils_1.isElementInViewport(bubble)) {\n readed.push(msgID);\n this.unreaded.splice(i, 1);\n }\n }\n for (var msgID in this.animations) {\n var bubble = this.bubbles[msgID];\n var animation = this.animations[msgID];\n if (!utils_1.isElementInViewport(bubble)) {\n animation.pause();\n }\n else {\n animation.play();\n }\n }\n var max = Math.max.apply(Math, __spread(readed));\n //appMessagesManager.readMessages(readed);\n exports.appMessagesManager.readHistory(this.peerID, max);\n this.lastYScroll = this.scroll.scroll().ratio.y;\n // load more history\n if (!this.getHistoryPromise) {\n var history_1 = Object.keys(this.bubbles).sort();\n /* let history = appMessagesManager.historiesStorage[this.peerID].history;\n let length = history.length; */\n for (var i = 0; i < 5; ++i) {\n /* for(let i = length - 1; i >= length - 5; --i) { */\n var msgID = history_1[i];\n if (!(msgID in this.bubbles) || !msgID)\n continue;\n var bubble = this.bubbles[+msgID];\n if (utils_1.isElementInViewport(bubble)) {\n console.log('Will load more history, maxID:', history_1[0], msgID);\n this.getHistory(+history_1[0], true).then(function () {\n });\n break;\n }\n }\n }\n };\n AppImManager.prototype.setScroll = function (scroll) {\n this.scroll = scroll;\n this.scroll.options({\n callbacks: {\n onScroll: this.onScroll.bind(this),\n }\n });\n };\n AppImManager.prototype.setPeerStatus = function () {\n var _this = this;\n if (!this.myID)\n return;\n // set subtitle\n this.subtitleEl.innerText = '';\n this.subtitleEl.classList.remove('online');\n if (this.peerID < 0) { // human\n var chat = exports.appPeersManager.getPeer(this.peerID);\n var func = (chat._ == 'channel' ?\n exports.appProfileManager.getChannelFull :\n exports.appProfileManager.getChatFull).bind(exports.appProfileManager);\n console.log(chat);\n func(chat.id).then(function (res) {\n console.log('chatInfo res:', res);\n var participants_count = res.participants_count || res.participants.participants.length;\n var subtitle = utils_1.numberWithCommas(participants_count) + ' members';\n _this.subtitleEl.innerText = subtitle;\n });\n }\n else if (!exports.appUsersManager.isBot(this.peerID)) { // chat\n var user = exports.appUsersManager.getUser(this.peerID);\n this.subtitleEl.classList.remove('online');\n if (user && user.status) {\n var subtitle = '';\n switch (user.status._) {\n case 'userStatusRecently':\n subtitle += 'last seen recently';\n break;\n case 'userStatusOffline':\n subtitle = 'last seen ';\n var date = user.status.was_online;\n var now = Date.now() / 1000;\n if ((now - date) < 60) {\n subtitle += ' just now';\n }\n else if ((now - date) < 3600) {\n subtitle += ((now - date) / 60 | 0) + ' minutes ago';\n }\n else if (now - date < 86400) {\n subtitle += ((now - date) / 3600 | 0) + ' hours ago';\n }\n else {\n var d = new Date(date * 1000);\n subtitle += ('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + ' at ' +\n ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2);\n }\n break;\n case 'userStatusOnline':\n this.subtitleEl.classList.add('online');\n subtitle = 'online';\n break;\n }\n this.subtitleEl.innerText = subtitle;\n }\n }\n };\n AppImManager.prototype.setPeer = function (peerID) {\n var _this = this;\n if (this.peerID == peerID)\n return Promise.resolve(true);\n // clear \n if (this.lastContainerDiv)\n this.lastContainerDiv.remove();\n if (this.firstContainerDiv)\n this.firstContainerDiv.remove();\n this.lastContainerDiv = undefined;\n this.firstContainerDiv = undefined;\n for (var i in this.bubbles) {\n var bubble = this.bubbles[i];\n bubble.remove();\n }\n this.bubbles = {};\n this.unreaded = [];\n this.unreadOut = [];\n this.loadMediaQueue = [];\n for (var id in this.animations) {\n this.animations[id].destroy();\n }\n this.animations = {};\n this.chatInner.innerHTML = '';\n // set new\n this.peerID = $rootScope.selectedPeerID = peerID;\n /* this.lastYScroll = 100; */\n // no dialog\n if (!exports.appMessagesManager.getDialogByPeerID(this.peerID).length) {\n console.error('No dialog by peerID:', this.peerID);\n return Promise.reject();\n }\n var d = document.createElement('div');\n d.classList.add('preloader');\n misc_1.putPreloader(d);\n this.chatInner.append(d);\n if (this.lastDialog) {\n var lastDom = exports.appDialogsManager.getDialogDom(this.lastDialog.peerID);\n lastDom.listEl.classList.remove('active');\n }\n var dialog = this.lastDialog = exports.appMessagesManager.getDialogByPeerID(this.peerID)[0];\n console.log('setPeer peerID:', this.peerID, dialog);\n exports.appDialogsManager.loadDialogPhoto(this.avatarEl, dialog.peerID);\n var dom = exports.appDialogsManager.getDialogDom(this.peerID);\n if (!dom) {\n console.warn('No rendered dialog by peerID:', this.peerID);\n exports.appDialogsManager.addDialog(dialog);\n dom = exports.appDialogsManager.getDialogDom(this.peerID);\n }\n // warning need check\n dom.listEl.classList.add('active');\n this.setPeerStatus();\n this.titleEl.innerText = dom.titleSpan.innerText;\n if (this.scroll)\n this.scroll.scroll({ y: '100%' });\n return this.getHistory().then(function () {\n console.log('setPeer removing preloader');\n if (_this.scroll)\n _this.scroll.scroll({ y: '100%' });\n d.remove();\n /* if(this.scroll) {\n let lastID = dialog.top_message;\n if(lastID in this.bubbles) {\n this.bubbles[lastID].scrollIntoView();\n }\n } */\n return true;\n });\n };\n AppImManager.prototype.updateUnreadByDialog = function (dialog) {\n var maxID = dialog.read_outbox_max_id;\n var length = this.unreadOut.length;\n for (var i = length - 1; i >= 0; --i) {\n var msgID = this.unreadOut[i];\n if (msgID <= maxID) {\n var bubble = this.bubbles[msgID];\n bubble.classList.remove('sent');\n bubble.classList.add('read');\n this.unreadOut.splice(i, 1);\n }\n }\n };\n AppImManager.prototype.deleteMessagesByIDs = function (msgIDs) {\n var _this = this;\n msgIDs.forEach(function (id) {\n if (!(id in _this.bubbles))\n return;\n var bubble = _this.bubbles[id];\n var parent = bubble.parentNode;\n delete _this.bubbles[id];\n bubble.remove();\n if (!parent.childNodes.length) {\n parent.remove();\n }\n if (id in _this.animations) {\n _this.animations[id].destroy();\n delete _this.animations[id];\n }\n });\n };\n AppImManager.prototype.renderMessagesByIDs = function (msgIDs) {\n var _this = this;\n var scrollInfo = {};\n if (this.scroll) {\n scrollInfo = this.scroll.scroll();\n }\n msgIDs.forEach(function (msgID) {\n var message = exports.appMessagesManager.getMessage(msgID);\n console.log('got new message to append:', message);\n _this.unreaded.push(msgID);\n _this.renderMessage(message);\n });\n if (this.scroll && Math.round(scrollInfo.ratio.y * 100) >= 95) {\n this.scroll.scroll({ y: '100%' });\n }\n };\n AppImManager.prototype.renderMessage = function (message, reverse) {\n var _this = this;\n if (reverse === void 0) { reverse = false; }\n var peerID = this.peerID;\n var our = message.fromID == this.myID;\n var messageDiv = document.createElement('div');\n messageDiv.classList.add('message');\n messageDiv.innerHTML = richtextprocessor_1.RichTextProcessor.wrapRichText(message.message, {\n entities: message.totalEntities\n });\n //messageDiv.innerText = message.message;\n console.log('message to render:', message);\n // time section\n var date = new Date(message.date * 1000);\n var time = ('0' + date.getHours()).slice(-2) +\n ':' + ('0' + date.getMinutes()).slice(-2);\n var timeSpan = document.createElement('span');\n timeSpan.classList.add('time');\n var timeInner = document.createElement('div');\n timeInner.classList.add('inner', 'tgico');\n timeInner.innerText = time;\n // bubble\n var bubble = document.createElement('div');\n bubble.classList.add('bubble');\n this.bubbles[message.mid] = bubble;\n timeSpan.appendChild(timeInner);\n messageDiv.append(timeSpan);\n bubble.append(messageDiv);\n if (our) {\n if (message.pFlags.unread)\n this.unreadOut.push(message.mid);\n var status_1 = message.pFlags.unread ? 'sent' : 'read';\n bubble.classList.add(status_1);\n }\n // media\n if (message.media) {\n var attachmentDiv_1 = document.createElement('div');\n attachmentDiv_1.classList.add('attachment');\n var processingWebPage = false;\n switch (message.media._) {\n case 'messageMediaPhoto': {\n var photo_1 = message.media.photo;\n var load = function () { return exports.appPhotosManager.preloadPhoto(photo_1.id).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return attachmentDiv_1;\n }\n var image = new Image();\n image.src = URL.createObjectURL(blob);\n attachmentDiv_1.append(image);\n return attachmentDiv_1;\n }); };\n this.loadMediaQueue.push(load);\n break;\n }\n case 'messageMediaWebPage': {\n processingWebPage = true;\n var webpage_1 = message.media.webpage;\n if (webpage_1._ == 'webPageEmpty') {\n break;\n }\n var box = document.createElement('div');\n box.classList.add('box', 'web');\n var quote = document.createElement('div');\n quote.classList.add('quote');\n var nameEl = document.createElement('a');\n nameEl.classList.add('name');\n var titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n var textDiv = document.createElement('div');\n textDiv.classList.add('text');\n if (webpage_1.photo) {\n var preview_1 = document.createElement('div');\n preview_1.classList.add('preview');\n exports.appPhotosManager.savePhoto(webpage_1.photo); // hot-fix because no webpage manager\n var load = function () { return exports.appPhotosManager.preloadPhoto(webpage_1.photo.id).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return preview_1;\n }\n var img = new Image();\n img.src = URL.createObjectURL(blob);\n preview_1.append(img);\n return preview_1;\n }); };\n this.loadMediaQueue.push(load);\n quote.append(preview_1);\n }\n nameEl.setAttribute('target', '_blank');\n nameEl.href = webpage_1.url;\n nameEl.innerText = webpage_1.site_name;\n textDiv.innerText = webpage_1.description;\n quote.append(nameEl, titleDiv, textDiv);\n box.append(quote);\n bubble.prepend(box);\n break;\n }\n case 'messageMediaDocument': {\n var document_2 = message.media.document;\n if (document_2.size > 1e6) { // 1mb\n break;\n }\n console.log('messageMediaDocument', document_2);\n var stickerType_1 = document_2.mime_type == \"application/x-tgsticker\" ? 2 :\n (document_2.mime_type == \"image/webp\" ? 1 : 0);\n if (stickerType_1) {\n bubble.classList.add('sticker');\n var load = function () { return mtproto_1.MTProto.apiFileManager.downloadSmallFile({\n _: 'inputDocumentFileLocation',\n access_hash: document_2.access_hash,\n file_reference: document_2.file_reference,\n thumb_size: '' /* document.thumbs[0].type */,\n id: document_2.id,\n stickerType: stickerType_1\n }, { mimeType: document_2.mime_type, dcID: document_2.dc_id }).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed, canceling sticker attach');\n return attachmentDiv_1;\n }\n console.log('loaded sticker:', blob);\n if (stickerType_1 == 2) {\n var reader = new FileReader();\n reader.addEventListener('loadend', function (e) {\n // @ts-ignore\n var text = e.srcElement.result;\n var json = bin_utils_1.gzipUncompress(text, true);\n var animation = lottie_web_1.default.loadAnimation({\n container: attachmentDiv_1,\n renderer: 'svg',\n loop: true,\n autoplay: true,\n animationData: JSON.parse(json)\n });\n _this.animations[message.mid] = animation;\n });\n reader.readAsArrayBuffer(blob);\n }\n else if (stickerType_1 == 1) {\n var img = new Image();\n img.src = URL.createObjectURL(blob);\n attachmentDiv_1.append(img);\n }\n return attachmentDiv_1;\n }); };\n this.loadMediaQueue.push(load);\n }\n break;\n }\n default:\n console.warn('unrecognized media type:', message.media._);\n break;\n }\n if (!message.message) {\n messageDiv.classList.add('message-empty');\n }\n if (!processingWebPage) {\n bubble.append(attachmentDiv_1);\n }\n }\n if (message.fwd_from) {\n var fwd = message.fwd_from;\n //let peerFrom = appPeersManager.getPeerTitle()\n var fromTitle = exports.appPeersManager.getPeerTitle(fwd.from_id);\n }\n if ((this.peerID < 0 && !our) || message.fwd_from) { // chat\n var title_1 = exports.appPeersManager.getPeerTitle(message.fwdFromID || message.fromID);\n //console.log(title);\n if (message.fwdFromID) {\n bubble.classList.add('forwarded');\n if (!bubble.classList.contains('sticker')) {\n var nameDiv = document.createElement('div');\n nameDiv.classList.add('name');\n nameDiv.innerText = 'Forwarded from ' + title_1;\n bubble.append(nameDiv);\n }\n }\n else {\n var avatarDiv_1 = document.createElement('div');\n avatarDiv_1.classList.add('user-avatar');\n console.log('exec loadDialogPhoto', message);\n if (message.fromID) { // if no - user hidden\n var load = function () { return exports.appDialogsManager.loadDialogPhoto(avatarDiv_1, message.fromID).then(function () { return avatarDiv_1; }); };\n this.loadMediaQueue.push(load);\n }\n else if (!title_1 && message.fwd_from && message.fwd_from.from_name) {\n title_1 = message.fwd_from.from_name;\n var load = function () { return exports.appDialogsManager.loadDialogPhoto(avatarDiv_1, title_1).then(function () { return avatarDiv_1; }); };\n this.loadMediaQueue.push(load);\n }\n if (message.reply_to_mid) {\n var box = document.createElement('div');\n box.classList.add('box');\n var quote = document.createElement('div');\n quote.classList.add('quote');\n var nameEl = document.createElement('a');\n nameEl.classList.add('name');\n var textDiv = document.createElement('div');\n textDiv.classList.add('text');\n var originalMessage = exports.appMessagesManager.getMessage(message.reply_to_mid);\n var originalPeerTitle = exports.appPeersManager.getPeerTitle(originalMessage.fromID) || '';\n nameEl.innerText = originalPeerTitle;\n textDiv.innerHTML = richtextprocessor_1.RichTextProcessor.wrapRichText(originalMessage.message, {\n entities: originalMessage.totalEntities\n });\n quote.append(nameEl, textDiv);\n box.append(quote);\n bubble.append(box);\n }\n if (!message.media || message.media._ == 'messageMediaWebPage') {\n var nameDiv = document.createElement('div');\n nameDiv.classList.add('name');\n nameDiv.innerText = title_1;\n bubble.append(nameDiv);\n }\n bubble.prepend(avatarDiv_1);\n }\n }\n var type = our ? 'out' : 'in';\n var containerDiv = reverse ? this.firstContainerDiv : this.lastContainerDiv;\n if (!containerDiv || !containerDiv.classList.contains(type)) {\n /* if(containerDiv) {\n if(reverse) this.chatInner.prepend(containerDiv);\n else this.chatInner.append(containerDiv);\n } */\n containerDiv = document.createElement('div');\n containerDiv.classList.add(type);\n if (!this.firstContainerDiv)\n this.firstContainerDiv = containerDiv;\n if (reverse)\n this.firstContainerDiv = containerDiv;\n else\n this.lastContainerDiv = containerDiv;\n }\n if (reverse) {\n containerDiv.prepend(bubble);\n this.chatInner.prepend(containerDiv);\n }\n else {\n containerDiv.append(bubble);\n this.chatInner.append(containerDiv);\n }\n /* if(this.scroll) {\n clearTimeout(this.scrollTimeout);\n setTimeout(() => {\n console.log(this.chatInner.scrollHeight, this.scroll);\n this.scroll.scroll({y: '100%'});\n }, 1);\n } */\n //console.log('history msg', message);\n };\n AppImManager.prototype.getHistory = function (maxID, reverse) {\n var _this = this;\n if (maxID === void 0) { maxID = 0; }\n if (reverse === void 0) { reverse = false; }\n var peerID = this.peerID;\n /* let dialog = appMessagesManager.getDialogByPeerID(peerID)[0];\n if(dialog && dialog.top_message) {\n maxID = dialog.top_message;\n } */\n return this.getHistoryPromise = exports.appMessagesManager.getHistory(this.peerID, maxID, 20)\n .then(function (result) {\n console.log('getHistory result:', result);\n if (!result || !result.history)\n return true;\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return Promise.reject();\n }\n //this.chatInner.innerHTML = '';\n var history = result.history.slice();\n if (reverse)\n history.reverse();\n var length = history.length;\n for (var i = length - 1; i >= 0; --i) {\n var msgID = history[i];\n var message = exports.appMessagesManager.getMessage(msgID);\n _this.renderMessage(message, reverse);\n }\n _this.getHistoryPromise = undefined;\n return true;\n });\n };\n return AppImManager;\n}());\nexports.appImManager = new AppImManager();\n// @ts-ignore\nwindow.Services = {\n appUsersManager: exports.appUsersManager,\n appChatsManager: exports.appChatsManager,\n apiUpdatesManager: exports.apiUpdatesManager,\n appMessagesManager: exports.appMessagesManager,\n appPeersManager: exports.appPeersManager,\n appProfileManager: exports.appProfileManager,\n appPhotosManager: exports.appPhotosManager,\n appDialogsManager: exports.appDialogsManager,\n appImManager: exports.appImManager\n};\n"
},
{
"id": 13,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/jsbn/index.js",
"name": "./node_modules/jsbn/index.js",
"index": 23,
"index2": 19,
"size": 42308,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "56:13-28"
},
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "129:13-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(function(){\n\n // Copyright (c) 2005 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Basic JavaScript BN library - subset useful for RSA encryption.\n\n // Bits per digit\n var dbits;\n\n // JavaScript engine analysis\n var canary = 0xdeadbeefcafe;\n var j_lm = ((canary&0xffffff)==0xefcafe);\n\n // (public) Constructor\n function BigInteger(a,b,c) {\n if(a != null)\n if(\"number\" == typeof a) this.fromNumber(a,b,c);\n else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n else this.fromString(a,b);\n }\n\n // return new, unset BigInteger\n function nbi() { return new BigInteger(null); }\n\n // am: Compute w_j += (x*this_i), propagate carries,\n // c is initial carry, returns final carry.\n // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n // We need to select the fastest one that works in this environment.\n\n // am1: use a single mult and divide to get the high bits,\n // max digit bits should be 26 because\n // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n function am1(i,x,w,j,c,n) {\n while(--n >= 0) {\n var v = x*this[i++]+w[j]+c;\n c = Math.floor(v/0x4000000);\n w[j++] = v&0x3ffffff;\n }\n return c;\n }\n // am2 avoids a big mult-and-extract completely.\n // Max digit bits should be <= 30 because we do bitwise ops\n // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n function am2(i,x,w,j,c,n) {\n var xl = x&0x7fff, xh = x>>15;\n while(--n >= 0) {\n var l = this[i]&0x7fff;\n var h = this[i++]>>15;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n w[j++] = l&0x3fffffff;\n }\n return c;\n }\n // Alternately, set max digit bits to 28 since some\n // browsers slow down when dealing with 32-bit numbers.\n function am3(i,x,w,j,c,n) {\n var xl = x&0x3fff, xh = x>>14;\n while(--n >= 0) {\n var l = this[i]&0x3fff;\n var h = this[i++]>>14;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n c = (l>>28)+(m>>14)+xh*h;\n w[j++] = l&0xfffffff;\n }\n return c;\n }\n var inBrowser = typeof navigator !== \"undefined\";\n if(inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n BigInteger.prototype.am = am2;\n dbits = 30;\n }\n else if(inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n BigInteger.prototype.am = am1;\n dbits = 26;\n }\n else { // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n }\n\n BigInteger.prototype.DB = dbits;\n BigInteger.prototype.DM = ((1<<dbits)-1);\n BigInteger.prototype.DV = (1<<dbits);\n\n var BI_FP = 52;\n BigInteger.prototype.FV = Math.pow(2,BI_FP);\n BigInteger.prototype.F1 = BI_FP-dbits;\n BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n // Digit conversions\n var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n var BI_RC = new Array();\n var rr,vv;\n rr = \"0\".charCodeAt(0);\n for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n rr = \"a\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n rr = \"A\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n function int2char(n) { return BI_RM.charAt(n); }\n function intAt(s,i) {\n var c = BI_RC[s.charCodeAt(i)];\n return (c==null)?-1:c;\n }\n\n // (protected) copy this to r\n function bnpCopyTo(r) {\n for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n }\n\n // (protected) set from integer value x, -DV <= x < DV\n function bnpFromInt(x) {\n this.t = 1;\n this.s = (x<0)?-1:0;\n if(x > 0) this[0] = x;\n else if(x < -1) this[0] = x+this.DV;\n else this.t = 0;\n }\n\n // return bigint initialized to value\n function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n // (protected) set from string and radix\n function bnpFromString(s,b) {\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 256) k = 8; // byte array\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else { this.fromRadix(s,b); return; }\n this.t = 0;\n this.s = 0;\n var i = s.length, mi = false, sh = 0;\n while(--i >= 0) {\n var x = (k==8)?s[i]&0xff:intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if(sh == 0)\n this[this.t++] = x;\n else if(sh+k > this.DB) {\n this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n this[this.t++] = (x>>(this.DB-sh));\n }\n else\n this[this.t-1] |= x<<sh;\n sh += k;\n if(sh >= this.DB) sh -= this.DB;\n }\n if(k == 8 && (s[0]&0x80) != 0) {\n this.s = -1;\n if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n }\n this.clamp();\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) clamp off excess high words\n function bnpClamp() {\n var c = this.s&this.DM;\n while(this.t > 0 && this[this.t-1] == c) --this.t;\n }\n\n // (public) return string representation in given radix\n function bnToString(b) {\n if(this.s < 0) return \"-\"+this.negate().toString(b);\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n var p = this.DB-(i*this.DB)%k;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n while(i >= 0) {\n if(p < k) {\n d = (this[i]&((1<<p)-1))<<(k-p);\n d |= this[--i]>>(p+=this.DB-k);\n }\n else {\n d = (this[i]>>(p-=k))&km;\n if(p <= 0) { p += this.DB; --i; }\n }\n if(d > 0) m = true;\n if(m) r += int2char(d);\n }\n }\n return m?r:\"0\";\n }\n\n // (public) -this\n function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n // (public) |this|\n function bnAbs() { return (this.s<0)?this.negate():this; }\n\n // (public) return + if this > a, - if this < a, 0 if equal\n function bnCompareTo(a) {\n var r = this.s-a.s;\n if(r != 0) return r;\n var i = this.t;\n r = i-a.t;\n if(r != 0) return (this.s<0)?-r:r;\n while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n return 0;\n }\n\n // returns bit length of the integer x\n function nbits(x) {\n var r = 1, t;\n if((t=x>>>16) != 0) { x = t; r += 16; }\n if((t=x>>8) != 0) { x = t; r += 8; }\n if((t=x>>4) != 0) { x = t; r += 4; }\n if((t=x>>2) != 0) { x = t; r += 2; }\n if((t=x>>1) != 0) { x = t; r += 1; }\n return r;\n }\n\n // (public) return the number of bits in \"this\"\n function bnBitLength() {\n if(this.t <= 0) return 0;\n return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n }\n\n // (protected) r = this << n*DB\n function bnpDLShiftTo(n,r) {\n var i;\n for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n for(i = n-1; i >= 0; --i) r[i] = 0;\n r.t = this.t+n;\n r.s = this.s;\n }\n\n // (protected) r = this >> n*DB\n function bnpDRShiftTo(n,r) {\n for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n r.t = Math.max(this.t-n,0);\n r.s = this.s;\n }\n\n // (protected) r = this << n\n function bnpLShiftTo(n,r) {\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<cbs)-1;\n var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n for(i = this.t-1; i >= 0; --i) {\n r[i+ds+1] = (this[i]>>cbs)|c;\n c = (this[i]&bm)<<bs;\n }\n for(i = ds-1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t+ds+1;\n r.s = this.s;\n r.clamp();\n }\n\n // (protected) r = this >> n\n function bnpRShiftTo(n,r) {\n r.s = this.s;\n var ds = Math.floor(n/this.DB);\n if(ds >= this.t) { r.t = 0; return; }\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<bs)-1;\n r[0] = this[ds]>>bs;\n for(var i = ds+1; i < this.t; ++i) {\n r[i-ds-1] |= (this[i]&bm)<<cbs;\n r[i-ds] = this[i]>>bs;\n }\n if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n r.t = this.t-ds;\n r.clamp();\n }\n\n // (protected) r = this - a\n function bnpSubTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]-a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c -= a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c -= a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c<0)?-1:0;\n if(c < -1) r[i++] = this.DV+c;\n else if(c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n }\n\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyTo(a,r) {\n var x = this.abs(), y = a.abs();\n var i = x.t;\n r.t = i+y.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n r.s = 0;\n r.clamp();\n if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n }\n\n // (protected) r = this^2, r != this (HAC 14.16)\n function bnpSquareTo(r) {\n var x = this.abs();\n var i = r.t = 2*x.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < x.t-1; ++i) {\n var c = x.am(i,x[i],r,2*i,0,1);\n if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n r[i+x.t] -= x.DV;\n r[i+x.t+1] = 1;\n }\n }\n if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n r.s = 0;\n r.clamp();\n }\n\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n function bnpDivRemTo(m,q,r) {\n var pm = m.abs();\n if(pm.t <= 0) return;\n var pt = this.abs();\n if(pt.t < pm.t) {\n if(q != null) q.fromInt(0);\n if(r != null) this.copyTo(r);\n return;\n }\n if(r == null) r = nbi();\n var y = nbi(), ts = this.s, ms = m.s;\n var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus\n if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n else { pm.copyTo(y); pt.copyTo(r); }\n var ys = y.t;\n var y0 = y[ys-1];\n if(y0 == 0) return;\n var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n y.dlShiftTo(j,t);\n if(r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t,r);\n }\n BigInteger.ONE.dlShiftTo(ys,t);\n t.subTo(y,y); // \"negative\" y so we can replace sub with am later\n while(y.t < ys) y[y.t++] = 0;\n while(--j >= 0) {\n // Estimate quotient digit\n var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out\n y.dlShiftTo(j,t);\n r.subTo(t,r);\n while(r[i] < --qd) r.subTo(t,r);\n }\n }\n if(q != null) {\n r.drShiftTo(ys,q);\n if(ts != ms) BigInteger.ZERO.subTo(q,q);\n }\n r.t = ys;\n r.clamp();\n if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder\n if(ts < 0) BigInteger.ZERO.subTo(r,r);\n }\n\n // (public) this mod a\n function bnMod(a) {\n var r = nbi();\n this.abs().divRemTo(a,null,r);\n if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n return r;\n }\n\n // Modular reduction using \"classic\" algorithm\n function Classic(m) { this.m = m; }\n function cConvert(x) {\n if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n }\n function cRevert(x) { return x; }\n function cReduce(x) { x.divRemTo(this.m,null,x); }\n function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n Classic.prototype.convert = cConvert;\n Classic.prototype.revert = cRevert;\n Classic.prototype.reduce = cReduce;\n Classic.prototype.mulTo = cMulTo;\n Classic.prototype.sqrTo = cSqrTo;\n\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n // justification:\n // xy == 1 (mod m)\n // xy = 1+km\n // xy(2-xy) = (1+km)(1-km)\n // x[y(2-xy)] = 1-k^2m^2\n // x[y(2-xy)] == 1 (mod m^2)\n // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n function bnpInvDigit() {\n if(this.t < 1) return 0;\n var x = this[0];\n if((x&1) == 0) return 0;\n var y = x&3; // y == 1/x mod 2^2\n y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4\n y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8\n y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y>0)?this.DV-y:-y;\n }\n\n // Montgomery reduction\n function Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp&0x7fff;\n this.mph = this.mp>>15;\n this.um = (1<<(m.DB-15))-1;\n this.mt2 = 2*m.t;\n }\n\n // xR mod m\n function montConvert(x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t,r);\n r.divRemTo(this.m,null,r);\n if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n return r;\n }\n\n // x/R mod m\n function montRevert(x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n\n // x = x/R mod m (HAC 14.32)\n function montReduce(x) {\n while(x.t <= this.mt2) // pad x so am has enough room later\n x[x.t++] = 0;\n for(var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i]&0x7fff;\n var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i+this.m.t;\n x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n // propagate carry\n while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n }\n x.clamp();\n x.drShiftTo(this.m.t,x);\n if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = \"x^2/R mod m\"; x != r\n function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = \"xy/R mod m\"; x,y != r\n function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Montgomery.prototype.convert = montConvert;\n Montgomery.prototype.revert = montRevert;\n Montgomery.prototype.reduce = montReduce;\n Montgomery.prototype.mulTo = montMulTo;\n Montgomery.prototype.sqrTo = montSqrTo;\n\n // (protected) true iff this is even\n function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n function bnpExp(e,z) {\n if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n g.copyTo(r);\n while(--i >= 0) {\n z.sqrTo(r,r2);\n if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n else { var t = r; r = r2; r2 = t; }\n }\n return z.revert(r);\n }\n\n // (public) this^e % m, 0 <= e < 2^32\n function bnModPowInt(e,m) {\n var z;\n if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n return this.exp(e,z);\n }\n\n // protected\n BigInteger.prototype.copyTo = bnpCopyTo;\n BigInteger.prototype.fromInt = bnpFromInt;\n BigInteger.prototype.fromString = bnpFromString;\n BigInteger.prototype.clamp = bnpClamp;\n BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n BigInteger.prototype.lShiftTo = bnpLShiftTo;\n BigInteger.prototype.rShiftTo = bnpRShiftTo;\n BigInteger.prototype.subTo = bnpSubTo;\n BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n BigInteger.prototype.squareTo = bnpSquareTo;\n BigInteger.prototype.divRemTo = bnpDivRemTo;\n BigInteger.prototype.invDigit = bnpInvDigit;\n BigInteger.prototype.isEven = bnpIsEven;\n BigInteger.prototype.exp = bnpExp;\n\n // public\n BigInteger.prototype.toString = bnToString;\n BigInteger.prototype.negate = bnNegate;\n BigInteger.prototype.abs = bnAbs;\n BigInteger.prototype.compareTo = bnCompareTo;\n BigInteger.prototype.bitLength = bnBitLength;\n BigInteger.prototype.mod = bnMod;\n BigInteger.prototype.modPowInt = bnModPowInt;\n\n // \"constants\"\n BigInteger.ZERO = nbv(0);\n BigInteger.ONE = nbv(1);\n\n // Copyright (c) 2005-2009 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Extended JavaScript BN functions, required for RSA private ops.\n\n // Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n // Version 1.2: square() API, isProbablePrime fix\n\n // (public)\n function bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n // (public) return value as integer\n function bnIntValue() {\n if(this.s < 0) {\n if(this.t == 1) return this[0]-this.DV;\n else if(this.t == 0) return -1;\n }\n else if(this.t == 1) return this[0];\n else if(this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n }\n\n // (public) return value as byte\n function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n // (public) return value as short (assumes DB>=16)\n function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n // (protected) return x s.t. r^x < DV\n function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n // (public) 0 if this == 0, 1 if this > 0\n function bnSigNum() {\n if(this.s < 0) return -1;\n else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n }\n\n // (protected) convert to radix string\n function bnpToRadix(b) {\n if(b == null) b = 10;\n if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b,cs);\n var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n this.divRemTo(d,y,z);\n while(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n }\n return z.intValue().toString(b) + r;\n }\n\n // (protected) convert from radix string\n function bnpFromRadix(s,b) {\n this.fromInt(0);\n if(b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n for(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w,0);\n j = 0;\n w = 0;\n }\n }\n if(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n }\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) alternate constructor\n function bnpFromNumber(a,b,c) {\n if(\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n this.fromNumber(a,c);\n if(!this.testBit(a-1)) // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n if(this.isEven()) this.dAddOffset(1,0); // force odd\n while(!this.isProbablePrime(b)) {\n this.dAddOffset(2,0);\n if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n }\n }\n }\n else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n }\n }\n\n // (public) convert to bigendian byte array\n function bnToByteArray() {\n var i = this.t, r = new Array();\n r[0] = this.s;\n var p = this.DB-(i*this.DB)%8, d, k = 0;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n if(p < 8) {\n d = (this[i]&((1<<p)-1))<<(8-p);\n d |= this[--i]>>(p+=this.DB-8);\n }\n else {\n d = (this[i]>>(p-=8))&0xff;\n if(p <= 0) { p += this.DB; --i; }\n }\n if((d&0x80) != 0) d |= -256;\n if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n if(k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n }\n\n function bnEquals(a) { return(this.compareTo(a)==0); }\n function bnMin(a) { return(this.compareTo(a)<0)?this:a; }\n function bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n // (protected) r = this op a (bitwise)\n function bnpBitwiseTo(a,op,r) {\n var i, f, m = Math.min(a.t,this.t);\n for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n if(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n r.t = this.t;\n }\n else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n r.t = a.t;\n }\n r.s = op(this.s,a.s);\n r.clamp();\n }\n\n // (public) this & a\n function op_and(x,y) { return x&y; }\n function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n // (public) this | a\n function op_or(x,y) { return x|y; }\n function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n // (public) this ^ a\n function op_xor(x,y) { return x^y; }\n function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n // (public) this & ~a\n function op_andnot(x,y) { return x&~y; }\n function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n // (public) ~this\n function bnNot() {\n var r = nbi();\n for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n }\n\n // (public) this << n\n function bnShiftLeft(n) {\n var r = nbi();\n if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n return r;\n }\n\n // (public) this >> n\n function bnShiftRight(n) {\n var r = nbi();\n if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n return r;\n }\n\n // return index of lowest 1-bit in x, x < 2^31\n function lbit(x) {\n if(x == 0) return -1;\n var r = 0;\n if((x&0xffff) == 0) { x >>= 16; r += 16; }\n if((x&0xff) == 0) { x >>= 8; r += 8; }\n if((x&0xf) == 0) { x >>= 4; r += 4; }\n if((x&3) == 0) { x >>= 2; r += 2; }\n if((x&1) == 0) ++r;\n return r;\n }\n\n // (public) returns index of lowest 1-bit (or -1 if none)\n function bnGetLowestSetBit() {\n for(var i = 0; i < this.t; ++i)\n if(this[i] != 0) return i*this.DB+lbit(this[i]);\n if(this.s < 0) return this.t*this.DB;\n return -1;\n }\n\n // return number of 1 bits in x\n function cbit(x) {\n var r = 0;\n while(x != 0) { x &= x-1; ++r; }\n return r;\n }\n\n // (public) return number of set bits\n function bnBitCount() {\n var r = 0, x = this.s&this.DM;\n for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n return r;\n }\n\n // (public) true iff nth bit is set\n function bnTestBit(n) {\n var j = Math.floor(n/this.DB);\n if(j >= this.t) return(this.s!=0);\n return((this[j]&(1<<(n%this.DB)))!=0);\n }\n\n // (protected) this op (1<<n)\n function bnpChangeBit(n,op) {\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r,op,r);\n return r;\n }\n\n // (public) this | (1<<n)\n function bnSetBit(n) { return this.changeBit(n,op_or); }\n\n // (public) this & ~(1<<n)\n function bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n // (public) this ^ (1<<n)\n function bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n // (protected) r = this + a\n function bnpAddTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]+a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c += a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c<0)?-1:0;\n if(c > 0) r[i++] = c;\n else if(c < -1) r[i++] = this.DV+c;\n r.t = i;\n r.clamp();\n }\n\n // (public) this + a\n function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n // (public) this - a\n function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n // (public) this * a\n function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n // (public) this^2\n function bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n // (public) this / a\n function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n // (public) this % a\n function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n // (public) [this/a,this%a]\n function bnDivideAndRemainder(a) {\n var q = nbi(), r = nbi();\n this.divRemTo(a,q,r);\n return new Array(q,r);\n }\n\n // (protected) this *= n, this >= 0, 1 < n < DV\n function bnpDMultiply(n) {\n this[this.t] = this.am(0,n-1,this,0,0,this.t);\n ++this.t;\n this.clamp();\n }\n\n // (protected) this += n << w words, this >= 0\n function bnpDAddOffset(n,w) {\n if(n == 0) return;\n while(this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while(this[w] >= this.DV) {\n this[w] -= this.DV;\n if(++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n }\n\n // A \"null\" reducer\n function NullExp() {}\n function nNop(x) { return x; }\n function nMulTo(x,y,r) { x.multiplyTo(y,r); }\n function nSqrTo(x,r) { x.squareTo(r); }\n\n NullExp.prototype.convert = nNop;\n NullExp.prototype.revert = nNop;\n NullExp.prototype.mulTo = nMulTo;\n NullExp.prototype.sqrTo = nSqrTo;\n\n // (public) this^e\n function bnPow(e) { return this.exp(e,new NullExp()); }\n\n // (protected) r = lower n words of \"this * a\", a.t <= n\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyLowerTo(a,n,r) {\n var i = Math.min(this.t+a.t,n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while(i > 0) r[--i] = 0;\n var j;\n for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n r.clamp();\n }\n\n // (protected) r = \"this * a\" without lower n words, n > 0\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyUpperTo(a,n,r) {\n --n;\n var i = r.t = this.t+a.t-n;\n r.s = 0; // assumes a,this >= 0\n while(--i >= 0) r[i] = 0;\n for(i = Math.max(n-this.t,0); i < a.t; ++i)\n r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n r.clamp();\n r.drShiftTo(1,r);\n }\n\n // Barrett modular reduction\n function Barrett(m) {\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n }\n\n function barrettConvert(x) {\n if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n else if(x.compareTo(this.m) < 0) return x;\n else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n }\n\n function barrettRevert(x) { return x; }\n\n // x = x mod m (HAC 14.42)\n function barrettReduce(x) {\n x.drShiftTo(this.m.t-1,this.r2);\n if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n x.subTo(this.r2,x);\n while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = x^2 mod m; x != r\n function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = x*y mod m; x,y != r\n function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Barrett.prototype.convert = barrettConvert;\n Barrett.prototype.revert = barrettRevert;\n Barrett.prototype.reduce = barrettReduce;\n Barrett.prototype.mulTo = barrettMulTo;\n Barrett.prototype.sqrTo = barrettSqrTo;\n\n // (public) this^e % m (HAC 14.85)\n function bnModPow(e,m) {\n var i = e.bitLength(), k, r = nbv(1), z;\n if(i <= 0) return r;\n else if(i < 18) k = 1;\n else if(i < 48) k = 3;\n else if(i < 144) k = 4;\n else if(i < 768) k = 5;\n else k = 6;\n if(i < 8)\n z = new Classic(m);\n else if(m.isEven())\n z = new Barrett(m);\n else\n z = new Montgomery(m);\n\n // precomputation\n var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n g[1] = z.convert(this);\n if(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n g[n] = nbi();\n z.mulTo(g2,g[n-2],g[n]);\n n += 2;\n }\n }\n\n var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n i = nbits(e[j])-1;\n while(j >= 0) {\n if(i >= k1) w = (e[j]>>(i-k1))&km;\n else {\n w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else {\n while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e[j]&(1<<i)) == 0) {\n z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n if(--i < 0) { i = this.DB-1; --j; }\n }\n }\n return z.revert(r);\n }\n\n // (public) gcd(this,a) (HAC 14.54)\n function bnGCD(a) {\n var x = (this.s<0)?this.negate():this.clone();\n var y = (a.s<0)?a.negate():a.clone();\n if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n if(g < 0) return x;\n if(i < g) g = i;\n if(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n }\n while(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n x.subTo(y,x);\n x.rShiftTo(1,x);\n }\n else {\n y.subTo(x,y);\n y.rShiftTo(1,y);\n }\n }\n if(g > 0) y.lShiftTo(g,y);\n return y;\n }\n\n // (protected) this % n, n < 2^26\n function bnpModInt(n) {\n if(n <= 0) return 0;\n var d = this.DV%n, r = (this.s<0)?n-1:0;\n if(this.t > 0)\n if(d == 0) r = this[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n return r;\n }\n\n // (public) 1/this % m (HAC 14.61)\n function bnModInverse(m) {\n var ac = m.isEven();\n if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(), v = this.clone();\n var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n while(u.signum() != 0) {\n while(u.isEven()) {\n u.rShiftTo(1,u);\n if(ac) {\n if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n a.rShiftTo(1,a);\n }\n else if(!b.isEven()) b.subTo(m,b);\n b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n v.rShiftTo(1,v);\n if(ac) {\n if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n c.rShiftTo(1,c);\n }\n else if(!d.isEven()) d.subTo(m,d);\n d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n u.subTo(v,u);\n if(ac) a.subTo(c,a);\n b.subTo(d,b);\n }\n else {\n v.subTo(u,v);\n if(ac) c.subTo(a,c);\n d.subTo(b,d);\n }\n }\n if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if(d.compareTo(m) >= 0) return d.subtract(m);\n if(d.signum() < 0) d.addTo(m,d); else return d;\n if(d.signum() < 0) return d.add(m); else return d;\n }\n\n var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\n var lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n // (public) test primality with certainty >= 1-.5^t\n function bnIsProbablePrime(t) {\n var i, x = this.abs();\n if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n if(x[0] == lowprimes[i]) return true;\n return false;\n }\n if(x.isEven()) return false;\n i = 1;\n while(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n }\n\n // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n function bnpMillerRabin(t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if(k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t+1)>>1;\n if(t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for(var i = 0; i < t; ++i) {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while(j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2,this);\n if(y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if(y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n }\n\n // protected\n BigInteger.prototype.chunkSize = bnpChunkSize;\n BigInteger.prototype.toRadix = bnpToRadix;\n BigInteger.prototype.fromRadix = bnpFromRadix;\n BigInteger.prototype.fromNumber = bnpFromNumber;\n BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n BigInteger.prototype.changeBit = bnpChangeBit;\n BigInteger.prototype.addTo = bnpAddTo;\n BigInteger.prototype.dMultiply = bnpDMultiply;\n BigInteger.prototype.dAddOffset = bnpDAddOffset;\n BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n BigInteger.prototype.modInt = bnpModInt;\n BigInteger.prototype.millerRabin = bnpMillerRabin;\n\n // public\n BigInteger.prototype.clone = bnClone;\n BigInteger.prototype.intValue = bnIntValue;\n BigInteger.prototype.byteValue = bnByteValue;\n BigInteger.prototype.shortValue = bnShortValue;\n BigInteger.prototype.signum = bnSigNum;\n BigInteger.prototype.toByteArray = bnToByteArray;\n BigInteger.prototype.equals = bnEquals;\n BigInteger.prototype.min = bnMin;\n BigInteger.prototype.max = bnMax;\n BigInteger.prototype.and = bnAnd;\n BigInteger.prototype.or = bnOr;\n BigInteger.prototype.xor = bnXor;\n BigInteger.prototype.andNot = bnAndNot;\n BigInteger.prototype.not = bnNot;\n BigInteger.prototype.shiftLeft = bnShiftLeft;\n BigInteger.prototype.shiftRight = bnShiftRight;\n BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n BigInteger.prototype.bitCount = bnBitCount;\n BigInteger.prototype.testBit = bnTestBit;\n BigInteger.prototype.setBit = bnSetBit;\n BigInteger.prototype.clearBit = bnClearBit;\n BigInteger.prototype.flipBit = bnFlipBit;\n BigInteger.prototype.add = bnAdd;\n BigInteger.prototype.subtract = bnSubtract;\n BigInteger.prototype.multiply = bnMultiply;\n BigInteger.prototype.divide = bnDivide;\n BigInteger.prototype.remainder = bnRemainder;\n BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n BigInteger.prototype.modPow = bnModPow;\n BigInteger.prototype.modInverse = bnModInverse;\n BigInteger.prototype.pow = bnPow;\n BigInteger.prototype.gcd = bnGCD;\n BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n // JSBN-specific extension\n BigInteger.prototype.square = bnSquare;\n\n // Expose the Barrett function\n BigInteger.prototype.Barrett = Barrett\n\n // BigInteger interfaces not implemented in jsbn:\n\n // BigInteger(int signum, byte[] magnitude)\n // double doubleValue()\n // float floatValue()\n // int hashCode()\n // long longValue()\n // static BigInteger valueOf(long val)\n\n // Random number generator - requires a PRNG backend, e.g. prng4.js\n\n // For best results, put code like\n // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n // in your main HTML document.\n\n var rng_state;\n var rng_pool;\n var rng_pptr;\n\n // Mix in a 32-bit integer into the pool\n function rng_seed_int(x) {\n rng_pool[rng_pptr++] ^= x & 255;\n rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n }\n\n // Mix in the current time (w/milliseconds) into the pool\n function rng_seed_time() {\n rng_seed_int(new Date().getTime());\n }\n\n // Initialize the pool with junk if needed.\n if(rng_pool == null) {\n rng_pool = new Array();\n rng_pptr = 0;\n var t;\n if(typeof window !== \"undefined\" && window.crypto) {\n if (window.crypto.getRandomValues) {\n // Use webcrypto if available\n var ua = new Uint8Array(32);\n window.crypto.getRandomValues(ua);\n for(t = 0; t < 32; ++t)\n rng_pool[rng_pptr++] = ua[t];\n }\n else if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n // Extract entropy (256 bits) from NS4 RNG if available\n var z = window.crypto.random(32);\n for(t = 0; t < z.length; ++t)\n rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n }\n }\n while(rng_pptr < rng_psize) { // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = t >>> 8;\n rng_pool[rng_pptr++] = t & 255;\n }\n rng_pptr = 0;\n rng_seed_time();\n //rng_seed_int(window.screenX);\n //rng_seed_int(window.screenY);\n }\n\n function rng_get_byte() {\n if(rng_state == null) {\n rng_seed_time();\n rng_state = prng_newstate();\n rng_state.init(rng_pool);\n for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n rng_pool[rng_pptr] = 0;\n rng_pptr = 0;\n //rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n }\n\n function rng_get_bytes(ba) {\n var i;\n for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n }\n\n function SecureRandom() {}\n\n SecureRandom.prototype.nextBytes = rng_get_bytes;\n\n // prng4.js - uses Arcfour as a PRNG\n\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = new Array();\n }\n\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n function ARC4init(key) {\n var i, j, t;\n for(i = 0; i < 256; ++i)\n this.S[i] = i;\n j = 0;\n for(i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n }\n\n function ARC4next() {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n }\n\n Arcfour.prototype.init = ARC4init;\n Arcfour.prototype.next = ARC4next;\n\n // Plug in your RNG constructor here\n function prng_newstate() {\n return new Arcfour();\n }\n\n // Pool size must be a multiple of 4 and greater than 32.\n // An array of bytes the size of the pool will be passed to init()\n var rng_psize = 256;\n\n if (typeof exports !== 'undefined') {\n exports = module.exports = {\n default: BigInteger,\n BigInteger: BigInteger,\n SecureRandom: SecureRandom,\n };\n } else {\n this.jsbn = {\n BigInteger: BigInteger,\n SecureRandom: SecureRandom\n };\n }\n\n}).call(this);\n"
},
{
"id": 14,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/leemon/es/index.js",
"name": "./node_modules/leemon/es/index.js",
"index": 25,
"index2": 21,
"size": 57067,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "59:15-32"
},
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "64:15-32"
}
],
"usedExports": true,
"providedExports": [
"bpe",
"one",
"zero",
"findPrimes",
"millerRabinInt",
"millerRabin",
"bitSize",
"expand",
"randTruePrime",
"randProbPrime",
"randProbPrimeRounds",
"mod",
"addInt",
"mult",
"powMod",
"sub",
"add",
"inverseMod",
"multMod",
"randTruePrime_",
"randBigInt",
"randBigInt_",
"GCD",
"GCD_",
"inverseMod_",
"inverseModInt",
"eGCD_",
"negative",
"greaterShift",
"greater",
"divide_",
"carry_",
"modInt",
"int2bigInt",
"str2bigInt",
"equalsInt",
"equals",
"isZero",
"bigInt2str",
"dup",
"copy_",
"copyInt_",
"addInt_",
"rightShift_",
"halve_",
"leftShift_",
"multInt_",
"divInt_",
"linComb_",
"linCombShift_",
"addShift_",
"subShift_",
"sub_",
"add_",
"mult_",
"mod_",
"multMod_",
"squareMod_",
"trim",
"powMod_",
"mont_"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/lib/bin_utils.ts (referenced with cjs require), ./src/lib/mtproto.ts (referenced with cjs require)"
],
"depth": 2,
"source": "'use strict';\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int, 1<b<x)\n// bigInt mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int modInt(x,n) //return x mod n for bigInt x and integer n.\n// bigInt mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.\n// boolean negative(x) //is bigInt x negative?\n// bigInt powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.\n// bigInt randBigInt(n,s) //return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.\n// void linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n) //do x=x*x mod n for bigInts x,n\n// void subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n// powMod_() = algorithm 14.94, Montgomery exponentiation\n// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n// GCD_() = algorothm 14.57, Lehmer's algorithm\n// mont_() = algorithm 14.36, Montgomery multiplication\n// divide_() = algorithm 14.20 Multiple-precision division\n// squareMod_() = algorithm 14.16 Multiple-precision squaring\n// randTruePrime_() = algorithm 4.62, Maurer's algorithm\n// millerRabin() = algorithm 4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n// randTruePrime_() spends:\n// 10% of its time in calls to powMod_()\n// 85% of its time in calls to millerRabin()\n// millerRabin() spends:\n// 99% of its time in calls to powMod_() (always with a base of 2)\n// powMod_() spends:\n// 94% of its time in calls to mont_() (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n// -- this should especially focus on being fast when raising 2 to a power mod n\n// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n// - tune the parameters in randTruePrime_(), including c, m, and recLimit\n// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n// within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\n//globals\nexport var bpe = 0; //bits stored per array element\n\nvar mask = 0; //AND this with an array element to chop it down to bpe bits\n\nvar radix = mask + 1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n//the digits for converting to different bases\n\nvar digitsStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'; //initialize the global variables\n//bpe=number of bits in the mantissa on this platform\n\nfor (bpe = 0; 1 << bpe + 1 > 1 << bpe; bpe++) {\n ;\n}\n\nbpe >>= 1; //bpe=number of bits in one element of the array representing the bigInt\n\nmask = (1 << bpe) - 1; //AND the mask with an integer to get its bpe least significant bits\n\nradix = mask + 1; //2^bpe. a single 1 bit to the left of the first bit of mask\n\nexport var one = int2bigInt(1, 1, 1); //constant used in powMod_()\n\nexport var zero = int2bigInt(0, 1, 1); //the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\n\nvar t = new Array(0);\nvar ss = t; //used in mult_()\n\nvar s0 = t; //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\n\nvar s3 = t; //used in powMod_()\n\nvar s4 = t,\n s5 = t; //used in mod_()\n\nvar s6 = t; //used in bigInt2str()\n\nvar s7 = t; //used in powMod_()\n\nvar T = t; //used in GCD_()\n\nvar sa = t; //used in mont_()\n\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t,\n //used in millerRabin()\neg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t,\n //used in eGCD_(), inverseMod_()\n//, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\nprimes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t,\n //used in randTruePrime_()\nrpprb = t; //used in randProbPrimeRounds() (which also uses \"primes\")\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff;\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function findPrimes(n) {\n var i, s, p, ans;\n s = new Array(n);\n\n for (i = 0; i < n; i++) {\n s[i] = 0;\n }\n\n s[0] = 2;\n p = 0; //first p elements of s are primes, the rest are a sieve\n\n for (; s[p] < n;) {\n //s[p] is the pth prime\n for (i = s[p] * s[p]; i < n; i += s[p] //mark multiples of s[p]\n ) {\n s[i] = 1;\n }\n\n p++;\n s[p] = s[p - 1] + 1;\n\n for (; s[p] < n && s[s[p]]; s[p]++) {\n ;\n } //find next prime (where s[p]==0)\n\n }\n\n ans = new Array(p);\n\n for (i = 0; i < p; i++) {\n ans[i] = s[i];\n }\n\n return ans;\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabinInt(x, b) {\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copyInt_(mr_a, b);\n return millerRabin(x, mr_a);\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x and b are bigInts with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number[]} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabin(x, b) {\n var i, j, k, s;\n\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copy_(mr_a, b);\n copy_(mr_r, x);\n copy_(mr_x1, x);\n addInt_(mr_r, -1);\n addInt_(mr_x1, -1); //s=the highest power of two that divides mr_r\n\n k = 0;\n\n for (i = 0; i < mr_r.length; i++) {\n for (j = 1; j < mask; j <<= 1) {\n if (x[i] & j) {\n s = k < mr_r.length + bpe ? k : 0;\n i = mr_r.length;\n j = mask;\n } else k++;\n }\n }\n\n if (s) rightShift_(mr_r, s);\n powMod_(mr_a, mr_r, x);\n\n if (!equalsInt(mr_a, 1) && !equals(mr_a, mr_x1)) {\n j = 1; //$off\n\n while (j <= s - 1 && !equals(mr_a, mr_x1)) {\n squareMod_(mr_a, x);\n\n if (equalsInt(mr_a, 1)) {\n return 0;\n }\n\n j++;\n }\n\n if (!equals(mr_a, mr_x1)) {\n return 0;\n }\n }\n\n return 1;\n}\n/**\n * returns how many bits long the bigInt is, not counting leading zeros.\n *\n * @param {number[]} x\n * @returns {number}\n */\n\nexport function bitSize(x) {\n var j, z, w;\n\n for (j = x.length - 1; x[j] == 0 && j > 0; j--) {\n ;\n }\n\n for (z = 0, w = x[j]; w; w >>= 1, z++) {\n ;\n }\n\n z += bpe * j;\n return z;\n}\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function expand(x, n) {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0);\n copy_(ans, x);\n return ans;\n}\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randTruePrime(k) {\n var ans = int2bigInt(0, k, 0);\n randTruePrime_(ans, k);\n return trim(ans, 1);\n}\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randProbPrime(k) {\n if (k >= 600) return randProbPrimeRounds(k, 2); //numbers from HAC table 4.3\n\n if (k >= 550) return randProbPrimeRounds(k, 4);\n if (k >= 500) return randProbPrimeRounds(k, 5);\n if (k >= 400) return randProbPrimeRounds(k, 6);\n if (k >= 350) return randProbPrimeRounds(k, 7);\n if (k >= 300) return randProbPrimeRounds(k, 9);\n if (k >= 250) return randProbPrimeRounds(k, 12); //numbers from HAC table 4.4\n\n if (k >= 200) return randProbPrimeRounds(k, 15);\n if (k >= 150) return randProbPrimeRounds(k, 18);\n if (k >= 100) return randProbPrimeRounds(k, 27);\n return randProbPrimeRounds(k, 40); //number from HAC remark 4.26 (only an estimate)\n}\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function randProbPrimeRounds(k, n) {\n var ans, i, divisible, B;\n B = 30000; //B is largest prime to use in trial division\n\n ans = int2bigInt(0, k, 0); //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans);\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n randBigInt_(ans, k, 0); //ans = a random odd number to check\n\n ans[0] |= 1;\n divisible = 0; //check ans for divisibility by small primes up to B\n\n for (i = 0; i < primes.length && primes[i] <= B; i++) {\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1;\n break;\n }\n } //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n //do n rounds of Miller Rabin, with random bases less than ans\n\n\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0);\n\n while (!greater(ans, rpprb) //pick a random rpprb that's < ans\n ) {\n randBigInt_(rpprb, k, 0);\n }\n\n if (!millerRabin(ans, rpprb)) divisible = 1;\n }\n\n if (!divisible) return ans;\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function mod(x, n) {\n var ans = dup(x);\n mod_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function addInt(x, n) {\n var ans = expand(x, x.length + 1);\n addInt_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return x*y for bigInts x and y. This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function mult(x, y) {\n var ans = expand(x, x.length + y.length);\n mult_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.\n *\n * 0**0=1.\n *\n * Faster for odd n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function powMod(x, y, n) {\n var ans = expand(x, n.length);\n powMod_( //this should work without the trim, but doesn't\n ans, trim(y, 2), trim(n, 2));\n return trim(ans, 1);\n}\n/**\n * return (x-y) for bigInts x and y\n *\n * Negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function sub(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n sub_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function add(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n add_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n\nexport function inverseMod(x, n) {\n var ans = expand(x, n.length);\n var s = inverseMod_(ans, n);\n return s ? trim(ans, 1) : null;\n}\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function multMod(x, y, n) {\n var ans = expand(x, n.length);\n multMod_(ans, y, n);\n return trim(ans, 1);\n}\n/**\n * generate a k-bit true random prime using Maurer's algorithm, and put it into ans.\n *\n * The bigInt ans must be large enough to hold it.\n *\n * @export\n * @param {number[]} ans\n * @param {number} k\n * @return {void}\n */\n\nexport function randTruePrime_(ans, k) {\n var c, m, pm, dd, j, r, B, divisible, z, zz, recSize;\n var w;\n if (primes.length == 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (pows.length == 0) {\n pows = new Array(512);\n\n for (j = 0; j < 512; j++) {\n pows[j] = Math.pow(2, j / 511 - 1);\n }\n } //c and m should be tuned for a particular machine and value of k, to maximize speed\n\n\n c = 0.1; //c=0.1 in HAC\n\n m = 20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n\n var recLimit = 20; //stop recursion when k <=recLimit. Must have recLimit >= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans);\n s_R = dup(ans);\n s_n1 = dup(ans);\n s_r2 = dup(ans);\n s_d = dup(ans);\n s_x1 = dup(ans); //TODO Seems like a bug in eslint, reports as unused\n\n s_x2 = dup(ans);\n s_b = dup(ans);\n s_n = dup(ans);\n s_i = dup(ans);\n s_rm = dup(ans);\n s_q = dup(ans);\n s_a = dup(ans);\n s_aa = dup(ans);\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << (k + 2 >> 1)) - 1; //pm is binary number with all ones, just over sqrt(2^k)\n\n copyInt_(ans, 0);\n\n for (dd = 1; dd;) {\n dd = 0;\n ans[0] = 1 | 1 << k - 1 | Math.floor(Math.random() * (1 << k)); //random, k-bit, odd integer, with msb 1\n\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1;\n break;\n }\n }\n }\n\n carry_(ans);\n return;\n }\n\n B = c * k * k; //try small primes up to B (or all the primes[] array if the largest is less than B).\n\n if (k > 2 * m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m;) {\n r = pows[Math.floor(Math.random() * 512)];\n } //r=Math.pow(2,Math.random()-1);\n else r = 0.5; //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1;\n randTruePrime_(s_q, recSize);\n copyInt_(s_i2, 0);\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << (k - 2) % bpe; //s_i2=2^(k-2)\n\n divide_(s_i2, s_q, s_i, s_rm); //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i);\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0);\n if (greater(s_i, s_R)) break;\n } //now s_R is in the range [0,s_i-1]\n\n\n addInt_(s_R, 1); //now s_R is in the range [1,s_i]\n\n add_(s_R, s_i); //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q);\n mult_(s_n, s_R);\n multInt_(s_n, 2);\n addInt_(s_n, 1); //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R);\n multInt_(s_r2, 2); //s_r2=2*s_R\n //check s_n for divisibility by small primes up to B\n\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++) {\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1;\n break;\n }\n }\n\n if (!divisible) if (!millerRabinInt(s_n, 2)) //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1;\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3);\n\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--) {\n ;\n } //strip leading zeros\n\n\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++) {\n ;\n }\n\n zz += bpe * j; //zz=number of bits in s_n, ignoring leading zeros\n\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0);\n if (greater(s_n, s_a)) break;\n } //now s_a is in the range [0,s_n-1]\n\n\n addInt_(s_n, 3); //now s_a is in the range [0,s_n-4]\n\n addInt_(s_a, 2); //now s_a is in the range [2,s_n-2]\n\n copy_(s_b, s_a);\n copy_(s_n1, s_n);\n addInt_(s_n1, -1);\n powMod_(s_b, s_n1, s_n); //s_b=s_a^(s_n-1) modulo s_n\n\n addInt_(s_b, -1);\n\n if (isZero(s_b)) {\n copy_(s_b, s_a);\n powMod_(s_b, s_r2, s_n);\n addInt_(s_b, -1);\n copy_(s_aa, s_n);\n copy_(s_d, s_b);\n GCD_(s_d, s_n); //if s_b and s_n are relatively prime, then s_n is a prime\n\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa);\n return; //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n}\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n\nexport function randBigInt(n, s) {\n var a, b;\n a = Math.floor((n - 1) / bpe) + 2; //# array elements to hold the BigInt with a leading 0 element\n\n b = int2bigInt(0, 0, a);\n randBigInt_(b, n, s);\n return b;\n}\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n\nexport function randBigInt_(b, n, s) {\n var i, a;\n\n for (i = 0; i < b.length; i++) {\n b[i] = 0;\n }\n\n a = Math.floor((n - 1) / bpe) + 1; //# array elements to hold the BigInt\n\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << bpe - 1));\n }\n\n b[a - 1] &= (2 << (n - 1) % bpe) - 1;\n if (s == 1) b[a - 1] |= 1 << (n - 1) % bpe;\n}\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function GCD(x, y) {\n var xc, yc;\n xc = dup(x);\n yc = dup(y);\n GCD_(xc, yc);\n return xc;\n}\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\n\nexport function GCD_(x, y) {\n var i, xp, yp, A, B, C, D, q, sing;\n var qp;\n if (T.length !== x.length) T = dup(x);\n sing = 1;\n\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0;\n\n for (i = 1; i < y.length; i++ //check if y has nonzero elements other than 0\n ) {\n if (y[i]) {\n sing = 1;\n break;\n }\n }\n\n if (!sing) break; //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--) {\n ;\n } //find most significant element of x\n\n\n xp = x[i];\n yp = y[i];\n A = 1;\n B = 0;\n C = 0;\n D = 1;\n\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C));\n qp = Math.floor((xp + B) / (yp + D));\n if (q != qp) break;\n t = A - q * C;\n A = C;\n C = t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n\n t = B - q * D;\n B = D;\n D = t;\n t = xp - q * yp;\n xp = yp;\n yp = t;\n }\n\n if (B) {\n copy_(T, x);\n linComb_(x, y, A, B); //x=A*x+B*y\n\n linComb_(y, T, D, C); //y=D*y+C*T\n } else {\n mod_(x, y);\n copy_(T, x);\n copy_(x, y);\n copy_(y, T);\n }\n }\n\n if (y[0] === 0) return;\n t = modInt(x, y[0]);\n copyInt_(x, y[0]);\n y[0] = t;\n\n while (y[0]) {\n x[0] %= y[0];\n t = x[0];\n x[0] = y[0];\n y[0] = t;\n }\n}\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n\nexport function inverseMod_(x, n) {\n var k = 1 + 2 * Math.max(x.length, n.length);\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0);\n return 0;\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_v = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n copy_(eg_u, x);\n copy_(eg_v, n);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, n);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, n);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C) //make sure answer is nonnegative\n ) {\n add_(eg_C, n);\n }\n\n copy_(x, eg_C);\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0);\n return 0;\n }\n\n return 1;\n }\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function inverseModInt(x, n) {\n var a = 1,\n b = 0,\n t;\n\n for (;;) {\n if (x === 1) return a;\n if (x === 0) return 0;\n b -= a * Math.floor(n / x); //$off\n\n n %= x;\n if (n === 1) return b; //to avoid negatives, change this b to n-b, and each -= to +=\n\n if (n === 0) return 0;\n a -= b * Math.floor(x / n); //$off\n\n x %= n;\n }\n /*::\n declare var never: empty\n return never\n */\n\n} //this deprecated function is for backward compatibility only.\n\nfunction inverseModInt_(x, n) {\n return inverseModInt(x, n);\n}\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\n\n\nexport function eGCD_(x, y, v, a, b) {\n var g = 0;\n var k = Math.max(x.length, y.length);\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x);\n halve_(y);\n g++;\n }\n\n copy_(eg_u, x);\n copy_(v, y);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, y);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, y);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //v>u\n sub_(v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y);\n sub_(eg_D, x);\n }\n\n multInt_(eg_D, -1); ///make sure b (D) is nonnegative\n\n copy_(a, eg_C);\n copy_(b, eg_D);\n leftShift_(v, g);\n return;\n }\n }\n}\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function negative(x) {\n //TODO Flow Bool type inference\n return x[x.length - 1] >> bpe - 1 & 1;\n}\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\n\nexport function greaterShift(x, y, shift) {\n var i,\n kx = x.length,\n ky = y.length;\n k = kx + shift < ky ? kx + shift : ky;\n\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) {\n if (x[i] > 0) return 1;\n } //if there are nonzeros in x to the left of the first column of y, then x is bigger\n\n\n for (i = kx - 1 + shift; i < ky; i++) {\n if (y[i] > 0) return 0;\n } //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n\n\n for (i = k - 1; i >= shift; i--) {\n if (x[i - shift] > y[i]) return 1;else if (x[i - shift] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function greater(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = x.length; i < y.length; i++) {\n if (y[i]) return 0;\n } //y has more digits\n\n\n for (i = y.length; i < x.length; i++) {\n if (x[i]) return 1;\n } //x has more digits\n\n\n for (i = k - 1; i >= 0; i--) {\n if (x[i] > y[i]) return 1;else if (x[i] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\n\nexport function divide_(x, y, q, r) {\n var kx, ky;\n var i, j, y1, y2, c, a, b;\n copy_(r, x);\n\n for (ky = y.length; y[ky - 1] === 0; ky--) {\n ;\n } //ky is number of elements in y, not including leading zeros\n //normalize: ensure the most significant element of y has its highest bit set\n\n\n b = y[ky - 1];\n\n for (a = 0; b; a++) {\n b >>= 1;\n }\n\n a = bpe - a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n\n leftShift_(y, a); //multiply both by 1<<a now, then divide both by that at the end\n\n leftShift_(r, a); //Rob Visser discovered a bug: the following line was originally just before the normalization.\n\n for (kx = r.length; r[kx - 1] === 0 && kx > ky; kx--) {\n ;\n } //kx is number of elements in normalized x, not including leading zeros\n\n\n copyInt_(q, 0); // q=0\n\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky); // r=r-leftShift_(y,kx-ky)\n\n q[kx - ky]++; // q[kx-ky]++;\n } // }\n\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask;else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1]); //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky];\n c = y2 >> bpe;\n y2 = y2 & mask;\n y1 = c + q[i - ky] * y[ky - 1];\n c = y1 >> bpe;\n y1 = y1 & mask;\n if (c == r[i] ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1] : c > r[i]) q[i - ky]--;else break;\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky); //r=r-q[i-ky]*leftShift_(y,i-ky)\n\n if (negative(r)) {\n addShift_(r, y, i - ky); //r=r+leftShift_(y,i-ky)\n\n q[i - ky]--;\n }\n }\n\n rightShift_(y, a); //undo the normalization step\n\n rightShift_(r, a); //undo the normalization step\n}\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\n\nexport function carry_(x) {\n var i, k, c, b;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function modInt(x, n) {\n var i,\n c = 0;\n\n for (i = x.length - 1; i >= 0; i--) {\n c = (c * radix + x[i]) % n;\n }\n\n return c;\n}\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\n\nexport function int2bigInt(t, bits, minSize) {\n var i, k;\n k = Math.ceil(bits / bpe) + 1;\n k = minSize > k ? minSize : k;\n var buff = new Array(k);\n copyInt_(buff, t);\n return buff;\n}\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\n\nexport function str2bigInt(s, base, minSize) {\n var d, i, x, y, kk;\n var k = s.length;\n\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0);\n\n for (;;) {\n y = new Array(x.length + 1);\n\n for (i = 0; i < x.length; i++) {\n y[i + 1] = x[i];\n }\n\n y[0] = parseInt(s, 10); //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n\n x = y;\n d = s.indexOf(',', 0);\n if (d < 1) break; //$off\n\n s = s.substring(d + 1);\n if (s.length == 0) break;\n } //$off\n\n\n if (x.length < minSize) {\n //$off\n y = new Array(minSize);\n copy_(y, x);\n return y;\n }\n\n return x;\n }\n\n x = int2bigInt(0, base * k, 0);\n\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0);\n if (base <= 36 && d >= 36) //convert lowercase to uppercase if base<=36\n d -= 26;\n\n if (d >= base || d < 0) {\n //stop at first illegal character\n break;\n }\n\n multInt_(x, base);\n addInt_(x, d);\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--) {\n ;\n } //strip off leading zeros\n //$off\n\n\n k = minSize > k + 1 ? minSize : k + 1; //$off\n\n y = new Array(k); //$off\n\n kk = k < x.length ? k : x.length; //$off\n\n for (i = 0; i < kk; i++) {\n y[i] = x[i];\n } //$off\n\n\n for (; i < k; i++) {\n y[i] = 0;\n }\n\n return y;\n} //return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i<x.length;i++)\n// y[i+1]=x[i];\n// y[0]=parseInt(s,10);\n// x=y;\n// d=s.indexOf(',',0);\n// if (d<1)\n// break;\n// s=s.substring(d+1);\n// if (s.length==0)\n// break;\n// }\n// if (x.length<minSize) {\n// y=new Array(minSize);\n// copy_(y,x);\n// return y;\n// }\n// return x;\n// }\n// x=int2bigInt(0,base*k,0);\n// for (i=0;i<k;i++) {\n// d=str.indexOf(s.substring(i,i+1),0);\n// if (base<=36 && d>=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k<x.length ? k : x.length;\n// for (i=0;i<kk;i++)\n// y[i]=x[i];\n// for (;i<k;i++)\n// y[i]=0;\n// return y;\n// }\n\n/**\n * is bigint x equal to integer y?\n *\n * y must have less than bpe bits\n *\n * @export\n * @param {number[]} x\n * @param {number} y\n * @returns {(1 | 0)}\n */\n\nexport function equalsInt(x, y) {\n var i;\n if (x[0] != y) return 0;\n\n for (i = 1; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * are bigints x and y equal?\n *\n * this works even if x and y are different lengths and have arbitrarily many leading zeros\n *\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function equals(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n if (x[i] !== y[i]) return 0;\n }\n\n if (x.length > y.length) {\n for (; i < x.length; i++) {\n if (x[i]) return 0;\n }\n } else {\n for (; i < y.length; i++) {\n if (y[i]) return 0;\n }\n }\n\n return 1;\n}\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function isZero(x) {\n var i;\n\n for (i = 0; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\n\nexport function bigInt2str(x, base) {\n var i,\n t,\n s = '';\n if (s6.length !== x.length) s6 = dup(x);else copy_(s6, x);\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) {\n s += x[i] + ',';\n }\n\n s += x[0];\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base); //t=s6 % base; s6=floor(s6/base);\n\n s = digitsStr.substring(t, t + 1) + s;\n }\n }\n\n if (s.length === 0) s = '0';\n return s;\n}\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\n\nexport function dup(x) {\n var i;\n buff = Array(x.length);\n copy_(buff, x);\n return buff;\n}\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\n\nexport function copy_(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n x[i] = y[i];\n }\n\n for (i = k; i < x.length; i++) {\n x[i] = 0;\n }\n}\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function copyInt_(x, n) {\n var i, c;\n var len = x.length; //TODO .length in for loop have perfomance costs. Bench this\n\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function addInt_(x, n) {\n var i, k, c, b;\n x[0] += n;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n if (!c) return; //stop carrying as soon as the carry is zero\n }\n}\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\n\nexport function rightShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = 0; i < x.length - k; i++ //right shift x by k elements\n ) {\n x[i] = x[i + k];\n }\n\n for (; i < x.length; i++) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - n | x[i] >> n);\n }\n\n x[i] >>= n;\n}\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\n\nexport function halve_(x) {\n var i;\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - 1 | x[i] >> 1);\n }\n\n x[i] = x[i] >> 1 | x[i] & radix >> 1; //most significant bit stays the same\n}\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function leftShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = x.length; i >= k; i-- //left shift x by k elements\n ) {\n x[i] = x[i - k];\n }\n\n for (; i >= 0; i--) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n if (!n) return;\n\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & (x[i] << n | x[i - 1] >> bpe - n);\n }\n\n x[i] = mask & x[i] << n;\n}\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function multInt_(x, n) {\n var i, k, c, b;\n if (!n) return;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i] * n;\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\n\nexport function divInt_(x, n) {\n var i,\n r = 0,\n s;\n\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i];\n x[i] = Math.floor(s / n);\n r = s % n;\n }\n\n return r;\n}\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\n\nexport function linComb_(x, y, a, b) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n kk = x.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; i < kk; i++) {\n c += a * x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\n\nexport function linCombShift_(x, y, b, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function addShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function subShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function sub_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function add_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function mult_(x, y) {\n var i;\n if (ss.length != 2 * x.length) ss = new Array(2 * x.length);\n copyInt_(ss, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(ss, x, y[i], i);\n } //ss=1*ss+y[i]*(x<<(i*bpe))\n\n\n copy_(x, ss);\n}\n/**\n * do x=x mod n for bigInts x and n\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function mod_(x, n) {\n if (s4.length !== x.length) s4 = dup(x);else copy_(s4, x);\n if (s5.length !== x.length) s5 = dup(x);\n divide_(s4, n, s5, x); //x = remainder of s4 / n\n}\n/**\n * do x=x*y mod n for bigInts x,y,n.\n *\n * for greater speed, let y<x.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function multMod_(x, y, n) {\n var i;\n if (s0.length != 2 * x.length) s0 = new Array(2 * x.length);\n copyInt_(s0, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(s0, x, y[i], i);\n } //s0=1*s0+y[i]*(x<<(i*bpe))\n\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * do x=x*x mod n for bigInts x,n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function squareMod_(x, n) {\n var i, j, d, c, kx, kn, k;\n\n for (kx = x.length; kx > 0 && !x[kx - 1]; kx--) {\n ;\n } //ignore leading zeros in x\n\n\n k = kx > n.length ? 2 * kx : 2 * n.length; //k=# elements in the product, which is twice the elements in the larger of x and n\n\n if (s0.length != k) s0 = new Array(k);\n copyInt_(s0, 0);\n\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i];\n s0[2 * i] = c & mask;\n c >>= bpe;\n\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c;\n s0[i + j] = c & mask;\n c >>= bpe;\n }\n\n s0[i + kx] = c;\n }\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function trim(x, k) {\n var i, y;\n\n for (i = x.length; i > 0 && !x[i - 1]; i--) {\n ;\n }\n\n y = new Array(i + k);\n copy_(y, x);\n return y;\n}\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function powMod_(x, y, n) {\n var k1, k2, kn, np;\n if (s7.length != n.length) s7 = dup(n); //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n\n if ((n[0] & 1) == 0) {\n copy_(s7, x);\n copyInt_(x, 1);\n\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n);\n divInt_(y, 2);\n squareMod_(s7, n);\n }\n\n return;\n } //calculate np from n for the Montgomery multiplications\n\n\n copyInt_(s7, 0);\n\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--) {\n ;\n }\n\n np = radix - inverseModInt(modInt(n, radix), radix);\n s7[kn] = 1;\n multMod_(x, s7, n); // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x);else copy_(s3, x); //$off\n\n for (k1 = y.length - 1; k1 > 0 & !y[k1]; k1--) {\n ;\n } //k1=first nonzero element of y\n\n\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1);\n return;\n }\n\n for (k2 = 1 << bpe - 1; k2 && !(y[k1] & k2); k2 >>= 1) {\n ;\n } //k2=position of first 1 bit in y[k1]\n\n\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--;\n\n if (k1 < 0) {\n mont_(x, one, n, np);\n return;\n }\n\n k2 = 1 << bpe - 1;\n }\n\n mont_(x, x, n, np);\n if (k2 & y[k1]) //if next bit is a 1\n mont_(x, s3, n, np);\n }\n}\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\n\nexport function mont_(x, y, n, np) {\n var i, j, c, ui, t, ks;\n var kn = n.length;\n var ky = y.length;\n if (sa.length != kn) sa = new Array(kn);\n copyInt_(sa, 0);\n\n for (; kn > 0 && n[kn - 1] == 0; kn--) {\n ;\n } //ignore leading zeros of n\n\n\n for (; ky > 0 && y[ky - 1] == 0; ky--) {\n ;\n } //ignore leading zeros of y\n\n\n ks = sa.length - 1; //sa will never have more than this many nonzero elements.\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0];\n ui = (t & mask) * np & mask; //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n\n c = t + ui * n[0] >> bpe;\n t = x[i]; //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n\n j = 1;\n\n for (; j < ky - 4;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ky;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn - 4;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ks;) {\n c += sa[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n sa[j - 1] = c & mask;\n }\n\n if (!greater(n, sa)) sub_(sa, n);\n copy_(x, sa);\n}\n//# sourceMappingURL=index.js.map"
},
{
"id": 15,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"name": "./src/lib/tl_utils.ts",
"index": 30,
"index2": 27,
"size": 24172,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./tl_utils",
"loc": "59:17-38"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./tl_utils",
"loc": "16:17-38"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar utils_1 = require(\"./utils\");\nvar Config = __importStar(require(\"./config\"));\nvar TLSerialization = /** @class */ (function () {\n function TLSerialization(options) {\n if (options === void 0) { options = {}; }\n this.maxLength = 2048; // 2Kb\n this.offset = 0; // in bytes\n this.mtproto = false;\n this.debug = false; //Config.Modes.debug;\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n TLSerialization.prototype.createBuffer = function () {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n };\n TLSerialization.prototype.getArray = function () {\n var resultBuffer = new ArrayBuffer(this.offset);\n var resultArray = new Int32Array(resultBuffer);\n resultArray.set(this.intView.subarray(0, this.offset / 4));\n return resultArray;\n };\n TLSerialization.prototype.getBuffer = function () {\n return this.getArray().buffer;\n };\n TLSerialization.prototype.getBytes = function (typed) {\n if (typed) {\n var resultBuffer = new ArrayBuffer(this.offset);\n var resultArray = new Uint8Array(resultBuffer);\n resultArray.set(this.byteView.subarray(0, this.offset));\n return resultArray;\n }\n var bytes = [];\n for (var i = 0; i < this.offset; i++) {\n bytes.push(this.byteView[i]);\n }\n return bytes;\n };\n TLSerialization.prototype.checkLength = function (needBytes) {\n if (this.offset + needBytes < this.maxLength) {\n return;\n }\n console.trace('Increase buffer', this.offset, needBytes, this.maxLength);\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n var previousBuffer = this.buffer;\n var previousArray = new Int32Array(previousBuffer);\n this.createBuffer();\n new Int32Array(this.buffer).set(previousArray);\n };\n TLSerialization.prototype.writeInt = function (i, field) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n this.checkLength(4);\n this.intView[this.offset / 4] = i;\n this.offset += 4;\n };\n TLSerialization.prototype.storeInt = function (i, field) {\n this.writeInt(i, (field || '') + ':int');\n };\n TLSerialization.prototype.storeBool = function (i, field) {\n if (i) {\n this.writeInt(0x997275b5, (field || '') + ':bool');\n }\n else {\n this.writeInt(0xbc799737, (field || '') + ':bool');\n }\n };\n TLSerialization.prototype.storeLongP = function (iHigh, iLow, field) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n };\n TLSerialization.prototype.storeLong = function (sLong, field) {\n if (Array.isArray(sLong)) {\n if (sLong.length == 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n }\n else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n if (typeof sLong != 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n var divRem = bin_utils_1.bigStringInt(sLong).divideAndRemainder(bin_utils_1.bigint(0x100000000));\n this.writeInt(bin_utils_1.intToUint(divRem[1].intValue()), (field || '') + ':long[low]');\n this.writeInt(bin_utils_1.intToUint(divRem[0].intValue()), (field || '') + ':long[high]');\n };\n TLSerialization.prototype.storeDouble = function (f, field) {\n var buffer = new ArrayBuffer(8);\n var intView = new Int32Array(buffer);\n var doubleView = new Float64Array(buffer);\n doubleView[0] = f;\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n };\n TLSerialization.prototype.storeString = function (s, field) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n if (s === undefined) {\n s = '';\n }\n var sUTF8 = unescape(encodeURIComponent(s));\n this.checkLength(sUTF8.length + 8);\n var len = sUTF8.length;\n if (len <= 253) {\n this.byteView[this.offset++] = len;\n }\n else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for (var i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n // Padding\n while (this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n };\n TLSerialization.prototype.storeBytes = function (bytes, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n else if (bytes === undefined) {\n bytes = [];\n }\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || '') + ':bytes');\n var len = bytes.byteLength || bytes.length;\n this.checkLength(len + 8);\n if (len <= 253) {\n this.byteView[this.offset++] = len;\n }\n else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n // Padding\n while (this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n };\n TLSerialization.prototype.storeIntBytes = function (bytes, bits, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n if ((bits % 32) || (len * 8) != bits) {\n throw new Error('Invalid bits: ' + bits + ', ' + bytes.length);\n }\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || '') + ':int' + bits);\n this.checkLength(len);\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n };\n TLSerialization.prototype.storeRawBytes = function (bytes, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n };\n TLSerialization.prototype.storeMethod = function (methodName, params) {\n var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API;\n var methodData = false, i;\n for (i = 0; i < schema.methods.length; i++) {\n if (schema.methods[i].method == methodName) {\n methodData = schema.methods[i];\n break;\n }\n }\n if (!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n this.storeInt(bin_utils_1.intToUint(methodData.id), methodName + '[id]');\n var param, type;\n var i, condType;\n var fieldBit;\n var len = methodData.params.length;\n for (i = 0; i < len; i++) {\n param = methodData.params[i];\n type = param.type;\n if (type.indexOf('?') !== -1) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n if (!(params[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n }\n return methodData.type;\n };\n TLSerialization.prototype.storeObject = function (obj, type, field) {\n switch (type) {\n case '#':\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return;\n }\n // console.log('storeObject', obj, type, field);\n if (Array.isArray(obj)) {\n if (type.substr(0, 6) == 'Vector') {\n this.writeInt(0x1cb5c415, field + '[id]');\n }\n else if (type.substr(0, 6) != 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n this.writeInt(obj.length, field + '[count]');\n for (var i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n return true;\n }\n else if (type.substr(0, 6).toLowerCase() == 'vector') {\n throw new Error('Invalid vector object');\n }\n if (!utils_1.isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API;\n var predicate = obj['_'];\n var isBare = false;\n var constructorData = false;\n if (isBare = (type.charAt(0) == '%')) {\n type = type.substr(1);\n }\n for (i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].predicate == predicate) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n if (predicate == type) {\n isBare = true;\n }\n if (!isBare) {\n this.writeInt(bin_utils_1.intToUint(constructorData.id), field + '[' + predicate + '][id]');\n }\n var param, type;\n var condType;\n var fieldBit;\n var len = constructorData.params.length;\n for (i = 0; i < len; i++) {\n param = constructorData.params[i];\n type = param.type;\n if (type.indexOf('?') !== -1) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n // @ts-ignore\n if (!(obj[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n }\n return constructorData.type;\n };\n return TLSerialization;\n}());\nexports.TLSerialization = TLSerialization;\nvar TLDeserialization = /** @class */ (function () {\n function TLDeserialization(buffer, options) {\n if (options === void 0) { options = {}; }\n this.offset = 0; // in bytes\n // this.debug = \n this.mtproto = false;\n this.buffer = buffer;\n this.intView = new Uint32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n this.override = 'override' in options ? options.override : {};\n this.mtproto = 'mtproto' in options ? options.mtproto : false;\n this.debug = options.debug !== undefined ? options.debug : /* Config.Modes.debug */ false;\n }\n TLDeserialization.prototype.readInt = function (field) {\n if (this.offset >= this.intView.length * 4) {\n throw new Error('Nothing to fetch: ' + field);\n }\n var i = this.intView[this.offset / 4];\n this.debug && console.log('<<<', i.toString(16), i, field);\n this.offset += 4;\n return i;\n };\n TLDeserialization.prototype.fetchInt = function (field) {\n return this.readInt((field || '') + ':int');\n };\n TLDeserialization.prototype.fetchDouble = function (field) {\n var buffer = new ArrayBuffer(8);\n var intView = new Int32Array(buffer);\n var doubleView = new Float64Array(buffer);\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n return doubleView[0];\n };\n TLDeserialization.prototype.fetchLong = function (field) {\n var iLow = this.readInt((field || '') + ':long[low]');\n var iHigh = this.readInt((field || '') + ':long[high]');\n var longDec = bin_utils_1.bigint(iHigh).shiftLeft(32).add(bin_utils_1.bigint(iLow)).toString();\n return longDec;\n };\n TLDeserialization.prototype.fetchBool = function (field) {\n var i = this.readInt((field || '') + ':bool');\n if (i == 0x997275b5) {\n return true;\n }\n else if (i == 0xbc799737) {\n return false;\n }\n this.offset -= 4;\n return this.fetchObject('Object', field);\n };\n TLDeserialization.prototype.fetchString = function (field) {\n var len = this.byteView[this.offset++];\n if (len == 254) {\n var len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n var sUTF8 = '';\n for (var i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n // Padding\n while (this.offset % 4) {\n this.offset++;\n }\n try {\n var s = decodeURIComponent(escape(sUTF8));\n }\n catch (e) {\n var s = sUTF8;\n }\n this.debug && console.log('<<<', s, (field || '') + ':string');\n return s;\n };\n TLDeserialization.prototype.fetchBytes = function (field) {\n var len = this.byteView[this.offset++];\n if (len == 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n var bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n // Padding\n while (this.offset % 4) {\n this.offset++;\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || '') + ':bytes');\n return bytes;\n };\n TLDeserialization.prototype.fetchIntBytes = function (bits, typed, field) {\n if (bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n var len = bits / 8;\n if (typed) {\n var result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n var bytes = [];\n for (var i = 0; i < len; i++) {\n bytes.push(this.byteView[this.offset++]);\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || '') + ':int' + bits);\n return bytes;\n };\n TLDeserialization.prototype.fetchRawBytes = function (len, typed, field) {\n if (len === false) {\n len = this.readInt((field || '') + '_length');\n if (len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n if (typed) {\n var bytes_1 = new Uint8Array(len);\n bytes_1.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes_1;\n }\n var bytes = [];\n for (var i = 0; i < len; i++) {\n bytes.push(this.byteView[this.offset++]);\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || ''));\n return bytes;\n };\n TLDeserialization.prototype.fetchObject = function (type, field) {\n switch (type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, false, field);\n case 'int256':\n return this.fetchIntBytes(256, false, field);\n case 'int512':\n return this.fetchIntBytes(512, false, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n field = field || type || 'Object';\n if (type.substr(0, 6) == 'Vector' || type.substr(0, 6) == 'vector') {\n if (type.charAt(0) == 'V') {\n var constructor = this.readInt(field + '[id]');\n var constructorCmp = bin_utils_1.uintToInt(constructor);\n if (constructorCmp == 0x3072cfa1) { // Gzip packed\n var compressed = this.fetchBytes(field + '[packed_string]');\n var uncompressed = bin_utils_1.gzipUncompress(compressed);\n var buffer = bin_utils_1.bytesToArrayBuffer(uncompressed);\n var newDeserializer = (new TLDeserialization(buffer));\n return newDeserializer.fetchObject(type, field);\n }\n if (constructorCmp != 0x1cb5c415) {\n throw new Error('Invalid vector constructor ' + constructor);\n }\n }\n var len = this.readInt(field + '[count]');\n var result = [];\n if (len > 0) {\n var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n for (var i = 0; i < len; i++) {\n result.push(this.fetchObject(itemType, field + '[' + i + ']'));\n }\n }\n return result;\n }\n var schema = (this.mtproto ? Config.Schema.MTProto : Config.Schema.API);\n var predicate = false;\n var constructorData = false;\n if (type.charAt(0) == '%') {\n var checkType = type.substr(1);\n for (var i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].type == checkType) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }\n else if (type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n for (var i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].predicate == type) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n }\n else {\n var constructor = this.readInt(field + '[id]');\n var constructorCmp = bin_utils_1.uintToInt(constructor);\n if (constructorCmp == 0x3072cfa1) { // Gzip packed\n var compressed = this.fetchBytes(field + '[packed_string]');\n var uncompressed = bin_utils_1.gzipUncompress(compressed);\n var buffer = bin_utils_1.bytesToArrayBuffer(uncompressed);\n var newDeserializer = (new TLDeserialization(buffer));\n return newDeserializer.fetchObject(type, field);\n }\n var index = schema.constructorsIndex;\n if (!index) {\n schema.constructorsIndex = index = {};\n for (var i = 0; i < schema.constructors.length; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n var i = index[constructorCmp];\n if (i) {\n constructorData = schema.constructors[i];\n }\n var fallback = false;\n if (!constructorData && this.mtproto) {\n var schemaFallback = Config.Schema.API;\n for (i = 0; i < schemaFallback.constructors.length; i++) {\n // @ts-ignore\n if (schemaFallback.constructors[i].id == constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found: ' + constructor + ' ' + this.fetchInt() + ' ' + this.fetchInt());\n }\n }\n predicate = constructorData.predicate;\n var result = { '_': predicate };\n var overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n var self = this;\n if (this.override[overrideKey]) {\n this.override[overrideKey].apply(this, [result, field + '[' + predicate + ']']);\n }\n else {\n var i, param;\n var type, isCond;\n var condType, fieldBit;\n var value;\n var len = constructorData.params.length;\n for (i = 0; i < len; i++) {\n param = constructorData.params[i];\n type = param.type;\n if (type == '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n if (isCond = (type.indexOf('?') !== -1)) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n if (!(result[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n value = self.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n if (isCond && type === 'true') {\n result.pFlags[param.name] = value;\n }\n else {\n result[param.name] = value;\n }\n }\n }\n // @ts-ignore\n if (fallback) {\n this.mtproto = true;\n }\n return result;\n };\n TLDeserialization.prototype.getOffset = function () {\n return this.offset;\n };\n TLDeserialization.prototype.fetchEnd = function () {\n if (this.offset != this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n return true;\n };\n return TLDeserialization;\n}());\nexports.TLDeserialization = TLDeserialization;\n"
},
{
"id": 16,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"name": "./src/lib/cryptoworker.ts",
"index": 31,
"index2": 29,
"size": 7737,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./cryptoworker",
"loc": "60:37-62"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./cryptoworker",
"loc": "17:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\nvar bin_utils_1 = require(\"./bin_utils\");\n// @ts-ignore\nvar crypto_worker_js_1 = __importDefault(require(\"./crypto.worker.js\"));\nvar CryptoWorker = /** @class */ (function () {\n function CryptoWorker() {\n var _this = this;\n this.webWorker = false;\n this.naClEmbed = false;\n this.taskID = 0;\n this.awaiting = {};\n // @ts-ignore\n this.webCrypto = Config.Modes.webcrypto && window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle); /* || window.msCrypto && window.msCrypto.subtle*/\n this.useSha1Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n this.useSha256Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n var finalizeTask = function (taskID, result) {\n var deferred = _this.awaiting[taskID];\n if (deferred !== undefined) {\n // console.log(dT(), 'CW done')\n deferred.resolve(result);\n delete _this.awaiting[taskID];\n }\n };\n if (Config.Modes.nacl &&\n navigator.mimeTypes &&\n 'application/x-pnacl' in navigator.mimeTypes) {\n //var listener = $('<div id=\"nacl_listener\"><embed id=\"mtproto_crypto\" width=\"0\" height=\"0\" src=\"nacl/mtproto_crypto.nmf\" type=\"application/x-pnacl\" /></div>').appendTo($('body'))[0]\n var listener = document.createElement('template');\n listener.innerHTML = '<div id=\"nacl_listener\"><embed id=\"mtproto_crypto\" width=\"0\" height=\"0\" src=\"nacl/mtproto_crypto.nmf\" type=\"application/x-pnacl\" /></div>';\n document.body.append(listener);\n listener.addEventListener('load', function (e) {\n _this.naClEmbed = listener.firstChild;\n console.log(utils_1.dT(), 'NaCl ready');\n }, true);\n listener.addEventListener('message', function (e) {\n // @ts-ignore\n finalizeTask(e.data.taskID, e.data.result);\n }, true);\n listener.addEventListener('error', function (e) {\n console.error('NaCl error', e);\n }, true);\n }\n // @ts-ignore\n if (window.Worker /* && 1 == 2 */) {\n var tmpWorker = new crypto_worker_js_1.default();\n tmpWorker.onmessage = function (e) {\n if (!_this.webWorker) {\n _this.webWorker = tmpWorker;\n }\n else {\n finalizeTask(e.data.taskID, e.data.result);\n }\n };\n tmpWorker.onerror = function (error) {\n console.error('CW error', error /* , error.stack */);\n _this.webWorker = false;\n };\n }\n }\n CryptoWorker.prototype.performTaskWorker = function (task, params, embed) {\n var _this = this;\n // console.log(dT(), 'CW start', task)\n return new Promise(function (resolve, reject) {\n _this.awaiting[_this.taskID] = { resolve: resolve, reject: reject };\n params.task = task;\n params.taskID = _this.taskID;\n (embed || _this.webWorker).postMessage(params);\n _this.taskID++;\n });\n };\n CryptoWorker.prototype.sha1Hash = function (bytes) {\n var _this = this;\n if (this.useSha1Crypto) {\n // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one. webCrypto.digest supports typed array\n return new Promise(function (resolve, reject) {\n var bytesTyped = Array.isArray(bytes) ? bin_utils_1.convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n // @ts-ignore\n _this.webCrypto.digest({ name: 'SHA-1' }, bytesTyped).then(function (digest) {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, function (e) {\n console.error('Crypto digest error', e);\n _this.useSha1Crypto = false;\n resolve(bin_utils_1.sha1HashSync(bytes));\n });\n });\n }\n return Promise.resolve(bin_utils_1.sha1HashSync(bytes));\n };\n CryptoWorker.prototype.sha256Hash = function (bytes) {\n var _this = this;\n if (this.useSha256Crypto) {\n return new Promise(function (resolve, reject) {\n var bytesTyped = Array.isArray(bytes) ? bin_utils_1.convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n // @ts-ignore\n _this.webCrypto.digest({ name: 'SHA-256' }, bytesTyped).then(function (digest) {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, function (e) {\n console.error('Crypto digest error', e);\n _this.useSha256Crypto = false;\n resolve(bin_utils_1.sha256HashSync(bytes));\n });\n });\n }\n return Promise.resolve(bin_utils_1.sha256HashSync(bytes));\n };\n CryptoWorker.prototype.pbkdf2 = function (/* hasher: 'string', */ buffer, salt, iterations) {\n return bin_utils_1.hash_pbkdf2(buffer, salt, iterations);\n return this.performTaskWorker('pbkdf2', {\n /* hasher, */\n buffer: buffer,\n salt: salt,\n iterations: iterations\n });\n };\n CryptoWorker.prototype.aesEncrypt = function (bytes, keyBytes, ivBytes) {\n if (this.naClEmbed) {\n return this.performTaskWorker('aes-encrypt', {\n bytes: bin_utils_1.addPadding(bin_utils_1.convertToArrayBuffer(bytes)),\n keyBytes: bin_utils_1.convertToArrayBuffer(keyBytes),\n ivBytes: bin_utils_1.convertToArrayBuffer(ivBytes)\n }, this.naClEmbed);\n }\n return Promise.resolve(bin_utils_1.convertToArrayBuffer(bin_utils_1.aesEncryptSync(bytes, keyBytes, ivBytes)));\n };\n CryptoWorker.prototype.aesDecrypt = function (encryptedBytes, keyBytes, ivBytes) {\n if (this.naClEmbed) {\n return this.performTaskWorker('aes-decrypt', {\n encryptedBytes: bin_utils_1.addPadding(bin_utils_1.convertToArrayBuffer(encryptedBytes)),\n keyBytes: bin_utils_1.convertToArrayBuffer(keyBytes),\n ivBytes: bin_utils_1.convertToArrayBuffer(ivBytes)\n }, this.naClEmbed);\n }\n return Promise.resolve(bin_utils_1.convertToArrayBuffer(bin_utils_1.aesDecryptSync(encryptedBytes, keyBytes, ivBytes)));\n };\n CryptoWorker.prototype.factorize = function (bytes) {\n bytes = bin_utils_1.convertToByteArray(bytes);\n if (this.naClEmbed && bytes.length <= 8) {\n return this.performTaskWorker('factorize', { bytes: bytes }, this.naClEmbed);\n }\n if (this.webWorker) {\n return this.performTaskWorker('factorize', { bytes: bytes });\n }\n return Promise.resolve(bin_utils_1.pqPrimeFactorization(bytes));\n };\n CryptoWorker.prototype.modPow = function (x, y, m) {\n if (this.webWorker) {\n return this.performTaskWorker('mod-pow', {\n x: x,\n y: y,\n m: m\n });\n }\n return Promise.resolve(bin_utils_1.bytesModPow(x, y, m));\n };\n return CryptoWorker;\n}());\nexports.default = new CryptoWorker();\n"
},
{
"id": 17,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"name": "./src/lib/richtextprocessor.js",
"index": 36,
"index2": 34,
"size": 26053,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"issuerId": 12,
"issuerName": "./src/lib/services.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1102,
"building": 243,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./richtextprocessor",
"loc": "40:26-56"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/richtextprocessor",
"loc": "15:26-61"
}
],
"usedExports": true,
"providedExports": [
"RichTextProcessor"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/pageSignIn.ts (referenced with cjs require), ./src/lib/services.ts (referenced with cjs require)"
],
"depth": 2,
"source": "import {encodeEntities, copy, emojiUnicode} from './utils';\r\n\r\nvar EmojiHelper = {\r\n emojiMap: (code) => { return code; },\r\n shortcuts: [],\r\n emojis: []\r\n};\r\n\r\nvar emojiData = Config.Emoji;\r\nvar emojiIconSize = emojiData.img_size;\r\nvar emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i) != -1,\r\n emojiCode;\r\n//var emojiRegExp = '\\\\u0023\\\\u20E3|\\\\u00a9|\\\\u00ae|\\\\u203c|\\\\u2049|\\\\u2139|[\\\\u2194-\\\\u2199]|\\\\u21a9|\\\\u21aa|\\\\u231a|\\\\u231b|\\\\u23e9|[\\\\u23ea-\\\\u23ec]|\\\\u23f0|\\\\u24c2|\\\\u25aa|\\\\u25ab|\\\\u25b6|\\\\u2611|\\\\u2614|\\\\u26fd|\\\\u2705|\\\\u2709|[\\\\u2795-\\\\u2797]|\\\\u27a1|\\\\u27b0|\\\\u27bf|\\\\u2934|\\\\u2935|[\\\\u2b05-\\\\u2b07]|\\\\u2b1b|\\\\u2b1c|\\\\u2b50|\\\\u2b55|\\\\u3030|\\\\u303d|\\\\u3297|\\\\u3299|[\\\\uE000-\\\\uF8FF\\\\u270A-\\\\u2764\\\\u2122\\\\u25C0\\\\u25FB-\\\\u25FE\\\\u2615\\\\u263a\\\\u2648-\\\\u2653\\\\u2660-\\\\u2668\\\\u267B\\\\u267F\\\\u2693\\\\u261d\\\\u26A0-\\\\u26FA\\\\u2708\\\\u2702\\\\u2601\\\\u260E]|[\\\\u2600\\\\u26C4\\\\u26BE\\\\u23F3\\\\u2764]|\\\\uD83D[\\\\uDC00-\\\\uDFFF]|\\\\uD83C[\\\\uDDE8-\\\\uDDFA\\uDDEC]\\\\uD83C[\\\\uDDEA-\\\\uDDFA\\uDDE7]|[0-9]\\\\u20e3|\\\\uD83C[\\\\uDC00-\\\\uDFFF]';\r\nvar emojiRegExp = '\\\\u00a9|\\\\u00ae|[\\\\u2000-\\\\u3300]|\\\\ud83c[\\\\ud000-\\\\udfff]|\\\\ud83d[\\\\ud000-\\\\udfff]|\\\\ud83e[\\\\ud000-\\\\udfff]';\r\nvar alphaCharsRegExp = 'a-z' +\r\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\r\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\r\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\r\n '\\\\u02bb' + // Hawaiian\r\n '\\\\u0300-\\\\u036f' + // Combining diacritics\r\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\r\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\r\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\r\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\r\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\r\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\r\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\r\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\r\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\r\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\r\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\r\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\r\n '\\\\u200c' + // Zero-Width Non-Joiner\r\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\r\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\r\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\r\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\r\n '\\\\uff66-\\\\uff9f' + // half width Katakana\r\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\r\nvar alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\r\nvar domainAddChars = '\\u00b7';\r\n// Based on Regular Expression for URL validation by Diego Perini\r\nvar urlRegExp = '((?:https?|ftp)://|mailto:)?' +\r\n // user:pass authentication\r\n '(?:\\\\S{1,64}(?::\\\\S{0,64})?@)?' +\r\n '(?:' +\r\n // sindresorhus/ip-regexp\r\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\r\n '|' +\r\n // host name\r\n '[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\r\n // domain name\r\n '(?:\\\\.[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\r\n // TLD identifier\r\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\r\n ')' +\r\n // port number\r\n '(?::\\\\d{2,5})?' +\r\n // resource path\r\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?'\r\nvar usernameRegExp = '[a-zA-Z\\\\d_]{5,32}'\r\nvar botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)'\r\nvar fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i')\r\nvar emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\nvar youtubeRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?youtu(?:|\\.be|be\\.com|\\.b)(?:\\/v\\/|\\/watch\\\\?v=|e\\/|(?:\\/\\??#)?\\/watch(?:.+)v=)(.{11})(?:\\&[^\\s]*)?/\r\nvar vimeoRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/\r\nvar instagramRegExp = /^https?:\\/\\/(?:instagr\\.am\\/p\\/|instagram\\.com\\/p\\/)([a-zA-Z0-9\\-\\_]+)/i\r\nvar vineRegExp = /^https?:\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9\\-\\_]+)/i\r\nvar twitterRegExp = /^https?:\\/\\/twitter\\.com\\/.+?\\/status\\/\\d+/i\r\nvar facebookRegExp = /^https?:\\/\\/(?:www\\.|m\\.)?facebook\\.com\\/(?:.+?\\/posts\\/\\d+|(?:story\\.php|permalink\\.php)\\?story_fbid=(\\d+)(?:&substory_index=\\d+)?&id=(\\d+))/i\r\nvar gplusRegExp = /^https?:\\/\\/plus\\.google\\.com\\/\\d+\\/posts\\/[a-zA-Z0-9\\-\\_]+/i\r\nvar soundcloudRegExp = /^https?:\\/\\/(?:soundcloud\\.com|snd\\.sc)\\/([a-zA-Z0-9%\\-\\_]+)\\/([a-zA-Z0-9%\\-\\_]+)/i\r\nvar spotifyRegExp = /(https?:\\/\\/(open\\.spotify\\.com|play\\.spotify\\.com|spoti\\.fi)\\/(.+)|spotify:(.+))/i\r\nvar markdownTestRegExp = /[`_*@]/\r\nvar markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)/m\r\nvar siteHashtags = {\r\n Telegram: 'tg://search_hashtag?hashtag={1}',\r\n Twitter: 'https://twitter.com/hashtag/{1}',\r\n Instagram: 'https://instagram.com/explore/tags/{1}/',\r\n 'Google Plus': 'https://plus.google.com/explore/{1}'\r\n}\r\nvar siteMentions = {\r\n Telegram: '#/im?p=%40{1}',\r\n Twitter: 'https://twitter.com/{1}',\r\n Instagram: 'https://instagram.com/{1}/',\r\n GitHub: 'https://github.com/{1}'\r\n}\r\nvar markdownEntities = {\r\n '`': 'messageEntityCode',\r\n '**': 'messageEntityBold',\r\n '__': 'messageEntityItalic'\r\n}\r\nfunction getEmojiSpritesheetCoords(emojiCode) {\r\n /* var i\r\n var row, column\r\n var totalColumns\r\n for (var cat = 0; cat < Config.EmojiCategories.length; cat++) {\r\n totalColumns = Config.EmojiCategorySpritesheetDimens[cat][1]\r\n i = Config.EmojiCategories[cat].indexOf(emojiCode)\r\n if (i > -1) {\r\n row = Math.floor(i / totalColumns)\r\n column = (i % totalColumns)\r\n return { category: cat, row: row, column: column }\r\n }\r\n }\r\n console.error('emoji not found in spritesheet', emojiCode)\r\n return null */\r\n emojiCode = emojiUnicode(emojiCode);\r\n\r\n let emojiInfo = emojiData.emoji.find((e) => e.unified == emojiCode);\r\n if(!emojiInfo) {\r\n //console.error('no emoji by code:', emojiCode);\r\n return null;\r\n }\r\n\r\n let sheetNo = (emojiInfo.sheet_x / 6 | 0) + 1;\r\n\r\n /* let xPos = 100 * (((emojiInfo.sheet_x * (img_size + 2)) + 1) / (sheetSizeX - img_size));\r\n let yPos = 100 * (((emojiInfo.sheet_y * (img_size + 2)) + 1) / (sheetSizeY - img_size)); */\r\n let xPos = emojiInfo.sheet_x * emojiData.multiplyX;\r\n let yPos = 100 / 52 * emojiInfo.sheet_y;\r\n\r\n if(emojiInfo.sheet_x != 2 && emojiInfo.sheet_x != 3) {\r\n xPos += ((emojiInfo.sheet_x + 1) > (6 / 2) ? -1 : 1) * 100 / 204;\r\n }\r\n\r\n //console.log({row: yPos, column: xPos, sheetNo});\r\n\r\n return {row: yPos, column: xPos, sheetNo};\r\n}\r\nfunction parseEntities (text, options) {\r\n options = options || {}\r\n var match\r\n var raw = text,\r\n url\r\n var entities = [],\r\n emojiCode = '',\r\n emojiCoords,\r\n matchIndex\r\n var rawOffset = 0\r\n // var start = tsNow()\r\n while ((match = raw.match(fullRegExp))) {\r\n matchIndex = rawOffset + match.index;\r\n\r\n if(match[3]) { // mentions\r\n entities.push({\r\n _: 'messageEntityMention',\r\n offset: matchIndex + match[1].length,\r\n length: match[2].length + match[3].length\r\n });\r\n } else if(match[4]) {\r\n if(emailRegExp.test(match[4])) { // email\r\n entities.push({\r\n _: 'messageEntityEmail',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n } else {\r\n var url = false;\r\n var protocol = match[5];\r\n var tld = match[6];\r\n var excluded = '';\r\n if(tld) { // URL\r\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\r\n protocol = 'http://';\r\n }\r\n\r\n if(protocol) {\r\n var balanced = checkBrackets(match[4]);\r\n if (balanced.length !== match[4].length) {\r\n excluded = match[4].substring(balanced.length);\r\n match[4] = balanced;\r\n }\r\n\r\n url = (match[5] ? '' : protocol) + match[4];\r\n }\r\n } else { // IP address\r\n url = (match[5] ? '' : 'http://') + match[4];\r\n }\r\n\r\n if (url) {\r\n entities.push({\r\n _: 'messageEntityUrl',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n }\r\n }\r\n } else if(match[7]) { // New line\r\n entities.push({\r\n _: 'messageEntityLinebreak',\r\n offset: matchIndex,\r\n length: 1\r\n });\r\n } else if(match[8]/* && !emojiSupported */) { // Emoji\r\n if(emojiCode) matchIndex -= match[8].length;\r\n emojiCode += match[8];\r\n console.log('hit', match[8], emojiCode.length);\r\n if((emojiCoords = getEmojiSpritesheetCoords(emojiCode))) {\r\n entities.push({\r\n _: 'messageEntityEmoji',\r\n offset: matchIndex,\r\n length: emojiCode.length,\r\n coords: emojiCoords/* ,\r\n title: emojiData[emojiCode][1][0] */\r\n });\r\n\r\n emojiCode = '';\r\n }\r\n } else if(match[10]) { // Hashtag\r\n entities.push({\r\n _: 'messageEntityHashtag',\r\n offset: matchIndex + match[9].length,\r\n length: match[10].length\r\n });\r\n } else if(match[12]) { // Bot command\r\n entities.push({\r\n _: 'messageEntityBotCommand',\r\n offset: matchIndex + match[11].length,\r\n length: 1 + match[12].length + (match[13] ? 1 + match[13].length : 0)\r\n });\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n rawOffset += match.index + match[0].length;\r\n }\r\n\r\n // if (entities.length) {\r\n // console.log('parse entities', text, entities.slice())\r\n // }\r\n return entities\r\n}\r\nfunction parseEmojis (text) {\r\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\r\n var emojiCode = EmojiHelper.shortcuts[shortcut]\r\n if (emojiCode !== undefined) {\r\n return EmojiHelper.emojis[emojiCode][0]\r\n }\r\n return all\r\n })\r\n}\r\nfunction parseMarkdown (text, entities, noTrim) {\r\n  if (!markdownTestRegExp.test(text)) {\r\n return noTrim ? text : text.trim()\r\n }\r\n var raw = text\r\n var match\r\n var newText = []\r\n var rawOffset = 0\r\n var matchIndex\r\n while (match = raw.match(markdownRegExp)) {\r\n matchIndex = rawOffset + match.index\r\n newText.push(raw.substr(0, match.index))\r\n var text = (match[3] || match[8] || match[11])\r\n rawOffset -= text.length\r\n text = text.replace(/^\\s+|\\s+$/g, '')\r\n rawOffset += text.length\r\n if (text.match(/^`*$/)) {\r\n newText.push(match[0])\r\n }\r\n else if (match[3]) { // pre\r\n if (match[5] == '\\n') {\r\n match[5] = ''\r\n rawOffset -= 1\r\n }\r\n newText.push(match[1] + text + match[5])\r\n entities.push({\r\n _: 'messageEntityPre',\r\n language: '',\r\n offset: matchIndex + match[1].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[2].length + match[4].length\r\n } else if (match[7]) { // code|italic|bold\r\n newText.push(match[6] + text + match[9])\r\n entities.push({\r\n _: markdownEntities[match[7]],\r\n offset: matchIndex + match[6].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[7].length * 2\r\n } else if (match[11]) { // custom mention\r\n newText.push(text)\r\n entities.push({\r\n _: 'messageEntityMentionName',\r\n user_id: match[10],\r\n offset: matchIndex,\r\n length: text.length\r\n })\r\n rawOffset -= match[0].length - text.length\r\n }\r\n raw = raw.substr(match.index + match[0].length)\r\n rawOffset += match.index + match[0].length\r\n }\r\n newText.push(raw)\r\n newText = newText.join('')\r\n if (!newText.replace(/\\s+/g, '').length) {\r\n newText = text\r\n entities.splice(0, entities.length)\r\n }\r\n if (!entities.length && !noTrim) {\r\n newText = newText.trim()\r\n }\r\n return newText\r\n}\r\nfunction mergeEntities (currentEntities, newEntities, fromApi) {\r\n var totalEntities = newEntities.slice()\r\n var i\r\n var len = currentEntities.length\r\n var j\r\n var len2 = newEntities.length\r\n var startJ = 0\r\n var curEntity\r\n var newEntity\r\n var start, end\r\n var cStart, cEnd\r\n var bad\r\n for (i = 0; i < len; i++) {\r\n curEntity = currentEntities[i]\r\n if (fromApi &&\r\n curEntity._ != 'messageEntityLinebreak' &&\r\n curEntity._ != 'messageEntityEmoji') {\r\n continue\r\n }\r\n // console.log('s', curEntity, newEntities)\r\n start = curEntity.offset\r\n end = start + curEntity.length\r\n bad = false\r\n for (j = startJ; j < len2; j++) {\r\n newEntity = newEntities[j]\r\n cStart = newEntity.offset\r\n cEnd = cStart + newEntity.length\r\n if (cStart <= start) {\r\n startJ = j\r\n }\r\n if (start >= cStart && start < cEnd ||\r\n end > cStart && end <= cEnd) {\r\n // console.log('bad', curEntity, newEntity)\r\n if (fromApi &&\r\n start >= cStart && end <= cEnd) {\r\n if (newEntity.nested === undefined) {\r\n newEntity.nested = []\r\n }\r\n curEntity.offset -= cStart\r\n newEntity.nested.push(copy(curEntity))\r\n }\r\n bad = true\r\n break\r\n }\r\n if (cStart >= end) {\r\n break\r\n }\r\n }\r\n if (bad) {\r\n continue\r\n }\r\n totalEntities.push(curEntity)\r\n }\r\n totalEntities.sort(function (a, b) {\r\n return a.offset - b.offset\r\n })\r\n // console.log('merge', currentEntities, newEntities, totalEntities)\r\n return totalEntities\r\n}\r\nfunction wrapRichNestedText (text, nested, options) {\r\n if (nested === undefined) {\r\n return encodeEntities(text)\r\n }\r\n options.hasNested = true\r\n return wrapRichText(text, {entities: nested, nested: true})\r\n}\r\nfunction wrapRichText (text, options = {}) {\r\n if(!text || !text.length) {\r\n return ''\r\n }\r\n\r\n var entities = options.entities;\r\n var contextSite = options.contextSite || 'Telegram';\r\n var contextExternal = contextSite != 'Telegram';\r\n var emojiFound = false;\r\n if(entities === undefined) {\r\n entities = parseEntities(text, options);\r\n }\r\n\r\n console.log('wrapRichText got entities:', text, entities);\r\n var len = entities.length;\r\n var entity;\r\n var entityText;\r\n var skipEntity;\r\n var url;\r\n var html = [];\r\n var lastOffset = 0;\r\n var curEmojiSize = options.emojiIconSize || emojiIconSize;\r\n for(var i = 0; i < len; i++) {\r\n entity = entities[i];\r\n if(entity.offset > lastOffset) {\r\n html.push(\r\n encodeEntities(text.substr(lastOffset, entity.offset - lastOffset))\r\n );\r\n } else if(entity.offset < lastOffset) {\r\n continue;\r\n }\r\n\r\n skipEntity = false;\r\n entityText = text.substr(entity.offset, entity.length);\r\n switch(entity._) {\r\n case 'messageEntityMention':\r\n var contextUrl = !options.noLinks && siteMentions[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var username = entityText.substr(1)\r\n var attr = ''\r\n if (options.highlightUsername &&\r\n options.highlightUsername.toLowerCase() == username.toLowerCase()) {\r\n attr = 'class=\"im_message_mymention\"'\r\n }\r\n html.push(\r\n '<a ',\r\n attr,\r\n contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\r\n ' href=\"',\r\n contextUrl.replace('{1}', encodeURIComponent(username)),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '<a href=\"#/im?p=u',\r\n encodeURIComponent(entity.user_id),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityHashtag':\r\n var contextUrl = !options.noLinks && siteHashtags[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var hashtag = entityText.substr(1)\r\n html.push(\r\n '<a ',\r\n contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\r\n 'href=\"',\r\n contextUrl.replace('{1}', encodeURIComponent(hashtag))\r\n ,\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityEmail':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities('mailto:' + entityText),\r\n '\" target=\"_blank\" rel=\"noopener noreferrer\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityUrl':\r\n case 'messageEntityTextUrl':\r\n var inner\r\n if (entity._ == 'messageEntityTextUrl') {\r\n url = entity.url\r\n url = wrapUrl(url, true)\r\n inner = wrapRichNestedText(entityText, entity.nested, options)\r\n } else {\r\n url = wrapUrl(entityText, false)\r\n inner = encodeEntities(replaceUrlEncodings(entityText))\r\n }\r\n if (options.noLinks) {\r\n html.push(inner);\r\n } else {\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities(url),\r\n '\" target=\"_blank\" rel=\"noopener noreferrer\">',\r\n inner,\r\n '</a>'\r\n )\r\n }\r\n break\r\n case 'messageEntityLinebreak':\r\n html.push(options.noLinebreaks ? ' ' : '<br/>')\r\n break\r\n case 'messageEntityEmoji':\r\n \r\n var inner = `<span class=\"emoji-inner\" style=\"background: url(${emojiData.sheetUrl}${entity.coords.sheetNo}.png);\r\n background-position:${entity.coords.column}% ${entity.coords.row}%;\r\n background-size:${emojiData.sizeX}% ${emojiData.sizeY}%\"></span>`;\r\n\r\n html.push(`<span class=\"emoji-outer emoji-sizer\">${emojiSupported ? encodeEntities(entityText) : inner}</span>`);\r\n /* html.push(\r\n '<span class=\"emoji emoji-',\r\n entity.coords.category,\r\n '-',\r\n (curEmojiSize * entity.coords.column),\r\n '-',\r\n (curEmojiSize * entity.coords.row),\r\n '\" ',\r\n 'title=\"', entity.title, '\">',\r\n ':', entity.title, ':</span>'\r\n ) */\r\n emojiFound = true;\r\n break\r\n case 'messageEntityBotCommand':\r\n if (options.noLinks || options.noCommands || contextExternal) {\r\n skipEntity = true\r\n break\r\n }\r\n var command = entityText.substr(1)\r\n var bot\r\n var atPos\r\n if ((atPos = command.indexOf('@')) != -1) {\r\n bot = command.substr(atPos + 1)\r\n command = command.substr(0, atPos)\r\n } else {\r\n bot = options.fromBot\r\n }\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : '')),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityBold':\r\n html.push(\r\n '<strong>',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n '</strong>'\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n html.push(\r\n '<em>',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n '</em>'\r\n )\r\n break\r\n case 'messageEntityCode':\r\n html.push(\r\n '<code>',\r\n encodeEntities(entityText),\r\n '</code>'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n html.push(\r\n '<pre><code', (entity.language ? ' class=\"language-' + encodeEntities(entity.language) + '\"' : ''), '>',\r\n encodeEntities(entityText),\r\n '</code></pre>'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n\r\n html.push(encodeEntities(text.substr(lastOffset)));\r\n console.log(html);\r\n text = html.join('')//$sanitize(html.join(''))\r\n /* if (!options.nested && (emojiFound || options.hasNested)) {\r\n text = text.replace(/\\ufe0f|&#65039;|&#65533;|&#8205;/g, '', text)\r\n var emojiSizeClass = curEmojiSize == 18 ? '' : (' emoji-w' + curEmojiSize)\r\n text = text.replace(/<span((?: [^>]*)?) class=\"emoji emoji-(\\d)-(\\d+)-(\\d+)\"(.+?)<\\/span>/g,\r\n '<span$1 class=\"emoji ' + emojiSizeClass + ' emoji-spritesheet-$2\" style=\"background-position: -$3px -$4px;\" $5</span>')\r\n } */\r\n return text;//$sce.trustAs('html', text)\r\n}\r\nfunction wrapDraftText (text, options) {\r\n if (!text || !text.length) {\r\n return ''\r\n }\r\n options = options || {}\r\n var entities = options.entities\r\n if (entities === undefined) {\r\n entities = parseEntities(text, options)\r\n }\r\n var i = 0\r\n var len = entities.length\r\n var entity\r\n var entityText\r\n var skipEntity\r\n var code = []\r\n var lastOffset = 0\r\n for (i = 0; i < len; i++) {\r\n entity = entities[i]\r\n if (entity.offset > lastOffset) {\r\n code.push(\r\n text.substr(lastOffset, entity.offset - lastOffset)\r\n )\r\n }\r\n else if (entity.offset < lastOffset) {\r\n continue\r\n }\r\n skipEntity = false\r\n entityText = text.substr(entity.offset, entity.length)\r\n switch (entity._) {\r\n case 'messageEntityEmoji':\r\n code.push(\r\n ':',\r\n entity.title,\r\n ':'\r\n )\r\n break\r\n case 'messageEntityCode':\r\n code.push(\r\n '`', entityText, '`'\r\n )\r\n break\r\n case 'messageEntityBold':\r\n code.push(\r\n '**', entityText, '**'\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n code.push(\r\n '__', entityText, '__'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n code.push(\r\n '```', entityText, '```'\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n code.push(\r\n '@', entity.user_id, ' (', entityText, ')'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n code.push(text.substr(lastOffset))\r\n return code.join('')\r\n}\r\nfunction checkBrackets (url) {\r\n var urlLength = url.length\r\n var urlOpenBrackets = url.split('(').length - 1\r\n var urlCloseBrackets = url.split(')').length - 1\r\n while (urlCloseBrackets > urlOpenBrackets &&\r\n url.charAt(urlLength - 1) === ')') {\r\n url = url.substr(0, urlLength - 1)\r\n urlCloseBrackets--\r\n urlLength--\r\n }\r\n if (urlOpenBrackets > urlCloseBrackets) {\r\n url = url.replace(/\\)+$/, '')\r\n }\r\n return url\r\n}\r\n\r\nfunction replaceUrlEncodings(urlWithEncoded) {\r\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, function (str) {\r\n try {\r\n return decodeURIComponent(str);\r\n } catch (e) {\r\n return str;\r\n }\r\n });\r\n}\r\n\r\nfunction wrapPlainText(text, options = {}) {\r\n if(emojiSupported) {\r\n return text;\r\n }\r\n\r\n if(!text || !text.length) {\r\n return '';\r\n }\r\n\r\n text = text.replace(/\\ufe0f/g, '', text);\r\n var match;\r\n var raw = text;\r\n var text = [],\r\n emojiTitle;\r\n while((match = raw.match(fullRegExp))) {\r\n text.push(raw.substr(0, match.index))\r\n if(match[8]) {\r\n if((emojiCode = EmojiHelper.emojiMap[match[8]]) &&\r\n (emojiTitle = emojiData[emojiCode][1][0])) {\r\n text.push(':' + emojiTitle + ':');\r\n } else {\r\n text.push(match[0]);\r\n }\r\n } else {\r\n text.push(match[0]);\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n }\r\n text.push(raw);\r\n return text.join('');\r\n}\r\nfunction wrapUrl (url, unsafe) {\r\n if (!url.match(/^https?:\\/\\//i)) {\r\n url = 'http://' + url\r\n }\r\n var tgMeMatch\r\n var telescoPeMatch\r\n if (unsafe == 2) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n else if ((tgMeMatch = url.match(/^https?:\\/\\/t(?:elegram)?\\.me\\/(.+)/))) {\r\n var fullPath = tgMeMatch[1]\r\n var path = fullPath.split('/')\r\n switch (path[0]) {\r\n case 'joinchat':\r\n url = 'tg://join?invite=' + path[1]\r\n break\r\n case 'addstickers':\r\n url = 'tg://addstickers?set=' + path[1]\r\n break\r\n default:\r\n if (path[1] && path[1].match(/^\\d+$/)) {\r\n url = 'tg://resolve?domain=' + path[0] + '&post=' + path[1]\r\n }\r\n else if (path.length == 1) {\r\n var domainQuery = path[0].split('?')\r\n var domain = domainQuery[0]\r\n var query = domainQuery[1]\r\n if (domain == 'iv') {\r\n var match = (query || '').match(/url=([^&=]+)/)\r\n if (match) {\r\n url = match[1]\r\n try {\r\n url = decodeURIComponent(url)\r\n } catch (e) {}\r\n return wrapUrl(url, unsafe)\r\n }\r\n }\r\n url = 'tg://resolve?domain=' + domain + (query ? '&' + query : '')\r\n }\r\n }\r\n }\r\n else if ((telescoPeMatch = url.match(/^https?:\\/\\/telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\r\n url = 'tg://resolve?domain=' + telescoPeMatch[1] + '&post=' + telescoPeMatch[2]\r\n }\r\n else if (unsafe) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n return url\r\n}\r\n\r\nlet RichTextProcessor = {\r\n wrapRichText: wrapRichText,\r\n wrapPlainText: wrapPlainText,\r\n wrapDraftText: wrapDraftText,\r\n wrapUrl: wrapUrl,\r\n parseEntities: parseEntities,\r\n parseMarkdown: parseMarkdown,\r\n parseEmojis: parseEmojis,\r\n mergeEntities: mergeEntities\r\n};\r\n\r\nwindow.RichTextProcessor = RichTextProcessor;\r\n\r\nexport {RichTextProcessor};\r\n\r\n"
},
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"index": 0,
"index2": 46,
"size": 3218,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": null,
"issuerId": null,
"issuerName": null,
"issuerPath": null,
"profile": {
"factory": 17,
"building": 2295
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": null,
"moduleIdentifier": null,
"module": null,
"moduleName": null,
"type": "single entry",
"userRequest": "./src/index.ts",
"loc": "main"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 0,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nrequire(\"./materialize.scss\");\nrequire(\"overlayscrollbars/css/OverlayScrollbars.min.css\");\nrequire(\"./scss/style.scss\");\nrequire(\"./scss/tgico.scss\");\nvar services_1 = require(\"./lib/services\");\n/*\nimport {MTProto} from './lib/mtproto';\nimport * as Config from './lib/config';\n\nimport OverlayScrollbars from 'overlayscrollbars';\n\nimport {putPreloader} from './components/misc';\nimport pageAuthCode from './components/pageAuthCode';\nimport pageSignUp from './components/pageSignUp'; */\nvar pageIm_1 = __importDefault(require(\"./components/pageIm\"));\nvar mtproto_1 = require(\"./lib/mtproto\");\nvar pageSignIn_1 = __importDefault(require(\"./components/pageSignIn\"));\n//import '@lottiefiles/lottie-player';\n/* import registerServiceWorker from './registerServiceWorker';\n\nregisterServiceWorker(); */\n// @ts-ignore\nwindow.scrollbarOptions = {\n className: 'scroll',\n sizeAutoCapable: true,\n paddingAbsolute: true,\n autoUpdate: true,\n scrollbars: {\n autoHide: \"leave\",\n autoHideDelay: 200,\n clickScrolling: true\n },\n textarea: {\n dynHeight: true\n }\n};\ndocument.addEventListener('DOMContentLoaded', function () {\n /* pageAuthCode({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"98008787f0546e7419\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"+380509144504\"\n }); */\n //pagePassword();\n var user = services_1.appUsersManager.getSelf();\n if (!user.id) {\n pageSignIn_1.default();\n console.log('need auth');\n }\n else {\n pageIm_1.default();\n mtproto_1.MTProto.apiManager.invokeApi('help.getNearestDc', {}).then(function (nearestDcResult) {\n if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n mtproto_1.MTProto.apiManager.getNetworker(nearestDcResult.nearest_dc, { createNetworker: true });\n }\n });\n }\n /* pageSignUp({\n \"phone_number\": \"+380509144504\",\n \"phone_code_hash\": \"48491\"\n }); */\n //MTProto.apiFileManager.uploadFile(photo).then(function (inputFile) {\n //console.log('uploaded smthn', inputFile);\n /* MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile,\n caption: '',\n geo_point: {_: 'inputGeoPointEmpty'}\n }).then(function (updateResult) {\n AppUsersManager.saveApiUsers(updateResult.users)\n MtpApiManager.getUserID().then(function (id) {\n AppPhotosManager.savePhoto(updateResult.photo, {\n user_id: id\n })\n ApiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateUserPhoto',\n user_id: id,\n date: tsNow(true),\n photo: AppUsersManager.getUser(id).photo,\n previous: true\n }\n })\n $scope.photo = {}\n })\n }) */\n //});\n});\n"
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"index": 1,
"index2": 3,
"size": 504,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./materialize.scss",
"loc": "6:0-29"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../node_modules/css-loader/dist/cjs.js!../node_modules/resolve-url-loader/index.js!../node_modules/sass-loader/dist/cjs.js??ref--4-3!./materialize.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 20,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"index": 2,
"index2": 1,
"size": 57453,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"issuerId": 19,
"issuerName": "./src/materialize.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 187,
"building": 2741,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 19,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./src/materialize.scss",
"moduleName": "./src/materialize.scss",
"type": "cjs require",
"userRequest": "!!../node_modules/css-loader/dist/cjs.js!../node_modules/resolve-url-loader/index.js!../node_modules/sass-loader/dist/cjs.js??ref--4-3!./materialize.scss",
"loc": "1:14-178"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=\\\"button\\\"],[type=\\\"reset\\\"],[type=\\\"submit\\\"]{-webkit-appearance:button}button::-moz-focus-inner,[type=\\\"button\\\"]::-moz-focus-inner,[type=\\\"reset\\\"]::-moz-focus-inner,[type=\\\"submit\\\"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=\\\"button\\\"]:-moz-focusring,[type=\\\"reset\\\"]:-moz-focusring,[type=\\\"submit\\\"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=\\\"checkbox\\\"],[type=\\\"radio\\\"]{box-sizing:border-box;padding:0}[type=\\\"number\\\"]::-webkit-inner-spin-button,[type=\\\"number\\\"]::-webkit-outer-spin-button{height:auto}[type=\\\"search\\\"]{-webkit-appearance:textfield;outline-offset:-2px}[type=\\\"search\\\"]::-webkit-search-cancel-button,[type=\\\"search\\\"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\\\"Helvetica Neue\\\",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:flex;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{transition:box-shadow .25s}.hoverable:hover{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^=\\\"mdi-\\\"],.breadcrumb [class*=\\\"mdi-\\\"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\\\\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;transform:translate3d(0, 0, 0);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:flex;align-items:center;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\\\\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:\\\"\\\\00a0\\\"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select{user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:\\\"\\\";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=\\\"push-\\\"],.row .col[class*=\\\"pull-\\\"]{position:relative}.row .col.s1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.33333%}.row .col.pull-s1{right:8.33333%}.row .col.push-s1{left:8.33333%}.row .col.offset-s2{margin-left:16.66667%}.row .col.pull-s2{right:16.66667%}.row .col.push-s2{left:16.66667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.33333%}.row .col.pull-s4{right:33.33333%}.row .col.push-s4{left:33.33333%}.row .col.offset-s5{margin-left:41.66667%}.row .col.pull-s5{right:41.66667%}.row .col.push-s5{left:41.66667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.33333%}.row .col.pull-s7{right:58.33333%}.row .col.push-s7{left:58.33333%}.row .col.offset-s8{margin-left:66.66667%}.row .col.pull-s8{right:66.66667%}.row .col.push-s8{left:66.66667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.33333%}.row .col.pull-s10{right:83.33333%}.row .col.push-s10{left:83.33333%}.row .col.offset-s11{margin-left:91.66667%}.row .col.pull-s11{right:91.66667%}.row .col.push-s11{left:91.66667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.33333%}.row .col.pull-m1{right:8.33333%}.row .col.push-m1{left:8.33333%}.row .col.offset-m2{margin-left:16.66667%}.row .col.pull-m2{right:16.66667%}.row .col.push-m2{left:16.66667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.33333%}.row .col.pull-m4{right:33.33333%}.row .col.push-m4{left:33.33333%}.row .col.offset-m5{margin-left:41.66667%}.row .col.pull-m5{right:41.66667%}.row .col.push-m5{left:41.66667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.33333%}.row .col.pull-m7{right:58.33333%}.row .col.push-m7{left:58.33333%}.row .col.offset-m8{margin-left:66.66667%}.row .col.pull-m8{right:66.66667%}.row .col.push-m8{left:66.66667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.33333%}.row .col.pull-m10{right:83.33333%}.row .col.push-m10{left:83.33333%}.row .col.offset-m11{margin-left:91.66667%}.row .col.pull-m11{right:91.66667%}.row .col.push-m11{left:91.66667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.33333%}.row .col.pull-l1{right:8.33333%}.row .col.push-l1{left:8.33333%}.row .col.offset-l2{margin-left:16.66667%}.row .col.pull-l2{right:16.66667%}.row .col.push-l2{left:16.66667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.33333%}.row .col.pull-l4{right:33.33333%}.row .col.push-l4{left:33.33333%}.row .col.offset-l5{margin-left:41.66667%}.row .col.pull-l5{right:41.66667%}.row .col.push-l5{left:41.66667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.33333%}.row .col.pull-l7{right:58.33333%}.row .col.push-l7{left:58.33333%}.row .col.offset-l8{margin-left:66.66667%}.row .col.pull-l8{right:66.66667%}.row .col.push-l8{left:66.66667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.33333%}.row .col.pull-l10{right:83.33333%}.row .col.push-l10{left:83.33333%}.row .col.offset-l11{margin-left:91.66667%}.row .col.pull-l11{right:91.66667%}.row .col.push-l11{left:91.66667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.33333%}.row .col.pull-xl1{right:8.33333%}.row .col.push-xl1{left:8.33333%}.row .col.offset-xl2{margin-left:16.66667%}.row .col.pull-xl2{right:16.66667%}.row .col.push-xl2{left:16.66667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.33333%}.row .col.pull-xl4{right:33.33333%}.row .col.push-xl4{left:33.33333%}.row .col.offset-xl5{margin-left:41.66667%}.row .col.pull-xl5{right:41.66667%}.row .col.push-xl5{left:41.66667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.33333%}.row .col.pull-xl7{right:58.33333%}.row .col.push-xl7{left:58.33333%}.row .col.offset-xl8{margin-left:66.66667%}.row .col.pull-xl8{right:66.66667%}.row .col.push-xl8{left:66.66667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.33333%}.row .col.pull-xl10{right:83.33333%}.row .col.push-xl10{left:83.33333%}.row .col.offset-xl11{margin-left:91.66667%}.row .col.pull-xl11{right:91.66667%}.row .col.push-xl11{left:91.66667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\\\"Helvetica Neue\\\",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.37333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.94667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.09333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.76667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}\\n\", \"\"]);\n"
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"index": 5,
"index2": 5,
"size": 399,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "overlayscrollbars/css/OverlayScrollbars.min.css",
"loc": "7:0-58"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../css-loader/dist/cjs.js!./OverlayScrollbars.min.css\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 22,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"index": 6,
"index2": 4,
"size": 19610,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerId": 21,
"issuerName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 185,
"building": 23
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 21,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "!!../../css-loader/dist/cjs.js!./OverlayScrollbars.min.css",
"loc": "1:14-83"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"/*!\\n * OverlayScrollbars\\n * https://github.com/KingSora/OverlayScrollbars\\n *\\n * Version: 1.10.0\\n *\\n * Copyright KingSora | Rene Haas.\\n * https://github.com/KingSora\\n *\\n * Released under the MIT license.\\n * Date: 11.10.2019\\n */\\nhtml.os-html,html.os-html>.os-host{display:block;overflow:hidden;box-sizing:border-box;height:100%!important;width:100%!important;min-width:100%!important;min-height:100%!important;margin:0!important;position:absolute!important}html.os-html>.os-host>.os-padding{position:absolute}body.os-dragging,body.os-dragging *{cursor:default}.os-host,.os-host-textarea{position:relative;overflow:visible!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;-ms-grid-row-align:flex-start;align-items:flex-start}.os-host-flexbox{overflow:hidden!important;display:-webkit-box;display:-ms-flexbox;display:flex}.os-host-flexbox>.os-size-auto-observer{height:inherit!important}.os-host-flexbox>.os-content-glue{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.os-host-flexbox>.os-size-auto-observer,.os-host-flexbox>.os-content-glue{min-height:0;min-width:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}#os-dummy-scrollbar-size{position:fixed;opacity:0;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';visibility:hidden;overflow:scroll;height:500px;width:500px}#os-dummy-scrollbar-size>div{width:200%;height:200%;margin:10px 0}#os-dummy-scrollbar-size,.os-viewport{-ms-overflow-style:scrollbar!important}.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size,.os-viewport-native-scrollbars-invisible.os-viewport{scrollbar-width:none!important}.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar-corner,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner{display:none!important;width:0!important;height:0!important;visibility:hidden!important;background:0 0!important}.os-content-glue{box-sizing:inherit;max-height:100%;max-width:100%;width:100%;pointer-events:none}.os-padding{box-sizing:inherit;direction:inherit;position:absolute;overflow:visible;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:1}.os-host-overflow>.os-padding{overflow:hidden}.os-viewport{direction:inherit!important;box-sizing:inherit!important;resize:none!important;outline:0!important;position:absolute;overflow:hidden;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.os-content-arrange{position:absolute;z-index:-1;min-height:1px;min-width:1px;pointer-events:none}.os-content{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:100%;height:100%;width:100%;visibility:visible}.os-content:before,.os-content:after{content:'';display:table;width:0;height:0;line-height:0;font-size:0}.os-content>.os-textarea{box-sizing:border-box!important;direction:inherit!important;background:0 0!important;outline:0 transparent!important;overflow:hidden!important;position:absolute!important;display:block!important;top:0!important;left:0!important;margin:0!important;border-radius:0!important;float:none!important;-webkit-filter:none!important;filter:none!important;border:0!important;resize:none!important;-webkit-transform:none!important;transform:none!important;max-width:none!important;max-height:none!important;box-shadow:none!important;-webkit-perspective:none!important;perspective:none!important;opacity:1!important;z-index:1!important;clip:auto!important;vertical-align:baseline!important;padding:0}.os-host-rtl>.os-padding>.os-viewport>.os-content>.os-textarea{right:0!important}.os-content>.os-textarea-cover{z-index:-1;pointer-events:none}.os-content>.os-textarea[wrap=off]{white-space:pre!important;margin:0!important}.os-text-inherit{font-family:inherit;font-size:inherit;font-weight:inherit;font-style:inherit;font-variant:inherit;text-transform:inherit;text-decoration:inherit;text-indent:inherit;text-align:inherit;text-shadow:inherit;text-overflow:inherit;letter-spacing:inherit;word-spacing:inherit;line-height:inherit;unicode-bidi:inherit;direction:inherit;color:inherit;cursor:text}.os-resize-observer,.os-resize-observer-host{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.os-resize-observer-host{padding:inherit;border:inherit;border-color:transparent;border-style:solid;box-sizing:border-box}.os-resize-observer-host:after{content:''}.os-resize-observer-host>.os-resize-observer,.os-resize-observer-host:after{height:200%;width:200%;padding:inherit;border:inherit;margin:0;display:block;box-sizing:content-box}.os-resize-observer.observed,object.os-resize-observer{box-sizing:border-box!important}.os-size-auto-observer{box-sizing:inherit!important;height:100%;width:inherit;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;-webkit-box-flex:inherit;-ms-flex-positive:inherit;flex-grow:inherit;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:0;flex-basis:0}.os-size-auto-observer>.os-resize-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-resize-observer-item{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;opacity:0;direction:ltr!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer-item-final{position:absolute;left:0;top:0;-webkit-transition:none!important;transition:none!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer{-webkit-animation-duration:.001s;animation-duration:.001s;-webkit-animation-name:hs-resize-observer-dummy-animation;animation-name:hs-resize-observer-dummy-animation}.os-host-transition>.os-scrollbar,.os-host-transition>.os-scrollbar-corner{-webkit-transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s;transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s}html.os-html>.os-host>.os-scrollbar{position:absolute;z-index:999999}.os-scrollbar,.os-scrollbar-corner{position:absolute;opacity:1;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';z-index:1}.os-scrollbar-corner{bottom:0;right:0}.os-scrollbar{pointer-events:none}.os-scrollbar-track{pointer-events:auto;position:relative;height:100%;width:100%;padding:0!important;border:0!important}.os-scrollbar-handle{pointer-events:auto;position:absolute;width:100%;height:100%}.os-scrollbar-handle-off,.os-scrollbar-track-off{pointer-events:none}.os-scrollbar.os-scrollbar-unusable,.os-scrollbar.os-scrollbar-unusable *{pointer-events:none!important}.os-scrollbar.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-host-rtl>.os-scrollbar-horizontal{right:0}.os-host-rtl>.os-scrollbar-vertical{right:auto;left:0}.os-host-rtl>.os-scrollbar-corner{right:auto;left:0}.os-scrollbar-auto-hidden,.os-padding+.os-scrollbar-corner,.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-corner,.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal,.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-corner,.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical+.os-scrollbar-corner,.os-scrollbar-horizontal+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner{opacity:0;visibility:hidden;pointer-events:none}.os-scrollbar-corner-resize-both{cursor:nwse-resize}.os-host-rtl>.os-scrollbar-corner-resize-both{cursor:nesw-resize}.os-scrollbar-corner-resize-horizontal{cursor:ew-resize}.os-scrollbar-corner-resize-vertical{cursor:ns-resize}.os-dragging .os-scrollbar-corner.os-scrollbar-corner-resize{cursor:default}.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-vertical{top:0;bottom:0}.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal,.os-host-rtl.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal{right:0;left:0}.os-scrollbar:hover,.os-scrollbar-corner.os-scrollbar-corner-resize{opacity:1!important;visibility:visible!important}.os-scrollbar-corner.os-scrollbar-corner-resize{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB3aWR0aD0iMTAiICAgaGVpZ2h0PSIxMCIgICB2ZXJzaW9uPSIxLjEiPiAgPGcgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwNDIuMzYyMikiICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQ5NDExNzY1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDcuNDI0MjE4NywxMDQyLjM2MjIgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjYgLTEuMzEwMTU2MiwxLjMxMDIgMCwwLjI5OSAwLjEwNDM0MTksMC41NzEgMC4yNzI5NDkyLDAuNzkxNSAwLjIwOTEwMjQsMC4xNDEzIDAuNDY1NjIwNiwwLjIxODQgMC43MzY5NjI5LDAuMjE4NCAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NiAxLjMxMDE1NjMsLTEuMzEwMiAwLC0wLjI3MTMgLTAuMDc3MDkzLC0wLjUyNzggLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0MSwtMC4xNjg2IC0wLjQ5MjU0NDMsLTAuMjcyOSAtMC43OTE1NTI4LC0wLjI3MjkgeiBtIDAsMy4wODQzIGMgLTAuNzIzNTc5MiwwIC0xLjMxMDE1NjIsMC41ODY2IC0xLjMxMDE1NjIsMS4zMTAyIDAsMC4yOTkgMC4xMDQzNDE5LDAuNTcxIDAuMjcyOTQ5MiwwLjc5MTUgMC4yMDkxMDI0LDAuMTQxMyAwLjQ2NTYyMDYsMC4yMTg0IDAuNzM2OTYyOSwwLjIxODQgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjYgMS4zMTAxNTYzLC0xLjMxMDIgMCwtMC4yNzEzIC0wLjA3NzA5MywtMC41Mjc4IC0wLjIxODM1OTQsLTAuNzM2OSAtMC4yMjA0OTQxLC0wLjE2ODYgLTAuNDkyNTQ0MywtMC4yNzMgLTAuNzkxNTUyOCwtMC4yNzMgeiBtIC0zLjA4NDMyNjEsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NiAtMS4zMTAxNTYzLDEuMzEwMiAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MSAwLjI3Mjk0OTIsMC43OTE1IDAuMjA5MTAyNCwwLjE0MTMgMC40NjU2MjA3LDAuMjE4NCAwLjczNjk2MjksMC4yMTg0IDAuNzIzNTc5MywwIDEuMzEwMTU2MywtMC41ODY2IDEuMzEwMTU2MywtMS4zMTAyIDAsLTAuMjcxMyAtMC4wNzcwOTMsLTAuNTI3OCAtMC4yMTgzNTk0LC0wLjczNjkgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzMgLTAuNzkxNTUyNywtMC4yNzMgeiBtIC0zLjAyOTczNjQsMy4wMjk4IEMgMC41ODY1NzY5MywxMDQ4LjQ3NjMgMCwxMDQ5LjA2MjggMCwxMDQ5Ljc4NjQgYyAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyMiwwLjc5MTYgMC4yMDkxMDIyOSwwLjE0MTIgMC40NjU2MjA2NSwwLjIxODMgMC43MzY5NjI4OCwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHogbSAzLjAyOTczNjQsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NSAtMS4zMTAxNTYzLDEuMzEwMSAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyLDAuNzkxNiAwLjIwOTEwMjQsMC4xNDEyIDAuNDY1NjIwNywwLjIxODMgMC43MzY5NjI5LDAuMjE4MyAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NSAxLjMxMDE1NjMsLTEuMzEwMSAwLC0wLjI3MTQgLTAuMDc3MDkzLC0wLjUyNzkgLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzI5IC0wLjc5MTU1MjcsLTAuMjcyOSB6IG0gMy4wODQzMjYxLDAgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjUgLTEuMzEwMTU2MiwxLjMxMDEgMCwwLjI5OSAwLjEwNDM0MTksMC41NzExIDAuMjcyOTQ5MiwwLjc5MTYgMC4yMDkxMDI0LDAuMTQxMiAwLjQ2NTYyMDYsMC4yMTgzIDAuNzM2OTYyOSwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHoiLz4gIDwvZz4gIDxnICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDguMjE1NzcxNSwwLjI3Mjk0OTIyIGMgMC4xNDEyNjY3LDAuMjA5MTAyMjkgMC4yMTgzNTk0LDAuNDY1NjIwNjUgMC4yMTgzNTk0LDAuNzM2OTYyODggMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDc2IC0wLjIwNTUxNzYsLTAuNzk3Nzk2NTkgLTAuNTE4NjAzNSwtMS4wMzcyMDY5OCB6IG0gMCwzLjA4NDMyNjE4IGMgMC4xNDEyNjY3LDAuMjA5MTAyMyAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MiAtMS4zMTAxNTYzLDEuMzEwMTU2MiAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTkzIDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAtMy4wODQzMjYyLDAgYyAwLjE0MTI2NjcsMC4yMDkxMDIzIDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYyIC0xLjMxMDE1NjMsMS4zMTAxNTYyIC0wLjI3MTM0MjIsMCAtMC41Mjc4NjA1LC0wLjA3NzA5MyAtMC43MzY5NjI5LC0wLjIxODM1OTMgMC4yMzk0MTA0LDAuMzEzMDg1OSAwLjYxMjYzNjMsMC41MTg2MDM1IDEuMDM3MjA3MSwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYyLC0wLjU4NjU3NyAxLjMxMDE1NjIsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NSwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogTSAyLjEwMTcwOSw2LjM4NzAxMTcgYyAwLjE0MTI2NjcsMC4yMDkxMDI0IDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYzIC0xLjMxMDE1NjMsMS4zMTAxNTYzIC0wLjI3MTM0MjIzLDAgLTAuNTI3ODYwNTksLTAuMDc3MDkzIC0wLjczNjk2Mjg4LC0wLjIxODM1OTQgMC4yMzk0MTAzOSwwLjMxMzA4NTkgMC42MTI2MzYyMiwwLjUxODYwMzUgMS4wMzcyMDY5OCwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAzLjAyOTczNjMsMCBjIDAuMTQxMjY2NywwLjIwOTEwMjQgMC4yMTgzNTk0LDAuNDY1NjIwNiAwLjIxODM1OTQsMC43MzY5NjI5IDAsMC43MjM1NzkzIC0wLjU4NjU3NywxLjMxMDE1NjMgLTEuMzEwMTU2MywxLjMxMDE1NjMgLTAuMjcxMzQyMiwwIC0wLjUyNzg2MDUsLTAuMDc3MDkzIC0wLjczNjk2MjksLTAuMjE4MzU5NCAwLjIzOTQxMDQsMC4zMTMwODU5IDAuNjEyNjM2MywwLjUxODYwMzUgMS4wMzcyMDcxLDAuNTE4NjAzNSAwLjcyMzU3OTMsMCAxLjMxMDE1NjIsLTAuNTg2NTc3IDEuMzEwMTU2MiwtMS4zMTAxNTYzIDAsLTAuNDI0NTcwOCAtMC4yMDU1MTc1LC0wLjc5Nzc5NjYgLTAuNTE4NjAzNSwtMS4wMzcyMDcgeiBtIDMuMDg0MzI2MiwwIGMgMC4xNDEyNjY3LDAuMjA5MTAyNCAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHoiIC8+ICA8L2c+PC9zdmc+);background-repeat:no-repeat;background-position:100% 100%;pointer-events:auto!important}.os-host-rtl>.os-scrollbar-corner.os-scrollbar-corner-resize{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.os-host-overflow{overflow:hidden!important}@-webkit-keyframes hs-resize-observer-dummy-animation{0%{z-index:0}to{z-index:-1}}@keyframes hs-resize-observer-dummy-animation{0%{z-index:0}to{z-index:-1}}.os-theme-none>.os-scrollbar-horizontal,.os-theme-none>.os-scrollbar-vertical,.os-theme-none>.os-scrollbar-corner{display:none!important}.os-theme-none>.os-scrollbar-corner-resize{display:block!important;min-width:10px;min-height:10px}.os-theme-dark>.os-scrollbar-horizontal,.os-theme-light>.os-scrollbar-horizontal{right:10px;height:10px}.os-theme-dark>.os-scrollbar-vertical,.os-theme-light>.os-scrollbar-vertical{bottom:10px;width:10px}.os-theme-dark.os-host-rtl>.os-scrollbar-horizontal,.os-theme-light.os-host-rtl>.os-scrollbar-horizontal{left:10px;right:0}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{height:10px;width:10px}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{background-color:transparent}.os-theme-dark>.os-scrollbar,.os-theme-light>.os-scrollbar{padding:2px;box-sizing:border-box;background:0 0}.os-theme-dark>.os-scrollbar.os-scrollbar-unusable,.os-theme-light>.os-scrollbar.os-scrollbar-unusable{background:0 0}.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{background:0 0}.os-theme-dark>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle{min-width:30px}.os-theme-dark>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle{min-height:30px}.os-theme-dark.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{-webkit-transition:background-color .3s;transition:background-color .3s}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{border-radius:10px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.4)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.4)}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-theme-light>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(0,0,0,.7)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(255,255,255,.7)}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-theme-dark.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before{display:none}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-host-rtl.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-host-rtl.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{right:-6px;left:-2px}\", \"\"]);\n"
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"index": 7,
"index2": 10,
"size": 510,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./scss/style.scss",
"loc": "8:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./style.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"index": 8,
"index2": 9,
"size": 23812,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 23,
"issuerName": "./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 23,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./src/scss/style.scss",
"moduleName": "./src/scss/style.scss",
"type": "cjs require",
"userRequest": "!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./style.scss",
"loc": "1:14-181"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Imports\nvar getUrl = require(\"../../node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL___0___ = getUrl(require(\"../assets/img/msg-tail-left.svg\"));\nvar ___CSS_LOADER_URL___1___ = getUrl(require(\"../assets/img/msg-tail-right.svg\"));\n// Module\nexports.push([module.id, \".chats-container{background-color:#fff;border-right:1px solid #DADCE0}.chats-container .toolbar{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1.25rem}.chats-container .toolbar .open-menu{cursor:pointer;background:none;border:none}.chats-container .input-search{position:relative;width:100%;margin-left:1rem}.chats-container .input-search input{background-color:rgba(112,117,121,0.08);border:2px solid transparent;height:3rem;border-radius:22px;box-sizing:border-box;padding:0 1.5rem 0 3rem;-webkit-transition:all .15s ease-out;transition:all .15s ease-out;width:100%}.chats-container .input-search input:focus{background-color:rgba(112,117,121,0);border:2px solid #4EA4F6}.chats-container .input-search input:focus+.tgico{color:#4EA4F6;opacity:1}.chats-container .input-search .tgico{position:absolute;left:1rem;top:50%;transform:translateY(-50%);text-align:center;font-size:1.65rem;color:#707579;opacity:.6;-webkit-transition:all .15s ease-out;transition:all .15s ease-out}.chats-container ul{margin:0;padding:0 .5rem}.chats-container #dialogs-pinned{border-bottom:1px solid #DADCE0}.chats-container #dialogs-pinned:empty{display:none}.chats-container li{padding:0 .5rem;height:70px;max-height:70px;overflow:hidden;border-radius:8px;background-color:#fff;display:grid;align-items:center;grid-template-columns:60px calc(100% - 60px);position:relative;cursor:pointer}.chats-container li:hover{background:rgba(112,117,121,0.08)}.chats-container li.active{background:rgba(110,115,119,0.1)}.chats-container p{margin:0;display:flex;justify-content:space-between;height:1.7rem}.chats-container p span:not(.tgico-pinnedchat):last-child{font-size:.9rem}.chats-container span{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin:.1rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chats-container .user-caption{max-width:100%;max-height:100%;overflow:hidden;color:#9e9e9e}.chats-container .user-title{max-width:80%}.chats-container .user-last-message{display:block;max-width:80%}.chats-container .user-last-message i{font-style:normal;color:#1da1f1}.chats-container .message-status{margin-right:.25rem}.chats-container .message-status[class*=\\\" tgico-\\\"]{color:#4DCD5E;font-size:1.15rem}.chats-container .unread,.chats-container .unread-muted{border-radius:12px;min-width:24px;padding:0 8px;height:24px;text-align:center;line-height:24px;color:#fff;font-weight:500}.chats-container .tgico-pinnedchat{border-radius:50%;width:24px;height:24px;line-height:24px;font-size:1.5rem;color:#fff;text-align:center}.chats-container .unread:empty,.chats-container .unread-muted:empty{visibility:hidden}.chats-container .unread{background:#4DCD5E}.chats-container .unread-muted,.chats-container .tgico-pinnedchat{background:#cecece}.chat-container{display:flex;width:100%;align-items:center;height:100vh;overflow:hidden;flex-direction:column}.chat-container #topbar{width:100%;background-color:#fff;box-sizing:border-box;user-select:none;display:flex;align-items:center;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07);padding:.5rem 1rem;flex:0 0 auto}.chat-container #topbar>*{margin:0 2px}.chat-container #topbar .chat-info{flex-grow:1}.chat-container #topbar .content{padding-left:1rem}.chat-container #topbar .person{display:flex;align-items:center}.chat-container #topbar .person:hover{background-color:transparent}.chat-container #topbar .person .user-avatar{width:44px;height:44px;line-height:44px}.chat-container #topbar .person .bottom{font-size:14px;line-height:18px}.chat-container #topbar .person .bottom .online{color:#1da1f1}.chat-container #bubbles{width:100%;height:100%;max-height:100%;flex:1 1 auto}.chat-container #bubbles .preloader{width:100%;height:100%}.chat-container #bubbles .preloader svg{width:50px;height:50px}.chat-container #bubbles #bubbles-inner{max-width:700px;width:100%;display:flex;flex-direction:column;flex-shrink:1;padding:9px;margin:0 auto;box-sizing:border-box}.chat-container #bubbles #bubbles-inner>*{display:flex;padding:5px 0}.chat-container #bubbles .service{justify-content:center}.chat-container #bubbles .service .service-msg{color:#fff;background-color:rgba(0,0,0,0.22);font-weight:500;padding:0 8px;line-height:24px;font-size:15px;border-radius:12px;user-select:none}.chat-container #bubbles .bubble{max-width:85%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,0.15);position:relative;display:flex;flex-direction:column-reverse;font-size:0}.chat-container #bubbles .bubble.sticker{background:none !important;box-shadow:none;max-width:300px}.chat-container #bubbles .bubble.sticker .message.message-empty{display:none}.chat-container #bubbles .bubble.sticker:hover .message.message-empty{display:block}.chat-container #bubbles .bubble .message:not(.message-empty)+.attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.chat-container #bubbles .bubble .attachment{max-width:380px;border-radius:inherit;overflow:hidden;text-align:center;font-size:0}.chat-container #bubbles .bubble .attachment img{width:100%;max-width:100%;height:auto}.chat-container #bubbles .bubble .box{font-size:.95rem;margin:.25rem;padding:.25rem;margin-bottom:-5px;border-radius:4px;transition:anim(background-color)}.chat-container #bubbles .bubble .box.web{margin-top:-5px;margin-bottom:5px;max-width:320px}.chat-container #bubbles .bubble .box.web .preview{height:100px;border-radius:4px;margin-bottom:6px;overflow:hidden;user-select:none}.chat-container #bubbles .bubble .box.web .preview img{max-width:100%;height:100%}.chat-container #bubbles .bubble .box.web .title{line-height:1.4;font-weight:500}.chat-container #bubbles .bubble .box.web .name{display:block}.chat-container #bubbles .bubble .box.web .name:hover{text-decoration:underline}.chat-container #bubbles .bubble .box.web .text{line-height:1.2}.chat-container #bubbles .bubble .box .quote{padding-left:.5rem}.chat-container #bubbles .bubble .box .name{font-weight:500}.chat-container #bubbles .bubble .box:not(.web){margin-bottom:0;margin-top:0;cursor:pointer}.chat-container #bubbles .bubble .message{font-size:1rem;padding:.25rem .6rem;overflow:hidden;text-overflow:ellipsis}.chat-container #bubbles .bubble .message.message-empty{position:absolute;bottom:.1rem;right:.1rem;border-radius:12px;background-color:rgba(0,0,0,0.3);padding:.0rem .3rem}.chat-container #bubbles .bubble .message.message-empty .time{color:#fff}.chat-container #bubbles .bubble .time{font-size:.8rem;user-select:none;float:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:20px;line-height:20px}.chat-container #bubbles .bubble .time .inner{position:absolute;bottom:0;right:0;display:flex;align-items:center;font-size:.75rem}.chat-container #bubbles .bubble .user-avatar{position:absolute;left:-2.5rem;width:32px;height:32px;line-height:32px;bottom:0;font-size:.85rem}.chat-container #bubbles .bubble.forwarded .message{padding-top:0}.chat-container #bubbles .bubble .message:not(:empty)+.name{margin-bottom:-.25rem}.chat-container #bubbles .bubble.forwarded .name{cursor:pointer}.chat-container #bubbles .bubble.forwarded .attachment{border-top-left-radius:0;border-top-right-radius:0}.chat-container #bubbles .bubble>.name{padding:.25rem .6rem 0 .6rem;font-weight:500;color:#1da1f1;font-size:.9rem}.chat-container #bubbles .bubble:last-child:after{position:absolute;bottom:-4px;width:11px;height:20px;background-repeat:no-repeat;content:'';background-position:-2px -2px}.chat-container #bubbles .bubble+.bubble{margin-top:5px}.chat-container #bubbles .in,.chat-container #bubbles .out{flex-direction:column}.chat-container #bubbles .in{align-items:flex-start}.chat-container #bubbles .in a{color:#1da1f1}.chat-container #bubbles .in .box:hover{background-color:rgba(112,117,121,0.08)}.chat-container #bubbles .in .quote{border-left:2px #1da1f1 solid}.chat-container #bubbles .in .quote .name{color:#1da1f1}.chat-container #bubbles .in .time{color:rgba(112,117,121,0.6);width:2rem}.chat-container #bubbles .in .time .inner{padding:0 .4rem}.chat-container #bubbles .in .bubble{background-color:#ffffff;border-radius:6px 12px 12px 6px}.chat-container #bubbles .in .bubble:first-child{border-radius:12px 12px 12px 6px}.chat-container #bubbles .in .bubble:last-child{border-radius:6px 12px 12px 0px}.chat-container #bubbles .in .bubble:last-child:after{left:-6px;background-image:url(\" + ___CSS_LOADER_URL___0___ + \")}.chat-container #bubbles .in .bubble:first-child:last-child{border-radius:12px 12px 12px 0px}.chat-container #bubbles .out{align-items:flex-end}.chat-container #bubbles .out a{color:#50af4f}.chat-container #bubbles .out .box:hover{background-color:rgba(77,205,94,0.12)}.chat-container #bubbles .out .quote{border-left:2px #50af4f solid}.chat-container #bubbles .out .quote .name{color:#50af4f}.chat-container #bubbles .out .time{color:#50af4f;width:48px;display:inline-block}.chat-container #bubbles .out .time .inner{padding:0 .25rem}.chat-container #bubbles .out .bubble .time .tgico:after{font-size:1.1rem;vertical-align:middle;margin-left:.1rem}.chat-container #bubbles .out .bubble.forwarded .name{color:#50af4f}.chat-container #bubbles .out .bubble.read .time .tgico:after{content:\\\"\\\"}.chat-container #bubbles .out .bubble.sent .time .tgico:after{content:\\\"\\\"}.chat-container #bubbles .out .bubble{background-color:#eeffde;border-radius:12px 6px 6px 12px}.chat-container #bubbles .out .bubble:first-child{border-radius:12px 12px 6px 12px}.chat-container #bubbles .out .bubble:last-child{border-radius:12px 6px 0px 12px}.chat-container #bubbles .out .bubble:last-child:after{right:-11px;background-image:url(\" + ___CSS_LOADER_URL___1___ + \")}.chat-container #bubbles .out .bubble:first-child:last-child{border-radius:12px 12px 0px 12px}.chat-container #bubbles .out .user-avatar{left:auto;right:-2.5rem}.chat-container #chat-input{display:flex;align-items:center;width:100%;max-width:700px;padding-bottom:1rem;justify-content:space-between;flex:0 0 auto}.chat-container #chat-input .input-message{display:flex;align-items:center;width:calc(100% - 3.75rem);justify-content:space-between;background-color:#fff;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07);margin-right:.5rem;padding:0 .5rem;min-height:3.25rem;max-height:30rem;caret-color:#4EA4F6}.chat-container #chat-input .input-message .input-message-container{width:100%;max-height:inherit}.chat-container #chat-input .input-message .btn-icon{color:#9e9e9e;font-size:1.5rem}.chat-container #chat-input #input-message{background:none;border:none;width:100%;padding:.5rem .5rem;font-size:.95rem;max-height:inherit;overflow-y:auto;resize:none;border:none;outline:none;cursor:text}.chat-container #chat-input [contenteditable=true]:empty:before{content:attr(data-placeholder);color:#9e9e9e;display:block}.chat-container #chat-input .btn-circle{font-size:1.2rem;height:3.25rem;width:3.25rem}.chat-container #chat-input .os-scrollbar-handle{background:rgba(0,0,0,0.2)}.chat-container #chat-closed{position:absolute;left:0;top:0;width:100%;height:100%;background-color:inherit;z-index:3;display:flex;align-items:center;justify-content:center;flex-direction:column}.chat-container #chat-closed .tgico-chatsplaceholder{font-size:10rem;color:#ABB0B3}.chat-container #chat-closed h3{font-size:2rem;color:#707579;text-align:center}.chat-container #chat-closed .buttons{display:flex;justify-content:center;align-items:center;margin-top:1rem}.chat-container #chat-closed .buttons button{margin:0 2.5rem;width:4rem;height:4rem;background:#fff;border:none;position:relative;font-size:2rem;color:#707579;cursor:pointer;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07)}.chat-container #chat-closed .buttons button:hover{background:#4EA4F6;color:#fff}.chat-container #chat-closed .buttons button:hover span{color:#4EA4F6}.chat-container #chat-closed .buttons button span{position:absolute;top:100%;left:50%;width:100%;padding-top:1rem;transform:translateX(-50%);font-size:.9rem;font-family:\\\"Roboto\\\"}button,input,optgroup,select,textarea,html{font-family:\\\"Roboto\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \\\"Helvetica Neue\\\", sans-serif}.whole{height:100vh;min-height:100vh;width:100%;min-width:100%}h1,h2,h3,h4,h5,h6{letter-spacing:-.66px;font-weight:500}input{caret-color:#4EA4F6}.subtitle{font-size:1rem;color:#9e9e9e;line-height:1.25}.page-sign .input-wrapper,.page-authCode .input-wrapper,.page-signUp .input-wrapper,.page-password .input-wrapper{margin-top:3rem}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center;margin:1.52rem 0 0.912rem 0}.page-authCode .phone-wrapper h4{margin:0}.page-authCode .phone-wrapper h4[contenteditable=\\\"true\\\"]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #4EA4F6}.page-authCode .phone-wrapper .phone.error{border-color:#E53935 !important}.btn-icon{text-align:center;font-size:1.65rem;border-radius:50%;-webkit-transition:background-color .15s ease-out;transition:background-color .15s ease-out;color:#707579;cursor:pointer;background:none;border:none;padding:.5rem;position:relative}.user-avatar{color:#fff;width:52px;height:52px;line-height:52px;border-radius:50%;background-color:#4EA4F6;text-align:center;font-size:1.25em;position:relative;user-select:none}.user-avatar img{width:100%;height:100%;border-radius:inherit;user-select:none}.user-avatar[class*=\\\" tgico-\\\"]{line-height:52px;font-size:1.5rem}.user-avatar path{fill:white}.user-avatar.is-online:after{position:absolute;content:\\\" \\\";display:block;border-radius:50%;border:2px solid white;background-color:#4DCD5E;left:70%;top:79%;width:12px;height:12px}.user-title,b{color:#000;font-weight:500}.ripple{background-color:rgba(112,117,121,0.08);width:1rem;height:1rem;position:absolute;border-radius:50%;transform:translateX(-100%) translateY(-100%);mix-blend-mode:screen;animation:ripple 750ms ease-out forwards}@keyframes ripple{0%{transform:translate(-100%, -100%)}80%{transform:translate(-100%, -100%) scale(50)}100%{transform:translate(-100%, -100%) scale(50)}}.page-signUp .auth-image{border-radius:50%;cursor:pointer;position:relative;overflow:hidden}.page-signUp .auth-image canvas{max-width:100%;max-height:100%;width:100%;height:100%;background-color:#4EA4F6}.page-signUp .auth-image svg{position:absolute;width:36px;height:36px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.input-wrapper{width:350px;margin:0 auto}.input-field{position:relative}.input-field .arrow-down{position:absolute;content:\\\" \\\";top:50%;bottom:0;right:15px;cursor:pointer;height:0;width:0;border:solid #bdbdbd;border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:4px;vertical-align:middle;z-index:2;margin-top:-7px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;left:12.5px;right:auto;z-index:2;top:50%;transform:translateY(-50%);background-color:#fff;font-size:0.85rem;transition:.2s all;display:inline-block;cursor:text}.input-field input{border:1px solid #DADCE0;border-radius:8px;padding:0 12.5px;box-sizing:border-box;font-size:0.85rem;width:100%;height:45px;transition:.2s border-color;position:relative;z-index:1}.input-field input:focus{border-color:#4EA4F6;border-width:1.5px;padding:0 12px}.input-field input:disabled{background-color:#fff;color:#000}.input-field input.error{border-color:#E53935;transition:.2s border-width}.input-field input.error+label{color:#E53935 !important}.input-field input:focus ~ .arrow-down{margin-top:-2px;transform:rotate(225deg);-webkit-transform:rotate(225deg);border-color:#4EA4F6}.input-field input:focus+label{color:#4EA4F6}.input-field input:focus+label,.input-field input:valid+label,.input-field input:disabled+label{top:-8.5px;transform:none;padding:0 5px;left:7.5px}.checkbox-field{margin:1rem 0;display:block;text-align:left;padding:0 1rem;font-weight:500;position:relative}[type=\\\"checkbox\\\"]{position:absolute;opacity:0;pointer-events:none;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=\\\"checkbox\\\"]+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=\\\"checkbox\\\"]+span:before,[type=\\\"checkbox\\\"]+span:after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s}[type=\\\"checkbox\\\"]+span:before{border-radius:2px;z-index:1}[type=\\\"checkbox\\\"]+span:after{height:18px;width:18px;z-index:0;border:2px solid #4EA4F6;border-radius:3px;top:50%;transform:translateY(-50%)}[type=\\\"checkbox\\\"]:not(:checked)+span:before{width:0;height:0;border:2px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=\\\"checkbox\\\"]:checked+span:before{top:4px;left:-1px;width:8px;height:14px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=\\\"checkbox\\\"]:not(:checked)+span:after{background-color:transparent}[type=\\\"checkbox\\\"]:checked+span:after{background-color:#4EA4F6}.input-wrapper>* ~ *{margin-top:1.2rem}.select-wrapper{max-height:300px;height:auto;position:absolute;width:100%;top:calc(100% + 10px);left:0;overflow-y:auto;background-color:#fff;z-index:3;border-radius:8px}.select-wrapper ul{margin:10px 0}.select-wrapper li{align-items:center;padding:0 12.5px;justify-content:space-between;height:50px;cursor:pointer;font-weight:500;text-align:left;display:grid;grid-template-columns:15% 65% 20%}.select-wrapper li:hover{background-color:rgba(112,117,121,0.08)}.select-wrapper .emoji-outer{height:24px;width:24px;font-size:24px;line-height:1}.phone-code{color:#9e9e9e;text-align:right}.os-scrollbar{width:4px}.os-scrollbar-handle{background:rgba(0,0,0,0.4);border-radius:8px}.os-scrollbar-vertical{margin-right:2px}::placeholder{color:#9e9e9e;opacity:1}:-ms-input-placeholder{color:#9e9e9e}::-ms-input-placeholder{color:#9e9e9e}input:focus,button:focus{outline:none}.auth-image{width:133px;height:133px;margin-left:auto;margin-right:auto;margin-bottom:1rem}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s;cursor:pointer;font-size:1.5rem}.phone-edit:hover{opacity:1}.btn-primary{background:#4EA4F6;color:#fff;border-radius:8px;width:100%;text-align:center;font-size:0.85rem;height:45px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative}.btn-primary:hover{background:#2790f4}.btn-primary svg,.btn-primary use{height:calc(100% - 20px);right:12.5px;left:auto;margin:auto 0}.preloader-circular{animation:rotate 2s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:1, 200;stroke-dashoffset:0;animation:dash 1.5s ease-in-out infinite;stroke-linecap:round;stroke:white;stroke-width:3}@keyframes rotate{100%{transform:rotate(360deg)}}@keyframes dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35px}100%{stroke-dasharray:89, 200;stroke-dashoffset:-124px}}span.emoji-sizer{line-height:0.81em;font-size:1em;margin:-2px 0}span.emoji-outer{display:-moz-inline-box;display:inline-block;*display:inline}span.emoji-inner{display:-moz-inline-box;display:inline-block;text-indent:-9999px;width:100%;height:100%;vertical-align:baseline;*vertical-align:auto;*zoom:1}.popup{position:fixed;left:0;top:0;height:100%;max-width:none;width:100%;z-index:3;background-color:rgba(0,0,0,0.35);margin:0;padding:0;box-shadow:none;opacity:0;visibility:hidden;-webkit-transition:opacity 0.3s 0s, visibility 0s 0.3s;-moz-transition:opacity 0.3s 0s, visibility 0s 0.3s;transition:opacity 0.3s 0s, visibility 0s 0.3s;overflow:auto;display:flex;align-items:center;justify-content:center}.popup.is-visible{opacity:1;visibility:visible;-webkit-transition:opacity 0.3s 0s, visibility 0s 0s;-moz-transition:opacity 0.3s 0s, visibility 0s 0s;transition:opacity 0.3s 0s, visibility 0s 0s}.popup-container{position:relative;border-radius:8px;background-color:#fff;padding:1rem;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px);backface-visibility:hidden;-webkit-backface-visibility:hidden;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;transition-duration:0.3s}.popup-close{height:18px;cursor:pointer;z-index:3;text-align:center;justify-self:center;line-height:1}.popup-close svg{max-width:100%;max-height:100%}.popup-close path{fill:#707579;transition:.2s all}.popup-close:hover path{fill:#000}.popup.is-visible .popup-container{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}.btn-circle{border-radius:50%;width:44px;height:44px}.btn-circle path{fill:white}.popup-header{display:flex;margin-bottom:2rem}.popup-avatar .popup-container{max-width:600px;max-height:600px}.popup-avatar .popup-container>button{position:absolute;bottom:15px;right:15px}.popup-avatar h6{font-size:1.1rem;text-align:left;margin:0;margin-left:1.5rem}.popup-avatar .crop{max-width:200%;max-height:200%;padding:0 2.75rem 2.75rem;border-radius:8px}.popup-avatar .crop img{border-radius:8px}.overlay::selection{background:transparent}.crop-component::selection{background:transparent}.crop-image,.overlay>img{width:auto;height:auto;display:block;object-fit:contain;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:white;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-component .crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.7);border-radius:8px}.overlay{position:absolute;left:50%;top:50%;z-index:999;margin-left:-100px;margin-top:-100px;width:200px;height:200px;overflow:hidden;box-sizing:content-box;border-radius:50%}.overlay:hover,.overlay:active{cursor:move}.overlay>img{position:absolute;display:block}.page-chats{display:grid;grid-template-columns:25% 75%;max-height:100vh;min-height:100vh}.page-chats>div{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats .chat-container{background-color:#e6ebee}.page-chats .preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%)}.page-chats .preloader .preloader-path{stroke:#4EA4F6}.page-password #password{padding-right:2.5rem}.page-password #password[type=\\\"password\\\"]{font-size:2.25rem;padding-left:10px}.page-password .toggle-visible{position:absolute;right:.25rem;z-index:2;top:50%;transform:translateY(-50%);font-size:1.25rem;color:#9e9e9e;cursor:pointer;transition:.2s;padding:.5rem}.page-password .toggle-visible:hover{color:#000}\\n\", \"\"]);\n"
},
{
"id": 25,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/img/msg-tail-left.svg",
"name": "./src/assets/img/msg-tail-left.svg",
"index": 10,
"index2": 7,
"size": 48,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 24,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
}
}
],
"profile": {
"factory": 1363,
"building": 6
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/img/msg-tail-left.svg"
],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../assets/img/msg-tail-left.svg",
"loc": "4:38-80"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/img/msg-tail-left.svg\";"
},
{
"id": 26,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/img/msg-tail-right.svg",
"name": "./src/assets/img/msg-tail-right.svg",
"index": 11,
"index2": 8,
"size": 49,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 24,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
}
}
],
"profile": {
"factory": 1363,
"building": 6
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/img/msg-tail-right.svg"
],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../assets/img/msg-tail-right.svg",
"loc": "5:38-81"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/img/msg-tail-right.svg\";"
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"index": 12,
"index2": 16,
"size": 510,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./scss/tgico.scss",
"loc": "9:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./tgico.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"index": 13,
"index2": 15,
"size": 4682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 27,
"issuerName": "./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 27,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./src/scss/tgico.scss",
"moduleName": "./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./tgico.scss",
"loc": "1:14-181"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Imports\nvar getUrl = require(\"../../node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL___0___ = getUrl(require(\"../assets/fonts/tgico.eot\"));\nvar ___CSS_LOADER_URL___1___ = getUrl(require(\"../assets/fonts/tgico.ttf\"));\nvar ___CSS_LOADER_URL___2___ = getUrl(require(\"../assets/fonts/tgico.woff\"));\nvar ___CSS_LOADER_URL___3___ = getUrl(require(\"../assets/fonts/tgico.svg\"));\n// Module\nexports.push([module.id, \"@font-face{font-family:\\\"tgico\\\";src:url(\" + ___CSS_LOADER_URL___0___ + \");src:url(\" + ___CSS_LOADER_URL___0___ + \") format(\\\"embedded-opentype\\\"),url(\" + ___CSS_LOADER_URL___1___ + \") format(\\\"truetype\\\"),url(\" + ___CSS_LOADER_URL___2___ + \") format(\\\"woff\\\"),url(\" + ___CSS_LOADER_URL___3___ + \") format(\\\"svg\\\");font-weight:normal;font-style:normal;font-display:block}[class^=\\\"tgico-\\\"],.tgico:before,.tgico:after,[class*=\\\" tgico-\\\"]{font-family:\\\"tgico\\\" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check-sent:before{content:\\\"\\\"}.tgico-check-read:before{content:\\\"\\\"}.tgico-activesessions:before{content:\\\"\\\"}.tgico-add:before{content:\\\"\\\"}.tgico-addmember:before{content:\\\"\\\"}.tgico-adduser:before{content:\\\"\\\"}.tgico-admin:before{content:\\\"\\\"}.tgico-animals:before{content:\\\"\\\"}.tgico-archive:before{content:\\\"\\\"}.tgico-attach:before{content:\\\"\\\"}.tgico-avatar_archivedchats:before{content:\\\"\\\"}.tgico-avatar_deletedaccount:before{content:\\\"\\\"}.tgico-avatar_savedmessages:before{content:\\\"\\\"}.tgico-back:before{content:\\\"\\\"}.tgico-camera:before{content:\\\"\\\"}.tgico-cameraadd:before{content:\\\"\\\"}.tgico-car:before{content:\\\"\\\"}.tgico-channel:before{content:\\\"\\\"}.tgico-channelviews:before{content:\\\"\\\"}.tgico-chatsplaceholder:before{content:\\\"\\\"}.tgico-check:before{content:\\\"\\\"}.tgico-checkbox:before{content:\\\"\\\"}.tgico-checkboxblock:before{content:\\\"\\\"}.tgico-checkboxempty:before{content:\\\"\\\"}.tgico-checkboxon:before{content:\\\"\\\"}.tgico-close:before{content:\\\"\\\"}.tgico-copy:before{content:\\\"\\\"}.tgico-data:before{content:\\\"\\\"}.tgico-delete_filled:before{content:\\\"\\\"}.tgico-delete:before{content:\\\"\\\"}.tgico-deleteuser:before{content:\\\"\\\"}.tgico-document:before{content:\\\"\\\"}.tgico-down:before{content:\\\"\\\"}.tgico-download:before{content:\\\"\\\"}.tgico-eats:before{content:\\\"\\\"}.tgico-edit:before{content:\\\"\\\"}.tgico-eye1:before{content:\\\"\\\"}.tgico-eye2:before{content:\\\"\\\"}.tgico-flag:before{content:\\\"\\\"}.tgico-forward:before{content:\\\"\\\"}.tgico-fullscreen:before{content:\\\"\\\"}.tgico-group:before{content:\\\"\\\"}.tgico-help:before{content:\\\"\\\"}.tgico-info:before{content:\\\"\\\"}.tgico-lamp:before{content:\\\"\\\"}.tgico-language:before{content:\\\"\\\"}.tgico-largepause:before{content:\\\"\\\"}.tgico-largeplay:before{content:\\\"\\\"}.tgico-location:before{content:\\\"\\\"}.tgico-lock:before{content:\\\"\\\"}.tgico-logout:before{content:\\\"\\\"}.tgico-menu:before{content:\\\"\\\"}.tgico-message:before{content:\\\"\\\"}.tgico-microphone:before{content:\\\"\\\"}.tgico-more:before{content:\\\"\\\"}.tgico-mute:before{content:\\\"\\\"}.tgico-newchannel:before{content:\\\"\\\"}.tgico-newchat_filled:before{content:\\\"\\\"}.tgico-newgroup:before{content:\\\"\\\"}.tgico-newprivate:before{content:\\\"\\\"}.tgico-next:before{content:\\\"\\\"}.tgico-pause:before{content:\\\"\\\"}.tgico-permissions:before{content:\\\"\\\"}.tgico-phone:before{content:\\\"\\\"}.tgico-photo:before{content:\\\"\\\"}.tgico-pin:before{content:\\\"\\\"}.tgico-pinnedchat:before{content:\\\"\\\"}.tgico-play:before{content:\\\"\\\"}.tgico-radiooff:before{content:\\\"\\\"}.tgico-radioon:before{content:\\\"\\\"}.tgico-recent:before{content:\\\"\\\"}.tgico-reply:before{content:\\\"\\\"}.tgico-savedmessages:before{content:\\\"\\\"}.tgico-search:before{content:\\\"\\\"}.tgico-send:before{content:\\\"\\\"}.tgico-send2:before{content:\\\"\\\"}.tgico-sending:before{content:\\\"\\\"}.tgico-sendingerror:before{content:\\\"\\\"}.tgico-settings:before{content:\\\"\\\"}.tgico-smallscreen:before{content:\\\"\\\"}.tgico-smile:before{content:\\\"\\\"}.tgico-sport:before{content:\\\"\\\"}.tgico-stop:before{content:\\\"\\\"}.tgico-unarchive:before{content:\\\"\\\"}.tgico-unlock:before{content:\\\"\\\"}.tgico-unmute:before{content:\\\"\\\"}.tgico-unpin:before{content:\\\"\\\"}.tgico-unreadg:before{content:\\\"\\\"}.tgico-up:before{content:\\\"\\\"}.tgico-user:before{content:\\\"\\\"}.tgico-username:before{content:\\\"\\\"}\\n\", \"\"]);\n"
},
{
"id": 29,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.eot",
"name": "./src/assets/fonts/tgico.eot",
"index": 14,
"index2": 11,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.eot"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.eot",
"loc": "4:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.eot\";"
},
{
"id": 30,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.ttf",
"name": "./src/assets/fonts/tgico.ttf",
"index": 15,
"index2": 12,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.ttf"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.ttf",
"loc": "5:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.ttf\";"
},
{
"id": 31,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.woff",
"name": "./src/assets/fonts/tgico.woff",
"index": 16,
"index2": 13,
"size": 43,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.woff"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.woff",
"loc": "6:38-75"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.woff\";"
},
{
"id": 32,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.svg",
"name": "./src/assets/fonts/tgico.svg",
"index": 17,
"index2": 14,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.svg"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.svg",
"loc": "7:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.svg\";"
},
{
"id": 33,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/rusha/dist/rusha.min.js",
"name": "./node_modules/rusha/dist/rusha.min.js",
"index": 24,
"index2": 20,
"size": 12486,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "rusha/dist/rusha.min.js",
"loc": "58:25-59"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "/*! rusha 2018-02-19 */\n\n(function e(t,r){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=r();else if(typeof define===\"function\"&&define.amd)define([],r);else if(typeof exports===\"object\")exports[\"Rusha\"]=r();else t[\"Rusha\"]=r()})(typeof self!==\"undefined\"?self:this,function(){return function(e){var t={};function r(n){if(t[n]){return t[n].exports}var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"\";return r(r.s=3)}([function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(5);var i=r(1),o=i.toHex,s=i.ceilHeapSize;var f=r(6);var u=function(e){for(e+=9;e%64>0;e+=1){}return e};var c=function(e,t){var r=new Uint8Array(e.buffer);var n=t%4,a=t-n;switch(n){case 0:r[a+3]=0;case 1:r[a+2]=0;case 2:r[a+1]=0;case 3:r[a+0]=0}for(var i=(t>>2)+1;i<e.length;i++){e[i]=0}};var h=function(e,t,r){e[t>>2]|=128<<24-(t%4<<3);e[((t>>2)+2&~15)+14]=r/(1<<29)|0;e[((t>>2)+2&~15)+15]=r<<3};var p=function(e,t){var r=new Int32Array(e,t+320,5);var n=new Int32Array(5);var a=new DataView(n.buffer);a.setInt32(0,r[0],false);a.setInt32(4,r[1],false);a.setInt32(8,r[2],false);a.setInt32(12,r[3],false);a.setInt32(16,r[4],false);return n};var l=function(){function e(t){n(this,e);t=t||64*1024;if(t%64>0){throw new Error(\"Chunk size must be a multiple of 128 bit\")}this._offset=0;this._maxChunkLen=t;this._padMaxChunkLen=u(t);this._heap=new ArrayBuffer(s(this._padMaxChunkLen+320+20));this._h32=new Int32Array(this._heap);this._h8=new Int8Array(this._heap);this._core=new a({Int32Array:Int32Array},{},this._heap)}e.prototype._initState=function e(t,r){this._offset=0;var n=new Int32Array(t,r+320,5);n[0]=1732584193;n[1]=-271733879;n[2]=-1732584194;n[3]=271733878;n[4]=-1009589776};e.prototype._padChunk=function e(t,r){var n=u(t);var a=new Int32Array(this._heap,0,n>>2);c(a,t);h(a,t,r);return n};e.prototype._write=function e(t,r,n,a){f(t,this._h8,this._h32,r,n,a||0)};e.prototype._coreCall=function e(t,r,n,a,i){var o=n;this._write(t,r,n);if(i){o=this._padChunk(n,a)}this._core.hash(o,this._padMaxChunkLen)};e.prototype.rawDigest=function e(t){var r=t.byteLength||t.length||t.size||0;this._initState(this._heap,this._padMaxChunkLen);var n=0,a=this._maxChunkLen;for(n=0;r>n+a;n+=a){this._coreCall(t,n,a,r,false)}this._coreCall(t,n,r-n,r,true);return p(this._heap,this._padMaxChunkLen)};e.prototype.digest=function e(t){return o(this.rawDigest(t).buffer)};e.prototype.digestFromString=function e(t){return this.digest(t)};e.prototype.digestFromBuffer=function e(t){return this.digest(t)};e.prototype.digestFromArrayBuffer=function e(t){return this.digest(t)};e.prototype.resetState=function e(){this._initState(this._heap,this._padMaxChunkLen);return this};e.prototype.append=function e(t){var r=0;var n=t.byteLength||t.length||t.size||0;var a=this._offset%this._maxChunkLen;var i=void 0;this._offset+=n;while(r<n){i=Math.min(n-r,this._maxChunkLen-a);this._write(t,r,i,a);a+=i;r+=i;if(a===this._maxChunkLen){this._core.hash(this._maxChunkLen,this._padMaxChunkLen);a=0}}return this};e.prototype.getState=function e(){var t=this._offset%this._maxChunkLen;var r=void 0;if(!t){var n=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}else{r=this._heap.slice(0)}return{offset:this._offset,heap:r}};e.prototype.setState=function e(t){this._offset=t.offset;if(t.heap.byteLength===20){var r=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r.set(new Int32Array(t.heap))}else{this._h32.set(new Int32Array(t.heap))}return this};e.prototype.rawEnd=function e(){var t=this._offset;var r=t%this._maxChunkLen;var n=this._padChunk(r,t);this._core.hash(n,this._padMaxChunkLen);var a=p(this._heap,this._padMaxChunkLen);this._initState(this._heap,this._padMaxChunkLen);return a};e.prototype.end=function e(){return o(this.rawEnd().buffer)};return e}();e.exports=l;e.exports._core=a},function(e,t){var r=new Array(256);for(var n=0;n<256;n++){r[n]=(n<16?\"0\":\"\")+n.toString(16)}e.exports.toHex=function(e){var t=new Uint8Array(e);var n=new Array(e.byteLength);for(var a=0;a<n.length;a++){n[a]=r[t[a]]}return n.join(\"\")};e.exports.ceilHeapSize=function(e){var t=0;if(e<=65536)return 65536;if(e<16777216){for(t=1;t<e;t=t<<1){}}else{for(t=16777216;t<e;t+=16777216){}}return t};e.exports.isDedicatedWorkerScope=function(e){var t=\"WorkerGlobalScope\"in e&&e instanceof e.WorkerGlobalScope;var r=\"SharedWorkerGlobalScope\"in e&&e instanceof e.SharedWorkerGlobalScope;var n=\"ServiceWorkerGlobalScope\"in e&&e instanceof e.ServiceWorkerGlobalScope;return t&&!r&&!n}},function(e,t,r){e.exports=function(){var e=r(0);var t=function(e,t,r){try{return r(null,e.digest(t))}catch(e){return r(e)}};var n=function(e,t,r,a,i){var o=new self.FileReader;o.onloadend=function s(){if(o.error){return i(o.error)}var f=o.result;t+=o.result.byteLength;try{e.append(f)}catch(e){i(e);return}if(t<a.size){n(e,t,r,a,i)}else{i(null,e.end())}};o.readAsArrayBuffer(a.slice(t,t+r))};var a=true;self.onmessage=function(r){if(!a){return}var i=r.data.data,o=r.data.file,s=r.data.id;if(typeof s===\"undefined\")return;if(!o&&!i)return;var f=r.data.blockSize||4*1024*1024;var u=new e(f);u.resetState();var c=function(e,t){if(!e){self.postMessage({id:s,hash:t})}else{self.postMessage({id:s,error:e.name})}};if(i)t(u,i,c);if(o)n(u,0,f,o,c)};return function(){a=false}}},function(e,t,r){var n=r(4);var a=r(0);var i=r(7);var o=r(2);var s=r(1),f=s.isDedicatedWorkerScope;var u=typeof self!==\"undefined\"&&f(self);a.disableWorkerBehaviour=u?o():function(){};a.createWorker=function(){var e=n(2);var t=e.terminate;e.terminate=function(){URL.revokeObjectURL(e.objectURL);t.call(e)};return e};a.createHash=i;e.exports=a},function(e,t,r){function n(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.i=function(e){return e};r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.r=function(e){Object.defineProperty(e,\"__esModule\",{value:true})};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"/\";r.oe=function(e){console.error(e);throw e};var n=r(r.s=ENTRY_MODULE);return n.default||n}var a=\"[\\\\.|\\\\-|\\\\+|\\\\w|/|@]+\";var i=\"\\\\((/\\\\*.*?\\\\*/)?s?.*?(\"+a+\").*?\\\\)\";function o(e){return(e+\"\").replace(/[.?*+^$[\\]\\\\(){}|-]/g,\"\\\\$&\")}function s(e,t,n){var s={};s[n]=[];var f=t.toString();var u=f.match(/^function\\s?\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/);if(!u)return s;var c=u[1];var h=new RegExp(\"(\\\\\\\\n|\\\\W)\"+o(c)+i,\"g\");var p;while(p=h.exec(f)){if(p[3]===\"dll-reference\")continue;s[n].push(p[3])}h=new RegExp(\"\\\\(\"+o(c)+'\\\\(\"(dll-reference\\\\s('+a+'))\"\\\\)\\\\)'+i,\"g\");while(p=h.exec(f)){if(!e[p[2]]){s[n].push(p[1]);e[p[2]]=r(p[1]).m}s[p[2]]=s[p[2]]||[];s[p[2]].push(p[4])}return s}function f(e){var t=Object.keys(e);return t.reduce(function(t,r){return t||e[r].length>0},false)}function u(e,t){var r={main:[t]};var n={main:[]};var a={main:{}};while(f(r)){var i=Object.keys(r);for(var o=0;o<i.length;o++){var u=i[o];var c=r[u];var h=c.pop();a[u]=a[u]||{};if(a[u][h]||!e[u][h])continue;a[u][h]=true;n[u]=n[u]||[];n[u].push(h);var p=s(e,e[u][h],u);var l=Object.keys(p);for(var v=0;v<l.length;v++){r[l[v]]=r[l[v]]||[];r[l[v]]=r[l[v]].concat(p[l[v]])}}}return n}e.exports=function(e,t){t=t||{};var a={main:r.m};var i=t.all?{main:Object.keys(a)}:u(a,e);var o=\"\";Object.keys(i).filter(function(e){return e!==\"main\"}).forEach(function(e){var t=0;while(i[e][t]){t++}i[e].push(t);a[e][t]=\"(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })\";o=o+\"var \"+e+\" = (\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(t))+\")({\"+i[e].map(function(t){return\"\"+JSON.stringify(t)+\": \"+a[e][t].toString()}).join(\",\")+\"});\\n\"});o=o+\"(\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(e))+\")({\"+i.main.map(function(e){return\"\"+JSON.stringify(e)+\": \"+a.main[e].toString()}).join(\",\")+\"})(self);\";var s=new window.Blob([o],{type:\"text/javascript\"});if(t.bare){return s}var f=window.URL||window.webkitURL||window.mozURL||window.msURL;var c=f.createObjectURL(s);var h=new window.Worker(c);h.objectURL=c;return h}},function(e,t){e.exports=function e(t,r,n){\"use asm\";var a=new t.Int32Array(n);function i(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,o=0,s=0,f=0,u=0,c=0,h=0,p=0,l=0,v=0,d=0,y=0;i=a[t+320>>2]|0;s=a[t+324>>2]|0;u=a[t+328>>2]|0;h=a[t+332>>2]|0;l=a[t+336>>2]|0;for(r=0;(r|0)<(e|0);r=r+64|0){o=i;f=s;c=u;p=h;v=l;for(n=0;(n|0)<64;n=n+4|0){y=a[r+n>>2]|0;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[e+n>>2]=y}for(n=e+64|0;(n|0)<(e+80|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+80|0;(n|0)<(e+160|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)+1859775393|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+160|0;(n|0)<(e+240|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|s&h|u&h)|0)+((y+l|0)-1894007588|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+240|0;(n|0)<(e+320|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)-899497514|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}i=i+o|0;s=s+f|0;u=u+c|0;h=h+p|0;l=l+v|0}a[t+320>>2]=i;a[t+324>>2]=s;a[t+328>>2]=u;a[t+332>>2]=h;a[t+336>>2]=l}return{hash:i}}},function(e,t){var r=this;var n=void 0;if(typeof self!==\"undefined\"&&typeof self.FileReaderSync!==\"undefined\"){n=new self.FileReaderSync}var a=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e.charCodeAt(n+3);case 1:t[i+1-(s<<1)|0]=e.charCodeAt(n+2);case 2:t[i+2-(s<<1)|0]=e.charCodeAt(n+1);case 3:t[i+3-(s<<1)|0]=e.charCodeAt(n)}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2]=e.charCodeAt(n+o)<<24|e.charCodeAt(n+o+1)<<16|e.charCodeAt(n+o+2)<<8|e.charCodeAt(n+o+3)}switch(f){case 3:t[i+u+1|0]=e.charCodeAt(n+u+2);case 2:t[i+u+2|0]=e.charCodeAt(n+u+1);case 1:t[i+u+3|0]=e.charCodeAt(n+u)}};var i=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e[n+3];case 1:t[i+1-(s<<1)|0]=e[n+2];case 2:t[i+2-(s<<1)|0]=e[n+1];case 3:t[i+3-(s<<1)|0]=e[n]}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2|0]=e[n+o]<<24|e[n+o+1]<<16|e[n+o+2]<<8|e[n+o+3]}switch(f){case 3:t[i+u+1|0]=e[n+u+2];case 2:t[i+u+2|0]=e[n+u+1];case 1:t[i+u+3|0]=e[n+u]}};var o=function(e,t,r,a,i,o){var s=void 0,f=o%4,u=(i+f)%4,c=i-u;var h=new Uint8Array(n.readAsArrayBuffer(e.slice(a,a+i)));switch(f){case 0:t[o]=h[3];case 1:t[o+1-(f<<1)|0]=h[2];case 2:t[o+2-(f<<1)|0]=h[1];case 3:t[o+3-(f<<1)|0]=h[0]}if(i<u+(4-f)){return}for(s=4-f;s<c;s=s+4|0){r[o+s>>2|0]=h[s]<<24|h[s+1]<<16|h[s+2]<<8|h[s+3]}switch(u){case 3:t[o+c+1|0]=h[c+2];case 2:t[o+c+2|0]=h[c+1];case 1:t[o+c+3|0]=h[c]}};e.exports=function(e,t,n,s,f,u){if(typeof e===\"string\"){return a(e,t,n,s,f,u)}if(e instanceof Array){return i(e,t,n,s,f,u)}if(r&&r.Buffer&&r.Buffer.isBuffer(e)){return i(e,t,n,s,f,u)}if(e instanceof ArrayBuffer){return i(new Uint8Array(e),t,n,s,f,u)}if(e.buffer instanceof ArrayBuffer){return i(new Uint8Array(e.buffer,e.byteOffset,e.byteLength),t,n,s,f,u)}if(e instanceof Blob){return o(e,t,n,s,f,u)}throw new Error(\"Unsupported data type.\")}},function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(0);var i=r(1),o=i.toHex;var s=function(){function e(){n(this,e);this._rusha=new a;this._rusha.resetState()}e.prototype.update=function e(t){this._rusha.append(t);return this};e.prototype.digest=function e(t){var e=this._rusha.rawEnd().buffer;if(!t){return e}if(t===\"hex\"){return o(e)}throw new Error(\"unsupported digest encoding\")};return e}();e.exports=function(){return new s}}])});"
},
{
"id": 34,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/pako/dist/pako_inflate.min.js",
"name": "./node_modules/pako/dist/pako_inflate.min.js",
"index": 26,
"index2": 22,
"size": 22682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "pako/dist/pako_inflate.min.js",
"loc": "62:44-84"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).pako=e()}}(function(){return function r(o,s,f){function l(t,e){if(!s[t]){if(!o[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(d)return d(t,!0);var n=new Error(\"Cannot find module '\"+t+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var a=s[t]={exports:{}};o[t][0].call(a.exports,function(e){return l(o[t][1][e]||e)},a,a.exports,r,o,s,f)}return s[t].exports}for(var d=\"function\"==typeof require&&require,e=0;e<f.length;e++)l(f[e]);return l}({1:[function(e,t,i){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;i.assign=function(e){for(var t,i,n=Array.prototype.slice.call(arguments,1);n.length;){var a=n.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var r in a)t=a,i=r,Object.prototype.hasOwnProperty.call(t,i)&&(e[r]=a[r])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,i,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+n),a);else for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){var t,i,n,a,r,o;for(t=n=0,i=e.length;t<i;t++)n+=e[t].length;for(o=new Uint8Array(n),t=a=0,i=e.length;t<i;t++)r=e[t],o.set(r,a),a+=r.length;return o}},r={arraySet:function(e,t,i,n,a){for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,a)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,r))},i.setTyped(n)},{}],2:[function(e,t,i){\"use strict\";var f=e(\"./common\"),a=!0,r=!0;try{String.fromCharCode.apply(null,[0])}catch(e){a=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){r=!1}for(var l=new f.Buf8(256),n=0;n<256;n++)l[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function d(e,t){if(t<65534&&(e.subarray&&r||!e.subarray&&a))return String.fromCharCode.apply(null,f.shrinkBuf(e,t));for(var i=\"\",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}l[254]=l[254]=1,i.string2buf=function(e){var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new f.Buf8(s),a=r=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:(i<2048?t[r++]=192|i>>>6:(i<65536?t[r++]=224|i>>>12:(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63),t[r++]=128|i>>>6&63),t[r++]=128|63&i);return t},i.buf2binstring=function(e){return d(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i<n;i++)t[i]=e.charCodeAt(i);return t},i.buf2string=function(e,t){var i,n,a,r,o=t||e.length,s=new Array(2*o);for(i=n=0;i<o;)if((a=e[i++])<128)s[n++]=a;else if(4<(r=l[a]))s[n++]=65533,i+=r-1;else{for(a&=2===r?31:3===r?15:7;1<r&&i<o;)a=a<<6|63&e[i++],r--;1<r?s[n++]=65533:a<65536?s[n++]=a:(a-=65536,s[n++]=55296|a>>10&1023,s[n++]=56320|1023&a)}return d(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return i<0?t:0===i?t:i+l[e[i]]>t?i:t}},{\"./common\":1}],3:[function(e,t,i){\"use strict\";t.exports=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){for(i-=o=2e3<i?2e3:i;r=r+(a=a+t[n++]|0)|0,--o;);a%=65521,r%=65521}return a|r<<16|0}},{}],4:[function(e,t,i){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],5:[function(e,t,i){\"use strict\";var s=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var a=s,r=n+i;e^=-1;for(var o=n;o<r;o++)e=e>>>8^a[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){\"use strict\";t.exports=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z;i=e.state,n=e.next_in,E=e.input,a=n+(e.avail_in-5),r=e.next_out,Z=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),f=i.dmax,l=i.wsize,d=i.whave,c=i.wnext,u=i.window,h=i.hold,b=i.bits,m=i.lencode,w=i.distcode,k=(1<<i.lenbits)-1,_=(1<<i.distbits)-1;e:do{b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=m[h&k];t:for(;;){if(h>>>=v=g>>>24,b-=v,0===(v=g>>>16&255))Z[r++]=65535&g;else{if(!(16&v)){if(0==(64&v)){g=m[(65535&g)+(h&(1<<v)-1)];continue t}if(32&v){i.mode=12;break e}e.msg=\"invalid literal/length code\",i.mode=30;break e}p=65535&g,(v&=15)&&(b<v&&(h+=E[n++]<<b,b+=8),p+=h&(1<<v)-1,h>>>=v,b-=v),b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=w[h&_];i:for(;;){if(h>>>=v=g>>>24,b-=v,!(16&(v=g>>>16&255))){if(0==(64&v)){g=w[(65535&g)+(h&(1<<v)-1)];continue i}e.msg=\"invalid distance code\",i.mode=30;break e}if(x=65535&g,b<(v&=15)&&(h+=E[n++]<<b,(b+=8)<v&&(h+=E[n++]<<b,b+=8)),f<(x+=h&(1<<v)-1)){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(h>>>=v,b-=v,(v=r-o)<x){if(d<(v=x-v)&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(S=u,(y=0)===c){if(y+=l-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}}else if(c<v){if(y+=l+c-v,(v-=c)<p){for(p-=v;Z[r++]=u[y++],--v;);if(y=0,c<p){for(p-=v=c;Z[r++]=u[y++],--v;);y=r-x,S=Z}}}else if(y+=c-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}for(;2<p;)Z[r++]=S[y++],Z[r++]=S[y++],Z[r++]=S[y++],p-=3;p&&(Z[r++]=S[y++],1<p&&(Z[r++]=S[y++]))}else{for(y=r-x;Z[r++]=Z[y++],Z[r++]=Z[y++],Z[r++]=Z[y++],2<(p-=3););p&&(Z[r++]=Z[y++],1<p&&(Z[r++]=Z[y++]))}break}}break}}while(n<a&&r<s);n-=p=b>>3,h&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n<a?a-n+5:5-(n-a),e.avail_out=r<s?s-r+257:257-(r-s),i.hold=h,i.bits=b}},{}],8:[function(e,t,i){\"use strict\";var z=e(\"../utils/common\"),R=e(\"./adler32\"),N=e(\"./crc32\"),O=e(\"./inffast\"),C=e(\"./inftrees\"),I=1,D=2,T=0,U=-2,F=1,n=852,a=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new z.Buf16(320),this.work=new z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new z.Buf32(n),t.distcode=t.distdyn=new z.Buf32(a),t.sane=1,t.back=-1,T):U}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):U}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,s(e))):U}function l(e,t){var i,n;return e?(n=new r,(e.state=n).window=null,(i=f(e,t))!==T&&(e.state=null),i):U}var d,c,u=!0;function H(e){if(u){var t;for(d=new z.Buf32(512),c=new z.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(C(I,e.lens,0,288,d,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;C(D,e.lens,0,32,c,0,e.work,{bits:5}),u=!1}e.lencode=d,e.lenbits=9,e.distcode=c,e.distbits=5}function j(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new z.Buf8(r.wsize)),n>=r.wsize?(z.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(a=r.wsize-r.wnext)&&(a=n),z.arraySet(r.window,t,i-n,a,r.wnext),(n-=a)?(z.arraySet(r.window,t,i-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0}i.inflateReset=s,i.inflateReset2=f,i.inflateResetKeep=o,i.inflateInit=function(e){return l(e,15)},i.inflateInit2=l,i.inflate=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z=0,B=new z.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(i=e.state).mode&&(i.mode=13),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,c=s,u=f,y=T;e:for(;;)switch(i.mode){case F:if(0===i.wrap){i.mode=13;break}for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(2&i.wrap&&35615===l){B[i.check=0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0),d=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg=\"incorrect header check\",i.mode=30;break}if(8!=(15&l)){e.msg=\"unknown compression method\",i.mode=30;break}if(d-=4,x=8+(15&(l>>>=4)),0===i.wbits)i.wbits=x;else if(x>i.wbits){e.msg=\"invalid window size\",i.mode=30;break}i.dmax=1<<x,e.adler=i.check=1,i.mode=512&l?10:12,d=l=0;break;case 2:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.flags=l,8!=(255&i.flags)){e.msg=\"unknown compression method\",i.mode=30;break}if(57344&i.flags){e.msg=\"unknown header flags set\",i.mode=30;break}i.head&&(i.head.text=l>>8&1),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=3;case 3:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.time=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,B[2]=l>>>16&255,B[3]=l>>>24&255,i.check=N(i.check,B,4,0)),d=l=0,i.mode=4;case 4:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.xflags=255&l,i.head.os=l>>8),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=5;case 5:if(1024&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length=l,i.head&&(i.head.extra_len=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(s<(h=i.length)&&(h=s),h&&(i.head&&(x=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),z.arraySet(i.head.extra,n,r,h,x)),512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.name+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.comment+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(65535&i.check)){e.msg=\"header crc mismatch\",i.mode=30;break}d=l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}e.adler=i.check=L(l),d=l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,2;e.adler=i.check=1,i.mode=12;case 12:if(5===t||6===t)break e;case 13:if(i.last){l>>>=7&d,d-=7&d,i.mode=27;break}for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}switch(i.last=1&l,d-=1,3&(l>>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,d-=2;break e;case 2:i.mode=17;break;case 3:e.msg=\"invalid block type\",i.mode=30}l>>>=2,d-=2;break;case 14:for(l>>>=7&d,d-=7&d;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if((65535&l)!=(l>>>16^65535)){e.msg=\"invalid stored block lengths\",i.mode=30;break}if(i.length=65535&l,d=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(s<h&&(h=s),f<h&&(h=f),0===h)break e;z.arraySet(a,n,r,h,o),s-=h,r+=h,f-=h,o+=h,i.length-=h;break}i.mode=12;break;case 17:for(;d<14;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.nlen=257+(31&l),l>>>=5,d-=5,i.ndist=1+(31&l),l>>>=5,d-=5,i.ncode=4+(15&l),l>>>=4,d-=4,286<i.nlen||30<i.ndist){e.msg=\"too many length or distance symbols\",i.mode=30;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.lens[A[i.have++]]=7&l,l>>>=3,d-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,S={bits:i.lenbits},y=C(0,i.lens,0,19,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid code lengths set\",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(_<16)l>>>=w,d-=w,i.lens[i.have++]=_;else{if(16===_){for(E=w+2;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l>>>=w,d-=w,0===i.have){e.msg=\"invalid bit length repeat\",i.mode=30;break}x=i.lens[i.have-1],h=3+(3&l),l>>>=2,d-=2}else if(17===_){for(E=w+3;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=3+(7&(l>>>=w)),l>>>=3,d-=3}else{for(E=w+7;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=11+(127&(l>>>=w)),l>>>=7,d-=7}if(i.have+h>i.nlen+i.ndist){e.msg=\"invalid bit length repeat\",i.mode=30;break}for(;h--;)i.lens[i.have++]=x}}if(30===i.mode)break;if(0===i.lens[256]){e.msg=\"invalid code -- missing end-of-block\",i.mode=30;break}if(i.lenbits=9,S={bits:i.lenbits},y=C(I,i.lens,0,i.nlen,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid literal/lengths set\",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,S={bits:i.distbits},y=C(D,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,S),i.distbits=S.bits,y){e.msg=\"invalid distances set\",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,O(e,u),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(k&&0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.lencode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,i.length=_,0===k){i.mode=26;break}if(32&k){i.back=-1,i.mode=12;break}if(64&k){e.msg=\"invalid literal/length code\",i.mode=30;break}i.extra=15&k,i.mode=22;case 22:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;k=(Z=i.distcode[l&(1<<i.distbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.distcode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,64&k){e.msg=\"invalid distance code\",i.mode=30;break}i.offset=_,i.extra=15&k,i.mode=24;case 24:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.offset+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg=\"invalid distance too far back\",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(h=u-f,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break}h>i.wnext?(h-=i.wnext,b=i.wsize-h):b=i.wnext-h,h>i.length&&(h=i.length),m=i.window}else m=a,b=o-i.offset,h=i.length;for(f<h&&(h=f),f-=h,i.length-=h;a[o++]=m[b++],--h;);0===i.length&&(i.mode=21);break;case 26:if(0===f)break e;a[o++]=i.length,f--,i.mode=21;break;case 27:if(i.wrap){for(;d<32;){if(0===s)break e;s--,l|=n[r++]<<d,d+=8}if(u-=f,e.total_out+=u,i.total+=u,u&&(e.adler=i.check=i.flags?N(i.check,a,u,o-u):R(i.check,a,u,o-u)),u=f,(i.flags?l:L(l))!==i.check){e.msg=\"incorrect data check\",i.mode=30;break}d=l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(4294967295&i.total)){e.msg=\"incorrect length check\",i.mode=30;break}d=l=0}i.mode=29;case 29:y=1;break e;case 30:y=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,(i.wsize||u!==e.avail_out&&i.mode<30&&(i.mode<27||4!==t))&&j(e,e.output,e.next_out,u-e.avail_out)?(i.mode=31,-4):(c-=e.avail_in,u-=e.avail_out,e.total_in+=c,e.total_out+=u,i.total+=u,i.wrap&&u&&(e.adler=i.check=i.flags?N(i.check,a,u,e.next_out-u):R(i.check,a,u,e.next_out-u)),e.data_type=i.bits+(i.last?64:0)+(12===i.mode?128:0)+(20===i.mode||15===i.mode?256:0),(0===c&&0===u||4===t)&&y===T&&(y=-5),y)},i.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,T},i.inflateGetHeader=function(e,t){var i;return e&&e.state?0==(2&(i=e.state).wrap)?U:((i.head=t).done=!1,T):U},i.inflateSetDictionary=function(e,t){var i,n=t.length;return e&&e.state?0!==(i=e.state).wrap&&11!==i.mode?U:11===i.mode&&R(1,t,n,0)!==i.check?-3:j(e,t,n,n)?(i.mode=31,-4):(i.havedict=1,T):U},i.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":1,\"./adler32\":3,\"./crc32\":5,\"./inffast\":7,\"./inftrees\":9}],9:[function(e,t,i){\"use strict\";var I=e(\"../utils/common\"),D=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],T=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],F=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,i,n,a,r,o,s){var f,l,d,c,u,h,b,m,w,k=s.bits,_=0,g=0,v=0,p=0,x=0,y=0,S=0,E=0,Z=0,B=0,A=null,z=0,R=new I.Buf16(16),N=new I.Buf16(16),O=null,C=0;for(_=0;_<=15;_++)R[_]=0;for(g=0;g<n;g++)R[t[i+g]]++;for(x=k,p=15;1<=p&&0===R[p];p--);if(p<x&&(x=p),0===p)return a[r++]=20971520,a[r++]=20971520,s.bits=1,0;for(v=1;v<p&&0===R[v];v++);for(x<v&&(x=v),_=E=1;_<=15;_++)if(E<<=1,(E-=R[_])<0)return-1;if(0<E&&(0===e||1!==p))return-1;for(N[1]=0,_=1;_<15;_++)N[_+1]=N[_]+R[_];for(g=0;g<n;g++)0!==t[i+g]&&(o[N[t[i+g]]++]=g);if(0===e?(A=O=o,h=19):1===e?(A=D,z-=257,O=T,C-=257,h=256):(A=U,O=F,h=-1),_=v,u=r,S=g=B=0,d=-1,c=(Z=1<<(y=x))-1,1===e&&852<Z||2===e&&592<Z)return 1;for(;;){for(b=_-S,o[g]<h?(m=0,w=o[g]):o[g]>h?(m=O[C+o[g]],w=A[z+o[g]]):(m=96,w=0),f=1<<_-S,v=l=1<<y;a[u+(B>>S)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<_-1;B&f;)f>>=1;if(0!==f?(B&=f-1,B+=f):B=0,g++,0==--R[_]){if(_===p)break;_=t[i+o[g]]}if(x<_&&(B&c)!==d){for(0===S&&(S=x),u+=v,E=1<<(y=_-S);y+S<p&&!((E-=R[y+S])<=0);)y++,E<<=1;if(Z+=1<<y,1===e&&852<Z||2===e&&592<Z)return 1;a[d=B&c]=x<<24|y<<16|u-r|0}}return 0!==B&&(a[u+B]=_-S<<24|64<<16|0),s.bits=x,0}},{\"../utils/common\":1}],10:[function(e,t,i){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],11:[function(e,t,i){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],\"/lib/inflate.js\":[function(e,t,i){\"use strict\";var c=e(\"./zlib/inflate\"),u=e(\"./utils/common\"),h=e(\"./utils/strings\"),b=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),a=e(\"./zlib/zstream\"),r=e(\"./zlib/gzheader\"),m=Object.prototype.toString;function o(e){if(!(this instanceof o))return new o(e);this.options=u.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var i=c.inflateInit2(this.strm,t.windowBits);if(i!==b.Z_OK)throw new Error(n[i]);if(this.header=new r,c.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===m.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=c.inflateSetDictionary(this.strm,t.dictionary))!==b.Z_OK))throw new Error(n[i])}function s(e,t){var i=new o(t);if(i.push(e,!0),i.err)throw i.msg||n[i.err];return i.result}o.prototype.push=function(e,t){var i,n,a,r,o,s=this.strm,f=this.options.chunkSize,l=this.options.dictionary,d=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?b.Z_FINISH:b.Z_NO_FLUSH,\"string\"==typeof e?s.input=h.binstring2buf(e):\"[object ArrayBuffer]\"===m.call(e)?s.input=new Uint8Array(e):s.input=e,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new u.Buf8(f),s.next_out=0,s.avail_out=f),(i=c.inflate(s,b.Z_NO_FLUSH))===b.Z_NEED_DICT&&l&&(i=c.inflateSetDictionary(this.strm,l)),i===b.Z_BUF_ERROR&&!0===d&&(i=b.Z_OK,d=!1),i!==b.Z_STREAM_END&&i!==b.Z_OK)return this.onEnd(i),!(this.ended=!0);s.next_out&&(0!==s.avail_out&&i!==b.Z_STREAM_END&&(0!==s.avail_in||n!==b.Z_FINISH&&n!==b.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(a=h.utf8border(s.output,s.next_out),r=s.next_out-a,o=h.buf2string(s.output,a),s.next_out=r,s.avail_out=f-r,r&&u.arraySet(s.output,s.output,a,r,0),this.onData(o)):this.onData(u.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(d=!0)}while((0<s.avail_in||0===s.avail_out)&&i!==b.Z_STREAM_END);return i===b.Z_STREAM_END&&(n=b.Z_FINISH),n===b.Z_FINISH?(i=c.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===b.Z_OK):n!==b.Z_SYNC_FLUSH||(this.onEnd(b.Z_OK),!(s.avail_out=0))},o.prototype.onData=function(e){this.chunks.push(e)},o.prototype.onEnd=function(e){e===b.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=o,i.inflate=s,i.inflateRaw=function(e,t){return(t=t||{}).raw=!0,s(e,t)},i.ungzip=s},{\"./utils/common\":1,\"./utils/strings\":2,\"./zlib/constants\":4,\"./zlib/gzheader\":6,\"./zlib/inflate\":8,\"./zlib/messages\":10,\"./zlib/zstream\":11}]},{},[])(\"/lib/inflate.js\")});\n"
},
{
"id": 35,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.js",
"name": "./src/lib/crypto.js",
"index": 27,
"index2": 23,
"size": 97349,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./crypto.js",
"loc": "63:15-37"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * CryptoJS core components.\r\n */\r\n\r\nconsole.log('CryptoJS included!');\r\n\r\nvar CryptoJS = this.CryptoJS = globalThis.CryptoJS = CryptoJS || (function (Math, undefined) {\r\n /**\r\n * CryptoJS namespace.\r\n */\r\n var C = {};\r\n\r\n /**\r\n * Library namespace.\r\n */\r\n var C_lib = C.lib = {};\r\n\r\n /**\r\n * Base object for prototypal inheritance.\r\n */\r\n var Base = C_lib.Base = (function () {\r\n function F() {}\r\n\r\n return {\r\n /**\r\n * Creates a new object that inherits from this object.\r\n *\r\n * @param {Object} overrides Properties to copy into the new object.\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * field: 'value',\r\n *\r\n * method: function () {\r\n * }\r\n * });\r\n */\r\n extend: function (overrides) {\r\n // Spawn\r\n F.prototype = this;\r\n var subtype = new F();\r\n\r\n // Augment\r\n if (overrides) {\r\n subtype.mixIn(overrides);\r\n }\r\n\r\n // Create default initializer\r\n if (!subtype.hasOwnProperty('init')) {\r\n subtype.init = function () {\r\n subtype.$super.init.apply(this, arguments);\r\n };\r\n }\r\n\r\n // Initializer's prototype is the subtype object\r\n subtype.init.prototype = subtype;\r\n\r\n // Reference supertype\r\n subtype.$super = this;\r\n\r\n return subtype;\r\n },\r\n\r\n /**\r\n * Extends this object and runs the init method.\r\n * Arguments to create() will be passed to init().\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var instance = MyType.create();\r\n */\r\n create: function () {\r\n var instance = this.extend();\r\n instance.init.apply(instance, arguments);\r\n\r\n return instance;\r\n },\r\n\r\n /**\r\n * Initializes a newly created object.\r\n * Override this method to add some logic when your objects are created.\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * init: function () {\r\n * // ...\r\n * }\r\n * });\r\n */\r\n init: function () {\r\n },\r\n\r\n /**\r\n * Copies properties into this object.\r\n *\r\n * @param {Object} properties The properties to mix in.\r\n *\r\n * @example\r\n *\r\n * MyType.mixIn({\r\n * field: 'value'\r\n * });\r\n */\r\n mixIn: function (properties) {\r\n for (var propertyName in properties) {\r\n if (properties.hasOwnProperty(propertyName)) {\r\n this[propertyName] = properties[propertyName];\r\n }\r\n }\r\n\r\n // IE won't copy toString using the loop above\r\n if (properties.hasOwnProperty('toString')) {\r\n this.toString = properties.toString;\r\n }\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = instance.clone();\r\n */\r\n clone: function () {\r\n return this.init.prototype.extend(this);\r\n }\r\n };\r\n }());\r\n\r\n /**\r\n * An array of 32-bit words.\r\n *\r\n * @property {Array} words The array of 32-bit words.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var WordArray = C_lib.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of 32-bit words.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.create();\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 4;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this word array to a string.\r\n *\r\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\r\n *\r\n * @return {string} The stringified word array.\r\n *\r\n * @example\r\n *\r\n * var string = wordArray + '';\r\n * var string = wordArray.toString();\r\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\r\n */\r\n toString: function (encoder) {\r\n return (encoder || Hex).stringify(this);\r\n },\r\n\r\n /**\r\n * Concatenates a word array to this word array.\r\n *\r\n * @param {WordArray} wordArray The word array to append.\r\n *\r\n * @return {WordArray} This word array.\r\n *\r\n * @example\r\n *\r\n * wordArray1.concat(wordArray2);\r\n */\r\n concat: function (wordArray) {\r\n // Shortcuts\r\n var thisWords = this.words;\r\n var thatWords = wordArray.words;\r\n var thisSigBytes = this.sigBytes;\r\n var thatSigBytes = wordArray.sigBytes;\r\n\r\n // Clamp excess bits\r\n this.clamp();\r\n\r\n // Concat\r\n if (thisSigBytes % 4) {\r\n // Copy one byte at a time\r\n for (var i = 0; i < thatSigBytes; i++) {\r\n var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\r\n }\r\n } else if (thatWords.length > 0xffff) {\r\n // Copy one word at a time\r\n for (var i = 0; i < thatSigBytes; i += 4) {\r\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\r\n }\r\n } else {\r\n // Copy all words at once\r\n // thisWords.push.apply(thisWords, thatWords);\r\n\r\n // HOTFIX from: https://code.google.com/p/crypto-js/issues/detail?id=90\r\n for (var i = 0; i < thatWords.length; i++) {\r\n thisWords.push(thatWords[i]);\r\n }\r\n }\r\n this.sigBytes += thatSigBytes;\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Removes insignificant bits.\r\n *\r\n * @example\r\n *\r\n * wordArray.clamp();\r\n */\r\n clamp: function () {\r\n // Shortcuts\r\n var words = this.words;\r\n var sigBytes = this.sigBytes;\r\n\r\n // Clamp\r\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\r\n words.length = Math.ceil(sigBytes / 4);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = wordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone.words = this.words.slice(0);\r\n\r\n return clone;\r\n },\r\n\r\n /**\r\n * Creates a word array filled with random bytes.\r\n *\r\n * @param {number} nBytes The number of random bytes to generate.\r\n *\r\n * @return {WordArray} The random word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.random(16);\r\n */\r\n random: function (nBytes) {\r\n var words = [];\r\n for (var i = 0; i < nBytes; i += 4) {\r\n words.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n return new WordArray.init(words, nBytes);\r\n }\r\n });\r\n\r\n /**\r\n * Encoder namespace.\r\n */\r\n var C_enc = C.enc = {};\r\n\r\n /**\r\n * Hex encoding strategy.\r\n */\r\n var Hex = C_enc.Hex = {\r\n /**\r\n * Converts a word array to a hex string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The hex string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var hexChars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n hexChars.push((bite >>> 4).toString(16));\r\n hexChars.push((bite & 0x0f).toString(16));\r\n }\r\n\r\n return hexChars.join('');\r\n },\r\n\r\n /**\r\n * Converts a hex string to a word array.\r\n *\r\n * @param {string} hexStr The hex string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\r\n */\r\n parse: function (hexStr) {\r\n // Shortcut\r\n var hexStrLength = hexStr.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < hexStrLength; i += 2) {\r\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\r\n }\r\n\r\n return new WordArray.init(words, hexStrLength / 2);\r\n }\r\n };\r\n\r\n /**\r\n * Latin1 encoding strategy.\r\n */\r\n var Latin1 = C_enc.Latin1 = {\r\n /**\r\n * Converts a word array to a Latin1 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The Latin1 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var latin1Chars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n latin1Chars.push(String.fromCharCode(bite));\r\n }\r\n\r\n return latin1Chars.join('');\r\n },\r\n\r\n /**\r\n * Converts a Latin1 string to a word array.\r\n *\r\n * @param {string} latin1Str The Latin1 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\r\n */\r\n parse: function (latin1Str) {\r\n // Shortcut\r\n var latin1StrLength = latin1Str.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < latin1StrLength; i++) {\r\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new WordArray.init(words, latin1StrLength);\r\n }\r\n };\r\n\r\n /**\r\n * UTF-8 encoding strategy.\r\n */\r\n var Utf8 = C_enc.Utf8 = {\r\n /**\r\n * Converts a word array to a UTF-8 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The UTF-8 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n try {\r\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\r\n } catch (e) {\r\n throw new Error('Malformed UTF-8 data');\r\n }\r\n },\r\n\r\n /**\r\n * Converts a UTF-8 string to a word array.\r\n *\r\n * @param {string} utf8Str The UTF-8 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\r\n */\r\n parse: function (utf8Str) {\r\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\r\n }\r\n };\r\n\r\n /**\r\n * Abstract buffered block algorithm template.\r\n *\r\n * The property blockSize must be implemented in a concrete subtype.\r\n *\r\n * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\r\n */\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\r\n /**\r\n * Resets this block algorithm's data buffer to its initial state.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm.reset();\r\n */\r\n reset: function () {\r\n // Initial values\r\n this._data = new WordArray.init();\r\n this._nDataBytes = 0;\r\n },\r\n\r\n /**\r\n * Adds new data to this block algorithm's buffer.\r\n *\r\n * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm._append('data');\r\n * bufferedBlockAlgorithm._append(wordArray);\r\n */\r\n _append: function (data) {\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof data == 'string') {\r\n data = Utf8.parse(data);\r\n }\r\n\r\n // Append\r\n this._data.concat(data);\r\n this._nDataBytes += data.sigBytes;\r\n },\r\n\r\n /**\r\n * Processes available data blocks.\r\n *\r\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\r\n *\r\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\r\n *\r\n * @return {WordArray} The processed data.\r\n *\r\n * @example\r\n *\r\n * var processedData = bufferedBlockAlgorithm._process();\r\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\r\n */\r\n _process: function (doFlush) {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n var dataSigBytes = data.sigBytes;\r\n var blockSize = this.blockSize;\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count blocks ready\r\n var nBlocksReady = dataSigBytes / blockSizeBytes;\r\n if (doFlush) {\r\n // Round up to include partial blocks\r\n nBlocksReady = Math.ceil(nBlocksReady);\r\n } else {\r\n // Round down to include only full blocks,\r\n // less the number of blocks that must remain in the buffer\r\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\r\n }\r\n\r\n // Count words ready\r\n var nWordsReady = nBlocksReady * blockSize;\r\n\r\n // Count bytes ready\r\n var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\r\n\r\n // Process blocks\r\n if (nWordsReady) {\r\n for (var offset = 0; offset < nWordsReady; offset += blockSize) {\r\n // Perform concrete-algorithm logic\r\n this._doProcessBlock(dataWords, offset);\r\n }\r\n\r\n // Remove processed words\r\n var processedWords = dataWords.splice(0, nWordsReady);\r\n data.sigBytes -= nBytesReady;\r\n }\r\n\r\n // Return processed words\r\n return new WordArray.init(processedWords, nBytesReady);\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = bufferedBlockAlgorithm.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone._data = this._data.clone();\r\n\r\n return clone;\r\n },\r\n\r\n _minBufferSize: 0\r\n });\r\n\r\n /**\r\n * Abstract hasher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\r\n */\r\n var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Initializes a newly created hasher.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\r\n *\r\n * @example\r\n *\r\n * var hasher = CryptoJS.algo.SHA256.create();\r\n */\r\n init: function (cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this hasher to its initial state.\r\n *\r\n * @example\r\n *\r\n * hasher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-hasher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Updates this hasher with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {Hasher} This hasher.\r\n *\r\n * @example\r\n *\r\n * hasher.update('message');\r\n * hasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n // Append\r\n this._append(messageUpdate);\r\n\r\n // Update the hash\r\n this._process();\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the hash computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @example\r\n *\r\n * var hash = hasher.finalize();\r\n * var hash = hasher.finalize('message');\r\n * var hash = hasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Final message update\r\n if (messageUpdate) {\r\n this._append(messageUpdate);\r\n }\r\n\r\n // Perform concrete-hasher logic\r\n var hash = this._doFinalize();\r\n\r\n return hash;\r\n },\r\n\r\n blockSize: 512/32,\r\n\r\n /**\r\n * Creates a shortcut function to a hasher's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to create a helper for.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHelper: function (hasher) {\r\n return function (message, cfg) {\r\n return new hasher.init(cfg).finalize(message);\r\n };\r\n },\r\n\r\n /**\r\n * Creates a shortcut function to the HMAC's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to use in this HMAC helper.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHmacHelper: function (hasher) {\r\n return function (message, key) {\r\n return new C_algo.HMAC.init(hasher, key).finalize(message);\r\n };\r\n }\r\n });\r\n\r\n /**\r\n * Algorithm namespace.\r\n */\r\n var C_algo = C.algo = {};\r\n\r\n return C;\r\n}(Math));\r\n\r\nmodule.exports = CryptoJS;\r\n\r\n(function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var X32WordArray = C_lib.WordArray;\r\n\r\n /**\r\n * x64 namespace.\r\n */\r\n var C_x64 = C.x64 = {};\r\n\r\n /**\r\n * A 64-bit word.\r\n */\r\n var X64Word = C_x64.Word = Base.extend({\r\n /**\r\n * Initializes a newly created 64-bit word.\r\n *\r\n * @param {number} high The high 32 bits.\r\n * @param {number} low The low 32 bits.\r\n *\r\n * @example\r\n *\r\n * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\r\n */\r\n init: function (high, low) {\r\n this.high = high;\r\n this.low = low;\r\n }\r\n\r\n /**\r\n * Bitwise NOTs this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after negating.\r\n *\r\n * @example\r\n *\r\n * var negated = x64Word.not();\r\n */\r\n // not: function () {\r\n // var high = ~this.high;\r\n // var low = ~this.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ANDs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to AND with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ANDing.\r\n *\r\n * @example\r\n *\r\n * var anded = x64Word.and(anotherX64Word);\r\n */\r\n // and: function (word) {\r\n // var high = this.high & word.high;\r\n // var low = this.low & word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to OR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ORing.\r\n *\r\n * @example\r\n *\r\n * var ored = x64Word.or(anotherX64Word);\r\n */\r\n // or: function (word) {\r\n // var high = this.high | word.high;\r\n // var low = this.low | word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise XORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to XOR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after XORing.\r\n *\r\n * @example\r\n *\r\n * var xored = x64Word.xor(anotherX64Word);\r\n */\r\n // xor: function (word) {\r\n // var high = this.high ^ word.high;\r\n // var low = this.low ^ word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftL(25);\r\n */\r\n // shiftL: function (n) {\r\n // if (n < 32) {\r\n // var high = (this.high << n) | (this.low >>> (32 - n));\r\n // var low = this.low << n;\r\n // } else {\r\n // var high = this.low << (n - 32);\r\n // var low = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftR(7);\r\n */\r\n // shiftR: function (n) {\r\n // if (n < 32) {\r\n // var low = (this.low >>> n) | (this.high << (32 - n));\r\n // var high = this.high >>> n;\r\n // } else {\r\n // var low = this.high >>> (n - 32);\r\n // var high = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotL(25);\r\n */\r\n // rotL: function (n) {\r\n // return this.shiftL(n).or(this.shiftR(64 - n));\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotR(7);\r\n */\r\n // rotR: function (n) {\r\n // return this.shiftR(n).or(this.shiftL(64 - n));\r\n // },\r\n\r\n /**\r\n * Adds this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to add with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after adding.\r\n *\r\n * @example\r\n *\r\n * var added = x64Word.add(anotherX64Word);\r\n */\r\n // add: function (word) {\r\n // var low = (this.low + word.low) | 0;\r\n // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\r\n // var high = (this.high + word.high + carry) | 0;\r\n\r\n // return X64Word.create(high, low);\r\n // }\r\n });\r\n\r\n /**\r\n * An array of 64-bit words.\r\n *\r\n * @property {Array} words The array of CryptoJS.x64.Word objects.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var X64WordArray = C_x64.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create();\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ]);\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ], 10);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 8;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this 64-bit word array to a 32-bit word array.\r\n *\r\n * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\r\n *\r\n * @example\r\n *\r\n * var x32WordArray = x64WordArray.toX32();\r\n */\r\n toX32: function () {\r\n // Shortcuts\r\n var x64Words = this.words;\r\n var x64WordsLength = x64Words.length;\r\n\r\n // Convert\r\n var x32Words = [];\r\n for (var i = 0; i < x64WordsLength; i++) {\r\n var x64Word = x64Words[i];\r\n x32Words.push(x64Word.high);\r\n x32Words.push(x64Word.low);\r\n }\r\n\r\n return X32WordArray.create(x32Words, this.sigBytes);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {X64WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = x64WordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n\r\n // Clone \"words\" array\r\n var words = clone.words = this.words.slice(0);\r\n\r\n // Clone each X64Word object\r\n var wordsLength = words.length;\r\n for (var i = 0; i < wordsLength; i++) {\r\n words[i] = words[i].clone();\r\n }\r\n\r\n return clone;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Hasher = C_lib.Hasher;\r\n var C_x64 = C.x64;\r\n var X64Word = C_x64.Word;\r\n var X64WordArray = C_x64.WordArray;\r\n var C_algo = C.algo;\r\n\r\n function X64Word_create() {\r\n return X64Word.create.apply(X64Word, arguments);\r\n }\r\n\r\n // Constants\r\n var K = [\r\n X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\r\n X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\r\n X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\r\n X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\r\n X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\r\n X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\r\n X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\r\n X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\r\n X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\r\n X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\r\n X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\r\n X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\r\n X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\r\n X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\r\n X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\r\n X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\r\n X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\r\n X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\r\n X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\r\n X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\r\n X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\r\n X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\r\n X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\r\n X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\r\n X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\r\n X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\r\n X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\r\n X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\r\n X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\r\n X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\r\n X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\r\n X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\r\n X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\r\n X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\r\n X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\r\n X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\r\n X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\r\n X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\r\n X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\r\n X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\r\n ];\r\n\r\n // Reusable objects\r\n var W = [];\r\n (function () {\r\n for (var i = 0; i < 80; i++) {\r\n W[i] = X64Word_create();\r\n }\r\n }());\r\n\r\n /**\r\n * SHA-512 hash algorithm.\r\n */\r\n var SHA512 = C_algo.SHA512 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new X64WordArray.init([\r\n new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\r\n new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\r\n new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\r\n new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\r\n ]);\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcuts\r\n var H = this._hash.words;\r\n\r\n var H0 = H[0];\r\n var H1 = H[1];\r\n var H2 = H[2];\r\n var H3 = H[3];\r\n var H4 = H[4];\r\n var H5 = H[5];\r\n var H6 = H[6];\r\n var H7 = H[7];\r\n\r\n var H0h = H0.high;\r\n var H0l = H0.low;\r\n var H1h = H1.high;\r\n var H1l = H1.low;\r\n var H2h = H2.high;\r\n var H2l = H2.low;\r\n var H3h = H3.high;\r\n var H3l = H3.low;\r\n var H4h = H4.high;\r\n var H4l = H4.low;\r\n var H5h = H5.high;\r\n var H5l = H5.low;\r\n var H6h = H6.high;\r\n var H6l = H6.low;\r\n var H7h = H7.high;\r\n var H7l = H7.low;\r\n\r\n // Working variables\r\n var ah = H0h;\r\n var al = H0l;\r\n var bh = H1h;\r\n var bl = H1l;\r\n var ch = H2h;\r\n var cl = H2l;\r\n var dh = H3h;\r\n var dl = H3l;\r\n var eh = H4h;\r\n var el = H4l;\r\n var fh = H5h;\r\n var fl = H5l;\r\n var gh = H6h;\r\n var gl = H6l;\r\n var hh = H7h;\r\n var hl = H7l;\r\n\r\n // Rounds\r\n for (var i = 0; i < 80; i++) {\r\n var Wil;\r\n var Wih;\r\n\r\n // Shortcut\r\n var Wi = W[i];\r\n\r\n // Extend message\r\n if (i < 16) {\r\n Wih = Wi.high = M[offset + i * 2] | 0;\r\n Wil = Wi.low = M[offset + i * 2 + 1] | 0;\r\n } else {\r\n // Gamma0\r\n var gamma0x = W[i - 15];\r\n var gamma0xh = gamma0x.high;\r\n var gamma0xl = gamma0x.low;\r\n var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\r\n var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\r\n\r\n // Gamma1\r\n var gamma1x = W[i - 2];\r\n var gamma1xh = gamma1x.high;\r\n var gamma1xl = gamma1x.low;\r\n var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\r\n var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\r\n\r\n // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\r\n var Wi7 = W[i - 7];\r\n var Wi7h = Wi7.high;\r\n var Wi7l = Wi7.low;\r\n\r\n var Wi16 = W[i - 16];\r\n var Wi16h = Wi16.high;\r\n var Wi16l = Wi16.low;\r\n\r\n Wil = gamma0l + Wi7l;\r\n Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\r\n Wil = Wil + gamma1l;\r\n Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\r\n Wil = Wil + Wi16l;\r\n Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\r\n\r\n Wi.high = Wih;\r\n Wi.low = Wil;\r\n }\r\n\r\n var chh = (eh & fh) ^ (~eh & gh);\r\n var chl = (el & fl) ^ (~el & gl);\r\n var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\r\n var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\r\n\r\n var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\r\n var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\r\n var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\r\n var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\r\n\r\n // t1 = h + sigma1 + ch + K[i] + W[i]\r\n var Ki = K[i];\r\n var Kih = Ki.high;\r\n var Kil = Ki.low;\r\n\r\n var t1l = hl + sigma1l;\r\n var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\r\n var t1l = t1l + chl;\r\n var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\r\n var t1l = t1l + Kil;\r\n var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\r\n var t1l = t1l + Wil;\r\n var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\r\n\r\n // t2 = sigma0 + maj\r\n var t2l = sigma0l + majl;\r\n var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\r\n\r\n // Update working variables\r\n hh = gh;\r\n hl = gl;\r\n gh = fh;\r\n gl = fl;\r\n fh = eh;\r\n fl = el;\r\n el = (dl + t1l) | 0;\r\n eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\r\n dh = ch;\r\n dl = cl;\r\n ch = bh;\r\n cl = bl;\r\n bh = ah;\r\n bl = al;\r\n al = (t1l + t2l) | 0;\r\n ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H0l = H0.low = (H0l + al);\r\n H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\r\n H1l = H1.low = (H1l + bl);\r\n H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\r\n H2l = H2.low = (H2l + cl);\r\n H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\r\n H3l = H3.low = (H3l + dl);\r\n H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\r\n H4l = H4.low = (H4l + el);\r\n H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\r\n H5l = H5.low = (H5l + fl);\r\n H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\r\n H6l = H6.low = (H6l + gl);\r\n H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\r\n H7l = H7.low = (H7l + hl);\r\n H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Convert hash to 32-bit word array before returning\r\n var hash = this._hash.toX32();\r\n\r\n // Return final computed hash\r\n return hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n },\r\n\r\n blockSize: 1024/32\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA512('message');\r\n * var hash = CryptoJS.SHA512(wordArray);\r\n */\r\n C.SHA512 = Hasher._createHelper(SHA512);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA512(message, key);\r\n */\r\n C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\r\n}());\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * Cipher core components.\r\n */\r\nCryptoJS.lib.Cipher || (function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var Base64 = C_enc.Base64;\r\n var C_algo = C.algo;\r\n var EvpKDF = C_algo.EvpKDF;\r\n\r\n /**\r\n * Abstract base cipher template.\r\n *\r\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\r\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\r\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\r\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\r\n */\r\n var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {WordArray} iv The IV to use for this operation.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Creates this cipher in encryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createEncryptor: function (key, cfg) {\r\n return this.create(this._ENC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Creates this cipher in decryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createDecryptor: function (key, cfg) {\r\n return this.create(this._DEC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Initializes a newly created cipher.\r\n *\r\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\r\n */\r\n init: function (xformMode, key, cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Store transform mode and key\r\n this._xformMode = xformMode;\r\n this._key = key;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this cipher to its initial state.\r\n *\r\n * @example\r\n *\r\n * cipher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-cipher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Adds data to be encrypted or decrypted.\r\n *\r\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.process('data');\r\n * var encrypted = cipher.process(wordArray);\r\n */\r\n process: function (dataUpdate) {\r\n // Append\r\n this._append(dataUpdate);\r\n\r\n // Process available blocks\r\n return this._process();\r\n },\r\n\r\n /**\r\n * Finalizes the encryption or decryption process.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after final processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.finalize();\r\n * var encrypted = cipher.finalize('data');\r\n * var encrypted = cipher.finalize(wordArray);\r\n */\r\n finalize: function (dataUpdate) {\r\n // Final data update\r\n if (dataUpdate) {\r\n this._append(dataUpdate);\r\n }\r\n\r\n // Perform concrete-cipher logic\r\n var finalProcessedData = this._doFinalize();\r\n\r\n return finalProcessedData;\r\n },\r\n\r\n keySize: 128/32,\r\n\r\n ivSize: 128/32,\r\n\r\n _ENC_XFORM_MODE: 1,\r\n\r\n _DEC_XFORM_MODE: 2,\r\n\r\n /**\r\n * Creates shortcut functions to a cipher's object interface.\r\n *\r\n * @param {Cipher} cipher The cipher to create a helper for.\r\n *\r\n * @return {Object} An object with encrypt and decrypt shortcut functions.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\r\n */\r\n _createHelper: (function () {\r\n function selectCipherStrategy(key) {\r\n if (typeof key == 'string') {\r\n return PasswordBasedCipher;\r\n } else {\r\n return SerializableCipher;\r\n }\r\n }\r\n\r\n return function (cipher) {\r\n return {\r\n encrypt: function (message, key, cfg) {\r\n return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\r\n },\r\n\r\n decrypt: function (ciphertext, key, cfg) {\r\n return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\r\n }\r\n };\r\n };\r\n }())\r\n });\r\n\r\n /**\r\n * Abstract base stream cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\r\n */\r\n var StreamCipher = C_lib.StreamCipher = Cipher.extend({\r\n _doFinalize: function () {\r\n // Process partial blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 1\r\n });\r\n\r\n /**\r\n * Mode namespace.\r\n */\r\n var C_mode = C.mode = {};\r\n\r\n /**\r\n * Abstract base block cipher mode template.\r\n */\r\n var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\r\n /**\r\n * Creates this mode for encryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\r\n */\r\n createEncryptor: function (cipher, iv) {\r\n return this.Encryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Creates this mode for decryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\r\n */\r\n createDecryptor: function (cipher, iv) {\r\n return this.Decryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Initializes a newly created mode.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\r\n */\r\n init: function (cipher, iv) {\r\n this._cipher = cipher;\r\n this._iv = iv;\r\n }\r\n });\r\n\r\n /**\r\n * Cipher Block Chaining mode.\r\n */\r\n var CBC = C_mode.CBC = (function () {\r\n /**\r\n * Abstract base CBC mode.\r\n */\r\n var CBC = BlockCipherMode.extend();\r\n\r\n /**\r\n * CBC encryptor.\r\n */\r\n CBC.Encryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // XOR and encrypt\r\n xorBlock.call(this, words, offset, blockSize);\r\n cipher.encryptBlock(words, offset);\r\n\r\n // Remember this block to use with next block\r\n this._prevBlock = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n /**\r\n * CBC decryptor.\r\n */\r\n CBC.Decryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // Remember this block to use with next block\r\n var thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n // Decrypt and XOR\r\n cipher.decryptBlock(words, offset);\r\n xorBlock.call(this, words, offset, blockSize);\r\n\r\n // This block becomes the previous block\r\n this._prevBlock = thisBlock;\r\n }\r\n });\r\n\r\n function xorBlock(words, offset, blockSize) {\r\n // Shortcut\r\n var iv = this._iv;\r\n\r\n // Choose mixing block\r\n if (iv) {\r\n var block = iv;\r\n\r\n // Remove IV for subsequent blocks\r\n this._iv = undefined;\r\n } else {\r\n var block = this._prevBlock;\r\n }\r\n\r\n // XOR blocks\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return CBC;\r\n }());\r\n\r\n\r\n /**\r\n * Infinite Garble Extension mode.\r\n */\r\n var IGE = C_mode.IGE = (function () {\r\n /**\r\n * Abstract base IGE mode.\r\n */\r\n var IGE = BlockCipherMode.extend();\r\n\r\n /**\r\n * IGE encryptor.\r\n */\r\n IGE.Encryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, blockSize + blockSize);\r\n }\r\n\r\n\r\n // Remember this block to use with next block\r\n var nextIv2p = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.encryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n this._ivp = words.slice(offset, offset + blockSize);\r\n this._iv2p = nextIv2p;\r\n }\r\n });\r\n\r\n /**\r\n * IGE decryptor.\r\n */\r\n IGE.Decryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, 2 * blockSize);\r\n }\r\n\r\n // Remember this block to use with next block\r\n var nextIvp = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.decryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n this._ivp = nextIvp;\r\n this._iv2p = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n function xorBlock(words, block, offset, blockSize) {\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return IGE;\r\n }());\r\n\r\n /**\r\n * Padding namespace.\r\n */\r\n var C_pad = C.pad = {};\r\n\r\n /**\r\n * PKCS #5/7 padding strategy.\r\n */\r\n var Pkcs7 = C_pad.Pkcs7 = {\r\n /**\r\n * Pads data using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to pad.\r\n * @param {number} blockSize The multiple that the data should be padded to.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\r\n */\r\n pad: function (data, blockSize) {\r\n // Shortcut\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count padding bytes\r\n var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n // Create padding word\r\n var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\r\n\r\n // Create padding\r\n var paddingWords = [];\r\n for (var i = 0; i < nPaddingBytes; i += 4) {\r\n paddingWords.push(paddingWord);\r\n }\r\n var padding = WordArray.create(paddingWords, nPaddingBytes);\r\n\r\n // Add padding\r\n data.concat(padding);\r\n },\r\n\r\n /**\r\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to unpad.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\r\n */\r\n unpad: function (data) {\r\n // Get number of padding bytes from last byte\r\n var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n // Remove padding\r\n data.sigBytes -= nPaddingBytes;\r\n }\r\n };\r\n\r\n var NoPadding = C_pad.NoPadding = {\r\n pad: function () {\r\n },\r\n\r\n unpad: function () {\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Abstract base block cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\r\n */\r\n var BlockCipher = C_lib.BlockCipher = Cipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Mode} mode The block mode to use. Default: CBC\r\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\r\n */\r\n cfg: Cipher.cfg.extend({\r\n mode: CBC,\r\n padding: Pkcs7\r\n }),\r\n\r\n reset: function () {\r\n // Reset cipher\r\n Cipher.reset.call(this);\r\n\r\n // Shortcuts\r\n var cfg = this.cfg;\r\n var iv = cfg.iv;\r\n var mode = cfg.mode;\r\n\r\n // Reset block mode\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n var modeCreator = mode.createEncryptor;\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n var modeCreator = mode.createDecryptor;\r\n\r\n // Keep at least one block in the buffer for unpadding\r\n this._minBufferSize = 1;\r\n }\r\n this._mode = modeCreator.call(mode, this, iv && iv.words);\r\n },\r\n\r\n _doProcessBlock: function (words, offset) {\r\n this._mode.processBlock(words, offset);\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcut\r\n var padding = this.cfg.padding;\r\n\r\n // Finalize\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n // Pad data\r\n padding.pad(this._data, this.blockSize);\r\n\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n // Unpad data\r\n padding.unpad(finalProcessedBlocks);\r\n }\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 128/32\r\n });\r\n\r\n /**\r\n * A collection of cipher parameters.\r\n *\r\n * @property {WordArray} ciphertext The raw ciphertext.\r\n * @property {WordArray} key The key to this ciphertext.\r\n * @property {WordArray} iv The IV used in the ciphering operation.\r\n * @property {WordArray} salt The salt used with a key derivation function.\r\n * @property {Cipher} algorithm The cipher algorithm.\r\n * @property {Mode} mode The block mode used in the ciphering operation.\r\n * @property {Padding} padding The padding scheme used in the ciphering operation.\r\n * @property {number} blockSize The block size of the cipher.\r\n * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\r\n */\r\n var CipherParams = C_lib.CipherParams = Base.extend({\r\n /**\r\n * Initializes a newly created cipher params object.\r\n *\r\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.lib.CipherParams.create({\r\n * ciphertext: ciphertextWordArray,\r\n * key: keyWordArray,\r\n * iv: ivWordArray,\r\n * salt: saltWordArray,\r\n * algorithm: CryptoJS.algo.AES,\r\n * mode: CryptoJS.mode.CBC,\r\n * padding: CryptoJS.pad.PKCS7,\r\n * blockSize: 4,\r\n * formatter: CryptoJS.format.OpenSSL\r\n * });\r\n */\r\n init: function (cipherParams) {\r\n this.mixIn(cipherParams);\r\n },\r\n\r\n /**\r\n * Converts this cipher params object to a string.\r\n *\r\n * @param {Format} formatter (Optional) The formatting strategy to use.\r\n *\r\n * @return {string} The stringified cipher params.\r\n *\r\n * @throws Error If neither the formatter nor the default formatter is set.\r\n *\r\n * @example\r\n *\r\n * var string = cipherParams + '';\r\n * var string = cipherParams.toString();\r\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\r\n */\r\n toString: function (formatter) {\r\n return (formatter || this.formatter).stringify(this);\r\n }\r\n });\r\n\r\n /**\r\n * Format namespace.\r\n */\r\n var C_format = C.format = {};\r\n\r\n /**\r\n * OpenSSL formatting strategy.\r\n */\r\n var OpenSSLFormatter = C_format.OpenSSL = {\r\n /**\r\n * Converts a cipher params object to an OpenSSL-compatible string.\r\n *\r\n * @param {CipherParams} cipherParams The cipher params object.\r\n *\r\n * @return {string} The OpenSSL-compatible string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\r\n */\r\n stringify: function (cipherParams) {\r\n // Shortcuts\r\n var ciphertext = cipherParams.ciphertext;\r\n var salt = cipherParams.salt;\r\n\r\n // Format\r\n if (salt) {\r\n var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\r\n } else {\r\n var wordArray = ciphertext;\r\n }\r\n\r\n return wordArray.toString(Base64);\r\n },\r\n\r\n /**\r\n * Converts an OpenSSL-compatible string to a cipher params object.\r\n *\r\n * @param {string} openSSLStr The OpenSSL-compatible string.\r\n *\r\n * @return {CipherParams} The cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\r\n */\r\n parse: function (openSSLStr) {\r\n // Parse base64\r\n var ciphertext = Base64.parse(openSSLStr);\r\n\r\n // Shortcut\r\n var ciphertextWords = ciphertext.words;\r\n\r\n // Test for salt\r\n if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\r\n // Extract salt\r\n var salt = WordArray.create(ciphertextWords.slice(2, 4));\r\n\r\n // Remove salt from ciphertext\r\n ciphertextWords.splice(0, 4);\r\n ciphertext.sigBytes -= 16;\r\n }\r\n\r\n return CipherParams.create({ ciphertext: ciphertext, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\r\n */\r\n var SerializableCipher = C_lib.SerializableCipher = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\r\n */\r\n cfg: Base.extend({\r\n format: OpenSSLFormatter\r\n }),\r\n\r\n /**\r\n * Encrypts a message.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Encrypt\r\n var encryptor = cipher.createEncryptor(key, cfg);\r\n var ciphertext = encryptor.finalize(message);\r\n\r\n // Shortcut\r\n var cipherCfg = encryptor.cfg;\r\n\r\n // Create and return serializable cipher params\r\n return CipherParams.create({\r\n ciphertext: ciphertext,\r\n key: key,\r\n iv: cipherCfg.iv,\r\n algorithm: cipher,\r\n mode: cipherCfg.mode,\r\n padding: cipherCfg.padding,\r\n blockSize: cipher.blockSize,\r\n formatter: cfg.format\r\n });\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Decrypt\r\n var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\r\n\r\n return plaintext;\r\n },\r\n\r\n /**\r\n * Converts serialized ciphertext to CipherParams,\r\n * else assumed CipherParams already and returns ciphertext unchanged.\r\n *\r\n * @param {CipherParams|string} ciphertext The ciphertext.\r\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\r\n *\r\n * @return {CipherParams} The unserialized ciphertext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\r\n */\r\n _parse: function (ciphertext, format) {\r\n if (typeof ciphertext == 'string') {\r\n return format.parse(ciphertext, this);\r\n } else {\r\n return ciphertext;\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * Key derivation function namespace.\r\n */\r\n var C_kdf = C.kdf = {};\r\n\r\n /**\r\n * OpenSSL key derivation function.\r\n */\r\n var OpenSSLKdf = C_kdf.OpenSSL = {\r\n /**\r\n * Derives a key and IV from a password.\r\n *\r\n * @param {string} password The password to derive from.\r\n * @param {number} keySize The size in words of the key to generate.\r\n * @param {number} ivSize The size in words of the IV to generate.\r\n * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\r\n *\r\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\r\n */\r\n execute: function (password, keySize, ivSize, salt) {\r\n // Generate random salt\r\n if (!salt) {\r\n salt = WordArray.random(64/8);\r\n }\r\n\r\n // Derive key and IV\r\n var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\r\n\r\n // Separate key and IV\r\n var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\r\n key.sigBytes = keySize * 4;\r\n\r\n // Return params\r\n return CipherParams.create({ key: key, iv: iv, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A serializable cipher wrapper that derives the key from a password,\r\n * and returns ciphertext as a serializable cipher params object.\r\n */\r\n var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\r\n */\r\n cfg: SerializableCipher.cfg.extend({\r\n kdf: OpenSSLKdf\r\n }),\r\n\r\n /**\r\n * Encrypts a message using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Encrypt\r\n var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\r\n\r\n // Mix in derived params\r\n ciphertext.mixIn(derivedParams);\r\n\r\n return ciphertext;\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Decrypt\r\n var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\r\n\r\n return plaintext;\r\n }\r\n });\r\n}());\r\n\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var BlockCipher = C_lib.BlockCipher;\r\n var C_algo = C.algo;\r\n\r\n // Lookup tables\r\n var SBOX = [];\r\n var INV_SBOX = [];\r\n var SUB_MIX_0 = [];\r\n var SUB_MIX_1 = [];\r\n var SUB_MIX_2 = [];\r\n var SUB_MIX_3 = [];\r\n var INV_SUB_MIX_0 = [];\r\n var INV_SUB_MIX_1 = [];\r\n var INV_SUB_MIX_2 = [];\r\n var INV_SUB_MIX_3 = [];\r\n\r\n // Compute lookup tables\r\n (function () {\r\n // Compute double table\r\n var d = [];\r\n for (var i = 0; i < 256; i++) {\r\n if (i < 128) {\r\n d[i] = i << 1;\r\n } else {\r\n d[i] = (i << 1) ^ 0x11b;\r\n }\r\n }\r\n\r\n // Walk GF(2^8)\r\n var x = 0;\r\n var xi = 0;\r\n for (var i = 0; i < 256; i++) {\r\n // Compute sbox\r\n var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\r\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\r\n SBOX[x] = sx;\r\n INV_SBOX[sx] = x;\r\n\r\n // Compute multiplication\r\n var x2 = d[x];\r\n var x4 = d[x2];\r\n var x8 = d[x4];\r\n\r\n // Compute sub bytes, mix columns tables\r\n var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\r\n SUB_MIX_0[x] = (t << 24) | (t >>> 8);\r\n SUB_MIX_1[x] = (t << 16) | (t >>> 16);\r\n SUB_MIX_2[x] = (t << 8) | (t >>> 24);\r\n SUB_MIX_3[x] = t;\r\n\r\n // Compute inv sub bytes, inv mix columns tables\r\n var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\r\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\r\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\r\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\r\n INV_SUB_MIX_3[sx] = t;\r\n\r\n // Compute next counter\r\n if (!x) {\r\n x = xi = 1;\r\n } else {\r\n x = x2 ^ d[d[d[x8 ^ x2]]];\r\n xi ^= d[d[xi]];\r\n }\r\n }\r\n }());\r\n\r\n // Precomputed Rcon lookup\r\n var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n /**\r\n * AES block cipher algorithm.\r\n */\r\n var AES = C_algo.AES = BlockCipher.extend({\r\n _doReset: function () {\r\n // Shortcuts\r\n var key = this._key;\r\n var keyWords = key.words;\r\n var keySize = key.sigBytes / 4;\r\n\r\n // Compute number of rounds\r\n var nRounds = this._nRounds = keySize + 6\r\n\r\n // Compute number of key schedule rows\r\n var ksRows = (nRounds + 1) * 4;\r\n\r\n // Compute key schedule\r\n var keySchedule = this._keySchedule = [];\r\n for (var ksRow = 0; ksRow < ksRows; ksRow++) {\r\n if (ksRow < keySize) {\r\n keySchedule[ksRow] = keyWords[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 1];\r\n\r\n if (!(ksRow % keySize)) {\r\n // Rot word\r\n t = (t << 8) | (t >>> 24);\r\n\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\r\n // Mix Rcon\r\n t ^= RCON[(ksRow / keySize) | 0] << 24;\r\n } else if (keySize > 6 && ksRow % keySize == 4) {\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n }\r\n\r\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\r\n }\r\n }\r\n\r\n // Compute inv key schedule\r\n var invKeySchedule = this._invKeySchedule = [];\r\n for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\r\n var ksRow = ksRows - invKsRow;\r\n\r\n if (invKsRow % 4) {\r\n var t = keySchedule[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 4];\r\n }\r\n\r\n if (invKsRow < 4 || ksRow <= 4) {\r\n invKeySchedule[invKsRow] = t;\r\n } else {\r\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\r\n INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\r\n }\r\n }\r\n },\r\n\r\n encryptBlock: function (M, offset) {\r\n this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\r\n },\r\n\r\n decryptBlock: function (M, offset) {\r\n // Swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n\r\n this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\r\n\r\n // Inv swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n },\r\n\r\n _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\r\n // Shortcut\r\n var nRounds = this._nRounds;\r\n\r\n // Get input, add round key\r\n var s0 = M[offset] ^ keySchedule[0];\r\n var s1 = M[offset + 1] ^ keySchedule[1];\r\n var s2 = M[offset + 2] ^ keySchedule[2];\r\n var s3 = M[offset + 3] ^ keySchedule[3];\r\n\r\n // Key schedule row counter\r\n var ksRow = 4;\r\n\r\n // Rounds\r\n for (var round = 1; round < nRounds; round++) {\r\n // Shift rows, sub bytes, mix columns, add round key\r\n var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\r\n var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\r\n var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\r\n var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\r\n\r\n // Update state\r\n s0 = t0;\r\n s1 = t1;\r\n s2 = t2;\r\n s3 = t3;\r\n }\r\n\r\n // Shift rows, sub bytes, add round key\r\n var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\r\n var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\r\n var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\r\n var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\r\n\r\n // Set output\r\n M[offset] = t0;\r\n M[offset + 1] = t1;\r\n M[offset + 2] = t2;\r\n M[offset + 3] = t3;\r\n },\r\n\r\n keySize: 256/32\r\n });\r\n\r\n /**\r\n * Shortcut functions to the cipher's object interface.\r\n *\r\n * @example\r\n *\r\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\r\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\r\n */\r\n C.AES = BlockCipher._createHelper(AES);\r\n}());\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function (Math) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var WordArray = C_lib.WordArray;\r\n var Hasher = C_lib.Hasher;\r\n var C_algo = C.algo;\r\n\r\n // Initialization and round constants tables\r\n var H = [];\r\n var K = [];\r\n\r\n // Compute constants\r\n (function () {\r\n function isPrime(n) {\r\n var sqrtN = Math.sqrt(n);\r\n for (var factor = 2; factor <= sqrtN; factor++) {\r\n if (!(n % factor)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function getFractionalBits(n) {\r\n return ((n - (n | 0)) * 0x100000000) | 0;\r\n }\r\n\r\n var n = 2;\r\n var nPrime = 0;\r\n while (nPrime < 64) {\r\n if (isPrime(n)) {\r\n if (nPrime < 8) {\r\n H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\r\n }\r\n K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\r\n\r\n nPrime++;\r\n }\r\n\r\n n++;\r\n }\r\n }());\r\n\r\n // Reusable object\r\n var W = [];\r\n\r\n /**\r\n * SHA-256 hash algorithm.\r\n */\r\n var SHA256 = C_algo.SHA256 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new WordArray.init(H.slice(0));\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcut\r\n var H = this._hash.words;\r\n\r\n // Working variables\r\n var a = H[0];\r\n var b = H[1];\r\n var c = H[2];\r\n var d = H[3];\r\n var e = H[4];\r\n var f = H[5];\r\n var g = H[6];\r\n var h = H[7];\r\n\r\n // Computation\r\n for (var i = 0; i < 64; i++) {\r\n if (i < 16) {\r\n W[i] = M[offset + i] | 0;\r\n } else {\r\n var gamma0x = W[i - 15];\r\n var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\r\n ((gamma0x << 14) | (gamma0x >>> 18)) ^\r\n (gamma0x >>> 3);\r\n\r\n var gamma1x = W[i - 2];\r\n var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\r\n ((gamma1x << 13) | (gamma1x >>> 19)) ^\r\n (gamma1x >>> 10);\r\n\r\n W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\r\n }\r\n\r\n var ch = (e & f) ^ (~e & g);\r\n var maj = (a & b) ^ (a & c) ^ (b & c);\r\n\r\n var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\r\n var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\r\n\r\n var t1 = h + sigma1 + ch + K[i] + W[i];\r\n var t2 = sigma0 + maj;\r\n\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + t1) | 0;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (t1 + t2) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H[0] = (H[0] + a) | 0;\r\n H[1] = (H[1] + b) | 0;\r\n H[2] = (H[2] + c) | 0;\r\n H[3] = (H[3] + d) | 0;\r\n H[4] = (H[4] + e) | 0;\r\n H[5] = (H[5] + f) | 0;\r\n H[6] = (H[6] + g) | 0;\r\n H[7] = (H[7] + h) | 0;\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Return final computed hash\r\n return this._hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n }\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA256('message');\r\n * var hash = CryptoJS.SHA256(wordArray);\r\n */\r\n C.SHA256 = Hasher._createHelper(SHA256);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA256(message, key);\r\n */\r\n C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\r\n}(Math));\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var C_algo = C.algo;\r\n\r\n /**\r\n * HMAC algorithm.\r\n */\r\n var HMAC = C_algo.HMAC = Base.extend({\r\n /**\r\n * Initializes a newly created HMAC.\r\n *\r\n * @param {Hasher} hasher The hash algorithm to use.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @example\r\n *\r\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\r\n */\r\n init: function (hasher, key) {\r\n // Init hasher\r\n hasher = this._hasher = new hasher.init();\r\n\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof key == 'string') {\r\n key = Utf8.parse(key);\r\n }\r\n\r\n // Shortcuts\r\n var hasherBlockSize = hasher.blockSize;\r\n var hasherBlockSizeBytes = hasherBlockSize * 4;\r\n\r\n // Allow arbitrary length keys\r\n if (key.sigBytes > hasherBlockSizeBytes) {\r\n key = hasher.finalize(key);\r\n }\r\n\r\n // Clamp excess bits\r\n key.clamp();\r\n\r\n // Clone key for inner and outer pads\r\n var oKey = this._oKey = key.clone();\r\n var iKey = this._iKey = key.clone();\r\n\r\n // Shortcuts\r\n var oKeyWords = oKey.words;\r\n var iKeyWords = iKey.words;\r\n\r\n // XOR keys with pad constants\r\n for (var i = 0; i < hasherBlockSize; i++) {\r\n oKeyWords[i] ^= 0x5c5c5c5c;\r\n iKeyWords[i] ^= 0x36363636;\r\n }\r\n oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this HMAC to its initial state.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.reset();\r\n */\r\n reset: function () {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Reset\r\n hasher.reset();\r\n hasher.update(this._iKey);\r\n },\r\n\r\n /**\r\n * Updates this HMAC with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {HMAC} This HMAC instance.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.update('message');\r\n * hmacHasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n this._hasher.update(messageUpdate);\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the HMAC computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @example\r\n *\r\n * var hmac = hmacHasher.finalize();\r\n * var hmac = hmacHasher.finalize('message');\r\n * var hmac = hmacHasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Compute HMAC\r\n var innerHash = hasher.finalize(messageUpdate);\r\n hasher.reset();\r\n var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\r\n\r\n return hmac;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var C_algo = C.algo;\r\n var SHA1 = C_algo.SHA1;\r\n var HMAC = C_algo.HMAC;\r\n\r\n /**\r\n * Password-Based Key Derivation Function 2 algorithm.\r\n */\r\n var PBKDF2 = C_algo.PBKDF2 = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n * @property {Hasher} hasher The hasher to use. Default: SHA1\r\n * @property {number} iterations The number of iterations to perform. Default: 1\r\n */\r\n cfg: Base.extend({\r\n keySize: 128/32,\r\n hasher: SHA1,\r\n iterations: 1\r\n }),\r\n\r\n /**\r\n * Initializes a newly created key derivation function.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n *\r\n * @example\r\n *\r\n * var kdf = CryptoJS.algo.PBKDF2.create();\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\r\n */\r\n init: function (cfg) {\r\n this.cfg = this.cfg.extend(cfg);\r\n },\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @example\r\n *\r\n * var key = kdf.compute(password, salt);\r\n */\r\n compute: function (password, salt) {\r\n // Shortcut\r\n var cfg = this.cfg;\r\n\r\n // Init HMAC\r\n var hmac = HMAC.create(cfg.hasher, password);\r\n\r\n // Initial values\r\n var derivedKey = WordArray.create();\r\n var blockIndex = WordArray.create([0x00000001]);\r\n\r\n // Shortcuts\r\n var derivedKeyWords = derivedKey.words;\r\n var blockIndexWords = blockIndex.words;\r\n var keySize = cfg.keySize;\r\n var iterations = cfg.iterations;\r\n\r\n // Generate key\r\n while (derivedKeyWords.length < keySize) {\r\n var block = hmac.update(salt).finalize(blockIndex);\r\n hmac.reset();\r\n\r\n // Shortcuts\r\n var blockWords = block.words;\r\n var blockWordsLength = blockWords.length;\r\n\r\n // Iterations\r\n var intermediate = block;\r\n for (var i = 1; i < iterations; i++) {\r\n intermediate = hmac.finalize(intermediate);\r\n hmac.reset();\r\n\r\n // Shortcut\r\n var intermediateWords = intermediate.words;\r\n\r\n // XOR intermediate with block\r\n for (var j = 0; j < blockWordsLength; j++) {\r\n blockWords[j] ^= intermediateWords[j];\r\n }\r\n }\r\n\r\n derivedKey.concat(block);\r\n blockIndexWords[0]++;\r\n }\r\n derivedKey.sigBytes = keySize * 4;\r\n\r\n return derivedKey;\r\n }\r\n });\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var key = CryptoJS.PBKDF2(password, salt);\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\r\n */\r\n C.PBKDF2 = function (password, salt, cfg) {\r\n return PBKDF2.create(cfg).compute(password, salt);\r\n };\r\n}());\r\n"
},
{
"id": 36,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/closure_long.js",
"name": "./src/lib/closure_long.js",
"index": 28,
"index2": 24,
"size": 24517,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./closure_long.js",
"loc": "64:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "// Copyright 2009 The Closure Library Authors. All Rights Reserved.\r\n//\r\n// Licensed under the Apache License, Version 2.0 (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.apache.org/licenses/LICENSE-2.0\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n\r\n/**\r\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\r\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\r\n * implementation is derived from LongLib in GWT.\r\n *\r\n */\r\n\r\n/**\r\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\r\n * See keyword `MODIFICATION` in source code.\r\n */\r\n\r\n/*! MODIFICATION\r\nThe following line was added by Igor Zhukov in order to make library compatibile with other app parts\r\n*/\r\nvar goog = {\r\n provide: function () {}, \r\n math: {\r\n Long: {\r\n ZERO: undefined,\r\n fromString: undefined,\r\n ONE: undefined,\r\n fromInt: undefined\r\n }\r\n }\r\n};\r\nthis.goog = goog;\r\n\r\n\r\ngoog.provide('goog.math.Long');\r\n\r\n\r\n\r\n/**\r\n * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\r\n * values as *signed* integers. See the from* functions below for more\r\n * convenient ways of constructing Longs.\r\n *\r\n * The internal representation of a long is the two given signed, 32-bit values.\r\n * We use 32-bit pieces because these are the size of integers on which\r\n * Javascript performs bit-operations. For operations like addition and\r\n * multiplication, we split each number into 16-bit pieces, which can easily be\r\n * multiplied within Javascript's floating-point representation without overflow\r\n * or change in sign.\r\n *\r\n * In the algorithms below, we frequently reduce the negative case to the\r\n * positive case by negating the input(s) and then post-processing the result.\r\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n * a positive number, it overflows back into a negative). Not handling this\r\n * case would often result in infinite recursion.\r\n *\r\n * @param {number} low The low (signed) 32 bits of the long.\r\n * @param {number} high The high (signed) 32 bits of the long.\r\n * @constructor\r\n */\r\ngoog.math.Long = function(low, high) {\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.low_ = low | 0; // force into 32 signed bits.\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.high_ = high | 0; // force into 32 signed bits.\r\n};\r\n\r\n\r\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\r\n// from* methods on which they depend.\r\n\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @private\r\n */\r\ngoog.math.Long.IntCache_ = {};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given (32-bit) integer value.\r\n * @param {number} value The 32-bit integer in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromInt = function(value) {\r\n if (-128 <= value && value < 128) {\r\n var cachedObj = goog.math.Long.IntCache_[value];\r\n if (cachedObj) {\r\n return cachedObj;\r\n }\r\n }\r\n\r\n var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\r\n if (-128 <= value && value < 128) {\r\n goog.math.Long.IntCache_[value] = obj;\r\n }\r\n return obj;\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite\r\n * number. Otherwise, zero is returned.\r\n * @param {number} value The number in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromNumber = function(value) {\r\n if (isNaN(value) || !isFinite(value)) {\r\n return goog.math.Long.ZERO;\r\n } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MAX_VALUE;\r\n } else if (value < 0) {\r\n return goog.math.Long.fromNumber(-value).negate();\r\n } else {\r\n return new goog.math.Long(\r\n (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\r\n (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the 64-bit integer that comes by concatenating\r\n * the given high and low bits. Each is assumed to use 32 bits.\r\n * @param {number} lowBits The low 32-bits.\r\n * @param {number} highBits The high 32-bits.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromBits = function(lowBits, highBits) {\r\n return new goog.math.Long(lowBits, highBits);\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the given\r\n * radix.\r\n * @param {string} str The textual representation of the Long.\r\n * @param {number=} opt_radix The radix in which the text is written.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromString = function(str, opt_radix) {\r\n if (str.length == 0) {\r\n throw Error('number format error: empty string');\r\n }\r\n\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (str.charAt(0) == '-') {\r\n return goog.math.Long.fromString(str.substring(1), radix).negate();\r\n } else if (str.indexOf('-') >= 0) {\r\n throw Error('number format error: interior \"-\" character: ' + str);\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\r\n\r\n var result = goog.math.Long.ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i);\r\n var value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = goog.math.Long.fromNumber(Math.pow(radix, size));\r\n result = result.multiply(power).add(goog.math.Long.fromNumber(value));\r\n } else {\r\n result = result.multiply(radixToPower);\r\n result = result.add(goog.math.Long.fromNumber(value));\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove\r\n// these variables, so there should be no runtime penalty for these.\r\n\r\n\r\n/**\r\n * Number used repeated below in calculations. This must appear before the\r\n * first call to any from* function below.\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_32_DBL_ =\r\n goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_31_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ / 2;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_48_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_64_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_63_DBL_ =\r\n goog.math.Long.TWO_PWR_64_DBL_ / 2;\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ZERO = goog.math.Long.fromInt(0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ONE = goog.math.Long.fromInt(1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MAX_VALUE =\r\n goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\r\n\r\n\r\n/**\r\n * @type {!goog.math.Long}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\r\n\r\n\r\n/** @return {number} The value, assuming it is a 32-bit integer. */\r\ngoog.math.Long.prototype.toInt = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The closest floating-point representation to this value. */\r\ngoog.math.Long.prototype.toNumber = function() {\r\n return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\r\n this.getLowBitsUnsigned();\r\n};\r\n\r\n\r\n/**\r\n * @param {number=} opt_radix The radix in which the text should be written.\r\n * @return {string} The textual representation of this value.\r\n * @override\r\n */\r\ngoog.math.Long.prototype.toString = function(opt_radix) {\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (this.isZero()) {\r\n return '0';\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = goog.math.Long.fromNumber(radix);\r\n var div = this.div(radixLong);\r\n var rem = div.multiply(radixLong).subtract(this);\r\n return div.toString(radix) + rem.toInt().toString(radix);\r\n } else {\r\n return '-' + this.negate().toString(radix);\r\n }\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\r\n\r\n var rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower);\r\n var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\r\n var digits = intval.toString(radix);\r\n\r\n rem = remDiv;\r\n if (rem.isZero()) {\r\n return digits + result;\r\n } else {\r\n while (digits.length < 6) {\r\n digits = '0' + digits;\r\n }\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n\r\n/** @return {number} The high 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getHighBits = function() {\r\n return this.high_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getLowBits = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as an unsigned value. */\r\ngoog.math.Long.prototype.getLowBitsUnsigned = function() {\r\n return (this.low_ >= 0) ?\r\n this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\r\n};\r\n\r\n\r\n/**\r\n * @return {number} Returns the number of bits needed to represent the absolute\r\n * value of this Long.\r\n */\r\ngoog.math.Long.prototype.getNumBitsAbs = function() {\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return 64;\r\n } else {\r\n return this.negate().getNumBitsAbs();\r\n }\r\n } else {\r\n var val = this.high_ != 0 ? this.high_ : this.low_;\r\n for (var bit = 31; bit > 0; bit--) {\r\n if ((val & (1 << bit)) != 0) {\r\n break;\r\n }\r\n }\r\n return this.high_ != 0 ? bit + 33 : bit + 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is zero. */\r\ngoog.math.Long.prototype.isZero = function() {\r\n return this.high_ == 0 && this.low_ == 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is negative. */\r\ngoog.math.Long.prototype.isNegative = function() {\r\n return this.high_ < 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is odd. */\r\ngoog.math.Long.prototype.isOdd = function() {\r\n return (this.low_ & 1) == 1;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long equals the other.\r\n */\r\ngoog.math.Long.prototype.equals = function(other) {\r\n return (this.high_ == other.high_) && (this.low_ == other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long does not equal the other.\r\n */\r\ngoog.math.Long.prototype.notEquals = function(other) {\r\n return (this.high_ != other.high_) || (this.low_ != other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than the other.\r\n */\r\ngoog.math.Long.prototype.lessThan = function(other) {\r\n return this.compare(other) < 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.lessThanOrEqual = function(other) {\r\n return this.compare(other) <= 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than the other.\r\n */\r\ngoog.math.Long.prototype.greaterThan = function(other) {\r\n return this.compare(other) > 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.greaterThanOrEqual = function(other) {\r\n return this.compare(other) >= 0;\r\n};\r\n\r\n\r\n/**\r\n * Compares this Long with the given one.\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\r\n * if the given one is greater.\r\n */\r\ngoog.math.Long.prototype.compare = function(other) {\r\n if (this.equals(other)) {\r\n return 0;\r\n }\r\n\r\n var thisNeg = this.isNegative();\r\n var otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg) {\r\n return -1;\r\n }\r\n if (!thisNeg && otherNeg) {\r\n return 1;\r\n }\r\n\r\n // at this point, the signs are the same, so subtraction will not overflow\r\n if (this.subtract(other).isNegative()) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The negation of this value. */\r\ngoog.math.Long.prototype.negate = function() {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else {\r\n return this.not().add(goog.math.Long.ONE);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns the sum of this and the given Long.\r\n * @param {goog.math.Long} other Long to add to this one.\r\n * @return {!goog.math.Long} The sum of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.add = function(other) {\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns the difference of this and the given Long.\r\n * @param {goog.math.Long} other Long to subtract from this.\r\n * @return {!goog.math.Long} The difference of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.subtract = function(other) {\r\n return this.add(other.negate());\r\n};\r\n\r\n\r\n/**\r\n * Returns the product of this and the given long.\r\n * @param {goog.math.Long} other Long to multiply with this.\r\n * @return {!goog.math.Long} The product of this and the other.\r\n */\r\ngoog.math.Long.prototype.multiply = function(other) {\r\n if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n } else if (other.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().multiply(other.negate());\r\n } else {\r\n return this.negate().multiply(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.multiply(other.negate()).negate();\r\n }\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\r\n other.lessThan(goog.math.Long.TWO_PWR_24_)) {\r\n return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\r\n }\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long divided by the given one.\r\n * @param {goog.math.Long} other Long by which to divide.\r\n * @return {!goog.math.Long} This Long divided by the given one.\r\n */\r\ngoog.math.Long.prototype.div = function(other) {\r\n if (other.isZero()) {\r\n throw Error('division by zero');\r\n } else if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n if (other.equals(goog.math.Long.ONE) ||\r\n other.equals(goog.math.Long.NEG_ONE)) {\r\n return goog.math.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ONE;\r\n } else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shiftRight(1);\r\n var approx = halfThis.div(other).shiftLeft(1);\r\n if (approx.equals(goog.math.Long.ZERO)) {\r\n return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\r\n } else {\r\n var rem = this.subtract(other.multiply(approx));\r\n var result = approx.add(rem.div(other));\r\n return result;\r\n }\r\n }\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().div(other.negate());\r\n } else {\r\n return this.negate().div(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.div(other.negate()).negate();\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n var res = goog.math.Long.ZERO;\r\n var rem = this;\r\n while (rem.greaterThanOrEqual(other)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2);\r\n var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n var approxRes = goog.math.Long.fromNumber(approx);\r\n var approxRem = approxRes.multiply(other);\r\n while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\r\n approx -= delta;\r\n approxRes = goog.math.Long.fromNumber(approx);\r\n approxRem = approxRes.multiply(other);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero()) {\r\n approxRes = goog.math.Long.ONE;\r\n }\r\n\r\n res = res.add(approxRes);\r\n rem = rem.subtract(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long modulo the given one.\r\n * @param {goog.math.Long} other Long by which to mod.\r\n * @return {!goog.math.Long} This Long modulo the given one.\r\n */\r\ngoog.math.Long.prototype.modulo = function(other) {\r\n return this.subtract(this.div(other).multiply(other));\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The bitwise-NOT of this value. */\r\ngoog.math.Long.prototype.not = function() {\r\n return goog.math.Long.fromBits(~this.low_, ~this.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-AND of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to AND.\r\n * @return {!goog.math.Long} The bitwise-AND of this and the other.\r\n */\r\ngoog.math.Long.prototype.and = function(other) {\r\n return goog.math.Long.fromBits(this.low_ & other.low_,\r\n this.high_ & other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-OR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to OR.\r\n * @return {!goog.math.Long} The bitwise-OR of this and the other.\r\n */\r\ngoog.math.Long.prototype.or = function(other) {\r\n return goog.math.Long.fromBits(this.low_ | other.low_,\r\n this.high_ | other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-XOR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to XOR.\r\n * @return {!goog.math.Long} The bitwise-XOR of this and the other.\r\n */\r\ngoog.math.Long.prototype.xor = function(other) {\r\n return goog.math.Long.fromBits(this.low_ ^ other.low_,\r\n this.high_ ^ other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the left by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftLeft = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var low = this.low_;\r\n if (numBits < 32) {\r\n var high = this.high_;\r\n return goog.math.Long.fromBits(\r\n low << numBits,\r\n (high << numBits) | (low >>> (32 - numBits)));\r\n } else {\r\n return goog.math.Long.fromBits(0, low << (numBits - 32));\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftRight = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >> numBits);\r\n } else {\r\n return goog.math.Long.fromBits(\r\n high >> (numBits - 32),\r\n high >= 0 ? 0 : -1);\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount, with\r\n * the new top bits matching the current sign bit.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount, with\r\n * zeros placed into the new leading bits.\r\n */\r\ngoog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >>> numBits);\r\n } else if (numBits == 32) {\r\n return goog.math.Long.fromBits(high, 0);\r\n } else {\r\n return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\r\n }\r\n }\r\n};"
},
{
"id": 37,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/worker-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"index": 32,
"index2": 28,
"size": 113,
"cacheable": false,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"issuerId": 16,
"issuerName": "./src/lib/cryptoworker.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 16,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"name": "./src/lib/cryptoworker.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 703,
"building": 1361
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./crypto.worker.js",
"loc": "9:41-70"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = function() {\n return new Worker(__webpack_public_path__ + \"c05c8d5242c7b2494d71.worker.js\");\n};"
},
{
"id": 38,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"name": "./src/lib/idb.ts",
"index": 34,
"index2": 31,
"size": 8481,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./idb",
"loc": "62:28-44"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar IdbFileStorage = /** @class */ (function () {\n function IdbFileStorage() {\n this.dbName = 'cachedFiles';\n this.dbStoreName = 'files';\n this.dbVersion = 2;\n this.name = 'IndexedDB';\n // @ts-ignore\n //window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;\n // @ts-ignore\n window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.OIDBTransaction || window.msIDBTransaction;\n this.storageIsAvailable = window.indexedDB !== undefined && window.IDBTransaction !== undefined;\n // IndexedDB is REALLY slow without blob support in Safari 8, no point in it\n if (this.storageIsAvailable &&\n navigator.userAgent.indexOf('Safari') != -1 &&\n navigator.userAgent.indexOf('Chrome') == -1 &&\n navigator.userAgent.match(/Version\\/[678]/)) {\n this.storageIsAvailable = false;\n }\n this.storeBlobsAvailable = this.storageIsAvailable || false;\n this.openDatabase();\n }\n IdbFileStorage.prototype.isAvailable = function () {\n return this.storageIsAvailable;\n };\n IdbFileStorage.prototype.openDatabase = function () {\n var _this = this;\n if (this.openDbPromise) {\n return this.openDbPromise;\n }\n var createObjectStore;\n try {\n var request = indexedDB.open(this.dbName, this.dbVersion);\n createObjectStore = function (db) {\n db.createObjectStore(_this.dbStoreName);\n };\n if (!request) {\n throw new Error();\n }\n }\n catch (error) {\n console.error('error opening db', error.message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n var finished = false;\n setTimeout(function () {\n if (!finished) {\n request.onerror({ type: 'IDB_CREATE_TIMEOUT' });\n }\n }, 3000);\n return this.openDbPromise = new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n finished = true;\n var db = request.result;\n db.onerror = function (error) {\n _this.storageIsAvailable = false;\n console.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n resolve(db);\n };\n request.onerror = function (event) {\n finished = true;\n _this.storageIsAvailable = false;\n console.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n request.onupgradeneeded = function (event) {\n finished = true;\n console.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n // @ts-ignore\n var db = event.target.result;\n if (event.oldVersion == 1) {\n db.deleteObjectStore(_this.dbStoreName);\n }\n createObjectStore(db);\n };\n });\n };\n IdbFileStorage.prototype.saveFile = function (fileName, blob) {\n var _this = this;\n return this.openDatabase().then(function (db) {\n if (!_this.storeBlobsAvailable) {\n return _this.saveFileBase64(db, fileName, blob);\n }\n if (!(blob instanceof Blob)) {\n blob = bin_utils_1.blobConstruct([blob]);\n }\n try {\n // @ts-ignore\n var objectStore = db.transaction([_this.dbStoreName], IDBTransaction.READ_WRITE || 'readwrite')\n .objectStore(_this.dbStoreName);\n var request = objectStore.put(blob, fileName);\n }\n catch (error) {\n if (_this.storeBlobsAvailable) {\n _this.storeBlobsAvailable = false;\n return _this.saveFileBase64(db, fileName, blob);\n }\n _this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n resolve(blob);\n };\n request.onerror = function (error) {\n reject(error);\n };\n });\n });\n };\n IdbFileStorage.prototype.saveFileBase64 = function (db, fileName, blob) {\n var _this = this;\n if (this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n if (!(blob instanceof Blob)) {\n var safeMimeType = bin_utils_1.blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bin_utils_1.bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(function () {\n return blob;\n });\n }\n try {\n var reader = new FileReader();\n }\n catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n var promise = new Promise(function (resolve, reject) {\n reader.onloadend = function () {\n _this.storagePutB64String(db, fileName, reader.result).then(function () {\n resolve(blob);\n }, reject);\n };\n reader.onerror = reject;\n });\n try {\n reader.readAsDataURL(blob);\n }\n catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n return promise;\n };\n IdbFileStorage.prototype.storagePutB64String = function (db, fileName, b64string) {\n try {\n // @ts-ignore\n var objectStore = db.transaction([this.dbStoreName], IDBTransaction.READ_WRITE || 'readwrite')\n .objectStore(this.dbStoreName);\n var request = objectStore.put(b64string, fileName);\n }\n catch (error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n resolve();\n };\n request.onerror = reject;\n });\n };\n IdbFileStorage.prototype.getBlobSize = function (blob) {\n return blob.size || blob.byteLength || blob.length;\n };\n IdbFileStorage.prototype.getFile = function (fileName, size) {\n var _this = this;\n return this.openDatabase().then(function (db) {\n // @ts-ignore\n var objectStore = db.transaction([_this.dbStoreName], IDBTransaction.READ || 'readonly')\n .objectStore(_this.dbStoreName);\n var request = objectStore.get(fileName);\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n // @ts-ignore\n var result = event.target.result;\n if (result === undefined) {\n reject();\n }\n else if (typeof result === 'string' &&\n result.substr(0, 5) === 'data:') {\n resolve(bin_utils_1.dataUrlToBlob(result));\n }\n else {\n resolve(result);\n }\n };\n request.onerror = reject;\n });\n });\n };\n IdbFileStorage.prototype.getFileWriter = function (fileName, mimeType) {\n var _this = this;\n var fakeWriter = filemanager_1.default.getFakeFileWriter(mimeType, function (blob) {\n _this.saveFile(fileName, blob);\n });\n return Promise.resolve(fakeWriter);\n };\n return IdbFileStorage;\n}());\nexports.default = new IdbFileStorage();\n"
},
{
"id": 39,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"name": "./src/lib/mtnetworker.ts",
"index": 35,
"index2": 32,
"size": 45460,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./mtnetworker",
"loc": "63:20-44"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\nvar bin_utils_1 = require(\"./bin_utils\");\nvar mtproto_1 = require(\"./mtproto\");\nvar tl_utils_1 = require(\"./tl_utils\");\nvar cryptoworker_1 = __importDefault(require(\"./cryptoworker\"));\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar Config = __importStar(require(\"./config\"));\nvar chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\nvar chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false;\nvar xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30);\nvar MTPNetworker = /** @class */ (function () {\n function MTPNetworker(NetworkerFactory, dcID, authKey, serverSalt, options) {\n if (options === void 0) { options = {}; }\n this.NetworkerFactory = NetworkerFactory;\n this.dcID = dcID;\n this.authKey = authKey;\n this.serverSalt = serverSalt;\n this.options = options;\n this.lastServerMessages = [];\n this.sentMessages = {};\n this.pendingMessages = {};\n this.pendingAcks = [];\n this.pendingResends = [];\n this.connectionInited = false;\n this.longPollPending = 0;\n this.seqNo = 0;\n this.prevSessionID = [];\n this.sessionID = [];\n this.sleepAfter = 0;\n this.offline = false;\n this.checkConnectionPeriod = 0;\n this.nextReq = 0;\n this.onOnlineCb = this.checkConnection.bind(this);\n this.lastResendReq = null;\n this.authKeyUint8 = bin_utils_1.convertToUint8Array(this.authKey);\n this.authKeyID = bin_utils_1.sha1BytesSync(this.authKey).slice(-8);\n this.upload = this.options.fileUpload || this.options.fileDownload || false;\n this.updateSession();\n this.longPollInt = window.setInterval(this.checkLongPoll.bind(this), 10000);\n this.checkLongPoll();\n if (!this.NetworkerFactory.offlineInited) {\n this.NetworkerFactory.offlineInited = true;\n /* $rootScope.offline = true\n $rootScope.offlineConnecting = true */\n }\n if (Config.Navigator.mobile) {\n this.setupMobileSleep();\n }\n }\n MTPNetworker.prototype.updateSession = function () {\n this.seqNo = 0;\n this.prevSessionID = this.sessionID;\n this.sessionID = new Array(8);\n mtproto_1.MTProto.secureRandom.nextBytes(this.sessionID);\n };\n MTPNetworker.prototype.setupMobileSleep = function () {\n /* $rootScope.$watch('idle.isIDLE', (isIDLE) => {\n if(isIDLE) {\n this.sleepAfter = tsNow() + 30000;\n } else {\n delete this.sleepAfter;\n this.checkLongPoll();\n }\n })\n \n $rootScope.$on('push_received', function() {\n // console.log(dT(), 'push recieved', self.sleepAfter)\n if(this.sleepAfter) {\n this.sleepAfter = tsNow() + 30000;\n this.checkLongPoll();\n }\n }) */\n };\n MTPNetworker.prototype.updateSentMessage = function (sentMessageID) {\n var sentMessage = this.sentMessages[sentMessageID];\n if (!sentMessage) {\n return false;\n }\n var self = this;\n if (sentMessage.container) {\n var newInner = [];\n sentMessage.inner.forEach(function (innerSentMessageID) {\n var innerSentMessage = self.updateSentMessage(innerSentMessageID);\n if (innerSentMessage) {\n newInner.push(innerSentMessage.msg_id);\n }\n });\n sentMessage.inner = newInner;\n }\n sentMessage.msg_id = mtproto_1.MTProto.timeManager.generateID();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated ||\n sentMessage.container);\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete self.sentMessages[sentMessageID];\n return sentMessage;\n };\n MTPNetworker.prototype.generateSeqNo = function (notContentRelated) {\n var seqNo = this.seqNo * 2;\n if (!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n return seqNo;\n };\n MTPNetworker.prototype.wrapMtpCall = function (method, params, options) {\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeMethod(method, params);\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo();\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes()\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'MT call', method, params, messageID, seqNo);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.wrapMtpMessage = function (object, options) {\n if (object === void 0) { object = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeObject(object, 'Object');\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo(options.notContentRelated);\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes()\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'MT message', object, messageID, seqNo);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.wrapApiCall = function (method, params, options) {\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization(options);\n if (!this.connectionInited) { // this will call once for each new session\n console.log(utils_1.dT(), 'Wrap api call !this.connectionInited');\n //serializer.storeInt(0xda9b0d0d, 'invokeWithLayer'); // -627372787 >>> 0 == 0xda9b0d0d\n var invokeWithLayer = Config.Schema.API.methods.find(function (m) { return m.method == 'invokeWithLayer'; });\n if (!invokeWithLayer)\n throw new Error('no invokeWithLayer!');\n // @ts-ignore\n serializer.storeInt(invokeWithLayer.id >>> 0, 'invokeWithLayer');\n // @ts-ignore\n serializer.storeInt(Config.Schema.API.layer, 'layer');\n var initConnection = Config.Schema.API.methods.find(function (m) { return m.method == 'initConnection'; });\n if (!initConnection)\n throw new Error('no invokeWithLayer!');\n // @ts-ignore\n serializer.storeInt(initConnection.id >>> 0, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(Config.App.id, 'api_id');\n serializer.storeString(navigator.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(Config.App.version, 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString('', 'lang_pack');\n serializer.storeString(navigator.language || 'en', 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0x0,\n 'api_id': Config.App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': Config.App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en',\n 'proxy': null\n }); */\n }\n if (options.afterMessageID) {\n console.log(utils_1.dT(), 'Api call options.afterMessageID!');\n serializer.storeInt(0xcb9f372d, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageID, 'msg_id');\n }\n options.resultType = serializer.storeMethod(method, params);\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo();\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Api call', method, params, messageID, seqNo, options);\n }\n else {\n console.log(utils_1.dT(), 'Api call', method);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.checkLongPoll = function () {\n var isClean = this.cleanupSent();\n //console.log('Check lp', this.longPollPending, tsNow(), this.dcID, isClean, this);\n if ((this.longPollPending && utils_1.tsNow() < this.longPollPending) ||\n this.offline ||\n this.NetworkerFactory.akStopped) {\n //console.log('No lp this time');\n return false;\n }\n var self = this;\n storage_1.default.get('dc').then(function (baseDcID) {\n if (isClean && (baseDcID != self.dcID ||\n self.upload ||\n (self.sleepAfter && utils_1.tsNow() > self.sleepAfter))) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', self.dcID, self.sleepAfter);\n return;\n }\n self.sendLongPoll();\n });\n };\n MTPNetworker.prototype.sendLongPoll = function () {\n var _this = this;\n var maxWait = 25000;\n var self = this;\n this.longPollPending = utils_1.tsNow() + maxWait;\n //console.log('Set lp', this.longPollPending, tsNow())\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(function () {\n _this.longPollPending = 0;\n setTimeout(self.checkLongPoll.bind(self), 0);\n }, function (error) {\n console.log('Long-poll failed', error);\n });\n };\n MTPNetworker.prototype.pushMessage = function (message, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n return new Promise(function (resolve, reject) {\n _this.sentMessages[message.msg_id] = Object.assign(message, options, {\n deferred: { resolve: resolve, reject: reject }\n });\n // console.log(dT(), 'Networker pushMessage:', this.sentMessages[message.msg_id]);\n _this.pendingMessages[message.msg_id] = 0;\n if (!options || !options.noSchedule) {\n _this.scheduleRequest();\n }\n if (utils_1.isObject(options)) {\n options.messageID = message.msg_id;\n }\n });\n };\n MTPNetworker.prototype.pushResend = function (messageID, delay) {\n if (delay === void 0) { delay = 0; }\n var value = delay ? utils_1.tsNow() + delay : 0;\n var sentMessage = this.sentMessages[messageID];\n if (sentMessage.container) {\n for (var i = 0; i < sentMessage.inner.length; i++) {\n this.pendingMessages[sentMessage.inner[i]] = value;\n }\n }\n else {\n this.pendingMessages[messageID] = value;\n }\n // console.log('Resend due', messageID, this.pendingMessages)\n this.scheduleRequest(delay);\n };\n MTPNetworker.prototype.getMsgKey = function (dataWithPadding, isOut) {\n var authKey = this.authKeyUint8;\n var x = isOut ? 0 : 8;\n var msgKeyLargePlain = bin_utils_1.bufferConcat(authKey.subarray(88 + x, 88 + x + 32), dataWithPadding);\n return cryptoworker_1.default.sha256Hash(msgKeyLargePlain).then(function (msgKeyLarge) {\n var msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n });\n };\n ;\n MTPNetworker.prototype.getAesKeyIv = function (msgKey, isOut) {\n var authKey = this.authKeyUint8;\n var x = isOut ? 0 : 8;\n var sha2aText = new Uint8Array(52);\n var sha2bText = new Uint8Array(52);\n //var promises: any = {};\n var promises = [];\n sha2aText.set(msgKey, 0);\n sha2aText.set(authKey.subarray(x, x + 36), 16);\n /* promises.sha2a = */ promises.push(cryptoworker_1.default.sha256Hash(sha2aText));\n sha2bText.set(authKey.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n /* promises.sha2b = */ promises.push(cryptoworker_1.default.sha256Hash(sha2bText));\n return Promise.all(promises).then(function (results) {\n var aesKey = new Uint8Array(32);\n var aesIv = new Uint8Array(32);\n var sha2a = new Uint8Array(results[0]);\n var sha2b = new Uint8Array(results[1]);\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n return [aesKey, aesIv];\n });\n };\n MTPNetworker.prototype.checkConnection = function (event) {\n /* $rootScope.offlineConnecting = true */\n console.log(utils_1.dT(), 'Check connection', event);\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = 0;\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n var pingID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n serializer.storeMethod('ping', {\n ping_id: pingID\n });\n var pingMessage = {\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes()\n };\n var self = this;\n this.sendEncryptedRequest(pingMessage, {\n timeout: 15000\n }).then(function (result) {\n /* delete $rootScope.offlineConnecting */\n self.toggleOffline(false);\n }, function () {\n console.log(utils_1.dT(), 'Delay ', self.checkConnectionPeriod * 1000);\n self.checkConnectionTimeout = setTimeout(self.checkConnection.bind(self), self.checkConnectionPeriod * 1000 | 0);\n self.checkConnectionPeriod = Math.min(60, self.checkConnectionPeriod * 1.5);\n /* setTimeout(function() {\n delete $rootScope.offlineConnecting\n }, 1000); */\n });\n };\n MTPNetworker.prototype.toggleOffline = function (enabled) {\n // console.log('toggle ', enabled, this.dcID, this.iii)\n if (this.offline !== undefined && this.offline == enabled) {\n return false;\n }\n this.offline = enabled;\n /* $rootScope.offline = enabled;\n $rootScope.offlineConnecting = false; */\n if (this.offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n if (this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n this.checkConnectionTimeout = setTimeout(this.checkConnection.bind(this), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n document.body.addEventListener('online', this.onOnlineCb, false);\n document.body.addEventListener('focus', this.onOnlineCb, false);\n }\n else {\n this.checkLongPoll();\n this.scheduleRequest();\n document.body.removeEventListener('online', this.onOnlineCb);\n document.body.removeEventListener('focus', this.onOnlineCb);\n //$(document.body).off('online focus', this.onOnlineCb);\n /* if(this.onOnlineCb) {\n $(document.body).off('online focus', this.onOnlineCb);\n } */\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = 0;\n }\n };\n MTPNetworker.prototype.performScheduledRequest = function () {\n var _this = this;\n // console.log(dT(), 'scheduled', this.dcID, this.iii)\n if (this.offline || this.NetworkerFactory.akStopped) {\n console.log(utils_1.dT(), 'Cancel scheduled');\n return false;\n }\n this.nextReq = 0;\n if (this.pendingAcks.length) {\n var ackMsgIDs = [];\n for (var i = 0; i < this.pendingAcks.length; i++) {\n ackMsgIDs.push(this.pendingAcks[i]);\n }\n // console.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIDs\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n if (this.pendingResends.length) {\n var resendMsgIDs = [];\n var resendOpts = {\n noSchedule: true,\n notContentRelated: true,\n messageID: '' // will set in wrapMtpMessage->pushMessage\n };\n for (var i = 0; i < this.pendingResends.length; i++) {\n resendMsgIDs.push(this.pendingResends[i]);\n }\n // console.log('resendReq messages', resendMsgIDs)\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIDs\n }, resendOpts);\n this.lastResendReq = {\n req_msg_id: resendOpts.messageID,\n resend_msg_ids: resendMsgIDs\n };\n }\n var messages = [], message;\n var messagesByteLen = 0;\n var currentTime = utils_1.tsNow();\n var hasApiCall = false;\n var hasHttpWait = false;\n var lengthOverflow = false;\n var singlesCount = 0;\n var self = this;\n for (var messageID in this.pendingMessages) {\n var value = this.pendingMessages[messageID];\n if (!value || value >= currentTime) {\n if (message = this.sentMessages[messageID]) {\n //console.log(dT(), 'performScheduledRequest message:', message);\n var messageByteLength = (message.body.byteLength || message.body.length) + 32;\n if (!message.notContentRelated &&\n lengthOverflow) {\n continue; // maybe break here\n }\n if (!message.notContentRelated &&\n messagesByteLen &&\n messagesByteLen + messageByteLength > 655360) { // 640 Kb\n lengthOverflow = true;\n continue; // maybe break here\n }\n if (message.singleInRequest) {\n singlesCount++;\n if (singlesCount > 1) {\n continue; // maybe break here\n }\n }\n messages.push(message);\n messagesByteLen += messageByteLength;\n if (message.isAPI) {\n hasApiCall = true;\n }\n else if (message.longPoll) {\n hasHttpWait = true;\n }\n }\n else {\n // console.log(message, messageID)\n }\n delete self.pendingMessages[messageID];\n }\n }\n if (hasApiCall && !hasHttpWait) {\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n messages.push({\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes()\n });\n }\n if (!messages.length) {\n // console.log('no scheduled messages')\n return;\n }\n var noResponseMsgs = [];\n if (messages.length > 1) {\n var container = new tl_utils_1.TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n var innerMessages = [];\n for (var i = 0; i < messages.length; i++) {\n container.storeLong(messages[i].msg_id, 'CONTAINER[' + i + '][msg_id]');\n innerMessages.push(messages[i].msg_id);\n container.storeInt(messages[i].seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(messages[i].body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(messages[i].body, 'CONTAINER[' + i + '][body]');\n if (messages[i].noResponse) {\n noResponseMsgs.push(messages[i].msg_id);\n }\n }\n var containerSentMessage = {\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n message = Object.assign({\n body: container.getBytes(true)\n }, containerSentMessage);\n this.sentMessages[message.msg_id] = containerSentMessage;\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Container', innerMessages, message.msg_id, message.seq_no);\n }\n }\n else {\n if (message.noResponse) {\n noResponseMsgs.push(message.msg_id);\n }\n this.sentMessages[message.msg_id] = message;\n }\n this.pendingAcks = [];\n this.sendEncryptedRequest(message).then(function (result) {\n self.toggleOffline(false);\n // console.log('parse for', message)\n self.parseResponse(result).then(function (response) {\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Server response', self.dcID, response);\n }\n self.processMessage(response.response, response.messageID, response.sessionID);\n noResponseMsgs.forEach(function (msgID) {\n if (self.sentMessages[msgID]) {\n var deferred = self.sentMessages[msgID].deferred;\n delete self.sentMessages[msgID];\n deferred.resolve();\n }\n });\n self.checkLongPoll();\n _this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(_this.checkConnectionPeriod));\n });\n }, function (error) {\n console.error('Encrypted request failed', error);\n if (message.container) {\n message.inner.forEach(function (msgID) {\n self.pendingMessages[msgID] = 0;\n });\n delete self.sentMessages[message.msg_id];\n }\n else {\n self.pendingMessages[message.msg_id] = 0;\n }\n noResponseMsgs.forEach(function (msgID) {\n if (self.sentMessages[msgID]) {\n var deferred = self.sentMessages[msgID].deferred;\n delete self.sentMessages[msgID];\n delete self.pendingMessages[msgID];\n deferred.reject();\n }\n });\n self.toggleOffline(true);\n });\n if (lengthOverflow || singlesCount > 1) {\n this.scheduleRequest();\n }\n };\n MTPNetworker.prototype.getEncryptedMessage = function (dataWithPadding) {\n var self = this;\n return self.getMsgKey(dataWithPadding, true).then(function (msgKey) {\n return self.getAesKeyIv(msgKey, true).then(function (keyIv) {\n // console.log(dT(), 'after msg key iv')\n return cryptoworker_1.default.aesEncrypt(dataWithPadding, keyIv[0], keyIv[1])\n .then(function (encryptedBytes) {\n // console.log(dT(), 'Finish encrypt')\n return {\n bytes: encryptedBytes,\n msgKey: msgKey\n };\n });\n });\n });\n };\n MTPNetworker.prototype.getDecryptedMessage = function (msgKey, encryptedData) {\n // console.log(dT(), 'get decrypted start')\n return this.getAesKeyIv(msgKey, false).then(function (keyIv) {\n // console.log(dT(), 'after msg key iv')\n return cryptoworker_1.default.aesDecrypt(encryptedData, keyIv[0], keyIv[1]);\n });\n };\n MTPNetworker.prototype.sendEncryptedRequest = function (message, options) {\n if (options === void 0) { options = {}; }\n var self = this;\n // console.log(dT(), 'Send encrypted'/*, message*/)\n // console.trace()\n var data = new tl_utils_1.TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionID, 64, 'session_id');\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n var dataBuffer = data.getBuffer();\n var paddingLength = (16 - (data.offset % 16)) + 16 * (1 + bin_utils_1.nextRandomInt(5));\n var padding = new Array(paddingLength);\n mtproto_1.MTProto.secureRandom.nextBytes(padding);\n var dataWithPadding = bin_utils_1.bufferConcat(dataBuffer, padding);\n // console.log(dT(), 'Adding padding', dataBuffer, padding, dataWithPadding)\n // console.log(dT(), 'auth_key_id', bytesToHex(self.authKeyID))\n return this.getEncryptedMessage(dataWithPadding).then(function (encryptedResult) {\n // console.log(dT(), 'Got encrypted out message'/*, encryptedResult*/)\n var request = new tl_utils_1.TLSerialization({\n startMaxLength: encryptedResult.bytes.byteLength + 256\n });\n request.storeIntBytes(self.authKeyID, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n var requestData = xhrSendBuffer ? request.getBuffer() : request.getArray();\n var requestPromise;\n var url = mtproto_1.MTProto.dcConfigurator.chooseServer(self.dcID, self.upload);\n var baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n url: url\n };\n requestPromise = fetch(url, Object.assign({ method: 'POST', body: requestData }, options))\n .then(function (response) {\n //console.log('sendEncryptedRequest response', response);\n if (response.status != 200)\n throw response;\n return response.arrayBuffer();\n });\n // WARNING ТУТ НУЖЕН .CATCH\n return requestPromise.then(function (result) {\n if (!result || !result.byteLength) {\n return Promise.reject(baseError);\n }\n return result;\n }, function (error) {\n if (!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n return Promise.reject(error);\n });\n });\n };\n MTPNetworker.prototype.parseResponse = function (responseBuffer) {\n // console.log(dT(), 'Start parsing response');\n var self = this;\n var deserializer = new tl_utils_1.TLDeserialization(responseBuffer);\n var authKeyID = deserializer.fetchIntBytes(64, false, 'auth_key_id');\n if (!bin_utils_1.bytesCmp(authKeyID, this.authKeyID)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bin_utils_1.bytesToHex(authKeyID));\n }\n var msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n var encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n return self.getDecryptedMessage(msgKey, encryptedData).then(function (dataWithPadding) {\n // console.log(dT(), 'after decrypt')\n return self.getMsgKey(dataWithPadding, false).then(function (calcMsgKey) {\n if (!bin_utils_1.bytesCmp(msgKey, calcMsgKey)) {\n console.warn('[MT] msg_keys', msgKey, bin_utils_1.bytesFromArrayBuffer(calcMsgKey));\n throw new Error('[MT] server msgKey mismatch');\n }\n // console.log(dT(), 'after msgKey check')\n var deserializer = new tl_utils_1.TLDeserialization(dataWithPadding, {\n mtproto: true\n });\n var salt = deserializer.fetchIntBytes(64, false, 'salt');\n var sessionID = deserializer.fetchIntBytes(64, false, 'session_id');\n var messageID = deserializer.fetchLong('message_id');\n if (!bin_utils_1.bytesCmp(sessionID, self.sessionID) &&\n (!self.prevSessionID || !bin_utils_1.bytesCmp(sessionID, self.prevSessionID))) {\n console.warn('Sessions', sessionID, self.sessionID, self.prevSessionID);\n throw new Error('[MT] Invalid server session_id: ' + bin_utils_1.bytesToHex(sessionID));\n }\n var seqNo = deserializer.fetchInt('seq_no');\n var totalLength = dataWithPadding.byteLength;\n var messageBodyLength = deserializer.fetchInt('message_data[length]');\n var offset = deserializer.getOffset();\n if ((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n var messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n var offset = deserializer.getOffset();\n var paddingLength = totalLength - offset;\n if (paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n var buffer = bin_utils_1.bytesToArrayBuffer(messageBody);\n var deserializer = new tl_utils_1.TLDeserialization(buffer, { mtproto: true });\n // костыль\n deserializer.override = {\n mt_message: (function (result, field) {\n result.msg_id = this.fetchLong(field + '[msg_id]');\n result.seqno = this.fetchInt(field + '[seqno]');\n result.bytes = this.fetchInt(field + '[bytes]');\n var offset = this.getOffset();\n //console.log('mt_message!!!!!', result, field);\n try {\n result.body = this.fetchObject('Object', field + '[body]');\n }\n catch (e) {\n console.error(utils_1.dT(), 'parse error', e.message, e.stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n if (this.offset != offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // console.log(dT(), result)\n this.offset = offset + result.bytes;\n }\n // console.log(dT(), 'override message', result)\n }).bind(deserializer),\n mt_rpc_result: (function (result, field) {\n result.req_msg_id = this.fetchLong(field + '[req_msg_id]');\n var sentMessage = self.sentMessages[result.req_msg_id];\n var type = sentMessage && sentMessage.resultType || 'Object';\n if (result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n result.result = this.fetchObject(type, field + '[result]');\n // console.log(dT(), 'override rpc_result', sentMessage, type, result);\n }).bind(deserializer)\n };\n var response = deserializer.fetchObject('', 'INPUT');\n return {\n response: response,\n messageID: messageID,\n sessionID: sessionID,\n seqNo: seqNo\n };\n });\n });\n };\n MTPNetworker.prototype.applyServerSalt = function (newServerSalt) {\n var _a;\n var serverSalt = bin_utils_1.longToBytes(newServerSalt);\n storage_1.default.set((_a = {},\n _a['dc' + this.dcID + '_server_salt'] = bin_utils_1.bytesToHex(serverSalt),\n _a));\n this.serverSalt = serverSalt;\n return true;\n };\n MTPNetworker.prototype.scheduleRequest = function (delay) {\n if (delay === void 0) { delay = 0; }\n if (this.offline) {\n this.checkConnection('forced schedule');\n }\n var nextReq = utils_1.tsNow() + delay;\n if (delay && this.nextReq && this.nextReq <= nextReq) {\n return false;\n }\n // console.log(dT(), 'schedule req', delay)\n // console.trace()\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n if (delay > 0) {\n this.nextReqTimeout = window.setTimeout(this.performScheduledRequest.bind(this), delay || 0);\n }\n else {\n setTimeout(this.performScheduledRequest.bind(this), 0);\n }\n this.nextReq = nextReq;\n };\n MTPNetworker.prototype.ackMessage = function (msgID) {\n // console.log('ack message', msgID)\n this.pendingAcks.push(msgID);\n this.scheduleRequest(30000);\n };\n MTPNetworker.prototype.reqResendMessage = function (msgID) {\n console.log(utils_1.dT(), 'Req resend', msgID);\n this.pendingResends.push(msgID);\n this.scheduleRequest(100);\n };\n MTPNetworker.prototype.cleanupSent = function () {\n var _this = this;\n var self = this;\n var notEmpty = false;\n // console.log('clean start', this.dcID/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach(function (msgID) {\n var message = _this.sentMessages[msgID];\n // console.log('clean iter', msgID, message)\n if (message.notContentRelated && self.pendingMessages[msgID] === undefined) {\n // console.log('clean notContentRelated', msgID)\n delete self.sentMessages[msgID];\n }\n else if (message.container) {\n for (var i = 0; i < message.inner.length; i++) {\n if (self.sentMessages[message.inner[i]] !== undefined) {\n // console.log('clean failed, found', msgID, message.inner[i], self.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // console.log('clean container', msgID)\n delete self.sentMessages[msgID];\n }\n else {\n notEmpty = true;\n }\n });\n return !notEmpty;\n };\n MTPNetworker.prototype.processMessageAck = function (messageID) {\n var sentMessage = this.sentMessages[messageID];\n if (sentMessage && !sentMessage.acked) {\n delete sentMessage.body;\n sentMessage.acked = true;\n return true;\n }\n return false;\n };\n MTPNetworker.prototype.processError = function (rawError) {\n var matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = bin_utils_1.uintToInt(rawError.error_code);\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n };\n MTPNetworker.prototype.processMessage = function (message, messageID, sessionID) {\n var _this = this;\n var msgidInt = parseInt(messageID /* .toString(10) */.substr(0, -10), 10);\n if (msgidInt % 2) {\n console.warn('[MT] Server even message id: ', messageID, message);\n return;\n }\n // console.log('process message', message, messageID, sessionID)\n switch (message._) {\n case 'msg_container':\n var len = message.messages.length;\n for (var i = 0; i < len; i++) {\n this.processMessage(message.messages[i], message.messages[i].msg_id, sessionID);\n }\n break;\n case 'bad_server_salt':\n console.log(utils_1.dT(), 'Bad server salt', message);\n var sentMessage = this.sentMessages[message.bad_msg_id];\n if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n console.log(message.bad_msg_id, message.bad_msg_seqno);\n throw new Error('[MT] Bad server salt for invalid message');\n }\n this.applyServerSalt(message.new_server_salt);\n this.pushResend(message.bad_msg_id);\n this.ackMessage(messageID);\n break;\n case 'bad_msg_notification':\n console.log(utils_1.dT(), 'Bad msg notification', message);\n var sentMessage = this.sentMessages[message.bad_msg_id];\n if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n console.log(message.bad_msg_id, message.bad_msg_seqno);\n throw new Error('[MT] Bad msg notification for invalid message');\n }\n if (message.error_code == 16 || message.error_code == 17) {\n if (mtproto_1.MTProto.timeManager.applyServerTime(bin_utils_1.bigStringInt(messageID).shiftRight(32).toString(10))) {\n console.log(utils_1.dT(), 'Update session');\n this.updateSession();\n }\n var badMessage = this.updateSentMessage(message.bad_msg_id);\n this.pushResend(badMessage.msg_id);\n this.ackMessage(messageID);\n }\n break;\n case 'message':\n if (this.lastServerMessages.indexOf(messageID) != -1) {\n // console.warn('[MT] Server same messageID: ', messageID)\n this.ackMessage(messageID);\n return;\n }\n this.lastServerMessages.push(messageID);\n if (this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n this.processMessage(message.body, message.msg_id, sessionID);\n break;\n case 'new_session_created':\n this.ackMessage(messageID);\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n storage_1.default.get('dc').then(function (baseDcID) {\n if (baseDcID == _this.dcID && !_this.upload && _this.NetworkerFactory.updatesProcessor) {\n // @ts-ignore\n _this.NetworkerFactory.updatesProcessor(message, true);\n }\n });\n break;\n case 'msgs_ack':\n for (var i = 0; i < message.msg_ids.length; i++) {\n this.processMessageAck(message.msg_ids[i]);\n }\n break;\n case 'msg_detailed_info':\n if (!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if (this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n case 'msgs_state_info':\n this.ackMessage(message.answer_msg_id);\n if (this.lastResendReq &&\n this.lastResendReq.req_msg_id == message.req_msg_id &&\n this.pendingResends.length) {\n var badMsgID, pos;\n for (var i_1 = 0; i_1 < this.lastResendReq.resend_msg_ids.length; i_1++) {\n badMsgID = this.lastResendReq.resend_msg_ids[i_1];\n pos = this.pendingResends.indexOf(badMsgID);\n if (pos != -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n break;\n case 'rpc_result':\n this.ackMessage(messageID);\n var sentMessageID = message.req_msg_id;\n var sentMessage = this.sentMessages[sentMessageID];\n this.processMessageAck(sentMessageID);\n if (sentMessage) {\n var deferred = sentMessage.deferred;\n if (message.result._ == 'rpc_error') {\n var error = this.processError(message.result);\n console.log(utils_1.dT(), 'Rpc error', error);\n if (deferred) {\n deferred.reject(error);\n }\n }\n else {\n if (deferred) {\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Rpc response', message.result);\n }\n else {\n var dRes = message.result._;\n if (!dRes) {\n if (message.result.length > 5) {\n dRes = '[..' + message.result.length + '..]';\n }\n else {\n dRes = message.result;\n }\n }\n console.log(utils_1.dT(), 'Rpc response', dRes, sentMessage);\n }\n sentMessage.deferred.resolve(message.result);\n }\n if (sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n console.log(utils_1.dT(), 'Rpc set connectionInited to:', this.connectionInited, this);\n }\n }\n delete this.sentMessages[sentMessageID];\n }\n break;\n default:\n this.ackMessage(messageID);\n console.log(utils_1.dT(), 'Update', message);\n if (this.NetworkerFactory.updatesProcessor !== null) {\n // @ts-ignore\n this.NetworkerFactory.updatesProcessor(message, true);\n }\n break;\n }\n };\n return MTPNetworker;\n}());\nexports.MTPNetworker = MTPNetworker;\n"
},
{
"id": 40,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/js/OverlayScrollbars.js",
"name": "./node_modules/overlayscrollbars/js/OverlayScrollbars.js",
"index": 40,
"index2": 38,
"size": 363010,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"issuerId": 7,
"issuerName": "./src/components/pageIm.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1600,
"building": 228
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "overlayscrollbars",
"loc": "8:42-70"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*!\n * OverlayScrollbars\n * https://github.com/KingSora/OverlayScrollbars\n *\n * Version: 1.10.0\n *\n * Copyright KingSora | Rene Haas.\n * https://github.com/KingSora\n *\n * Released under the MIT license.\n * Date: 11.10.2019\n */\n\n(function (global, factory) {\n if (typeof define === 'function' && define.amd)\n define(function() { return factory(global, global.document, undefined); });\n else if (typeof module === 'object' && typeof module.exports === 'object')\n module.exports = factory(global, global.document, undefined);\n else\n factory(global, global.document, undefined);\n}(typeof window !== 'undefined' ? window : this,\n function(window, document, undefined) {\n 'use strict';\n var PLUGINNAME = 'OverlayScrollbars';\n var TYPES = {\n o : 'object',\n f : 'function',\n a : 'array',\n s : 'string',\n b : 'boolean',\n n : 'number',\n u : 'undefined',\n z : 'null'\n //d : 'date',\n //e : 'error',\n //r : 'regexp',\n //y : 'symbol'\n };\n var LEXICON = {\n c : 'class',\n s : 'style',\n i : 'id',\n l : 'length',\n p : 'prototype',\n oH : 'offsetHeight',\n cH : 'clientHeight',\n sH : 'scrollHeight',\n oW : 'offsetWidth',\n cW : 'clientWidth',\n sW : 'scrollWidth',\n hOP : 'hasOwnProperty',\n bCR : 'getBoundingClientRect'\n };\n var VENDORS = (function() {\n //https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\n var jsCache = { };\n var cssCache = { };\n var cssPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];\n var jsPrefixes = ['WebKit', 'Moz', 'O', 'MS'];\n function firstLetterToUpper(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n \n return {\n _cssPrefixes: cssPrefixes,\n _jsPrefixes: jsPrefixes,\n _cssProperty : function(name) {\n var result = cssCache[name];\n \n if(cssCache[LEXICON.hOP](name))\n return result;\n\n var uppercasedName = firstLetterToUpper(name);\n var elmStyle = document.createElement('div')[LEXICON.s];\n var resultPossibilities;\n var i = 0;\n var v;\n var currVendorWithoutDashes;\n\n for (; i < cssPrefixes.length; i++) {\n currVendorWithoutDashes = cssPrefixes[i].replace(/-/g, '');\n resultPossibilities = [\n name, //transition\n cssPrefixes[i] + name, //-webkit-transition\n currVendorWithoutDashes + uppercasedName, //webkitTransition\n firstLetterToUpper(currVendorWithoutDashes) + uppercasedName //WebkitTransition\n ];\n for(v = 0; v < resultPossibilities[LEXICON.l]; v++) {\n if(elmStyle[resultPossibilities[v]] !== undefined) {\n result = resultPossibilities[v];\n break;\n }\n }\n }\n \n cssCache[name] = result;\n return result;\n },\n _jsAPI : function(name, isInterface, fallback) {\n var i = 0;\n var result = jsCache[name];\n \n if(!jsCache[LEXICON.hOP](name)) {\n result = window[name];\n for(; i < jsPrefixes[LEXICON.l]; i++)\n result = result || window[(isInterface ? jsPrefixes[i] : jsPrefixes[i].toLowerCase()) + firstLetterToUpper(name)];\n jsCache[name] = result;\n }\n return result || fallback;\n }\n \n }\n })();\n var COMPATIBILITY = (function() {\n function windowSize(x) {\n return x ? window.innerWidth || document.documentElement[LEXICON.cW] || document.body[LEXICON.cW] : window.innerHeight || document.documentElement[LEXICON.cH] || document.body[LEXICON.cH];\n }\n function bind(func, thisObj) {\n if (typeof func != TYPES.f) {\n throw \"Can't bind function!\";\n // closest thing possible to the ECMAScript 5\n // internal IsCallable function\n //throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n var proto = LEXICON.p;\n var aArgs = Array[proto].slice.call(arguments, 2);\n var fNOP = function() {};\n var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array[proto].slice.call(arguments))); };\n\n if (func[proto])\n fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property\n fBound[proto] = new fNOP();\n\n return fBound;\n }\n \n return {\n /**\n * Gets the current window width.\n * @returns {Number|number} The current window width in pixel.\n */\n wW: bind(windowSize, 0, true),\n\n /**\n * Gets the current window height.\n * @returns {Number|number} The current window height in pixel.\n */\n wH: bind(windowSize, 0),\n\n /**\n * Gets the MutationObserver Object or undefined if not supported.\n * @returns {MutationObserver|*|undefined} The MutationsObserver Object or undefined.\n */\n mO: bind(VENDORS._jsAPI, 0, 'MutationObserver', true),\n\n /**\n * Gets the ResizeObserver Object or undefined if not supported.\n * @returns {MutationObserver|*|undefined} The ResizeObserver Object or undefined.\n */\n rO: bind(VENDORS._jsAPI, 0, 'ResizeObserver', true),\n\n /**\n * Gets the RequestAnimationFrame method or it's corresponding polyfill.\n * @returns {*|Function} The RequestAnimationFrame method or it's corresponding polyfill.\n */\n rAF: bind(VENDORS._jsAPI, 0, 'requestAnimationFrame', false, function (func) { return window.setTimeout(func, 1000 / 60); }),\n\n /**\n * Gets the CancelAnimationFrame method or it's corresponding polyfill.\n * @returns {*|Function} The CancelAnimationFrame method or it's corresponding polyfill.\n */\n cAF: bind(VENDORS._jsAPI, 0, 'cancelAnimationFrame', false, function (id) { return window.clearTimeout(id); }),\n\n /**\n * Gets the current time.\n * @returns {number} The current time.\n */\n now: function() {\n return Date.now && Date.now() || new Date().getTime();\n },\n\n /**\n * Stops the propagation of the given event.\n * @param event The event of which the propagation shall be stoped.\n */\n stpP: function(event) {\n if(event.stopPropagation)\n event.stopPropagation();\n else\n event.cancelBubble = true;\n },\n\n /**\n * Prevents the default action of the given event.\n * @param event The event of which the default action shall be prevented.\n */\n prvD: function(event) {\n if(event.preventDefault && event.cancelable)\n event.preventDefault();\n else\n event.returnValue = false;\n },\n\n /**\n * Gets the pageX and pageY values of the given mouse event.\n * @param event The mouse event of which the pageX and pageX shall be got.\n * @returns {{x: number, y: number}} x = pageX value, y = pageY value.\n */\n page: function(event) {\n event = event.originalEvent || event;\n\n var strPage = 'page';\n var strClient = 'client';\n var strX = 'X';\n var strY = 'Y';\n var target = event.target || event.srcElement || document;\n var eventDoc = target.ownerDocument || document;\n var doc = eventDoc.documentElement;\n var body = eventDoc.body;\n\n //if touch event return return pageX/Y of it\n if(event.touches !== undefined) {\n var touch = event.touches[0];\n return {\n x : touch[strPage + strX],\n y : touch[strPage + strY]\n }\n }\n\n // Calculate pageX/Y if not native supported\n if (!event[strPage + strX] && event[strClient + strX] && event[strClient + strX] != null) {\n\n return {\n x : event[strClient + strX] +\n (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n (doc && doc.clientLeft || body && body.clientLeft || 0),\n y : event[strClient + strY] +\n (doc && doc.scrollTop || body && body.scrollTop || 0) -\n (doc && doc.clientTop || body && body.clientTop || 0)\n }\n }\n return {\n x : event[strPage + strX],\n y : event[strPage + strY]\n };\n },\n\n /**\n * Gets the clicked mouse button of the given mouse event.\n * @param event The mouse event of which the clicked button shal be got.\n * @returns {number} The number of the clicked mouse button. (0 : none | 1 : leftButton | 2 : middleButton | 3 : rightButton)\n */\n mBtn: function(event) {\n var button = event.button;\n if (!event.which && button !== undefined)\n return (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));\n else\n return event.which;\n },\n\n /**\n * Checks whether a item is in the given array and returns its index.\n * @param item The item of which the position in the array shall be determined.\n * @param arr The array.\n * @returns {number} The zero based index of the item or -1 if the item isn't in the array.\n */\n inA : function(item, arr) {\n for (var i = 0; i < arr[LEXICON.l]; i++)\n //Sometiems in IE a \"SCRIPT70\" Permission denied error occurs if HTML elements in a iFrame are compared\n try {\n if (arr[i] === item)\n return i;\n }\n catch(e) { }\n return -1;\n },\n\n /**\n * Returns true if the given value is a array.\n * @param arr The potential array.\n * @returns {boolean} True if the given value is a array, false otherwise.\n */\n isA: function(arr) {\n var def = Array.isArray;\n return def ? def(arr) : this.type(arr) == TYPES.a;\n },\n\n /**\n * Determine the internal JavaScript [[Class]] of the given object.\n * @param obj The object of which the type shall be determined.\n * @returns {string} The type of the given object.\n */\n type: function(obj) {\n if (obj === undefined)\n return obj + '';\n if (obj === null)\n return obj + '';\n return Object[LEXICON.p].toString.call(obj).replace(/^\\[object (.+)\\]$/, '$1').toLowerCase();\n },\n\n\n bind: bind\n\n /**\n * Gets the vendor-prefixed CSS property by the given name.\n * For example the given name is \"transform\" and you're using a old Firefox browser then the returned value would be \"-moz-transform\".\n * If the browser doesn't need a vendor-prefix, then the returned string is the given name.\n * If the browser doesn't support the given property name at all (not even with a vendor-prefix) the returned value is null.\n * @param propName The unprefixed CSS property name.\n * @returns {string|null} The vendor-prefixed CSS property or null if the browser doesn't support the given CSS property.\n\n cssProp: function(propName) {\n return VENDORS._cssProperty(propName);\n }\n */\n }\n })();\n\n var MATH = Math;\n var JQUERY = window.jQuery;\n var EASING = (function() {\n var _easingsMath = {\n p : MATH.PI,\n c : MATH.cos,\n s : MATH.sin,\n w : MATH.pow,\n t : MATH.sqrt,\n n : MATH.asin,\n a : MATH.abs,\n o : 1.70158\n };\n \n /*\n x : current percent (0 - 1),\n t : current time (duration * percent),\n b : start value (from),\n c : end value (to),\n d : duration\n\n easingName : function(x, t, b, c, d) { return easedValue; }\n */\n\n return {\n swing: function (x, t, b, c, d) {\n return 0.5 - _easingsMath.c(x * _easingsMath.p) / 2;\n },\n linear: function(x, t, b, c, d) {\n return x;\n },\n easeInQuad: function (x, t, b, c, d) {\n return c*(t/=d)*t + b;\n },\n easeOutQuad: function (x, t, b, c, d) {\n return -c *(t/=d)*(t-2) + b;\n },\n easeInOutQuad: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t + b : -c/2 * ((--t)*(t-2) - 1) + b;\n },\n easeInCubic: function (x, t, b, c, d) {\n return c*(t/=d)*t*t + b;\n },\n easeOutCubic: function (x, t, b, c, d) {\n return c*((t=t/d-1)*t*t + 1) + b;\n },\n easeInOutCubic: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t + b : c/2*((t-=2)*t*t + 2) + b;\n },\n easeInQuart: function (x, t, b, c, d) {\n return c*(t/=d)*t*t*t + b;\n },\n easeOutQuart: function (x, t, b, c, d) {\n return -c * ((t=t/d-1)*t*t*t - 1) + b;\n },\n easeInOutQuart: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t*t + b : -c/2 * ((t-=2)*t*t*t - 2) + b;\n },\n easeInQuint: function (x, t, b, c, d) {\n return c*(t/=d)*t*t*t*t + b;\n },\n easeOutQuint: function (x, t, b, c, d) {\n return c*((t=t/d-1)*t*t*t*t + 1) + b;\n },\n easeInOutQuint: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t*t*t + b : c/2*((t-=2)*t*t*t*t + 2) + b;\n },\n easeInSine: function (x, t, b, c, d) {\n return -c * _easingsMath.c(t/d * (_easingsMath.p/2)) + c + b;\n },\n easeOutSine: function (x, t, b, c, d) {\n return c * _easingsMath.s(t/d * (_easingsMath.p/2)) + b;\n },\n easeInOutSine: function (x, t, b, c, d) {\n return -c/2 * (_easingsMath.c(_easingsMath.p*t/d) - 1) + b;\n },\n easeInExpo: function (x, t, b, c, d) {\n return (t==0) ? b : c * _easingsMath.w(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function (x, t, b, c, d) {\n return (t==d) ? b+c : c * (-_easingsMath.w(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function (x, t, b, c, d) {\n if (t==0) return b;\n if (t==d) return b+c;\n if ((t/=d/2) < 1) return c/2 * _easingsMath.w(2, 10 * (t - 1)) + b;\n return c/2 * (-_easingsMath.w(2, -10 * --t) + 2) + b;\n },\n easeInCirc: function (x, t, b, c, d) {\n return -c * (_easingsMath.t(1 - (t/=d)*t) - 1) + b;\n },\n easeOutCirc: function (x, t, b, c, d) {\n return c * _easingsMath.t(1 - (t=t/d-1)*t) + b;\n },\n easeInOutCirc: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? -c/2 * (_easingsMath.t(1 - t*t) - 1) + b : c/2 * (_easingsMath.t(1 - (t-=2)*t) + 1) + b;\n },\n easeInElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n return -(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b;\n },\n easeOutElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; \n if ((t/=d)==1) return b+c; \n if (!p) p=d*.3;\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n return a*_easingsMath.w(2,-10*t) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p ) + c + b;\n },\n easeInOutElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; \n if ((t/=d/2)==2) return b+c; \n if (!p) p=d*(.3*1.5);\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n if (t < 1) return -.5*(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b;\n return a*_easingsMath.w(2,-10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )*.5 + c + b;\n },\n easeInBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return c*(t/=d)*t*((s+1)*t - s) + b;\n },\n easeOutBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n },\n easeInOutBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return ((t/=d/2) < 1) ? c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b : c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n },\n easeInBounce: function (x, t, b, c, d) {\n return c - this.easeOutBounce (x, d-t, 0, c, d) + b;\n },\n easeOutBounce: function (x, t, b, c, d) {\n var o = 7.5625;\n if ((t/=d) < (1/2.75)) {\n return c*(o*t*t) + b;\n } else if (t < (2/2.75)) {\n return c*(o*(t-=(1.5/2.75))*t + .75) + b;\n } else if (t < (2.5/2.75)) {\n return c*(o*(t-=(2.25/2.75))*t + .9375) + b;\n } else {\n return c*(o*(t-=(2.625/2.75))*t + .984375) + b;\n }\n },\n easeInOutBounce: function (x, t, b, c, d) {\n return (t < d/2) ? this.easeInBounce (x, t*2, 0, c, d) * .5 + b : this.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\n }\n };\n /*\n *\n * TERMS OF USE - EASING EQUATIONS\n * \n * Open source under the BSD License. \n * \n * Copyright © 2001 Robert Penner\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n * \n * Redistributions of source code must retain the above copyright notice, this list of \n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list \n * of conditions and the following disclaimer in the documentation and/or other materials \n * provided with the distribution.\n * \n * Neither the name of the author nor the names of contributors may be used to endorse \n * or promote products derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n * OF THE POSSIBILITY OF SUCH DAMAGE. \n *\n */\n })();\n var FRAMEWORK = (function() {\n var _rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n var _strSpace = ' ';\n var _strEmpty = '';\n var _strScrollLeft = 'scrollLeft';\n var _strScrollTop = 'scrollTop';\n var _animations = [ ];\n var _type = COMPATIBILITY.type;\n var _cssNumber = {\n animationIterationCount: true,\n columnCount: true,\n fillOpacity: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n widows: true,\n zIndex: true,\n zoom: true\n };\n\n function extend() {\n var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {},\n i = 1,\n length = arguments[LEXICON.l],\n deep = false;\n\n // Handle a deep copy situation\n if (_type(target) == TYPES.b) {\n deep = target;\n target = arguments[1] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (_type(target) != TYPES.o && !_type(target) == TYPES.f) {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if (length === i) {\n target = FakejQuery;\n --i;\n }\n\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) != null) {\n // Extend the base object\n for (name in options) {\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = COMPATIBILITY.isA(copy)))) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && COMPATIBILITY.isA(src) ? src : [];\n\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n function inArray(item, arr, fromIndex) {\n for (var i = fromIndex || 0; i < arr[LEXICON.l]; i++)\n if (arr[i] === item)\n return i;\n return -1;\n }\n \n function isFunction(obj) {\n return _type(obj) == TYPES.f;\n };\n\n function isEmptyObject(obj) {\n for (var name in obj )\n return false;\n return true;\n };\n\n function isPlainObject(obj) {\n if (!obj || _type(obj) != TYPES.o)\n return false;\n\n var key;\n var proto = LEXICON.p;\n var hasOwnProperty = Object[proto].hasOwnProperty;\n var hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\n var hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\n\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n return false;\n }\n\n\n for (key in obj) { /**/ }\n\n return _type(key) == TYPES.u || hasOwnProperty.call(obj, key);\n };\n\n function each(obj, callback) {\n var i = 0;\n\n if (isArrayLike(obj)) {\n for (; i < obj[LEXICON.l]; i++) {\n if (callback.call(obj[i], i, obj[i]) === false)\n break;\n }\n }\n else {\n for (i in obj) {\n if (callback.call(obj[i], i, obj[i]) === false)\n break;\n }\n }\n\n return obj;\n };\n\n function isArrayLike(obj) {\n var length = !!obj && [LEXICON.l] in obj && obj[LEXICON.l];\n var t = _type(obj);\n return isFunction(t) ? false : (t == TYPES.a || length === 0 || _type(length) == TYPES.n && length > 0 && (length - 1) in obj);\n }\n\n function stripAndCollapse(value) {\n var tokens = value.match(_rnothtmlwhite) || [];\n return tokens.join(_strSpace);\n }\n\n function matches(elem, selector) {\n var nodeList = (elem.parentNode || document).querySelectorAll(selector) || [];\n var i = nodeList[LEXICON.l];\n\n while (i--)\n if (nodeList[i] == elem)\n return true;\n\n return false;\n }\n\n function insertAdjacentElement(el, strategy, child) {\n if(_type(child) == TYPES.a) {\n for(var i = 0; i < child[LEXICON.l]; i++)\n insertAdjacentElement(el, strategy, child[i]);\n }\n else if(_type(child) == TYPES.s)\n el.insertAdjacentHTML(strategy, child);\n else\n el.insertAdjacentElement(strategy, child.nodeType ? child : child[0]);\n }\n\n function setCSSVal(el, prop, val) {\n try {\n if(el[LEXICON.s][prop] !== undefined)\n el[LEXICON.s][prop] = parseCSSVal(prop, val);\n } catch(e) { }\n }\n\n function parseCSSVal(prop, val) {\n if(!_cssNumber[prop.toLowerCase()] && _type(val) == TYPES.n)\n val += 'px';\n return val;\n }\n\n function startNextAnimationInQ(animObj, removeFromQ) {\n var index;\n var nextAnim;\n if(removeFromQ !== false)\n animObj.q.splice(0, 1);\n if(animObj.q[LEXICON.l] > 0) {\n nextAnim = animObj.q[0];\n animate(animObj.el, nextAnim.props, nextAnim.duration, nextAnim.easing, nextAnim.complete, true);\n }\n else {\n index = inArray(animObj, _animations);\n if(index > -1)\n _animations.splice(index, 1);\n }\n }\n\n function setAnimationValue(el, prop, value) {\n if(prop === _strScrollLeft || prop === _strScrollTop)\n el[prop] = value;\n else\n setCSSVal(el, prop, value);\n }\n\n function animate(el, props, options, easing, complete, guaranteedNext) {\n var hasOptions = isPlainObject(options);\n var from = { };\n var to = { };\n var i = 0;\n var key;\n var animObj;\n var start;\n var progress;\n var step;\n var specialEasing;\n var duration;\n if(hasOptions) {\n easing = options.easing;\n start = options.start;\n progress = options.progress;\n step = options.step;\n specialEasing = options.specialEasing;\n complete = options.complete;\n duration = options.duration;\n }\n else\n duration = options;\n specialEasing = specialEasing || { };\n duration = duration || 400;\n easing = easing || 'swing';\n guaranteedNext = guaranteedNext || false;\n\n for(; i < _animations[LEXICON.l]; i++) {\n if(_animations[i].el === el) {\n animObj = _animations[i];\n break;\n }\n }\n\n if(!animObj) {\n animObj = {\n el : el,\n q : []\n };\n _animations.push(animObj);\n }\n\n for (key in props) {\n if(key === _strScrollLeft || key === _strScrollTop)\n from[key] = el[key];\n else\n from[key] = FakejQuery(el).css(key);\n }\n\n for (key in from) {\n if(from[key] !== props[key] && props[key] !== undefined)\n to[key] = props[key];\n }\n\n if(!isEmptyObject(to)) {\n var timeNow;\n var end;\n var percent;\n var fromVal;\n var toVal;\n var easedVal;\n var timeStart;\n var frame;\n var elapsed;\n var qPos = guaranteedNext ? 0 : inArray(qObj, animObj.q);\n var qObj = {\n props : to,\n duration : hasOptions ? options : duration,\n easing : easing,\n complete : complete\n };\n if (qPos === -1) {\n qPos = animObj.q[LEXICON.l];\n animObj.q.push(qObj);\n }\n\n if(qPos === 0) {\n if(duration > 0) {\n timeStart = COMPATIBILITY.now();\n frame = function() {\n timeNow = COMPATIBILITY.now();\n elapsed = (timeNow - timeStart);\n end = qObj.stop || elapsed >= duration;\n percent = 1 - ((MATH.max(0, timeStart + duration - timeNow) / duration) || 0);\n\n for(key in to) {\n fromVal = parseFloat(from[key]);\n toVal = parseFloat(to[key]);\n easedVal = (toVal - fromVal) * EASING[specialEasing[key] || easing](percent, percent * duration, 0, 1, duration) + fromVal;\n setAnimationValue(el, key, easedVal);\n if(isFunction(step)) {\n step(easedVal, {\n elem : el,\n prop : key,\n start : fromVal,\n now : easedVal,\n end : toVal,\n pos : percent,\n options : {\n easing : easing,\n speacialEasing : specialEasing,\n duration : duration,\n complete : complete,\n step : step\n },\n startTime : timeStart\n });\n }\n }\n\n if(isFunction(progress))\n progress({ }, percent, MATH.max(0, duration - elapsed));\n\n if (end) {\n startNextAnimationInQ(animObj);\n if(isFunction(complete))\n complete();\n }\n else\n qObj.frame = COMPATIBILITY.rAF()(frame);\n };\n qObj.frame = COMPATIBILITY.rAF()(frame);\n }\n else {\n for(key in to)\n setAnimationValue(el, key, to[key]);\n startNextAnimationInQ(animObj);\n }\n }\n }\n else if(guaranteedNext)\n startNextAnimationInQ(animObj);\n }\n\n function stop(el, clearQ, jumpToEnd) {\n var animObj;\n var qObj;\n var key;\n var i = 0;\n for(; i < _animations[LEXICON.l]; i++) {\n animObj = _animations[i];\n if(animObj.el === el) {\n if(animObj.q[LEXICON.l] > 0) {\n qObj = animObj.q[0];\n qObj.stop = true;\n COMPATIBILITY.cAF()(qObj.frame);\n animObj.q.splice(0, 1);\n\n if(jumpToEnd)\n for(key in qObj.props)\n setAnimationValue(el, key, qObj.props[key]);\n\n if(clearQ)\n animObj.q = [ ];\n else\n startNextAnimationInQ(animObj, false);\n }\n break;\n }\n }\n }\n \n function elementIsVisible(el) {\n return !!(el[LEXICON.oW] || el[LEXICON.oH] || el.getClientRects()[LEXICON.l]);\n }\n\n function FakejQuery(selector) {\n if(arguments[LEXICON.l] === 0)\n return this;\n\n var base = new FakejQuery();\n var elements = selector;\n var i = 0;\n var elms;\n var el;\n\n if(_type(selector) == TYPES.s) {\n elements = [ ];\n if(selector.charAt(0) === '<') {\n el = document.createElement('div');\n el.innerHTML = selector;\n elms = el.children;\n }\n else {\n elms = document.querySelectorAll(selector);\n }\n\n for(; i < elms[LEXICON.l]; i++)\n elements.push(elms[i]);\n }\n\n if(elements) {\n if(_type(elements) != TYPES.s && (!isArrayLike(elements) || elements === window || elements === elements.self))\n elements = [ elements ];\n\n for(i = 0; i < elements[LEXICON.l]; i++)\n base[i] = elements[i];\n\n base[LEXICON.l] = elements[LEXICON.l];\n }\n\n return base;\n };\n\n FakejQuery[LEXICON.p] = {\n\n //EVENTS:\n\n on : function(eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n\n var eventNameLength = eventName[LEXICON.l];\n var i = 0;\n var el;\n return this.each(function() {\n el = this;\n try {\n if (el.addEventListener) {\n for (; i < eventNameLength; i++)\n el.addEventListener(eventName[i], handler);\n }\n else if(el.detachEvent) {\n for (; i < eventNameLength; i++)\n el.attachEvent('on' + eventName[i], handler);\n }\n } catch (e) { }\n });\n },\n\n off : function(eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n\n var eventNameLength = eventName[LEXICON.l];\n var i = 0;\n var el;\n return this.each(function() {\n el = this;\n try {\n if (el.removeEventListener) {\n for (; i < eventNameLength; i++)\n el.removeEventListener(eventName[i], handler);\n }\n else if(el.detachEvent) {\n for (; i < eventNameLength; i++)\n el.detachEvent('on' + eventName[i], handler);\n }\n } catch (e) { }\n });\n },\n\n one : function (eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n return this.each(function() {\n var el = FakejQuery(this);\n FakejQuery.each(eventName, function(i, oneEventName) {\n var oneHandler = function(e) {\n handler.call(this, e);\n el.off(oneEventName, oneHandler);\n };\n el.on(oneEventName, oneHandler);\n });\n });\n },\n\n trigger : function(eventName) {\n var el;\n var event;\n return this.each(function() {\n el = this;\n if (document.createEvent) {\n event = document.createEvent('HTMLEvents');\n event.initEvent(eventName, true, false);\n el.dispatchEvent(event);\n }\n else {\n el.fireEvent('on' + eventName);\n }\n });\n },\n\n //DOM NODE INSERTING / REMOVING:\n\n append : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'beforeend', child); });\n },\n\n prepend : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'afterbegin', child); });\n },\n\n before : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'beforebegin', child); });\n },\n\n after : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'afterend', child); });\n },\n\n remove : function() {\n return this.each(function() {\n var el = this;\n var parentNode = el.parentNode;\n if(parentNode != null)\n parentNode.removeChild(el);\n });\n },\n\n unwrap : function() {\n var parents = [ ];\n var i;\n var el;\n var parent;\n\n this.each(function() {\n parent = this.parentNode;\n if(inArray(parent, parents) === - 1)\n parents.push(parent);\n });\n\n for(i = 0; i < parents[LEXICON.l]; i++) {\n el = parents[i];\n parent = el.parentNode;\n while (el.firstChild)\n parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n }\n\n return this;\n },\n\n wrapAll : function(wrapperHTML) {\n var i;\n var nodes = this;\n var wrapper = FakejQuery(wrapperHTML)[0];\n var deepest = wrapper;\n var parent = nodes[0].parentNode;\n var previousSibling = nodes[0].previousSibling;\n while(deepest.childNodes[LEXICON.l] > 0)\n deepest = deepest.childNodes[0];\n\n for (i = 0; nodes[LEXICON.l] - i; deepest.firstChild === nodes[0] && i++)\n deepest.appendChild(nodes[i]);\n\n var nextSibling = previousSibling ? previousSibling.nextSibling : parent.firstChild;\n parent.insertBefore(wrapper, nextSibling);\n\n return this;\n },\n\n wrapInner : function(wrapperHTML) {\n return this.each(function() {\n var el = FakejQuery(this);\n var contents = el.contents();\n\n if (contents[LEXICON.l])\n contents.wrapAll(wrapperHTML);\n else\n el.append(wrapperHTML);\n });\n },\n\n wrap : function(wrapperHTML) {\n return this.each(function() { FakejQuery(this).wrapAll(wrapperHTML); });\n },\n\n\n //DOM NODE MANIPULATION / INFORMATION:\n\n css : function(styles, val) {\n var el;\n var key;\n var cptStyle;\n var getCptStyle = window.getComputedStyle;\n if(_type(styles) == TYPES.s) {\n if(val === undefined) {\n el = this[0];\n cptStyle = getCptStyle ? getCptStyle(el, null) : el.currentStyle[styles];\n\n //https://bugzilla.mozilla.org/show_bug.cgi?id=548397 can be null sometimes if iframe with display: none (firefox only!)\n return getCptStyle ? cptStyle != null ? cptStyle.getPropertyValue(styles) : el[LEXICON.s][styles] : cptStyle;\n }\n else {\n return this.each(function() {\n setCSSVal(this, styles, val);\n });\n }\n }\n else {\n return this.each(function() {\n for(key in styles)\n setCSSVal(this, key, styles[key]);\n });\n }\n },\n\n hasClass : function(className) {\n var elem, i = 0;\n var classNamePrepared = _strSpace + className + _strSpace;\n var classList;\n\n while ((elem = this[ i++ ])) {\n classList = elem.classList;\n if(classList && classList.contains(className))\n return true;\n else if (elem.nodeType === 1 && (_strSpace + stripAndCollapse(elem.className + _strEmpty) + _strSpace).indexOf(classNamePrepared) > -1)\n return true;\n }\n\n return false;\n },\n\n addClass : function(className) {\n var classes;\n var elem;\n var cur;\n var curValue;\n var clazz;\n var finalValue;\n var supportClassList;\n var elmClassList;\n var i = 0;\n var v = 0;\n\n if (className) {\n classes = className.match( _rnothtmlwhite ) || [];\n\n while ((elem = this[i++])) {\n elmClassList = elem.classList;\n if(supportClassList === undefined)\n supportClassList = elmClassList !== undefined;\n\n if(supportClassList) {\n while ((clazz = classes[v++]))\n elmClassList.add(clazz);\n }\n else {\n curValue = elem.className + _strEmpty;\n cur = elem.nodeType === 1 && (_strSpace + stripAndCollapse(curValue) + _strSpace);\n\n if (cur) {\n while ((clazz = classes[v++]))\n if (cur.indexOf(_strSpace + clazz + _strSpace) < 0)\n cur += clazz + _strSpace;\n\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue)\n elem.className = finalValue;\n }\n }\n }\n }\n\n return this;\n },\n\n removeClass : function(className) {\n var classes;\n var elem;\n var cur;\n var curValue;\n var clazz;\n var finalValue;\n var supportClassList;\n var elmClassList;\n var i = 0;\n var v = 0;\n\n if (className) {\n classes = className.match(_rnothtmlwhite) || [];\n\n while ((elem = this[i++])) {\n elmClassList = elem.classList;\n if(supportClassList === undefined)\n supportClassList = elmClassList !== undefined;\n\n if(supportClassList) {\n while ((clazz = classes[v++]))\n elmClassList.remove(clazz);\n }\n else {\n curValue = elem.className + _strEmpty;\n cur = elem.nodeType === 1 && (_strSpace + stripAndCollapse(curValue) + _strSpace);\n\n if (cur) {\n while ((clazz = classes[v++]))\n while (cur.indexOf(_strSpace + clazz + _strSpace) > -1)\n cur = cur.replace(_strSpace + clazz + _strSpace, _strSpace);\n\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue)\n elem.className = finalValue;\n }\n }\n }\n }\n\n return this;\n },\n\n hide : function() {\n return this.each(function() { this[LEXICON.s].display = 'none'; });\n },\n\n show : function() {\n return this.each(function() { this[LEXICON.s].display = 'block'; });\n },\n\n attr : function(attrName, value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el.getAttribute(attrName);\n el.setAttribute(attrName, value);\n }\n return this;\n },\n\n removeAttr : function(attrName) {\n return this.each(function() { this.removeAttribute(attrName); });\n },\n\n offset : function() {\n var el = this[0];\n var rect = el[LEXICON.bCR]();\n var scrollLeft = window.pageXOffset || document.documentElement[_strScrollLeft];\n var scrollTop = window.pageYOffset || document.documentElement[_strScrollTop];\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft\n };\n },\n\n position : function() {\n var el = this[0];\n return {\n top: el.offsetTop,\n left: el.offsetLeft\n };\n },\n\n scrollLeft : function(value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el[_strScrollLeft];\n el[_strScrollLeft] = value;\n }\n return this;\n },\n\n scrollTop : function(value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el[_strScrollTop];\n el[_strScrollTop] = value;\n }\n return this;\n },\n\n val : function(value) {\n var el = this[0];\n if(!value)\n return el.value;\n el.value = value;\n return this;\n },\n\n\n //DOM TRAVERSAL / FILTERING:\n\n first : function() {\n return this.eq(0);\n },\n\n last : function() {\n return this.eq(-1);\n },\n\n eq : function(index) {\n return FakejQuery(this[index >= 0 ? index : this[LEXICON.l] + index]);\n },\n\n find : function(selector) {\n var children = [ ];\n var i;\n this.each(function() {\n var el = this;\n var ch = el.querySelectorAll(selector);\n for(i = 0; i < ch[LEXICON.l]; i++)\n children.push(ch[i]);\n });\n return FakejQuery(children);\n },\n\n children : function(selector) {\n var children = [ ];\n var el;\n var ch;\n var i;\n\n this.each(function() {\n ch = this.children;\n for(i = 0; i < ch[LEXICON.l]; i++) {\n el = ch[i];\n if(selector) {\n if((el.matches && el.matches(selector)) || matches(el, selector))\n children.push(el);\n }\n else\n children.push(el);\n }\n });\n return FakejQuery(children);\n },\n\n parent : function(selector) {\n var parents = [ ];\n var parent;\n this.each(function() {\n parent = this.parentNode;\n if(selector ? FakejQuery(parent).is(selector) : true)\n parents.push(parent);\n });\n return FakejQuery(parents);\n },\n\n is : function(selector) {\n \n var el;\n var i;\n for(i = 0; i < this[LEXICON.l]; i++) {\n el = this[i];\n if(selector === ':visible')\n return elementIsVisible(el);\n if(selector === ':hidden')\n return !elementIsVisible(el);\n if((el.matches && el.matches(selector)) || matches(el, selector))\n return true;\n }\n return false;\n },\n\n contents : function() {\n var contents = [ ];\n var childs;\n var i;\n\n this.each(function() {\n childs = this.childNodes;\n for(i = 0; i < childs[LEXICON.l]; i++)\n contents.push(childs[i]);\n });\n\n return FakejQuery(contents);\n },\n\n each : function(callback) {\n return each(this, callback);\n },\n\n\n //ANIMATION:\n\n animate : function(props, duration, easing, complete) {\n return this.each(function() { animate(this, props, duration, easing, complete); });\n },\n\n stop : function(clearQ, jump) {\n return this.each(function() { stop(this, clearQ, jump); });\n }\n };\n\n extend(FakejQuery, {\n extend : extend,\n inArray : inArray,\n isEmptyObject : isEmptyObject,\n isPlainObject : isPlainObject,\n each : each\n });\n\n return FakejQuery;\n })();\n var INSTANCES = (function() {\n var _targets = [ ];\n var _instancePropertyString = '__overlayScrollbars__';\n\n /**\n * Register, unregister or get a certain (or all) instances.\n * Register: Pass the target and the instance.\n * Unregister: Pass the target and null.\n * Get Instance: Pass the target from which the instance shall be got.\n * Get Targets: Pass no arguments.\n * @param target The target to which the instance shall be registered / from which the instance shall be unregistered / the instance shall be got\n * @param instance The instance.\n * @returns {*|void} Returns the instance from the given target.\n */\n return function (target, instance) {\n var argLen = arguments[LEXICON.l];\n if(argLen < 1) {\n //return all targets\n return _targets;\n }\n else {\n if(instance) {\n //register instance\n target[_instancePropertyString] = instance;\n _targets.push(target);\n }\n else {\n var index = COMPATIBILITY.inA(target, _targets);\n if (index > -1) {\n if(argLen > 1) {\n //unregister instance\n delete target[_instancePropertyString];\n _targets.splice(index, 1);\n }\n else {\n //get instance from target\n return _targets[index][_instancePropertyString];\n }\n }\n }\n }\n }\n })();\n var PLUGIN = (function() {\n var _plugin;\n var _pluginsGlobals;\n var _pluginsAutoUpdateLoop;\n var _pluginsExtensions = [ ];\n var _pluginsOptions = (function() {\n var type = COMPATIBILITY.type;\n var possibleTemplateTypes = [\n TYPES.b, //boolean\n TYPES.n, //number\n TYPES.s, //string\n TYPES.a, //array\n TYPES.o, //object\n TYPES.f, //function\n TYPES.z //null\n ];\n var restrictedStringsSplit = ' ';\n var restrictedStringsPossibilitiesSplit = ':';\n var classNameAllowedValues = [TYPES.z, TYPES.s];\n var numberAllowedValues = TYPES.n;\n var booleanNullAllowedValues = [TYPES.z, TYPES.b];\n var booleanTrueTemplate = [true, TYPES.b];\n var booleanFalseTemplate = [false, TYPES.b];\n var callbackTemplate = [null, [TYPES.z, TYPES.f]];\n var inheritedAttrsTemplate = [['style', 'class'], [TYPES.s, TYPES.a, TYPES.z]];\n var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';\n var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';\n var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';\n var scrollbarsAutoHideAllowedValues = 'n:never s:scroll l:leave m:move';\n var optionsDefaultsAndTemplate = {\n className: ['os-theme-dark', classNameAllowedValues], //null || string\n resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v\n sizeAutoCapable: booleanTrueTemplate, //true || false\n clipAlways: booleanTrueTemplate, //true || false\n normalizeRTL: booleanTrueTemplate, //true || false\n paddingAbsolute: booleanFalseTemplate, //true || false\n autoUpdate: [null, booleanNullAllowedValues], //true || false || null\n autoUpdateInterval: [33, numberAllowedValues], //number\n nativeScrollbarsOverlaid: {\n showNativeScrollbars: booleanFalseTemplate, //true || false\n initialize: booleanTrueTemplate //true || false\n },\n overflowBehavior: {\n x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s\n y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s\n },\n scrollbars: {\n visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a\n autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m\n autoHideDelay: [800, numberAllowedValues], //number\n dragScrolling: booleanTrueTemplate, //true || false\n clickScrolling: booleanFalseTemplate, //true || false\n touchSupport: booleanTrueTemplate, //true || false\n snapHandle: booleanFalseTemplate //true || false\n },\n textarea: {\n dynWidth: booleanFalseTemplate, //true || false\n dynHeight: booleanFalseTemplate, //true || false\n inheritedAttrs : inheritedAttrsTemplate //string || array || null\n },\n callbacks: {\n onInitialized: callbackTemplate, //null || function\n onInitializationWithdrawn: callbackTemplate, //null || function\n onDestroyed: callbackTemplate, //null || function\n onScrollStart: callbackTemplate, //null || function\n onScroll: callbackTemplate, //null || function\n onScrollStop: callbackTemplate, //null || function\n onOverflowChanged: callbackTemplate, //null || function\n onOverflowAmountChanged: callbackTemplate, //null || function\n onDirectionChanged: callbackTemplate, //null || function\n onContentSizeChanged: callbackTemplate, //null || function\n onHostSizeChanged: callbackTemplate, //null || function\n onUpdated: callbackTemplate //null || function\n }\n };\n var convert = function(template) {\n var recursive = function(obj) {\n var key;\n var val;\n var valType;\n for(key in obj) {\n if(!obj[LEXICON.hOP](key))\n continue;\n val = obj[key];\n valType = type(val);\n if(valType == TYPES.a)\n obj[key] = val[template ? 1 : 0];\n else if(valType == TYPES.o)\n obj[key] = recursive(val);\n }\n return obj;\n };\n return recursive(FRAMEWORK.extend(true, { }, optionsDefaultsAndTemplate));\n };\n\n return {\n _defaults : convert(),\n\n _template : convert(true),\n\n /**\n * Validates the passed object by the passed template.\n * @param obj The object which shall be validated.\n * @param template The template which defines the allowed values and types.\n * @param writeErrors True if errors shall be logged to the console.\n * @param diffObj If a object is passed then only valid differences to this object will be returned.\n * @returns {{}} A object which contains two objects called \"default\" and \"prepared\" which contains only the valid properties of the passed original object and discards not different values compared to the passed diffObj.\n */\n _validate : function (obj, template, writeErrors, diffObj) {\n var validatedOptions = { };\n var validatedOptionsPrepared = { };\n var objectCopy = FRAMEWORK.extend(true, { }, obj);\n var inArray = FRAMEWORK.inArray;\n var isEmptyObj = FRAMEWORK.isEmptyObject;\n var checkObjectProps = function(data, template, diffData, validatedOptions, validatedOptionsPrepared, prevPropName) {\n for (var prop in template) {\n if (template[LEXICON.hOP](prop) && data[LEXICON.hOP](prop)) {\n var isValid = false;\n var isDiff = false;\n var templateValue = template[prop];\n var templateValueType = type(templateValue);\n var templateIsComplex = templateValueType == TYPES.o;\n var templateTypes = type(templateValue) != TYPES.a ? [ templateValue ] : templateValue;\n var dataDiffValue = diffData[prop];\n var dataValue = data[prop];\n var dataValueType = type(dataValue);\n var propPrefix = prevPropName ? prevPropName + '.' : '';\n var error = \"The option \\\"\" + propPrefix + prop + \"\\\" wasn't set, because\";\n var errorPossibleTypes = [ ];\n var errorRestrictedStrings = [ ];\n var restrictedStringValuesSplit;\n var restrictedStringValuesPossibilitiesSplit;\n var isRestrictedValue;\n var mainPossibility;\n var currType;\n var i;\n var v;\n var j;\n\n dataDiffValue = dataDiffValue === undefined ? { } : dataDiffValue;\n \n //if the template has a object as value, it means that the options are complex (verschachtelt)\n if(templateIsComplex && dataValueType == TYPES.o) {\n validatedOptions[prop] = { };\n validatedOptionsPrepared[prop] = { };\n checkObjectProps(dataValue, templateValue, dataDiffValue, validatedOptions[prop], validatedOptionsPrepared[prop], propPrefix + prop);\n FRAMEWORK.each([ data, validatedOptions, validatedOptionsPrepared ], function(index, value) {\n if(isEmptyObj(value[prop])) {\n delete value[prop];\n }\n });\n }\n else if(!templateIsComplex) {\n for(i = 0; i < templateTypes[LEXICON.l]; i++) {\n currType = templateTypes[i];\n templateValueType = type(currType);\n //if currtype is string and starts with restrictedStringPrefix and end with restrictedStringSuffix\n isRestrictedValue = templateValueType == TYPES.s && inArray(currType, possibleTemplateTypes) === -1;\n if(isRestrictedValue) {\n errorPossibleTypes.push(TYPES.s);\n\n //split it into a array which contains all possible values for example: [\"y:yes\", \"n:no\", \"m:maybe\"]\n restrictedStringValuesSplit = currType.split(restrictedStringsSplit);\n errorRestrictedStrings = errorRestrictedStrings.concat(restrictedStringValuesSplit);\n for(v = 0; v < restrictedStringValuesSplit[LEXICON.l]; v++) {\n //split the possible values into their possibiliteis for example: [\"y\", \"yes\"] -> the first is always the mainPossibility\n restrictedStringValuesPossibilitiesSplit = restrictedStringValuesSplit[v].split(restrictedStringsPossibilitiesSplit);\n mainPossibility = restrictedStringValuesPossibilitiesSplit[0];\n for(j = 0; j < restrictedStringValuesPossibilitiesSplit[LEXICON.l]; j++) {\n //if any possibility matches with the dataValue, its valid\n if(dataValue === restrictedStringValuesPossibilitiesSplit[j]) {\n isValid = true;\n break;\n }\n }\n if(isValid)\n break;\n }\n }\n else {\n errorPossibleTypes.push(currType);\n\n if(dataValueType === currType) {\n isValid = true;\n break;\n }\n }\n }\n\n if(isValid) {\n isDiff = dataValue !== dataDiffValue;\n \n if(isDiff)\n validatedOptions[prop] = dataValue;\n \n if(isRestrictedValue ? inArray(dataDiffValue, restrictedStringValuesPossibilitiesSplit) < 0 : isDiff)\n validatedOptionsPrepared[prop] = isRestrictedValue ? mainPossibility : dataValue;\n }\n else if(writeErrors) {\n console.warn(error + \" it doesn't accept the type [ \" + dataValueType.toUpperCase() + \" ] with the value of \\\"\" + dataValue + \"\\\".\\r\\n\" +\n \"Accepted types are: [ \" + errorPossibleTypes.join(', ').toUpperCase() + \" ].\" +\n (errorRestrictedStrings[length] > 0 ? \"\\r\\nValid strings are: [ \" + errorRestrictedStrings.join(', ').split(restrictedStringsPossibilitiesSplit).join(', ') + \" ].\" : ''));\n }\n delete data[prop];\n }\n }\n }\n };\n checkObjectProps(objectCopy, template, diffObj || { }, validatedOptions, validatedOptionsPrepared);\n\n //add values which aren't specified in the template to the finished validated object to prevent them from being discarded\n /*\n if(keepForeignProps) {\n FRAMEWORK.extend(true, validatedOptions, objectCopy);\n FRAMEWORK.extend(true, validatedOptionsPrepared, objectCopy);\n }\n */\n \n if(!isEmptyObj(objectCopy) && writeErrors)\n console.warn('The following options are discarded due to invalidity:\\r\\n' + window.JSON.stringify(objectCopy, null, 2));\n\n return {\n _default : validatedOptions,\n _prepared : validatedOptionsPrepared\n };\n }\n }\n }());\n\n /**\n * Initializes the object which contains global information about the plugin and each instance of it.\n */\n function initOverlayScrollbarsStatics() {\n if(!_pluginsGlobals)\n _pluginsGlobals = new OverlayScrollbarsGlobals(_pluginsOptions._defaults);\n if(!_pluginsAutoUpdateLoop)\n _pluginsAutoUpdateLoop = new OverlayScrollbarsAutoUpdateLoop(_pluginsGlobals);\n }\n\n /**\n * The global object for the OverlayScrollbars objects. It contains resources which every OverlayScrollbars object needs. This object is initialized only once: if the first OverlayScrollbars object gets initialized.\n * @param defaultOptions\n * @constructor\n */\n function OverlayScrollbarsGlobals(defaultOptions) {\n var _base = this;\n var strOverflow = 'overflow';\n var strHidden = 'hidden';\n var strScroll = 'scroll';\n var bodyElement = FRAMEWORK('body');\n var scrollbarDummyElement = FRAMEWORK('<div id=\"os-dummy-scrollbar-size\"><div></div></div>');\n var scrollbarDummyElement0 = scrollbarDummyElement[0];\n var dummyContainerChild = FRAMEWORK(scrollbarDummyElement.children('div').eq(0));\n\n bodyElement.append(scrollbarDummyElement);\n scrollbarDummyElement.hide().show(); //fix IE8 bug (incorrect measuring)\n\n var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);\n var nativeScrollbarIsOverlaid = {\n x: nativeScrollbarSize.x === 0,\n y: nativeScrollbarSize.y === 0\n };\n var msie = (function() {\n var ua = window.navigator.userAgent;\n var strIndexOf = 'indexOf';\n var strSubString = 'substring';\n var msie = ua[strIndexOf]('MSIE ');\n var trident = ua[strIndexOf]('Trident/');\n var edge = ua[strIndexOf]('Edge/');\n var rv = ua[strIndexOf]('rv:');\n var result;\n var parseIntFunc = parseInt;\n\n // IE 10 or older => return version number\n if (msie > 0)\n result = parseIntFunc(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10);\n\n // IE 11 => return version number\n else if (trident > 0)\n result = parseIntFunc(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10);\n\n // Edge (IE 12+) => return version number\n else if (edge > 0)\n result = parseIntFunc(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10);\n\n // other browser\n return result;\n })();\n\n FRAMEWORK.extend(_base, {\n defaultOptions : defaultOptions,\n msie : msie,\n autoUpdateLoop : false,\n autoUpdateRecommended : !COMPATIBILITY.mO(),\n nativeScrollbarSize : nativeScrollbarSize,\n nativeScrollbarIsOverlaid : nativeScrollbarIsOverlaid,\n nativeScrollbarStyling : (function() {\n var result = false;\n scrollbarDummyElement.addClass('os-viewport-native-scrollbars-invisible');\n try {\n result = (scrollbarDummyElement.css('scrollbar-width') === 'none' && (msie > 9 || !msie)) || window.getComputedStyle(scrollbarDummyElement0, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\n } catch (ex) { }\n \n //fix opera bug: scrollbar styles will only appear if overflow value is scroll or auto during the activation of the style.\n //and set overflow to scroll\n //scrollbarDummyElement.css(strOverflow, strHidden).hide().css(strOverflow, strScroll).show();\n //return (scrollbarDummyElement0[LEXICON.oH] - scrollbarDummyElement0[LEXICON.cH]) === 0 && (scrollbarDummyElement0[LEXICON.oW] - scrollbarDummyElement0[LEXICON.cW]) === 0;\n \n return result;\n })(),\n overlayScrollbarDummySize : { x: 30, y: 30 },\n cssCalc : (function() {\n var dummyStyle = document.createElement('div')[LEXICON.s];\n var strCalc = 'calc';\n var i = -1;\n var prop;\n\n for(; i < VENDORS._cssPrefixes[LEXICON.l]; i++) {\n prop = i < 0 ? strCalc : VENDORS._cssPrefixes[i] + strCalc;\n dummyStyle.cssText = 'width:' + prop + '(1px);';\n if (dummyStyle[LEXICON.l])\n return prop;\n }\n return null;\n })(),\n restrictedMeasuring : (function() {\n //https://bugzilla.mozilla.org/show_bug.cgi?id=1439305\n scrollbarDummyElement.css(strOverflow, strHidden);\n var scrollSize = {\n w : scrollbarDummyElement0[LEXICON.sW],\n h : scrollbarDummyElement0[LEXICON.sH]\n };\n scrollbarDummyElement.css(strOverflow, 'visible');\n var scrollSize2 = {\n w : scrollbarDummyElement0[LEXICON.sW],\n h : scrollbarDummyElement0[LEXICON.sH]\n };\n return (scrollSize.w - scrollSize2.w) !== 0 || (scrollSize.h - scrollSize2.h) !== 0;\n })(),\n rtlScrollBehavior : (function() {\n scrollbarDummyElement.css({ 'overflow-y' : strHidden, 'overflow-x' : strScroll, 'direction' : 'rtl' }).scrollLeft(0);\n var dummyContainerOffset = scrollbarDummyElement.offset();\n var dummyContainerChildOffset = dummyContainerChild.offset();\n scrollbarDummyElement.scrollLeft(999);\n var dummyContainerScrollOffsetAfterScroll = dummyContainerChild.offset();\n return {\n //origin direction = determines if the zero scroll position is on the left or right side\n //'i' means 'invert' (i === true means that the axis must be inverted to be correct)\n //true = on the left side\n //false = on the right side\n i : dummyContainerOffset.left === dummyContainerChildOffset.left,\n //negative = determines if the maximum scroll is positive or negative\n //'n' means 'negate' (n === true means that the axis must be negated to be correct)\n //true = negative\n //false = positive\n n : dummyContainerChildOffset.left - dummyContainerScrollOffsetAfterScroll.left === 0\n };\n })(),\n supportTransform : VENDORS._cssProperty('transform') !== undefined,\n supportTransition : VENDORS._cssProperty('transition') !== undefined,\n supportPassiveEvents : (function() {\n var supportsPassive = false;\n try {\n window.addEventListener('test', null, Object.defineProperty({ }, 'passive', {\n get: function() {\n supportsPassive = true;\n }\n }));\n } catch (e) { }\n return supportsPassive;\n })(),\n supportResizeObserver : !!COMPATIBILITY.rO(),\n supportMutationObserver : !!COMPATIBILITY.mO()\n });\n\n scrollbarDummyElement.removeAttr(LEXICON.s).remove();\n\n //Catch zoom event:\n (function () {\n if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)\n return;\n\n var abs = MATH.abs;\n var windowWidth = COMPATIBILITY.wW();\n var windowHeight = COMPATIBILITY.wH();\n var windowDpr = getWindowDPR();\n var onResize = function() {\n if(INSTANCES().length > 0) {\n var newW = COMPATIBILITY.wW();\n var newH = COMPATIBILITY.wH();\n var deltaW = newW - windowWidth;\n var deltaH = newH - windowHeight;\n\n if (deltaW === 0 && deltaH === 0)\n return;\n\n var deltaWRatio = MATH.round(newW / (windowWidth / 100.0));\n var deltaHRatio = MATH.round(newH / (windowHeight / 100.0));\n var absDeltaW = abs(deltaW);\n var absDeltaH = abs(deltaH);\n var absDeltaWRatio = abs(deltaWRatio);\n var absDeltaHRatio = abs(deltaHRatio);\n var newDPR = getWindowDPR();\n\n var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;\n var difference = !differenceIsBiggerThanOne(absDeltaWRatio, absDeltaHRatio);\n var dprChanged = newDPR !== windowDpr && windowDpr > 0;\n var isZoom = deltaIsBigger && difference && dprChanged;\n var oldScrollbarSize = _base.nativeScrollbarSize;\n var newScrollbarSize;\n\n if (isZoom) {\n bodyElement.append(scrollbarDummyElement);\n newScrollbarSize = _base.nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement[0]);\n scrollbarDummyElement.remove();\n if(oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\n FRAMEWORK.each(INSTANCES(), function () {\n if(INSTANCES(this))\n INSTANCES(this).update('zoom');\n });\n }\n }\n\n windowWidth = newW;\n windowHeight = newH;\n windowDpr = newDPR;\n }\n };\n\n function differenceIsBiggerThanOne(valOne, valTwo) {\n var absValOne = abs(valOne);\n var absValTwo = abs(valTwo);\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\n }\n\n function getWindowDPR() {\n var dDPI = window.screen.deviceXDPI || 0;\n var sDPI = window.screen.logicalXDPI || 1;\n return window.devicePixelRatio || (dDPI / sDPI);\n }\n\n FRAMEWORK(window).on('resize', onResize);\n })();\n\n function calcNativeScrollbarSize(measureElement) {\n return {\n x: measureElement[LEXICON.oH] - measureElement[LEXICON.cH],\n y: measureElement[LEXICON.oW] - measureElement[LEXICON.cW]\n };\n }\n }\n\n /**\n * The object which manages the auto update loop for all OverlayScrollbars objects. This object is initialized only once: if the first OverlayScrollbars object gets initialized.\n * @constructor\n */\n function OverlayScrollbarsAutoUpdateLoop(globals) {\n var _base = this;\n var _inArray = FRAMEWORK.inArray;\n var _getNow = COMPATIBILITY.now;\n var _strAutoUpdate = 'autoUpdate';\n var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';\n var _strLength = LEXICON.l;\n var _loopingInstances = [ ];\n var _loopingInstancesIntervalCache = [ ];\n var _loopIsActive = false;\n var _loopIntervalDefault = 33;\n var _loopInterval = _loopIntervalDefault;\n var _loopTimeOld = _getNow();\n var _loopID;\n \n\n /**\n * The auto update loop which will run every 50 milliseconds or less if the update interval of a instance is lower than 50 milliseconds.\n */\n var loop = function() {\n if(_loopingInstances[_strLength] > 0 && _loopIsActive) {\n _loopID = COMPATIBILITY.rAF()(function () {\n loop();\n });\n var timeNew = _getNow();\n var timeDelta = timeNew - _loopTimeOld;\n var lowestInterval;\n var instance;\n var instanceOptions;\n var instanceAutoUpdateAllowed;\n var instanceAutoUpdateInterval;\n var now;\n\n if (timeDelta > _loopInterval) {\n _loopTimeOld = timeNew - (timeDelta % _loopInterval);\n lowestInterval = _loopIntervalDefault;\n for(var i = 0; i < _loopingInstances[_strLength]; i++) {\n instance = _loopingInstances[i];\n if (instance !== undefined) {\n instanceOptions = instance.options();\n instanceAutoUpdateAllowed = instanceOptions[_strAutoUpdate];\n instanceAutoUpdateInterval = MATH.max(1, instanceOptions[_strAutoUpdateInterval]);\n now = _getNow();\n\n if ((instanceAutoUpdateAllowed === true || instanceAutoUpdateAllowed === null) && (now - _loopingInstancesIntervalCache[i]) > instanceAutoUpdateInterval) {\n instance.update('auto');\n _loopingInstancesIntervalCache[i] = new Date(now += instanceAutoUpdateInterval);\n }\n\n lowestInterval = MATH.max(1, MATH.min(lowestInterval, instanceAutoUpdateInterval));\n }\n }\n _loopInterval = lowestInterval;\n }\n } else {\n _loopInterval = _loopIntervalDefault;\n }\n };\n\n /**\n * Add OverlayScrollbars instance to the auto update loop. Only successful if the instance isn't already added.\n * @param instance The instance which shall be updated in a loop automatically.\n */\n _base.add = function(instance) {\n if(_inArray(instance, _loopingInstances) === -1) {\n _loopingInstances.push(instance);\n _loopingInstancesIntervalCache.push(_getNow());\n if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {\n _loopIsActive = true;\n globals.autoUpdateLoop = _loopIsActive;\n loop();\n }\n }\n };\n\n /**\n * Remove OverlayScrollbars instance from the auto update loop. Only successful if the instance was added before.\n * @param instance The instance which shall be updated in a loop automatically.\n */\n _base.remove = function(instance) {\n var index = _inArray(instance, _loopingInstances);\n if(index > -1) {\n //remove from loopingInstances list\n _loopingInstancesIntervalCache.splice(index, 1);\n _loopingInstances.splice(index, 1);\n\n //correct update loop behavior\n if (_loopingInstances[_strLength] === 0 && _loopIsActive) {\n _loopIsActive = false;\n globals.autoUpdateLoop = _loopIsActive;\n if(_loopID !== undefined) {\n COMPATIBILITY.cAF()(_loopID);\n _loopID = -1;\n }\n }\n }\n };\n }\n\n /**\n * A object which manages the scrollbars visibility of the target element.\n * @param pluginTargetElement The element from which the scrollbars shall be hidden.\n * @param options The custom options.\n * @param extensions The custom extensions.\n * @param globals\n * @param autoUpdateLoop\n * @returns {*}\n * @constructor\n */\n function OverlayScrollbarsInstance(pluginTargetElement, options, extensions, globals, autoUpdateLoop) {\n //shortcuts\n var type = COMPATIBILITY.type;\n var inArray = FRAMEWORK.inArray;\n var each = FRAMEWORK.each;\n \n //make correct instanceof\n var _base = new _plugin();\n var _frameworkProto = FRAMEWORK[LEXICON.p];\n \n //if passed element is no HTML element: skip and return\n if(!isHTMLElement(pluginTargetElement))\n return;\n \n //if passed element is already initialized: set passed options if there are any and return its instance\n if(INSTANCES(pluginTargetElement)) {\n var inst = INSTANCES(pluginTargetElement);\n inst.options(options);\n return inst;\n }\n\n //globals:\n var _nativeScrollbarIsOverlaid;\n var _overlayScrollbarDummySize;\n var _rtlScrollBehavior;\n var _autoUpdateRecommended;\n var _msieVersion;\n var _nativeScrollbarStyling;\n var _cssCalc;\n var _nativeScrollbarSize;\n var _supportTransition;\n var _supportTransform;\n var _supportPassiveEvents;\n var _supportResizeObserver;\n var _supportMutationObserver;\n var _restrictedMeasuring;\n\n //general readonly:\n var _initialized;\n var _destroyed;\n var _isTextarea;\n var _isBody;\n var _documentMixed;\n var _domExists;\n\n //general:\n var _isBorderBox;\n var _sizeAutoObserverAdded;\n var _paddingX;\n var _paddingY;\n var _borderX;\n var _borderY;\n var _marginX;\n var _marginY;\n var _isRTL;\n var _sleeping;\n var _contentBorderSize = { };\n var _scrollHorizontalInfo = { };\n var _scrollVerticalInfo = { };\n var _viewportSize = { };\n var _nativeScrollbarMinSize = { };\n\n //naming:\n var _strMinusHidden = '-hidden';\n var _strMarginMinus = 'margin-';\n var _strPaddingMinus = 'padding-';\n var _strBorderMinus = 'border-';\n var _strTop = 'top';\n var _strRight = 'right';\n var _strBottom = 'bottom';\n var _strLeft = 'left';\n var _strMinMinus = 'min-';\n var _strMaxMinus = 'max-';\n var _strWidth = 'width';\n var _strHeight = 'height';\n var _strFloat = 'float';\n var _strEmpty = '';\n var _strAuto = 'auto';\n var _strSync = 'sync';\n var _strScroll = 'scroll';\n var _strHundredPercent = '100%';\n var _strX = 'x';\n var _strY = 'y';\n var _strDot = '.';\n var _strSpace = ' ';\n var _strScrollbar = 'scrollbar';\n var _strMinusHorizontal = '-horizontal';\n var _strMinusVertical = '-vertical';\n var _strScrollLeft = _strScroll + 'Left';\n var _strScrollTop = _strScroll + 'Top';\n var _strMouseTouchDownEvent = 'mousedown touchstart';\n var _strMouseTouchUpEvent = 'mouseup touchend touchcancel';\n var _strMouseTouchMoveEvent = 'mousemove touchmove';\n var _strMouseTouchEnter = 'mouseenter';\n var _strMouseTouchLeave = 'mouseleave';\n var _strKeyDownEvent = 'keydown';\n var _strKeyUpEvent = 'keyup';\n var _strSelectStartEvent = 'selectstart';\n var _strTransitionEndEvent = 'transitionend webkitTransitionEnd oTransitionEnd';\n var _strResizeObserverProperty = '__overlayScrollbarsRO__';\n\n //class names:\n var _cassNamesPrefix = 'os-';\n var _classNameHTMLElement = _cassNamesPrefix + 'html';\n var _classNameHostElement = _cassNamesPrefix + 'host';\n var _classNameHostTextareaElement = _classNameHostElement + '-textarea';\n var _classNameHostScrollbarHorizontalHidden = _classNameHostElement + '-' + _strScrollbar + _strMinusHorizontal + _strMinusHidden;\n var _classNameHostScrollbarVerticalHidden = _classNameHostElement + '-' + _strScrollbar + _strMinusVertical + _strMinusHidden;\n var _classNameHostTransition = _classNameHostElement + '-transition';\n var _classNameHostRTL = _classNameHostElement + '-rtl';\n var _classNameHostResizeDisabled = _classNameHostElement + '-resize-disabled';\n var _classNameHostScrolling = _classNameHostElement + '-scrolling';\n var _classNameHostOverflow = _classNameHostElement + '-overflow';\n var _classNameHostOverflowX = _classNameHostOverflow + '-x';\n var _classNameHostOverflowY = _classNameHostOverflow + '-y';\n var _classNameTextareaElement = _cassNamesPrefix + 'textarea';\n var _classNameTextareaCoverElement = _classNameTextareaElement + '-cover';\n var _classNamePaddingElement = _cassNamesPrefix + 'padding';\n var _classNameViewportElement = _cassNamesPrefix + 'viewport';\n var _classNameViewportNativeScrollbarsInvisible = _classNameViewportElement + '-native-scrollbars-invisible';\n var _classNameViewportNativeScrollbarsOverlaid = _classNameViewportElement + '-native-scrollbars-overlaid';\n var _classNameContentElement = _cassNamesPrefix + 'content';\n var _classNameContentArrangeElement = _cassNamesPrefix + 'content-arrange';\n var _classNameContentGlueElement = _cassNamesPrefix + 'content-glue';\n var _classNameSizeAutoObserverElement = _cassNamesPrefix + 'size-auto-observer';\n var _classNameResizeObserverElement = _cassNamesPrefix + 'resize-observer';\n var _classNameResizeObserverItemElement = _cassNamesPrefix + 'resize-observer-item';\n var _classNameResizeObserverItemFinalElement = _classNameResizeObserverItemElement + '-final';\n var _classNameTextInherit = _cassNamesPrefix + 'text-inherit';\n var _classNameScrollbar = _cassNamesPrefix + _strScrollbar;\n var _classNameScrollbarTrack = _classNameScrollbar + '-track';\n var _classNameScrollbarTrackOff = _classNameScrollbarTrack + '-off';\n var _classNameScrollbarHandle = _classNameScrollbar + '-handle';\n var _classNameScrollbarHandleOff = _classNameScrollbarHandle + '-off';\n var _classNameScrollbarUnusable = _classNameScrollbar + '-unusable';\n var _classNameScrollbarAutoHidden = _classNameScrollbar + '-' + _strAuto + _strMinusHidden;\n var _classNameScrollbarCorner = _classNameScrollbar + '-corner';\n var _classNameScrollbarCornerResize = _classNameScrollbarCorner + '-resize';\n var _classNameScrollbarCornerResizeB = _classNameScrollbarCornerResize + '-both';\n var _classNameScrollbarCornerResizeH = _classNameScrollbarCornerResize + _strMinusHorizontal;\n var _classNameScrollbarCornerResizeV = _classNameScrollbarCornerResize + _strMinusVertical;\n var _classNameScrollbarHorizontal = _classNameScrollbar + _strMinusHorizontal;\n var _classNameScrollbarVertical = _classNameScrollbar + _strMinusVertical;\n var _classNameDragging = _cassNamesPrefix + 'dragging';\n var _classNameThemeNone = _cassNamesPrefix + 'theme-none';\n var _classNamesDynamicDestroy = [\n _classNameViewportNativeScrollbarsInvisible,\n _classNameViewportNativeScrollbarsOverlaid,\n _classNameScrollbarTrackOff,\n _classNameScrollbarHandleOff,\n _classNameScrollbarUnusable,\n _classNameScrollbarAutoHidden,\n _classNameScrollbarCornerResize,\n _classNameScrollbarCornerResizeB,\n _classNameScrollbarCornerResizeH,\n _classNameScrollbarCornerResizeV,\n _classNameDragging].join(_strSpace);\n \n //callbacks:\n var _callbacksInitQeueue = [ ];\n\n //options:\n var _defaultOptions;\n var _currentOptions;\n var _currentPreparedOptions;\n\n //extensions:\n var _extensions = { };\n var _extensionsPrivateMethods = 'added removed on contract';\n\n //update\n var _lastUpdateTime;\n var _swallowedUpdateHints = { };\n var _swallowedUpdateTimeout;\n var _swallowUpdateLag = 42;\n var _imgs = [ ];\n\n //DOM elements:\n var _windowElement;\n var _documentElement;\n var _htmlElement;\n var _bodyElement;\n var _targetElement; //the target element of this OverlayScrollbars object\n var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement\n var _sizeAutoObserverElement; //observes size auto changes\n var _sizeObserverElement; //observes size and padding changes\n var _paddingElement; //manages the padding\n var _viewportElement; //is the viewport of our scrollbar model\n var _contentElement; //the element which holds the content\n var _contentArrangeElement; //is needed for correct sizing of the content element (only if native scrollbars are overlays)\n var _contentGlueElement; //has always the size of the content element\n var _textareaCoverElement; //only applied if target is a textarea element. Used for correct size calculation and for prevention of uncontrolled scrolling\n var _scrollbarCornerElement;\n var _scrollbarHorizontalElement;\n var _scrollbarHorizontalTrackElement;\n var _scrollbarHorizontalHandleElement;\n var _scrollbarVerticalElement;\n var _scrollbarVerticalTrackElement;\n var _scrollbarVerticalHandleElement;\n var _windowElementNative;\n var _documentElementNative;\n var _targetElementNative;\n var _hostElementNative;\n var _sizeAutoObserverElementNative;\n var _sizeObserverElementNative;\n var _paddingElementNative;\n var _viewportElementNative;\n var _contentElementNative;\n\n //Cache:\n var _hostSizeCache;\n var _contentScrollSizeCache;\n var _arrangeContentSizeCache;\n var _hasOverflowCache;\n var _hideOverflowCache;\n var _widthAutoCache;\n var _heightAutoCache;\n var _cssMaxValueCache;\n var _cssBoxSizingCache;\n var _cssPaddingCache;\n var _cssBorderCache;\n var _cssMarginCache;\n var _cssDirectionCache;\n var _cssDirectionDetectedCache;\n var _paddingAbsoluteCache;\n var _clipAlwaysCache;\n var _contentGlueSizeCache;\n var _overflowBehaviorCache;\n var _overflowAmountCache;\n var _ignoreOverlayScrollbarHidingCache;\n var _autoUpdateCache;\n var _sizeAutoCapableCache;\n var _contentElementScrollSizeChangeDetectedCache;\n var _hostElementSizeChangeDetectedCache;\n var _scrollbarsVisibilityCache;\n var _scrollbarsAutoHideCache;\n var _scrollbarsClickScrollingCache;\n var _scrollbarsDragScrollingCache;\n var _resizeCache;\n var _normalizeRTLCache;\n var _classNameCache;\n var _oldClassName;\n var _textareaAutoWrappingCache;\n var _textareaInfoCache;\n var _textareaSizeCache;\n var _textareaDynHeightCache;\n var _textareaDynWidthCache;\n var _bodyMinSizeCache;\n var _viewportScrollSizeCache;\n var _displayIsHiddenCache;\n var _updateAutoCache = { };\n\n //MutationObserver:\n var _mutationObserverHost;\n var _mutationObserverContent;\n var _mutationObserverHostCallback;\n var _mutationObserverContentCallback;\n var _mutationObserversConnected;\n var _mutationObserverAttrsTextarea = ['wrap', 'cols', 'rows'];\n var _mutationObserverAttrsHost = [LEXICON.i, LEXICON.c, LEXICON.s, 'open'];\n\n //events:\n var _destroyEvents = [ ];\n\n //textarea:\n var _textareaHasFocus;\n\n //scrollbars:\n var _scrollbarsAutoHideTimeoutId;\n var _scrollbarsAutoHideMoveTimeoutId;\n var _scrollbarsAutoHideDelay;\n var _scrollbarsAutoHideNever;\n var _scrollbarsAutoHideScroll;\n var _scrollbarsAutoHideMove;\n var _scrollbarsAutoHideLeave;\n var _scrollbarsHandleHovered;\n var _scrollbarsHandlesDefineScrollPos;\n \n //resize\n var _resizeNone;\n var _resizeBoth;\n var _resizeHorizontal;\n var _resizeVertical;\n \n \n //==== Event Listener ====//\n\n /**\n * Adds or removes a event listener from the given element. \n * @param element The element to which the event listener shall be applied or removed.\n * @param eventNames The name(s) of the events.\n * @param listener The method which shall be called.\n * @param remove True if the handler shall be removed, false or undefined if the handler shall be added.\n */\n function setupResponsiveEventListener(element, eventNames, listener, remove, passive) {\n var collected = type(eventNames) == TYPES.a && type(listener) == TYPES.a;\n var method = remove ? 'removeEventListener' : 'addEventListener';\n var onOff = remove ? 'off' : 'on';\n var events = collected ? false : eventNames.split(_strSpace)\n var i = 0;\n\n if(collected) {\n for (; i < eventNames[LEXICON.l]; i++)\n setupResponsiveEventListener(element, eventNames[i], listener[i], remove);\n }\n else {\n for (; i < events[LEXICON.l]; i++) {\n if(_supportPassiveEvents)\n element[0][method](events[i], listener, { passive: passive || false });\n else\n element[onOff](events[i], listener);\n }\n }\n }\n\n\n function addDestroyEventListener(element, eventNames, listener, passive) {\n setupResponsiveEventListener(element, eventNames, listener, false, passive);\n _destroyEvents.push(COMPATIBILITY.bind(setupResponsiveEventListener, 0, element, eventNames, listener, true, passive));\n }\n\n //==== Resize Observer ====//\n\n /**\n * Adds or removes a resize observer from the given element.\n * @param targetElement The element to which the resize observer shall be added or removed.\n * @param onElementResizedCallback The callback which is fired every time the resize observer registers a size change or false / undefined if the resizeObserver shall be removed.\n */\n function setupResizeObserver(targetElement, onElementResizedCallback) {\n if(targetElement) {\n var resizeObserver = COMPATIBILITY.rO();\n var strAnimationStartEvent = 'animationstart mozAnimationStart webkitAnimationStart MSAnimationStart';\n var strChildNodes = 'childNodes';\n var constScroll = 3333333;\n var callback = function () {\n targetElement[_strScrollTop](constScroll)[_strScrollLeft](_isRTL ? _rtlScrollBehavior.n ? -constScroll : _rtlScrollBehavior.i ? 0 : constScroll : constScroll);\n onElementResizedCallback();\n };\n //add resize observer:\n if(onElementResizedCallback) {\n if (_supportResizeObserver) {\n var element = targetElement.append(generateDiv(_classNameResizeObserverElement + ' observed')).contents()[0];\n var observer = element[_strResizeObserverProperty] = new resizeObserver(callback);\n observer.observe(element);\n }\n else {\n if (_msieVersion > 9 || !_autoUpdateRecommended) {\n targetElement.prepend(\n generateDiv(_classNameResizeObserverElement,\n generateDiv({ c : _classNameResizeObserverItemElement, dir : 'ltr' },\n generateDiv(_classNameResizeObserverItemElement,\n generateDiv(_classNameResizeObserverItemFinalElement)\n ) +\n generateDiv(_classNameResizeObserverItemElement,\n generateDiv({ c : _classNameResizeObserverItemFinalElement, style : 'width: 200%; height: 200%' })\n )\n )\n )\n );\n\n var observerElement = targetElement[0][strChildNodes][0][strChildNodes][0];\n var shrinkElement = FRAMEWORK(observerElement[strChildNodes][1]);\n var expandElement = FRAMEWORK(observerElement[strChildNodes][0]);\n var expandElementChild = FRAMEWORK(expandElement[0][strChildNodes][0]);\n var widthCache = observerElement[LEXICON.oW];\n var heightCache = observerElement[LEXICON.oH];\n var isDirty;\n var rAFId;\n var currWidth;\n var currHeight;\n var factor = 2;\n var nativeScrollbarSize = globals.nativeScrollbarSize; //care don't make changes to this object!!!\n var reset = function () {\n /*\n var sizeResetWidth = observerElement[LEXICON.oW] + nativeScrollbarSize.x * factor + nativeScrollbarSize.y * factor + _overlayScrollbarDummySize.x + _overlayScrollbarDummySize.y;\n var sizeResetHeight = observerElement[LEXICON.oH] + nativeScrollbarSize.x * factor + nativeScrollbarSize.y * factor + _overlayScrollbarDummySize.x + _overlayScrollbarDummySize.y;\n var expandChildCSS = {};\n expandChildCSS[_strWidth] = sizeResetWidth;\n expandChildCSS[_strHeight] = sizeResetHeight;\n expandElementChild.css(expandChildCSS);\n\n\n expandElement[_strScrollLeft](sizeResetWidth)[_strScrollTop](sizeResetHeight);\n shrinkElement[_strScrollLeft](sizeResetWidth)[_strScrollTop](sizeResetHeight);\n */\n expandElement[_strScrollLeft](constScroll)[_strScrollTop](constScroll);\n shrinkElement[_strScrollLeft](constScroll)[_strScrollTop](constScroll);\n };\n var onResized = function () {\n rAFId = 0;\n if (!isDirty)\n return;\n\n widthCache = currWidth;\n heightCache = currHeight;\n callback();\n };\n var onScroll = function (event) {\n currWidth = observerElement[LEXICON.oW];\n currHeight = observerElement[LEXICON.oH];\n isDirty = currWidth != widthCache || currHeight != heightCache;\n\n if (event && isDirty && !rAFId) {\n COMPATIBILITY.cAF()(rAFId);\n rAFId = COMPATIBILITY.rAF()(onResized);\n }\n else if(!event)\n onResized();\n\n reset();\n if (event) {\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n return false;\n };\n var expandChildCSS = {};\n var observerElementCSS = {};\n\n setTopRightBottomLeft(observerElementCSS, _strEmpty, [\n -((nativeScrollbarSize.y + 1) * factor),\n nativeScrollbarSize.x * -factor,\n nativeScrollbarSize.y * -factor,\n -((nativeScrollbarSize.x + 1) * factor)\n ]);\n\n FRAMEWORK(observerElement).css(observerElementCSS);\n expandElement.on(_strScroll, onScroll);\n shrinkElement.on(_strScroll, onScroll);\n targetElement.on(strAnimationStartEvent, function () {\n onScroll(false);\n });\n //lets assume that the divs will never be that large and a constant value is enough\n expandChildCSS[_strWidth] = constScroll;\n expandChildCSS[_strHeight] = constScroll;\n expandElementChild.css(expandChildCSS);\n\n reset();\n }\n else {\n var attachEvent = _documentElementNative.attachEvent;\n var isIE = _msieVersion !== undefined;\n if (attachEvent) {\n targetElement.prepend(generateDiv(_classNameResizeObserverElement));\n findFirst(targetElement, _strDot + _classNameResizeObserverElement)[0].attachEvent('onresize', callback);\n }\n else {\n var obj = _documentElementNative.createElement(TYPES.o);\n obj.setAttribute('tabindex', '-1');\n obj.setAttribute(LEXICON.c, _classNameResizeObserverElement);\n obj.onload = function () {\n var wnd = this.contentDocument.defaultView;\n wnd.addEventListener('resize', callback);\n wnd.document.documentElement.style.display = 'none';\n };\n obj.type = 'text/html';\n if (isIE)\n targetElement.prepend(obj);\n obj.data = 'about:blank';\n if (!isIE)\n targetElement.prepend(obj);\n targetElement.on(strAnimationStartEvent, callback);\n }\n }\n }\n\n if (targetElement[0] === _sizeObserverElementNative) {\n var directionChanged = function() {\n var dir = _hostElement.css('direction');\n var css = {};\n var scrollLeftValue = 0;\n var result = false;\n if (dir !== _cssDirectionDetectedCache) {\n if (dir === 'ltr') {\n css[_strLeft] = 0;\n css[_strRight] = _strAuto;\n scrollLeftValue = constScroll;\n }\n else {\n css[_strLeft] = _strAuto;\n css[_strRight] = 0;\n scrollLeftValue = _rtlScrollBehavior.n ? -constScroll : _rtlScrollBehavior.i ? 0 : constScroll;\n }\n //execution order is important for IE!!!\n _sizeObserverElement.children().eq(0).css(css);\n _sizeObserverElement[_strScrollLeft](scrollLeftValue)[_strScrollTop](constScroll);\n _cssDirectionDetectedCache = dir;\n result = true;\n }\n return result;\n };\n directionChanged();\n addDestroyEventListener(targetElement, _strScroll, function(event) {\n if (directionChanged())\n update();\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n return false; \n });\n }\n }\n //remove resize observer:\n else {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n var resizeObserverObj = element[_strResizeObserverProperty];\n if(resizeObserverObj) {\n resizeObserverObj.disconnect();\n delete element[_strResizeObserverProperty];\n }\n }\n else {\n remove(targetElement.children(_strDot + _classNameResizeObserverElement).eq(0));\n }\n }\n }\n }\n\n /**\n * Freezes or unfreezes the given resize observer.\n * @param targetElement The element to which the target resize observer is applied.\n * @param freeze True if the resize observer shall be frozen, false otherwise.\n \n function freezeResizeObserver(targetElement, freeze) {\n if (targetElement !== undefined) {\n if(freeze) {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n element[_strResizeObserverProperty].unobserve(element);\n }\n else {\n targetElement = targetElement.children(_strDot + _classNameResizeObserverElement).eq(0);\n var w = targetElement.css(_strWidth);\n var h = targetElement.css(_strHeight);\n var css = {};\n css[_strWidth] = w;\n css[_strHeight] = h;\n targetElement.css(css);\n }\n }\n else {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n element[_strResizeObserverProperty].observe(element);\n }\n else {\n var css = { };\n css[_strHeight] = _strEmpty;\n css[_strWidth] = _strEmpty;\n targetElement.children(_strDot + _classNameResizeObserverElement).eq(0).css(css);\n }\n }\n }\n }\n */\n\n\n //==== Mutation Observers ====//\n\n /**\n * Creates MutationObservers for the host and content Element if they are supported.\n */\n function createMutationObservers() {\n if (_supportMutationObserver) {\n var mutationObserverContentLag = 11;\n var mutationObserver = COMPATIBILITY.mO();\n var contentLastUpdate = COMPATIBILITY.now();\n var mutationTarget;\n var mutationAttrName;\n var contentTimeout;\n var now;\n var sizeAuto;\n var action;\n\n _mutationObserverHostCallback = function(mutations) {\n var doUpdate = false;\n var mutation;\n \n if (_initialized && !_sleeping) {\n each(mutations, function () {\n mutation = this;\n mutationTarget = mutation.target;\n mutationAttrName = mutation.attributeName;\n\n if (mutationAttrName === LEXICON.c)\n doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className);\n else if (mutationAttrName === LEXICON.s)\n doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText;\n else\n doUpdate = true;\n\n if (doUpdate)\n return false;\n });\n\n if (doUpdate)\n _base.update(_strAuto);\n }\n return doUpdate;\n };\n _mutationObserverContentCallback = function (mutations) {\n var doUpdate = false;\n var mutation;\n \n if (_initialized && !_sleeping) {\n each(mutations, function () {\n mutation = this;\n doUpdate = isUnknownMutation(mutation);\n return !doUpdate;\n });\n\n if (doUpdate) {\n now = COMPATIBILITY.now();\n sizeAuto = (_heightAutoCache || _widthAutoCache);\n action = function () {\n if(!_destroyed) {\n contentLastUpdate = now;\n\n //if cols, rows or wrap attr was changed\n if (_isTextarea)\n textareaUpdate();\n\n if (sizeAuto)\n update();\n else\n _base.update(_strAuto);\n }\n };\n clearTimeout(contentTimeout);\n if (mutationObserverContentLag <= 0 || now - contentLastUpdate > mutationObserverContentLag || !sizeAuto)\n action();\n else\n contentTimeout = setTimeout(action, mutationObserverContentLag);\n }\n }\n return doUpdate;\n }\n\n _mutationObserverHost = new mutationObserver(_mutationObserverHostCallback);\n _mutationObserverContent = new mutationObserver(_mutationObserverContentCallback);\n }\n }\n\n /**\n * Connects the MutationObservers if they are supported.\n */\n function connectMutationObservers() {\n if (_supportMutationObserver && !_mutationObserversConnected) {\n _mutationObserverHost.observe(_hostElementNative, {\n attributes: true,\n attributeOldValue: true,\n attributeFilter: _mutationObserverAttrsHost\n });\n\n _mutationObserverContent.observe(_isTextarea ? _targetElementNative : _contentElementNative, {\n attributes: true,\n attributeOldValue: true,\n subtree: !_isTextarea,\n childList: !_isTextarea,\n characterData: !_isTextarea,\n attributeFilter: _isTextarea ? _mutationObserverAttrsTextarea : _mutationObserverAttrsHost\n });\n\n _mutationObserversConnected = true;\n }\n }\n\n /**\n * Disconnects the MutationObservers if they are supported.\n */\n function disconnectMutationObservers() {\n if (_supportMutationObserver && _mutationObserversConnected) {\n _mutationObserverHost.disconnect();\n _mutationObserverContent.disconnect();\n\n _mutationObserversConnected = false;\n }\n }\n\n \n //==== Events of elements ====//\n\n /**\n * This method gets called every time the host element gets resized. IMPORTANT: Padding changes are detected too!!\n * It refreshes the hostResizedEventArgs and the hostSizeResizeCache.\n * If there are any size changes, the update method gets called.\n */\n function hostOnResized() {\n if (!_sleeping) {\n var changed;\n var hostSize = {\n w: _sizeObserverElementNative[LEXICON.sW],\n h: _sizeObserverElementNative[LEXICON.sH]\n };\n \n changed = checkCache(hostSize, _hostElementSizeChangeDetectedCache);\n _hostElementSizeChangeDetectedCache = hostSize;\n if (changed)\n update({ _hostSizeChanged : true });\n }\n }\n\n /**\n * The mouse enter event of the host element. This event is only needed for the autoHide feature.\n */\n function hostOnMouseEnter() {\n if (_scrollbarsAutoHideLeave)\n refreshScrollbarsAutoHide(true);\n }\n\n /**\n * The mouse leave event of the host element. This event is only needed for the autoHide feature.\n */\n function hostOnMouseLeave() {\n if (_scrollbarsAutoHideLeave && !_bodyElement.hasClass(_classNameDragging))\n refreshScrollbarsAutoHide(false);\n }\n\n /**\n * The mouse move event of the host element. This event is only needed for the autoHide \"move\" feature.\n */\n function hostOnMouseMove() {\n if (_scrollbarsAutoHideMove) {\n refreshScrollbarsAutoHide(true);\n clearTimeout(_scrollbarsAutoHideMoveTimeoutId);\n _scrollbarsAutoHideMoveTimeoutId = setTimeout(function () {\n if (_scrollbarsAutoHideMove && !_destroyed)\n refreshScrollbarsAutoHide(false);\n }, 100);\n }\n }\n\n /**\n * Prevents text from deselection if attached to the document element on the mousedown event of a DOM element.\n * @param event The select start event.\n */\n function documentOnSelectStart(event) {\n COMPATIBILITY.prvD(event);\n return false;\n }\n\n /**\n * A callback which will be called after a img element has downloaded its src asynchronous.\n */\n function imgOnLoad() {\n update({ _contentSizeChanged : true });\n }\n\n /**\n * Adds or removes mouse & touch events of the host element. (for handling auto-hiding of the scrollbars)\n * @param destroy Indicates whether the events shall be added or removed.\n */\n function setupHostMouseTouchEvents(destroy) {\n setupResponsiveEventListener(_hostElement, \n _strMouseTouchMoveEvent, \n hostOnMouseMove, \n (_scrollbarsAutoHideMove ? destroy : true), true);\n setupResponsiveEventListener(_hostElement, \n [ _strMouseTouchEnter, _strMouseTouchLeave ],\n [ hostOnMouseEnter, hostOnMouseLeave ], \n (_scrollbarsAutoHideMove ? true : destroy), true);\n\n //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible\n if(!_initialized && !destroy)\n _hostElement.one('mouseover', hostOnMouseEnter);\n }\n\n\n //==== Update Detection ====//\n\n /**\n * Measures the min width and min height of the body element and refreshes the related cache.\n * @returns {boolean} True if the min width or min height has changed, false otherwise.\n */\n function bodyMinSizeChanged() {\n var bodyMinSize = {};\n if (_isBody && _contentArrangeElement) {\n bodyMinSize.w = parseToZeroOrNumber(_contentArrangeElement.css(_strMinMinus + _strWidth));\n bodyMinSize.h = parseToZeroOrNumber(_contentArrangeElement.css(_strMinMinus + _strHeight));\n bodyMinSize.c = checkCache(bodyMinSize, _bodyMinSizeCache);\n bodyMinSize.f = true; //flag for \"measured at least once\"\n }\n _bodyMinSizeCache = bodyMinSize;\n return !!bodyMinSize.c;\n }\n\n /**\n * Returns true if the class names really changed (new class without plugin host prefix)\n * @param oldCassNames The old ClassName string.\n * @param newClassNames The new ClassName string.\n * @returns {boolean} True if the class names has really changed, false otherwise.\n */\n function hostClassNamesChanged(oldCassNames, newClassNames) {\n var currClasses = (newClassNames !== undefined && newClassNames !== null) ? newClassNames.split(_strSpace) : _strEmpty;\n var oldClasses = (oldCassNames !== undefined && oldCassNames !== null) ? oldCassNames.split(_strSpace) : _strEmpty;\n if (currClasses === _strEmpty && oldClasses === _strEmpty)\n return false;\n var diff = getArrayDifferences(oldClasses, currClasses);\n var changed = false;\n var oldClassNames = _oldClassName !== undefined && _oldClassName !== null ? _oldClassName.split(_strSpace) : [_strEmpty];\n var currClassNames = _classNameCache !== undefined && _classNameCache !== null ? _classNameCache.split(_strSpace) : [_strEmpty];\n\n //remove none theme from diff list to prevent update\n var idx = inArray(_classNameThemeNone, diff);\n var curr;\n var i;\n var v;\n var o;\n var c;\n\n if (idx > -1)\n diff.splice(idx, 1);\n\n for (i = 0; i < diff.length; i++) {\n curr = diff[i];\n if (curr.indexOf(_classNameHostElement) !== 0) {\n o = true;\n c = true;\n for (v = 0; v < oldClassNames.length; v++) {\n if (curr === oldClassNames[v]) {\n o = false;\n break;\n }\n }\n for (v = 0; v < currClassNames.length; v++) {\n if (curr === currClassNames[v]) {\n c = false;\n break;\n }\n }\n if (o && c) {\n changed = true;\n break;\n }\n }\n\n }\n return changed;\n }\n\n /**\n * Returns true if the given mutation is not from a from the plugin generated element. If the target element is a textarea the mutation is always unknown.\n * @param mutation The mutation which shall be checked.\n * @returns {boolean} True if the mutation is from a unknown element, false otherwise.\n */\n function isUnknownMutation(mutation) {\n var attributeName = mutation.attributeName;\n var mutationTarget = mutation.target;\n var mutationType = mutation.type;\n var strClosest = 'closest';\n\n if (mutationTarget === _contentElementNative)\n return attributeName === null;\n if (mutationType === 'attributes' && (attributeName === LEXICON.c || attributeName === LEXICON.s) && !_isTextarea) {\n //ignore className changes by the plugin\n if (attributeName === LEXICON.c && FRAMEWORK(mutationTarget).hasClass(_classNameHostElement))\n return hostClassNamesChanged(mutation.oldValue, mutationTarget.getAttribute(LEXICON.c));\n\n //only do it of browser support it natively\n if (typeof mutationTarget[strClosest] != TYPES.f)\n return true;\n if (mutationTarget[strClosest](_strDot + _classNameResizeObserverElement) !== null ||\n mutationTarget[strClosest](_strDot + _classNameScrollbar) !== null ||\n mutationTarget[strClosest](_strDot + _classNameScrollbarCorner) !== null)\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the content size was changed since the last time this method was called.\n * @returns {boolean} True if the content size was changed, false otherwise.\n */\n function updateAutoContentSizeChanged() {\n if (_sleeping)\n return false;\n \n var contentMeasureElement = getContentMeasureElement();\n var textareaValueLength = _isTextarea && _widthAutoCache && !_textareaAutoWrappingCache ? _targetElement.val().length : 0;\n var setCSS = !_mutationObserversConnected && _widthAutoCache && !_isTextarea;\n var viewportScrollSize = { };\n var css = { };\n var float;\n var bodyMinSizeC;\n var changed;\n var viewportScrollSizeChanged;\n var contentElementScrollSize;\n\n //fix for https://bugzilla.mozilla.org/show_bug.cgi?id=1439305, it only works with \"clipAlways : true\"\n //it can work with \"clipAlways : false\" too, but I had to set the overflow of the viewportElement to hidden every time before measuring\n if(_restrictedMeasuring) {\n viewportScrollSize = {\n x : _viewportElementNative[LEXICON.sW],\n y : _viewportElementNative[LEXICON.sH]\n }\n }\n if (setCSS) {\n float = _contentElement.css(_strFloat);\n css[_strFloat] = _isRTL ? _strRight : _strLeft;\n css[_strWidth] = _strAuto;\n _contentElement.css(css);\n }\n contentElementScrollSize = {\n w: contentMeasureElement[LEXICON.sW] + textareaValueLength,\n h: contentMeasureElement[LEXICON.sH] + textareaValueLength\n };\n if (setCSS) {\n css[_strFloat] = float;\n css[_strWidth] = _strHundredPercent;\n _contentElement.css(css);\n }\n\n bodyMinSizeC = bodyMinSizeChanged();\n changed = checkCache(contentElementScrollSize, _contentElementScrollSizeChangeDetectedCache);\n viewportScrollSizeChanged = checkCache(viewportScrollSize, _viewportScrollSizeCache);\n\n _contentElementScrollSizeChangeDetectedCache = contentElementScrollSize;\n _viewportScrollSizeCache = viewportScrollSize;\n\n return changed || bodyMinSizeC || viewportScrollSizeChanged;\n }\n\n /**\n * Returns true when a attribute which the MutationObserver would observe has changed. \n * @returns {boolean} True if one of the attributes which a MutationObserver would observe has changed, false or undefined otherwise.\n */\n function meaningfulAttrsChanged() {\n if (_sleeping || _mutationObserversConnected)\n return;\n \n var changed;\n var elem;\n var curr;\n var cache;\n var checks = [\n {\n _elem: _hostElement, \n _props : _mutationObserverAttrsHost.concat(':visible')\n },\n {\n _elem: _isTextarea ? _targetElement : undefined, \n _props : _mutationObserverAttrsTextarea\n }\n ];\n \n each(checks, function(index, check) { \n elem = check._elem;\n if(elem) {\n each(check._props, function(index, prop) { \n curr = prop.charAt(0) === ':' ? elem.is(prop) : elem.attr(prop);\n cache = _updateAutoCache[prop];\n \n changed = changed || checkCache(curr, cache);\n \n _updateAutoCache[prop] = curr;\n });\n }\n });\n \n return changed;\n }\n\n /**\n * Checks is a CSS Property of a child element is affecting the scroll size of the content.\n * @param propertyName The CSS property name.\n * @returns {boolean} True if the property is affecting the content scroll size, false otherwise.\n */\n function isSizeAffectingCSSProperty(propertyName) {\n if (!_initialized)\n return true;\n var flexGrow = 'flex-grow';\n var flexShrink = 'flex-shrink';\n var flexBasis = 'flex-basis';\n var affectingPropsX = [\n _strWidth,\n _strMinMinus + _strWidth,\n _strMaxMinus + _strWidth,\n _strMarginMinus + _strLeft,\n _strMarginMinus + _strRight,\n _strLeft,\n _strRight,\n 'font-weight',\n 'word-spacing',\n flexGrow,\n flexShrink,\n flexBasis\n ];\n var affectingPropsXContentBox = [\n _strPaddingMinus + _strLeft,\n _strPaddingMinus + _strRight,\n _strBorderMinus + _strLeft + _strWidth,\n _strBorderMinus + _strRight + _strWidth\n ];\n var affectingPropsY = [\n _strHeight,\n _strMinMinus + _strHeight,\n _strMaxMinus + _strHeight,\n _strMarginMinus + _strTop,\n _strMarginMinus + _strBottom,\n _strTop,\n _strBottom,\n 'line-height',\n flexGrow,\n flexShrink,\n flexBasis\n ];\n var affectingPropsYContentBox = [\n _strPaddingMinus + _strTop,\n _strPaddingMinus + _strBottom,\n _strBorderMinus + _strTop + _strWidth,\n _strBorderMinus + _strBottom + _strWidth\n ];\n var _strS = 's';\n var _strVS = 'v-s';\n var checkX = _overflowBehaviorCache.x === _strS || _overflowBehaviorCache.x === _strVS;\n var checkY = _overflowBehaviorCache.y === _strS || _overflowBehaviorCache.y === _strVS;\n var sizeIsAffected = false;\n var checkPropertyName = function (arr, name) {\n for (var i = 0; i < arr[LEXICON.l]; i++) {\n if (arr[i] === name)\n return true;\n }\n return false;\n };\n\n if (checkY) {\n sizeIsAffected = checkPropertyName(affectingPropsY, propertyName);\n if (!sizeIsAffected && !_isBorderBox)\n sizeIsAffected = checkPropertyName(affectingPropsYContentBox, propertyName);\n }\n if (checkX && !sizeIsAffected) {\n sizeIsAffected = checkPropertyName(affectingPropsX, propertyName);\n if (!sizeIsAffected && !_isBorderBox)\n sizeIsAffected = checkPropertyName(affectingPropsXContentBox, propertyName);\n }\n return sizeIsAffected;\n }\n\n \n //==== Update ====//\n\n /**\n * Updates the variables and size of the textarea element, and manages the scroll on new line or new character.\n */\n function textareaUpdate() {\n if (!_sleeping) {\n var wrapAttrOff = !_textareaAutoWrappingCache;\n var minWidth = _viewportSize.w;\n var minHeight = _viewportSize.h;\n var css = { };\n var doMeasure = _widthAutoCache || wrapAttrOff;\n var origWidth;\n var width;\n var origHeight;\n var height;\n\n //reset min size\n css[_strMinMinus + _strWidth] = _strEmpty;\n css[_strMinMinus + _strHeight] = _strEmpty;\n\n //set width auto\n css[_strWidth] = _strAuto;\n _targetElement.css(css);\n\n //measure width\n origWidth = _targetElementNative[LEXICON.oW];\n width = doMeasure ? MATH.max(origWidth, _targetElementNative[LEXICON.sW] - 1) : 1;\n /*width += (_widthAutoCache ? _marginX + (!_isBorderBox ? wrapAttrOff ? 0 : _paddingX + _borderX : 0) : 0);*/\n\n //set measured width\n css[_strWidth] = _widthAutoCache ? _strAuto /*width*/ : _strHundredPercent;\n css[_strMinMinus + _strWidth] = _strHundredPercent;\n\n //set height auto\n css[_strHeight] = _strAuto;\n _targetElement.css(css);\n\n //measure height\n origHeight = _targetElementNative[LEXICON.oH];\n height = MATH.max(origHeight, _targetElementNative[LEXICON.sH] - 1);\n\n //append correct size values\n css[_strWidth] = width;\n css[_strHeight] = height;\n _textareaCoverElement.css(css);\n\n //apply min width / min height to prevent textarea collapsing\n css[_strMinMinus + _strWidth] = minWidth /*+ (!_isBorderBox && _widthAutoCache ? _paddingX + _borderX : 0)*/;\n css[_strMinMinus + _strHeight] = minHeight /*+ (!_isBorderBox && _heightAutoCache ? _paddingY + _borderY : 0)*/;\n _targetElement.css(css);\n\n return {\n _originalWidth: origWidth,\n _originalHeight: origHeight,\n _dynamicWidth: width,\n _dynamicHeight: height\n };\n }\n }\n\n /**\n * Updates the plugin and DOM to the current options.\n * This method should only be called if a update is 100% required.\n * @param updateHints A objects which contains hints for this update:\n * {\n * _hostSizeChanged : boolean,\n * _contentSizeChanged : boolean,\n * _force : boolean, == preventSwallowing\n * _changedOptions : { }, == preventSwallowing && preventSleep\n * }\n */\n function update(updateHints) {\n clearTimeout(_swallowedUpdateTimeout);\n updateHints = updateHints || { };\n _swallowedUpdateHints._hostSizeChanged |= updateHints._hostSizeChanged;\n _swallowedUpdateHints._contentSizeChanged |= updateHints._contentSizeChanged;\n _swallowedUpdateHints._force |= updateHints._force;\n \n var now = COMPATIBILITY.now();\n var hostSizeChanged = !!_swallowedUpdateHints._hostSizeChanged;\n var contentSizeChanged = !!_swallowedUpdateHints._contentSizeChanged;\n var force = !!_swallowedUpdateHints._force;\n var changedOptions = updateHints._changedOptions; \n var swallow = _swallowUpdateLag > 0 && _initialized && !_destroyed && !force && !changedOptions && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache); \n var displayIsHidden;\n\n if(swallow)\n _swallowedUpdateTimeout = setTimeout(update, _swallowUpdateLag);\n\n //abort update due to:\n //destroyed\n //swallowing\n //sleeping\n //host is hidden or has false display\n if (_destroyed || swallow || (_sleeping && !changedOptions) || (_initialized && !force && (displayIsHidden = _hostElement.is(':hidden'))) || _hostElement.css('display') === 'inline')\n return;\n\n _lastUpdateTime = now;\n _swallowedUpdateHints = { };\n \n //if scrollbar styling is possible and native scrollbars aren't overlaid the scrollbar styling will be applied which hides the native scrollbars completely.\n if (_nativeScrollbarStyling && !(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)) {\n //native scrollbars are hidden, so change the values to zero\n _nativeScrollbarSize.x = 0;\n _nativeScrollbarSize.y = 0;\n }\n else {\n //refresh native scrollbar size (in case of zoom)\n _nativeScrollbarSize = extendDeep({}, globals.nativeScrollbarSize);\n }\n\n // Scrollbar padding is needed for firefox, because firefox hides scrollbar automatically if the size of the div is too small.\n // The calculation: [scrollbar size +3 *3]\n // (+3 because of possible decoration e.g. borders, margins etc., but only if native scrollbar is NOT a overlaid scrollbar)\n // (*3 because (1)increase / (2)decrease -button and (3)resize handle)\n _nativeScrollbarMinSize = {\n x: (_nativeScrollbarSize.x + (_nativeScrollbarIsOverlaid.x ? 0 : 3)) * 3,\n y: (_nativeScrollbarSize.y + (_nativeScrollbarIsOverlaid.y ? 0 : 3)) * 3\n };\n \n //changedOptions = changedOptions || { };\n //freezeResizeObserver(_sizeObserverElement, true);\n //freezeResizeObserver(_sizeAutoObserverElement, true);\n \n var checkCacheAutoForce = function () {\n return checkCache.apply(this, [].slice.call(arguments).concat([ force ]));\n };\n \n //save current scroll offset\n var currScroll = {\n x: _viewportElement[_strScrollLeft](),\n y: _viewportElement[_strScrollTop]()\n };\n\n var currentPreparedOptionsScrollbars = _currentPreparedOptions.scrollbars;\n var currentPreparedOptionsTextarea = _currentPreparedOptions.textarea;\n\n //scrollbars visibility:\n var scrollbarsVisibility = currentPreparedOptionsScrollbars.visibility;\n var scrollbarsVisibilityChanged = checkCacheAutoForce(scrollbarsVisibility, _scrollbarsVisibilityCache);\n\n //scrollbars autoHide:\n var scrollbarsAutoHide = currentPreparedOptionsScrollbars.autoHide;\n var scrollbarsAutoHideChanged = checkCacheAutoForce(scrollbarsAutoHide, _scrollbarsAutoHideCache);\n\n //scrollbars click scrolling\n var scrollbarsClickScrolling = currentPreparedOptionsScrollbars.clickScrolling;\n var scrollbarsClickScrollingChanged = checkCacheAutoForce(scrollbarsClickScrolling, _scrollbarsClickScrollingCache);\n\n //scrollbars drag scrolling\n var scrollbarsDragScrolling = currentPreparedOptionsScrollbars.dragScrolling;\n var scrollbarsDragScrollingChanged = checkCacheAutoForce(scrollbarsDragScrolling, _scrollbarsDragScrollingCache);\n\n //className\n var className = _currentPreparedOptions.className;\n var classNameChanged = checkCacheAutoForce(className, _classNameCache);\n\n //resize\n var resize = _currentPreparedOptions.resize;\n var resizeChanged = checkCacheAutoForce(resize, _resizeCache) && !_isBody; //body can't be resized since the window itself acts as resize possibility.\n\n //paddingAbsolute\n var paddingAbsolute = _currentPreparedOptions.paddingAbsolute;\n var paddingAbsoluteChanged = checkCacheAutoForce(paddingAbsolute, _paddingAbsoluteCache);\n\n //clipAlways\n var clipAlways = _currentPreparedOptions.clipAlways;\n var clipAlwaysChanged = checkCacheAutoForce(clipAlways, _clipAlwaysCache);\n\n //sizeAutoCapable\n var sizeAutoCapable = _currentPreparedOptions.sizeAutoCapable && !_isBody; //body can never be size auto, because it shall be always as big as the viewport.\n var sizeAutoCapableChanged = checkCacheAutoForce(sizeAutoCapable, _sizeAutoCapableCache);\n\n //showNativeScrollbars\n var ignoreOverlayScrollbarHiding = _currentPreparedOptions.nativeScrollbarsOverlaid.showNativeScrollbars;\n var ignoreOverlayScrollbarHidingChanged = checkCacheAutoForce(ignoreOverlayScrollbarHiding, _ignoreOverlayScrollbarHidingCache);\n\n //autoUpdate\n var autoUpdate = _currentPreparedOptions.autoUpdate;\n var autoUpdateChanged = checkCacheAutoForce(autoUpdate, _autoUpdateCache);\n\n //overflowBehavior\n var overflowBehavior = _currentPreparedOptions.overflowBehavior;\n var overflowBehaviorChanged = checkCacheAutoForce(overflowBehavior, _overflowBehaviorCache, force);\n\n //dynWidth:\n var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;\n var textareaDynWidthChanged = checkCacheAutoForce(_textareaDynWidthCache, textareaDynWidth);\n\n //dynHeight:\n var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;\n var textareaDynHeightChanged = checkCacheAutoForce(_textareaDynHeightCache, textareaDynHeight);\n\n //scrollbars visibility\n _scrollbarsAutoHideNever = scrollbarsAutoHide === 'n';\n _scrollbarsAutoHideScroll = scrollbarsAutoHide === 's';\n _scrollbarsAutoHideMove = scrollbarsAutoHide === 'm';\n _scrollbarsAutoHideLeave = scrollbarsAutoHide === 'l';\n\n //scrollbars autoHideDelay\n _scrollbarsAutoHideDelay = currentPreparedOptionsScrollbars.autoHideDelay;\n\n //old className\n _oldClassName = _classNameCache;\n\n //resize\n _resizeNone = resize === 'n';\n _resizeBoth = resize === 'b';\n _resizeHorizontal = resize === 'h';\n _resizeVertical = resize === 'v';\n\n //normalizeRTL\n _normalizeRTLCache = _currentPreparedOptions.normalizeRTL;\n\n //ignore overlay scrollbar hiding\n ignoreOverlayScrollbarHiding = ignoreOverlayScrollbarHiding && (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y);\n\n //refresh options cache\n _scrollbarsVisibilityCache = scrollbarsVisibility;\n _scrollbarsAutoHideCache = scrollbarsAutoHide;\n _scrollbarsClickScrollingCache = scrollbarsClickScrolling;\n _scrollbarsDragScrollingCache = scrollbarsDragScrolling;\n _classNameCache = className;\n _resizeCache = resize;\n _paddingAbsoluteCache = paddingAbsolute;\n _clipAlwaysCache = clipAlways;\n _sizeAutoCapableCache = sizeAutoCapable;\n _ignoreOverlayScrollbarHidingCache = ignoreOverlayScrollbarHiding;\n _autoUpdateCache = autoUpdate;\n _overflowBehaviorCache = extendDeep({}, overflowBehavior);\n _textareaDynWidthCache = textareaDynWidth;\n _textareaDynHeightCache = textareaDynHeight;\n _hasOverflowCache = _hasOverflowCache || { x: false, y: false };\n\n //set correct class name to the host element\n if (classNameChanged) {\n removeClass(_hostElement, _oldClassName + _strSpace + _classNameThemeNone);\n addClass(_hostElement, className !== undefined && className !== null && className.length > 0 ? className : _classNameThemeNone);\n }\n\n //set correct auto Update\n if (autoUpdateChanged) {\n if (autoUpdate === true) {\n disconnectMutationObservers();\n autoUpdateLoop.add(_base);\n }\n else if (autoUpdate === null) {\n if (_autoUpdateRecommended) {\n disconnectMutationObservers();\n autoUpdateLoop.add(_base);\n }\n else {\n autoUpdateLoop.remove(_base);\n connectMutationObservers();\n }\n }\n else {\n autoUpdateLoop.remove(_base);\n connectMutationObservers();\n }\n }\n\n //activate or deactivate size auto capability\n if (sizeAutoCapableChanged) {\n if (sizeAutoCapable) {\n if (!_contentGlueElement) {\n _contentGlueElement = FRAMEWORK(generateDiv(_classNameContentGlueElement));\n _paddingElement.before(_contentGlueElement);\n }\n else {\n _contentGlueElement.show();\n }\n if (_sizeAutoObserverAdded) {\n _sizeAutoObserverElement.show();\n }\n else {\n _sizeAutoObserverElement = FRAMEWORK(generateDiv(_classNameSizeAutoObserverElement));\n _sizeAutoObserverElementNative = _sizeAutoObserverElement[0];\n\n _contentGlueElement.before(_sizeAutoObserverElement);\n var oldSize = {w: -1, h: -1};\n setupResizeObserver(_sizeAutoObserverElement, function () {\n var newSize = {\n w: _sizeAutoObserverElementNative[LEXICON.oW],\n h: _sizeAutoObserverElementNative[LEXICON.oH]\n };\n if (checkCache(newSize, oldSize)) {\n if (_initialized && (_heightAutoCache && newSize.h > 0) || (_widthAutoCache && newSize.w > 0)) {\n update();\n }\n else if (_initialized && (!_heightAutoCache && newSize.h === 0) || (!_widthAutoCache && newSize.w === 0)) {\n update();\n }\n }\n oldSize = newSize;\n });\n _sizeAutoObserverAdded = true;\n //fix heightAuto detector bug if height is fixed but contentHeight is 0.\n //the probability this bug will ever happen is very very low, thats why its ok if we use calc which isn't supported in IE8.\n if (_cssCalc !== null)\n _sizeAutoObserverElement.css(_strHeight, _cssCalc + '(100% + 1px)');\n }\n }\n else {\n if (_sizeAutoObserverAdded)\n _sizeAutoObserverElement.hide();\n if (_contentGlueElement)\n _contentGlueElement.hide();\n }\n }\n\n //if force, update all resizeObservers too\n if (force) {\n _sizeObserverElement.find('*').trigger(_strScroll);\n if (_sizeAutoObserverAdded)\n _sizeAutoObserverElement.find('*').trigger(_strScroll);\n }\n\n //display hidden:\n displayIsHidden = displayIsHidden === undefined ? _hostElement.is(':hidden') : displayIsHidden;\n var displayIsHiddenChanged = checkCacheAutoForce(displayIsHidden, _displayIsHiddenCache);\n\n //textarea AutoWrapping:\n var textareaAutoWrapping = _isTextarea ? _targetElement.attr('wrap') !== 'off' : false;\n var textareaAutoWrappingChanged = checkCacheAutoForce(textareaAutoWrapping, _textareaAutoWrappingCache);\n\n //detect direction:\n var cssDirection = _hostElement.css('direction');\n var cssDirectionChanged = checkCacheAutoForce(cssDirection, _cssDirectionCache);\n\n //detect box-sizing:\n var boxSizing = _hostElement.css('box-sizing');\n var boxSizingChanged = checkCacheAutoForce(boxSizing, _cssBoxSizingCache);\n\n //detect padding:\n var padding = {\n c: force,\n t: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strTop)),\n r: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strRight)),\n b: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strBottom)),\n l: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strLeft))\n };\n \n //width + height auto detecting var:\n var sizeAutoObserverElementBCRect;\n //exception occurs in IE8 sometimes (unknown exception)\n try {\n sizeAutoObserverElementBCRect = _sizeAutoObserverAdded ? _sizeAutoObserverElementNative[LEXICON.bCR]() : null;\n } catch (ex) {\n return;\n }\n\n _isRTL = cssDirection === 'rtl';\n _isBorderBox = (boxSizing === 'border-box');\n var isRTLLeft = _isRTL ? _strLeft : _strRight;\n var isRTLRight = _isRTL ? _strRight : _strLeft;\n\n //detect width auto:\n var widthAutoResizeDetection = false;\n var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (MATH.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (_hostElementNative[LEXICON.cW] - _paddingX) > 0 : true) : false;\n if (sizeAutoCapable && !widthAutoObserverDetection) {\n var tmpCurrHostWidth = _hostElementNative[LEXICON.oW];\n var tmpCurrContentGlueWidth = _contentGlueElement.css(_strWidth);\n _contentGlueElement.css(_strWidth, _strAuto);\n\n var tmpNewHostWidth = _hostElementNative[LEXICON.oW];\n _contentGlueElement.css(_strWidth, tmpCurrContentGlueWidth);\n widthAutoResizeDetection = tmpCurrHostWidth !== tmpNewHostWidth;\n if (!widthAutoResizeDetection) {\n _contentGlueElement.css(_strWidth, tmpCurrHostWidth + 1);\n tmpNewHostWidth = _hostElementNative[LEXICON.oW];\n _contentGlueElement.css(_strWidth, tmpCurrContentGlueWidth);\n widthAutoResizeDetection = tmpCurrHostWidth !== tmpNewHostWidth;\n }\n }\n var widthAuto = (widthAutoObserverDetection || widthAutoResizeDetection) && sizeAutoCapable && !displayIsHidden;\n var widthAutoChanged = checkCacheAutoForce(widthAuto, _widthAutoCache);\n var wasWidthAuto = !widthAuto && _widthAutoCache;\n\n //detect height auto:\n var heightAuto = _sizeAutoObserverAdded && sizeAutoCapable && !displayIsHidden ? (MATH.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false;\n var heightAutoChanged = checkCacheAutoForce(heightAuto, _heightAutoCache);\n var wasHeightAuto = !heightAuto && _heightAutoCache;\n\n //detect border:\n //we need the border only if border box and auto size\n var strMinusWidth = '-' + _strWidth;\n var updateBorderX = (widthAuto && _isBorderBox) || !_isBorderBox;\n var updateBorderY = (heightAuto && _isBorderBox) || !_isBorderBox;\n var border = {\n c: force,\n t: updateBorderY ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strTop + strMinusWidth), true) : 0,\n r: updateBorderX ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strRight + strMinusWidth), true) : 0,\n b: updateBorderY ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strBottom + strMinusWidth), true) : 0,\n l: updateBorderX ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strLeft + strMinusWidth), true) : 0\n };\n\n //detect margin:\n var margin = {\n c: force,\n t: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strTop)),\n r: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strRight)),\n b: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strBottom)),\n l: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strLeft))\n };\n\n //detect css max width & height:\n var cssMaxValue = {\n h: String(_hostElement.css(_strMaxMinus + _strHeight)),\n w: String(_hostElement.css(_strMaxMinus + _strWidth))\n };\n\n //vars to apply correct css\n var contentElementCSS = { };\n var contentGlueElementCSS = { };\n\n //funcs\n var getHostSize = function() {\n //has to be clientSize because offsetSize respect borders\n return {\n w: _hostElementNative[LEXICON.cW],\n h: _hostElementNative[LEXICON.cH]\n };\n };\n var getViewportSize = function() {\n //viewport size is padding container because it never has padding, margin and a border\n //determine zoom rounding error -> sometimes scrollWidth/Height is smaller than clientWidth/Height\n //if this happens add the difference to the viewportSize to compensate the rounding error\n return {\n w: _paddingElementNative[LEXICON.oW] + MATH.max(0, _contentElementNative[LEXICON.cW] - _contentElementNative[LEXICON.sW]),\n h: _paddingElementNative[LEXICON.oH] + MATH.max(0, _contentElementNative[LEXICON.cH] - _contentElementNative[LEXICON.sH])\n };\n };\n\n //set info for padding\n var paddingAbsoluteX = _paddingX = padding.l + padding.r;\n var paddingAbsoluteY = _paddingY = padding.t + padding.b;\n paddingAbsoluteX *= paddingAbsolute ? 1 : 0;\n paddingAbsoluteY *= paddingAbsolute ? 1 : 0;\n padding.c = checkCacheAutoForce(padding, _cssPaddingCache);\n\n //set info for border\n _borderX = border.l + border.r;\n _borderY = border.t + border.b;\n border.c = checkCacheAutoForce(border, _cssBorderCache);\n\n //set info for margin\n _marginX = margin.l + margin.r;\n _marginY = margin.t + margin.b;\n margin.c = checkCacheAutoForce(margin, _cssMarginCache);\n\n //set info for css max value\n cssMaxValue.ih = parseToZeroOrNumber(cssMaxValue.h); //ih = integer height\n cssMaxValue.iw = parseToZeroOrNumber(cssMaxValue.w); //iw = integer width\n cssMaxValue.ch = cssMaxValue.h.indexOf('px') > -1; //ch = correct height\n cssMaxValue.cw = cssMaxValue.w.indexOf('px') > -1; //cw = correct width\n cssMaxValue.c = checkCacheAutoForce(cssMaxValue, _cssMaxValueCache);\n\n //refresh cache\n _displayIsHiddenCache = displayIsHidden;\n _textareaAutoWrappingCache = textareaAutoWrapping;\n _cssDirectionCache = cssDirection;\n _cssBoxSizingCache = boxSizing;\n _widthAutoCache = widthAuto;\n _heightAutoCache = heightAuto;\n _cssPaddingCache = padding;\n _cssBorderCache = border;\n _cssMarginCache = margin;\n _cssMaxValueCache = cssMaxValue;\n \n //IEFix direction changed\n if (cssDirectionChanged && _sizeAutoObserverAdded)\n _sizeAutoObserverElement.css(_strFloat, isRTLRight);\n\n //apply padding:\n if (padding.c || cssDirectionChanged || paddingAbsoluteChanged || widthAutoChanged || heightAutoChanged || boxSizingChanged || sizeAutoCapableChanged) {\n var paddingElementCSS = {};\n var textareaCSS = {};\n setTopRightBottomLeft(contentGlueElementCSS, _strMarginMinus, [-padding.t, -padding.r, -padding.b, -padding.l]);\n if (paddingAbsolute) {\n setTopRightBottomLeft(paddingElementCSS, _strEmpty, [padding.t, padding.r, padding.b, padding.l]);\n if (_isTextarea)\n setTopRightBottomLeft(textareaCSS, _strPaddingMinus);\n else\n setTopRightBottomLeft(contentElementCSS, _strPaddingMinus);\n }\n else {\n setTopRightBottomLeft(paddingElementCSS, _strEmpty);\n if (_isTextarea)\n setTopRightBottomLeft(textareaCSS, _strPaddingMinus, [padding.t, padding.r, padding.b, padding.l]);\n else\n setTopRightBottomLeft(contentElementCSS, _strPaddingMinus, [padding.t, padding.r, padding.b, padding.l]);\n }\n _paddingElement.css(paddingElementCSS);\n _targetElement.css(textareaCSS);\n }\n\n //viewport size is padding container because it never has padding, margin and a border.\n _viewportSize = getViewportSize();\n\n //update Textarea\n var textareaSize = _isTextarea ? textareaUpdate() : false;\n var textareaSizeChanged = _isTextarea && checkCacheAutoForce(textareaSize, _textareaSizeCache);\n var textareaDynOrigSize = _isTextarea && textareaSize ? {\n w : textareaDynWidth ? textareaSize._dynamicWidth : textareaSize._originalWidth,\n h : textareaDynHeight ? textareaSize._dynamicHeight : textareaSize._originalHeight\n } : { };\n _textareaSizeCache = textareaSize;\n\n //fix height auto / width auto in cooperation with current padding & boxSizing behavior:\n if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {\n /*\n if (cssMaxValue.ch)\n contentElementCSS[_strMaxMinus + _strHeight] =\n (cssMaxValue.ch ? (cssMaxValue.ih - paddingAbsoluteY + (_isBorderBox ? -_borderY : _paddingY))\n : _strEmpty);\n */\n contentElementCSS[_strHeight] = _strAuto;\n }\n else if (heightAutoChanged || paddingAbsoluteChanged) {\n contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;\n contentElementCSS[_strHeight] = _strHundredPercent;\n }\n if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {\n /*\n if (cssMaxValue.cw)\n contentElementCSS[_strMaxMinus + _strWidth] =\n (cssMaxValue.cw ? (cssMaxValue.iw - paddingAbsoluteX + (_isBorderBox ? -_borderX : _paddingX)) +\n (_nativeScrollbarIsOverlaid.y ? _overlayScrollbarDummySize.y : 0)\n : _strEmpty);\n */\n contentElementCSS[_strWidth] = _strAuto;\n contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix\n }\n else if (widthAutoChanged || paddingAbsoluteChanged) {\n contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;\n contentElementCSS[_strWidth] = _strHundredPercent;\n contentElementCSS[_strFloat] = _strEmpty;\n contentGlueElementCSS[_strMaxMinus + _strWidth] = _strEmpty; //IE Fix\n }\n if (widthAuto) {\n if (!cssMaxValue.cw)\n contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;\n //textareaDynOrigSize.w || _strAuto :: doesnt works because applied margin will shift width\n contentGlueElementCSS[_strWidth] = _strAuto;\n\n contentElementCSS[_strWidth] = _strAuto;\n contentElementCSS[_strFloat] = isRTLRight;\n }\n else {\n contentGlueElementCSS[_strWidth] = _strEmpty;\n }\n if (heightAuto) {\n if (!cssMaxValue.ch)\n contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;\n //textareaDynOrigSize.h || _contentElementNative[LEXICON.cH] :: use for anti scroll jumping\n contentGlueElementCSS[_strHeight] = textareaDynOrigSize.h || _contentElementNative[LEXICON.cH];\n }\n else {\n contentGlueElementCSS[_strHeight] = _strEmpty;\n }\n if (sizeAutoCapable)\n _contentGlueElement.css(contentGlueElementCSS);\n _contentElement.css(contentElementCSS);\n\n //CHECKPOINT HERE ~\n contentElementCSS = {};\n contentGlueElementCSS = {};\n\n //if [content(host) client / scroll size, or target element direction, or content(host) max-sizes] changed, or force is true\n if (hostSizeChanged || contentSizeChanged || textareaSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || scrollbarsAutoHideChanged || scrollbarsDragScrollingChanged || scrollbarsClickScrollingChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged) {\n var strOverflow = 'overflow';\n var strOverflowX = strOverflow + '-x';\n var strOverflowY = strOverflow + '-y';\n var strHidden = 'hidden';\n var strVisible = 'visible';\n //decide whether the content overflow must get hidden for correct overflow measuring, it !MUST! be always hidden if the height is auto\n var hideOverflow4CorrectMeasuring = _restrictedMeasuring ?\n (_nativeScrollbarIsOverlaid.x || _nativeScrollbarIsOverlaid.y) || //it must be hidden if native scrollbars are overlaid\n (_viewportSize.w < _nativeScrollbarMinSize.y || _viewportSize.h < _nativeScrollbarMinSize.x) || //it must be hidden if host-element is too small\n heightAuto || displayIsHiddenChanged //it must be hidden if height is auto or display was changed\n : heightAuto; //if there is not the restricted Measuring bug, it must be hidden if the height is auto\n\n //Reset the viewport (very important for natively overlaid scrollbars and zoom change\n //don't change the overflow prop as it is very expensive and affects performance !A LOT!\n var viewportElementResetCSS = { };\n var resetXTmp = _hasOverflowCache.y && _hideOverflowCache.ys && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.y ? _viewportElement.css(isRTLLeft) : -_nativeScrollbarSize.y) : 0;\n var resetBottomTmp = _hasOverflowCache.x && _hideOverflowCache.xs && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.x ? _viewportElement.css(_strBottom) : -_nativeScrollbarSize.x) : 0;\n setTopRightBottomLeft(viewportElementResetCSS, _strEmpty);\n _viewportElement.css(viewportElementResetCSS);\n if(hideOverflow4CorrectMeasuring)\n _contentElement.css(strOverflow, strHidden);\n\n //measure several sizes:\n var contentMeasureElement = getContentMeasureElement();\n //in Firefox content element has to have overflow hidden, else element margins aren't calculated properly, this element prevents this bug, but only if scrollbars aren't overlaid\n var contentMeasureElementGuaranty = _restrictedMeasuring && !hideOverflow4CorrectMeasuring ? _viewportElementNative : contentMeasureElement;\n var contentSize = {\n //use clientSize because natively overlaidScrollbars add borders\n w: textareaDynOrigSize.w || contentMeasureElement[LEXICON.cW],\n h: textareaDynOrigSize.h || contentMeasureElement[LEXICON.cH]\n };\n var scrollSize = {\n w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]),\n h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH])\n };\n\n //apply the correct viewport style and measure viewport size\n viewportElementResetCSS[_strBottom] = wasHeightAuto ? _strEmpty : resetBottomTmp;\n viewportElementResetCSS[isRTLLeft] = wasWidthAuto ? _strEmpty : resetXTmp;\n _viewportElement.css(viewportElementResetCSS);\n _viewportSize = getViewportSize();\n\n //measure and correct several sizes\n var hostSize = getHostSize();\n var contentGlueSize = {\n //client/scrollSize + AbsolutePadding -> because padding is only applied to the paddingElement if its absolute, so you have to add it manually\n //hostSize is clientSize -> so padding should be added manually, right? FALSE! Because content glue is inside hostElement, so we don't have to worry about padding\n w: MATH.max((widthAuto ? contentSize.w : scrollSize.w) + paddingAbsoluteX, hostSize.w),\n h: MATH.max((heightAuto ? contentSize.h : scrollSize.h) + paddingAbsoluteY, hostSize.h)\n };\n contentGlueSize.c = checkCacheAutoForce(contentGlueSize, _contentGlueSizeCache);\n _contentGlueSizeCache = contentGlueSize;\n\n //apply correct contentGlue size\n if (sizeAutoCapable) {\n //size contentGlue correctly to make sure the element has correct size if the sizing switches to auto\n if (contentGlueSize.c || (heightAuto || widthAuto)) {\n contentGlueElementCSS[_strWidth] = contentGlueSize.w;\n contentGlueElementCSS[_strHeight] = contentGlueSize.h;\n\n //textarea-sizes are already calculated correctly at this point\n if(!_isTextarea) {\n contentSize = {\n //use clientSize because natively overlaidScrollbars add borders\n w: contentMeasureElement[LEXICON.cW],\n h: contentMeasureElement[LEXICON.cH]\n };\n }\n }\n var textareaCoverCSS = {};\n var setContentGlueElementCSSfunction = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var wh = scrollbarVars._w_h;\n var strWH = scrollbarVars._width_height;\n var autoSize = horizontal ? widthAuto : heightAuto;\n var borderSize = horizontal ? _borderX : _borderY;\n var paddingSize = horizontal ? _paddingX : _paddingY;\n var marginSize = horizontal ? _marginX : _marginY;\n var maxSize = contentGlueElementCSS[strWH] + (_isBorderBox ? borderSize : -paddingSize);\n\n //make contentGlue size -1 if element is not auto sized, to make sure that a resize event happens when the element shrinks\n if (!autoSize || (!autoSize && border.c))\n contentGlueElementCSS[strWH] = hostSize[wh] - (_isBorderBox ? 0 : paddingSize + borderSize) - 1 - marginSize;\n\n //if size is auto and host is same size as max size, make content glue size +1 to make sure size changes will be detected\n if (autoSize && cssMaxValue['c' + wh] && cssMaxValue['i' + wh] === maxSize)\n contentGlueElementCSS[strWH] = maxSize + (_isBorderBox ? 0 : paddingSize) + 1;\n\n //if size is auto and host is smaller than size as min size, make content glue size -1 to make sure size changes will be detected (this is only needed if padding is 0)\n if (autoSize && (contentSize[wh] < _viewportSize[wh]) && (horizontal && _isTextarea ? !textareaAutoWrapping : true)) {\n if (_isTextarea)\n textareaCoverCSS[strWH] = parseToZeroOrNumber(_textareaCoverElement.css(strWH)) - 1;\n contentGlueElementCSS[strWH] -= 1;\n }\n\n //make sure content glue size is at least 1\n if (contentSize[wh] > 0)\n contentGlueElementCSS[strWH] = MATH.max(1, contentGlueElementCSS[strWH]);\n };\n setContentGlueElementCSSfunction(true);\n setContentGlueElementCSSfunction(false);\n\n if (_isTextarea)\n _textareaCoverElement.css(textareaCoverCSS);\n _contentGlueElement.css(contentGlueElementCSS);\n }\n if (widthAuto)\n contentElementCSS[_strWidth] = _strHundredPercent;\n if (widthAuto && !_isBorderBox && !_mutationObserversConnected)\n contentElementCSS[_strFloat] = 'none';\n\n //apply and reset content style\n _contentElement.css(contentElementCSS);\n contentElementCSS = {};\n\n //measure again, but this time all correct sizes:\n var contentScrollSize = {\n w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]),\n h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH])\n };\n contentScrollSize.c = contentSizeChanged = checkCacheAutoForce(contentScrollSize, _contentScrollSizeCache);\n _contentScrollSizeCache = contentScrollSize;\n\n //remove overflow hidden to restore overflow\n if(hideOverflow4CorrectMeasuring)\n _contentElement.css(strOverflow, _strEmpty);\n \n //refresh viewport size after correct measuring\n _viewportSize = getViewportSize();\n\n hostSize = getHostSize();\n hostSizeChanged = checkCacheAutoForce(hostSize, _hostSizeCache);\n _hostSizeCache = hostSize;\n\n var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);\n var previousOverflow = _overflowAmountCache;\n var overflowBehaviorIsVS = { };\n var overflowBehaviorIsVH = { };\n var overflowBehaviorIsS = { };\n var overflowAmount = { };\n var hasOverflow = { };\n var hideOverflow = { };\n var canScroll = { };\n var viewportRect = _paddingElementNative[LEXICON.bCR]();\n var setOverflowVariables = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xyI = scrollbarVarsInverted._x_y;\n var xy = scrollbarVars._x_y;\n var wh = scrollbarVars._w_h;\n var widthHeight = scrollbarVars._width_height;\n var scrollMax = _strScroll + scrollbarVars._Left_Top + 'Max';\n var fractionalOverflowAmount = viewportRect[widthHeight] ? MATH.abs(viewportRect[widthHeight] - _viewportSize[wh]) : 0;\n overflowBehaviorIsVS[xy] = overflowBehavior[xy] === 'v-s';\n overflowBehaviorIsVH[xy] = overflowBehavior[xy] === 'v-h';\n overflowBehaviorIsS[xy] = overflowBehavior[xy] === 's';\n overflowAmount[xy] = MATH.max(0, MATH.round((contentScrollSize[wh] - _viewportSize[wh]) * 100) / 100);\n overflowAmount[xy] *= (hideOverflowForceTextarea || (_viewportElementNative[scrollMax] === 0 && fractionalOverflowAmount > 0 && fractionalOverflowAmount < 1)) ? 0 : 1;\n hasOverflow[xy] = overflowAmount[xy] > 0;\n\n //hideOverflow:\n //x || y : true === overflow is hidden by \"overflow: scroll\" OR \"overflow: hidden\"\n //xs || ys : true === overflow is hidden by \"overflow: scroll\"\n hideOverflow[xy] = overflowBehaviorIsVS[xy] || overflowBehaviorIsVH[xy] ? (hasOverflow[xyI] && !overflowBehaviorIsVS[xyI] && !overflowBehaviorIsVH[xyI]) : hasOverflow[xy];\n hideOverflow[xy + 's'] = hideOverflow[xy] ? (overflowBehaviorIsS[xy] || overflowBehaviorIsVS[xy]) : false;\n\n canScroll[xy] = hasOverflow[xy] && hideOverflow[xy + 's'];\n };\n setOverflowVariables(true);\n setOverflowVariables(false);\n\n overflowAmount.c = checkCacheAutoForce(overflowAmount, _overflowAmountCache);\n _overflowAmountCache = overflowAmount;\n hasOverflow.c = checkCacheAutoForce(hasOverflow, _hasOverflowCache);\n _hasOverflowCache = hasOverflow;\n hideOverflow.c = checkCacheAutoForce(hideOverflow, _hideOverflowCache);\n _hideOverflowCache = hideOverflow;\n\n //if native scrollbar is overlay at x OR y axis, prepare DOM\n if (_nativeScrollbarIsOverlaid.x || _nativeScrollbarIsOverlaid.y) {\n var borderDesign = 'px solid transparent';\n var contentArrangeElementCSS = { };\n var arrangeContent = { };\n var arrangeChanged = force;\n var setContentElementCSS;\n\n if (hasOverflow.x || hasOverflow.y) {\n arrangeContent.w = _nativeScrollbarIsOverlaid.y && hasOverflow.y ? contentScrollSize.w + _overlayScrollbarDummySize.y : _strEmpty;\n arrangeContent.h = _nativeScrollbarIsOverlaid.x && hasOverflow.x ? contentScrollSize.h + _overlayScrollbarDummySize.x : _strEmpty;\n arrangeChanged = checkCacheAutoForce(arrangeContent, _arrangeContentSizeCache);\n _arrangeContentSizeCache = arrangeContent;\n }\n\n if (hasOverflow.c || hideOverflow.c || contentScrollSize.c || cssDirectionChanged || widthAutoChanged || heightAutoChanged || widthAuto || heightAuto || ignoreOverlayScrollbarHidingChanged) {\n contentElementCSS[_strMarginMinus + isRTLRight] = contentElementCSS[_strBorderMinus + isRTLRight] = _strEmpty;\n setContentElementCSS = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xy = scrollbarVars._x_y;\n var strDirection = horizontal ? _strBottom : isRTLLeft;\n var invertedAutoSize = horizontal ? heightAuto : widthAuto;\n\n if (_nativeScrollbarIsOverlaid[xy] && hasOverflow[xy] && hideOverflow[xy + 's']) {\n contentElementCSS[_strMarginMinus + strDirection] = invertedAutoSize ? (ignoreOverlayScrollbarHiding ? _strEmpty : _overlayScrollbarDummySize[xy]) : _strEmpty;\n contentElementCSS[_strBorderMinus + strDirection] = ((horizontal ? !invertedAutoSize : true) && !ignoreOverlayScrollbarHiding) ? (_overlayScrollbarDummySize[xy] + borderDesign) : _strEmpty;\n }\n else {\n arrangeContent[scrollbarVarsInverted._w_h] =\n contentElementCSS[_strMarginMinus + strDirection] =\n contentElementCSS[_strBorderMinus + strDirection] = _strEmpty;\n arrangeChanged = true;\n }\n };\n\n if (_nativeScrollbarStyling) {\n if (ignoreOverlayScrollbarHiding) \n removeClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n else\n addClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n }\n else {\n setContentElementCSS(true);\n setContentElementCSS(false);\n }\n }\n if (ignoreOverlayScrollbarHiding) {\n arrangeContent.w = arrangeContent.h = _strEmpty;\n arrangeChanged = true;\n }\n if (arrangeChanged && !_nativeScrollbarStyling) {\n contentArrangeElementCSS[_strWidth] = hideOverflow.y ? arrangeContent.w : _strEmpty;\n contentArrangeElementCSS[_strHeight] = hideOverflow.x ? arrangeContent.h : _strEmpty;\n\n if (!_contentArrangeElement) {\n _contentArrangeElement = FRAMEWORK(generateDiv(_classNameContentArrangeElement));\n _viewportElement.prepend(_contentArrangeElement);\n }\n _contentArrangeElement.css(contentArrangeElementCSS);\n }\n _contentElement.css(contentElementCSS);\n }\n\n var viewportElementCSS = {};\n var paddingElementCSS = {};\n var setViewportCSS;\n if (hostSizeChanged || hasOverflow.c || hideOverflow.c || contentScrollSize.c || overflowBehaviorChanged || boxSizingChanged || ignoreOverlayScrollbarHidingChanged || cssDirectionChanged || clipAlwaysChanged || heightAutoChanged) {\n viewportElementCSS[isRTLRight] = _strEmpty;\n setViewportCSS = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xy = scrollbarVars._x_y;\n var XY = scrollbarVars._X_Y;\n var strDirection = horizontal ? _strBottom : isRTLLeft;\n\n var reset = function () {\n viewportElementCSS[strDirection] = _strEmpty;\n _contentBorderSize[scrollbarVarsInverted._w_h] = 0;\n };\n if (hasOverflow[xy] && hideOverflow[xy + 's']) {\n viewportElementCSS[strOverflow + XY] = _strScroll;\n if (ignoreOverlayScrollbarHiding || _nativeScrollbarStyling) {\n reset();\n }\n else {\n viewportElementCSS[strDirection] = -(_nativeScrollbarIsOverlaid[xy] ? _overlayScrollbarDummySize[xy] : _nativeScrollbarSize[xy]);\n _contentBorderSize[scrollbarVarsInverted._w_h] = _nativeScrollbarIsOverlaid[xy] ? _overlayScrollbarDummySize[scrollbarVarsInverted._x_y] : 0;\n }\n } else {\n viewportElementCSS[strOverflow + XY] = _strEmpty;\n reset();\n }\n };\n setViewportCSS(true);\n setViewportCSS(false);\n \n // if the scroll container is too small and if there is any overflow with no overlay scrollbar (and scrollbar styling isn't possible), \n // make viewport element greater in size (Firefox hide Scrollbars fix)\n // because firefox starts hiding scrollbars on too small elements\n // with this behavior the overflow calculation may be incorrect or the scrollbars would appear suddenly\n // https://bugzilla.mozilla.org/show_bug.cgi?id=292284\n if (!_nativeScrollbarStyling \n && (_viewportSize.h < _nativeScrollbarMinSize.x || _viewportSize.w < _nativeScrollbarMinSize.y)\n && ((hasOverflow.x && hideOverflow.x && !_nativeScrollbarIsOverlaid.x) || (hasOverflow.y && hideOverflow.y && !_nativeScrollbarIsOverlaid.y))) {\n viewportElementCSS[_strPaddingMinus + _strTop] = _nativeScrollbarMinSize.x;\n viewportElementCSS[_strMarginMinus + _strTop] = -_nativeScrollbarMinSize.x;\n\n viewportElementCSS[_strPaddingMinus + isRTLRight] = _nativeScrollbarMinSize.y;\n viewportElementCSS[_strMarginMinus + isRTLRight] = -_nativeScrollbarMinSize.y;\n }\n else {\n viewportElementCSS[_strPaddingMinus + _strTop] =\n viewportElementCSS[_strMarginMinus + _strTop] =\n viewportElementCSS[_strPaddingMinus + isRTLRight] =\n viewportElementCSS[_strMarginMinus + isRTLRight] = _strEmpty;\n }\n viewportElementCSS[_strPaddingMinus + isRTLLeft] =\n viewportElementCSS[_strMarginMinus + isRTLLeft] = _strEmpty;\n\n //if there is any overflow (x OR y axis) and this overflow shall be hidden, make overflow hidden, else overflow visible\n if ((hasOverflow.x && hideOverflow.x) || (hasOverflow.y && hideOverflow.y) || hideOverflowForceTextarea) {\n //only hide if is Textarea\n if (_isTextarea && hideOverflowForceTextarea) {\n paddingElementCSS[strOverflowX] =\n paddingElementCSS[strOverflowY] = strHidden;\n }\n }\n else {\n if (!clipAlways || (overflowBehaviorIsVH.x || overflowBehaviorIsVS.x || overflowBehaviorIsVH.y || overflowBehaviorIsVS.y)) {\n //only un-hide if Textarea\n if (_isTextarea) {\n paddingElementCSS[strOverflowX] =\n paddingElementCSS[strOverflowY] = _strEmpty;\n }\n viewportElementCSS[strOverflowX] =\n viewportElementCSS[strOverflowY] = strVisible;\n }\n }\n\n _paddingElement.css(paddingElementCSS);\n _viewportElement.css(viewportElementCSS);\n viewportElementCSS = { };\n\n //force soft redraw in webkit because without the scrollbars will may appear because DOM wont be redrawn under special conditions\n if ((hasOverflow.c || boxSizingChanged || widthAutoChanged || heightAutoChanged) && !(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)) {\n var elementStyle = _contentElementNative[LEXICON.s];\n var dump;\n elementStyle.webkitTransform = 'scale(1)';\n elementStyle.display = 'run-in';\n dump = _contentElementNative[LEXICON.oH];\n elementStyle.display = _strEmpty; //|| dump; //use dump to prevent it from deletion if minify\n elementStyle.webkitTransform = _strEmpty;\n }\n /*\n //force hard redraw in webkit if native overlaid scrollbars shall appear\n if (ignoreOverlayScrollbarHidingChanged && ignoreOverlayScrollbarHiding) {\n _hostElement.hide();\n var dump = _hostElementNative[LEXICON.oH];\n _hostElement.show();\n }\n */\n }\n\n //change to direction RTL and width auto Bugfix in Webkit\n //without this fix, the DOM still thinks the scrollbar is LTR and thus the content is shifted to the left\n contentElementCSS = {};\n if (cssDirectionChanged || widthAutoChanged || heightAutoChanged) {\n if (_isRTL && widthAuto) {\n var floatTmp = _contentElement.css(_strFloat);\n var posLeftWithoutFloat = MATH.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left);\n _contentElement.css(_strFloat, floatTmp);\n var posLeftWithFloat = MATH.round(_contentElement.position().left);\n\n if (posLeftWithoutFloat !== posLeftWithFloat)\n contentElementCSS[_strLeft] = posLeftWithoutFloat;\n }\n else {\n contentElementCSS[_strLeft] = _strEmpty;\n }\n }\n _contentElement.css(contentElementCSS);\n\n //handle scroll position\n if (_isTextarea && contentSizeChanged) {\n var textareaInfo = getTextareaInfo();\n if (textareaInfo) {\n var textareaRowsChanged = _textareaInfoCache === undefined ? true : textareaInfo._rows !== _textareaInfoCache._rows;\n var cursorRow = textareaInfo._cursorRow;\n var cursorCol = textareaInfo._cursorColumn;\n var widestRow = textareaInfo._widestRow;\n var lastRow = textareaInfo._rows;\n var lastCol = textareaInfo._columns;\n var cursorPos = textareaInfo._cursorPosition;\n var cursorMax = textareaInfo._cursorMax;\n var cursorIsLastPosition = (cursorPos >= cursorMax && _textareaHasFocus);\n var textareaScrollAmount = {\n x: (!textareaAutoWrapping && (cursorCol === lastCol && cursorRow === widestRow)) ? _overflowAmountCache.x : -1,\n y: (textareaAutoWrapping ? cursorIsLastPosition || textareaRowsChanged && (previousOverflow !== undefined ? (currScroll.y === previousOverflow.y) : false) : (cursorIsLastPosition || textareaRowsChanged) && cursorRow === lastRow) ? _overflowAmountCache.y : -1\n };\n currScroll.x = textareaScrollAmount.x > -1 ? (_isRTL && _normalizeRTLCache && _rtlScrollBehavior.i ? 0 : textareaScrollAmount.x) : currScroll.x; //if inverted, scroll to 0 -> normalized this means to max scroll offset.\n currScroll.y = textareaScrollAmount.y > -1 ? textareaScrollAmount.y : currScroll.y;\n }\n _textareaInfoCache = textareaInfo;\n }\n if (_isRTL && _rtlScrollBehavior.i && _nativeScrollbarIsOverlaid.y && hasOverflow.x && _normalizeRTLCache)\n currScroll.x += _contentBorderSize.w || 0;\n if(widthAuto)\n _hostElement[_strScrollLeft](0);\n if(heightAuto)\n _hostElement[_strScrollTop](0);\n _viewportElement[_strScrollLeft](currScroll.x)[_strScrollTop](currScroll.y);\n\n //scrollbars management:\n var scrollbarsVisibilityVisible = scrollbarsVisibility === 'v';\n var scrollbarsVisibilityHidden = scrollbarsVisibility === 'h';\n var scrollbarsVisibilityAuto = scrollbarsVisibility === 'a';\n\n var showScrollbarH = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, true, true, canScroll.x);\n var showScrollbarV = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, false, true, canScroll.y);\n var hideScrollbarH = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, true, false, canScroll.x);\n var hideScrollbarV = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, false, false, canScroll.y);\n\n //manage class name which indicates scrollable overflow\n if (hideOverflow.x || hideOverflow.y)\n addClass(_hostElement, _classNameHostOverflow);\n else\n removeClass(_hostElement, _classNameHostOverflow);\n if (hideOverflow.x)\n addClass(_hostElement, _classNameHostOverflowX);\n else\n removeClass(_hostElement, _classNameHostOverflowX);\n if (hideOverflow.y)\n addClass(_hostElement, _classNameHostOverflowY);\n else\n removeClass(_hostElement, _classNameHostOverflowY);\n\n //add or remove rtl class name for styling purposes\n if (cssDirectionChanged) {\n if (_isRTL)\n addClass(_hostElement, _classNameHostRTL);\n else\n removeClass(_hostElement, _classNameHostRTL);\n }\n\n //manage the resize feature (CSS3 resize \"polyfill\" for this plugin)\n if (_isBody)\n addClass(_hostElement, _classNameHostResizeDisabled);\n if (resizeChanged) {\n removeClass(_scrollbarCornerElement, [ \n _classNameScrollbarCornerResize,\n _classNameScrollbarCornerResizeB,\n _classNameScrollbarCornerResizeH,\n _classNameScrollbarCornerResizeV].join(_strSpace));\n if (_resizeNone) {\n addClass(_hostElement, _classNameHostResizeDisabled);\n }\n else {\n removeClass(_hostElement, _classNameHostResizeDisabled);\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResize);\n if (_resizeBoth)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeB);\n else if (_resizeHorizontal)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeH);\n else if (_resizeVertical)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeV);\n }\n }\n\n //manage the scrollbars general visibility + the scrollbar interactivity (unusable class name)\n if (scrollbarsVisibilityChanged || overflowBehaviorChanged || hideOverflow.c || hasOverflow.c || ignoreOverlayScrollbarHidingChanged) {\n if (ignoreOverlayScrollbarHiding) {\n if (ignoreOverlayScrollbarHidingChanged) {\n removeClass(_hostElement, _classNameHostScrolling);\n if (ignoreOverlayScrollbarHiding) {\n hideScrollbarH();\n hideScrollbarV();\n }\n }\n }\n else if (scrollbarsVisibilityAuto) {\n if (canScroll.x)\n showScrollbarH();\n else\n hideScrollbarH();\n\n if (canScroll.y)\n showScrollbarV();\n else\n hideScrollbarV();\n }\n else if (scrollbarsVisibilityVisible) {\n showScrollbarH();\n showScrollbarV();\n }\n else if (scrollbarsVisibilityHidden) {\n hideScrollbarH();\n hideScrollbarV();\n }\n }\n\n //manage the scrollbars auto hide feature (auto hide them after specific actions)\n if (scrollbarsAutoHideChanged || ignoreOverlayScrollbarHidingChanged) {\n if (_scrollbarsAutoHideLeave || _scrollbarsAutoHideMove) {\n setupHostMouseTouchEvents(true);\n setupHostMouseTouchEvents();\n }\n else {\n setupHostMouseTouchEvents(true);\n }\n\n if (_scrollbarsAutoHideNever)\n refreshScrollbarsAutoHide(true);\n else\n refreshScrollbarsAutoHide(false, true);\n }\n\n //manage scrollbars handle length & offset - don't remove!\n if (hostSizeChanged || overflowAmount.c || heightAutoChanged || widthAutoChanged || resizeChanged || boxSizingChanged || paddingAbsoluteChanged || ignoreOverlayScrollbarHidingChanged || cssDirectionChanged) {\n refreshScrollbarHandleLength(true);\n refreshScrollbarHandleOffset(true);\n refreshScrollbarHandleLength(false);\n refreshScrollbarHandleOffset(false);\n }\n\n //manage interactivity\n if (scrollbarsClickScrollingChanged)\n refreshScrollbarsInteractive(true, scrollbarsClickScrolling);\n if (scrollbarsDragScrollingChanged)\n refreshScrollbarsInteractive(false, scrollbarsDragScrolling);\n\n //callbacks:\n if (cssDirectionChanged) {\n dispatchCallback('onDirectionChanged', {\n isRTL: _isRTL,\n dir: cssDirection\n });\n }\n if (hostSizeChanged) {\n dispatchCallback('onHostSizeChanged', {\n width: _hostSizeCache.w,\n height: _hostSizeCache.h\n });\n }\n if (contentSizeChanged) {\n dispatchCallback('onContentSizeChanged', {\n width: _contentScrollSizeCache.w,\n height: _contentScrollSizeCache.h\n });\n }\n if (hasOverflow.c || hideOverflow.c) {\n dispatchCallback('onOverflowChanged', {\n x: hasOverflow.x,\n y: hasOverflow.y,\n xScrollable: hideOverflow.xs,\n yScrollable: hideOverflow.ys,\n clipped: hideOverflow.x || hideOverflow.y\n });\n }\n if (overflowAmount.c) {\n dispatchCallback('onOverflowAmountChanged', {\n x: overflowAmount.x,\n y: overflowAmount.y\n });\n }\n }\n\n //fix body min size\n if (_isBody && _bodyMinSizeCache && (_hasOverflowCache.c || _bodyMinSizeCache.c)) {\n //its possible that no min size was measured until now, because the content arrange element was just added now, in this case, measure now the min size.\n if (!_bodyMinSizeCache.f)\n bodyMinSizeChanged();\n if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)\n _contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y);\n if (_nativeScrollbarIsOverlaid.x && _hasOverflowCache.y)\n _contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);\n _bodyMinSizeCache.c = false;\n }\n\n //freezeResizeObserver(_sizeObserverElement, false);\n //freezeResizeObserver(_sizeAutoObserverElement, false);\n\n dispatchCallback('onUpdated', { forced: force });\n }\n\n \n //==== Options ====//\n\n /**\n * Sets new options but doesn't call the update method.\n * @param newOptions The object which contains the new options.\n * @returns {*} A object which contains the changed options.\n */\n function setOptions(newOptions) {\n var validatedOpts = _pluginsOptions._validate(newOptions, _pluginsOptions._template, true, _currentOptions)\n\n _currentOptions = extendDeep({}, _currentOptions, validatedOpts._default);\n _currentPreparedOptions = extendDeep({}, _currentPreparedOptions, validatedOpts._prepared);\n \n return validatedOpts._prepared;\n }\n\n\n //==== Structure ====//\n\n /**\n * Builds or destroys the wrapper and helper DOM elements.\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupStructureDOM(destroy) {\n var strParent = 'parent';\n var classNameResizeObserverHost = 'os-resize-observer-host';\n var classNameTextareaElementFull = _classNameTextareaElement + _strSpace + _classNameTextInherit;\n var textareaClass = _isTextarea ? _strSpace + _classNameTextInherit : _strEmpty;\n var adoptAttrs = _currentPreparedOptions.textarea.inheritedAttrs;\n var adoptAttrsMap = { };\n var applyAdoptedAttrs = function() {\n var applyAdoptedAttrsElm = destroy ? _targetElement : _hostElement;\n each(adoptAttrsMap, function(key, value) {\n if(type(value) == TYPES.s) {\n if(key == LEXICON.c)\n applyAdoptedAttrsElm.addClass(value);\n else\n applyAdoptedAttrsElm.attr(key, value);\n }\n });\n };\n var hostElementClassNames = [\n _classNameHostElement,\n _classNameHostTextareaElement,\n _classNameHostResizeDisabled,\n _classNameHostRTL,\n _classNameHostScrollbarHorizontalHidden,\n _classNameHostScrollbarVerticalHidden,\n _classNameHostTransition,\n _classNameHostScrolling,\n _classNameHostOverflow,\n _classNameHostOverflowX,\n _classNameHostOverflowY,\n _classNameThemeNone,\n _classNameTextareaElement,\n _classNameTextInherit,\n _classNameCache].join(_strSpace);\n var hostElementCSS = { };\n \n //get host element as first element, because that's the most upper element and required for the other elements\n _hostElement = _hostElement || (_isTextarea ? (_domExists ? _targetElement[strParent]()[strParent]()[strParent]()[strParent]() : FRAMEWORK(generateDiv(_classNameHostTextareaElement))) : _targetElement);\n _contentElement = _contentElement || selectOrGenerateDivByClass(_classNameContentElement + textareaClass);\n _viewportElement = _viewportElement || selectOrGenerateDivByClass(_classNameViewportElement + textareaClass);\n _paddingElement = _paddingElement || selectOrGenerateDivByClass(_classNamePaddingElement + textareaClass);\n _sizeObserverElement = _sizeObserverElement || selectOrGenerateDivByClass(classNameResizeObserverHost);\n _textareaCoverElement = _textareaCoverElement || (_isTextarea ? selectOrGenerateDivByClass(_classNameTextareaCoverElement) : undefined);\n \n //on destroy, remove all generated class names from the host element before collecting the adopted attributes \n //to prevent adopting generated class names\n if(destroy)\n removeClass(_hostElement, hostElementClassNames);\n \n //collect all adopted attributes\n adoptAttrs = type(adoptAttrs) == TYPES.s ? adoptAttrs.split(_strSpace) : adoptAttrs;\n if(type(adoptAttrs) == TYPES.a && _isTextarea) {\n each(adoptAttrs, function(i, v) {\n if(type(v) == TYPES.s) {\n adoptAttrsMap[v] = destroy ? _hostElement.attr(v) : _targetElement.attr(v);\n }\n });\n }\n\n if(!destroy) {\n if(_isTextarea) {\n if(!_currentPreparedOptions.sizeAutoCapable) {\n hostElementCSS[_strWidth] = _targetElement.css(_strWidth);\n hostElementCSS[_strHeight] = _targetElement.css(_strHeight);\n }\n \n if(!_domExists)\n _targetElement.addClass(_classNameTextInherit).wrap(_hostElement);\n \n //jQuery clones elements in wrap functions, so we have to select them again\n _hostElement = _targetElement[strParent]().css(hostElementCSS);\n }\n \n if(!_domExists) {\n //add the correct class to the target element\n addClass(_targetElement, _isTextarea ? classNameTextareaElementFull : _classNameHostElement);\n\n //wrap the content into the generated elements to create the required DOM\n _hostElement.wrapInner(_contentElement)\n .wrapInner(_viewportElement)\n .wrapInner(_paddingElement)\n .prepend(_sizeObserverElement);\n \n //jQuery clones elements in wrap functions, so we have to select them again\n _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement);\n _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement);\n _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement);\n \n if(_isTextarea) {\n _contentElement.prepend(_textareaCoverElement);\n applyAdoptedAttrs();\n }\n }\n \n if (_nativeScrollbarStyling)\n addClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n if(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)\n addClass(_viewportElement, _classNameViewportNativeScrollbarsOverlaid);\n if (_isBody)\n addClass(_htmlElement, _classNameHTMLElement);\n\n _sizeObserverElementNative = _sizeObserverElement[0];\n _hostElementNative = _hostElement[0];\n _paddingElementNative = _paddingElement[0];\n _viewportElementNative = _viewportElement[0];\n _contentElementNative = _contentElement[0];\n }\n else {\n if(_domExists && _initialized) {\n //clear size observer\n _sizeObserverElement.children().remove();\n \n //remove the style property and classes from already generated elements\n each([ _paddingElement, _viewportElement, _contentElement, _textareaCoverElement ], function(i, elm) { \n if(elm) {\n removeClass(elm.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n }\n });\n \n //add classes to the host element which was removed previously to match the expected DOM\n addClass(_hostElement, _isTextarea ? _classNameHostTextareaElement : _classNameHostElement);\n }\n else {\n //remove size observer\n remove(_sizeObserverElement);\n \n //unwrap the content to restore DOM\n _contentElement.contents()\n .unwrap()\n .unwrap()\n .unwrap();\n \n if(_isTextarea) {\n _targetElement.unwrap();\n remove(_hostElement);\n remove(_textareaCoverElement);\n applyAdoptedAttrs();\n }\n }\n \n if (_isTextarea)\n _targetElement.removeAttr(LEXICON.s);\n \n if (_isBody)\n removeClass(_htmlElement, _classNameHTMLElement);\n }\n }\n\n /**\n * Adds or removes all wrapper elements interactivity events.\n * @param destroy Indicates whether the Events shall be added or removed.\n */\n function setupStructureEvents() {\n var textareaKeyDownRestrictedKeyCodes = [\n 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12\n 33, 34, //page up, page down\n 37, 38, 39, 40, //left, up, right, down arrows\n 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock\n ];\n var textareaKeyDownKeyCodesList = [ ];\n var textareaUpdateIntervalID;\n var scrollStopTimeoutId;\n var scrollStopDelay = 175;\n var strFocus = 'focus';\n\n function updateTextarea(doClearInterval) {\n textareaUpdate();\n _base.update(_strAuto);\n if(doClearInterval && _autoUpdateRecommended)\n clearInterval(textareaUpdateIntervalID);\n }\n function textareaOnScroll(event) {\n _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0);\n _targetElement[_strScrollTop](0);\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n return false;\n }\n function textareaOnDrop(event) {\n setTimeout(function () {\n if(!_destroyed)\n updateTextarea();\n }, 50);\n }\n function textareaOnFocus() {\n _textareaHasFocus = true;\n addClass(_hostElement, strFocus);\n }\n function textareaOnFocusout() {\n _textareaHasFocus = false;\n textareaKeyDownKeyCodesList = [ ];\n removeClass(_hostElement, strFocus);\n updateTextarea(true);\n } \n function textareaOnKeyDown(event) {\n var keyCode = event.keyCode;\n \n if (inArray(keyCode, textareaKeyDownRestrictedKeyCodes) < 0) {\n if (!textareaKeyDownKeyCodesList[LEXICON.l]) {\n updateTextarea();\n textareaUpdateIntervalID = setInterval(updateTextarea, 1000 / 60);\n }\n if (inArray(keyCode, textareaKeyDownKeyCodesList) < 0)\n textareaKeyDownKeyCodesList.push(keyCode);\n }\n }\n function textareaOnKeyUp(event) {\n var keyCode = event.keyCode;\n var index = inArray(keyCode, textareaKeyDownKeyCodesList);\n\n if (inArray(keyCode, textareaKeyDownRestrictedKeyCodes) < 0) {\n if (index > -1)\n textareaKeyDownKeyCodesList.splice(index, 1);\n if (!textareaKeyDownKeyCodesList[LEXICON.l])\n updateTextarea(true);\n }\n } \n function contentOnTransitionEnd(event) {\n if (_autoUpdateCache === true)\n return;\n event = event.originalEvent || event;\n if (isSizeAffectingCSSProperty(event.propertyName))\n _base.update(_strAuto);\n }\n function viewportOnScroll(event) {\n if (!_sleeping) {\n if (scrollStopTimeoutId !== undefined)\n clearTimeout(scrollStopTimeoutId);\n else {\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(true);\n\n if (!nativeOverlayScrollbarsAreActive())\n addClass(_hostElement, _classNameHostScrolling);\n\n dispatchCallback('onScrollStart', event);\n }\n\n //if a scrollbars handle gets dragged, the mousemove event is responsible for refreshing the handle offset\n //because if CSS scroll-snap is used, the handle offset gets only refreshed on every snap point\n //this looks laggy & clunky, it looks much better if the offset refreshes with the mousemove\n if(!_scrollbarsHandlesDefineScrollPos) {\n refreshScrollbarHandleOffset(true);\n refreshScrollbarHandleOffset(false);\n }\n dispatchCallback('onScroll', event);\n\n scrollStopTimeoutId = setTimeout(function () {\n if(!_destroyed) {\n //OnScrollStop:\n clearTimeout(scrollStopTimeoutId);\n scrollStopTimeoutId = undefined;\n\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n\n if (!nativeOverlayScrollbarsAreActive())\n removeClass(_hostElement, _classNameHostScrolling);\n\n dispatchCallback('onScrollStop', event);\n }\n }, scrollStopDelay);\n }\n }\n\n\n if (_isTextarea) { \n if (_msieVersion > 9 || !_autoUpdateRecommended) {\n addDestroyEventListener(_targetElement, 'input', updateTextarea);\n }\n else {\n addDestroyEventListener(_targetElement, \n [ _strKeyDownEvent, _strKeyUpEvent ],\n [ textareaOnKeyDown, textareaOnKeyUp ]);\n }\n \n addDestroyEventListener(_targetElement, \n [ _strScroll, 'drop', strFocus, strFocus + 'out' ],\n [ textareaOnScroll, textareaOnDrop, textareaOnFocus, textareaOnFocusout ]);\n }\n else {\n addDestroyEventListener(_contentElement, _strTransitionEndEvent, contentOnTransitionEnd);\n }\n addDestroyEventListener(_viewportElement, _strScroll, viewportOnScroll, true);\n }\n\n\n //==== Scrollbars ====//\n\n /**\n * Builds or destroys all scrollbar DOM elements (scrollbar, track, handle)\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupScrollbarsDOM(destroy) {\n var selectOrGenerateScrollbarDOM = function(isHorizontal) {\n var scrollbarClassName = isHorizontal ? _classNameScrollbarHorizontal : _classNameScrollbarVertical;\n var scrollbar = selectOrGenerateDivByClass(_classNameScrollbar + _strSpace + scrollbarClassName, true);\n var track = selectOrGenerateDivByClass(_classNameScrollbarTrack, scrollbar);\n var handle = selectOrGenerateDivByClass(_classNameScrollbarHandle, scrollbar);\n\n if(!_domExists && !destroy) {\n scrollbar.append(track);\n track.append(handle);\n }\n \n return {\n _scrollbar: scrollbar,\n _track: track,\n _handle: handle\n };\n };\n function resetScrollbarDOM(isHorizontal) {\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbar = scrollbarVars._scrollbar;\n var track = scrollbarVars._track;\n var handle = scrollbarVars._handle;\n \n if(_domExists && _initialized) {\n each([ scrollbar, track, handle ], function(i, elm) { \n removeClass(elm.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n });\n }\n else {\n remove(scrollbar || selectOrGenerateScrollbarDOM(isHorizontal)._scrollbar);\n }\n }\n var horizontalElements;\n var verticalElements;\n \n if(!destroy) {\n horizontalElements = selectOrGenerateScrollbarDOM(true);\n verticalElements = selectOrGenerateScrollbarDOM();\n \n _scrollbarHorizontalElement = horizontalElements._scrollbar;\n _scrollbarHorizontalTrackElement = horizontalElements._track;\n _scrollbarHorizontalHandleElement = horizontalElements._handle;\n _scrollbarVerticalElement = verticalElements._scrollbar;\n _scrollbarVerticalTrackElement = verticalElements._track;\n _scrollbarVerticalHandleElement = verticalElements._handle;\n\n if(!_domExists) {\n _paddingElement.after(_scrollbarVerticalElement);\n _paddingElement.after(_scrollbarHorizontalElement);\n }\n }\n else {\n resetScrollbarDOM(true);\n resetScrollbarDOM();\n }\n }\n\n /**\n * Initializes all scrollbar interactivity events. (track and handle dragging, clicking, scrolling)\n * @param isHorizontal True if the target scrollbar is the horizontal scrollbar, false if the target scrollbar is the vertical scrollbar.\n */\n function setupScrollbarEvents(isHorizontal) {\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var insideIFrame = _windowElementNative.top !== _windowElementNative;\n var xy = scrollbarVars._x_y;\n var XY = scrollbarVars._X_Y;\n var scroll = _strScroll + scrollbarVars._Left_Top;\n var strActive = 'active';\n var strSnapHandle = 'snapHandle';\n var scrollDurationFactor = 1;\n var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl\n var trackTimeout;\n var mouseDownScroll;\n var mouseDownOffset;\n var mouseDownInvertedScale;\n \n function getPointerPosition(event) {\n return _msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.\n }\n function getPreparedScrollbarsOption(name) {\n return _currentPreparedOptions.scrollbars[name];\n }\n function increaseTrackScrollAmount() {\n scrollDurationFactor = 0.5;\n }\n function decreaseTrackScrollAmount() {\n scrollDurationFactor = 1;\n }\n function documentKeyDown(event) {\n if (inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)\n increaseTrackScrollAmount();\n }\n function documentKeyUp(event) {\n if (inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)\n decreaseTrackScrollAmount();\n }\n function onMouseTouchDownContinue(event) {\n var originalEvent = event.originalEvent || event;\n var isTouchEvent = originalEvent.touches !== undefined;\n return _sleeping || _destroyed || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !getPreparedScrollbarsOption('touchSupport')) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent;\n }\n function documentDragMove(event) {\n if(onMouseTouchDownContinue(event)) {\n var trackLength = scrollbarVarsInfo._trackLength;\n var handleLength = scrollbarVarsInfo._handleLength;\n var scrollRange = scrollbarVarsInfo._maxScroll;\n var scrollRaw = (getPointerPosition(event) - mouseDownOffset) * mouseDownInvertedScale;\n var scrollDeltaPercent = scrollRaw / (trackLength - handleLength);\n var scrollDelta = (scrollRange * scrollDeltaPercent);\n scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;\n if (_isRTL && isHorizontal && !_rtlScrollBehavior.i)\n scrollDelta *= -1;\n\n _viewportElement[scroll](MATH.round(mouseDownScroll + scrollDelta));\n\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, mouseDownScroll + scrollDelta);\n\n if (!_supportPassiveEvents)\n COMPATIBILITY.prvD(event);\n }\n else\n documentMouseTouchUp(event);\n }\n function documentMouseTouchUp(event) {\n event = event || event.originalEvent;\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchMoveEvent, _strMouseTouchUpEvent, _strKeyDownEvent, _strKeyUpEvent, _strSelectStartEvent ],\n [ documentDragMove, documentMouseTouchUp, documentKeyDown, documentKeyUp, documentOnSelectStart ],\n true);\n\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, true);\n\n _scrollbarsHandlesDefineScrollPos = false;\n removeClass(_bodyElement, _classNameDragging);\n removeClass(scrollbarVars._handle, strActive);\n removeClass(scrollbarVars._track, strActive);\n removeClass(scrollbarVars._scrollbar, strActive);\n\n mouseDownScroll = undefined;\n mouseDownOffset = undefined;\n mouseDownInvertedScale = 1;\n\n decreaseTrackScrollAmount();\n\n if (trackTimeout !== undefined) {\n _base.scrollStop();\n clearTimeout(trackTimeout);\n trackTimeout = undefined;\n }\n\n if(event) {\n var rect = _hostElementNative[LEXICON.bCR]();\n var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;\n\n //if mouse is outside host element\n if (!mouseInsideHost)\n hostOnMouseLeave();\n\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n }\n }\n function onHandleMouseTouchDown(event) {\n if (onMouseTouchDownContinue(event))\n onHandleMouseTouchDownAction(event);\n }\n function onHandleMouseTouchDownAction(event) {\n mouseDownScroll = _viewportElement[scroll]();\n mouseDownScroll = isNaN(mouseDownScroll) ? 0 : mouseDownScroll;\n if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)\n mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll;\n\n mouseDownInvertedScale = getHostElementInvertedScale()[xy];\n mouseDownOffset = getPointerPosition(event);\n\n _scrollbarsHandlesDefineScrollPos = !getPreparedScrollbarsOption(strSnapHandle);\n addClass(_bodyElement, _classNameDragging);\n addClass(scrollbarVars._handle, strActive);\n addClass(scrollbarVars._scrollbar, strActive);\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchMoveEvent, _strMouseTouchUpEvent, _strSelectStartEvent ],\n [ documentDragMove, documentMouseTouchUp, documentOnSelectStart ]);\n\n if(_msieVersion || !_documentMixed)\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n function onTrackMouseTouchDown(event) {\n if (onMouseTouchDownContinue(event)) {\n var scrollDistance = MATH.round(_viewportSize[scrollbarVars._w_h]);\n var trackOffset = scrollbarVars._track.offset()[scrollbarVars._left_top];\n var ctrlKey = event.ctrlKey;\n var instantScroll = event.shiftKey;\n var instantScrollTransition = instantScroll && ctrlKey;\n var isFirstIteration = true;\n var easing = 'linear';\n var decreaseScroll;\n var finishedCondition;\n var scrollActionFinsished = function(transition) {\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, transition);\n };\n var scrollActionInstantFinished = function() {\n scrollActionFinsished();\n onHandleMouseTouchDownAction(event);\n };\n var scrollAction = function () {\n if(!_destroyed) {\n var mouseOffset = (mouseDownOffset - trackOffset) * mouseDownInvertedScale;\n var handleOffset = scrollbarVarsInfo._handleOffset;\n var trackLength = scrollbarVarsInfo._trackLength;\n var handleLength = scrollbarVarsInfo._handleLength;\n var scrollRange = scrollbarVarsInfo._maxScroll;\n var currScroll = scrollbarVarsInfo._currentScroll;\n var scrollDuration = 270 * scrollDurationFactor;\n var timeoutDelay = isFirstIteration ? MATH.max(400, scrollDuration) : scrollDuration;\n var instantScrollPosition = scrollRange * ((mouseOffset - (handleLength / 2)) / (trackLength - handleLength)); // 100% * positionPercent\n var rtlIsNormal = _isRTL && isHorizontal && ((!_rtlScrollBehavior.i && !_rtlScrollBehavior.n) || _normalizeRTLCache);\n var decreaseScrollCondition = rtlIsNormal ? handleOffset < mouseOffset : handleOffset > mouseOffset;\n var scrollObj = { };\n var animationObj = {\n easing : easing,\n step : function(now) {\n if(_scrollbarsHandlesDefineScrollPos) {\n _viewportElement[scroll](now); //https://github.com/jquery/jquery/issues/4340\n refreshScrollbarHandleOffset(isHorizontal, now);\n }\n }\n };\n instantScrollPosition = isFinite(instantScrollPosition) ? instantScrollPosition : 0;\n instantScrollPosition = _isRTL && isHorizontal && !_rtlScrollBehavior.i ? (scrollRange - instantScrollPosition) : instantScrollPosition;\n\n //_base.scrollStop();\n\n if(instantScroll) {\n _viewportElement[scroll](instantScrollPosition); //scroll instantly to new position\n if(instantScrollTransition) {\n //get the scroll position after instant scroll (in case CSS Snap Points are used) to get the correct snapped scroll position\n //and the animation stops at the correct point\n instantScrollPosition = _viewportElement[scroll]();\n //scroll back to the position before instant scrolling so animation can be performed\n _viewportElement[scroll](currScroll);\n\n instantScrollPosition = rtlIsNormal && _rtlScrollBehavior.i ? (scrollRange - instantScrollPosition) : instantScrollPosition;\n instantScrollPosition = rtlIsNormal && _rtlScrollBehavior.n ? -instantScrollPosition : instantScrollPosition;\n\n scrollObj[xy] = instantScrollPosition;\n _base.scroll(scrollObj, extendDeep(animationObj, {\n duration : 130,\n complete : scrollActionInstantFinished\n }));\n }\n else\n scrollActionInstantFinished();\n }\n else {\n decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;\n finishedCondition = rtlIsNormal\n ? (decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset)\n : (decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset);\n\n if (finishedCondition) {\n clearTimeout(trackTimeout);\n _base.scrollStop();\n trackTimeout = undefined;\n scrollActionFinsished(true);\n }\n else {\n trackTimeout = setTimeout(scrollAction, timeoutDelay);\n\n scrollObj[xy] = (decreaseScroll ? '-=' : '+=') + scrollDistance;\n _base.scroll(scrollObj, extendDeep(animationObj, {\n duration: scrollDuration\n }));\n }\n isFirstIteration = false;\n }\n }\n };\n if (ctrlKey)\n increaseTrackScrollAmount();\n\n mouseDownInvertedScale = getHostElementInvertedScale()[xy];\n mouseDownOffset = COMPATIBILITY.page(event)[xy];\n\n _scrollbarsHandlesDefineScrollPos = !getPreparedScrollbarsOption(strSnapHandle);\n addClass(_bodyElement, _classNameDragging);\n addClass(scrollbarVars._track, strActive);\n addClass(scrollbarVars._scrollbar, strActive);\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchUpEvent, _strKeyDownEvent, _strKeyUpEvent, _strSelectStartEvent ],\n [ documentMouseTouchUp, documentKeyDown, documentKeyUp, documentOnSelectStart ]);\n\n scrollAction();\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n }\n function onTrackMouseTouchEnter(event) {\n //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is \"scroll\" or \"move\".\n _scrollbarsHandleHovered = true;\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(true);\n }\n function onTrackMouseTouchLeave(event) {\n _scrollbarsHandleHovered = false;\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n }\n function onScrollbarMouseTouchDown(event) {\n COMPATIBILITY.stpP(event);\n }\n \n addDestroyEventListener(scrollbarVars._handle, \n _strMouseTouchDownEvent, \n onHandleMouseTouchDown);\n addDestroyEventListener(scrollbarVars._track,\n [_strMouseTouchDownEvent, _strMouseTouchEnter, _strMouseTouchLeave], \n [onTrackMouseTouchDown, onTrackMouseTouchEnter, onTrackMouseTouchLeave]);\n addDestroyEventListener(scrollbarVars._scrollbar, \n _strMouseTouchDownEvent, \n onScrollbarMouseTouchDown);\n\n if (_supportTransition) {\n addDestroyEventListener(scrollbarVars._scrollbar, _strTransitionEndEvent, function(event) {\n if (event.target !== scrollbarVars._scrollbar[0])\n return;\n refreshScrollbarHandleLength(isHorizontal);\n refreshScrollbarHandleOffset(isHorizontal);\n });\n }\n }\n\n /**\n * Shows or hides the given scrollbar and applied a class name which indicates if the scrollbar is scrollable or not.\n * @param isHorizontal True if the horizontal scrollbar is the target, false if the vertical scrollbar is the target.\n * @param shallBeVisible True if the scrollbar shall be shown, false if hidden.\n * @param canScroll True if the scrollbar is scrollable, false otherwise.\n */\n function refreshScrollbarAppearance(isHorizontal, shallBeVisible, canScroll) {\n var scrollbarClassName = isHorizontal ? _classNameHostScrollbarHorizontalHidden : _classNameHostScrollbarVerticalHidden;\n var scrollbarElement = isHorizontal ? _scrollbarHorizontalElement : _scrollbarVerticalElement;\n\n if (shallBeVisible)\n removeClass(_hostElement, scrollbarClassName);\n else\n addClass(_hostElement, scrollbarClassName);\n\n if (canScroll)\n removeClass(scrollbarElement, _classNameScrollbarUnusable);\n else\n addClass(scrollbarElement, _classNameScrollbarUnusable);\n }\n\n /**\n * Autoshows / autohides both scrollbars with.\n * @param shallBeVisible True if the scrollbars shall be autoshown (only the case if they are hidden by a autohide), false if the shall be auto hidden.\n * @param delayfree True if the scrollbars shall be hidden without a delay, false or undefined otherwise.\n */\n function refreshScrollbarsAutoHide(shallBeVisible, delayfree) {\n clearTimeout(_scrollbarsAutoHideTimeoutId);\n if (shallBeVisible) {\n //if(_hasOverflowCache.x && _hideOverflowCache.xs)\n removeClass(_scrollbarHorizontalElement, _classNameScrollbarAutoHidden);\n //if(_hasOverflowCache.y && _hideOverflowCache.ys)\n removeClass(_scrollbarVerticalElement, _classNameScrollbarAutoHidden);\n }\n else {\n var anyActive;\n var strActive = 'active';\n var hide = function () {\n if (!_scrollbarsHandleHovered && !_destroyed) {\n anyActive = _scrollbarHorizontalHandleElement.hasClass(strActive) || _scrollbarVerticalHandleElement.hasClass(strActive);\n if (!anyActive && (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove || _scrollbarsAutoHideLeave))\n addClass(_scrollbarHorizontalElement, _classNameScrollbarAutoHidden);\n if (!anyActive && (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove || _scrollbarsAutoHideLeave))\n addClass(_scrollbarVerticalElement, _classNameScrollbarAutoHidden);\n }\n };\n if (_scrollbarsAutoHideDelay > 0 && delayfree !== true)\n _scrollbarsAutoHideTimeoutId = setTimeout(hide, _scrollbarsAutoHideDelay);\n else\n hide();\n }\n }\n\n /**\n * Refreshes the handle length of the given scrollbar.\n * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed.\n */\n function refreshScrollbarHandleLength(isHorizontal) {\n var handleCSS = {};\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var digit = 1000000;\n //get and apply intended handle length\n var handleRatio = MATH.min(1, (_hostSizeCache[scrollbarVars._w_h] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._w_h]);\n handleCSS[scrollbarVars._width_height] = (MATH.floor(handleRatio * 100 * digit) / digit) + '%'; //the last * digit / digit is for flooring to the 4th digit\n\n if (!nativeOverlayScrollbarsAreActive())\n scrollbarVars._handle.css(handleCSS);\n\n //measure the handle length to respect min & max length\n scrollbarVarsInfo._handleLength = scrollbarVars._handle[0]['offset' + scrollbarVars._Width_Height];\n scrollbarVarsInfo._handleLengthRatio = handleRatio;\n }\n\n /**\n * Refreshes the handle offset of the given scrollbar.\n * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed.\n * @param scrollOrTransition The scroll position of the given scrollbar axis to which the handle shall be moved or a boolean which indicates whether a transition shall be applied. If undefined or boolean if the current scroll-offset is taken. (if isHorizontal ? scrollLeft : scrollTop)\n */\n function refreshScrollbarHandleOffset(isHorizontal, scrollOrTransition) {\n var transition = type(scrollOrTransition) == TYPES.b;\n var transitionDuration = 250;\n var isRTLisHorizontal = _isRTL && isHorizontal;\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var strTranslateBrace = 'translate(';\n var strTransform = VENDORS._cssProperty('transform');\n var strTransition = VENDORS._cssProperty('transition');\n var nativeScroll = isHorizontal ? _viewportElement[_strScrollLeft]() : _viewportElement[_strScrollTop]();\n var currentScroll = scrollOrTransition === undefined || transition ? nativeScroll : scrollOrTransition;\n\n //measure the handle length to respect min & max length\n var handleLength = scrollbarVarsInfo._handleLength;\n var trackLength = scrollbarVars._track[0]['offset' + scrollbarVars._Width_Height];\n var handleTrackDiff = trackLength - handleLength;\n var handleCSS = {};\n var transformOffset;\n var translateValue;\n\n //DONT use the variable '_contentScrollSizeCache[scrollbarVars._w_h]' instead of '_viewportElement[0]['scroll' + scrollbarVars._Width_Height]'\n // because its a bit behind during the small delay when content size updates\n //(delay = mutationObserverContentLag, if its 0 then this var could be used)\n var maxScroll = (_viewportElementNative[_strScroll + scrollbarVars._Width_Height] - _viewportElementNative['client' + scrollbarVars._Width_Height]) * (_rtlScrollBehavior.n && isRTLisHorizontal ? -1 : 1); //* -1 if rtl scroll max is negative\n var getScrollRatio = function(base) {\n return isNaN(base / maxScroll) ? 0 : MATH.max(0, MATH.min(1, base / maxScroll));\n };\n var getHandleOffset = function(scrollRatio) {\n var offset = handleTrackDiff * scrollRatio;\n offset = isNaN(offset) ? 0 : offset;\n offset = (isRTLisHorizontal && !_rtlScrollBehavior.i) ? (trackLength - handleLength - offset) : offset;\n offset = MATH.max(0, offset);\n return offset;\n };\n var scrollRatio = getScrollRatio(nativeScroll);\n var unsnappedScrollRatio = getScrollRatio(currentScroll);\n var handleOffset = getHandleOffset(unsnappedScrollRatio);\n var snappedHandleOffset = getHandleOffset(scrollRatio);\n\n scrollbarVarsInfo._maxScroll = maxScroll;\n scrollbarVarsInfo._currentScroll = nativeScroll;\n scrollbarVarsInfo._currentScrollRatio = scrollRatio;\n\n if (_supportTransform) {\n transformOffset = isRTLisHorizontal ? -(trackLength - handleLength - handleOffset) : handleOffset; //in px\n //transformOffset = (transformOffset / trackLength * 100) * (trackLength / handleLength); //in %\n translateValue = isHorizontal ? strTranslateBrace + transformOffset + 'px, 0)' : strTranslateBrace + '0, ' + transformOffset + 'px)';\n\n handleCSS[strTransform] = translateValue;\n\n //apply or clear up transition\n if(_supportTransition)\n handleCSS[strTransition] = transition && MATH.abs(handleOffset - scrollbarVarsInfo._handleOffset) > 1 ? getCSSTransitionString(scrollbarVars._handle) + ', ' + (strTransform + _strSpace + transitionDuration + 'ms') : _strEmpty;\n }\n else\n handleCSS[scrollbarVars._left_top] = handleOffset;\n\n\n //only apply css if offset has changed and overflow exists.\n if (!nativeOverlayScrollbarsAreActive()) {\n scrollbarVars._handle.css(handleCSS);\n\n //clear up transition\n if(_supportTransform && _supportTransition && transition) {\n scrollbarVars._handle.one(_strTransitionEndEvent, function() {\n if(!_destroyed)\n scrollbarVars._handle.css(strTransition, _strEmpty);\n });\n }\n }\n\n scrollbarVarsInfo._handleOffset = handleOffset;\n scrollbarVarsInfo._snappedHandleOffset = snappedHandleOffset;\n scrollbarVarsInfo._trackLength = trackLength;\n }\n\n /**\n * Refreshes the interactivity of the given scrollbar element.\n * @param isTrack True if the track element is the target, false if the handle element is the target.\n * @param value True for interactivity false for no interactivity.\n */\n function refreshScrollbarsInteractive(isTrack, value) {\n var action = value ? 'removeClass' : 'addClass';\n var element1 = isTrack ? _scrollbarHorizontalTrackElement : _scrollbarHorizontalHandleElement;\n var element2 = isTrack ? _scrollbarVerticalTrackElement : _scrollbarVerticalHandleElement;\n var className = isTrack ? _classNameScrollbarTrackOff : _classNameScrollbarHandleOff;\n\n element1[action](className);\n element2[action](className);\n }\n\n /**\n * Returns a object which is used for fast access for specific variables.\n * @param isHorizontal True if the horizontal scrollbar vars shall be accessed, false if the vertical scrollbar vars shall be accessed.\n * @returns {{wh: string, WH: string, lt: string, _wh: string, _lt: string, t: *, h: *, c: {}, s: *}}\n */\n function getScrollbarVars(isHorizontal) {\n return {\n _width_height: isHorizontal ? _strWidth : _strHeight,\n _Width_Height: isHorizontal ? 'Width' : 'Height',\n _left_top: isHorizontal ? _strLeft : _strTop,\n _Left_Top: isHorizontal ? 'Left' : 'Top',\n _x_y: isHorizontal ? _strX : _strY,\n _X_Y: isHorizontal ? 'X' : 'Y',\n _w_h: isHorizontal ? 'w' : 'h',\n _l_t: isHorizontal ? 'l' : 't',\n _track: isHorizontal ? _scrollbarHorizontalTrackElement : _scrollbarVerticalTrackElement,\n _handle: isHorizontal ? _scrollbarHorizontalHandleElement : _scrollbarVerticalHandleElement,\n _scrollbar: isHorizontal ? _scrollbarHorizontalElement : _scrollbarVerticalElement,\n _info: isHorizontal ? _scrollHorizontalInfo : _scrollVerticalInfo\n };\n }\n\n\n //==== Scrollbar Corner ====//\n\n /**\n * Builds or destroys the scrollbar corner DOM element.\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupScrollbarCornerDOM(destroy) {\n _scrollbarCornerElement = _scrollbarCornerElement || selectOrGenerateDivByClass(_classNameScrollbarCorner, true);\n \n if(!destroy) {\n if(!_domExists) {\n _hostElement.append(_scrollbarCornerElement);\n }\n }\n else {\n if(_domExists && _initialized) {\n removeClass(_scrollbarCornerElement.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n }\n else {\n remove(_scrollbarCornerElement);\n }\n }\n }\n\n /**\n * Initializes all scrollbar corner interactivity events.\n */\n function setupScrollbarCornerEvents() {\n var insideIFrame = _windowElementNative.top !== _windowElementNative;\n var mouseDownPosition = { };\n var mouseDownSize = { };\n var mouseDownInvertedScale = { };\n var reconnectMutationObserver;\n \n function documentDragMove(event) {\n if (onMouseTouchDownContinue(event)) {\n var pageOffset = getCoordinates(event);\n var hostElementCSS = { };\n if (_resizeHorizontal || _resizeBoth)\n hostElementCSS[_strWidth] = (mouseDownSize.w + (pageOffset.x - mouseDownPosition.x) * mouseDownInvertedScale.x);\n if (_resizeVertical || _resizeBoth)\n hostElementCSS[_strHeight] = (mouseDownSize.h + (pageOffset.y - mouseDownPosition.y) * mouseDownInvertedScale.y);\n _hostElement.css(hostElementCSS);\n COMPATIBILITY.stpP(event);\n }\n else {\n documentMouseTouchUp(event);\n }\n }\n function documentMouseTouchUp(event) {\n var eventIsTrusted = event !== undefined;\n\n setupResponsiveEventListener(_documentElement,\n [ _strSelectStartEvent, _strMouseTouchMoveEvent, _strMouseTouchUpEvent ],\n [ documentOnSelectStart, documentDragMove, documentMouseTouchUp ],\n true);\n\n removeClass(_bodyElement, _classNameDragging);\n if (_scrollbarCornerElement.releaseCapture)\n _scrollbarCornerElement.releaseCapture();\n\n if (eventIsTrusted) {\n if (reconnectMutationObserver)\n connectMutationObservers();\n _base.update(_strAuto);\n }\n reconnectMutationObserver = false;\n }\n function onMouseTouchDownContinue(event) {\n var originalEvent = event.originalEvent || event;\n var isTouchEvent = originalEvent.touches !== undefined;\n return _sleeping || _destroyed ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent;\n }\n function getCoordinates(event) {\n return _msieVersion && insideIFrame ? { x : event.screenX , y : event.screenY } : COMPATIBILITY.page(event);\n }\n \n addDestroyEventListener(_scrollbarCornerElement, _strMouseTouchDownEvent, function(event) {\n if (onMouseTouchDownContinue(event) && !_resizeNone) {\n if (_mutationObserversConnected) {\n reconnectMutationObserver = true;\n disconnectMutationObservers();\n }\n\n mouseDownPosition = getCoordinates(event);\n\n mouseDownSize.w = _hostElementNative[LEXICON.oW] - (!_isBorderBox ? _paddingX : 0);\n mouseDownSize.h = _hostElementNative[LEXICON.oH] - (!_isBorderBox ? _paddingY : 0);\n mouseDownInvertedScale = getHostElementInvertedScale();\n\n setupResponsiveEventListener(_documentElement,\n [ _strSelectStartEvent, _strMouseTouchMoveEvent, _strMouseTouchUpEvent ],\n [ documentOnSelectStart, documentDragMove, documentMouseTouchUp ]);\n\n addClass(_bodyElement, _classNameDragging);\n if (_scrollbarCornerElement.setCapture)\n _scrollbarCornerElement.setCapture();\n\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n });\n }\n\n\n //==== Utils ====//\n\n /**\n * Calls the callback with the given name. The Context of this callback is always _base (this).\n * @param name The name of the target which shall be called.\n * @param args The args with which the callback shall be called.\n */\n function dispatchCallback(name, args) {\n if(_initialized) {\n var callback = _currentPreparedOptions.callbacks[name];\n var extensionOnName = name;\n var ext;\n\n if(extensionOnName.substr(0, 2) === 'on')\n extensionOnName = extensionOnName.substr(2, 1).toLowerCase() + extensionOnName.substr(3);\n\n if(type(callback) == TYPES.f)\n callback.call(_base, args);\n\n each(_extensions, function() {\n ext = this;\n if(type(ext.on) == TYPES.f)\n ext.on(extensionOnName, args);\n });\n }\n else if(!_destroyed)\n _callbacksInitQeueue.push({ n : name, a : args });\n }\n\n /**\n * Sets the \"top, right, bottom, left\" properties, with a given prefix, of the given css object.\n * @param targetCSSObject The css object to which the values shall be applied.\n * @param prefix The prefix of the \"top, right, bottom, left\" css properties. (example: 'padding-' is a valid prefix)\n * @param values A array of values which shall be applied to the \"top, right, bottom, left\" -properties. The array order is [top, right, bottom, left].\n * If this argument is undefined the value '' (empty string) will be applied to all properties.\n */\n function setTopRightBottomLeft(targetCSSObject, prefix, values) {\n if (values === undefined)\n values = [_strEmpty, _strEmpty, _strEmpty, _strEmpty];\n\n targetCSSObject[prefix + _strTop] = values[0];\n targetCSSObject[prefix + _strRight] = values[1];\n targetCSSObject[prefix + _strBottom] = values[2];\n targetCSSObject[prefix + _strLeft] = values[3];\n }\n\n /**\n * Returns the computed CSS transition string from the given element.\n * @param element The element from which the transition string shall be returned.\n * @returns {string} The CSS transition string from the given element.\n */\n function getCSSTransitionString(element) {\n var transitionStr = VENDORS._cssProperty('transition');\n var assembledValue = element.css(transitionStr);\n if(assembledValue)\n return assembledValue;\n var regExpString = '\\\\s*(' + '([^,(]+(\\\\(.+?\\\\))?)+' + ')[\\\\s,]*';\n var regExpMain = new RegExp(regExpString);\n var regExpValidate = new RegExp('^(' + regExpString + ')+$');\n var properties = 'property duration timing-function delay'.split(' ');\n var result = [ ];\n var strResult;\n var valueArray;\n var i = 0;\n var j;\n var splitCssStyleByComma = function(str) {\n strResult = [ ];\n if (!str.match(regExpValidate))\n return str;\n while (str.match(regExpMain)) {\n strResult.push(RegExp.$1);\n str = str.replace(regExpMain, _strEmpty);\n }\n\n return strResult;\n };\n for (; i < properties[LEXICON.l]; i++) {\n valueArray = splitCssStyleByComma(element.css(transitionStr + '-' + properties[i]));\n for (j = 0; j < valueArray[LEXICON.l]; j++)\n result[j] = (result[j] ? result[j] + _strSpace : _strEmpty) + valueArray[j];\n }\n return result.join(', ');\n }\n\n /**\n * Calculates the host-elements inverted scale. (invertedScale = 1 / scale)\n * @returns {{x: number, y: number}} The scale of the host-element.\n */\n function getHostElementInvertedScale() {\n var rect = _paddingElementNative[LEXICON.bCR]();\n return {\n x : _supportTransform ? 1 / (MATH.round(rect.width) / _paddingElementNative[LEXICON.oW]) || 1 : 1,\n y : _supportTransform ? 1 / (MATH.round(rect.height) / _paddingElementNative[LEXICON.oH]) || 1 : 1\n };\n }\n\n /**\n * Checks whether the given object is a HTMLElement.\n * @param o The object which shall be checked.\n * @returns {boolean} True the given object is a HTMLElement, false otherwise.\n */\n function isHTMLElement(o) {\n var strOwnerDocument = 'ownerDocument';\n var strHTMLElement = 'HTMLElement';\n var wnd = o && o[strOwnerDocument] ? (o[strOwnerDocument].parentWindow || window) : window;\n return (\n typeof wnd[strHTMLElement] == TYPES.o ? o instanceof wnd[strHTMLElement] : //DOM2\n o && typeof o == TYPES.o && o !== null && o.nodeType === 1 && typeof o.nodeName == TYPES.s\n );\n }\n\n /**\n * Compares 2 arrays and returns the differences between them as a array.\n * @param a1 The first array which shall be compared.\n * @param a2 The second array which shall be compared.\n * @returns {Array} The differences between the two arrays.\n */\n function getArrayDifferences(a1, a2) {\n var a = [ ];\n var diff = [ ];\n var i;\n var k;\n for (i = 0; i < a1.length; i++)\n a[a1[i]] = true;\n for (i = 0; i < a2.length; i++) {\n if (a[a2[i]])\n delete a[a2[i]];\n else\n a[a2[i]] = true;\n }\n for (k in a)\n diff.push(k);\n return diff;\n }\n\n /**\n * Returns Zero or the number to which the value can be parsed.\n * @param value The value which shall be parsed.\n * @param toFloat Indicates whether the number shall be parsed to a float.\n */\n function parseToZeroOrNumber(value, toFloat) {\n var num = toFloat ? parseFloat(value) : parseInt(value, 10);\n return isNaN(num) ? 0 : num;\n }\n\n /**\n * Gets several information of the textarea and returns them as a object or undefined if the browser doesn't support it.\n * @returns {{cursorRow: Number, cursorCol, rows: Number, cols: number, wRow: number, pos: number, max : number}} or undefined if not supported.\n */\n function getTextareaInfo() {\n //read needed values\n var textareaCursorPosition = _targetElementNative.selectionStart;\n if (textareaCursorPosition === undefined)\n return;\n\n var textareaValue = _targetElement.val();\n var textareaLength = textareaValue[LEXICON.l];\n var textareaRowSplit = textareaValue.split('\\n');\n var textareaLastRow = textareaRowSplit[LEXICON.l];\n var textareaCurrentCursorRowSplit = textareaValue.substr(0, textareaCursorPosition).split('\\n');\n var widestRow = 0;\n var textareaLastCol = 0;\n var cursorRow = textareaCurrentCursorRowSplit[LEXICON.l];\n var cursorCol = textareaCurrentCursorRowSplit[textareaCurrentCursorRowSplit[LEXICON.l] - 1][LEXICON.l];\n var rowCols;\n var i;\n\n //get widest Row and the last column of the textarea\n for (i = 0; i < textareaRowSplit[LEXICON.l]; i++) {\n rowCols = textareaRowSplit[i][LEXICON.l];\n if (rowCols > textareaLastCol) {\n widestRow = i + 1;\n textareaLastCol = rowCols;\n }\n }\n\n return {\n _cursorRow: cursorRow, //cursorRow\n _cursorColumn: cursorCol, //cursorCol\n _rows: textareaLastRow, //rows\n _columns: textareaLastCol, //cols\n _widestRow: widestRow, //wRow\n _cursorPosition: textareaCursorPosition, //pos\n _cursorMax: textareaLength //max\n };\n }\n\n /**\n * Determines whether native overlay scrollbars are active.\n * @returns {boolean} True if native overlay scrollbars are active, false otherwise.\n */\n function nativeOverlayScrollbarsAreActive() {\n return (_ignoreOverlayScrollbarHidingCache && (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y));\n }\n\n /**\n * Gets the element which is used to measure the content size.\n * @returns {*} TextareaCover if target element is textarea else the ContentElement.\n */\n function getContentMeasureElement() {\n return _isTextarea ? _textareaCoverElement[0] : _contentElementNative;\n }\n\n /**\n * Generates a string which represents a HTML div with the given classes or attributes.\n * @param classesOrAttrs The class of the div as string or a object which represents the attributes of the div. (The class attribute can also be written as \"className\".)\n * @param content The content of the div as string.\n * @returns {string} The concated string which represents a HTML div and its content.\n */\n function generateDiv(classesOrAttrs, content) {\n return '<div ' + (classesOrAttrs ? type(classesOrAttrs) == TYPES.s ?\n 'class=\"' + classesOrAttrs + '\"' :\n (function() {\n var key;\n var attrs = _strEmpty;\n if(FRAMEWORK.isPlainObject(classesOrAttrs)) {\n for (key in classesOrAttrs)\n attrs += (key === 'c' ? 'class' : key) + '=\"' + classesOrAttrs[key] + '\" ';\n }\n return attrs;\n })() :\n _strEmpty) +\n '>' +\n (content || _strEmpty) +\n '</div>';\n }\n \n /**\n * Selects or generates a div with the given class attribute.\n * @param className The class names (divided by spaces) of the div which shall be selected or generated.\n * @param selectParentOrOnlyChildren The parent element from which of the element shall be selected. (if undefined or boolean its hostElement)\n * If its a boolean it decides whether only the children of the host element shall be selected.\n * @returns {*} The generated or selected element.\n */\n function selectOrGenerateDivByClass(className, selectParentOrOnlyChildren) {\n var onlyChildren = type(selectParentOrOnlyChildren) == TYPES.b;\n var selectParent = onlyChildren ? _hostElement : (selectParentOrOnlyChildren || _hostElement);\n \n return (_domExists && !selectParent[LEXICON.l]) \n ? null\n : _domExists \n ? selectParent[onlyChildren ? 'children' : 'find'](_strDot + className.replace(/\\s/g, _strDot)).eq(0)\n : FRAMEWORK(generateDiv(className))\n }\n \n /**\n * Gets the value of the given property from the given object.\n * @param obj The object from which the property value shall be got.\n * @param path The property of which the value shall be got.\n * @returns {*} Returns the value of the searched property or undefined of the property wasn't found.\n */\n function getObjectPropVal(obj, path) {\n var splits = path.split(_strDot);\n var i = 0;\n var val;\n for(; i < splits.length; i++) {\n if(!obj[LEXICON.hOP](splits[i]))\n return;\n val = obj[splits[i]];\n if(i < splits.length && type(val) == TYPES.o)\n obj = val;\n }\n return val;\n }\n\n /**\n * Sets the value of the given property from the given object.\n * @param obj The object from which the property value shall be set.\n * @param path The property of which the value shall be set.\n * @param val The value of the property which shall be set.\n */\n function setObjectPropVal(obj, path, val) {\n var splits = path.split(_strDot);\n var splitsLength = splits.length;\n var i = 0;\n var extendObj = { };\n var extendObjRoot = extendObj;\n for(; i < splitsLength; i++)\n extendObj = extendObj[splits[i]] = i + 1 < splitsLength ? { } : val;\n FRAMEWORK.extend(obj, extendObjRoot, true);\n }\n\n\n //==== Utils Cache ====//\n\n /**\n * Compares two values or objects and returns true if they aren't equal.\n * @param current The first value or object which shall be compared.\n * @param cache The second value or object which shall be compared.\n * @param force If true the returned value is always true.\n * @returns {boolean} True if both values or objects aren't equal or force is true, false otherwise.\n */\n function checkCache(current, cache, force) {\n if (force)\n return force;\n if(type(current) == TYPES.o && type(cache) == TYPES.o) {\n for (var prop in current) {\n if(prop !== 'c') {\n if (current[LEXICON.hOP](prop) && cache[LEXICON.hOP](prop)) {\n if(checkCache(current[prop], cache[prop]))\n return true;\n }\n else {\n return true;\n }\n }\n }\n }\n else {\n return current !== cache;\n }\n return false;\n }\n\n\n //==== Shortcuts ====//\n\n /**\n * jQuery extend method shortcut with a appended \"true\" as first argument.\n */\n function extendDeep() {\n return FRAMEWORK.extend.apply(this, [ true ].concat([].slice.call(arguments)));\n }\n\n /**\n * jQuery addClass method shortcut.\n */\n function addClass(el, classes) {\n return _frameworkProto.addClass.call(el, classes);\n }\n\n /**\n * jQuery removeClass method shortcut.\n */\n function removeClass(el, classes) {\n return _frameworkProto.removeClass.call(el, classes);\n }\n\n /**\n * jQuery remove method shortcut.\n */\n function remove(el) {\n return _frameworkProto.remove.call(el);\n }\n\n /**\n * Finds the first child element with the given selector of the given element.\n * @param el The root element from which the selector shall be valid.\n * @param selector The selector of the searched element.\n * @returns {*} The first element which is a child of the given element and matches the givens selector.\n */\n function findFirst(el, selector) {\n return _frameworkProto.find.call(el, selector).eq(0);\n }\n\n\n //==== API ====//\n\n /**\n * Puts the instance to sleep. It wont respond to any changes in the DOM and won't update. Scrollbar Interactivity is also disabled as well as the resize handle.\n * This behavior can be reset by calling the update method.\n */\n _base.sleep = function () {\n _sleeping = true;\n };\n\n /**\n * Updates the plugin and DOM to the current options.\n * This method should only be called if a update is 100% required.\n * @param force True if every property shall be updated and the cache shall be ignored.\n * !INTERNAL USAGE! : force can be a string \"auto\", \"sync\" or \"zoom\" too\n * if \"auto\" then before a real update the content size and host element attributes gets checked, and if they changed only then the update method will be called.\n * if \"sync\" then the async update process (MutationObserver or UpdateLoop) gets synchronized and a corresponding update takes place if one was needed due to pending changes.\n * if \"zoom\" then a update takes place where it's assumed that content and host size changed\n * @returns {boolean|undefined} \n * If force is \"sync\" then a boolean is returned which indicates whether a update was needed due to pending changes.\n * If force is \"auto\" then a boolean is returned whether a update was needed due to attribute or size changes.\n * undefined otherwise.\n */\n _base.update = function (force) {\n if(_destroyed)\n return;\n \n var attrsChanged;\n var contentSizeC;\n var isString = type(force) == TYPES.s;\n var imgElementSelector = 'img';\n var imgElementLoadEvent = 'load';\n var doUpdateAuto;\n var mutHost;\n var mutContent;\n \n if(isString) {\n if (force === _strAuto) {\n attrsChanged = meaningfulAttrsChanged();\n contentSizeC = updateAutoContentSizeChanged();\n doUpdateAuto = attrsChanged || contentSizeC;\n if (doUpdateAuto) {\n update({\n _contentSizeChanged : contentSizeC,\n _changedOptions : _initialized ? undefined : _currentPreparedOptions\n });\n }\n }\n else if (force === _strSync) {\n if(_mutationObserversConnected) {\n mutHost = _mutationObserverHostCallback(_mutationObserverHost.takeRecords());\n mutContent = _mutationObserverContentCallback(_mutationObserverContent.takeRecords());\n }\n else {\n mutHost = _base.update(_strAuto);\n }\n }\n else if (force === 'zoom') {\n update({\n _hostSizeChanged : true,\n _contentSizeChanged : true\n });\n }\n }\n else {\n force = _sleeping || force;\n _sleeping = false;\n if(!_base.update(_strSync) || force)\n update({ _force : force });\n }\n if(!_isTextarea) {\n _contentElement.find(imgElementSelector).each(function(i, el) {\n var index = COMPATIBILITY.inA(el, _imgs);\n if (index === -1)\n FRAMEWORK(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);\n });\n }\n return doUpdateAuto || mutHost || mutContent;\n };\n\n /**\n Gets or sets the current options. The update method will be called automatically if new options were set.\n * @param newOptions If new options are given, then the new options will be set, if new options aren't given (undefined or a not a plain object) then the current options will be returned.\n * @param value If new options is a property path string, then this value will be used to set the option to which the property path string leads.\n * @returns {*}\n */\n _base.options = function (newOptions, value) {\n var option = { };\n var changedOps;\n \n //return current options if newOptions are undefined or empty\n if (FRAMEWORK.isEmptyObject(newOptions) || !FRAMEWORK.isPlainObject(newOptions)) {\n if (type(newOptions) == TYPES.s) {\n if (arguments.length > 1) {\n setObjectPropVal(option, newOptions, value);\n changedOps = setOptions(option);\n }\n else\n return getObjectPropVal(_currentOptions, newOptions);\n }\n else\n return _currentOptions;\n }\n else {\n changedOps = setOptions(newOptions);\n }\n \n if(!FRAMEWORK.isEmptyObject(changedOps)) {\n update({ _changedOptions : changedOps });\n } \n };\n\n /**\n * Restore the DOM, disconnects all observers, remove all resize observers and put the instance to sleep.\n */\n _base.destroy = function () {\n if(_destroyed)\n return;\n \n //remove this instance from auto update loop\n autoUpdateLoop.remove(_base);\n\n //disconnect all mutation observers\n disconnectMutationObservers();\n\n //remove all resize observers\n setupResizeObserver(_sizeObserverElement);\n setupResizeObserver(_sizeAutoObserverElement);\n\n //remove all extensions\n for(var extName in _extensions)\n _base.removeExt(extName);\n\n //remove all 'destroy' events\n while(_destroyEvents[LEXICON.l] > 0)\n _destroyEvents.pop()();\n\n //remove all events from host element\n setupHostMouseTouchEvents(true);\n\n //remove all helper / detection elements\n if (_contentGlueElement)\n remove(_contentGlueElement);\n if (_contentArrangeElement)\n remove(_contentArrangeElement);\n if (_sizeAutoObserverAdded)\n remove(_sizeAutoObserverElement);\n\n //remove all generated DOM\n setupScrollbarsDOM(true);\n setupScrollbarCornerDOM(true);\n setupStructureDOM(true);\n\n //remove all generated image load events\n for(var i = 0; i < _imgs[LEXICON.l]; i++)\n FRAMEWORK(_imgs[i]).off('load', imgOnLoad);\n _imgs = undefined;\n\n _destroyed = true;\n _sleeping = true;\n\n //remove this instance from the instances list\n INSTANCES(pluginTargetElement, 0);\n dispatchCallback('onDestroyed');\n\n //remove all properties and methods\n //for (var property in _base)\n // delete _base[property];\n //_base = undefined;\n };\n\n /**\n * Scrolls to a given position or element.\n * @param coordinates\n * 1. Can be \"coordinates\" which looks like:\n * { x : ?, y : ? } OR Object with x and y properties\n * { left : ?, top : ? } OR Object with left and top properties\n * { l : ?, t : ? } OR Object with l and t properties\n * [ ?, ? ] OR Array where the first two element are the coordinates (first is x, second is y)\n * ? A single value which stays for both axis\n * A value can be a number, a string or a calculation.\n *\n * Operators:\n * [NONE] The current scroll will be overwritten by the value.\n * '+=' The value will be added to the current scroll offset\n * '-=' The value will be subtracted from the current scroll offset\n * '*=' The current scroll wil be multiplicated by the value.\n * '/=' The current scroll wil be divided by the value.\n *\n * Units:\n * [NONE] The value is the final scroll amount. final = (value * 1)\n * 'px' Same as none\n * '%' The value is dependent on the current scroll value. final = ((currentScrollValue / 100) * value)\n * 'vw' The value is multiplicated by the viewport width. final = (value * viewportWidth)\n * 'vh' The value is multiplicated by the viewport height. final = (value * viewportHeight)\n *\n * example final values:\n * 200, '200px', '50%', '1vw', '1vh', '+=200', '/=1vw', '*=2px', '-=5vh', '+=33%', '+= 50% - 2px', '-= 1vw - 50%'\n *\n * 2. Can be a HTML or jQuery element:\n * The final scroll offset is the offset (without margin) of the given HTML / jQuery element.\n *\n * 3. Can be a object with a HTML or jQuery element with additional settings:\n * {\n * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid.\n * scroll : [string, array, object], Default value is 'always'.\n * block : [string, array, object], Default value is 'begin'.\n * margin : [number, boolean, array, object] Default value is false.\n * }\n *\n * Possible scroll settings are:\n * 'always' Scrolls always.\n * 'ifneeded' Scrolls only if the element isnt fully in view.\n * 'never' Scrolls never.\n *\n * Possible block settings are:\n * 'begin' Both axis shall be docked to the \"begin\" edge. - The element will be docked to the top and left edge of the viewport.\n * 'end' Both axis shall be docked to the \"end\" edge. - The element will be docked to the bottom and right edge of the viewport. (If direction is RTL to the bottom and left edge.)\n * 'center' Both axis shall be docked to \"center\". - The element will be centered in the viewport.\n * 'nearest' The element will be docked to the nearest edge(s).\n *\n * Possible margin settings are: -- The actual margin of the element wont be affect, this option affects only the final scroll offset.\n * [BOOLEAN] If true the css margin of the element will be used, if false no margin will be used.\n * [NUMBER] The margin will be used for all edges.\n *\n * @param duration The duration of the scroll animation, OR a jQuery animation configuration object.\n * @param easing The animation easing.\n * @param complete The animation complete callback.\n * @returns {{\n * position: {x: number, y: number},\n * ratio: {x: number, y: number},\n * max: {x: number, y: number},\n * handleOffset: {x: number, y: number},\n * handleLength: {x: number, y: number},\n * handleLengthRatio: {x: number, y: number}, t\n * rackLength: {x: number, y: number},\n * isRTL: boolean,\n * isRTLNormalized: boolean\n * }}\n */\n _base.scroll = function (coordinates, duration, easing, complete) {\n if (arguments.length === 0 || coordinates === undefined) {\n var infoX = _scrollHorizontalInfo;\n var infoY = _scrollVerticalInfo;\n var normalizeInvert = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.i;\n var normalizeNegate = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.n;\n var scrollX = infoX._currentScroll;\n var scrollXRatio = infoX._currentScrollRatio;\n var maxScrollX = infoX._maxScroll;\n scrollXRatio = normalizeInvert ? 1 - scrollXRatio : scrollXRatio;\n scrollX = normalizeInvert ? maxScrollX - scrollX : scrollX;\n scrollX *= normalizeNegate ? -1 : 1;\n maxScrollX *= normalizeNegate ? -1 : 1;\n\n return {\n position : {\n x : scrollX,\n y : infoY._currentScroll\n },\n ratio : {\n x : scrollXRatio,\n y : infoY._currentScrollRatio\n },\n max : {\n x : maxScrollX,\n y : infoY._maxScroll\n },\n handleOffset : {\n x : infoX._handleOffset,\n y : infoY._handleOffset\n },\n handleLength : {\n x : infoX._handleLength,\n y : infoY._handleLength\n },\n handleLengthRatio : {\n x : infoX._handleLengthRatio,\n y : infoY._handleLengthRatio\n },\n trackLength : {\n x : infoX._trackLength,\n y : infoY._trackLength\n },\n snappedHandleOffset : {\n x : infoX._snappedHandleOffset,\n y : infoY._snappedHandleOffset\n },\n isRTL: _isRTL,\n isRTLNormalized: _normalizeRTLCache\n };\n }\n \n _base.update(_strSync);\n \n var normalizeRTL = _normalizeRTLCache;\n var coordinatesXAxisProps = [_strX, _strLeft, 'l'];\n var coordinatesYAxisProps = [_strY, _strTop, 't'];\n var coordinatesOperators = ['+=', '-=', '*=', '/='];\n var durationIsObject = type(duration) == TYPES.o;\n var completeCallback = durationIsObject ? duration.complete : complete;\n var i;\n var finalScroll = { };\n var specialEasing = {};\n var doScrollLeft;\n var doScrollTop;\n var animationOptions;\n var strEnd = 'end';\n var strBegin = 'begin';\n var strCenter = 'center';\n var strNearest = 'nearest';\n var strAlways = 'always';\n var strNever = 'never';\n var strIfNeeded = 'ifneeded';\n var strLength = LEXICON.l;\n var settingsAxis;\n var settingsScroll;\n var settingsBlock;\n var settingsMargin;\n var finalElement;\n var elementObjSettingsAxisValues = [_strX, _strY, 'xy', 'yx'];\n var elementObjSettingsBlockValues = [strBegin, strEnd, strCenter, strNearest];\n var elementObjSettingsScrollValues = [strAlways, strNever, strIfNeeded];\n var coordinatesIsElementObj = coordinates[LEXICON.hOP]('el');\n var possibleElement = coordinatesIsElementObj ? coordinates.el : coordinates;\n var possibleElementIsJQuery = possibleElement instanceof FRAMEWORK || JQUERY ? possibleElement instanceof JQUERY : false;\n var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);\n var proxyCompleteCallback = type(completeCallback) != TYPES.f ? undefined : function() {\n if(doScrollLeft)\n refreshScrollbarHandleOffset(true);\n if(doScrollTop)\n refreshScrollbarHandleOffset(false);\n completeCallback();\n };\n function checkSettingsStringValue(currValue, allowedValues) {\n for (i = 0; i < allowedValues[strLength]; i++) {\n if (currValue === allowedValues[i])\n return true;\n }\n return false;\n }\n function getRawScroll(isX, coordinates) {\n var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;\n coordinates = type(coordinates) == TYPES.s || type(coordinates) == TYPES.n ? [ coordinates, coordinates ] : coordinates;\n\n if (type(coordinates) == TYPES.a)\n return isX ? coordinates[0] : coordinates[1];\n else if (type(coordinates) == TYPES.o) {\n //decides RTL normalization \"hack\" with .n\n //normalizeRTL = type(coordinates.n) == TYPES.b ? coordinates.n : normalizeRTL; \n for (i = 0; i < coordinateProps[strLength]; i++)\n if (coordinateProps[i] in coordinates)\n return coordinates[coordinateProps[i]];\n }\n }\n function getFinalScroll(isX, rawScroll) {\n var isString = type(rawScroll) == TYPES.s;\n var operator;\n var amount;\n var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;\n var currScroll = scrollInfo._currentScroll;\n var maxScroll = scrollInfo._maxScroll;\n var mult = ' * ';\n var finalValue;\n var isRTLisX = _isRTL && isX;\n var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;\n var strReplace = 'replace';\n var evalFunc = eval;\n var possibleOperator;\n if (isString) {\n //check operator\n if (rawScroll[strLength] > 2) {\n possibleOperator = rawScroll.substr(0, 2);\n if(inArray(possibleOperator, coordinatesOperators) > -1)\n operator = possibleOperator;\n }\n\n //calculate units and shortcuts\n rawScroll = operator ? rawScroll.substr(2) : rawScroll;\n rawScroll = rawScroll\n [strReplace](/min/g, 0) //'min' = 0%\n [strReplace](/</g, 0) //'<' = 0%\n [strReplace](/max/g, (normalizeShortcuts ? '-' : _strEmpty) + _strHundredPercent) //'max' = 100%\n [strReplace](/>/g, (normalizeShortcuts ? '-' : _strEmpty) + _strHundredPercent) //'>' = 100%\n [strReplace](/px/g, _strEmpty)\n [strReplace](/%/g, mult + (maxScroll * (isRTLisX && _rtlScrollBehavior.n ? -1 : 1) / 100.0))\n [strReplace](/vw/g, mult + _viewportSize.w)\n [strReplace](/vh/g, mult + _viewportSize.h);\n amount = parseToZeroOrNumber(isNaN(rawScroll) ? parseToZeroOrNumber(evalFunc(rawScroll), true).toFixed() : rawScroll);\n }\n else {\n amount = rawScroll;\n }\n\n if (amount !== undefined && !isNaN(amount) && type(amount) == TYPES.n) {\n var normalizeIsRTLisX = normalizeRTL && isRTLisX;\n var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);\n var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;\n var negate = normalizeIsRTLisX && _rtlScrollBehavior.n;\n operatorCurrScroll = invert ? (maxScroll - operatorCurrScroll) : operatorCurrScroll;\n switch (operator) {\n case '+=':\n finalValue = operatorCurrScroll + amount;\n break;\n case '-=':\n finalValue = operatorCurrScroll - amount;\n break;\n case '*=':\n finalValue = operatorCurrScroll * amount;\n break;\n case '/=':\n finalValue = operatorCurrScroll / amount;\n break;\n default:\n finalValue = amount;\n break;\n }\n finalValue = invert ? maxScroll - finalValue : finalValue;\n finalValue *= negate ? -1 : 1;\n finalValue = isRTLisX && _rtlScrollBehavior.n ? MATH.min(0, MATH.max(maxScroll, finalValue)) : MATH.max(0, MATH.min(maxScroll, finalValue));\n }\n return finalValue === currScroll ? undefined : finalValue;\n }\n function getPerAxisValue(value, valueInternalType, defaultValue, allowedValues) {\n var resultDefault = [ defaultValue, defaultValue ];\n var valueType = type(value);\n var valueArrLength;\n var valueArrItem;\n\n //value can be [ string, or array of two strings ]\n if (valueType == valueInternalType) {\n value = [value, value];\n }\n else if (valueType == TYPES.a) {\n valueArrLength = value[strLength];\n if (valueArrLength > 2 || valueArrLength < 1)\n value = resultDefault;\n else {\n if (valueArrLength === 1)\n value[1] = defaultValue;\n for (i = 0; i < valueArrLength; i++) {\n valueArrItem = value[i];\n if (type(valueArrItem) != valueInternalType || !checkSettingsStringValue(valueArrItem, allowedValues)) {\n value = resultDefault;\n break;\n }\n }\n }\n }\n else if (valueType == TYPES.o)\n value = [ value[_strX]|| defaultValue, value[_strY] || defaultValue];\n else\n value = resultDefault;\n return { x : value[0], y : value[1] };\n }\n function generateMargin(marginTopRightBottomLeftArray) {\n var result = [ ];\n var currValue;\n var currValueType;\n var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];\n for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {\n if(i === valueDirections[strLength])\n break;\n currValue = marginTopRightBottomLeftArray[i];\n currValueType = type(currValue);\n if(currValueType == TYPES.b)\n result.push(currValue ? parseToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);\n else\n result.push(currValueType == TYPES.n ? currValue : 0);\n }\n return result;\n }\n\n if (possibleElementIsJQuery || possibleElementIsHTMLElement) {\n //get settings\n var margin = coordinatesIsElementObj ? coordinates.margin : 0;\n var axis = coordinatesIsElementObj ? coordinates.axis : 0;\n var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;\n var block = coordinatesIsElementObj ? coordinates.block : 0;\n var marginDefault = [ 0, 0, 0, 0 ];\n var marginType = type(margin);\n var marginLength;\n finalElement = possibleElementIsJQuery ? possibleElement : FRAMEWORK(possibleElement);\n \n if (finalElement[strLength] > 0) {\n //margin can be [ boolean, number, array of 2, array of 4, object ]\n if (marginType == TYPES.n || marginType == TYPES.b)\n margin = generateMargin([margin, margin, margin, margin]);\n else if (marginType == TYPES.a) {\n marginLength = margin[strLength];\n if(marginLength === 2)\n margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);\n else if(marginLength >= 4)\n margin = generateMargin(margin);\n else\n margin = marginDefault;\n }\n else if (marginType == TYPES.o)\n margin = generateMargin([margin[_strTop], margin[_strRight], margin[_strBottom], margin[_strLeft]]);\n else\n margin = marginDefault;\n\n //block = type(block) === TYPES.b ? block ? [ strNearest, strBegin ] : [ strNearest, strEnd ] : block;\n settingsAxis = checkSettingsStringValue(axis, elementObjSettingsAxisValues) ? axis : 'xy';\n settingsScroll = getPerAxisValue(scroll, TYPES.s, strAlways, elementObjSettingsScrollValues);\n settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);\n settingsMargin = margin;\n\n var viewportScroll = {\n l: _scrollHorizontalInfo._currentScroll,\n t: _scrollVerticalInfo._currentScroll\n };\n // use padding element instead of viewport element because padding element has never padding, margin or position applied.\n var viewportOffset = _paddingElement.offset();\n\n //get coordinates\n var elementOffset = finalElement.offset();\n var doNotScroll = {\n x : settingsScroll.x == strNever || settingsAxis == _strY,\n y : settingsScroll.y == strNever || settingsAxis == _strX\n };\n elementOffset[_strTop] -= settingsMargin[0];\n elementOffset[_strLeft] -= settingsMargin[3];\n var elementScrollCoordinates = {\n x: MATH.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),\n y: MATH.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)\n };\n if (_isRTL) {\n if (!_rtlScrollBehavior.n && !_rtlScrollBehavior.i)\n elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l);\n if (_rtlScrollBehavior.n && normalizeRTL)\n elementScrollCoordinates.x *= -1;\n if (_rtlScrollBehavior.i && normalizeRTL)\n elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo._maxScroll - viewportScroll.l));\n }\n\n //measuring is required\n if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {\n var measuringElm = finalElement[0];\n var rawElementSize = _supportTransform ? measuringElm[LEXICON.bCR]() : {\n width : measuringElm[LEXICON.oW],\n height : measuringElm[LEXICON.oH]\n };\n var elementSize = {\n w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],\n h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]\n };\n var finalizeBlock = function(isX) {\n var vars = getScrollbarVars(isX);\n var wh = vars._w_h;\n var lt = vars._left_top;\n var xy = vars._x_y;\n var blockIsEnd = settingsBlock[xy] == (isX ? _isRTL ? strBegin : strEnd : strEnd);\n var blockIsCenter = settingsBlock[xy] == strCenter;\n var blockIsNearest = settingsBlock[xy] == strNearest;\n var scrollNever = settingsScroll[xy] == strNever;\n var scrollIfNeeded = settingsScroll[xy] == strIfNeeded;\n var vpSize = _viewportSize[wh];\n var vpOffset = viewportOffset[lt];\n var elSize = elementSize[wh];\n var elOffset = elementOffset[lt];\n var divide = blockIsCenter ? 2 : 1;\n var elementCenterOffset = elOffset + (elSize / 2);\n var viewportCenterOffset = vpOffset + (vpSize / 2);\n var isInView =\n elSize <= vpSize\n && elOffset >= vpOffset\n && elOffset + elSize <= vpOffset + vpSize;\n\n if(scrollNever)\n doNotScroll[xy] = true;\n else if(!doNotScroll[xy]) {\n if (blockIsNearest || scrollIfNeeded) {\n doNotScroll[xy] = scrollIfNeeded ? isInView : false;\n blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;\n }\n elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;\n }\n };\n finalizeBlock(true);\n finalizeBlock(false);\n }\n\n if (doNotScroll.y)\n delete elementScrollCoordinates.y;\n if (doNotScroll.x)\n delete elementScrollCoordinates.x;\n\n coordinates = elementScrollCoordinates;\n }\n }\n\n finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(true, coordinates));\n finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(false, coordinates));\n doScrollLeft = finalScroll[_strScrollLeft] !== undefined;\n doScrollTop = finalScroll[_strScrollTop] !== undefined;\n\n if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) {\n if (durationIsObject) {\n duration.complete = proxyCompleteCallback;\n _viewportElement.animate(finalScroll, duration);\n }\n else {\n animationOptions = {\n duration: duration,\n complete: proxyCompleteCallback\n };\n if (type(easing) == TYPES.a || FRAMEWORK.isPlainObject(easing)) {\n specialEasing[_strScrollLeft] = easing[0] || easing.x;\n specialEasing[_strScrollTop] = easing[1] || easing.y;\n animationOptions.specialEasing = specialEasing;\n }\n else {\n animationOptions.easing = easing;\n }\n _viewportElement.animate(finalScroll, animationOptions);\n }\n }\n else {\n if (doScrollLeft)\n _viewportElement[_strScrollLeft](finalScroll[_strScrollLeft]);\n if (doScrollTop)\n _viewportElement[_strScrollTop](finalScroll[_strScrollTop]);\n }\n };\n\n /**\n * Stops all scroll animations.\n * @returns {*} The current OverlayScrollbars instance (for chaining).\n */\n _base.scrollStop = function (param1, param2, param3) {\n _viewportElement.stop(param1, param2, param3);\n return _base;\n };\n\n /**\n * Returns all relevant elements.\n * @param elementName The name of the element which shall be returned.\n * @returns {{target: *, host: *, padding: *, viewport: *, content: *, scrollbarHorizontal: {scrollbar: *, track: *, handle: *}, scrollbarVertical: {scrollbar: *, track: *, handle: *}, scrollbarCorner: *} | *}\n */\n _base.getElements = function (elementName) {\n var obj = {\n target: _targetElementNative,\n host: _hostElementNative,\n padding: _paddingElementNative,\n viewport: _viewportElementNative,\n content: _contentElementNative,\n scrollbarHorizontal: {\n scrollbar: _scrollbarHorizontalElement[0],\n track: _scrollbarHorizontalTrackElement[0],\n handle: _scrollbarHorizontalHandleElement[0]\n },\n scrollbarVertical: {\n scrollbar: _scrollbarVerticalElement[0],\n track: _scrollbarVerticalTrackElement[0],\n handle: _scrollbarVerticalHandleElement[0]\n },\n scrollbarCorner: _scrollbarCornerElement[0]\n };\n return type(elementName) == TYPES.s ? getObjectPropVal(obj, elementName) : obj;\n };\n\n /**\n * Returns a object which describes the current state of this instance.\n * @param stateProperty A specific property from the state object which shall be returned.\n * @returns {{widthAuto, heightAuto, overflowAmount, hideOverflow, hasOverflow, contentScrollSize, viewportSize, hostSize, autoUpdate} | *}\n */\n _base.getState = function (stateProperty) {\n function prepare(obj) {\n if (!FRAMEWORK.isPlainObject(obj))\n return obj;\n var extended = extendDeep({}, obj);\n var changePropertyName = function (from, to) {\n if (extended[LEXICON.hOP](from)) {\n extended[to] = extended[from];\n delete extended[from];\n }\n };\n changePropertyName('w', _strWidth); //change w to width\n changePropertyName('h', _strHeight); //change h to height\n delete extended.c; //delete c (the 'changed' prop)\n return extended;\n };\n var obj = {\n destroyed: !!prepare(_destroyed),\n sleeping: !!prepare(_sleeping),\n autoUpdate: prepare(!_mutationObserversConnected),\n widthAuto: prepare(_widthAutoCache),\n heightAuto: prepare(_heightAutoCache),\n padding: prepare(_cssPaddingCache),\n overflowAmount: prepare(_overflowAmountCache),\n hideOverflow: prepare(_hideOverflowCache),\n hasOverflow: prepare(_hasOverflowCache),\n contentScrollSize: prepare(_contentScrollSizeCache),\n viewportSize: prepare(_viewportSize),\n hostSize: prepare(_hostSizeCache),\n documentMixed : prepare(_documentMixed)\n };\n return type(stateProperty) == TYPES.s ? getObjectPropVal(obj, stateProperty) : obj;\n };\n\n /**\n * Gets all or specific extension instance.\n * @param extName The name of the extension from which the instance shall be got.\n * @returns {{}} The instance of the extension with the given name or undefined if the instance couldn't be found.\n */\n _base.ext = function(extName) {\n var result;\n var privateMethods = _extensionsPrivateMethods.split(' ');\n var i = 0;\n if(type(extName) == TYPES.s) {\n if(_extensions[LEXICON.hOP](extName)) {\n result = extendDeep({}, _extensions[extName]);\n for (; i < privateMethods.length; i++)\n delete result[privateMethods[i]];\n }\n }\n else {\n result = { };\n for(i in _extensions)\n result[i] = extendDeep({ }, _base.ext(i));\n }\n return result;\n };\n\n /**\n * Adds a extension to this instance.\n * @param extName The name of the extension which shall be added.\n * @param extensionOptions The extension options which shall be used.\n * @returns {{}} The instance of the added extension or undefined if the extension couldn't be added properly.\n */\n _base.addExt = function(extName, extensionOptions) {\n var registeredExtensionObj = _plugin.extension(extName);\n var instance;\n var instanceAdded;\n var instanceContract;\n var contractResult;\n var contractFulfilled = true;\n if(registeredExtensionObj) {\n if(!_extensions[LEXICON.hOP](extName)) {\n instance = registeredExtensionObj.extensionFactory.call(_base,\n extendDeep({ }, registeredExtensionObj.defaultOptions),\n FRAMEWORK,\n COMPATIBILITY);\n\n if (instance) {\n instanceContract = instance.contract;\n if (type(instanceContract) == TYPES.f) {\n contractResult = instanceContract(window);\n contractFulfilled = type(contractResult) == TYPES.b ? contractResult : contractFulfilled;\n }\n if(contractFulfilled) {\n _extensions[extName] = instance;\n instanceAdded = instance.added;\n if(type(instanceAdded) == TYPES.f)\n instanceAdded(extensionOptions);\n\n return _base.ext(extName);\n }\n }\n }\n else\n return _base.ext(extName);\n }\n else\n console.warn(\"A extension with the name \\\"\" + extName + \"\\\" isn't registered.\");\n };\n\n /**\n * Removes a extension from this instance.\n * @param extName The name of the extension which shall be removed.\n * @returns {boolean} True if the extension was removed, false otherwise e.g. if the extension wasn't added before.\n */\n _base.removeExt = function(extName) {\n var instance = _extensions[extName];\n var instanceRemoved;\n if(instance) {\n delete _extensions[extName];\n\n instanceRemoved = instance.removed;\n if(type(instanceRemoved) == TYPES.f)\n instanceRemoved();\n\n return true;\n }\n return false;\n };\n\n /**\n * Constructs the plugin.\n * @param targetElement The element to which the plugin shall be applied.\n * @param options The initial options of the plugin.\n * @param extensions The extension(s) which shall be added right after the initialization.\n * @returns {boolean} True if the plugin was successfully initialized, false otherwise.\n */\n function construct(targetElement, options, extensions) {\n _defaultOptions = globals.defaultOptions;\n _nativeScrollbarStyling = globals.nativeScrollbarStyling;\n _nativeScrollbarSize = extendDeep({}, globals.nativeScrollbarSize);\n _nativeScrollbarIsOverlaid = extendDeep({}, globals.nativeScrollbarIsOverlaid);\n _overlayScrollbarDummySize = extendDeep({}, globals.overlayScrollbarDummySize);\n _rtlScrollBehavior = extendDeep({}, globals.rtlScrollBehavior);\n\n //parse & set options but don't update\n setOptions(extendDeep({ }, _defaultOptions, options));\n\n _cssCalc = globals.cssCalc;\n _msieVersion = globals.msie;\n _autoUpdateRecommended = globals.autoUpdateRecommended;\n _supportTransition = globals.supportTransition;\n _supportTransform = globals.supportTransform;\n _supportPassiveEvents = globals.supportPassiveEvents;\n _supportResizeObserver = globals.supportResizeObserver;\n _supportMutationObserver = globals.supportMutationObserver;\n _restrictedMeasuring = globals.restrictedMeasuring;\n _documentElement = FRAMEWORK(targetElement.ownerDocument);\n _documentElementNative = _documentElement[0];\n _windowElement = FRAMEWORK(_documentElementNative.defaultView || _documentElementNative.parentWindow);\n _windowElementNative = _windowElement[0];\n _htmlElement = findFirst(_documentElement, 'html');\n _bodyElement = findFirst(_htmlElement, 'body');\n _targetElement = FRAMEWORK(targetElement);\n _targetElementNative = _targetElement[0];\n _isTextarea = _targetElement.is('textarea');\n _isBody = _targetElement.is('body');\n _documentMixed = _documentElementNative !== document;\n\n /* On a div Element The if checks only whether:\n * - the targetElement has the class \"os-host\"\n * - the targetElement has a a child with the class \"os-padding\"\n * \n * If that's the case, its assumed the DOM has already the following structure:\n * (The \".os-host\" element is the targetElement)\n *\n * <div class=\"os-host\">\n * <div class=\"os-resize-observer-host\"></div>\n * <div class=\"os-padding\">\n * <div class=\"os-viewport\">\n * <div class=\"os-content\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-horizontal \">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-vertical\">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar-corner\"></div>\n * </div>\n *\n * =====================================================================================\n * \n * On a Textarea Element The if checks only whether:\n * - the targetElement has the class \"os-textarea\" \n * - the targetElement is inside a element with the class \"os-content\" \n * \n * If that's the case, its assumed the DOM has already the following structure:\n * (The \".os-textarea\" (textarea) element is the targetElement)\n *\n * <div class=\"os-host-textarea\">\n * <div class=\"os-resize-observer-host\"></div>\n * <div class=\"os-padding os-text-inherit\">\n * <div class=\"os-viewport os-text-inherit\">\n * <div class=\"os-content os-text-inherit\">\n * <div class=\"os-textarea-cover\"></div>\n * <textarea class=\"os-textarea os-text-inherit\"></textarea>\n * </div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-horizontal \">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-vertical\">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar-corner\"></div>\n * </div>\n */\n _domExists = _isTextarea \n ? _targetElement.hasClass(_classNameTextareaElement) && _targetElement.parent().hasClass(_classNameContentElement)\n : _targetElement.hasClass(_classNameHostElement) && _targetElement.children(_strDot + _classNamePaddingElement)[LEXICON.l];\n\n var initBodyScroll;\n var bodyMouseTouchDownListener;\n\n //check if the plugin hasn't to be initialized\n if (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y && !_currentPreparedOptions.nativeScrollbarsOverlaid.initialize) {\n dispatchCallback('onInitializationWithdrawn');\n if(_domExists) {\n setupStructureDOM(true);\n setupScrollbarsDOM(true);\n setupScrollbarCornerDOM(true);\n }\n \n _destroyed = true;\n _sleeping = true;\n \n return _base;\n }\n\n if (_isBody) {\n initBodyScroll = {};\n initBodyScroll.l = MATH.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]());\n initBodyScroll.t = MATH.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]());\n \n bodyMouseTouchDownListener = function() {\n _viewportElement.removeAttr('tabindex');\n setupResponsiveEventListener(_viewportElement, _strMouseTouchDownEvent, bodyMouseTouchDownListener, true, true);\n }\n }\n\n //build OverlayScrollbars DOM\n setupStructureDOM();\n setupScrollbarsDOM();\n setupScrollbarCornerDOM();\n \n //create OverlayScrollbars events\n setupStructureEvents();\n setupScrollbarEvents(true);\n setupScrollbarEvents(false);\n setupScrollbarCornerEvents();\n\n //create mutation observers\n createMutationObservers();\n\n //build resize observer for the host element\n setupResizeObserver(_sizeObserverElement, hostOnResized);\n\n if(_isBody) {\n //apply the body scroll to handle it right in the update method\n _viewportElement[_strScrollLeft](initBodyScroll.l)[_strScrollTop](initBodyScroll.t);\n\n //set the focus on the viewport element so you dont have to click on the page to use keyboard keys (up / down / space) for scrolling\n if(document.activeElement == targetElement && _viewportElementNative.focus) {\n //set a tabindex to make the viewportElement focusable\n _viewportElement.attr('tabindex', '-1');\n _viewportElementNative.focus();\n \n /* the tabindex has to be removed due to;\n * If you set the tabindex attribute on an <div>, then its child content cannot be scrolled with the arrow keys unless you set tabindex on the content, too\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\n */\n setupResponsiveEventListener(_viewportElement, _strMouseTouchDownEvent, bodyMouseTouchDownListener, false, true);\n }\n }\n\n //update for the first time & initialize cache\n _base.update(_strAuto);\n\n //the plugin is initialized now!\n _initialized = true;\n dispatchCallback('onInitialized');\n\n //call all callbacks which would fire before the initialized was complete\n each(_callbacksInitQeueue, function(index, value) { dispatchCallback(value.n, value.a); });\n _callbacksInitQeueue = [ ];\n\n //add extensions\n if(type(extensions) == TYPES.s)\n extensions = [ extensions ];\n if(COMPATIBILITY.isA(extensions))\n each(extensions, function (index, value) {_base.addExt(value); });\n else if(FRAMEWORK.isPlainObject(extensions))\n each(extensions, function (key, value) { _base.addExt(key, value); });\n\n //add the transition class for transitions AFTER the first update & AFTER the applied extensions (for preventing unwanted transitions)\n setTimeout(function () {\n if (_supportTransition && !_destroyed)\n addClass(_hostElement, _classNameHostTransition);\n }, 333);\n\n return _base;\n }\n\n if(_plugin.valid(construct(pluginTargetElement, options, extensions))) {\n INSTANCES(pluginTargetElement, _base);\n }\n \n return _base;\n }\n\n /**\n * Initializes a new OverlayScrollbarsInstance object or changes options if already initialized or returns the current instance.\n * @param pluginTargetElements The elements to which the Plugin shall be initialized.\n * @param options The custom options with which the plugin shall be initialized.\n * @param extensions The extension(s) which shall be added right after initialization.\n * @returns {*}\n */\n _plugin = window[PLUGINNAME] = function(pluginTargetElements, options, extensions) {\n if(arguments[LEXICON.l] === 0)\n return this;\n\n var arr = [ ];\n var optsIsPlainObj = FRAMEWORK.isPlainObject(options);\n var inst;\n var result;\n\n //pluginTargetElements is null or undefined\n if(!pluginTargetElements)\n return optsIsPlainObj || !options ? result : arr;\n\n /*\n pluginTargetElements will be converted to:\n 1. A jQueryElement Array\n 2. A HTMLElement Array\n 3. A Array with a single HTML Element\n so pluginTargetElements is always a array.\n */\n pluginTargetElements = pluginTargetElements[LEXICON.l] != undefined ? pluginTargetElements : [ pluginTargetElements[0] || pluginTargetElements ];\n initOverlayScrollbarsStatics();\n\n if(pluginTargetElements[LEXICON.l] > 0) {\n if(optsIsPlainObj) {\n FRAMEWORK.each(pluginTargetElements, function (i, v) {\n inst = v;\n if(inst !== undefined)\n arr.push(OverlayScrollbarsInstance(inst, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop));\n });\n }\n else {\n FRAMEWORK.each(pluginTargetElements, function(i, v) {\n inst = INSTANCES(v);\n if((options === '!' && _plugin.valid(inst)) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst)))\n arr.push(inst);\n else if(options === undefined)\n arr.push(inst);\n });\n }\n result = arr[LEXICON.l] === 1 ? arr[0] : arr;\n }\n return result;\n };\n\n /**\n * Returns a object which contains global information about the plugin and each instance of it.\n * The returned object is just a copy, that means that changes to the returned object won't have any effect to the original object.\n */\n _plugin.globals = function () {\n initOverlayScrollbarsStatics();\n var globals = FRAMEWORK.extend(true, { }, _pluginsGlobals);\n delete globals['msie'];\n return globals;\n };\n\n /**\n * Gets or Sets the default options for each new plugin initialization.\n * @param newDefaultOptions The object with which the default options shall be extended.\n */\n _plugin.defaultOptions = function(newDefaultOptions) {\n initOverlayScrollbarsStatics();\n var currDefaultOptions = _pluginsGlobals.defaultOptions;\n if(newDefaultOptions === undefined)\n return FRAMEWORK.extend(true, { }, currDefaultOptions);\n\n //set the new default options\n _pluginsGlobals.defaultOptions = FRAMEWORK.extend(true, { }, currDefaultOptions , _pluginsOptions._validate(newDefaultOptions, _pluginsOptions._template, true, currDefaultOptions)._default);\n };\n\n /**\n * Checks whether the passed instance is a non-destroyed OverlayScrollbars instance.\n * @param osInstance The potential OverlayScrollbars instance which shall be checked.\n * @returns {boolean} True if the passed value is a non-destroyed OverlayScrollbars instance, false otherwise.\n */\n _plugin.valid = function (osInstance) {\n return osInstance instanceof _plugin && !osInstance.getState().destroyed;\n };\n\n /**\n * Registers, Unregisters or returns a extension.\n * Register: Pass the name and the extension. (defaultOptions is optional)\n * Unregister: Pass the name and anything except a function as extension parameter.\n * Get extension: Pass the name of the extension which shall be got.\n * Get all extensions: Pass no arguments.\n * @param extensionName The name of the extension which shall be registered, unregistered or returned.\n * @param extension A function which generates the instance of the extension or anything other to remove a already registered extension.\n * @param defaultOptions The default options which shall be used for the registered extension.\n */\n _plugin.extension = function(extensionName, extension, defaultOptions) {\n var extNameTypeString = COMPATIBILITY.type(extensionName) == TYPES.s;\n var argLen = arguments[LEXICON.l];\n var i = 0;\n if(argLen < 1 || !extNameTypeString) {\n //return a copy of all extension objects\n return FRAMEWORK.extend(true, { length : _pluginsExtensions[LEXICON.l] }, _pluginsExtensions);\n }\n else if(extNameTypeString) {\n if(COMPATIBILITY.type(extension) == TYPES.f) {\n //register extension\n _pluginsExtensions.push({\n name : extensionName,\n extensionFactory : extension,\n defaultOptions : defaultOptions\n });\n }\n else {\n for(; i < _pluginsExtensions[LEXICON.l]; i++) {\n if (_pluginsExtensions[i].name === extensionName) {\n if(argLen > 1)\n _pluginsExtensions.splice(i, 1); //remove extension\n else\n return FRAMEWORK.extend(true, { }, _pluginsExtensions[i]); //return extension with the given name\n }\n }\n }\n }\n };\n\n return _plugin;\n })();\n\n if(JQUERY && JQUERY.fn) {\n /**\n * The jQuery initialization interface.\n * @param options The initial options for the construction of the plugin. To initialize the plugin, this option has to be a object! If it isn't a object, the instance(s) are returned and the plugin wont be initialized.\n * @param extensions The extension(s) which shall be added right after initialization.\n * @returns {*} After initialization it returns the jQuery element array, else it returns the instance(s) of the elements which are selected.\n */\n JQUERY.fn.overlayScrollbars = function (options, extensions) {\n var _elements = this;\n if(JQUERY.isPlainObject(options)) {\n JQUERY.each(_elements, function() { PLUGIN(this, options, extensions); });\n return _elements;\n }\n else\n return PLUGIN(_elements, options);\n };\n }\n return PLUGIN;\n }\n));"
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"index": 41,
"index2": 45,
"size": 10212,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./components/pageSignIn",
"loc": "22:35-69"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"../lib/mtproto\");\nvar misc_1 = require(\"./misc\");\nvar richtextprocessor_1 = require(\"../lib/richtextprocessor\");\n// @ts-ignore\n//import countries from './countries.json';\nvar utils_1 = require(\"../lib/utils\");\nvar pageAuthCode_1 = __importDefault(require(\"./pageAuthCode\"));\nexports.default = (function () { return Promise.all([\n Promise.resolve().then(function () { return __importStar(require('../countries.json')); })\n]).then(function (results) {\n var countries = results[0].default;\n var options = { dcID: Config.App.baseDcID, createNetworker: true };\n var lastCountrySelected = '';\n var selectCountryCode = document.querySelector('input[name=\"countryCode\"]');\n var parent = selectCountryCode.parentElement;\n var wrapper = document.createElement('div');\n wrapper.classList.add('select-wrapper', 'z-depth-4');\n /* OverlayScrollbars(document.querySelectorAll('body'), {\n className : 'scroll',\n sizeAutoCapable : true,\n paddingAbsolute : true,\n scrollbars : {\n clickScrolling : true\n }\n }); */\n var list = document.createElement('ul');\n wrapper.appendChild(list);\n // @ts-ignore\n var wrapperScroll = OverlayScrollbars(wrapper, window.scrollbarOptions);\n var pageEl = document.body.getElementsByClassName('page-sign')[0];\n pageEl.style.display = '';\n var initedSelect = false;\n selectCountryCode.addEventListener('focus', function (e) {\n /* this.removeAttribute('readonly'); */\n if (!initedSelect) {\n countries.forEach(function (c) {\n initedSelect = true;\n var unified = utils_1.unifiedCountryCodeEmoji(c.code);\n var emoji = unified.split('-').reduce(function (prev, curr) { return prev + String.fromCodePoint(parseInt(curr, 16)); }, '');\n var liArr = [];\n c.phoneCode.split(' and ').forEach(function (phoneCode) {\n var li = document.createElement('li');\n var spanEmoji = document.createElement('span');\n /* spanEmoji.innerHTML = countryCodeEmoji(c.code); */\n spanEmoji.classList.add('emoji-outer', 'emoji-sizer');\n //spanEmoji.innerHTML = `<span class=\"emoji-inner\" style=\"background: url(${sheetUrl}${sheetNo}.png);background-position:${xPos}% ${yPos}%;background-size:${sizeX}% ${sizeY}%\" data-codepoints=\"${unified}\"></span>`;\n var kek = richtextprocessor_1.RichTextProcessor.wrapRichText(emoji);\n console.log(c.name, emoji, kek, spanEmoji.innerHTML);\n li.appendChild(spanEmoji);\n spanEmoji.outerHTML = kek;\n li.append(c.name);\n var span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + phoneCode;\n li.appendChild(span);\n liArr.push(li);\n list.append(li);\n });\n // @ts-ignore\n c.li = liArr;\n });\n var findUpTag_1 = function (el, tag) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.tagName === tag)\n return el;\n }\n return null;\n };\n list.addEventListener('mousedown', function (e) {\n var target = e.target;\n if (target.tagName != 'LI')\n target = findUpTag_1(target, 'LI');\n var countryName = target.childNodes[1].textContent; //target.innerText.split('\\n').shift();\n var phoneCode = target.querySelector('.phone-code').innerText;\n selectCountryCode.value = countryName;\n lastCountrySelected = countryName;\n telEl.value = phoneCode;\n setTimeout(function () { return telEl.focus(); }, 0);\n console.log('clicked', e, countryName, phoneCode);\n });\n }\n wrapperScroll.update(true);\n parent.appendChild(wrapper);\n } /* , {once: true} */);\n selectCountryCode.addEventListener('blur', function (e) {\n parent.removeChild(wrapper);\n e.cancelBubble = true;\n }, { capture: true });\n selectCountryCode.addEventListener('keyup', function (e) {\n console.log(e);\n if (e.ctrlKey || e.key == 'Control')\n return false;\n //let i = new RegExp('^' + this.value, 'i');\n var _value = this.value.toLowerCase();\n var matches = [];\n countries.forEach(function (c) {\n var good = c.name.toLowerCase().indexOf(_value) == 0; //i.test(c.name);\n // @ts-ignore\n c.li.forEach(function (li) { return li.style.display = good ? '' : 'none'; });\n if (good)\n matches.push(c);\n });\n if (matches.length == 1 && matches[0].li.length == 1) {\n if (matches[0].name == lastCountrySelected)\n return false;\n console.log('clicking', matches[0]);\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n }\n else if (matches.length == 0) {\n countries.forEach(function (c) {\n // @ts-ignore\n c.li.forEach(function (li) { return li.style.display = ''; });\n });\n }\n });\n var arrowDown = pageEl.querySelector('.arrow-down');\n arrowDown.addEventListener('mousedown', function (e) {\n e.cancelBubble = true;\n e.preventDefault();\n if (selectCountryCode.matches(':focus'))\n selectCountryCode.blur();\n else\n selectCountryCode.focus();\n });\n var btnNext = document.querySelector('.page-sign button');\n var telEl = document.querySelector('input[name=\"phone\"]');\n telEl.addEventListener('keypress', function (e) {\n if (/\\D/.test(e.key)) {\n e.preventDefault();\n return false;\n }\n this.classList.remove('error');\n this.value = '+' + this.value\n .replace(/[^0-9\\s]/g, '');\n var sorted = countries.slice().sort(function (a, b) { return b.phoneCode.length - a.phoneCode.length; });\n var phoneCode = this.value.slice(1, 7).replace(/\\D/g, '');\n var country = sorted.find(function (c) {\n return c.phoneCode.split(' and ').find(function (c) { return phoneCode.indexOf(c) == 0; });\n });\n console.log(phoneCode, country);\n var countryName = country ? country.name : 'Unknown';\n if (countryName != selectCountryCode.value) {\n selectCountryCode.value = countryName;\n lastCountrySelected = countryName;\n }\n if (this.value.length >= 9) {\n btnNext.style.display = '';\n }\n });\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n }) */ ;\n console.log('exec startAll();');\n /* MTProto.authorizer.auth(2);\n MTProto.networkerFactory.startAll(); */\n btnNext.addEventListener('click', function (e) {\n var _this = this;\n this.setAttribute('disabled', 'true');\n // @ts-ignore\n console.log('asd', e.target.innerText);\n this.textContent = 'PLEASE WAIT...';\n misc_1.putPreloader(this);\n //this.innerHTML = 'PLEASE WAIT...';\n var phone_number = telEl.value;\n mtproto_1.MTProto.apiManager.invokeApi('auth.sendCode', {\n /* flags: 0, */\n phone_number: phone_number,\n api_id: Config.App.id,\n api_hash: Config.App.hash,\n settings: {\n _: 'codeSettings',\n flags: 0\n }\n /* lang_code: navigator.language || 'en' */\n }, options).then(function (code) {\n console.log('yep', code);\n pageEl.style.display = 'none';\n pageAuthCode_1.default(Object.assign(code, { phone_number: phone_number }));\n }).catch(function (err) {\n _this.removeAttribute('disabled');\n _this.innerText = 'NEXT';\n switch (err.type) {\n case 'PHONE_NUMBER_INVALID':\n telEl.classList.add('error');\n break;\n default:\n _this.innerText = err.type;\n break;\n }\n });\n });\n var tryAgain = function () {\n mtproto_1.MTProto.apiManager.invokeApi('help.getNearestDc', {}, options).then(function (nearestDcResult) {\n /* if (wasCountry == $scope.credentials.phone_country) {\n selectPhoneCountryByIso2(nearestDcResult.country)\n } */\n if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n mtproto_1.MTProto.apiManager.getNetworker(nearestDcResult.nearest_dc, { createNetworker: true });\n }\n var country = countries.find(function (c) { return c.code == nearestDcResult.country; });\n if (country) {\n if (!selectCountryCode.value.length && !telEl.value.length) {\n selectCountryCode.value = country.name;\n lastCountrySelected = country.name;\n telEl.value = '+' + country.phoneCode.split(' and ').shift();\n }\n }\n return console.log('woohoo', nearestDcResult, country);\n }).catch(tryAgain);\n };\n tryAgain();\n}); });\n"
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"index": 42,
"index2": 43,
"size": 8844,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"issuerId": 41,
"issuerName": "./src/components/pageSignIn.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "./pageAuthCode",
"loc": "19:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"../lib/bin_utils\");\n//import { AnimationItem } from 'lottie-web';\nvar mtproto_1 = require(\"../lib/mtproto\");\n//import Lottie from 'lottie-web';\nvar pageSignUp_1 = __importDefault(require(\"./pageSignUp\"));\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nvar pagePassword_1 = __importDefault(require(\"./pagePassword\"));\nvar installed = false;\nvar authCode = null;\nexports.default = (function (_authCode) { return Promise.resolve().then(function () { return __importStar(require('lottie-web')); }).then(function (Lottie) {\n authCode = _authCode;\n if (installed)\n return;\n installed = true;\n var options = { dcID: Config.App.baseDcID, createNetworker: true };\n var lottie = Lottie;\n //let lottie = Lottie.default;\n var needFrame = 0, lastLength = 0;\n var animation = /* AnimationItem */ undefined;\n var pageElement = document.body.getElementsByClassName('page-authCode')[0];\n pageElement.style.display = '';\n var headerElement = pageElement.getElementsByClassName('phone')[0];\n headerElement.innerText = authCode.phone_number;\n var CODELENGTH = authCode.type.length;\n fetch('assets/img/TwoFactorSetupMonkeyTracking.tgs')\n .then(function (res) { return res.arrayBuffer(); })\n .then(function (data) {\n var str = bin_utils_1.gzipUncompress(data, true);\n // @ts-ignore\n animation = lottie.loadAnimation({\n container: document.body.querySelector('.page-authCode .auth-image'),\n renderer: 'svg',\n loop: false,\n autoplay: false,\n animationData: JSON.parse(str)\n });\n animation.setSpeed(1);\n //console.log(animation.getDuration(), animation.getDuration(true));\n animation.addEventListener('enterFrame', function (e) {\n //console.log('enterFrame', e, needFrame);\n var currentFrame = Math.round(e.currentTime);\n if ((e.direction == 1 && currentFrame >= needFrame) ||\n (e.direction == -1 && currentFrame <= needFrame)) {\n animation.setSpeed(1);\n animation.pause();\n }\n });\n });\n var codeInput = document.getElementById('code');\n var codeInputLabel = codeInput.nextElementSibling;\n var editButton = document.querySelector('.phone-edit');\n var editable = false;\n var changePhonePromise;\n var changePhone = function () {\n if (changePhonePromise)\n return;\n var phone_number = '+' + headerElement.innerText.replace(/\\D/g, '');\n if (authCode.phone_number == phone_number)\n return;\n codeInput.setAttribute('disabled', 'true');\n changePhonePromise = mtproto_1.MTProto.apiManager.invokeApi('auth.sendCode', {\n /* flags: 0, */\n phone_number: phone_number,\n api_id: Config.App.id,\n api_hash: Config.App.hash,\n settings: {\n _: 'codeSettings',\n flags: 0\n }\n /* lang_code: navigator.language || 'en' */\n }, options).then(function (code) {\n console.log('yep2', code);\n authCode = Object.assign(code, { phone_number: phone_number });\n changePhonePromise = undefined;\n codeInput.removeAttribute('disabled');\n codeInput.focus();\n }).catch(function (err) {\n switch (err.type) {\n case 'PHONE_NUMBER_INVALID':\n headerElement.classList.add('error');\n editable = true;\n headerElement.setAttribute('contenteditable', '' + editable);\n headerElement.focus();\n break;\n default:\n codeInputLabel.innerText = err.type;\n break;\n }\n changePhonePromise = undefined;\n codeInput.removeAttribute('disabled');\n });\n };\n headerElement.addEventListener('keypress', function (e) {\n if (e.key == 'Enter') {\n editable = false;\n headerElement.setAttribute('contenteditable', '' + editable);\n changePhone();\n }\n if (/\\D/.test(e.key)) {\n e.preventDefault();\n return false;\n }\n this.classList.remove('error');\n });\n editButton.addEventListener('click', function () {\n if (changePhonePromise)\n return;\n editable = !editable;\n headerElement.setAttribute('contenteditable', '' + editable);\n if (!editable)\n changePhone();\n });\n var submitCode = function (code) {\n codeInput.setAttribute('disabled', 'true');\n var params = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n phone_code: code\n };\n console.log('invoking auth.signIn with params:', params);\n mtproto_1.MTProto.apiManager.invokeApi('auth.signIn', params, options)\n .then(function (response) {\n console.log('auth.signIn response:', response);\n switch (response._) {\n case 'auth.authorization':\n mtproto_1.MTProto.apiManager.setUserAuth(options.dcID, {\n id: response.user.id\n });\n pageElement.style.display = 'none';\n pageIm_1.default();\n if (animation)\n animation.destroy();\n break;\n case 'auth.authorizationSignUpRequired':\n console.log('Registration needed!');\n pageElement.style.display = 'none';\n pageSignUp_1.default({\n 'phone_number': authCode.phone_number,\n 'phone_code_hash': authCode.phone_code_hash\n });\n if (animation)\n animation.destroy();\n break;\n default:\n codeInput.innerText = response._;\n break;\n }\n }).catch(function (err) {\n codeInput.removeAttribute('disabled');\n switch (err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\n err.handled = true;\n pageElement.style.display = 'none';\n if (animation)\n animation.destroy();\n pagePassword_1.default();\n break;\n case 'PHONE_CODE_EMPTY':\n case 'PHONE_CODE_INVALID':\n codeInput.classList.add('error');\n codeInputLabel.innerText = 'Invalid Code';\n break;\n default:\n codeInputLabel.innerText = err.type;\n break;\n }\n });\n };\n var max = 45;\n // 1st symbol = frame 15\n // end symbol = frame 165\n codeInput.addEventListener('input', function (e) {\n this.classList.remove('error');\n this.value = this.value.replace(/\\D/g, '');\n if (this.value.length > CODELENGTH) {\n this.value = this.value.slice(0, CODELENGTH);\n }\n var length = this.value.length;\n if (length == CODELENGTH) { // submit code\n submitCode(this.value);\n }\n else if (length == lastLength) {\n return;\n }\n lastLength = length;\n if (!animation)\n return;\n var frame;\n if (length)\n frame = Math.round((length > max ? max : length) * (165 / max) + 11.33);\n else\n frame = 0;\n //animation.playSegments([1, 2]);\n var direction = needFrame > frame ? -1 : 1;\n //console.log('keydown', length, frame, direction);\n // @ts-ignore\n animation.setDirection(direction);\n if (needFrame != 0 && frame == 0) {\n animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n needFrame = frame;\n animation.play();\n /* animation.goToAndStop(15, true); */\n //animation.goToAndStop(length / max * );\n });\n}); });\n"
},
{
"id": 43,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"name": "./src/components/pageSignUp.ts",
"index": 43,
"index2": 41,
"size": 7676,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"issuerId": 42,
"issuerName": "./src/components/pageAuthCode.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
}
],
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pageSignUp",
"loc": "17:35-58"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"../lib/mtproto\");\nvar misc_1 = require(\"./misc\");\nvar installed = false;\nvar authCode = null;\nvar cropper_1 = __importDefault(require(\"../lib/cropper\"));\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nexports.default = (function (_authCode) {\n authCode = _authCode;\n if (installed)\n return;\n installed = true;\n var pageElement = document.body.getElementsByClassName('page-signUp')[0];\n pageElement.style.display = '';\n var findUpClassName = function (el, className) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.classList.contains(className))\n return el;\n }\n return null;\n };\n Array.from(document.body.getElementsByClassName('popup-close')).forEach(function (el) {\n var popup = findUpClassName(el, 'popup');\n el.addEventListener('click', function () {\n popup.classList.remove('is-visible');\n });\n });\n var avatarInput = document.getElementById('avatar-input');\n var avatarPopup = pageElement.getElementsByClassName('popup-avatar')[0];\n var avatarPreview = pageElement.querySelector('#canvas-avatar');\n var cropContainer = avatarPopup.getElementsByClassName('crop')[0];\n var avatarImage = new Image();\n cropContainer.append(avatarImage);\n var avatarBlob;\n avatarPopup.getElementsByClassName('popup-close')[0]\n .addEventListener('click', function (e) {\n /* let popup = findUpClassName(this, 'popup');\n popup.classList.remove('is-visible'); */\n setTimeout(function () {\n cropper.removeHandlers();\n if (avatarImage) {\n avatarImage.remove();\n }\n }, 200);\n /* e.cancelBubble = true;\n return false; */\n });\n var cropper = {\n crop: function () { },\n removeHandlers: function () { }\n };\n // apply\n avatarPopup.getElementsByClassName('btn-crop')[0].addEventListener('click', function () {\n cropper.crop();\n avatarPopup.classList.remove('is-visible');\n cropper.removeHandlers();\n avatarPreview.toBlob(function (blob) {\n avatarBlob = blob; // save blob to send after reg\n // darken\n var ctx = avatarPreview.getContext('2d');\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\n ctx.fillRect(0, 0, avatarPreview.width, avatarPreview.height);\n });\n avatarImage.remove();\n });\n avatarInput.addEventListener('change', function (e) {\n var file = e.target.files[0];\n if (!file) {\n return;\n }\n /* console.log(file, typeof(file)); */\n // @ts-ignore\n /* MTProto.apiFileManager.uploadFile(file).then(function(inputFile) {\n console.log('uploaded smthn', inputFile);\n \n MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then(function (updateResult) {\n console.log('updated photo!');\n });\n }); */\n var reader = new FileReader();\n reader.onload = function (e) {\n var contents = e.target.result;\n avatarImage = new Image();\n cropContainer.append(avatarImage);\n avatarImage.src = contents;\n avatarImage.onload = function () {\n /* avatarPreviewCtx.drawImage(avatarImage,\n 70, 20, // Start at 70/20 pixels from the left and the top of the image (crop),\n 50, 50, // \"Get\" a `50 * 50` (w * h) area from the source image (crop),\n 0, 0, // Place the result at 0, 0 in the canvas,\n 100, 100); // With as width / height: 100 * 100 (scale) */\n cropper = cropper_1.default(avatarImage, avatarPreview);\n avatarInput.value = '';\n };\n avatarPopup.classList.add('is-visible');\n //console.log(contents);\n };\n reader.readAsDataURL(file);\n }, false);\n document.body.querySelector('.page-signUp .auth-image').addEventListener('click', function () {\n avatarInput.click();\n });\n var headerName = pageElement.getElementsByClassName('fullName')[0];\n var handleInput = function (e) {\n var name = fieldName.value || '';\n var lastName = fieldLastName.value || '';\n var fullName = name || lastName\n ? (name + ' ' + lastName).trim()\n : 'Your Name';\n if (headerName.innerText != fullName)\n headerName.innerText = fullName;\n this.classList.remove('error');\n };\n var sendAvatar = function () { return new Promise(function (resolve, reject) {\n if (!avatarBlob) {\n console.log('User has not selected avatar');\n return resolve();\n }\n console.log('invoking uploadFile...');\n // @ts-ignore\n mtproto_1.MTProto.apiFileManager.uploadFile(avatarBlob).then(function (inputFile) {\n console.log('uploaded smthn', inputFile);\n mtproto_1.MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then(function (updateResult) {\n console.log('updated photo!');\n resolve();\n }, reject);\n }, reject);\n }); };\n var fieldName = document.getElementById('name');\n fieldName.addEventListener('input', handleInput);\n var fieldLastName = document.getElementById('lastName');\n fieldLastName.addEventListener('input', handleInput);\n var signUpButton = document.getElementById('signUp');\n signUpButton.addEventListener('click', function (e) {\n var _this = this;\n this.setAttribute('disabled', 'true');\n if (!fieldName.value.length) {\n fieldName.classList.add('error');\n return false;\n }\n var name = fieldName.value;\n var lastName = fieldLastName.value;\n var params = {\n 'phone_number': authCode.phone_number,\n 'phone_code_hash': authCode.phone_code_hash,\n 'first_name': name,\n 'last_name': lastName\n };\n console.log('invoking auth.signUp with params:', params);\n this.textContent = 'PLEASE WAIT...';\n misc_1.putPreloader(this);\n mtproto_1.MTProto.apiManager.invokeApi('auth.signUp', params)\n .then(function (response) {\n console.log('auth.signUp response:', response);\n switch (response._) {\n case 'auth.authorization': // success\n mtproto_1.MTProto.apiManager.setUserAuth(Config.App.baseDcID, {\n id: response.user.id\n });\n sendAvatar().then(function () {\n pageElement.style.display = 'none';\n pageIm_1.default();\n });\n break;\n default:\n _this.innerText = response._;\n break;\n }\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\n pageAuthCode(Object.assign(code, {phoneNumber})); */\n }).catch(function (err) {\n _this.removeAttribute('disabled');\n switch (err.type) {\n default:\n _this.innerText = err.type;\n break;\n }\n });\n });\n});\n"
},
{
"id": 44,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cropper.ts",
"name": "./src/lib/cropper.ts",
"index": 44,
"index2": 40,
"size": 7697,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"issuerId": 43,
"issuerName": "./src/components/pageSignUp.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
},
{
"id": 43,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"name": "./src/components/pageSignUp.ts",
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
}
}
],
"profile": {
"factory": 224,
"building": 1316
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "../lib/cropper",
"loc": "10:32-57"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 4,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction resizeableImage(image_target, resize_canvas) {\n var cropComponent, container, crop_img, event_state = {}, ratio = 1.0, keyZoomValue = 4.0, MINWIDTH = 50, MINHEIGHT = 50, CROPWIDTH = 200, CROPHEIGHT = 200, cropLeft = 0, cropTop = 0, cropWidth = 0, cropHeight = 0;\n if (image_target.complete) {\n init();\n }\n else {\n image_target.onload = init;\n }\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n cropComponent.remove();\n container.remove();\n crop_img.remove();\n }\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n document.addEventListener('keypress', keyHandler, false);\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n function init() {\n var wraper, left, top;\n if (image_target.dataset.isCrop) {\n throw 'image is already crop';\n }\n image_target.dataset.isCrop = 'true';\n image_target.classList.add('crop-blur');\n image_target.draggable = false;\n crop_img = new Image();\n crop_img.crossOrigin = image_target.crossOrigin;\n crop_img.src = image_target.src;\n crop_img.draggable = false;\n if (!resize_canvas) {\n resize_canvas = document.createElement('canvas');\n }\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n container = document.createElement('div');\n container.classList.add('overlay');\n var overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n cropComponent.appendChild(container);\n wraper = image_target.parentNode;\n wraper.appendChild(cropComponent);\n cropComponent.appendChild(crop_img);\n cropComponent.appendChild(image_target);\n cropComponent.appendChild(overlayColor);\n container.appendChild(crop_img);\n crop_img.style.maxWidth = image_target.width + 'px';\n left = image_target.offsetWidth / 2 - CROPWIDTH / 2;\n top = image_target.offsetHeight / 2 - CROPHEIGHT / 2;\n updateCropImage(left, top);\n addHandlers();\n }\n function updateCropSize(width, height) {\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n function updateCropImage(left, top) {\n cropLeft = -left * ratio;\n cropTop = -top * ratio;\n crop_img.style.top = -top + 'px';\n crop_img.style.left = -left + 'px';\n }\n function updateContainer(left, top) {\n var _top = top + (CROPWIDTH / 2) + 'px';\n var _left = left + (CROPHEIGHT / 2) + 'px';\n container.style.top = _top;\n container.style.left = _left;\n }\n // Save the initial event details and container state\n function saveEventState(e) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n function imgZoom(zoom) {\n zoom = zoom * Math.PI * 2;\n var newWidth = Math.floor(container.clientWidth + zoom), newHeight = Math.floor(container.clientHeight + zoom), w = crop_img.clientWidth, h = crop_img.clientHeight, left, top, right, bottom;\n if (newWidth < MINWIDTH) {\n return;\n }\n else if (newWidth > w) {\n return;\n }\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n if (left < 0) {\n left = 0;\n }\n if (top < 0) {\n top = 0;\n }\n if (right > w) {\n return;\n }\n if (bottom > h) {\n return;\n }\n ratio = CROPWIDTH / newWidth;\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n //crop();\n }\n function keyHandler(e) {\n e.preventDefault();\n switch (String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n function resizing(e) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n function startMoving(e) {\n e.preventDefault();\n e.stopPropagation();\n saveEventState(e);\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n function endMoving(e) {\n e.preventDefault();\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n function moving(e) {\n var curuntTouch = { x: 0, y: 0 }, left, top, w, h;\n e.preventDefault();\n e.stopPropagation();\n curuntTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n curuntTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n left = curuntTouch.x - (event_state.mouse_x - event_state.container_left);\n top = curuntTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n if (left < 0) {\n left = 0;\n }\n else if (left > crop_img.offsetWidth - w) {\n left = crop_img.offsetWidth - w;\n }\n if (top < 0) {\n top = 0;\n }\n else if (top > crop_img.offsetHeight - h) {\n top = crop_img.offsetHeight - h;\n }\n updateCropImage(left, top);\n updateContainer(left, top);\n }\n function crop() {\n cropWidth = crop_img.width * ratio;\n cropHeight = crop_img.height * ratio;\n resize_canvas.width = CROPWIDTH;\n resize_canvas.height = CROPHEIGHT;\n var ctx = resize_canvas.getContext('2d');\n ctx.drawImage(crop_img, cropLeft, cropTop, cropWidth, cropHeight);\n }\n return { crop: crop, removeHandlers: removeHandlers };\n /* function openCropCanvasImg() {\n crop();\n \n try {\n var base64Img = resize_canvas.toDataURL('image/png', 1.0);\n window.open(base64Img);\n } catch(e) {\n alert(e);\n } finally {\n // removeHandlers();\n }\n \n } */\n}\n//resizeableImage(document.querySelector('.crop-image'));\nexports.default = resizeableImage;\n"
},
{
"id": 45,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"name": "./src/components/pagePassword.ts",
"index": 45,
"index2": 42,
"size": 4787,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"issuerId": 42,
"issuerName": "./src/components/pageAuthCode.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
}
],
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pagePassword",
"loc": "19:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"../lib/bin_utils\");\n//import { AnimationItem } from 'lottie-web';\nvar mtproto_1 = require(\"../lib/mtproto\");\n//import Lottie from 'lottie-web';\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nvar installed = false;\nvar authCode = null;\nexports.default = (function () { return Promise.resolve().then(function () { return __importStar(require('lottie-web')); }).then(function (Lottie) {\n if (installed)\n return;\n installed = true;\n var lottie = Lottie;\n //let lottie = Lottie.default;\n var needFrame = 0, lastLength = 0;\n var animation = /* AnimationItem */ undefined;\n var passwordVisible = false;\n var pageElement = document.body.getElementsByClassName('page-password')[0];\n pageElement.style.display = '';\n fetch('assets/img/TwoFactorSetupMonkeyClose.tgs')\n .then(function (res) { return res.arrayBuffer(); })\n .then(function (data) {\n var str = bin_utils_1.gzipUncompress(data, true);\n // @ts-ignore\n animation = lottie.loadAnimation({\n container: pageElement.querySelector('.auth-image'),\n renderer: 'svg',\n loop: false,\n autoplay: false,\n animationData: JSON.parse(str)\n });\n console.log(animation.getDuration(true));\n //animation.goToAndStop(822);\n animation.addEventListener('enterFrame', function (e) {\n //console.log('enterFrame', e, needFrame);\n var currentFrame = Math.round(e.currentTime);\n if ((e.direction == 1 && currentFrame >= needFrame) ||\n (e.direction == -1 && currentFrame <= needFrame)) {\n animation.setSpeed(1);\n animation.pause();\n }\n });\n needFrame = 49;\n animation.play();\n });\n var btnNext = pageElement.querySelector('button');\n var passwordInput = document.getElementById('password');\n var passwordInputLabel = passwordInput.nextElementSibling;\n var toggleVisible = pageElement.querySelector('.toggle-visible');\n var handleError = function (err) {\n btnNext.removeAttribute('disabled');\n switch (err.type) {\n default:\n btnNext.innerText = err.type;\n break;\n }\n };\n toggleVisible.addEventListener('click', function (e) {\n if (!passwordVisible) {\n this.classList.add('tgico-eye2');\n passwordInput.setAttribute('type', 'text');\n animation.setDirection(-1);\n needFrame = 0;\n animation.play();\n }\n else {\n this.classList.remove('tgico-eye2');\n passwordInput.setAttribute('type', 'password');\n animation.setDirection(1);\n needFrame = 49;\n animation.play();\n }\n passwordVisible = !passwordVisible;\n });\n btnNext.addEventListener('click', function (e) {\n if (!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n this.setAttribute('disabled', 'true');\n var value = passwordInput.value;\n mtproto_1.MTProto.passwordManager.getState()\n .then(function (state) {\n console.log(state);\n mtproto_1.MTProto.passwordManager.check(state, value, { dcID: Config.App.baseDcID }).then(function (response) {\n console.log('passwordManager response:', response);\n switch (response._) {\n case 'auth.authorization':\n mtproto_1.MTProto.apiManager.setUserAuth(Config.App.baseDcID, {\n id: response.user.id\n });\n pageElement.style.display = 'none';\n pageIm_1.default();\n if (animation)\n animation.destroy();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNext.innerText = response._;\n break;\n }\n }).catch(handleError);\n }).catch(handleError);\n });\n passwordInput.addEventListener('input', function (e) {\n this.classList.remove('error');\n });\n}); });\n"
},
{
"id": 46,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/countries.json",
"name": "./src/countries.json",
"index": 46,
"index2": 44,
"size": 12648,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"issuerId": 41,
"issuerName": "./src/components/pageSignIn.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../countries.json",
"loc": "21:61-89"
}
],
"usedExports": true,
"providedExports": [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
"38",
"39",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"50",
"51",
"52",
"53",
"54",
"55",
"56",
"57",
"58",
"59",
"60",
"61",
"62",
"63",
"64",
"65",
"66",
"67",
"68",
"69",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"80",
"81",
"82",
"83",
"84",
"85",
"86",
"87",
"88",
"89",
"90",
"91",
"92",
"93",
"94",
"95",
"96",
"97",
"98",
"99",
"100",
"101",
"102",
"103",
"104",
"105",
"106",
"107",
"108",
"109",
"110",
"111",
"112",
"113",
"114",
"115",
"116",
"117",
"118",
"119",
"120",
"121",
"122",
"123",
"124",
"125",
"126",
"127",
"128",
"129",
"130",
"131",
"132",
"133",
"134",
"135",
"136",
"137",
"138",
"139",
"140",
"141",
"142",
"143",
"144",
"145",
"146",
"147",
"148",
"149",
"150",
"151",
"152",
"153",
"154",
"155",
"156",
"157",
"158",
"159",
"160",
"161",
"162",
"163",
"164",
"165",
"166",
"167",
"168",
"169",
"170",
"171",
"172",
"173",
"174",
"175",
"176",
"177",
"178",
"179",
"180",
"181",
"182",
"183",
"184",
"185",
"186",
"187",
"188",
"189",
"190",
"191",
"192",
"193",
"194",
"195",
"196",
"197",
"198",
"199",
"200",
"201",
"202",
"203",
"204",
"205",
"206",
"207",
"208",
"209",
"210",
"211",
"212",
"213",
"214",
"215",
"216",
"217",
"218",
"219",
"220",
"221",
"222",
"223",
"224",
"225",
"226",
"227",
"228",
"229",
"230",
"231",
"232",
"233",
"234",
"235",
"236",
"237",
"238",
"239",
"240",
"241",
"242",
"243",
"244",
"default"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "[{\"name\":\"Afghanistan\",\"code\":\"AF\",\"phoneCode\":\"93\"},{\"name\":\"Aland Islands\",\"code\":\"AX\",\"phoneCode\":\"35818\"},{\"name\":\"Albania\",\"code\":\"AL\",\"phoneCode\":\"355\"},{\"name\":\"Algeria\",\"code\":\"DZ\",\"phoneCode\":\"213\"},{\"name\":\"American Samoa\",\"code\":\"AS\",\"phoneCode\":\"1684\"},{\"name\":\"Andorra\",\"code\":\"AD\",\"phoneCode\":\"376\"},{\"name\":\"Angola\",\"code\":\"AO\",\"phoneCode\":\"244\"},{\"name\":\"Anguilla\",\"code\":\"AI\",\"phoneCode\":\"1264\"},{\"name\":\"Antigua and Barbuda\",\"code\":\"AG\",\"phoneCode\":\"1268\"},{\"name\":\"Argentina\",\"code\":\"AR\",\"phoneCode\":\"54\"},{\"name\":\"Armenia\",\"code\":\"AM\",\"phoneCode\":\"374\"},{\"name\":\"Aruba\",\"code\":\"AW\",\"phoneCode\":\"297\"},{\"name\":\"Australia\",\"code\":\"AU\",\"phoneCode\":\"61\"},{\"name\":\"Austria\",\"code\":\"AT\",\"phoneCode\":\"43\"},{\"name\":\"Azerbaijan\",\"code\":\"AZ\",\"phoneCode\":\"994\"},{\"name\":\"Bahamas\",\"code\":\"BS\",\"phoneCode\":\"1242\"},{\"name\":\"Bahrain\",\"code\":\"BH\",\"phoneCode\":\"973\"},{\"name\":\"Bangladesh\",\"code\":\"BD\",\"phoneCode\":\"880\"},{\"name\":\"Barbados\",\"code\":\"BB\",\"phoneCode\":\"1246\"},{\"name\":\"Belarus\",\"code\":\"BY\",\"phoneCode\":\"375\"},{\"name\":\"Belgium\",\"code\":\"BE\",\"phoneCode\":\"32\"},{\"name\":\"Belize\",\"code\":\"BZ\",\"phoneCode\":\"501\"},{\"name\":\"Benin\",\"code\":\"BJ\",\"phoneCode\":\"229\"},{\"name\":\"Bermuda\",\"code\":\"BM\",\"phoneCode\":\"1441\"},{\"name\":\"Bhutan\",\"code\":\"BT\",\"phoneCode\":\"975\"},{\"name\":\"Bolivia\",\"code\":\"BO\",\"phoneCode\":\"591\"},{\"name\":\"Bonaire, Saint Eustatius and Saba \",\"code\":\"BQ\",\"phoneCode\":\"599\"},{\"name\":\"Bosnia and Herzegovina\",\"code\":\"BA\",\"phoneCode\":\"387\"},{\"name\":\"Botswana\",\"code\":\"BW\",\"phoneCode\":\"267\"},{\"name\":\"Brazil\",\"code\":\"BR\",\"phoneCode\":\"55\"},{\"name\":\"British Indian Ocean Territory\",\"code\":\"IO\",\"phoneCode\":\"246\"},{\"name\":\"British Virgin Islands\",\"code\":\"VG\",\"phoneCode\":\"1284\"},{\"name\":\"Brunei\",\"code\":\"BN\",\"phoneCode\":\"673\"},{\"name\":\"Bulgaria\",\"code\":\"BG\",\"phoneCode\":\"359\"},{\"name\":\"Burkina Faso\",\"code\":\"BF\",\"phoneCode\":\"226\"},{\"name\":\"Burundi\",\"code\":\"BI\",\"phoneCode\":\"257\"},{\"name\":\"Cambodia\",\"code\":\"KH\",\"phoneCode\":\"855\"},{\"name\":\"Cameroon\",\"code\":\"CM\",\"phoneCode\":\"237\"},{\"name\":\"Canada\",\"code\":\"CA\",\"phoneCode\":\"1\"},{\"name\":\"Cape Verde\",\"code\":\"CV\",\"phoneCode\":\"238\"},{\"name\":\"Cayman Islands\",\"code\":\"KY\",\"phoneCode\":\"1345\"},{\"name\":\"Central African Republic\",\"code\":\"CF\",\"phoneCode\":\"236\"},{\"name\":\"Chad\",\"code\":\"TD\",\"phoneCode\":\"235\"},{\"name\":\"Chile\",\"code\":\"CL\",\"phoneCode\":\"56\"},{\"name\":\"China\",\"code\":\"CN\",\"phoneCode\":\"86\"},{\"name\":\"Christmas Island\",\"code\":\"CX\",\"phoneCode\":\"61\"},{\"name\":\"Cocos Islands\",\"code\":\"CC\",\"phoneCode\":\"61\"},{\"name\":\"Colombia\",\"code\":\"CO\",\"phoneCode\":\"57\"},{\"name\":\"Comoros\",\"code\":\"KM\",\"phoneCode\":\"269\"},{\"name\":\"Cook Islands\",\"code\":\"CK\",\"phoneCode\":\"682\"},{\"name\":\"Costa Rica\",\"code\":\"CR\",\"phoneCode\":\"506\"},{\"name\":\"Croatia\",\"code\":\"HR\",\"phoneCode\":\"385\"},{\"name\":\"Cuba\",\"code\":\"CU\",\"phoneCode\":\"53\"},{\"name\":\"Curacao\",\"code\":\"CW\",\"phoneCode\":\"599\"},{\"name\":\"Cyprus\",\"code\":\"CY\",\"phoneCode\":\"357\"},{\"name\":\"Czech Republic\",\"code\":\"CZ\",\"phoneCode\":\"420\"},{\"name\":\"Democratic Republic of the Congo\",\"code\":\"CD\",\"phoneCode\":\"243\"},{\"name\":\"Denmark\",\"code\":\"DK\",\"phoneCode\":\"45\"},{\"name\":\"Djibouti\",\"code\":\"DJ\",\"phoneCode\":\"253\"},{\"name\":\"Dominica\",\"code\":\"DM\",\"phoneCode\":\"1767\"},{\"name\":\"Dominican Republic\",\"code\":\"DO\",\"phoneCode\":\"1809 and 1829\"},{\"name\":\"East Timor\",\"code\":\"TL\",\"phoneCode\":\"670\"},{\"name\":\"Ecuador\",\"code\":\"EC\",\"phoneCode\":\"593\"},{\"name\":\"Egypt\",\"code\":\"EG\",\"phoneCode\":\"20\"},{\"name\":\"El Salvador\",\"code\":\"SV\",\"phoneCode\":\"503\"},{\"name\":\"Equatorial Guinea\",\"code\":\"GQ\",\"phoneCode\":\"240\"},{\"name\":\"Eritrea\",\"code\":\"ER\",\"phoneCode\":\"291\"},{\"name\":\"Estonia\",\"code\":\"EE\",\"phoneCode\":\"372\"},{\"name\":\"Ethiopia\",\"code\":\"ET\",\"phoneCode\":\"251\"},{\"name\":\"Falkland Islands\",\"code\":\"FK\",\"phoneCode\":\"500\"},{\"name\":\"Faroe Islands\",\"code\":\"FO\",\"phoneCode\":\"298\"},{\"name\":\"Fiji\",\"code\":\"FJ\",\"phoneCode\":\"679\"},{\"name\":\"Finland\",\"code\":\"FI\",\"phoneCode\":\"358\"},{\"name\":\"France\",\"code\":\"FR\",\"phoneCode\":\"33\"},{\"name\":\"French Guiana\",\"code\":\"GF\",\"phoneCode\":\"594\"},{\"name\":\"French Polynesia\",\"code\":\"PF\",\"phoneCode\":\"689\"},{\"name\":\"Gabon\",\"code\":\"GA\",\"phoneCode\":\"241\"},{\"name\":\"Gambia\",\"code\":\"GM\",\"phoneCode\":\"220\"},{\"name\":\"Georgia\",\"code\":\"GE\",\"phoneCode\":\"995\"},{\"name\":\"Germany\",\"code\":\"DE\",\"phoneCode\":\"49\"},{\"name\":\"Ghana\",\"code\":\"GH\",\"phoneCode\":\"233\"},{\"name\":\"Gibraltar\",\"code\":\"GI\",\"phoneCode\":\"350\"},{\"name\":\"Greece\",\"code\":\"GR\",\"phoneCode\":\"30\"},{\"name\":\"Greenland\",\"code\":\"GL\",\"phoneCode\":\"299\"},{\"name\":\"Grenada\",\"code\":\"GD\",\"phoneCode\":\"1473\"},{\"name\":\"Guadeloupe\",\"code\":\"GP\",\"phoneCode\":\"590\"},{\"name\":\"Guam\",\"code\":\"GU\",\"phoneCode\":\"1671\"},{\"name\":\"Guatemala\",\"code\":\"GT\",\"phoneCode\":\"502\"},{\"name\":\"Guernsey\",\"code\":\"GG\",\"phoneCode\":\"441481\"},{\"name\":\"Guinea\",\"code\":\"GN\",\"phoneCode\":\"224\"},{\"name\":\"Guinea-Bissau\",\"code\":\"GW\",\"phoneCode\":\"245\"},{\"name\":\"Guyana\",\"code\":\"GY\",\"phoneCode\":\"592\"},{\"name\":\"Haiti\",\"code\":\"HT\",\"phoneCode\":\"509\"},{\"name\":\"Heard Island and McDonald Islands\",\"code\":\"HM\",\"phoneCode\":\" \"},{\"name\":\"Honduras\",\"code\":\"HN\",\"phoneCode\":\"504\"},{\"name\":\"Hong Kong\",\"code\":\"HK\",\"phoneCode\":\"852\"},{\"name\":\"Hungary\",\"code\":\"HU\",\"phoneCode\":\"36\"},{\"name\":\"Iceland\",\"code\":\"IS\",\"phoneCode\":\"354\"},{\"name\":\"India\",\"code\":\"IN\",\"phoneCode\":\"91\"},{\"name\":\"Indonesia\",\"code\":\"ID\",\"phoneCode\":\"62\"},{\"name\":\"Iran\",\"code\":\"IR\",\"phoneCode\":\"98\"},{\"name\":\"Iraq\",\"code\":\"IQ\",\"phoneCode\":\"964\"},{\"name\":\"Ireland\",\"code\":\"IE\",\"phoneCode\":\"353\"},{\"name\":\"Isle of Man\",\"code\":\"IM\",\"phoneCode\":\"441624\"},{\"name\":\"Israel\",\"code\":\"IL\",\"phoneCode\":\"972\"},{\"name\":\"Italy\",\"code\":\"IT\",\"phoneCode\":\"39\"},{\"name\":\"Ivory Coast\",\"code\":\"CI\",\"phoneCode\":\"225\"},{\"name\":\"Jamaica\",\"code\":\"JM\",\"phoneCode\":\"1876\"},{\"name\":\"Japan\",\"code\":\"JP\",\"phoneCode\":\"81\"},{\"name\":\"Jersey\",\"code\":\"JE\",\"phoneCode\":\"441534\"},{\"name\":\"Jordan\",\"code\":\"JO\",\"phoneCode\":\"962\"},{\"name\":\"Kazakhstan\",\"code\":\"KZ\",\"phoneCode\":\"7\"},{\"name\":\"Kenya\",\"code\":\"KE\",\"phoneCode\":\"254\"},{\"name\":\"Kiribati\",\"code\":\"KI\",\"phoneCode\":\"686\"},{\"name\":\"Kuwait\",\"code\":\"KW\",\"phoneCode\":\"965\"},{\"name\":\"Kyrgyzstan\",\"code\":\"KG\",\"phoneCode\":\"996\"},{\"name\":\"Laos\",\"code\":\"LA\",\"phoneCode\":\"856\"},{\"name\":\"Latvia\",\"code\":\"LV\",\"phoneCode\":\"371\"},{\"name\":\"Lebanon\",\"code\":\"LB\",\"phoneCode\":\"961\"},{\"name\":\"Lesotho\",\"code\":\"LS\",\"phoneCode\":\"266\"},{\"name\":\"Liberia\",\"code\":\"LR\",\"phoneCode\":\"231\"},{\"name\":\"Libya\",\"code\":\"LY\",\"phoneCode\":\"218\"},{\"name\":\"Liechtenstein\",\"code\":\"LI\",\"phoneCode\":\"423\"},{\"name\":\"Lithuania\",\"code\":\"LT\",\"phoneCode\":\"370\"},{\"name\":\"Luxembourg\",\"code\":\"LU\",\"phoneCode\":\"352\"},{\"name\":\"Macao\",\"code\":\"MO\",\"phoneCode\":\"853\"},{\"name\":\"Macedonia\",\"code\":\"MK\",\"phoneCode\":\"389\"},{\"name\":\"Madagascar\",\"code\":\"MG\",\"phoneCode\":\"261\"},{\"name\":\"Malawi\",\"code\":\"MW\",\"phoneCode\":\"265\"},{\"name\":\"Malaysia\",\"code\":\"MY\",\"phoneCode\":\"60\"},{\"name\":\"Maldives\",\"code\":\"MV\",\"phoneCode\":\"960\"},{\"name\":\"Mali\",\"code\":\"ML\",\"phoneCode\":\"223\"},{\"name\":\"Malta\",\"code\":\"MT\",\"phoneCode\":\"356\"},{\"name\":\"Marshall Islands\",\"code\":\"MH\",\"phoneCode\":\"692\"},{\"name\":\"Martinique\",\"code\":\"MQ\",\"phoneCode\":\"596\"},{\"name\":\"Mauritania\",\"code\":\"MR\",\"phoneCode\":\"222\"},{\"name\":\"Mauritius\",\"code\":\"MU\",\"phoneCode\":\"230\"},{\"name\":\"Mayotte\",\"code\":\"YT\",\"phoneCode\":\"262\"},{\"name\":\"Mexico\",\"code\":\"MX\",\"phoneCode\":\"52\"},{\"name\":\"Micronesia\",\"code\":\"FM\",\"phoneCode\":\"691\"},{\"name\":\"Moldova\",\"code\":\"MD\",\"phoneCode\":\"373\"},{\"name\":\"Monaco\",\"code\":\"MC\",\"phoneCode\":\"377\"},{\"name\":\"Mongolia\",\"code\":\"MN\",\"phoneCode\":\"976\"},{\"name\":\"Montenegro\",\"code\":\"ME\",\"phoneCode\":\"382\"},{\"name\":\"Montserrat\",\"code\":\"MS\",\"phoneCode\":\"1664\"},{\"name\":\"Morocco\",\"code\":\"MA\",\"phoneCode\":\"212\"},{\"name\":\"Mozambique\",\"code\":\"MZ\",\"phoneCode\":\"258\"},{\"name\":\"Myanmar\",\"code\":\"MM\",\"phoneCode\":\"95\"},{\"name\":\"Namibia\",\"code\":\"NA\",\"phoneCode\":\"264\"},{\"name\":\"Nauru\",\"code\":\"NR\",\"phoneCode\":\"674\"},{\"name\":\"Nepal\",\"code\":\"NP\",\"phoneCode\":\"977\"},{\"name\":\"Netherlands\",\"code\":\"NL\",\"phoneCode\":\"31\"},{\"name\":\"New Caledonia\",\"code\":\"NC\",\"phoneCode\":\"687\"},{\"name\":\"New Zealand\",\"code\":\"NZ\",\"phoneCode\":\"64\"},{\"name\":\"Nicaragua\",\"code\":\"NI\",\"phoneCode\":\"505\"},{\"name\":\"Niger\",\"code\":\"NE\",\"phoneCode\":\"227\"},{\"name\":\"Nigeria\",\"code\":\"NG\",\"phoneCode\":\"234\"},{\"name\":\"Niue\",\"code\":\"NU\",\"phoneCode\":\"683\"},{\"name\":\"Norfolk Island\",\"code\":\"NF\",\"phoneCode\":\"672\"},{\"name\":\"North Korea\",\"code\":\"KP\",\"phoneCode\":\"850\"},{\"name\":\"Northern Mariana Islands\",\"code\":\"MP\",\"phoneCode\":\"1670\"},{\"name\":\"Norway\",\"code\":\"NO\",\"phoneCode\":\"47\"},{\"name\":\"Oman\",\"code\":\"OM\",\"phoneCode\":\"968\"},{\"name\":\"Pakistan\",\"code\":\"PK\",\"phoneCode\":\"92\"},{\"name\":\"Palau\",\"code\":\"PW\",\"phoneCode\":\"680\"},{\"name\":\"Palestinian Territory\",\"code\":\"PS\",\"phoneCode\":\"970\"},{\"name\":\"Panama\",\"code\":\"PA\",\"phoneCode\":\"507\"},{\"name\":\"Papua New Guinea\",\"code\":\"PG\",\"phoneCode\":\"675\"},{\"name\":\"Paraguay\",\"code\":\"PY\",\"phoneCode\":\"595\"},{\"name\":\"Peru\",\"code\":\"PE\",\"phoneCode\":\"51\"},{\"name\":\"Philippines\",\"code\":\"PH\",\"phoneCode\":\"63\"},{\"name\":\"Pitcairn\",\"code\":\"PN\",\"phoneCode\":\"870\"},{\"name\":\"Poland\",\"code\":\"PL\",\"phoneCode\":\"48\"},{\"name\":\"Portugal\",\"code\":\"PT\",\"phoneCode\":\"351\"},{\"name\":\"Puerto Rico\",\"code\":\"PR\",\"phoneCode\":\"1787 and 1939\"},{\"name\":\"Qatar\",\"code\":\"QA\",\"phoneCode\":\"974\"},{\"name\":\"Republic of the Congo\",\"code\":\"CG\",\"phoneCode\":\"242\"},{\"name\":\"Reunion\",\"code\":\"RE\",\"phoneCode\":\"262\"},{\"name\":\"Romania\",\"code\":\"RO\",\"phoneCode\":\"40\"},{\"name\":\"Russia\",\"code\":\"RU\",\"phoneCode\":\"7\"},{\"name\":\"Rwanda\",\"code\":\"RW\",\"phoneCode\":\"250\"},{\"name\":\"Saint Barthelemy\",\"code\":\"BL\",\"phoneCode\":\"590\"},{\"name\":\"Saint Helena\",\"code\":\"SH\",\"phoneCode\":\"290\"},{\"name\":\"Saint Kitts and Nevis\",\"code\":\"KN\",\"phoneCode\":\"1869\"},{\"name\":\"Saint Lucia\",\"code\":\"LC\",\"phoneCode\":\"1758\"},{\"name\":\"Saint Martin\",\"code\":\"MF\",\"phoneCode\":\"590\"},{\"name\":\"Saint Pierre and Miquelon\",\"code\":\"PM\",\"phoneCode\":\"508\"},{\"name\":\"Saint Vincent and the Grenadines\",\"code\":\"VC\",\"phoneCode\":\"1784\"},{\"name\":\"Samoa\",\"code\":\"WS\",\"phoneCode\":\"685\"},{\"name\":\"San Marino\",\"code\":\"SM\",\"phoneCode\":\"378\"},{\"name\":\"Sao Tome and Principe\",\"code\":\"ST\",\"phoneCode\":\"239\"},{\"name\":\"Saudi Arabia\",\"code\":\"SA\",\"phoneCode\":\"966\"},{\"name\":\"Senegal\",\"code\":\"SN\",\"phoneCode\":\"221\"},{\"name\":\"Serbia\",\"code\":\"RS\",\"phoneCode\":\"381\"},{\"name\":\"Seychelles\",\"code\":\"SC\",\"phoneCode\":\"248\"},{\"name\":\"Sierra Leone\",\"code\":\"SL\",\"phoneCode\":\"232\"},{\"name\":\"Singapore\",\"code\":\"SG\",\"phoneCode\":\"65\"},{\"name\":\"Sint Maarten\",\"code\":\"SX\",\"phoneCode\":\"599\"},{\"name\":\"Slovakia\",\"code\":\"SK\",\"phoneCode\":\"421\"},{\"name\":\"Slovenia\",\"code\":\"SI\",\"phoneCode\":\"386\"},{\"name\":\"Solomon Islands\",\"code\":\"SB\",\"phoneCode\":\"677\"},{\"name\":\"Somalia\",\"code\":\"SO\",\"phoneCode\":\"252\"},{\"name\":\"South Africa\",\"code\":\"ZA\",\"phoneCode\":\"27\"},{\"name\":\"South Korea\",\"code\":\"KR\",\"phoneCode\":\"82\"},{\"name\":\"South Sudan\",\"code\":\"SS\",\"phoneCode\":\"211\"},{\"name\":\"Spain\",\"code\":\"ES\",\"phoneCode\":\"34\"},{\"name\":\"Sri Lanka\",\"code\":\"LK\",\"phoneCode\":\"94\"},{\"name\":\"Sudan\",\"code\":\"SD\",\"phoneCode\":\"249\"},{\"name\":\"Suriname\",\"code\":\"SR\",\"phoneCode\":\"597\"},{\"name\":\"Svalbard and Jan Mayen\",\"code\":\"SJ\",\"phoneCode\":\"47\"},{\"name\":\"Swaziland\",\"code\":\"SZ\",\"phoneCode\":\"268\"},{\"name\":\"Sweden\",\"code\":\"SE\",\"phoneCode\":\"46\"},{\"name\":\"Switzerland\",\"code\":\"CH\",\"phoneCode\":\"41\"},{\"name\":\"Syria\",\"code\":\"SY\",\"phoneCode\":\"963\"},{\"name\":\"Taiwan\",\"code\":\"TW\",\"phoneCode\":\"886\"},{\"name\":\"Tajikistan\",\"code\":\"TJ\",\"phoneCode\":\"992\"},{\"name\":\"Tanzania\",\"code\":\"TZ\",\"phoneCode\":\"255\"},{\"name\":\"Thailand\",\"code\":\"TH\",\"phoneCode\":\"66\"},{\"name\":\"Togo\",\"code\":\"TG\",\"phoneCode\":\"228\"},{\"name\":\"Tokelau\",\"code\":\"TK\",\"phoneCode\":\"690\"},{\"name\":\"Tonga\",\"code\":\"TO\",\"phoneCode\":\"676\"},{\"name\":\"Trinidad and Tobago\",\"code\":\"TT\",\"phoneCode\":\"1868\"},{\"name\":\"Tunisia\",\"code\":\"TN\",\"phoneCode\":\"216\"},{\"name\":\"Turkey\",\"code\":\"TR\",\"phoneCode\":\"90\"},{\"name\":\"Turkmenistan\",\"code\":\"TM\",\"phoneCode\":\"993\"},{\"name\":\"Turks and Caicos Islands\",\"code\":\"TC\",\"phoneCode\":\"1649\"},{\"name\":\"Tuvalu\",\"code\":\"TV\",\"phoneCode\":\"688\"},{\"name\":\"U.S. Virgin Islands\",\"code\":\"VI\",\"phoneCode\":\"1340\"},{\"name\":\"Uganda\",\"code\":\"UG\",\"phoneCode\":\"256\"},{\"name\":\"Ukraine\",\"code\":\"UA\",\"phoneCode\":\"380\"},{\"name\":\"United Arab Emirates\",\"code\":\"AE\",\"phoneCode\":\"971\"},{\"name\":\"United Kingdom\",\"code\":\"GB\",\"phoneCode\":\"44\"},{\"name\":\"United States\",\"code\":\"US\",\"phoneCode\":\"1\"},{\"name\":\"United States Minor Outlying Islands\",\"code\":\"UM\",\"phoneCode\":\"1\"},{\"name\":\"Uruguay\",\"code\":\"UY\",\"phoneCode\":\"598\"},{\"name\":\"Uzbekistan\",\"code\":\"UZ\",\"phoneCode\":\"998\"},{\"name\":\"Vanuatu\",\"code\":\"VU\",\"phoneCode\":\"678\"},{\"name\":\"Vatican\",\"code\":\"VA\",\"phoneCode\":\"379\"},{\"name\":\"Venezuela\",\"code\":\"VE\",\"phoneCode\":\"58\"},{\"name\":\"Vietnam\",\"code\":\"VN\",\"phoneCode\":\"84\"},{\"name\":\"Wallis and Futuna\",\"code\":\"WF\",\"phoneCode\":\"681\"},{\"name\":\"Western Sahara\",\"code\":\"EH\",\"phoneCode\":\"212\"},{\"name\":\"Yemen\",\"code\":\"YE\",\"phoneCode\":\"967\"},{\"name\":\"Zambia\",\"code\":\"ZM\",\"phoneCode\":\"260\"},{\"name\":\"Zimbabwe\",\"code\":\"ZW\",\"phoneCode\":\"263\"}]"
}
],
"filteredModules": 0,
"origins": [
{
"module": "",
"moduleIdentifier": "",
"moduleName": "",
"loc": "main",
"request": "./src/index.ts",
"reasons": []
}
]
}
],
"modules": [
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/utils.js",
"name": "./src/lib/utils.js",
"index": 29,
"index2": 26,
"size": 19444,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "58:14-32"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "38:14-32"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "17:14-32"
},
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "6:14-32"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony side effect evaluation",
"userRequest": "./utils",
"loc": "1:0-59"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "108:14-26"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "345:32-36"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "367:11-25"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "398:8-22"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "426:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "439:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "457:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "468:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "470:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "483:18-32"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "490:12-26"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "506:76-90"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "536:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "538:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "559:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "565:65-79"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "566:10-24"
},
{
"moduleId": 17,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"module": "./src/lib/richtextprocessor.js",
"moduleName": "./src/lib/richtextprocessor.js",
"type": "harmony import specifier",
"userRequest": "./utils",
"loc": "576:12-26"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./utils",
"loc": "13:14-32"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/utils",
"loc": "18:14-37"
}
],
"usedExports": true,
"providedExports": [
"dT",
"isObject",
"tsNow",
"safeReplaceObject",
"numberWithCommas",
"isElementInViewport",
"copy",
"ripple",
"encodeEntities",
"calcImageInBox",
"emojiUnicode",
"countryCodeEmoji",
"unifiedCountryCodeEmoji",
"SearchIndexManager"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/pageSignIn.ts (referenced with cjs require), ./src/lib/cryptoworker.ts (referenced with cjs require), ./src/lib/mtnetworker.ts (referenced with cjs require), ./src/lib/mtproto.ts (referenced with cjs require), ./src/lib/services.ts (referenced with cjs require), ./src/lib/tl_utils.ts (referenced with cjs require)"
],
"depth": 2,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\nvar _logTimer = (new Date()).getTime()\r\nexport function dT () {\r\n return '[' + (((new Date()).getTime() - _logTimer) / 1000).toFixed(3) + ']'\r\n}\r\n\r\nfunction checkClick (e, noprevent) {\r\n if (e.which == 1 && (e.ctrlKey || e.metaKey) || e.which == 2) {\r\n return true\r\n }\r\n\r\n if (!noprevent) {\r\n e.preventDefault()\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction isInDOM (element, parentNode) {\r\n if (!element) {\r\n return false\r\n }\r\n parentNode = parentNode || document.body\r\n if (element == parentNode) {\r\n return true\r\n }\r\n return isInDOM(element.parentNode, parentNode)\r\n}\r\n\r\nfunction checkDragEvent (e) {\r\n if (!e || e.target && (e.target.tagName == 'IMG' || e.target.tagName == 'A')) return false\r\n if (e.dataTransfer && e.dataTransfer.types) {\r\n for (var i = 0; i < e.dataTransfer.types.length; i++) {\r\n if (e.dataTransfer.types[i] == 'Files') {\r\n return true\r\n }\r\n }\r\n } else {\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction cancelEvent (event) {\r\n event = event || window.event\r\n if (event) {\r\n event = event.originalEvent || event\r\n\r\n if (event.stopPropagation) event.stopPropagation()\r\n if (event.preventDefault) event.preventDefault()\r\n event.returnValue = false\r\n event.cancelBubble = true\r\n }\r\n\r\n return false\r\n}\r\n\r\nfunction hasOnclick (element) {\r\n if (element.onclick ||\r\n element.getAttribute('ng-click')) {\r\n return true\r\n }\r\n var events = $._data(element, 'events')\r\n if (events && (events.click || events.mousedown)) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nfunction getScrollWidth () {\r\n var outer = $('<div>').css({\r\n position: 'absolute',\r\n width: 100,\r\n height: 100,\r\n overflow: 'scroll',\r\n top: -9999\r\n }).appendTo($(document.body))\r\n\r\n var scrollbarWidth = outer[0].offsetWidth - outer[0].clientWidth\r\n outer.remove()\r\n\r\n return scrollbarWidth\r\n}\r\n\r\nfunction onCtrlEnter (textarea, cb) {\r\n $(textarea).on('keydown', function (e) {\r\n if (e.keyCode == 13 && (e.ctrlKey || e.metaKey)) {\r\n cb()\r\n return cancelEvent(e)\r\n }\r\n })\r\n}\r\n\r\nfunction setFieldSelection (field, from, to) {\r\n field = $(field)[0]\r\n try {\r\n field.focus()\r\n if (from === undefined || from === false) {\r\n from = field.value.length\r\n }\r\n if (to === undefined || to === false) {\r\n to = from\r\n }\r\n if (field.createTextRange) {\r\n var range = field.createTextRange()\r\n range.collapse(true)\r\n range.moveEnd('character', to)\r\n range.moveStart('character', from)\r\n range.select()\r\n }\r\n else if (field.setSelectionRange) {\r\n field.setSelectionRange(from, to)\r\n }\r\n } catch(e) {}\r\n}\r\n\r\nfunction getFieldSelection (field) {\r\n if (field.selectionStart) {\r\n return field.selectionStart\r\n }\r\n else if (!document.selection) {\r\n return 0\r\n }\r\n\r\n var c = '\\x01'\r\n var sel = document.selection.createRange()\r\n var txt = sel.text\r\n var dup = sel.duplicate()\r\n var len = 0\r\n\r\n try {\r\n dup.moveToElementText(field)\r\n } catch(e) {\r\n return 0\r\n }\r\n\r\n sel.text = txt + c\r\n len = dup.text.indexOf(c)\r\n sel.moveStart('character', -1)\r\n sel.text = ''\r\n\r\n // if (browser.msie && len == -1) {\r\n // return field.value.length\r\n // }\r\n return len\r\n}\r\n\r\nfunction getRichValue (field) {\r\n if (!field) {\r\n return ''\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n getRichElementValue(field, lines, line)\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return value\r\n}\r\n\r\nfunction getRichValueWithCaret (field) {\r\n if (!field) {\r\n return []\r\n }\r\n var lines = []\r\n var line = []\r\n\r\n var sel = window.getSelection ? window.getSelection() : false\r\n var selNode\r\n var selOffset\r\n if (sel && sel.rangeCount) {\r\n var range = sel.getRangeAt(0)\r\n if (range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n range.startOffset == range.endOffset) {\r\n selNode = range.startContainer\r\n selOffset = range.startOffset\r\n }\r\n }\r\n\r\n getRichElementValue(field, lines, line, selNode, selOffset)\r\n\r\n if (line.length) {\r\n lines.push(line.join(''))\r\n }\r\n\r\n var value = lines.join('\\n')\r\n var caretPos = value.indexOf('\\x01')\r\n if (caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1)\r\n }\r\n value = value.replace(/\\u00A0/g, ' ')\r\n\r\n return [value, caretPos]\r\n}\r\n\r\nfunction getRichElementValue (node, lines, line, selNode, selOffset) {\r\n if (node.nodeType == 3) { // TEXT\r\n if (selNode === node) {\r\n var value = node.nodeValue\r\n line.push(value.substr(0, selOffset) + '\\x01' + value.substr(selOffset))\r\n } else {\r\n line.push(node.nodeValue)\r\n }\r\n return\r\n }\r\n if (node.nodeType != 1) { // NON-ELEMENT\r\n return\r\n }\r\n var isSelected = (selNode === node)\r\n var isBlock = node.tagName == 'DIV' || node.tagName == 'P'\r\n var curChild\r\n if (isBlock && line.length || node.tagName == 'BR') {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n else if (node.tagName == 'IMG') {\r\n if (node.alt) {\r\n line.push(node.alt)\r\n }\r\n }\r\n if (isSelected && !selOffset) {\r\n line.push('\\x01')\r\n }\r\n var curChild = node.firstChild\r\n while (curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset)\r\n curChild = curChild.nextSibling\r\n }\r\n if (isSelected && selOffset) {\r\n line.push('\\x01')\r\n }\r\n if (isBlock && line.length) {\r\n lines.push(line.join(''))\r\n line.splice(0, line.length)\r\n }\r\n}\r\n\r\nfunction setRichFocus (field, selectNode, noCollapse) {\r\n field.focus()\r\n if (selectNode &&\r\n selectNode.parentNode == field &&\r\n !selectNode.nextSibling &&\r\n !noCollapse) {\r\n field.removeChild(selectNode)\r\n selectNode = null\r\n }\r\n if (window.getSelection && document.createRange) {\r\n var range = document.createRange()\r\n if (selectNode) {\r\n range.selectNode(selectNode)\r\n } else {\r\n range.selectNodeContents(field)\r\n }\r\n if (!noCollapse) {\r\n range.collapse(false)\r\n }\r\n\r\n var sel = window.getSelection()\r\n sel.removeAllRanges()\r\n sel.addRange(range)\r\n }\r\n else if (document.body.createTextRange !== undefined) {\r\n var textRange = document.body.createTextRange()\r\n textRange.moveToElementText(selectNode || field)\r\n if (!noCollapse) {\r\n textRange.collapse(false)\r\n }\r\n textRange.select()\r\n }\r\n}\r\n\r\nfunction getSelectedText () {\r\n var sel = (\r\n window.getSelection && window.getSelection() ||\r\n document.getSelection && document.getSelection() ||\r\n document.selection && document.selection.createRange().text || ''\r\n ).toString().replace(/^\\s+|\\s+$/g, '')\r\n\r\n return sel\r\n}\r\n\r\nfunction scrollToNode (scrollable, node, scroller) {\r\n var elTop = node.offsetTop - 15\r\n var elHeight = node.offsetHeight + 30\r\n var scrollTop = scrollable.scrollTop\r\n var viewportHeight = scrollable.clientHeight\r\n\r\n if (scrollTop > elTop) { // we are below the node to scroll\r\n scrollable.scrollTop = elTop\r\n $(scroller).nanoScroller({flash: true})\r\n }\r\n else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll\r\n scrollable.scrollTop = elTop + elHeight - viewportHeight\r\n $(scroller).nanoScroller({flash: true})\r\n }\r\n}\r\n\r\nif (Config.Modes.animations &&\r\n typeof window.requestAnimationFrame == 'function') {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return (function () {\r\n window.requestAnimationFrame(cb)\r\n })\r\n }\r\n} else {\r\n window.onAnimationFrameCallback = function (cb) {\r\n return cb\r\n }\r\n}\r\n\r\nfunction onContentLoaded (cb) {\r\n cb = onAnimationFrameCallback(cb)\r\n setZeroTimeout(cb)\r\n}\r\n\r\nexport function isObject(object) {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function tsNow (seconds) {\r\n var t = +new Date() + (window.tsOffset || 0)\r\n return seconds ? Math.floor(t / 1000) : t\r\n}\r\n\r\nexport function safeReplaceObject (wasObject, newObject) {\r\n for (var key in wasObject) {\r\n if (!newObject.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n delete wasObject[key]\r\n }\r\n }\r\n for (var key in newObject) {\r\n if (newObject.hasOwnProperty(key)) {\r\n wasObject[key] = newObject[key]\r\n }\r\n }\r\n}\r\n\r\nexport function numberWithCommas(x) {\r\n var parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function isElementInViewport(el) {\r\n var rect = el.getBoundingClientRect(),\r\n vWidth = window.innerWidth || doc.documentElement.clientWidth,\r\n vHeight = window.innerHeight || doc.documentElement.clientHeight,\r\n efp = function (x, y) { return document.elementFromPoint(x, y) }; \r\n\r\n // Return false if it's not in the viewport\r\n if (rect.right < 0 || rect.bottom < 0 \r\n || rect.left > vWidth || rect.top > vHeight)\r\n return false;\r\n\r\n // Return true if any of its four corners are visible\r\n return (\r\n el.contains(efp(rect.left, rect.top))\r\n || el.contains(efp(rect.right, rect.top))\r\n || el.contains(efp(rect.right, rect.bottom))\r\n || el.contains(efp(rect.left, rect.bottom))\r\n );\r\n}\r\n\r\nexport function copy(obj) {\r\n //in case of premitives\r\n if(obj===null || typeof obj !== \"object\"){\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date){\r\n return new Date(obj.getTime());\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)){\r\n var clonedArr = [];\r\n obj.forEach(function(element){\r\n clonedArr.push(copy(element))\r\n });\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj){\r\n if(obj.hasOwnProperty(prop)){\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function ripple(elem/* : HTMLElement */) {\r\n elem.addEventListener('mousedown', function(/* this: typeof elem, */e) {\r\n let rect = this.getBoundingClientRect();\r\n\r\n const startTime = Date.now();\r\n const animationTime = 350;\r\n\r\n let X = e.clientX - rect.left;\r\n let Y = e.clientY - rect.top;\r\n let rippleDiv = document.createElement(\"div\");\r\n rippleDiv.classList.add(\"ripple\");\r\n rippleDiv.setAttribute(\"style\", \"top:\" + Y + \"px; left:\" + X + \"px;\");\r\n this.appendChild(rippleDiv);\r\n\r\n elem.addEventListener('mouseup', () => {\r\n let elapsed = Date.now() - startTime;\r\n\r\n setTimeout(() => {\r\n rippleDiv.parentElement.removeChild(rippleDiv);\r\n }, elapsed < animationTime ? animationTime - elapsed : 0);\r\n }, {once: true});\r\n });\r\n};\r\n\r\nfunction listMergeSorted (list1, list2) {\r\n list1 = list1 || []\r\n list2 = list2 || []\r\n\r\n var result = copy(list1);\r\n\r\n var minID = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF\r\n for (var i = 0; i < list2.length; i++) {\r\n if (list2[i] < minID) {\r\n result.push(list2[i])\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction listUniqSorted (list) {\r\n list = list || []\r\n var resultList = []\r\n var prev = false\r\n for (var i = 0; i < list.length; i++) {\r\n if (list[i] !== prev) {\r\n resultList.push(list[i])\r\n }\r\n prev = list[i]\r\n }\r\n\r\n return resultList\r\n}\r\n\r\nfunction templateUrl (tplName) {\r\n var forceLayout = {\r\n confirm_modal: 'desktop',\r\n error_modal: 'desktop',\r\n media_modal_layout: 'desktop',\r\n slider: 'desktop',\r\n reply_message: 'desktop',\r\n full_round: 'desktop',\r\n message_body: 'desktop',\r\n message_media: 'desktop',\r\n message_attach_game: 'desktop',\r\n forwarded_messages: 'desktop',\r\n chat_invite_link_modal: 'desktop',\r\n reply_markup: 'desktop',\r\n short_message: 'desktop',\r\n pinned_message: 'desktop',\r\n channel_edit_modal: 'desktop',\r\n megagroup_edit_modal: 'desktop',\r\n inline_results: 'desktop',\r\n composer_dropdown: 'desktop',\r\n peer_pinned_message_bar: 'desktop',\r\n report_msgs_modal: 'desktop'\r\n }\r\n var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop')\r\n return 'partials/' + layout + '/' + tplName + '.html'\r\n}\r\n\r\nexport function encodeEntities (value) {\r\n return value.replace(/&/g, '&amp;').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, function (value) {\r\n var hi = value.charCodeAt(0)\r\n var low = value.charCodeAt(1)\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'\r\n }).replace(/([^\\#-~| |!])/g, function (value) { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';'\r\n }).replace(/</g, '&lt;').replace(/>/g, '&gt;')\r\n}\r\n\r\nexport function calcImageInBox (imageW, imageH, boxW, boxH, noZooom) {\r\n var boxedImageW = boxW\r\n var boxedImageH = boxH\r\n\r\n if ((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = parseInt(imageH * boxW / imageW)\r\n }else {\r\n boxedImageW = parseInt(imageW * boxH / imageH)\r\n if (boxedImageW > boxW) {\r\n boxedImageH = parseInt(boxedImageH * boxW / boxedImageW)\r\n boxedImageW = boxW\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if (noZooom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW\r\n boxedImageH = imageH\r\n }\r\n\r\n return {w: boxedImageW, h: boxedImageH}\r\n}\r\n\r\n/**\r\n * emojiUnicode\r\n * Get the unicode code of an emoji in base 16.\r\n *\r\n * @name emojiUnicode\r\n * @function\r\n * @param {String} input The emoji character.\r\n * @returns {String} The base 16 unicode code.\r\n */\r\nexport function emojiUnicode (input) {\r\n return emojiUnicode.raw(input).split(' ').map(val => parseInt(val).toString(16)).join('-').toUpperCase();\r\n}\r\n\r\n/**\r\n* emojiunicode.raw\r\n* Get the unicode code points of an emoji in base 16.\r\n*\r\n* @name emojiunicode.raw\r\n* @function\r\n* @param {String} input The emoji character.\r\n* @returns {String} The unicode code points.\r\n*/\r\nemojiUnicode.raw = function (input) {\r\n if(input.length === 1) {\r\n return input.charCodeAt(0).toString();\r\n } else if(input.length > 1) {\r\n const pairs = [];\r\n for (var i = 0; i < input.length; i++) {\r\n if (\r\n // high surrogate\r\n input.charCodeAt(i) >= 0xd800 && input.charCodeAt(i) <= 0xdbff\r\n ) {\r\n if (\r\n input.charCodeAt(i + 1) >= 0xdc00 && input.charCodeAt(i + 1) <= 0xdfff\r\n ) {\r\n // low surrogate\r\n pairs.push(\r\n (input.charCodeAt(i) - 0xd800) * 0x400\r\n + (input.charCodeAt(i + 1) - 0xdc00) + 0x10000\r\n );\r\n }\r\n } else if (input.charCodeAt(i) < 0xd800 || input.charCodeAt(i) > 0xdfff) {\r\n // modifiers and joiners\r\n pairs.push(input.charCodeAt(i))\r\n }\r\n }\r\n return pairs.join(' ');\r\n }\r\n\r\n return '';\r\n};\r\n\r\n// country code regex\r\nconst CC_REGEX = /^[a-z]{2}$/i;\r\n\r\n// offset between uppercase ascii and regional indicator symbols\r\nconst OFFSET = 127397;\r\n\r\n/**\r\n * convert country code to corresponding emoji flag\r\n * @param {string} cc - country code string\r\n * @returns {string} country code emoji\r\n */\r\nexport function countryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n console.log(chars);\r\n return String.fromCodePoint(...chars);\r\n}\r\n\r\nexport function unifiedCountryCodeEmoji(cc/* : string */) {\r\n if(!CC_REGEX.test(cc)) {\r\n const type = typeof cc;\r\n throw new TypeError(\r\n `cc argument must be an ISO 3166-1 alpha-2 string, but got '${\r\n type === 'string' ? cc : type\r\n }' instead.`,\r\n );\r\n }\r\n\r\n const chars = [...cc.toUpperCase()].map(c => c.charCodeAt(0) + OFFSET);\r\n return chars.map(c => c.toString(16).toUpperCase()).join('-');\r\n}\r\n\r\nfunction versionCompare (ver1, ver2) {\r\n if (typeof ver1 !== 'string') {\r\n ver1 = ''\r\n }\r\n if (typeof ver2 !== 'string') {\r\n ver2 = ''\r\n }\r\n ver1 = ver1.replace(/^\\s+|\\s+$/g, '').split('.')\r\n ver2 = ver2.replace(/^\\s+|\\s+$/g, '').split('.')\r\n\r\n var a = Math.max(ver1.length, ver2.length), i\r\n\r\n for (i = 0; i < a; i++) {\r\n if (ver1[i] == ver2[i]) {\r\n continue\r\n }\r\n if (ver1[i] > ver2[i]) {\r\n return 1\r\n } else {\r\n return -1\r\n }\r\n }\r\n\r\n return 0\r\n}\r\n\r\n\r\n var badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<\\s]+/g,\r\n trimRe = /^\\s+|\\s$/g\r\n\r\n function createIndex () {\r\n return {\r\n shortIndexes: {},\r\n fullTexts: {}\r\n }\r\n }\r\n\r\n function cleanSearchText (text) {\r\n var hasTag = text.charAt(0) == '%'\r\n text = text.replace(badCharsRe, ' ').replace(trimRe, '')\r\n text = text.replace(/[^A-Za-z0-9]/g, function (ch) {\r\n var latinizeCh = Config.LatinizeMap[ch]\r\n return latinizeCh !== undefined ? latinizeCh : ch\r\n })\r\n text = text.toLowerCase()\r\n if (hasTag) {\r\n text = '%' + text\r\n }\r\n\r\n return text\r\n }\r\n\r\n function cleanUsername (username) {\r\n return username && username.toLowerCase() || ''\r\n }\r\n\r\n function indexObject (id, searchText, searchIndex) {\r\n if (searchIndex.fullTexts[id] !== undefined) {\r\n return false\r\n }\r\n\r\n searchText = cleanSearchText(searchText)\r\n\r\n if (!searchText.length) {\r\n return false\r\n }\r\n\r\n var shortIndexes = searchIndex.shortIndexes\r\n\r\n searchIndex.fullTexts[id] = searchText\r\n\r\n searchText.split(' ').forEach(function(searchWord) {\r\n var len = Math.min(searchWord.length, 3),\r\n wordPart, i\r\n for (i = 1; i <= len; i++) {\r\n wordPart = searchWord.substr(0, i)\r\n if (shortIndexes[wordPart] === undefined) {\r\n shortIndexes[wordPart] = [id]\r\n } else {\r\n shortIndexes[wordPart].push(id)\r\n }\r\n }\r\n })\r\n }\r\n\r\n function search (query, searchIndex) {\r\n var shortIndexes = searchIndex.shortIndexes\r\n var fullTexts = searchIndex.fullTexts\r\n\r\n query = cleanSearchText(query)\r\n\r\n var queryWords = query.split(' ')\r\n var foundObjs = false,\r\n newFoundObjs, i\r\n var j, searchText\r\n var found\r\n\r\n for (i = 0; i < queryWords.length; i++) {\r\n newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]\r\n if (!newFoundObjs) {\r\n foundObjs = []\r\n break\r\n }\r\n if (foundObjs === false || foundObjs.length > newFoundObjs.length) {\r\n foundObjs = newFoundObjs\r\n }\r\n }\r\n\r\n newFoundObjs = {}\r\n\r\n for (j = 0; j < foundObjs.length; j++) {\r\n found = true\r\n searchText = fullTexts[foundObjs[j]]\r\n for (i = 0; i < queryWords.length; i++) {\r\n if (searchText.indexOf(queryWords[i]) == -1) {\r\n found = false\r\n break\r\n }\r\n }\r\n if (found) {\r\n newFoundObjs[foundObjs[j]] = true\r\n }\r\n }\r\n\r\n return newFoundObjs\r\n }\r\n\r\n let SearchIndexManager = {\r\n createIndex: createIndex,\r\n indexObject: indexObject,\r\n cleanSearchText: cleanSearchText,\r\n cleanUsername: cleanUsername,\r\n search: search\r\n };\r\n window.SearchIndexManager = SearchIndexManager;\r\n\r\n export {SearchIndexManager};\r\n//})(window)\r\n"
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"index": 22,
"index2": 25,
"size": 28692,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "57:18-40"
},
{
"moduleId": 9,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/filemanager.ts",
"module": "./src/lib/filemanager.ts",
"moduleName": "./src/lib/filemanager.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "3:18-40"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "43:18-40"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "16:18-40"
},
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "7:18-40"
},
{
"moduleId": 38,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"module": "./src/lib/idb.ts",
"moduleName": "./src/lib/idb.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "6:18-40"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./bin_utils",
"loc": "14:18-40"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "../lib/bin_utils",
"loc": "13:18-45"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "../lib/bin_utils",
"loc": "13:18-45"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar jsbn_1 = require(\"jsbn\");\n// @ts-ignore\nvar Rusha = __importStar(require(\"rusha/dist/rusha.min.js\"));\nvar leemon_1 = require(\"leemon\");\n//import CryptoJS from 'crypto-js';\n// @ts-ignore\nvar pako_inflate_min_js_1 = __importDefault(require(\"pako/dist/pako_inflate.min.js\"));\nvar CryptoJS = require(\"./crypto.js\");\nrequire(\"./closure_long.js\");\nvar goog = this.goog;\nfunction bigint(num) {\n return new jsbn_1.BigInteger(num.toString(16), 16);\n}\nexports.bigint = bigint;\nfunction bigStringInt(strNum) {\n return new jsbn_1.BigInteger(strNum, 10);\n}\nexports.bigStringInt = bigStringInt;\n/* export function dHexDump (bytes) {\n var arr = []\n for (var i = 0; i < bytes.length; i++) {\n if (i && !(i % 2)) {\n if (!(i % 16)) {\n arr.push('\\n')\n } else if (!(i % 4)) {\n arr.push(' ')\n } else {\n arr.push(' ')\n }\n }\n arr.push((bytes[i] < 16 ? '0' : '') + bytes[i].toString(16))\n }\n\n console.log(arr.join(''))\n} */\nfunction bytesToHex(bytes) {\n bytes = bytes || [];\n var arr = [];\n for (var i = 0; i < bytes.length; i++) {\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\n }\n return arr.join('');\n}\nexports.bytesToHex = bytesToHex;\nfunction bytesFromHex(hexString) {\n var len = hexString.length, i;\n var start = 0;\n var bytes = [];\n if (hexString.length % 2) {\n bytes.push(parseInt(hexString.charAt(0), 16));\n start++;\n }\n for (i = start; i < len; i += 2) {\n bytes.push(parseInt(hexString.substr(i, 2), 16));\n }\n return bytes;\n}\nexports.bytesFromHex = bytesFromHex;\nfunction bytesToBase64(bytes) {\n var mod3;\n var result = '';\n for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if (mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(uint6ToBase64(nUint24 >>> 18 & 63), uint6ToBase64(nUint24 >>> 12 & 63), uint6ToBase64(nUint24 >>> 6 & 63), uint6ToBase64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n return result.replace(/A(?=A$|$)/g, '=');\n}\nexports.bytesToBase64 = bytesToBase64;\nfunction uint6ToBase64(nUint6) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\nexports.uint6ToBase64 = uint6ToBase64;\nfunction base64ToBlob(base64str, mimeType) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return blobConstruct(byteArrays, mimeType);\n}\nexports.base64ToBlob = base64ToBlob;\nfunction dataUrlToBlob(url) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n}\nexports.dataUrlToBlob = dataUrlToBlob;\nfunction blobConstruct(blobParts, mimeType) {\n if (mimeType === void 0) { mimeType = ''; }\n var blob;\n var safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, { type: safeMimeType });\n }\n catch (e) {\n // @ts-ignore\n var bb = new BlobBuilder;\n blobParts.forEach(function (blobPart) {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\nexports.blobConstruct = blobConstruct;\nfunction blobSafeMimeType(mimeType) {\n if ([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n ].indexOf(mimeType) == -1) {\n return 'application/octet-stream';\n }\n return mimeType;\n}\nexports.blobSafeMimeType = blobSafeMimeType;\nfunction bytesCmp(bytes1, bytes2) {\n var len = bytes1.length;\n if (len != bytes2.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (bytes1[i] != bytes2[i]) {\n return false;\n }\n }\n return true;\n}\nexports.bytesCmp = bytesCmp;\nfunction bytesXor(bytes1, bytes2) {\n var len = bytes1.length;\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n return bytes;\n}\nexports.bytesXor = bytesXor;\nfunction bytesToWords(bytes) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n var words = [];\n var i;\n for (i = 0; i < len; i++) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n return new CryptoJS.lib.WordArray.init(words, len);\n}\nfunction bytesFromWords(wordArray) {\n var words = wordArray.words;\n var sigBytes = wordArray.sigBytes;\n var bytes = [];\n for (var i = 0; i < sigBytes; i++) {\n bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return bytes;\n}\nfunction bytesFromBigInt(bigInt, len) {\n var bytes = bigInt.toByteArray();\n if (len && bytes.length < len) {\n var padding = [];\n for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n }\n else {\n bytes = padding.concat(bytes);\n }\n }\n else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n return bytes;\n}\nexports.bytesFromBigInt = bytesFromBigInt;\nfunction bytesFromLeemonBigInt(bigInt) {\n var str = leemon_1.bigInt2str(bigInt, 16);\n return bytesFromHex(str);\n}\nexports.bytesFromLeemonBigInt = bytesFromLeemonBigInt;\nfunction bytesToArrayBuffer(b) {\n return (new Uint8Array(b)).buffer;\n}\nexports.bytesToArrayBuffer = bytesToArrayBuffer;\nfunction convertToArrayBuffer(bytes) {\n // Be careful with converting subarrays!!\n if (bytes instanceof ArrayBuffer) {\n return bytes;\n }\n if (bytes.buffer !== undefined &&\n bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n return bytes.buffer;\n }\n return bytesToArrayBuffer(bytes);\n}\nexports.convertToArrayBuffer = convertToArrayBuffer;\nfunction convertToUint8Array(bytes) {\n if (bytes.buffer !== undefined) {\n return bytes;\n }\n return new Uint8Array(bytes);\n}\nexports.convertToUint8Array = convertToUint8Array;\nfunction convertToByteArray(bytes) {\n if (Array.isArray(bytes)) {\n return bytes;\n }\n bytes = convertToUint8Array(bytes);\n var newBytes = [];\n for (var i = 0, len = bytes.length; i < len; i++) {\n newBytes.push(bytes[i]);\n }\n return newBytes;\n}\nexports.convertToByteArray = convertToByteArray;\nfunction bytesFromArrayBuffer(buffer) {\n var len = buffer.byteLength;\n var byteView = new Uint8Array(buffer);\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = byteView[i];\n }\n return bytes;\n}\nexports.bytesFromArrayBuffer = bytesFromArrayBuffer;\nfunction bufferConcat(buffer1, buffer2) {\n var l1 = buffer1.byteLength || buffer1.length;\n var l2 = buffer2.byteLength || buffer2.length;\n var tmp = new Uint8Array(l1 + l2);\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\n return tmp.buffer;\n}\nexports.bufferConcat = bufferConcat;\nfunction bufferConcats() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var length = 0;\n args.forEach(function (b) { return length += b.byteLength || b.length; });\n var tmp = new Uint8Array(length);\n var lastLength = 0;\n args.forEach(function (b) {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += b.byteLength || b.length;\n });\n return tmp /* .buffer */;\n}\nexports.bufferConcats = bufferConcats;\nfunction longToInts(sLong) {\n var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000));\n return [divRem[0].intValue(), divRem[1].intValue()];\n}\nexports.longToInts = longToInts;\nfunction longToBytes(sLong) {\n return bytesFromWords({ words: longToInts(sLong), sigBytes: 8 }).reverse();\n}\nexports.longToBytes = longToBytes;\nfunction longFromInts(high, low) {\n return bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n}\nexports.longFromInts = longFromInts;\nfunction intToUint(val) {\n if (typeof (val) === 'string')\n val = parseInt(val);\n if (val < 0) {\n val = val + 4294967296;\n }\n return val;\n}\nexports.intToUint = intToUint;\nfunction uintToInt(val) {\n if (val > 2147483647) {\n val = val - 4294967296;\n }\n return val;\n}\nexports.uintToInt = uintToInt;\nfunction sha1HashSync(bytes) {\n var hash = Rusha.createHash();\n hash.update(bytes);\n var hashBytes = hash.digest();\n //console.log('sha1HashSync', bytes, hashBytes);\n //rushaInstance = rushaInstance || new Rusha(1024 * 1024);\n // console.log(dT(), 'SHA-1 hash start', bytes.byteLength || bytes.length)\n /* var hashBytes = rushaInstance.rawDigest(bytes).buffer; */\n // console.log(dT(), 'SHA-1 hash finish')\n return hashBytes;\n}\nexports.sha1HashSync = sha1HashSync;\nfunction sha1BytesSync(bytes) {\n return bytesFromArrayBuffer(sha1HashSync(bytes));\n}\nexports.sha1BytesSync = sha1BytesSync;\nfunction sha256HashSync(bytes) {\n // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length)\n var hashWords = CryptoJS.SHA256(bytesToWords(bytes));\n // console.log(dT(), 'SHA-2 hash finish')\n var hashBytes = bytesFromWords(hashWords);\n return hashBytes;\n}\nexports.sha256HashSync = sha256HashSync;\nfunction rsaEncrypt(publicKey, bytes) {\n bytes = addPadding(bytes, 255);\n // console.log('RSA encrypt start')\n var N = new jsbn_1.BigInteger(publicKey.modulus, 16);\n var E = new jsbn_1.BigInteger(publicKey.exponent, 16);\n var X = new jsbn_1.BigInteger(bytes);\n var encryptedBigInt = X.modPowInt(E, N), encryptedBytes = bytesFromBigInt(encryptedBigInt, 256);\n // console.log('RSA encrypt finish')\n return encryptedBytes;\n}\nexports.rsaEncrypt = rsaEncrypt;\nfunction addPadding(bytes, blockSize, zeroes, full) {\n if (full === void 0) { full = false; }\n blockSize = blockSize || 16;\n var len = bytes.byteLength || bytes.length;\n var needPadding = blockSize - (len % blockSize);\n if (needPadding > 0 && (needPadding < blockSize || full)) {\n var padding = new Array(needPadding);\n if (zeroes) {\n for (var i = 0; i < needPadding; i++) {\n padding[i] = 0;\n }\n }\n else {\n (new jsbn_1.SecureRandom()).nextBytes(padding);\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(bytes, padding);\n }\n else {\n bytes = bytes.concat(padding);\n }\n }\n return bytes;\n}\nexports.addPadding = addPadding;\nfunction aesEncryptSync(bytes, keyBytes, ivBytes) {\n var len = bytes.byteLength || bytes.length;\n // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/)\n bytes = addPadding(bytes);\n var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n }).ciphertext;\n var encryptedBytes = bytesFromWords(encryptedWords);\n // console.log(dT(), 'AES encrypt finish')\n return encryptedBytes;\n}\nexports.aesEncryptSync = aesEncryptSync;\nfunction aesDecryptSync(encryptedBytes, keyBytes, ivBytes) {\n // console.log(dT(), 'AES decrypt start', encryptedBytes.length)\n var decryptedWords = CryptoJS.AES.decrypt({ ciphertext: bytesToWords(encryptedBytes) }, bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n });\n var bytes = bytesFromWords(decryptedWords);\n // console.log(dT(), 'AES decrypt finish')\n return bytes;\n}\nexports.aesDecryptSync = aesDecryptSync;\nfunction getDerivation(hash, salt, password, iterations, keyLength) {\n if (hash === void 0) { hash = 'SHA-512'; }\n return __awaiter(this, void 0, void 0, function () {\n var passwordBuffer, importedKey, saltBuffer, params, derivation;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n passwordBuffer = password;\n return [4 /*yield*/, crypto.subtle.importKey(\"raw\", passwordBuffer, \"PBKDF2\", false, [\"deriveBits\", 'deriveKey'])];\n case 1:\n importedKey = _a.sent();\n saltBuffer = salt /* textEncoder.encode(salt); */;\n params = { name: \"PBKDF2\", hash: hash, salt: saltBuffer, iterations: iterations };\n return [4 /*yield*/, crypto.subtle.deriveBits(params, importedKey, keyLength * 8)];\n case 2:\n derivation = _a.sent();\n return [2 /*return*/, derivation];\n }\n });\n });\n}\nfunction getKey(derivation) {\n return __awaiter(this, void 0, void 0, function () {\n var ivlen, keylen, derivedKey, iv, importedEncryptionKey;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n ivlen = 16;\n keylen = 32;\n derivedKey = derivation.slice(0, keylen);\n iv = derivation.slice(-ivlen);\n return [4 /*yield*/, crypto.subtle.importKey('raw', derivedKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt'])];\n case 1:\n importedEncryptionKey = _a.sent();\n return [2 /*return*/, {\n key: importedEncryptionKey,\n iv: iv\n }];\n }\n });\n });\n}\nfunction encrypt(text, keyObject) {\n return __awaiter(this, void 0, void 0, function () {\n var textBuffer, encryptedText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n textBuffer = text;\n return [4 /*yield*/, crypto.subtle.encrypt({ name: 'AES-CBC', iv: keyObject.iv }, keyObject.key, textBuffer)];\n case 1:\n encryptedText = _a.sent();\n return [2 /*return*/, encryptedText];\n }\n });\n });\n}\n/* import * as crypto from 'crypto'; */\nfunction hash_pbkdf2(/* hasher: 'string', */ buffer, salt, iterations) {\n return __awaiter(this, void 0, void 0, function () {\n var importKey, deriveKey, bits;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, window.crypto.subtle.importKey(\"raw\", //only \"raw\" is allowed\n buffer, //your password\n {\n name: \"PBKDF2\",\n }, false, //whether the key is extractable (i.e. can be used in exportKey)\n [\"deriveKey\", \"deriveBits\"] //can be any combination of \"deriveKey\" and \"deriveBits\"\n )];\n case 1:\n importKey = _a.sent();\n return [4 /*yield*/, window.crypto.subtle.deriveKey({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n {\n name: \"AES-CTR\",\n //the generateKey parameters for that type of algorithm\n length: 256,\n }, false, //whether the derived key is extractable (i.e. can be used in exportKey)\n [\"encrypt\", \"decrypt\"] //limited to the options in that algorithm's importKey\n )];\n case 2:\n deriveKey = _a.sent();\n bits = window.crypto.subtle.deriveBits({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n 512 //the number of bits you want to derive\n );\n return [2 /*return*/, bits];\n }\n });\n });\n}\nexports.hash_pbkdf2 = hash_pbkdf2;\nfunction gzipUncompress(bytes, toString) {\n // console.log('Gzip uncompress start')\n // @ts-ignore\n //var result = (new Zlib.Gunzip(bytes)).decompress();\n var result = pako_inflate_min_js_1.default.inflate(bytes, toString ? { to: 'string' } : undefined);\n // console.log('Gzip uncompress finish')\n return result;\n}\nexports.gzipUncompress = gzipUncompress;\nfunction nextRandomInt(maxValue) {\n return Math.floor(Math.random() * maxValue);\n}\nexports.nextRandomInt = nextRandomInt;\nfunction pqPrimeFactorization(pqBytes) {\n var what = new jsbn_1.BigInteger(pqBytes);\n var result = false;\n // console.log(dT(), 'PQ start', pqBytes, what.toString(16), what.bitLength())\n try {\n result = pqPrimeLeemon(leemon_1.str2bigInt(what.toString(16), 16, Math.ceil(64 / leemon_1.bpe) + 1));\n }\n catch (e) {\n console.error('Pq leemon Exception', e);\n }\n if (result === false && what.bitLength() <= 64) {\n // console.time('PQ long')\n try {\n result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16));\n }\n catch (e) {\n console.error('Pq long Exception', e);\n }\n // console.timeEnd('PQ long')\n }\n // console.log(result)\n if (result === false) {\n // console.time('pq BigInt')\n result = pqPrimeBigInteger(what);\n // console.timeEnd('pq BigInt')\n }\n // console.log(dT(), 'PQ finish')\n return result;\n}\nexports.pqPrimeFactorization = pqPrimeFactorization;\nfunction pqPrimeBigInteger(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = (nextRandomInt(128) & 15) + 17;\n var x = bigint(nextRandomInt(1000000000) + 1);\n var y = x.clone();\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x.clone();\n var b = x.clone();\n var c = bigint(q);\n while (!b.equals(jsbn_1.BigInteger.ZERO)) {\n if (!b.and(jsbn_1.BigInteger.ONE).equals(jsbn_1.BigInteger.ZERO)) {\n c = c.add(a);\n if (c.compareTo(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compareTo(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c.clone();\n var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = z.gcd(what);\n if (!g.equals(jsbn_1.BigInteger.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x.clone();\n }\n }\n if (g.compareTo(jsbn_1.BigInteger.ONE) > 0) {\n break;\n }\n }\n var f = what.divide(g), P, Q;\n if (g.compareTo(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromBigInt(P), bytesFromBigInt(Q), it];\n}\nexports.pqPrimeBigInteger = pqPrimeBigInteger;\nfunction gcdLong(a, b) {\n while (a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) {\n while (b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n b = b.shiftRight(1);\n }\n while (a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n a = a.shiftRight(1);\n }\n if (a.compare(b) > 0) {\n a = a.subtract(b);\n }\n else {\n b = b.subtract(a);\n }\n }\n return b.equals(goog.math.Long.ZERO) ? a : b;\n}\nexports.gcdLong = gcdLong;\nfunction pqPrimeLong(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17);\n var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1);\n var y = x;\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x;\n var b = x;\n var c = q;\n while (b.notEquals(goog.math.Long.ZERO)) {\n if (b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) {\n c = c.add(a);\n if (c.compare(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compare(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c;\n var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = gcdLong(z, what);\n if (g.notEquals(goog.math.Long.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x;\n }\n }\n if (g.compare(goog.math.Long.ONE) > 0) {\n break;\n }\n }\n var f = what.div(g), P, Q;\n if (g.compare(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it];\n}\nexports.pqPrimeLong = pqPrimeLong;\nfunction pqPrimeLeemon(what) {\n var minBits = 64;\n var minLen = Math.ceil(minBits / leemon_1.bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n for (i = 0; i < 3; i++) {\n q = (nextRandomInt(128) & 15) + 17;\n leemon_1.copyInt_(x, nextRandomInt(1000000000) + 1);\n leemon_1.copy_(y, x);\n lim = 1 << (i + 18);\n for (j = 1; j < lim; j++) {\n ++it;\n leemon_1.copy_(a, x);\n leemon_1.copy_(b, x);\n leemon_1.copyInt_(c, q);\n while (!leemon_1.isZero(b)) {\n if (b[0] & 1) {\n leemon_1.add_(c, a);\n if (leemon_1.greater(c, what)) {\n leemon_1.sub_(c, what);\n }\n }\n leemon_1.add_(a, a);\n if (leemon_1.greater(a, what)) {\n leemon_1.sub_(a, what);\n }\n leemon_1.rightShift_(b, 1);\n }\n leemon_1.copy_(x, c);\n if (leemon_1.greater(x, y)) {\n leemon_1.copy_(z, x);\n leemon_1.sub_(z, y);\n }\n else {\n leemon_1.copy_(z, y);\n leemon_1.sub_(z, x);\n }\n leemon_1.eGCD_(z, what, g, a, b);\n if (!leemon_1.equalsInt(g, 1)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n leemon_1.copy_(y, x);\n }\n }\n if (leemon_1.greater(g, leemon_1.one)) {\n break;\n }\n }\n leemon_1.divide_(what, g, x, y);\n if (leemon_1.greater(g, x)) {\n P = x;\n Q = g;\n }\n else {\n P = g;\n Q = x;\n }\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];\n}\nexports.pqPrimeLeemon = pqPrimeLeemon;\nfunction bytesModPow(x, y, m) {\n try {\n var xBigInt = leemon_1.str2bigInt(bytesToHex(x), 16);\n var yBigInt = leemon_1.str2bigInt(bytesToHex(y), 16);\n var mBigInt = leemon_1.str2bigInt(bytesToHex(m), 16);\n var resBigInt = leemon_1.powMod(xBigInt, yBigInt, mBigInt);\n return bytesFromHex(leemon_1.bigInt2str(resBigInt, 16));\n }\n catch (e) {\n console.error('mod pow error', e);\n }\n return bytesFromBigInt(new jsbn_1.BigInteger(x).modPow(new jsbn_1.BigInteger(y), new jsbn_1.BigInteger(m)), 256);\n}\nexports.bytesModPow = bytesModPow;\n"
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"index": 19,
"index2": 33,
"size": 92532,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./mtproto",
"loc": "37:16-36"
},
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./lib/mtproto",
"loc": "21:16-40"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./mtproto",
"loc": "15:16-36"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "13:16-41"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "15:16-41"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "6:16-41"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "../lib/mtproto",
"loc": "15:16-41"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Config = __importStar(require(\"./config\"));\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar bin_utils_1 = require(\"./bin_utils\");\nvar utils_1 = require(\"./utils\");\nvar tl_utils_1 = require(\"./tl_utils\");\nvar cryptoworker_1 = __importDefault(require(\"./cryptoworker\"));\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar idb_1 = __importDefault(require(\"./idb\"));\nvar mtnetworker_1 = require(\"./mtnetworker\");\nvar leemon_1 = require(\"leemon\");\nvar $rootScope = {\n $broadcast: function (name, detail) {\n console.log(utils_1.dT(), 'Broadcasting ' + name + ' event, with args:', detail);\n //console.trace();\n var myCustomEvent = new CustomEvent(name, { detail: detail });\n document.dispatchEvent(myCustomEvent);\n },\n};\n/* let qSync = {\n when: function<T>(result: any) {\n return Promise.resolve(result);\n },\n reject: function (result: any) {\n return {\n then: function(cb: any, badcb: any) {\n if(badcb) {\n return badcb(result);\n }\n }\n };\n }\n}; */\nvar TelegramMeWebService = /** @class */ (function () {\n function TelegramMeWebService() {\n this.disabled = Config.Modes.test ||\n Config.App.domains.indexOf(location.hostname) == -1 ||\n location.protocol != 'http:' && location.protocol != 'https:' ||\n location.protocol == 'https:' && location.hostname != 'web.telegram.org';\n }\n TelegramMeWebService.prototype.setAuthorized = function (canRedirect) {\n if (this.disabled) {\n return false;\n }\n storage_1.default.get('tgme_sync').then(function (curValue) {\n var ts = utils_1.tsNow(true);\n if (canRedirect &&\n curValue &&\n curValue.canRedirect == canRedirect &&\n curValue.ts + 86400 > ts) {\n return false;\n }\n storage_1.default.set({ tgme_sync: { canRedirect: canRedirect, ts: ts } });\n var urls = [\n '//telegram.me/_websync_?authed=' + (canRedirect ? '1' : '0'),\n '//t.me/_websync_?authed=' + (canRedirect ? '1' : '0')\n ];\n urls.forEach(function (url) {\n var script = document.createElement('script');\n script.onload = script.onerror = function () {\n //document.body.removeChild(script);\n script.remove();\n };\n script.src = url;\n document.body.appendChild(script);\n });\n });\n };\n return TelegramMeWebService;\n}());\nexports.TelegramMeWebService = TelegramMeWebService;\nexports.telegramMeWebService = new TelegramMeWebService();\n// @ts-ignore\n// костыль\n//import * as jsbn from 'jsbn';\nvar jsbn_1 = require(\"jsbn\");\n//import { SecureRandom } from '../types';\n// @ts-ignore\nglobalThis.BigInteger = jsbn_1.BigInteger;\n//let SecureRandom = jsbn.SecureRandom;\nvar chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\nvar chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false;\nvar xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30);\nvar MTProto;\n(function (MTProto) {\n var MTProto_ = /** @class */ (function () {\n function MTProto_() {\n /* public chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\n public chromeVersion = this.chromeMatches && parseFloat(this.chromeMatches[1]) || false;\n public xhrSendBuffer = !('ArrayBufferView' in window) && (this.chromeVersion > 0 && this.chromeVersion < 30); */\n this.secureRandom = null;\n this.secureRandom = new jsbn_1.SecureRandom();\n //$($window).on('click keydown', rng_seed_time);\n }\n return MTProto_;\n }());\n MTProto.MTProto_ = MTProto_;\n var DcConfigurator = /** @class */ (function () {\n function DcConfigurator() {\n // it was DcConfigurator\n this.sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n this.dcOptions = Config.Modes.test\n ? [\n { id: 1, host: '149.154.175.10', port: 80 },\n { id: 2, host: '149.154.167.40', port: 80 },\n { id: 3, host: '149.154.175.117', port: 80 }\n ]\n : [\n { id: 1, host: '149.154.175.50', port: 80 },\n { id: 2, host: '149.154.167.50', port: 80 },\n { id: 3, host: '149.154.175.100', port: 80 },\n { id: 4, host: '149.154.167.91', port: 80 },\n { id: 5, host: '149.154.171.5', port: 80 }\n ];\n /* public dcOptions = Config.Modes.test ? [{\n id: 2,\n host: '149.154.167.40',\n port: 443\n }] : [{\n id: 2,\n host: '149.154.167.50',\n port: 443\n }]; */\n this.chosenServers = {};\n }\n DcConfigurator.prototype.chooseServer = function (dcID, upload) {\n if (!(dcID in this.chosenServers)) {\n var chosenServer = false, i, dcOption;\n if (Config.Modes.ssl || !Config.Modes.http) {\n var subdomain = this.sslSubdomains[dcID - 1] + (upload ? '-1' : '');\n var path = Config.Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n return chosenServer;\n }\n for (i = 0; i < this.dcOptions.length; i++) {\n dcOption = this.dcOptions[i];\n if (dcOption.id == dcID) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port != 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n // @ts-ignore\n chosenServers[dcID] = chosenServer;\n }\n // @ts-ignore\n return chosenServers[dcID];\n };\n return DcConfigurator;\n }());\n MTProto.DcConfigurator = DcConfigurator;\n var RSAKeysManager = /** @class */ (function () {\n function RSAKeysManager() {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n * lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n * an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n * Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n * 8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n * Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAruw2yP/BCcsJliRoW5eB\n * VBVle9dtjJw+OYED160Wybum9SXtBBLXriwt4rROd9csv0t0OHCaTmRqBcQ0J8fx\n * hN6/cpR1GWgOZRUAiQxoMnlt0R93LCX/j1dnVa/gVbCjdSxpbrfY2g2L4frzjJvd\n * l84Kd9ORYjDEAyFnEA7dD556OptgLQQ2e2iVNq8NZLYTzLp5YpOdO1doK+ttrltg\n * gTCy5SrKeLoCPPbOgGsdxJxyz5KKcZnSLj16yE5HvJQn0CNpRdENvRUXe6tBP78O\n * 39oJ8BTHp9oIjd6XWXAsp2CvK45Ol8wFXGF710w9lwCGNbmNxNYhtIkdqfsEcwR5\n * JwIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvfLHfYH2r9R70w8prHbl\n * Wt/nDkh+XkgpflqQVcnAfSuTtO05lNPspQmL8Y2XjVT4t8cT6xAkdgfmmvnvRPOO\n * KPi0OfJXoRVylFzAQG/j83u5K3kRLbae7fLccVhKZhY46lvsueI1hQdLgNV9n1cQ\n * 3TDS2pQOCtovG4eDl9wacrXOJTG2990VjgnIKNA0UMoP+KF03qzryqIt3oTvZq03\n * DyWdGK+AZjgBLaDKSnC6qD2cFY81UryRWOab8zKkWAnhw2kFpcqhI0jdV5QaSCEx\n * vnsjVaX0Y1N0870931/5Jb9ICe4nweZ9kSDF/gip3kWLG0o8XQpChDfyvsqB9OLV\n * /wIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/ditzm+mPND6xkhzwFI\n * z6J/968CtkcSE/7Z2qAJiXbmZ3UDJPGrzqTDHkO30R8VeRM/Kz2f4nR05GIFiITl\n * 4bEjvpy7xqRDspJcCFIOcyXm8abVDhF+th6knSU0yLtNKuQVP6voMrnt9MV1X92L\n * GZQLgdHZbPQz0Z5qIpaKhdyA8DEvWWvSUwwc+yi1/gGaybwlzZwqXYoPOhwMebzK\n * Uk0xW14htcJrRrq+PXXQbRzTMynseCoPIoke0dtCodbA3qQxQovE16q9zz4Otv2k\n * 4j63cz53J+mhkVWAeWxVGI0lltJmWtEYK6er8VqqWot3nqmWMXogrgRLggv/Nbbo\n * oQIDAQAB\n * -----END PUBLIC KEY-----\n *\n * -----BEGIN PUBLIC KEY-----\n * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmpxVY7ld/8DAjz6F6q0\n * 5shjg8/4p6047bn6/m8yPy1RBsvIyvuDuGnP/RzPEhzXQ9UJ5Ynmh2XJZgHoE9xb\n * nfxL5BXHplJhMtADXKM9bWB11PU1Eioc3+AXBB8QiNFBn2XI5UkO5hPhbb9mJpjA\n * 9Uhw8EdfqJP8QetVsI/xrCEbwEXe0xvifRLJbY08/Gp66KpQvy7g8w7VB8wlgePe\n * xW3pT13Ap6vuC+mQuJPyiHvSxjEKHgqePji9NP3tJUFQjcECqcm0yV7/2d0t/pbC\n * m+ZH1sadZspQCEPPrtbkQBlvHb4OLiIWPGHKSMeRFvp3IWcmdJqXahxLCUS1Eh6M\n * AQIDAQAB\n * -----END PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -pubin -in key.pub -text -noout\n */\n this.publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }];\n this.publicKeysParsed = {};\n this.prepared = false;\n }\n // prepareRsaKeys\n RSAKeysManager.prototype.prepare = function () {\n if (this.prepared) {\n return;\n }\n for (var i = 0; i < this.publisKeysHex.length; i++) {\n var keyParsed = this.publisKeysHex[i];\n var RSAPublicKey = new tl_utils_1.TLSerialization();\n RSAPublicKey.storeBytes(bin_utils_1.bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bin_utils_1.bytesFromHex(keyParsed.exponent), 'e');\n var buffer = RSAPublicKey.getBuffer();\n var fingerprintBytes = bin_utils_1.sha1BytesSync(buffer).slice(-8);\n fingerprintBytes.reverse();\n // @ts-ignore\n this.publicKeysParsed[bin_utils_1.bytesToHex(fingerprintBytes)] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n }\n this.prepared = true;\n };\n // selectRsaKeyByFingerPrint\n RSAKeysManager.prototype.select = function (fingerprints) {\n this.prepare();\n var fingerprintHex, foundKey, i;\n for (i = 0; i < fingerprints.length; i++) {\n fingerprintHex = bin_utils_1.bigStringInt(fingerprints[i]).toString(16);\n // @ts-ignore\n if (foundKey = this.publicKeysParsed[fingerprintHex]) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n return false;\n };\n return RSAKeysManager;\n }());\n MTProto.RSAKeysManager = RSAKeysManager;\n var TimeManager = /** @class */ (function () {\n function TimeManager() {\n var _this = this;\n this.lastMessageID = [0, 0];\n this.timeOffset = 0;\n storage_1.default.get('server_time_offset').then(function (to) {\n if (to) {\n _this.timeOffset = to;\n }\n });\n }\n TimeManager.prototype.generateID = function () {\n var timeTicks = utils_1.tsNow(), timeSec = Math.floor(timeTicks / 1000) + this.timeOffset, timeMSec = timeTicks % 1000, random = bin_utils_1.nextRandomInt(0xFFFF);\n var messageID = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if (this.lastMessageID[0] > messageID[0] ||\n this.lastMessageID[0] == messageID[0] && this.lastMessageID[1] >= messageID[1]) {\n messageID = [this.lastMessageID[0], this.lastMessageID[1] + 4];\n }\n this.lastMessageID = messageID;\n // console.log('generated msg id', messageID, timeOffset)\n return bin_utils_1.longFromInts(messageID[0], messageID[1]);\n };\n TimeManager.prototype.applyServerTime = function (serverTime, localTime) {\n var newTimeOffset = serverTime - Math.floor((localTime || utils_1.tsNow()) / 1000);\n var changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n storage_1.default.set({\n server_time_offset: newTimeOffset\n });\n this.lastMessageID = [0, 0];\n this.timeOffset = newTimeOffset;\n console.log(utils_1.dT(), 'Apply server time', serverTime, localTime, newTimeOffset, changed);\n return changed;\n };\n return TimeManager;\n }());\n MTProto.TimeManager = TimeManager;\n var Authorizer = /** @class */ (function () {\n function Authorizer( /* $http: any */) {\n this.cached = {};\n /* delete $http.defaults.headers.post['Content-Type'];\n delete $http.defaults.headers.common['Accept']; */\n }\n Authorizer.prototype.mtpSendPlainRequest = function (dcID, requestBuffer) {\n var requestLength = requestBuffer.byteLength, requestArray = new Int32Array(requestBuffer);\n var header = new tl_utils_1.TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id'); // Auth key\n header.storeLong(MTProto.timeManager.generateID(), 'msg_id'); // Msg_id\n header.storeInt(requestLength, 'request_length');\n var headerBuffer = header.getBuffer(), headerArray = new Int32Array(headerBuffer);\n var headerLength = headerBuffer.byteLength;\n var resultBuffer = new ArrayBuffer(headerLength + requestLength), resultArray = new Int32Array(resultBuffer);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n var requestData = xhrSendBuffer ? resultBuffer : resultArray, requestPromise;\n var url = MTProto.dcConfigurator.chooseServer(dcID);\n var baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n url: url\n };\n console.log('mtpSendPlainRequest: creating requestPromise');\n return /* requestPromise = */ fetch(url, { method: 'POST', body: requestData })\n .then(function (response) {\n console.log('response', response);\n if (response.status != 200)\n throw response;\n return response.arrayBuffer();\n })\n /* .catch(err => {console.log('asdasdasd', err); }); */\n /* try {\n requestPromise = fetch(url, {method: 'POST', body: requestData});\n } catch(e) {\n requestPromise = $q.reject(Object.assign(baseError, {\n originalError: e\n }));\n } */\n /* return requestPromise */ .then(function (result) {\n console.log('mtpSendPlainRequest: in good sector', result);\n if (!result || !result.byteLength) {\n return Promise.reject(baseError);\n //return this.$q.reject(baseError);\n }\n try {\n var deserializer = new tl_utils_1.TLDeserialization(result, { mtproto: true });\n var auth_key_id = deserializer.fetchLong('auth_key_id');\n var msg_id = deserializer.fetchLong('msg_id');\n var msg_len = deserializer.fetchInt('msg_len');\n }\n catch (e) {\n console.error('mtpSendPlainRequest: deserialization went bad', e);\n var error = Object.assign(baseError, { originalError: e });\n throw error;\n //return Promise.reject(error);\n //return $q.reject(error);\n }\n return deserializer;\n }, function (error) {\n if (!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n return Promise.reject(error);\n //return $q.reject(error);\n });\n };\n Authorizer.prototype.mtpSendReqPQ = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n var request = new tl_utils_1.TLSerialization({\n mtproto: true\n });\n request.storeMethod('req_pq', {\n nonce: auth.nonce\n });\n console.log(utils_1.dT(), 'Send req_pq', bin_utils_1.bytesToHex(auth.nonce));\n this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('ResPQ');\n if (response._ != 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] resPQ nonce mismatch');\n }\n auth.serverNonce = response.server_nonce;\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n console.log(utils_1.dT(), 'Got ResPQ', bin_utils_1.bytesToHex(auth.serverNonce), bin_utils_1.bytesToHex(auth.pq), auth.fingerprints);\n auth.publicKey = MTProto.rsaKeysManager.select(auth.fingerprints);\n if (!auth.publicKey) {\n throw new Error('[MT] No public key found');\n }\n console.log(utils_1.dT(), 'PQ factorization start', auth.pq);\n cryptoworker_1.default.factorize(auth.pq).then(function (pAndQ) {\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n console.log(utils_1.dT(), 'PQ factorization done', pAndQ[2]);\n _this.mtpSendReqDhParams(auth);\n }, function (error) {\n console.log('Worker error', error, error.stack);\n deferred.reject(error);\n });\n }, function (error) {\n console.error(utils_1.dT(), 'req_pq error', error.message);\n deferred.reject(error);\n });\n setTimeout(function () {\n MTProto.rsaKeysManager.prepare();\n });\n };\n Authorizer.prototype.mtpSendReqDhParams = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n auth.newNonce = new Array(32);\n MTProto.secureRandom.nextBytes(auth.newNonce);\n var data = new tl_utils_1.TLSerialization({ mtproto: true });\n data.storeObject({\n _: 'p_q_inner_data',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce\n }, 'P_Q_inner_data', 'DECRYPTED_DATA');\n // @ts-ignore\n var dataWithHash = bin_utils_1.sha1BytesSync(data.getBuffer()).concat(data.getBytes());\n var request = new tl_utils_1.TLSerialization({ mtproto: true });\n request.storeMethod('req_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: bin_utils_1.rsaEncrypt(auth.publicKey, dataWithHash)\n });\n console.log(utils_1.dT(), 'Send req_DH_params');\n this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n console.log(utils_1.dT(), 'Sent req_DH_params, response:', response);\n if (response._ != 'server_DH_params_fail' && response._ != 'server_DH_params_ok') {\n deferred.reject(new Error('[MT] Server_DH_Params response invalid: ' + response._));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n deferred.reject(new Error('[MT] Server_DH_Params nonce mismatch'));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n deferred.reject(new Error('[MT] Server_DH_Params server_nonce mismatch'));\n return false;\n }\n if (response._ == 'server_DH_params_fail') {\n var newNonceHash = bin_utils_1.sha1BytesSync(auth.newNonce).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash, response.new_nonce_hash)) {\n deferred.reject(new Error('[MT] server_DH_params_fail new_nonce_hash mismatch'));\n return false;\n }\n deferred.reject(new Error('[MT] server_DH_params_fail'));\n return false;\n }\n // fill auth object\n try {\n _this.mtpDecryptServerDhDataAnswer(auth, response.encrypted_answer);\n }\n catch (e) {\n console.error(utils_1.dT(), 'mtpDecryptServerDhDataAnswer FAILED!', e);\n deferred.reject(e);\n return false;\n }\n console.log(utils_1.dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n _this.mtpSendSetClientDhParams(auth);\n }, function (error) {\n console.log(utils_1.dT(), 'Send req_DH_params FAIL!', error);\n deferred.reject(error);\n });\n };\n Authorizer.prototype.mtpDecryptServerDhDataAnswer = function (auth, encryptedAnswer) {\n auth.localTime = utils_1.tsNow();\n auth.tmpAesKey = bin_utils_1.sha1BytesSync(auth.newNonce.concat(auth.serverNonce)).concat(bin_utils_1.sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(0, 12));\n auth.tmpAesIv = bin_utils_1.sha1BytesSync(auth.serverNonce.concat(auth.newNonce)).slice(12).concat(bin_utils_1.sha1BytesSync([].concat(auth.newNonce, auth.newNonce)), auth.newNonce.slice(0, 4));\n var answerWithHash = bin_utils_1.aesDecryptSync(encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv);\n var hash = answerWithHash.slice(0, 20);\n var answerWithPadding = answerWithHash.slice(20);\n var buffer = bin_utils_1.bytesToArrayBuffer(answerWithPadding);\n var deserializer = new tl_utils_1.TLDeserialization(buffer, { mtproto: true });\n var response = deserializer.fetchObject('Server_DH_inner_data');\n if (response._ != 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response /* constructor */);\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n console.log(utils_1.dT(), 'Done decrypting answer');\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n this.mtpVerifyDhParams(auth.g, auth.dhPrime, auth.gA);\n var offset = deserializer.getOffset();\n if (!bin_utils_1.bytesCmp(hash, bin_utils_1.sha1BytesSync(answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n MTProto.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n };\n Authorizer.prototype.mtpVerifyDhParams = function (g, dhPrime, gA) {\n console.log(utils_1.dT(), 'Verifying DH params');\n var dhPrimeHex = bin_utils_1.bytesToHex(dhPrime);\n if (g != 3 ||\n dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n console.log(utils_1.dT(), 'dhPrime cmp OK');\n var gABigInt = new jsbn_1.BigInteger(bin_utils_1.bytesToHex(gA), 16);\n var dhPrimeBigInt = new jsbn_1.BigInteger(dhPrimeHex, 16);\n if (gABigInt.compareTo(jsbn_1.BigInteger.ONE) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n if (gABigInt.compareTo(dhPrimeBigInt.subtract(jsbn_1.BigInteger.ONE)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n console.log(utils_1.dT(), '1 < gA < dhPrime-1 OK');\n var two = new jsbn_1.BigInteger(/* null */ '');\n two.fromInt(2);\n var twoPow = two.pow(2048 - 64);\n if (gABigInt.compareTo(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if (gABigInt.compareTo(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n console.log(utils_1.dT(), '2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n return true;\n };\n Authorizer.prototype.mtpSendSetClientDhParams = function (auth) {\n var _this = this;\n var deferred = auth.deferred;\n var gBytes = bin_utils_1.bytesFromHex(auth.g.toString(16));\n auth.b = new Array(256);\n MTProto.secureRandom.nextBytes(auth.b);\n cryptoworker_1.default.modPow(gBytes, auth.b, auth.dhPrime).then(function (gB) {\n var data = new tl_utils_1.TLSerialization({ mtproto: true });\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n // @ts-ignore\n var dataWithHash = bin_utils_1.sha1BytesSync(data.getBuffer()).concat(data.getBytes());\n var encryptedData = bin_utils_1.aesEncryptSync(dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n var request = new tl_utils_1.TLSerialization({ mtproto: true });\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n console.log(utils_1.dT(), 'Send set_client_DH_params');\n _this.mtpSendPlainRequest(auth.dcID, request.getBuffer()).then(function (deserializer) {\n var response = deserializer.fetchObject('Set_client_DH_params_answer');\n if (response._ != 'dh_gen_ok' && response._ != 'dh_gen_retry' && response._ != 'dh_gen_fail') {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.nonce, response.nonce)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer nonce mismatch'));\n return false;\n }\n if (!bin_utils_1.bytesCmp(auth.serverNonce, response.server_nonce)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer server_nonce mismatch'));\n return false;\n }\n cryptoworker_1.default.modPow(auth.gA, auth.b, auth.dhPrime).then(function (authKey) {\n var authKeyHash = bin_utils_1.sha1BytesSync(authKey), authKeyAux = authKeyHash.slice(0, 8), authKeyID = authKeyHash.slice(-8);\n console.log(utils_1.dT(), 'Got Set_client_DH_params_answer', response._);\n switch (response._) {\n case 'dh_gen_ok':\n var newNonceHash1 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([1], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash1 mismatch'));\n return false;\n }\n var serverSalt = bin_utils_1.bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n // console.log('Auth successfull!', authKeyID, authKey, serverSalt);\n auth.authKeyID = authKeyID;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n deferred.resolve(auth);\n break;\n case 'dh_gen_retry':\n var newNonceHash2 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([2], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch'));\n return false;\n }\n return _this.mtpSendSetClientDhParams(auth);\n case 'dh_gen_fail':\n var newNonceHash3 = bin_utils_1.sha1BytesSync(auth.newNonce.concat([3], authKeyAux)).slice(-16);\n if (!bin_utils_1.bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n deferred.reject(new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch'));\n return false;\n }\n deferred.reject(new Error('[MT] Set_client_DH_params_answer fail'));\n return false;\n }\n }, deferred.reject);\n }, deferred.reject);\n }, deferred.reject);\n };\n // mtpAuth\n Authorizer.prototype.auth = function (dcID) {\n var _this = this;\n if (dcID in this.cached) {\n return this.cached[dcID];\n }\n var nonce = [];\n for (var i = 0; i < 16; i++) {\n nonce.push(bin_utils_1.nextRandomInt(0xFF));\n }\n if (!MTProto.dcConfigurator.chooseServer(dcID)) {\n return Promise.reject(new Error('[MT] No server found for dc ' + dcID));\n }\n var promise = new Promise(function (resolve, reject) {\n var auth = {\n dcID: dcID,\n nonce: nonce,\n deferred: { resolve: resolve, reject: reject }\n };\n //this.cached[dcID] = auth.deferred.promise;\n _this.cached[dcID] = promise;\n setTimeout(function () {\n _this.mtpSendReqPQ(auth);\n });\n }).catch(function () {\n delete _this.cached[dcID];\n });\n return promise;\n //return this.cached[dcID];\n };\n return Authorizer;\n }());\n MTProto.Authorizer = Authorizer;\n var NetworkerFactory = /** @class */ (function () {\n function NetworkerFactory( /*public AppRuntimeManager: any , $rootScope: any */) {\n /* delete $http.defaults.headers.post['Content-Type']\n delete $http.defaults.headers.common['Accept'] */\n this.updatesProcessor = null;\n this.iii = 0;\n this.offline = false;\n this.offlineInited = false;\n this.akStopped = false;\n /* $rootScope.retryOnline = function() {\n $(document.body).trigger('online');\n } */\n }\n NetworkerFactory.prototype.startAll = function () {\n if (this.akStopped) {\n this.akStopped = false;\n // @ts-ignore\n this.updatesProcessor({\n _: 'new_session_created'\n }, true);\n }\n };\n NetworkerFactory.prototype.stopAll = function () {\n this.akStopped = true;\n };\n NetworkerFactory.prototype.setUpdatesProcessor = function (callback) {\n this.updatesProcessor = callback;\n };\n NetworkerFactory.prototype.getNetworker = function (dcID, authKey, serverSalt, options) {\n console.log(utils_1.dT(), 'NetworkerFactory: creating new instance of MTPNetworker...');\n return new mtnetworker_1.MTPNetworker(this, dcID, authKey, serverSalt, options);\n };\n return NetworkerFactory;\n }());\n MTProto.NetworkerFactory = NetworkerFactory;\n var ApiManager = /** @class */ (function () {\n function ApiManager() {\n //MtpSingleInstanceService.start();\n var _this = this;\n this.cachedNetworkers = {};\n this.cachedUploadNetworkers = {};\n this.cachedExportPromise = {};\n this.baseDcID = false;\n this.telegramMeNotified = false;\n storage_1.default.get('dc').then(function (dcID) {\n if (dcID) {\n _this.baseDcID = dcID;\n }\n });\n }\n ApiManager.prototype.telegramMeNotify = function (newValue) {\n if (this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n exports.telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n };\n // mtpSetUserAuth\n ApiManager.prototype.setUserAuth = function (dcID, userAuth) {\n var fullUserAuth = Object.assign({ dcID: dcID }, userAuth);\n storage_1.default.set({\n dc: dcID,\n user_auth: fullUserAuth\n });\n this.telegramMeNotify(true);\n $rootScope.$broadcast('user_auth', fullUserAuth);\n this.baseDcID = dcID;\n };\n // mtpLogOut\n ApiManager.prototype.logOut = function () {\n var _this = this;\n var storageKeys = [];\n for (var dcID = 1; dcID <= 5; dcID++) {\n storageKeys.push('dc' + dcID + '_auth_key');\n }\n // WebPushApiManager.forceUnsubscribe(); // WARNING\n return storage_1.default.get(storageKeys).then(function (storageResult) {\n var logoutPromises = [];\n for (var i = 0; i < storageResult.length; i++) {\n if (storageResult[i]) {\n logoutPromises.push(_this.invokeApi('auth.logOut', {}, { dcID: i + 1, ignoreErrors: true }));\n }\n }\n return Promise.all(logoutPromises).then(function () {\n storage_1.default.remove('dc', 'user_auth');\n _this.baseDcID = false;\n _this.telegramMeNotify(false);\n return _this.mtpClearStorage();\n }, function (error) {\n storageKeys.push('dc', 'user_auth');\n storage_1.default.remove(storageKeys);\n _this.baseDcID = false;\n error.handled = true;\n _this.telegramMeNotify(false);\n return _this.mtpClearStorage();\n });\n });\n };\n ApiManager.prototype.mtpClearStorage = function () {\n var saveKeys = ['user_auth', 't_user_auth', 'dc', 't_dc'];\n for (var dcID = 1; dcID <= 5; dcID++) {\n saveKeys.push('dc' + dcID + '_auth_key');\n saveKeys.push('t_dc' + dcID + '_auth_key');\n }\n storage_1.default.noPrefix();\n storage_1.default.get(saveKeys).then(function (values) {\n storage_1.default.clear().then(function () {\n var restoreObj = {};\n saveKeys.forEach(function (key, i) {\n var value = values[i];\n if (value !== false && value !== undefined) {\n restoreObj[key] = value;\n }\n });\n storage_1.default.noPrefix();\n return storage_1.default.set(restoreObj);\n });\n });\n };\n // mtpGetNetworker\n ApiManager.prototype.getNetworker = function (dcID, options) {\n if (options === void 0) { options = {}; }\n var cache = (options.fileUpload || options.fileDownload)\n ? this.cachedUploadNetworkers\n : this.cachedNetworkers;\n if (!dcID) {\n throw new Error('get Networker without dcID');\n }\n if (cache[dcID] !== undefined) {\n return Promise.resolve(cache[dcID]);\n //return qSync.when(cache[dcID]);\n }\n var akk = 'dc' + dcID + '_auth_key';\n var ssk = 'dc' + dcID + '_server_salt';\n // WARNING added []\n return storage_1.default.get([akk, ssk]).then(function (result) {\n if (cache[dcID] !== undefined) {\n return cache[dcID];\n }\n var authKeyHex = result[0];\n var serverSaltHex = result[1];\n // console.log('ass', dcID, authKeyHex, serverSaltHex)\n if (authKeyHex && authKeyHex.length == 512) {\n if (!serverSaltHex || serverSaltHex.length != 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n var authKey = bin_utils_1.bytesFromHex(authKeyHex);\n var serverSalt = bin_utils_1.bytesFromHex(serverSaltHex);\n return cache[dcID] = MTProto.networkerFactory.getNetworker(dcID, authKey, serverSalt, options);\n }\n if (!options.createNetworker) {\n return Promise.reject({ type: 'AUTH_KEY_EMPTY', code: 401 });\n //return $q.reject({type: 'AUTH_KEY_EMPTY', code: 401})\n }\n return MTProto.authorizer.auth(dcID).then(function (auth) {\n var _a;\n var storeObj = (_a = {},\n _a[akk] = bin_utils_1.bytesToHex(auth.authKey),\n _a[ssk] = bin_utils_1.bytesToHex(auth.serverSalt),\n _a);\n storage_1.default.set(storeObj);\n return cache[dcID] = MTProto.networkerFactory.getNetworker(dcID, auth.authKey, auth.serverSalt, options);\n }, function (error) {\n console.log('Get networker error', error, error.stack);\n return Promise.reject(error);\n //return $q.reject(error);\n });\n });\n };\n // mtpInvokeApi\n ApiManager.prototype.invokeApi = function (method, params, options) {\n var _this = this;\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n console.log(utils_1.dT(), 'Invoke api', method, params, options);\n return new Promise(function (resolve, reject) {\n var rejectPromise = function (error) {\n if (!error) {\n error = { type: 'ERROR_EMPTY' };\n }\n else if (!utils_1.isObject(error)) {\n error = { message: error };\n }\n reject(error);\n if (options.ignoreErrors) {\n return;\n }\n if (error.code == 406) {\n error.handled = true;\n }\n if (!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(function () {\n if (!error.handled) {\n if (error.code == 401) {\n // @ts-ignore WARNING!\n _this.logOut().finally(function () {\n if (location.protocol == 'http:' &&\n !Config.Modes.http &&\n Config.App.domains.indexOf(location.hostname) != -1) {\n location.href = location.href.replace(/^http:/, 'https:');\n }\n else {\n location.hash = '/login';\n // AppRuntimeManager.reload(); // WARNING\n }\n });\n }\n else {\n // ErrorService.show({error: error}); // WARNING\n }\n error.handled = true;\n }\n }, 100);\n }\n };\n var dcID;\n var cachedNetworker;\n var stack = (new Error()).stack || 'empty stack';\n var performRequest = function (networker) {\n return (cachedNetworker = networker)\n .wrapApiCall(method, params, options)\n .then(resolve, function (error) {\n console.error(utils_1.dT(), 'Error', error.code, error.type, _this.baseDcID, dcID);\n if (error.code == 401 && _this.baseDcID == dcID) {\n storage_1.default.remove('dc', 'user_auth');\n _this.telegramMeNotify(false);\n rejectPromise(error);\n }\n else if (error.code == 401 && _this.baseDcID && dcID != _this.baseDcID) {\n if (_this.cachedExportPromise[dcID] === undefined) {\n var promise = new Promise(function (exportResolve, exportReject) {\n _this.invokeApi('auth.exportAuthorization', { dc_id: dcID }, { noErrorBox: true }).then(function (exportedAuth) {\n _this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, { dcID: dcID, noErrorBox: true }).then(exportResolve, exportReject);\n }, exportReject);\n });\n _this.cachedExportPromise[dcID] = promise;\n }\n _this.cachedExportPromise[dcID].then(function () {\n (cachedNetworker = networker).wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n else if (error.code == 303) {\n var newDcID = error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2];\n if (newDcID != dcID) {\n if (options.dcID) {\n options.dcID = newDcID;\n }\n else {\n storage_1.default.set({ dc: _this.baseDcID = newDcID });\n }\n _this.getNetworker(newDcID, options).then(function (networker) {\n networker.wrapApiCall(method, params, options).then(resolve, rejectPromise);\n }, rejectPromise);\n }\n }\n else if (!options.rawError && error.code == 420) {\n var waitTime = error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 10;\n if (waitTime > (options.timeout || 60)) {\n return rejectPromise(error);\n }\n setTimeout(function () {\n performRequest(cachedNetworker);\n }, waitTime * 1000);\n }\n else if (!options.rawError && (error.code == 500 || error.type == 'MSG_WAIT_FAILED')) {\n var now = utils_1.tsNow();\n if (options.stopTime) {\n if (now >= options.stopTime) {\n return rejectPromise(error);\n }\n }\n else {\n options.stopTime = now + (options.timeout !== undefined ? options.timeout : 10) * 1000;\n }\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n setTimeout(function () {\n performRequest(cachedNetworker);\n }, options.waitTime * 1000);\n }\n else {\n rejectPromise(error);\n }\n });\n };\n if (dcID = (options.dcID || _this.baseDcID)) {\n _this.getNetworker(dcID, options).then(performRequest, rejectPromise);\n }\n else {\n storage_1.default.get('dc').then(function (baseDcID) {\n _this.getNetworker(dcID = baseDcID || 2, options).then(performRequest, rejectPromise);\n });\n }\n });\n };\n // mtpGetUserID\n ApiManager.prototype.getUserID = function () {\n var _this = this;\n return storage_1.default.get('user_auth').then(function (auth) {\n _this.telegramMeNotify(auth && auth.id > 0 || false);\n return auth.id || 0;\n });\n };\n ApiManager.prototype.getBaseDcID = function () {\n return this.baseDcID || false;\n };\n return ApiManager;\n }());\n MTProto.ApiManager = ApiManager;\n var ApiFileManager = /** @class */ (function () {\n function ApiFileManager() {\n this.cachedFs = false;\n this.cachedFsPromise = false;\n this.cachedSavePromises = {};\n this.cachedDownloadPromises = {};\n this.cachedDownloads = {};\n this.downloadPulls = {};\n this.downloadActives = {};\n this.index = 0;\n }\n ApiFileManager.prototype.downloadRequest = function (dcID, cb, activeDelta) {\n var _this = this;\n if (this.downloadPulls[dcID] === undefined) {\n this.downloadPulls[dcID] = [];\n this.downloadActives[dcID] = 0;\n }\n var downloadPull = this.downloadPulls[dcID];\n var promise = new Promise(function (resolve, reject) {\n // WARNING deferred!\n downloadPull.push({ cb: cb, deferred: { resolve: resolve, reject: reject }, activeDelta: activeDelta });\n });\n setTimeout(function () {\n _this.downloadCheck(dcID);\n }, 0);\n return promise;\n };\n ApiFileManager.prototype.downloadCheck = function (dcID) {\n var _this = this;\n var downloadPull = this.downloadPulls[dcID];\n var downloadLimit = dcID == 'upload' ? 11 : 5;\n if (this.downloadActives[dcID] >= downloadLimit || !downloadPull || !downloadPull.length) {\n return false;\n }\n var data = downloadPull.shift();\n var activeDelta = data.activeDelta || 1;\n this.downloadActives[dcID] += activeDelta;\n this.index++;\n data.cb()\n .then(function (result) {\n _this.downloadActives[dcID] -= activeDelta;\n _this.downloadCheck(dcID);\n data.deferred.resolve(result);\n }, function (error) {\n _this.downloadActives[dcID] -= activeDelta;\n _this.downloadCheck(dcID);\n data.deferred.reject(error);\n });\n };\n ApiFileManager.prototype.getFileName = function (location) {\n switch (location._) {\n case 'inputDocumentFileLocation':\n var fileName = (location.file_name || '').split('.', 2);\n var ext = fileName[1] || '';\n if (location.stickerType == 1 /* && !WebpManager.isWebpSupported() */) { // warning\n ext += 'webp'; /* 'png'; */\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n var versionPart = location.version ? ('v' + location.version) : '';\n return fileName[0] + '_' + location.id + versionPart + (ext ? '.' + ext : ext);\n default:\n if (!location.volume_id && !location.file_reference) {\n console.trace('Empty location', location);\n }\n var ext = 'jpg';\n if (location.stickerType == 1) {\n ext = 'webp' /* WebpManager.isWebpSupported() ? 'webp' : 'png'*/;\n }\n else if (location.stickerType == 2) {\n ext += 'tgs';\n }\n if (location.volume_id) {\n return location.volume_id + '_' + location.local_id + '_' + location.secret + '.' + ext;\n }\n else {\n return location.id + '_' + location.access_hash + '.' + ext;\n }\n }\n };\n ApiFileManager.prototype.getTempFileName = function (file) {\n var size = file.size || -1;\n var random = bin_utils_1.nextRandomInt(0xFFFFFFFF);\n return '_temp' + random + '_' + size;\n };\n ApiFileManager.prototype.getCachedFile = function (location) {\n if (!location) {\n return false;\n }\n var fileName = this.getFileName(location);\n return this.cachedDownloads[fileName] || false;\n };\n ApiFileManager.prototype.getFileStorage = function () {\n if (!Config.Modes.memory_only) {\n /* if(TmpfsFileStorage.isAvailable()) {\n return TmpfsFileStorage;\n } */\n if (idb_1.default.isAvailable()) {\n return idb_1.default;\n }\n }\n return idb_1.default /* MemoryFileStorage */;\n };\n ApiFileManager.prototype.saveSmallFile = function (location, bytes) {\n var _this = this;\n var fileName = this.getFileName(location);\n if (!this.cachedSavePromises[fileName]) {\n this.cachedSavePromises[fileName] = this.getFileStorage().saveFile(fileName, bytes).then(function (blob) {\n return _this.cachedDownloads[fileName] = blob;\n }, function (error) {\n delete _this.cachedSavePromises[fileName];\n });\n }\n return this.cachedSavePromises[fileName];\n };\n ApiFileManager.prototype.downloadSmallFile = function (location, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n var dcID = options.dcID || location.dc_id;\n var mimeType = options.mimeType || 'image/jpeg';\n var fileName = this.getFileName(location);\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n if (cachedPromise) {\n return cachedPromise;\n }\n var fileStorage = this.getFileStorage();\n return this.cachedDownloadPromises[fileName] = fileStorage.getFile(fileName).then(function (blob) {\n return _this.cachedDownloads[fileName] = blob;\n }, function () {\n var downloadPromise = _this.downloadRequest(dcID, function () {\n var inputLocation = location;\n if (!inputLocation._ || inputLocation._ == 'fileLocation') {\n inputLocation = Object.assign({}, location, { _: 'inputFileLocation' });\n }\n var params = {\n flags: 0,\n location: inputLocation,\n offset: 0,\n limit: 1024 * 1024\n };\n console.log('next small promise', params);\n return MTProto.apiManager.invokeApi('upload.getFile', params, {\n dcID: dcID,\n fileDownload: true,\n createNetworker: true,\n noErrorBox: true\n });\n }, dcID);\n var processDownloaded = function (bytes) {\n return Promise.resolve(bytes);\n /* if(!location.sticker || WebpManager.isWebpSupported()) {\n return qSync.when(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n return fileStorage.getFileWriter(fileName, mimeType).then(function (fileWriter) {\n return downloadPromise.then(function (result) {\n return processDownloaded(result.bytes).then(function (proccessedResult) {\n return filemanager_1.default.write(fileWriter, proccessedResult).then(function () {\n return _this.cachedDownloads[fileName] = fileWriter.finalize();\n });\n });\n });\n });\n });\n };\n ApiFileManager.prototype.getDownloadedFile = function (location, size) {\n var fileStorage = this.getFileStorage();\n var fileName = this.getFileName(location);\n return fileStorage.getFile(fileName, size);\n };\n ApiFileManager.prototype.downloadFile = function (dcID, location, size, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (!filemanager_1.default.isAvailable()) {\n return Promise.reject({ type: 'BROWSER_BLOB_NOT_SUPPORTED' });\n }\n /* var processSticker = false;\n if(location.sticker && !WebpManager.isWebpSupported()) {\n if(options.toFileEntry || size > 524288) {\n delete location.sticker;\n } else {\n processSticker = true;\n options.mime = 'image/png';\n }\n } */\n // console.log(dT(), 'Dload file', dcID, location, size)\n var fileName = this.getFileName(location);\n var toFileEntry = options.toFileEntry || null;\n var cachedPromise = this.cachedSavePromises[fileName] || this.cachedDownloadPromises[fileName];\n var fileStorage = this.getFileStorage();\n // console.log(dT(), 'fs', fileStorage.name, fileName, cachedPromise)\n if (cachedPromise) {\n if (toFileEntry) {\n return cachedPromise.then(function (blob) {\n return filemanager_1.default.copy(blob, toFileEntry);\n });\n }\n return cachedPromise;\n }\n //var deferred = $q.defer()\n var deferredHelper = { notify: function () { } };\n var deferred = new Promise(function (resolve, reject) {\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n });\n Object.assign(deferred, deferredHelper);\n var canceled = false;\n var resolved = false;\n var mimeType = options.mime_type || 'image/jpeg', cacheFileWriter;\n var errorHandler = function (error) {\n deferred.reject(error);\n errorHandler = function () { };\n if (cacheFileWriter &&\n (!error || error.type != 'DOWNLOAD_CANCELED')) {\n cacheFileWriter.truncate(0);\n }\n };\n fileStorage.getFile(fileName, size).then(function (blob) {\n if (toFileEntry) {\n filemanager_1.default.copy(blob, toFileEntry).then(function () {\n deferred.resolve();\n }, errorHandler);\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = blob);\n }\n }, function () {\n var fileWriterPromise = toFileEntry ? filemanager_1.default.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType);\n var processDownloaded = function (bytes) {\n return Promise.resolve(bytes);\n /* if(!processSticker) {\n return Promise.resolve(bytes);\n }\n \n return WebpManager.getPngBlobFromWebp(bytes); */\n };\n fileWriterPromise.then(function (fileWriter) {\n cacheFileWriter = fileWriter;\n var limit = 524288, offset;\n var startOffset = 0;\n var writeFilePromise = Promise.resolve(), writeFileDeferred;\n if (fileWriter.length) {\n startOffset = fileWriter.length;\n if (startOffset >= size) {\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n return;\n }\n fileWriter.seek(startOffset);\n deferred.notify({ done: startOffset, total: size });\n }\n var _loop_1 = function () {\n //writeFileDeferred = $q.defer();\n var writeFileDeferredHelper = {};\n writeFileDeferred = new Promise(function (resolve, reject) {\n writeFileDeferredHelper.resolve = resolve;\n writeFileDeferredHelper.reject = reject;\n });\n Object.assign(writeFileDeferred, writeFileDeferredHelper);\n ;\n (function (isFinal, offset, writeFileDeferred, writeFilePromise) {\n return _this.downloadRequest(dcID, function () {\n if (canceled) {\n return Promise.resolve();\n }\n return MTProto.apiManager.invokeApi('upload.getFile', {\n flags: 0,\n location: location,\n offset: offset,\n limit: limit\n }, {\n dcID: dcID,\n fileDownload: true,\n singleInRequest: 'safari' in window,\n createNetworker: true\n });\n }, dcID).then(function (result) {\n writeFilePromise.then(function () {\n if (canceled) {\n return Promise.resolve();\n }\n return processDownloaded(result.bytes).then(function (processedResult) {\n return filemanager_1.default.write(fileWriter, processedResult).then(function () {\n writeFileDeferred.resolve();\n }, errorHandler).then(function () {\n if (isFinal) {\n resolved = true;\n if (toFileEntry) {\n deferred.resolve();\n }\n else {\n deferred.resolve(_this.cachedDownloads[fileName] = fileWriter.finalize());\n }\n }\n else {\n deferred.notify({ done: offset + limit, total: size });\n }\n });\n });\n });\n });\n })(offset + limit >= size, offset, writeFileDeferred, writeFilePromise);\n writeFilePromise = writeFileDeferred;\n };\n for (offset = startOffset; offset < size; offset += limit) {\n _loop_1();\n }\n });\n });\n deferred.cancel = function () {\n if (!canceled && !resolved) {\n canceled = true;\n delete _this.cachedDownloadPromises[fileName];\n errorHandler({ type: 'DOWNLOAD_CANCELED' });\n }\n };\n if (!toFileEntry) {\n this.cachedDownloadPromises[fileName] = deferred;\n }\n return deferred;\n };\n ApiFileManager.prototype.uploadFile = function (file) {\n var fileSize = file.size, isBigFile = fileSize >= 10485760, canceled = false, resolved = false, doneParts = 0, partSize = 262144, // 256 Kb\n activeDelta = 2;\n if (fileSize > 67108864) {\n partSize = 524288;\n activeDelta = 4;\n }\n else if (fileSize < 102400) {\n partSize = 32768;\n activeDelta = 1;\n }\n var totalParts = Math.ceil(fileSize / partSize);\n if (totalParts > 3000) {\n return Promise.reject({ type: 'FILE_TOO_BIG' });\n }\n var fileID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n //var deferred = $q.defer();\n var deferredHelper = { notify: function () { } };\n var deferred = new Promise(function (resolve, reject) {\n deferredHelper.resolve = resolve;\n deferredHelper.reject = reject;\n return Promise.resolve();\n });\n Object.assign(deferred, deferredHelper);\n var errorHandler = function (error) {\n console.error(utils_1.dT(), 'Up Error', error);\n deferred.reject(error);\n canceled = true;\n errorHandler = function () { };\n };\n var _part = 0, resultInputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileID,\n parts: totalParts,\n name: file.name,\n md5_checksum: ''\n };\n var _loop_2 = function (offset) {\n var part = _part++; // 0, 1\n this_1.downloadRequest('upload', function () {\n return new Promise(function (uploadResolve, uploadReject) {\n var reader = new FileReader();\n var blob = file.slice(offset, offset + partSize);\n reader.onloadend = function (e) {\n if (canceled) {\n uploadReject();\n return;\n }\n if (e.target.readyState != FileReader.DONE) {\n console.error(utils_1.dT(), 'wrong readyState!');\n return;\n }\n console.log(utils_1.dT(), 'Starting to upload file, isBig:', isBigFile, fileID, part);\n MTProto.apiManager.invokeApi(isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart', {\n file_id: fileID,\n file_part: part,\n file_total_parts: totalParts,\n bytes: e.target.result\n }, {\n startMaxLength: partSize + 256,\n fileUpload: true,\n singleInRequest: true\n }).then(function (result) {\n doneParts++;\n uploadResolve();\n console.log(utils_1.dT(), 'Progress', doneParts * partSize / fileSize);\n if (doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n else {\n deferred.notify({ done: doneParts * partSize, total: fileSize });\n }\n }, errorHandler);\n };\n reader.readAsArrayBuffer(blob);\n });\n }, activeDelta);\n };\n var this_1 = this;\n for (var offset = 0; offset < fileSize; offset += partSize) {\n _loop_2(offset);\n }\n deferred.cancel = function () {\n console.log('cancel upload', canceled, resolved);\n if (!canceled && !resolved) {\n canceled = true;\n errorHandler({ type: 'UPLOAD_CANCELED' });\n }\n };\n return deferred;\n };\n return ApiFileManager;\n }());\n MTProto.ApiFileManager = ApiFileManager;\n var ServerTimeManager = /** @class */ (function () {\n function ServerTimeManager() {\n var _this = this;\n this.timestampNow = utils_1.tsNow(true);\n this.midnightNoOffset = this.timestampNow - (this.timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000));\n this.serverTimeOffset = 0;\n this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n };\n this.midnightOffseted.setHours(0);\n this.midnightOffseted.setMinutes(0);\n this.midnightOffseted.setSeconds(0);\n storage_1.default.get('server_time_offset').then(function (to) {\n if (to) {\n _this.serverTimeOffset = to;\n _this.timeParams.serverTimeOffset = to;\n }\n });\n }\n return ServerTimeManager;\n }());\n MTProto.ServerTimeManager = ServerTimeManager;\n var PasswordManager = /** @class */ (function () {\n function PasswordManager() {\n }\n PasswordManager.prototype.getState = function (options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('account.getPassword', {}, options).then(function (result) {\n return result;\n });\n };\n /* public updateSettings(state: any, settings: any) {\n var currentHashPromise;\n var newHashPromise;\n var params: any = {\n new_settings: {\n _: 'account.passwordInputSettings',\n flags: 0,\n hint: settings.hint || ''\n }\n };\n \n if(typeof settings.cur_password === 'string' &&\n settings.cur_password.length > 0) {\n currentHashPromise = this.makePasswordHash(state.current_salt, settings.cur_password);\n } else {\n currentHashPromise = Promise.resolve([]);\n }\n \n if (typeof settings.new_password === 'string' &&\n settings.new_password.length > 0) {\n var saltRandom = new Array(8);\n var newSalt = bufferConcat(state.new_salt, saltRandom);\n secureRandom.nextBytes(saltRandom);\n newHashPromise = this.makePasswordHash(newSalt, settings.new_password);\n params.new_settings.new_salt = newSalt;\n params.new_settings.flags |= 1;\n } else {\n if(typeof settings.new_password === 'string') {\n params.new_settings.flags |= 1;\n params.new_settings.new_salt = [];\n }\n newHashPromise = Promise.resolve([]);\n }\n \n if(typeof settings.email === 'string') {\n params.new_settings.flags |= 2;\n params.new_settings.email = settings.email || '';\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.current_password_hash = hashes[0];\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n } */\n PasswordManager.prototype.check = function (state, password, options) {\n if (options === void 0) { options = {}; }\n return this.computeCheck(password, state).then(function (inputCheckPassword) {\n return MTProto.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options);\n });\n };\n PasswordManager.prototype.requestRecovery = function (options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n };\n PasswordManager.prototype.recover = function (code, options) {\n if (options === void 0) { options = {}; }\n return MTProto.apiManager.invokeApi('auth.recoverPassword', {\n code: code\n }, options);\n };\n /* public makePasswordHash(salt: any, password: any) {\n var passwordUTF8 = unescape(encodeURIComponent(password));\n \n var buffer = new ArrayBuffer(passwordUTF8.length);\n var byteView = new Uint8Array(buffer);\n for(var i = 0, len = passwordUTF8.length; i < len; i++) {\n byteView[i] = passwordUTF8.charCodeAt(i);\n }\n \n buffer = bufferConcat(bufferConcat(salt, byteView), salt);\n \n return CryptoWorker.sha256Hash(buffer);\n } */\n PasswordManager.prototype.makePasswordHash = function (password, client_salt, server_salt) {\n var passwordUTF8 = unescape(encodeURIComponent(password));\n // @ts-ignore\n var textEncoder = new TextEncoder(\"utf-8\");\n var passwordBuffer = textEncoder.encode(passwordUTF8);\n // right\n var buffer = bin_utils_1.bufferConcats(client_salt, passwordBuffer, client_salt);\n return cryptoworker_1.default.sha256Hash(buffer).then(function (buffer) {\n console.log('encoded 1', bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n buffer = bin_utils_1.bufferConcats(server_salt, buffer, server_salt);\n return cryptoworker_1.default.sha256Hash(buffer).then(function (buffer) {\n console.log('encoded 2', buffer, bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n return cryptoworker_1.default.pbkdf2(new Uint8Array(buffer), client_salt, 100000).then(function (hash) {\n console.log('encoded 3', hash, bin_utils_1.bytesToHex(new Uint8Array(hash)));\n hash = bin_utils_1.bufferConcats(server_salt, hash, server_salt);\n return cryptoworker_1.default.sha256Hash(hash).then(function (buffer) {\n console.log('got password hash:', buffer, bin_utils_1.bytesToHex(new Uint8Array(buffer)));\n return buffer;\n });\n });\n });\n });\n };\n PasswordManager.prototype.computeCheck = function (password, state) {\n return __awaiter(this, void 0, void 0, function () {\n var algo, p, B, g, check_prime_and_good, pw_hash, x, padArray, pForHash, gForHash, b_for_hash, g_x, k, kg_x, is_good_mod_exp_first, generate_and_check_random, _a, a, a_for_hash, u, g_b, ux, a_ux, S, K, h1, h2, buff, _b, _c, M1, out;\n var _this = this;\n return __generator(this, function (_d) {\n switch (_d.label) {\n case 0:\n algo = state.current_algo;\n p = leemon_1.str2bigInt(bin_utils_1.bytesToHex(algo.p), 16);\n B = leemon_1.str2bigInt(bin_utils_1.bytesToHex(state.srp_B), 16);\n g = leemon_1.int2bigInt(algo.g, 32, 256);\n console.log('p', leemon_1.bigInt2str(p, 16));\n console.log('B', leemon_1.bigInt2str(B, 16));\n check_prime_and_good = function (bytes, g) {\n var good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n if (bin_utils_1.bytesToHex(bytes) == good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n // TO-DO check_prime_and_good_check\n };\n return [4 /*yield*/, this.makePasswordHash(password, new Uint8Array(algo.salt1), new Uint8Array(algo.salt2))];\n case 1:\n pw_hash = _d.sent();\n x = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(pw_hash)), 16);\n console.warn('computed pw_hash:', pw_hash, x, bin_utils_1.bytesToHex(new Uint8Array(pw_hash)));\n padArray = function (arr, len, fill) {\n if (fill === void 0) { fill = 0; }\n return Array(len).fill(fill).concat(arr).slice(-len);\n };\n pForHash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(p, 16)), 256);\n gForHash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(g, 16)), 256);\n b_for_hash = padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(B, 16)), 256);\n console.log(bin_utils_1.bytesToHex(pForHash));\n console.log(bin_utils_1.bytesToHex(gForHash));\n console.log(bin_utils_1.bytesToHex(b_for_hash));\n g_x = leemon_1.powMod(g, x, p);\n console.log('g_x', leemon_1.bigInt2str(g_x, 16));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(bin_utils_1.bufferConcat(pForHash, gForHash))];\n case 2:\n k = _d.sent();\n k = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(k)), 16);\n console.log('k', leemon_1.bigInt2str(k, 16));\n kg_x = leemon_1.mod(leemon_1.mult(k, g_x), p);\n // good\n console.log('kg_x', leemon_1.bigInt2str(kg_x, 16));\n is_good_mod_exp_first = function (modexp, prime) {\n var diff = leemon_1.sub(prime, modexp);\n var min_diff_bits_count = 2048 - 64;\n var max_mod_exp_size = 256;\n if (leemon_1.negative(diff) ||\n leemon_1.bitSize(diff) < min_diff_bits_count ||\n leemon_1.bitSize(modexp) < min_diff_bits_count ||\n Math.floor((leemon_1.bitSize(modexp) + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n generate_and_check_random = function () { return __awaiter(_this, void 0, void 0, function () {\n var random_size, a_1, A, a_for_hash_1, s, u_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n random_size = 256;\n _a.label = 1;\n case 1:\n if (!true) return [3 /*break*/, 4];\n a_1 = leemon_1.str2bigInt(bin_utils_1.bytesToHex(state.secure_random), 16);\n A = leemon_1.powMod(g, a_1, p);\n if (!is_good_mod_exp_first(A, p)) return [3 /*break*/, 3];\n a_for_hash_1 = bin_utils_1.bytesFromHex(leemon_1.bigInt2str(A, 16));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(bin_utils_1.bufferConcat(new Uint8Array(a_for_hash_1), new Uint8Array(b_for_hash)))];\n case 2:\n s = _a.sent();\n u_1 = leemon_1.str2bigInt(bin_utils_1.bytesToHex(new Uint8Array(s)), 16);\n //if(u > 0)\n if (!leemon_1.isZero(u_1) && !leemon_1.negative(u_1))\n return [2 /*return*/, { a: a_1, a_for_hash: a_for_hash_1, u: u_1 }];\n _a.label = 3;\n case 3: return [3 /*break*/, 1];\n case 4: return [2 /*return*/];\n }\n });\n }); };\n return [4 /*yield*/, generate_and_check_random()];\n case 3:\n _a = _d.sent(), a = _a.a, a_for_hash = _a.a_for_hash, u = _a.u;\n console.log('a', leemon_1.bigInt2str(a, 16));\n console.log('a_for_hash', bin_utils_1.bytesToHex(a_for_hash));\n console.log('u', leemon_1.bigInt2str(u, 16));\n // g_b = (B - kg_x) % p\n console.log('B - kg_x', leemon_1.bigInt2str(leemon_1.sub(B, kg_x), 16));\n if (!leemon_1.greater(B, kg_x)) {\n console.log('negative');\n g_b = leemon_1.add(B, p);\n }\n else\n g_b = B;\n g_b = leemon_1.mod(leemon_1.sub(g_b, kg_x), p);\n ux = leemon_1.mult(u, x);\n a_ux = leemon_1.add(a, ux);\n S = leemon_1.powMod(g_b, a_ux, p);\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(padArray(bin_utils_1.bytesFromHex(leemon_1.bigInt2str(S, 16)), 256))];\n case 4:\n K = _d.sent();\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(pForHash)];\n case 5:\n h1 = _d.sent();\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(gForHash)];\n case 6:\n h2 = _d.sent();\n h1 = bin_utils_1.bytesXor(new Uint8Array(h1), new Uint8Array(h2));\n _b = bin_utils_1.bufferConcats;\n _c = [h1];\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(algo.salt1)];\n case 7:\n _c = _c.concat([_d.sent()]);\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(algo.salt2)];\n case 8:\n buff = _b.apply(void 0, _c.concat([_d.sent(),\n a_for_hash,\n b_for_hash,\n K]));\n return [4 /*yield*/, cryptoworker_1.default.sha256Hash(buff)];\n case 9:\n M1 = _d.sent();\n out = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1: new Uint8Array(M1)\n };\n console.log('out', bin_utils_1.bytesToHex(out.A), bin_utils_1.bytesToHex(out.M1));\n return [2 /*return*/, out];\n }\n });\n });\n };\n return PasswordManager;\n }());\n MTProto.PasswordManager = PasswordManager;\n MTProto.passwordManager = new PasswordManager();\n MTProto.secureRandom = new jsbn_1.SecureRandom();\n //export const mtproto = new MTProto();\n MTProto.dcConfigurator = new DcConfigurator();\n MTProto.rsaKeysManager = new RSAKeysManager();\n MTProto.timeManager = new TimeManager();\n MTProto.authorizer = new Authorizer();\n MTProto.networkerFactory = new NetworkerFactory();\n MTProto.apiManager = new ApiManager();\n MTProto.apiFileManager = new ApiFileManager();\n MTProto.serverTimeManager = new ServerTimeManager();\n})(MTProto = exports.MTProto || (exports.MTProto = {}));\nwindow.MTProto = MTProto;\n"
},
{
"id": 3,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/runtime/api.js",
"name": "./node_modules/css-loader/dist/runtime/api.js",
"index": 3,
"index2": 0,
"size": 2677,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerId": 22,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 22,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 185,
"building": 23
}
}
],
"profile": {
"factory": 726,
"building": 109
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 20,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"type": "cjs require",
"userRequest": "../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-84"
},
{
"moduleId": 22,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "../../css-loader/dist/runtime/api.js",
"loc": "1:27-74"
},
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-87"
},
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/api.js",
"loc": "1:27-87"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \"{\").concat(content, \"}\");\n }\n\n return content;\n }).join('');\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery) {\n if (typeof modules === 'string') {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = modules[_i]; // skip already imported module\n // this implementation is not 100% perfect for weird media query combinations\n // when a module is imported multiple times with different media queries.\n // I hope this will never occur (Hey this way we have smaller bundles)\n\n if (item[0] == null || !alreadyImportedModules[item[0]]) {\n if (mediaQuery && !item[2]) {\n item[2] = mediaQuery;\n } else if (mediaQuery) {\n item[2] = \"(\".concat(item[2], \") and (\").concat(mediaQuery, \")\");\n }\n\n list.push(item);\n }\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || ''; // eslint-disable-next-line prefer-destructuring\n\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot).concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n return \"/*# \".concat(data, \" */\");\n}"
},
{
"id": 4,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"name": "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"index": 4,
"index2": 2,
"size": 6909,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"issuerId": 19,
"issuerName": "./src/materialize.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 187,
"building": 2741,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 19,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./src/materialize.scss",
"moduleName": "./src/materialize.scss",
"type": "cjs require",
"userRequest": "!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-94"
},
{
"moduleId": 21,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-84"
},
{
"moduleId": 23,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./src/scss/style.scss",
"moduleName": "./src/scss/style.scss",
"type": "cjs require",
"userRequest": "!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-97"
},
{
"moduleId": 27,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./src/scss/tgico.scss",
"moduleName": "./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js",
"loc": "12:13-97"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n\nvar stylesInDom = {};\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nfunction listToStyles(list, options) {\n var styles = [];\n var newStyles = {};\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var css = item[1];\n var media = item[2];\n var sourceMap = item[3];\n var part = {\n css: css,\n media: media,\n sourceMap: sourceMap\n };\n\n if (!newStyles[id]) {\n styles.push(newStyles[id] = {\n id: id,\n parts: [part]\n });\n } else {\n newStyles[id].parts.push(part);\n }\n }\n\n return styles;\n}\n\nfunction addStylesToDom(styles, options) {\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i];\n var domStyle = stylesInDom[item.id];\n var j = 0;\n\n if (domStyle) {\n domStyle.refs++;\n\n for (; j < domStyle.parts.length; j++) {\n domStyle.parts[j](item.parts[j]);\n }\n\n for (; j < item.parts.length; j++) {\n domStyle.parts.push(addStyle(item.parts[j], options));\n }\n } else {\n var parts = [];\n\n for (; j < item.parts.length; j++) {\n parts.push(addStyle(item.parts[j], options));\n }\n\n stylesInDom[item.id] = {\n id: item.id,\n refs: 1,\n parts: parts\n };\n }\n }\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n\n if (typeof options.attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n options.attributes.nonce = nonce;\n }\n }\n\n Object.keys(options.attributes).forEach(function (key) {\n style.setAttribute(key, options.attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n }\n\n if (sourceMap && btoa) {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n options.attributes = typeof options.attributes === 'object' ? options.attributes : {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n var styles = listToStyles(list, options);\n addStylesToDom(styles, options);\n return function update(newList) {\n var mayRemove = [];\n\n for (var i = 0; i < styles.length; i++) {\n var item = styles[i];\n var domStyle = stylesInDom[item.id];\n\n if (domStyle) {\n domStyle.refs--;\n mayRemove.push(domStyle);\n }\n }\n\n if (newList) {\n var newStyles = listToStyles(newList, options);\n addStylesToDom(newStyles, options);\n }\n\n for (var _i = 0; _i < mayRemove.length; _i++) {\n var _domStyle = mayRemove[_i];\n\n if (_domStyle.refs === 0) {\n for (var j = 0; j < _domStyle.parts.length; j++) {\n _domStyle.parts[j]();\n }\n\n delete stylesInDom[_domStyle.id];\n }\n }\n };\n};"
},
{
"id": 5,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/config.js",
"name": "./src/lib/config.js",
"index": 20,
"index2": 17,
"size": 445393,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "55:26-45"
},
{
"moduleId": 8,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
"module": "./src/lib/storage.ts",
"moduleName": "./src/lib/storage.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "23:15-34"
},
{
"moduleId": 15,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"module": "./src/lib/tl_utils.ts",
"moduleName": "./src/lib/tl_utils.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "18:26-45"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./config",
"loc": "19:26-45"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nConfig = window.Config || {};\r\n\r\n/*\r\n\r\n IMPORTANT NOTICE\r\n ================\r\n\r\n Do not publish your Webogram fork with my app credentials (below), or your application may be blocked.\r\n You can get your own api_id, api_hash at https://my.telegram.org, see manual at https://core.telegram.org/api/obtaining_api_id.\r\n\r\n*/\r\n\r\nConfig.App = {\r\n id: 1025907,\r\n hash: '452b0359b988148995f22ff0f4229750',\r\n version: '0.1.0',\r\n domains: [],\r\n baseDcID: 2\r\n};\r\n\r\nConfig.Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: location.search.indexOf('http=1') > 0,\r\n ssl: location.search.indexOf('ssl=1') > 0 || location.protocol == 'https:' && location.search.indexOf('ssl=0') == -1,\r\n force_mobile: location.search.indexOf('mobile=1') > 0,\r\n force_desktop: location.search.indexOf('desktop=1') > 0,\r\n nacl: location.search.indexOf('nacl=0') == -1,\r\n webcrypto: location.search.indexOf('webcrypto=0') == -1,\r\n packed: location.protocol == 'app:' || location.protocol == 'chrome-extension:',\r\n ios_standalone: window.navigator.standalone && navigator.userAgent.match(/iOS|iPhone|iPad/),\r\n chrome_packed: window.chrome && chrome.app && chrome.app.window && true || false,\r\n animations: true,\r\n memory_only: false,\r\n allow_tmpfs: location.search.indexOf('tmpfs=yeahImSureIknowWhatImDoing') > 0 || false,\r\n push_api: location.search.indexOf('push=1') == -1\r\n};\r\n\r\nConfig.Mobile = false;\r\n\r\nConfig.Navigator = {\r\n nativeEmoji: /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform || ''),\r\n osX: (navigator.platform || '').toLowerCase().indexOf('mac') != -1 ||\r\n (navigator.userAgent || '').toLowerCase().indexOf('mac') != -1,\r\n msie: (navigator.userAgent || '').search(/MSIE | Trident\\/|Edge\\//) != -1,\r\n retina: window.devicePixelRatio > 1,\r\n ffos: navigator.userAgent.search(/mobi.+Gecko/i) != -1,\r\n ffos2p: navigator.userAgent.search(/mobi.+Gecko\\/[34567]/i) != -1,\r\n touch: screen.width <= 768 || ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,\r\n mobile: screen.width && screen.width < 480 || navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1\r\n};\r\n\r\nConfig.ExtCredentials = {\r\n gmaps: {\r\n api_key: 'AIzaSyC72t5GDcP-dob20d-ARwSwOQ41-zgbArg'\r\n }\r\n};\r\n\r\n{\r\n let img_size = 32;\r\n let sheetUrl = `assets/img/sheet_apple_${img_size}_`; // #.png\r\n let multiplyX = 100 / (6 - 1);\r\n let multiplyY = 100 / (52 - 1);\r\n let sheetSizeX = 6 * (img_size + 2); // size of image in pixels\r\n let sheetSizeY = 52 * (img_size + 2); // size of image in pixels\r\n let sizeX = 100 * (sheetSizeX / img_size);\r\n let sizeY = 100 * (sheetSizeY / img_size);\r\n\r\n Config.Emoji = {\r\n img_size,\r\n sheetUrl,\r\n multiplyX,\r\n multiplyY,\r\n sheetSizeX,\r\n sheetSizeY,\r\n sizeX,\r\n sizeY,\r\n\r\n emoji: [{\"unified\":\"0023-FE0F-20E3\",\"name\":\"HASH KEY\",\"short_names\":[\"hash\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":0},{\"unified\":\"002A-FE0F-20E3\",\"name\":null,\"short_names\":[\"keycap_star\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":1},{\"unified\":\"0030-FE0F-20E3\",\"name\":\"KEYCAP 0\",\"short_names\":[\"zero\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":2},{\"unified\":\"0031-FE0F-20E3\",\"name\":\"KEYCAP 1\",\"short_names\":[\"one\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":3},{\"unified\":\"0032-FE0F-20E3\",\"name\":\"KEYCAP 2\",\"short_names\":[\"two\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":4},{\"unified\":\"0033-FE0F-20E3\",\"name\":\"KEYCAP 3\",\"short_names\":[\"three\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":5},{\"unified\":\"0034-FE0F-20E3\",\"name\":\"KEYCAP 4\",\"short_names\":[\"four\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":6},{\"unified\":\"0035-FE0F-20E3\",\"name\":\"KEYCAP 5\",\"short_names\":[\"five\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":7},{\"unified\":\"0036-FE0F-20E3\",\"name\":\"KEYCAP 6\",\"short_names\":[\"six\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":8},{\"unified\":\"0037-FE0F-20E3\",\"name\":\"KEYCAP 7\",\"short_names\":[\"seven\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":9},{\"unified\":\"0038-FE0F-20E3\",\"name\":\"KEYCAP 8\",\"short_names\":[\"eight\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":10},{\"unified\":\"0039-FE0F-20E3\",\"name\":\"KEYCAP 9\",\"short_names\":[\"nine\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":11},{\"unified\":\"00A9-FE0F\",\"name\":\"COPYRIGHT SIGN\",\"short_names\":[\"copyright\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":12},{\"unified\":\"00AE-FE0F\",\"name\":\"REGISTERED SIGN\",\"short_names\":[\"registered\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":13},{\"unified\":\"1F004\",\"name\":\"MAHJONG TILE RED DRAGON\",\"short_names\":[\"mahjong\"],\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":14},{\"unified\":\"1F0CF\",\"name\":\"PLAYING CARD BLACK JOKER\",\"short_names\":[\"black_joker\"],\"category\":\"Activities\",\"sheet_x\":0,\"sheet_y\":15},{\"unified\":\"1F170-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER A\",\"short_names\":[\"a\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":16},{\"unified\":\"1F171-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER B\",\"short_names\":[\"b\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":17},{\"unified\":\"1F17E-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER O\",\"short_names\":[\"o2\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":18},{\"unified\":\"1F17F-FE0F\",\"name\":\"NEGATIVE SQUARED LATIN CAPITAL LETTER P\",\"short_names\":[\"parking\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":19},{\"unified\":\"1F18E\",\"name\":\"NEGATIVE SQUARED AB\",\"short_names\":[\"ab\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":20},{\"unified\":\"1F191\",\"name\":\"SQUARED CL\",\"short_names\":[\"cl\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":21},{\"unified\":\"1F192\",\"name\":\"SQUARED COOL\",\"short_names\":[\"cool\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":22},{\"unified\":\"1F193\",\"name\":\"SQUARED FREE\",\"short_names\":[\"free\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":23},{\"unified\":\"1F194\",\"name\":\"SQUARED ID\",\"short_names\":[\"id\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":24},{\"unified\":\"1F195\",\"name\":\"SQUARED NEW\",\"short_names\":[\"new\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":25},{\"unified\":\"1F196\",\"name\":\"SQUARED NG\",\"short_names\":[\"ng\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":26},{\"unified\":\"1F197\",\"name\":\"SQUARED OK\",\"short_names\":[\"ok\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":27},{\"unified\":\"1F198\",\"name\":\"SQUARED SOS\",\"short_names\":[\"sos\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":28},{\"unified\":\"1F199\",\"name\":\"SQUARED UP WITH EXCLAMATION MARK\",\"short_names\":[\"up\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":29},{\"unified\":\"1F19A\",\"name\":\"SQUARED VS\",\"short_names\":[\"vs\"],\"category\":\"Symbols\",\"sheet_x\":0,\"sheet_y\":30},{\"unified\":\"1F1E6-1F1E8\",\"name\":\"Ascension Island Flag\",\"short_names\":[\"flag-ac\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":31},{\"unified\":\"1F1E6-1F1E9\",\"name\":\"Andorra Flag\",\"short_names\":[\"flag-ad\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":32},{\"unified\":\"1F1E6-1F1EA\",\"name\":\"United Arab Emirates Flag\",\"short_names\":[\"flag-ae\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":33},{\"unified\":\"1F1E6-1F1EB\",\"name\":\"Afghanistan Flag\",\"short_names\":[\"flag-af\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":34},{\"unified\":\"1F1E6-1F1EC\",\"name\":\"Antigua & Barbuda Flag\",\"short_names\":[\"flag-ag\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":35},{\"unified\":\"1F1E6-1F1EE\",\"name\":\"Anguilla Flag\",\"short_names\":[\"flag-ai\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":36},{\"unified\":\"1F1E6-1F1F1\",\"name\":\"Albania Flag\",\"short_names\":[\"flag-al\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":37},{\"unified\":\"1F1E6-1F1F2\",\"name\":\"Armenia Flag\",\"short_names\":[\"flag-am\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":38},{\"unified\":\"1F1E6-1F1F4\",\"name\":\"Angola Flag\",\"short_names\":[\"flag-ao\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":39},{\"unified\":\"1F1E6-1F1F6\",\"name\":\"Antarctica Flag\",\"short_names\":[\"flag-aq\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":40},{\"unified\":\"1F1E6-1F1F7\",\"name\":\"Argentina Flag\",\"short_names\":[\"flag-ar\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":41},{\"unified\":\"1F1E6-1F1F8\",\"name\":\"American Samoa Flag\",\"short_names\":[\"flag-as\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":42},{\"unified\":\"1F1E6-1F1F9\",\"name\":\"Austria Flag\",\"short_names\":[\"flag-at\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":43},{\"unified\":\"1F1E6-1F1FA\",\"name\":\"Australia Flag\",\"short_names\":[\"flag-au\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":44},{\"unified\":\"1F1E6-1F1FC\",\"name\":\"Aruba Flag\",\"short_names\":[\"flag-aw\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":45},{\"unified\":\"1F1E6-1F1FD\",\"name\":\"Åland Islands Flag\",\"short_names\":[\"flag-ax\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":46},{\"unified\":\"1F1E6-1F1FF\",\"name\":\"Azerbaijan Flag\",\"short_names\":[\"flag-az\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":47},{\"unified\":\"1F1E7-1F1E6\",\"name\":\"Bosnia & Herzegovina Flag\",\"short_names\":[\"flag-ba\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":48},{\"unified\":\"1F1E7-1F1E7\",\"name\":\"Barbados Flag\",\"short_names\":[\"flag-bb\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":49},{\"unified\":\"1F1E7-1F1E9\",\"name\":\"Bangladesh Flag\",\"short_names\":[\"flag-bd\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":50},{\"unified\":\"1F1E7-1F1EA\",\"name\":\"Belgium Flag\",\"short_names\":[\"flag-be\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":51},{\"unified\":\"1F1E7-1F1EB\",\"name\":\"Burkina Faso Flag\",\"short_names\":[\"flag-bf\"],\"category\":\"Flags\",\"sheet_x\":0,\"sheet_y\":52},{\"unified\":\"1F1E7-1F1EC\",\"name\":\"Bulgaria Flag\",\"short_names\":[\"flag-bg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":0},{\"unified\":\"1F1E7-1F1ED\",\"name\":\"Bahrain Flag\",\"short_names\":[\"flag-bh\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":1},{\"unified\":\"1F1E7-1F1EE\",\"name\":\"Burundi Flag\",\"short_names\":[\"flag-bi\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":2},{\"unified\":\"1F1E7-1F1EF\",\"name\":\"Benin Flag\",\"short_names\":[\"flag-bj\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":3},{\"unified\":\"1F1E7-1F1F1\",\"name\":\"St. Barthélemy Flag\",\"short_names\":[\"flag-bl\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":4},{\"unified\":\"1F1E7-1F1F2\",\"name\":\"Bermuda Flag\",\"short_names\":[\"flag-bm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":5},{\"unified\":\"1F1E7-1F1F3\",\"name\":\"Brunei Flag\",\"short_names\":[\"flag-bn\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":6},{\"unified\":\"1F1E7-1F1F4\",\"name\":\"Bolivia Flag\",\"short_names\":[\"flag-bo\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":7},{\"unified\":\"1F1E7-1F1F6\",\"name\":\"Caribbean Netherlands Flag\",\"short_names\":[\"flag-bq\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":8},{\"unified\":\"1F1E7-1F1F7\",\"name\":\"Brazil Flag\",\"short_names\":[\"flag-br\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":9},{\"unified\":\"1F1E7-1F1F8\",\"name\":\"Bahamas Flag\",\"short_names\":[\"flag-bs\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":10},{\"unified\":\"1F1E7-1F1F9\",\"name\":\"Bhutan Flag\",\"short_names\":[\"flag-bt\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":11},{\"unified\":\"1F1E7-1F1FB\",\"name\":\"Bouvet Island Flag\",\"short_names\":[\"flag-bv\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":12},{\"unified\":\"1F1E7-1F1FC\",\"name\":\"Botswana Flag\",\"short_names\":[\"flag-bw\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":13},{\"unified\":\"1F1E7-1F1FE\",\"name\":\"Belarus Flag\",\"short_names\":[\"flag-by\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":14},{\"unified\":\"1F1E7-1F1FF\",\"name\":\"Belize Flag\",\"short_names\":[\"flag-bz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":15},{\"unified\":\"1F1E8-1F1E6\",\"name\":\"Canada Flag\",\"short_names\":[\"flag-ca\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":16},{\"unified\":\"1F1E8-1F1E8\",\"name\":\"Cocos (Keeling) Islands Flag\",\"short_names\":[\"flag-cc\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":17},{\"unified\":\"1F1E8-1F1E9\",\"name\":\"Congo - Kinshasa Flag\",\"short_names\":[\"flag-cd\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":18},{\"unified\":\"1F1E8-1F1EB\",\"name\":\"Central African Republic Flag\",\"short_names\":[\"flag-cf\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":19},{\"unified\":\"1F1E8-1F1EC\",\"name\":\"Congo - Brazzaville Flag\",\"short_names\":[\"flag-cg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":20},{\"unified\":\"1F1E8-1F1ED\",\"name\":\"Switzerland Flag\",\"short_names\":[\"flag-ch\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":21},{\"unified\":\"1F1E8-1F1EE\",\"name\":\"Côte dIvoire Flag\",\"short_names\":[\"flag-ci\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":22},{\"unified\":\"1F1E8-1F1F0\",\"name\":\"Cook Islands Flag\",\"short_names\":[\"flag-ck\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":23},{\"unified\":\"1F1E8-1F1F1\",\"name\":\"Chile Flag\",\"short_names\":[\"flag-cl\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":24},{\"unified\":\"1F1E8-1F1F2\",\"name\":\"Cameroon Flag\",\"short_names\":[\"flag-cm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":25},{\"unified\":\"1F1E8-1F1F3\",\"name\":\"China Flag\",\"short_names\":[\"cn\",\"flag-cn\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":26},{\"unified\":\"1F1E8-1F1F4\",\"name\":\"Colombia Flag\",\"short_names\":[\"flag-co\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":27},{\"unified\":\"1F1E8-1F1F5\",\"name\":\"Clipperton Island Flag\",\"short_names\":[\"flag-cp\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":28},{\"unified\":\"1F1E8-1F1F7\",\"name\":\"Costa Rica Flag\",\"short_names\":[\"flag-cr\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":29},{\"unified\":\"1F1E8-1F1FA\",\"name\":\"Cuba Flag\",\"short_names\":[\"flag-cu\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":30},{\"unified\":\"1F1E8-1F1FB\",\"name\":\"Cape Verde Flag\",\"short_names\":[\"flag-cv\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":31},{\"unified\":\"1F1E8-1F1FC\",\"name\":\"Curaçao Flag\",\"short_names\":[\"flag-cw\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":32},{\"unified\":\"1F1E8-1F1FD\",\"name\":\"Christmas Island Flag\",\"short_names\":[\"flag-cx\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":33},{\"unified\":\"1F1E8-1F1FE\",\"name\":\"Cyprus Flag\",\"short_names\":[\"flag-cy\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":34},{\"unified\":\"1F1E8-1F1FF\",\"name\":\"Czechia Flag\",\"short_names\":[\"flag-cz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":35},{\"unified\":\"1F1E9-1F1EA\",\"name\":\"Germany Flag\",\"short_names\":[\"de\",\"flag-de\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":36},{\"unified\":\"1F1E9-1F1EC\",\"name\":\"Diego Garcia Flag\",\"short_names\":[\"flag-dg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":37},{\"unified\":\"1F1E9-1F1EF\",\"name\":\"Djibouti Flag\",\"short_names\":[\"flag-dj\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":38},{\"unified\":\"1F1E9-1F1F0\",\"name\":\"Denmark Flag\",\"short_names\":[\"flag-dk\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":39},{\"unified\":\"1F1E9-1F1F2\",\"name\":\"Dominica Flag\",\"short_names\":[\"flag-dm\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":40},{\"unified\":\"1F1E9-1F1F4\",\"name\":\"Dominican Republic Flag\",\"short_names\":[\"flag-do\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":41},{\"unified\":\"1F1E9-1F1FF\",\"name\":\"Algeria Flag\",\"short_names\":[\"flag-dz\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":42},{\"unified\":\"1F1EA-1F1E6\",\"name\":\"Ceuta & Melilla Flag\",\"short_names\":[\"flag-ea\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":43},{\"unified\":\"1F1EA-1F1E8\",\"name\":\"Ecuador Flag\",\"short_names\":[\"flag-ec\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":44},{\"unified\":\"1F1EA-1F1EA\",\"name\":\"Estonia Flag\",\"short_names\":[\"flag-ee\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":45},{\"unified\":\"1F1EA-1F1EC\",\"name\":\"Egypt Flag\",\"short_names\":[\"flag-eg\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":46},{\"unified\":\"1F1EA-1F1ED\",\"name\":\"Western Sahara Flag\",\"short_names\":[\"flag-eh\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":47},{\"unified\":\"1F1EA-1F1F7\",\"name\":\"Eritrea Flag\",\"short_names\":[\"flag-er\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":48},{\"unified\":\"1F1EA-1F1F8\",\"name\":\"Spain Flag\",\"short_names\":[\"es\",\"flag-es\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":49},{\"unified\":\"1F1EA-1F1F9\",\"name\":\"Ethiopia Flag\",\"short_names\":[\"flag-et\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":50},{\"unified\":\"1F1EA-1F1FA\",\"name\":\"European Union Flag\",\"short_names\":[\"flag-eu\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":51},{\"unified\":\"1F1EB-1F1EE\",\"name\":\"Finland Flag\",\"short_names\":[\"flag-fi\"],\"category\":\"Flags\",\"sheet_x\":1,\"sheet_y\":52},{\"unified\":\"1F1EB-1F1EF\",\"name\":\"Fiji Flag\",\"short_names\":[\"flag-fj\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":0},{\"unified\":\"1F1EB-1F1F0\",\"name\":\"Falkland Islands Flag\",\"short_names\":[\"flag-fk\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":1},{\"unified\":\"1F1EB-1F1F2\",\"name\":\"Micronesia Flag\",\"short_names\":[\"flag-fm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":2},{\"unified\":\"1F1EB-1F1F4\",\"name\":\"Faroe Islands Flag\",\"short_names\":[\"flag-fo\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":3},{\"unified\":\"1F1EB-1F1F7\",\"name\":\"France Flag\",\"short_names\":[\"fr\",\"flag-fr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":4},{\"unified\":\"1F1EC-1F1E6\",\"name\":\"Gabon Flag\",\"short_names\":[\"flag-ga\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":5},{\"unified\":\"1F1EC-1F1E7\",\"name\":\"United Kingdom Flag\",\"short_names\":[\"gb\",\"uk\",\"flag-gb\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":6},{\"unified\":\"1F1EC-1F1E9\",\"name\":\"Grenada Flag\",\"short_names\":[\"flag-gd\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":7},{\"unified\":\"1F1EC-1F1EA\",\"name\":\"Georgia Flag\",\"short_names\":[\"flag-ge\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":8},{\"unified\":\"1F1EC-1F1EB\",\"name\":\"French Guiana Flag\",\"short_names\":[\"flag-gf\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":9},{\"unified\":\"1F1EC-1F1EC\",\"name\":\"Guernsey Flag\",\"short_names\":[\"flag-gg\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":10},{\"unified\":\"1F1EC-1F1ED\",\"name\":\"Ghana Flag\",\"short_names\":[\"flag-gh\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":11},{\"unified\":\"1F1EC-1F1EE\",\"name\":\"Gibraltar Flag\",\"short_names\":[\"flag-gi\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":12},{\"unified\":\"1F1EC-1F1F1\",\"name\":\"Greenland Flag\",\"short_names\":[\"flag-gl\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":13},{\"unified\":\"1F1EC-1F1F2\",\"name\":\"Gambia Flag\",\"short_names\":[\"flag-gm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":14},{\"unified\":\"1F1EC-1F1F3\",\"name\":\"Guinea Flag\",\"short_names\":[\"flag-gn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":15},{\"unified\":\"1F1EC-1F1F5\",\"name\":\"Guadeloupe Flag\",\"short_names\":[\"flag-gp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":16},{\"unified\":\"1F1EC-1F1F6\",\"name\":\"Equatorial Guinea Flag\",\"short_names\":[\"flag-gq\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":17},{\"unified\":\"1F1EC-1F1F7\",\"name\":\"Greece Flag\",\"short_names\":[\"flag-gr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":18},{\"unified\":\"1F1EC-1F1F8\",\"name\":\"South Georgia & South Sandwich Islands Flag\",\"short_names\":[\"flag-gs\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":19},{\"unified\":\"1F1EC-1F1F9\",\"name\":\"Guatemala Flag\",\"short_names\":[\"flag-gt\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":20},{\"unified\":\"1F1EC-1F1FA\",\"name\":\"Guam Flag\",\"short_names\":[\"flag-gu\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":21},{\"unified\":\"1F1EC-1F1FC\",\"name\":\"Guinea-Bissau Flag\",\"short_names\":[\"flag-gw\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":22},{\"unified\":\"1F1EC-1F1FE\",\"name\":\"Guyana Flag\",\"short_names\":[\"flag-gy\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":23},{\"unified\":\"1F1ED-1F1F0\",\"name\":\"Hong Kong SAR China Flag\",\"short_names\":[\"flag-hk\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":24},{\"unified\":\"1F1ED-1F1F2\",\"name\":\"Heard & McDonald Islands Flag\",\"short_names\":[\"flag-hm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":25},{\"unified\":\"1F1ED-1F1F3\",\"name\":\"Honduras Flag\",\"short_names\":[\"flag-hn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":26},{\"unified\":\"1F1ED-1F1F7\",\"name\":\"Croatia Flag\",\"short_names\":[\"flag-hr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":27},{\"unified\":\"1F1ED-1F1F9\",\"name\":\"Haiti Flag\",\"short_names\":[\"flag-ht\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":28},{\"unified\":\"1F1ED-1F1FA\",\"name\":\"Hungary Flag\",\"short_names\":[\"flag-hu\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":29},{\"unified\":\"1F1EE-1F1E8\",\"name\":\"Canary Islands Flag\",\"short_names\":[\"flag-ic\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":30},{\"unified\":\"1F1EE-1F1E9\",\"name\":\"Indonesia Flag\",\"short_names\":[\"flag-id\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":31},{\"unified\":\"1F1EE-1F1EA\",\"name\":\"Ireland Flag\",\"short_names\":[\"flag-ie\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":32},{\"unified\":\"1F1EE-1F1F1\",\"name\":\"Israel Flag\",\"short_names\":[\"flag-il\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":33},{\"unified\":\"1F1EE-1F1F2\",\"name\":\"Isle of Man Flag\",\"short_names\":[\"flag-im\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":34},{\"unified\":\"1F1EE-1F1F3\",\"name\":\"India Flag\",\"short_names\":[\"flag-in\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":35},{\"unified\":\"1F1EE-1F1F4\",\"name\":\"British Indian Ocean Territory Flag\",\"short_names\":[\"flag-io\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":36},{\"unified\":\"1F1EE-1F1F6\",\"name\":\"Iraq Flag\",\"short_names\":[\"flag-iq\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":37},{\"unified\":\"1F1EE-1F1F7\",\"name\":\"Iran Flag\",\"short_names\":[\"flag-ir\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":38},{\"unified\":\"1F1EE-1F1F8\",\"name\":\"Iceland Flag\",\"short_names\":[\"flag-is\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":39},{\"unified\":\"1F1EE-1F1F9\",\"name\":\"Italy Flag\",\"short_names\":[\"it\",\"flag-it\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":40},{\"unified\":\"1F1EF-1F1EA\",\"name\":\"Jersey Flag\",\"short_names\":[\"flag-je\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":41},{\"unified\":\"1F1EF-1F1F2\",\"name\":\"Jamaica Flag\",\"short_names\":[\"flag-jm\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":42},{\"unified\":\"1F1EF-1F1F4\",\"name\":\"Jordan Flag\",\"short_names\":[\"flag-jo\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":43},{\"unified\":\"1F1EF-1F1F5\",\"name\":\"Japan Flag\",\"short_names\":[\"jp\",\"flag-jp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":44},{\"unified\":\"1F1F0-1F1EA\",\"name\":\"Kenya Flag\",\"short_names\":[\"flag-ke\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":45},{\"unified\":\"1F1F0-1F1EC\",\"name\":\"Kyrgyzstan Flag\",\"short_names\":[\"flag-kg\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":46},{\"unified\":\"1F1F0-1F1ED\",\"name\":\"Cambodia Flag\",\"short_names\":[\"flag-kh\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":47},{\"unified\":\"1F1F0-1F1EE\",\"name\":\"Kiribati Flag\",\"short_names\":[\"flag-ki\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":48},{\"unified\":\"1F1F0-1F1F2\",\"name\":\"Comoros Flag\",\"short_names\":[\"flag-km\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":49},{\"unified\":\"1F1F0-1F1F3\",\"name\":\"St. Kitts & Nevis Flag\",\"short_names\":[\"flag-kn\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":50},{\"unified\":\"1F1F0-1F1F5\",\"name\":\"North Korea Flag\",\"short_names\":[\"flag-kp\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":51},{\"unified\":\"1F1F0-1F1F7\",\"name\":\"South Korea Flag\",\"short_names\":[\"kr\",\"flag-kr\"],\"category\":\"Flags\",\"sheet_x\":2,\"sheet_y\":52},{\"unified\":\"1F1F0-1F1FC\",\"name\":\"Kuwait Flag\",\"short_names\":[\"flag-kw\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":0},{\"unified\":\"1F1F0-1F1FE\",\"name\":\"Cayman Islands Flag\",\"short_names\":[\"flag-ky\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":1},{\"unified\":\"1F1F0-1F1FF\",\"name\":\"Kazakhstan Flag\",\"short_names\":[\"flag-kz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":2},{\"unified\":\"1F1F1-1F1E6\",\"name\":\"Laos Flag\",\"short_names\":[\"flag-la\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":3},{\"unified\":\"1F1F1-1F1E7\",\"name\":\"Lebanon Flag\",\"short_names\":[\"flag-lb\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":4},{\"unified\":\"1F1F1-1F1E8\",\"name\":\"St. Lucia Flag\",\"short_names\":[\"flag-lc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":5},{\"unified\":\"1F1F1-1F1EE\",\"name\":\"Liechtenstein Flag\",\"short_names\":[\"flag-li\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":6},{\"unified\":\"1F1F1-1F1F0\",\"name\":\"Sri Lanka Flag\",\"short_names\":[\"flag-lk\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":7},{\"unified\":\"1F1F1-1F1F7\",\"name\":\"Liberia Flag\",\"short_names\":[\"flag-lr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":8},{\"unified\":\"1F1F1-1F1F8\",\"name\":\"Lesotho Flag\",\"short_names\":[\"flag-ls\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":9},{\"unified\":\"1F1F1-1F1F9\",\"name\":\"Lithuania Flag\",\"short_names\":[\"flag-lt\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":10},{\"unified\":\"1F1F1-1F1FA\",\"name\":\"Luxembourg Flag\",\"short_names\":[\"flag-lu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":11},{\"unified\":\"1F1F1-1F1FB\",\"name\":\"Latvia Flag\",\"short_names\":[\"flag-lv\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":12},{\"unified\":\"1F1F1-1F1FE\",\"name\":\"Libya Flag\",\"short_names\":[\"flag-ly\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":13},{\"unified\":\"1F1F2-1F1E6\",\"name\":\"Morocco Flag\",\"short_names\":[\"flag-ma\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":14},{\"unified\":\"1F1F2-1F1E8\",\"name\":\"Monaco Flag\",\"short_names\":[\"flag-mc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":15},{\"unified\":\"1F1F2-1F1E9\",\"name\":\"Moldova Flag\",\"short_names\":[\"flag-md\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":16},{\"unified\":\"1F1F2-1F1EA\",\"name\":\"Montenegro Flag\",\"short_names\":[\"flag-me\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":17},{\"unified\":\"1F1F2-1F1EB\",\"name\":\"St. Martin Flag\",\"short_names\":[\"flag-mf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":18},{\"unified\":\"1F1F2-1F1EC\",\"name\":\"Madagascar Flag\",\"short_names\":[\"flag-mg\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":19},{\"unified\":\"1F1F2-1F1ED\",\"name\":\"Marshall Islands Flag\",\"short_names\":[\"flag-mh\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":20},{\"unified\":\"1F1F2-1F1F0\",\"name\":\"Macedonia Flag\",\"short_names\":[\"flag-mk\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":21},{\"unified\":\"1F1F2-1F1F1\",\"name\":\"Mali Flag\",\"short_names\":[\"flag-ml\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":22},{\"unified\":\"1F1F2-1F1F2\",\"name\":\"Myanmar (Burma) Flag\",\"short_names\":[\"flag-mm\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":23},{\"unified\":\"1F1F2-1F1F3\",\"name\":\"Mongolia Flag\",\"short_names\":[\"flag-mn\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":24},{\"unified\":\"1F1F2-1F1F4\",\"name\":\"Macau SAR China Flag\",\"short_names\":[\"flag-mo\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":25},{\"unified\":\"1F1F2-1F1F5\",\"name\":\"Northern Mariana Islands Flag\",\"short_names\":[\"flag-mp\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":26},{\"unified\":\"1F1F2-1F1F6\",\"name\":\"Martinique Flag\",\"short_names\":[\"flag-mq\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":27},{\"unified\":\"1F1F2-1F1F7\",\"name\":\"Mauritania Flag\",\"short_names\":[\"flag-mr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":28},{\"unified\":\"1F1F2-1F1F8\",\"name\":\"Montserrat Flag\",\"short_names\":[\"flag-ms\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":29},{\"unified\":\"1F1F2-1F1F9\",\"name\":\"Malta Flag\",\"short_names\":[\"flag-mt\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":30},{\"unified\":\"1F1F2-1F1FA\",\"name\":\"Mauritius Flag\",\"short_names\":[\"flag-mu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":31},{\"unified\":\"1F1F2-1F1FB\",\"name\":\"Maldives Flag\",\"short_names\":[\"flag-mv\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":32},{\"unified\":\"1F1F2-1F1FC\",\"name\":\"Malawi Flag\",\"short_names\":[\"flag-mw\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":33},{\"unified\":\"1F1F2-1F1FD\",\"name\":\"Mexico Flag\",\"short_names\":[\"flag-mx\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":34},{\"unified\":\"1F1F2-1F1FE\",\"name\":\"Malaysia Flag\",\"short_names\":[\"flag-my\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":35},{\"unified\":\"1F1F2-1F1FF\",\"name\":\"Mozambique Flag\",\"short_names\":[\"flag-mz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":36},{\"unified\":\"1F1F3-1F1E6\",\"name\":\"Namibia Flag\",\"short_names\":[\"flag-na\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":37},{\"unified\":\"1F1F3-1F1E8\",\"name\":\"New Caledonia Flag\",\"short_names\":[\"flag-nc\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":38},{\"unified\":\"1F1F3-1F1EA\",\"name\":\"Niger Flag\",\"short_names\":[\"flag-ne\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":39},{\"unified\":\"1F1F3-1F1EB\",\"name\":\"Norfolk Island Flag\",\"short_names\":[\"flag-nf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":40},{\"unified\":\"1F1F3-1F1EC\",\"name\":\"Nigeria Flag\",\"short_names\":[\"flag-ng\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":41},{\"unified\":\"1F1F3-1F1EE\",\"name\":\"Nicaragua Flag\",\"short_names\":[\"flag-ni\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":42},{\"unified\":\"1F1F3-1F1F1\",\"name\":\"Netherlands Flag\",\"short_names\":[\"flag-nl\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":43},{\"unified\":\"1F1F3-1F1F4\",\"name\":\"Norway Flag\",\"short_names\":[\"flag-no\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":44},{\"unified\":\"1F1F3-1F1F5\",\"name\":\"Nepal Flag\",\"short_names\":[\"flag-np\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":45},{\"unified\":\"1F1F3-1F1F7\",\"name\":\"Nauru Flag\",\"short_names\":[\"flag-nr\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":46},{\"unified\":\"1F1F3-1F1FA\",\"name\":\"Niue Flag\",\"short_names\":[\"flag-nu\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":47},{\"unified\":\"1F1F3-1F1FF\",\"name\":\"New Zealand Flag\",\"short_names\":[\"flag-nz\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":48},{\"unified\":\"1F1F4-1F1F2\",\"name\":\"Oman Flag\",\"short_names\":[\"flag-om\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":49},{\"unified\":\"1F1F5-1F1E6\",\"name\":\"Panama Flag\",\"short_names\":[\"flag-pa\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":50},{\"unified\":\"1F1F5-1F1EA\",\"name\":\"Peru Flag\",\"short_names\":[\"flag-pe\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":51},{\"unified\":\"1F1F5-1F1EB\",\"name\":\"French Polynesia Flag\",\"short_names\":[\"flag-pf\"],\"category\":\"Flags\",\"sheet_x\":3,\"sheet_y\":52},{\"unified\":\"1F1F5-1F1EC\",\"name\":\"Papua New Guinea Flag\",\"short_names\":[\"flag-pg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":0},{\"unified\":\"1F1F5-1F1ED\",\"name\":\"Philippines Flag\",\"short_names\":[\"flag-ph\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":1},{\"unified\":\"1F1F5-1F1F0\",\"name\":\"Pakistan Flag\",\"short_names\":[\"flag-pk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":2},{\"unified\":\"1F1F5-1F1F1\",\"name\":\"Poland Flag\",\"short_names\":[\"flag-pl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":3},{\"unified\":\"1F1F5-1F1F2\",\"name\":\"St. Pierre & Miquelon Flag\",\"short_names\":[\"flag-pm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":4},{\"unified\":\"1F1F5-1F1F3\",\"name\":\"Pitcairn Islands Flag\",\"short_names\":[\"flag-pn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":5},{\"unified\":\"1F1F5-1F1F7\",\"name\":\"Puerto Rico Flag\",\"short_names\":[\"flag-pr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":6},{\"unified\":\"1F1F5-1F1F8\",\"name\":\"Palestinian Territories Flag\",\"short_names\":[\"flag-ps\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":7},{\"unified\":\"1F1F5-1F1F9\",\"name\":\"Portugal Flag\",\"short_names\":[\"flag-pt\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":8},{\"unified\":\"1F1F5-1F1FC\",\"name\":\"Palau Flag\",\"short_names\":[\"flag-pw\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":9},{\"unified\":\"1F1F5-1F1FE\",\"name\":\"Paraguay Flag\",\"short_names\":[\"flag-py\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":10},{\"unified\":\"1F1F6-1F1E6\",\"name\":\"Qatar Flag\",\"short_names\":[\"flag-qa\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":11},{\"unified\":\"1F1F7-1F1EA\",\"name\":\"Réunion Flag\",\"short_names\":[\"flag-re\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":12},{\"unified\":\"1F1F7-1F1F4\",\"name\":\"Romania Flag\",\"short_names\":[\"flag-ro\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":13},{\"unified\":\"1F1F7-1F1F8\",\"name\":\"Serbia Flag\",\"short_names\":[\"flag-rs\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":14},{\"unified\":\"1F1F7-1F1FA\",\"name\":\"Russia Flag\",\"short_names\":[\"ru\",\"flag-ru\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":15},{\"unified\":\"1F1F7-1F1FC\",\"name\":\"Rwanda Flag\",\"short_names\":[\"flag-rw\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":16},{\"unified\":\"1F1F8-1F1E6\",\"name\":\"Saudi Arabia Flag\",\"short_names\":[\"flag-sa\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":17},{\"unified\":\"1F1F8-1F1E7\",\"name\":\"Solomon Islands Flag\",\"short_names\":[\"flag-sb\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":18},{\"unified\":\"1F1F8-1F1E8\",\"name\":\"Seychelles Flag\",\"short_names\":[\"flag-sc\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":19},{\"unified\":\"1F1F8-1F1E9\",\"name\":\"Sudan Flag\",\"short_names\":[\"flag-sd\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":20},{\"unified\":\"1F1F8-1F1EA\",\"name\":\"Sweden Flag\",\"short_names\":[\"flag-se\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":21},{\"unified\":\"1F1F8-1F1EC\",\"name\":\"Singapore Flag\",\"short_names\":[\"flag-sg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":22},{\"unified\":\"1F1F8-1F1ED\",\"name\":\"St. Helena Flag\",\"short_names\":[\"flag-sh\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":23},{\"unified\":\"1F1F8-1F1EE\",\"name\":\"Slovenia Flag\",\"short_names\":[\"flag-si\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":24},{\"unified\":\"1F1F8-1F1EF\",\"name\":\"Svalbard & Jan Mayen Flag\",\"short_names\":[\"flag-sj\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":25},{\"unified\":\"1F1F8-1F1F0\",\"name\":\"Slovakia Flag\",\"short_names\":[\"flag-sk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":26},{\"unified\":\"1F1F8-1F1F1\",\"name\":\"Sierra Leone Flag\",\"short_names\":[\"flag-sl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":27},{\"unified\":\"1F1F8-1F1F2\",\"name\":\"San Marino Flag\",\"short_names\":[\"flag-sm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":28},{\"unified\":\"1F1F8-1F1F3\",\"name\":\"Senegal Flag\",\"short_names\":[\"flag-sn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":29},{\"unified\":\"1F1F8-1F1F4\",\"name\":\"Somalia Flag\",\"short_names\":[\"flag-so\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":30},{\"unified\":\"1F1F8-1F1F7\",\"name\":\"Suriname Flag\",\"short_names\":[\"flag-sr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":31},{\"unified\":\"1F1F8-1F1F8\",\"name\":\"South Sudan Flag\",\"short_names\":[\"flag-ss\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":32},{\"unified\":\"1F1F8-1F1F9\",\"name\":\"São Tomé & Príncipe Flag\",\"short_names\":[\"flag-st\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":33},{\"unified\":\"1F1F8-1F1FB\",\"name\":\"El Salvador Flag\",\"short_names\":[\"flag-sv\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":34},{\"unified\":\"1F1F8-1F1FD\",\"name\":\"Sint Maarten Flag\",\"short_names\":[\"flag-sx\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":35},{\"unified\":\"1F1F8-1F1FE\",\"name\":\"Syria Flag\",\"short_names\":[\"flag-sy\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":36},{\"unified\":\"1F1F8-1F1FF\",\"name\":\"Swaziland Flag\",\"short_names\":[\"flag-sz\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":37},{\"unified\":\"1F1F9-1F1E6\",\"name\":\"Tristan da Cunha Flag\",\"short_names\":[\"flag-ta\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":38},{\"unified\":\"1F1F9-1F1E8\",\"name\":\"Turks & Caicos Islands Flag\",\"short_names\":[\"flag-tc\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":39},{\"unified\":\"1F1F9-1F1E9\",\"name\":\"Chad Flag\",\"short_names\":[\"flag-td\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":40},{\"unified\":\"1F1F9-1F1EB\",\"name\":\"French Southern Territories Flag\",\"short_names\":[\"flag-tf\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":41},{\"unified\":\"1F1F9-1F1EC\",\"name\":\"Togo Flag\",\"short_names\":[\"flag-tg\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":42},{\"unified\":\"1F1F9-1F1ED\",\"name\":\"Thailand Flag\",\"short_names\":[\"flag-th\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":43},{\"unified\":\"1F1F9-1F1EF\",\"name\":\"Tajikistan Flag\",\"short_names\":[\"flag-tj\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":44},{\"unified\":\"1F1F9-1F1F0\",\"name\":\"Tokelau Flag\",\"short_names\":[\"flag-tk\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":45},{\"unified\":\"1F1F9-1F1F1\",\"name\":\"Timor-Leste Flag\",\"short_names\":[\"flag-tl\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":46},{\"unified\":\"1F1F9-1F1F2\",\"name\":\"Turkmenistan Flag\",\"short_names\":[\"flag-tm\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":47},{\"unified\":\"1F1F9-1F1F3\",\"name\":\"Tunisia Flag\",\"short_names\":[\"flag-tn\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":48},{\"unified\":\"1F1F9-1F1F4\",\"name\":\"Tonga Flag\",\"short_names\":[\"flag-to\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":49},{\"unified\":\"1F1F9-1F1F7\",\"name\":\"Turkey Flag\",\"short_names\":[\"flag-tr\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":50},{\"unified\":\"1F1F9-1F1F9\",\"name\":\"Trinidad & Tobago Flag\",\"short_names\":[\"flag-tt\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":51},{\"unified\":\"1F1F9-1F1FB\",\"name\":\"Tuvalu Flag\",\"short_names\":[\"flag-tv\"],\"category\":\"Flags\",\"sheet_x\":4,\"sheet_y\":52},{\"unified\":\"1F1F9-1F1FC\",\"name\":\"Taiwan Flag\",\"short_names\":[\"flag-tw\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":0},{\"unified\":\"1F1F9-1F1FF\",\"name\":\"Tanzania Flag\",\"short_names\":[\"flag-tz\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":1},{\"unified\":\"1F1FA-1F1E6\",\"name\":\"Ukraine Flag\",\"short_names\":[\"flag-ua\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":2},{\"unified\":\"1F1FA-1F1EC\",\"name\":\"Uganda Flag\",\"short_names\":[\"flag-ug\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":3},{\"unified\":\"1F1FA-1F1F2\",\"name\":\"U.S. Outlying Islands Flag\",\"short_names\":[\"flag-um\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":4},{\"unified\":\"1F1FA-1F1F3\",\"name\":\"United Nations Flag\",\"short_names\":[\"flag-un\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":5},{\"unified\":\"1F1FA-1F1F8\",\"name\":\"United States Flag\",\"short_names\":[\"us\",\"flag-us\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":6},{\"unified\":\"1F1FA-1F1FE\",\"name\":\"Uruguay Flag\",\"short_names\":[\"flag-uy\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":7},{\"unified\":\"1F1FA-1F1FF\",\"name\":\"Uzbekistan Flag\",\"short_names\":[\"flag-uz\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":8},{\"unified\":\"1F1FB-1F1E6\",\"name\":\"Vatican City Flag\",\"short_names\":[\"flag-va\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":9},{\"unified\":\"1F1FB-1F1E8\",\"name\":\"St. Vincent & Grenadines Flag\",\"short_names\":[\"flag-vc\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":10},{\"unified\":\"1F1FB-1F1EA\",\"name\":\"Venezuela Flag\",\"short_names\":[\"flag-ve\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":11},{\"unified\":\"1F1FB-1F1EC\",\"name\":\"British Virgin Islands Flag\",\"short_names\":[\"flag-vg\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":12},{\"unified\":\"1F1FB-1F1EE\",\"name\":\"U.S. Virgin Islands Flag\",\"short_names\":[\"flag-vi\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":13},{\"unified\":\"1F1FB-1F1F3\",\"name\":\"Vietnam Flag\",\"short_names\":[\"flag-vn\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":14},{\"unified\":\"1F1FB-1F1FA\",\"name\":\"Vanuatu Flag\",\"short_names\":[\"flag-vu\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":15},{\"unified\":\"1F1FC-1F1EB\",\"name\":\"Wallis & Futuna Flag\",\"short_names\":[\"flag-wf\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":16},{\"unified\":\"1F1FC-1F1F8\",\"name\":\"Samoa Flag\",\"short_names\":[\"flag-ws\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":17},{\"unified\":\"1F1FD-1F1F0\",\"name\":\"Kosovo Flag\",\"short_names\":[\"flag-xk\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":18},{\"unified\":\"1F1FE-1F1EA\",\"name\":\"Yemen Flag\",\"short_names\":[\"flag-ye\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":19},{\"unified\":\"1F1FE-1F1F9\",\"name\":\"Mayotte Flag\",\"short_names\":[\"flag-yt\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":20},{\"unified\":\"1F1FF-1F1E6\",\"name\":\"South Africa Flag\",\"short_names\":[\"flag-za\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":21},{\"unified\":\"1F1FF-1F1F2\",\"name\":\"Zambia Flag\",\"short_names\":[\"flag-zm\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":22},{\"unified\":\"1F1FF-1F1FC\",\"name\":\"Zimbabwe Flag\",\"short_names\":[\"flag-zw\"],\"category\":\"Flags\",\"sheet_x\":5,\"sheet_y\":23},{\"unified\":\"1F201\",\"name\":\"SQUARED KATAKANA KOKO\",\"short_names\":[\"koko\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":24},{\"unified\":\"1F202-FE0F\",\"name\":\"SQUARED KATAKANA SA\",\"short_names\":[\"sa\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":25},{\"unified\":\"1F21A\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7121\",\"short_names\":[\"u7121\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":26},{\"unified\":\"1F22F\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6307\",\"short_names\":[\"u6307\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":27},{\"unified\":\"1F232\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7981\",\"short_names\":[\"u7981\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":28},{\"unified\":\"1F233\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7A7A\",\"short_names\":[\"u7a7a\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":29},{\"unified\":\"1F234\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5408\",\"short_names\":[\"u5408\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":30},{\"unified\":\"1F235\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6E80\",\"short_names\":[\"u6e80\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":31},{\"unified\":\"1F236\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6709\",\"short_names\":[\"u6709\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":32},{\"unified\":\"1F237-FE0F\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-6708\",\"short_names\":[\"u6708\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":33},{\"unified\":\"1F238\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-7533\",\"short_names\":[\"u7533\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":34},{\"unified\":\"1F239\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-5272\",\"short_names\":[\"u5272\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":35},{\"unified\":\"1F23A\",\"name\":\"SQUARED CJK UNIFIED IDEOGRAPH-55B6\",\"short_names\":[\"u55b6\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":36},{\"unified\":\"1F250\",\"name\":\"CIRCLED IDEOGRAPH ADVANTAGE\",\"short_names\":[\"ideograph_advantage\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":37},{\"unified\":\"1F251\",\"name\":\"CIRCLED IDEOGRAPH ACCEPT\",\"short_names\":[\"accept\"],\"category\":\"Symbols\",\"sheet_x\":5,\"sheet_y\":38},{\"unified\":\"1F300\",\"name\":\"CYCLONE\",\"short_names\":[\"cyclone\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":39},{\"unified\":\"1F301\",\"name\":\"FOGGY\",\"short_names\":[\"foggy\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":40},{\"unified\":\"1F302\",\"name\":\"CLOSED UMBRELLA\",\"short_names\":[\"closed_umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":41},{\"unified\":\"1F303\",\"name\":\"NIGHT WITH STARS\",\"short_names\":[\"night_with_stars\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":42},{\"unified\":\"1F304\",\"name\":\"SUNRISE OVER MOUNTAINS\",\"short_names\":[\"sunrise_over_mountains\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":43},{\"unified\":\"1F305\",\"name\":\"SUNRISE\",\"short_names\":[\"sunrise\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":44},{\"unified\":\"1F306\",\"name\":\"CITYSCAPE AT DUSK\",\"short_names\":[\"city_sunset\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":45},{\"unified\":\"1F307\",\"name\":\"SUNSET OVER BUILDINGS\",\"short_names\":[\"city_sunrise\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":46},{\"unified\":\"1F308\",\"name\":\"RAINBOW\",\"short_names\":[\"rainbow\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":47},{\"unified\":\"1F309\",\"name\":\"BRIDGE AT NIGHT\",\"short_names\":[\"bridge_at_night\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":48},{\"unified\":\"1F30A\",\"name\":\"WATER WAVE\",\"short_names\":[\"ocean\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":49},{\"unified\":\"1F30B\",\"name\":\"VOLCANO\",\"short_names\":[\"volcano\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":50},{\"unified\":\"1F30C\",\"name\":\"MILKY WAY\",\"short_names\":[\"milky_way\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":51},{\"unified\":\"1F30D\",\"name\":\"EARTH GLOBE EUROPE-AFRICA\",\"short_names\":[\"earth_africa\"],\"category\":\"Travel & Places\",\"sheet_x\":5,\"sheet_y\":52},{\"unified\":\"1F30E\",\"name\":\"EARTH GLOBE AMERICAS\",\"short_names\":[\"earth_americas\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":0},{\"unified\":\"1F30F\",\"name\":\"EARTH GLOBE ASIA-AUSTRALIA\",\"short_names\":[\"earth_asia\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":1},{\"unified\":\"1F310\",\"name\":\"GLOBE WITH MERIDIANS\",\"short_names\":[\"globe_with_meridians\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":2},{\"unified\":\"1F311\",\"name\":\"NEW MOON SYMBOL\",\"short_names\":[\"new_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":3},{\"unified\":\"1F312\",\"name\":\"WAXING CRESCENT MOON SYMBOL\",\"short_names\":[\"waxing_crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":4},{\"unified\":\"1F313\",\"name\":\"FIRST QUARTER MOON SYMBOL\",\"short_names\":[\"first_quarter_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":5},{\"unified\":\"1F314\",\"name\":\"WAXING GIBBOUS MOON SYMBOL\",\"short_names\":[\"moon\",\"waxing_gibbous_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":6},{\"unified\":\"1F315\",\"name\":\"FULL MOON SYMBOL\",\"short_names\":[\"full_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":7},{\"unified\":\"1F316\",\"name\":\"WANING GIBBOUS MOON SYMBOL\",\"short_names\":[\"waning_gibbous_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":8},{\"unified\":\"1F317\",\"name\":\"LAST QUARTER MOON SYMBOL\",\"short_names\":[\"last_quarter_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":9},{\"unified\":\"1F318\",\"name\":\"WANING CRESCENT MOON SYMBOL\",\"short_names\":[\"waning_crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":10},{\"unified\":\"1F319\",\"name\":\"CRESCENT MOON\",\"short_names\":[\"crescent_moon\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":11},{\"unified\":\"1F31A\",\"name\":\"NEW MOON WITH FACE\",\"short_names\":[\"new_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":12},{\"unified\":\"1F31B\",\"name\":\"FIRST QUARTER MOON WITH FACE\",\"short_names\":[\"first_quarter_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":13},{\"unified\":\"1F31C\",\"name\":\"LAST QUARTER MOON WITH FACE\",\"short_names\":[\"last_quarter_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":14},{\"unified\":\"1F31D\",\"name\":\"FULL MOON WITH FACE\",\"short_names\":[\"full_moon_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":15},{\"unified\":\"1F31E\",\"name\":\"SUN WITH FACE\",\"short_names\":[\"sun_with_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":16},{\"unified\":\"1F31F\",\"name\":\"GLOWING STAR\",\"short_names\":[\"star2\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":17},{\"unified\":\"1F320\",\"name\":\"SHOOTING STAR\",\"short_names\":[\"stars\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":18},{\"unified\":\"1F321-FE0F\",\"name\":null,\"short_names\":[\"thermometer\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":19},{\"unified\":\"1F324-FE0F\",\"name\":null,\"short_names\":[\"mostly_sunny\",\"sun_small_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":20},{\"unified\":\"1F325-FE0F\",\"name\":null,\"short_names\":[\"barely_sunny\",\"sun_behind_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":21},{\"unified\":\"1F326-FE0F\",\"name\":null,\"short_names\":[\"partly_sunny_rain\",\"sun_behind_rain_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":22},{\"unified\":\"1F327-FE0F\",\"name\":null,\"short_names\":[\"rain_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":23},{\"unified\":\"1F328-FE0F\",\"name\":null,\"short_names\":[\"snow_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":24},{\"unified\":\"1F329-FE0F\",\"name\":null,\"short_names\":[\"lightning\",\"lightning_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":25},{\"unified\":\"1F32A-FE0F\",\"name\":null,\"short_names\":[\"tornado\",\"tornado_cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":26},{\"unified\":\"1F32B-FE0F\",\"name\":null,\"short_names\":[\"fog\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":27},{\"unified\":\"1F32C-FE0F\",\"name\":null,\"short_names\":[\"wind_blowing_face\"],\"category\":\"Travel & Places\",\"sheet_x\":6,\"sheet_y\":28},{\"unified\":\"1F32D\",\"name\":\"HOT DOG\",\"short_names\":[\"hotdog\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":29},{\"unified\":\"1F32E\",\"name\":\"TACO\",\"short_names\":[\"taco\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":30},{\"unified\":\"1F32F\",\"name\":\"BURRITO\",\"short_names\":[\"burrito\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":31},{\"unified\":\"1F330\",\"name\":\"CHESTNUT\",\"short_names\":[\"chestnut\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":32},{\"unified\":\"1F331\",\"name\":\"SEEDLING\",\"short_names\":[\"seedling\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":33},{\"unified\":\"1F332\",\"name\":\"EVERGREEN TREE\",\"short_names\":[\"evergreen_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":34},{\"unified\":\"1F333\",\"name\":\"DECIDUOUS TREE\",\"short_names\":[\"deciduous_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":35},{\"unified\":\"1F334\",\"name\":\"PALM TREE\",\"short_names\":[\"palm_tree\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":36},{\"unified\":\"1F335\",\"name\":\"CACTUS\",\"short_names\":[\"cactus\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":37},{\"unified\":\"1F336-FE0F\",\"name\":null,\"short_names\":[\"hot_pepper\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":38},{\"unified\":\"1F337\",\"name\":\"TULIP\",\"short_names\":[\"tulip\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":39},{\"unified\":\"1F338\",\"name\":\"CHERRY BLOSSOM\",\"short_names\":[\"cherry_blossom\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":40},{\"unified\":\"1F339\",\"name\":\"ROSE\",\"short_names\":[\"rose\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":41},{\"unified\":\"1F33A\",\"name\":\"HIBISCUS\",\"short_names\":[\"hibiscus\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":42},{\"unified\":\"1F33B\",\"name\":\"SUNFLOWER\",\"short_names\":[\"sunflower\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":43},{\"unified\":\"1F33C\",\"name\":\"BLOSSOM\",\"short_names\":[\"blossom\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":44},{\"unified\":\"1F33D\",\"name\":\"EAR OF MAIZE\",\"short_names\":[\"corn\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":45},{\"unified\":\"1F33E\",\"name\":\"EAR OF RICE\",\"short_names\":[\"ear_of_rice\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":46},{\"unified\":\"1F33F\",\"name\":\"HERB\",\"short_names\":[\"herb\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":47},{\"unified\":\"1F340\",\"name\":\"FOUR LEAF CLOVER\",\"short_names\":[\"four_leaf_clover\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":48},{\"unified\":\"1F341\",\"name\":\"MAPLE LEAF\",\"short_names\":[\"maple_leaf\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":49},{\"unified\":\"1F342\",\"name\":\"FALLEN LEAF\",\"short_names\":[\"fallen_leaf\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":50},{\"unified\":\"1F343\",\"name\":\"LEAF FLUTTERING IN WIND\",\"short_names\":[\"leaves\"],\"category\":\"Animals & Nature\",\"sheet_x\":6,\"sheet_y\":51},{\"unified\":\"1F344\",\"name\":\"MUSHROOM\",\"short_names\":[\"mushroom\"],\"category\":\"Food & Drink\",\"sheet_x\":6,\"sheet_y\":52},{\"unified\":\"1F345\",\"name\":\"TOMATO\",\"short_names\":[\"tomato\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":0},{\"unified\":\"1F346\",\"name\":\"AUBERGINE\",\"short_names\":[\"eggplant\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":1},{\"unified\":\"1F347\",\"name\":\"GRAPES\",\"short_names\":[\"grapes\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":2},{\"unified\":\"1F348\",\"name\":\"MELON\",\"short_names\":[\"melon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":3},{\"unified\":\"1F349\",\"name\":\"WATERMELON\",\"short_names\":[\"watermelon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":4},{\"unified\":\"1F34A\",\"name\":\"TANGERINE\",\"short_names\":[\"tangerine\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":5},{\"unified\":\"1F34B\",\"name\":\"LEMON\",\"short_names\":[\"lemon\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":6},{\"unified\":\"1F34C\",\"name\":\"BANANA\",\"short_names\":[\"banana\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":7},{\"unified\":\"1F34D\",\"name\":\"PINEAPPLE\",\"short_names\":[\"pineapple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":8},{\"unified\":\"1F34E\",\"name\":\"RED APPLE\",\"short_names\":[\"apple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":9},{\"unified\":\"1F34F\",\"name\":\"GREEN APPLE\",\"short_names\":[\"green_apple\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":10},{\"unified\":\"1F350\",\"name\":\"PEAR\",\"short_names\":[\"pear\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":11},{\"unified\":\"1F351\",\"name\":\"PEACH\",\"short_names\":[\"peach\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":12},{\"unified\":\"1F352\",\"name\":\"CHERRIES\",\"short_names\":[\"cherries\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":13},{\"unified\":\"1F353\",\"name\":\"STRAWBERRY\",\"short_names\":[\"strawberry\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":14},{\"unified\":\"1F354\",\"name\":\"HAMBURGER\",\"short_names\":[\"hamburger\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":15},{\"unified\":\"1F355\",\"name\":\"SLICE OF PIZZA\",\"short_names\":[\"pizza\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":16},{\"unified\":\"1F356\",\"name\":\"MEAT ON BONE\",\"short_names\":[\"meat_on_bone\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":17},{\"unified\":\"1F357\",\"name\":\"POULTRY LEG\",\"short_names\":[\"poultry_leg\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":18},{\"unified\":\"1F358\",\"name\":\"RICE CRACKER\",\"short_names\":[\"rice_cracker\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":19},{\"unified\":\"1F359\",\"name\":\"RICE BALL\",\"short_names\":[\"rice_ball\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":20},{\"unified\":\"1F35A\",\"name\":\"COOKED RICE\",\"short_names\":[\"rice\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":21},{\"unified\":\"1F35B\",\"name\":\"CURRY AND RICE\",\"short_names\":[\"curry\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":22},{\"unified\":\"1F35C\",\"name\":\"STEAMING BOWL\",\"short_names\":[\"ramen\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":23},{\"unified\":\"1F35D\",\"name\":\"SPAGHETTI\",\"short_names\":[\"spaghetti\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":24},{\"unified\":\"1F35E\",\"name\":\"BREAD\",\"short_names\":[\"bread\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":25},{\"unified\":\"1F35F\",\"name\":\"FRENCH FRIES\",\"short_names\":[\"fries\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":26},{\"unified\":\"1F360\",\"name\":\"ROASTED SWEET POTATO\",\"short_names\":[\"sweet_potato\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":27},{\"unified\":\"1F361\",\"name\":\"DANGO\",\"short_names\":[\"dango\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":28},{\"unified\":\"1F362\",\"name\":\"ODEN\",\"short_names\":[\"oden\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":29},{\"unified\":\"1F363\",\"name\":\"SUSHI\",\"short_names\":[\"sushi\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":30},{\"unified\":\"1F364\",\"name\":\"FRIED SHRIMP\",\"short_names\":[\"fried_shrimp\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":31},{\"unified\":\"1F365\",\"name\":\"FISH CAKE WITH SWIRL DESIGN\",\"short_names\":[\"fish_cake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":32},{\"unified\":\"1F366\",\"name\":\"SOFT ICE CREAM\",\"short_names\":[\"icecream\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":33},{\"unified\":\"1F367\",\"name\":\"SHAVED ICE\",\"short_names\":[\"shaved_ice\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":34},{\"unified\":\"1F368\",\"name\":\"ICE CREAM\",\"short_names\":[\"ice_cream\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":35},{\"unified\":\"1F369\",\"name\":\"DOUGHNUT\",\"short_names\":[\"doughnut\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":36},{\"unified\":\"1F36A\",\"name\":\"COOKIE\",\"short_names\":[\"cookie\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":37},{\"unified\":\"1F36B\",\"name\":\"CHOCOLATE BAR\",\"short_names\":[\"chocolate_bar\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":38},{\"unified\":\"1F36C\",\"name\":\"CANDY\",\"short_names\":[\"candy\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":39},{\"unified\":\"1F36D\",\"name\":\"LOLLIPOP\",\"short_names\":[\"lollipop\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":40},{\"unified\":\"1F36E\",\"name\":\"CUSTARD\",\"short_names\":[\"custard\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":41},{\"unified\":\"1F36F\",\"name\":\"HONEY POT\",\"short_names\":[\"honey_pot\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":42},{\"unified\":\"1F370\",\"name\":\"SHORTCAKE\",\"short_names\":[\"cake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":43},{\"unified\":\"1F371\",\"name\":\"BENTO BOX\",\"short_names\":[\"bento\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":44},{\"unified\":\"1F372\",\"name\":\"POT OF FOOD\",\"short_names\":[\"stew\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":45},{\"unified\":\"1F373\",\"name\":\"COOKING\",\"short_names\":[\"fried_egg\",\"cooking\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":46},{\"unified\":\"1F374\",\"name\":\"FORK AND KNIFE\",\"short_names\":[\"fork_and_knife\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":47},{\"unified\":\"1F375\",\"name\":\"TEACUP WITHOUT HANDLE\",\"short_names\":[\"tea\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":48},{\"unified\":\"1F376\",\"name\":\"SAKE BOTTLE AND CUP\",\"short_names\":[\"sake\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":49},{\"unified\":\"1F377\",\"name\":\"WINE GLASS\",\"short_names\":[\"wine_glass\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":50},{\"unified\":\"1F378\",\"name\":\"COCKTAIL GLASS\",\"short_names\":[\"cocktail\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":51},{\"unified\":\"1F379\",\"name\":\"TROPICAL DRINK\",\"short_names\":[\"tropical_drink\"],\"category\":\"Food & Drink\",\"sheet_x\":7,\"sheet_y\":52},{\"unified\":\"1F37A\",\"name\":\"BEER MUG\",\"short_names\":[\"beer\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":0},{\"unified\":\"1F37B\",\"name\":\"CLINKING BEER MUGS\",\"short_names\":[\"beers\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":1},{\"unified\":\"1F37C\",\"name\":\"BABY BOTTLE\",\"short_names\":[\"baby_bottle\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":2},{\"unified\":\"1F37D-FE0F\",\"name\":null,\"short_names\":[\"knife_fork_plate\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":3},{\"unified\":\"1F37E\",\"name\":\"BOTTLE WITH POPPING CORK\",\"short_names\":[\"champagne\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":4},{\"unified\":\"1F37F\",\"name\":\"POPCORN\",\"short_names\":[\"popcorn\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":5},{\"unified\":\"1F380\",\"name\":\"RIBBON\",\"short_names\":[\"ribbon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":6},{\"unified\":\"1F381\",\"name\":\"WRAPPED PRESENT\",\"short_names\":[\"gift\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":7},{\"unified\":\"1F382\",\"name\":\"BIRTHDAY CAKE\",\"short_names\":[\"birthday\"],\"category\":\"Food & Drink\",\"sheet_x\":8,\"sheet_y\":8},{\"unified\":\"1F383\",\"name\":\"JACK-O-LANTERN\",\"short_names\":[\"jack_o_lantern\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":9},{\"unified\":\"1F384\",\"name\":\"CHRISTMAS TREE\",\"short_names\":[\"christmas_tree\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":10},{\"unified\":\"1F385\",\"name\":\"FATHER CHRISTMAS\",\"short_names\":[\"santa\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":11},{\"unified\":\"1F386\",\"name\":\"FIREWORKS\",\"short_names\":[\"fireworks\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":17},{\"unified\":\"1F387\",\"name\":\"FIREWORK SPARKLER\",\"short_names\":[\"sparkler\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":18},{\"unified\":\"1F388\",\"name\":\"BALLOON\",\"short_names\":[\"balloon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":19},{\"unified\":\"1F389\",\"name\":\"PARTY POPPER\",\"short_names\":[\"tada\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":20},{\"unified\":\"1F38A\",\"name\":\"CONFETTI BALL\",\"short_names\":[\"confetti_ball\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":21},{\"unified\":\"1F38B\",\"name\":\"TANABATA TREE\",\"short_names\":[\"tanabata_tree\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":22},{\"unified\":\"1F38C\",\"name\":\"CROSSED FLAGS\",\"short_names\":[\"crossed_flags\"],\"category\":\"Flags\",\"sheet_x\":8,\"sheet_y\":23},{\"unified\":\"1F38D\",\"name\":\"PINE DECORATION\",\"short_names\":[\"bamboo\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":24},{\"unified\":\"1F38E\",\"name\":\"JAPANESE DOLLS\",\"short_names\":[\"dolls\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":25},{\"unified\":\"1F38F\",\"name\":\"CARP STREAMER\",\"short_names\":[\"flags\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":26},{\"unified\":\"1F390\",\"name\":\"WIND CHIME\",\"short_names\":[\"wind_chime\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":27},{\"unified\":\"1F391\",\"name\":\"MOON VIEWING CEREMONY\",\"short_names\":[\"rice_scene\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":28},{\"unified\":\"1F392\",\"name\":\"SCHOOL SATCHEL\",\"short_names\":[\"school_satchel\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":29},{\"unified\":\"1F393\",\"name\":\"GRADUATION CAP\",\"short_names\":[\"mortar_board\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":30},{\"unified\":\"1F396-FE0F\",\"name\":null,\"short_names\":[\"medal\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":31},{\"unified\":\"1F397-FE0F\",\"name\":null,\"short_names\":[\"reminder_ribbon\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":32},{\"unified\":\"1F399-FE0F\",\"name\":null,\"short_names\":[\"studio_microphone\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":33},{\"unified\":\"1F39A-FE0F\",\"name\":null,\"short_names\":[\"level_slider\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":34},{\"unified\":\"1F39B-FE0F\",\"name\":null,\"short_names\":[\"control_knobs\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":35},{\"unified\":\"1F39E-FE0F\",\"name\":null,\"short_names\":[\"film_frames\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":36},{\"unified\":\"1F39F-FE0F\",\"name\":null,\"short_names\":[\"admission_tickets\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":37},{\"unified\":\"1F3A0\",\"name\":\"CAROUSEL HORSE\",\"short_names\":[\"carousel_horse\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":38},{\"unified\":\"1F3A1\",\"name\":\"FERRIS WHEEL\",\"short_names\":[\"ferris_wheel\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":39},{\"unified\":\"1F3A2\",\"name\":\"ROLLER COASTER\",\"short_names\":[\"roller_coaster\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":40},{\"unified\":\"1F3A3\",\"name\":\"FISHING POLE AND FISH\",\"short_names\":[\"fishing_pole_and_fish\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":41},{\"unified\":\"1F3A4\",\"name\":\"MICROPHONE\",\"short_names\":[\"microphone\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":42},{\"unified\":\"1F3A5\",\"name\":\"MOVIE CAMERA\",\"short_names\":[\"movie_camera\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":43},{\"unified\":\"1F3A6\",\"name\":\"CINEMA\",\"short_names\":[\"cinema\"],\"category\":\"Symbols\",\"sheet_x\":8,\"sheet_y\":44},{\"unified\":\"1F3A7\",\"name\":\"HEADPHONE\",\"short_names\":[\"headphones\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":45},{\"unified\":\"1F3A8\",\"name\":\"ARTIST PALETTE\",\"short_names\":[\"art\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":46},{\"unified\":\"1F3A9\",\"name\":\"TOP HAT\",\"short_names\":[\"tophat\"],\"category\":\"Smileys & People\",\"sheet_x\":8,\"sheet_y\":47},{\"unified\":\"1F3AA\",\"name\":\"CIRCUS TENT\",\"short_names\":[\"circus_tent\"],\"category\":\"Travel & Places\",\"sheet_x\":8,\"sheet_y\":48},{\"unified\":\"1F3AB\",\"name\":\"TICKET\",\"short_names\":[\"ticket\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":49},{\"unified\":\"1F3AC\",\"name\":\"CLAPPER BOARD\",\"short_names\":[\"clapper\"],\"category\":\"Objects\",\"sheet_x\":8,\"sheet_y\":50},{\"unified\":\"1F3AD\",\"name\":\"PERFORMING ARTS\",\"short_names\":[\"performing_arts\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":51},{\"unified\":\"1F3AE\",\"name\":\"VIDEO GAME\",\"short_names\":[\"video_game\"],\"category\":\"Activities\",\"sheet_x\":8,\"sheet_y\":52},{\"unified\":\"1F3AF\",\"name\":\"DIRECT HIT\",\"short_names\":[\"dart\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":0},{\"unified\":\"1F3B0\",\"name\":\"SLOT MACHINE\",\"short_names\":[\"slot_machine\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":1},{\"unified\":\"1F3B1\",\"name\":\"BILLIARDS\",\"short_names\":[\"8ball\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":2},{\"unified\":\"1F3B2\",\"name\":\"GAME DIE\",\"short_names\":[\"game_die\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":3},{\"unified\":\"1F3B3\",\"name\":\"BOWLING\",\"short_names\":[\"bowling\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":4},{\"unified\":\"1F3B4\",\"name\":\"FLOWER PLAYING CARDS\",\"short_names\":[\"flower_playing_cards\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":5},{\"unified\":\"1F3B5\",\"name\":\"MUSICAL NOTE\",\"short_names\":[\"musical_note\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":6},{\"unified\":\"1F3B6\",\"name\":\"MULTIPLE MUSICAL NOTES\",\"short_names\":[\"notes\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":7},{\"unified\":\"1F3B7\",\"name\":\"SAXOPHONE\",\"short_names\":[\"saxophone\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":8},{\"unified\":\"1F3B8\",\"name\":\"GUITAR\",\"short_names\":[\"guitar\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":9},{\"unified\":\"1F3B9\",\"name\":\"MUSICAL KEYBOARD\",\"short_names\":[\"musical_keyboard\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":10},{\"unified\":\"1F3BA\",\"name\":\"TRUMPET\",\"short_names\":[\"trumpet\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":11},{\"unified\":\"1F3BB\",\"name\":\"VIOLIN\",\"short_names\":[\"violin\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":12},{\"unified\":\"1F3BC\",\"name\":\"MUSICAL SCORE\",\"short_names\":[\"musical_score\"],\"category\":\"Objects\",\"sheet_x\":9,\"sheet_y\":13},{\"unified\":\"1F3BD\",\"name\":\"RUNNING SHIRT WITH SASH\",\"short_names\":[\"running_shirt_with_sash\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":14},{\"unified\":\"1F3BE\",\"name\":\"TENNIS RACQUET AND BALL\",\"short_names\":[\"tennis\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":15},{\"unified\":\"1F3BF\",\"name\":\"SKI AND SKI BOOT\",\"short_names\":[\"ski\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":16},{\"unified\":\"1F3C0\",\"name\":\"BASKETBALL AND HOOP\",\"short_names\":[\"basketball\"],\"category\":\"Activities\",\"sheet_x\":9,\"sheet_y\":17},{\"unified\":\"1F3C1\",\"name\":\"CHEQUERED FLAG\",\"short_names\":[\"checkered_flag\"],\"category\":\"Flags\",\"sheet_x\":9,\"sheet_y\":18},{\"unified\":\"1F3C2\",\"name\":\"SNOWBOARDER\",\"short_names\":[\"snowboarder\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":19},{\"unified\":\"1F3C3-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":25},{\"unified\":\"1F3C3-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":31},{\"unified\":\"1F3C3\",\"name\":\"RUNNER\",\"short_names\":[\"runner\",\"running\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":37},{\"unified\":\"1F3C4-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-surfing\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":43},{\"unified\":\"1F3C4-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-surfing\"],\"category\":\"Smileys & People\",\"sheet_x\":9,\"sheet_y\":49},{\"unified\":\"1F3C4\",\"name\":\"SURFER\",\"short_names\":[\"surfer\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":2},{\"unified\":\"1F3C5\",\"name\":\"SPORTS MEDAL\",\"short_names\":[\"sports_medal\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":8},{\"unified\":\"1F3C6\",\"name\":\"TROPHY\",\"short_names\":[\"trophy\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":9},{\"unified\":\"1F3C7\",\"name\":\"HORSE RACING\",\"short_names\":[\"horse_racing\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":10},{\"unified\":\"1F3C8\",\"name\":\"AMERICAN FOOTBALL\",\"short_names\":[\"football\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":16},{\"unified\":\"1F3C9\",\"name\":\"RUGBY FOOTBALL\",\"short_names\":[\"rugby_football\"],\"category\":\"Activities\",\"sheet_x\":10,\"sheet_y\":17},{\"unified\":\"1F3CA-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-swimming\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":18},{\"unified\":\"1F3CA-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-swimming\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":24},{\"unified\":\"1F3CA\",\"name\":\"SWIMMER\",\"short_names\":[\"swimmer\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":30},{\"unified\":\"1F3CB-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-lifting-weights\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":36},{\"unified\":\"1F3CB-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-lifting-weights\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":42},{\"unified\":\"1F3CB-FE0F\",\"name\":null,\"short_names\":[\"weight_lifter\"],\"category\":\"Smileys & People\",\"sheet_x\":10,\"sheet_y\":48},{\"unified\":\"1F3CC-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-golfing\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":1},{\"unified\":\"1F3CC-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-golfing\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":7},{\"unified\":\"1F3CC-FE0F\",\"name\":null,\"short_names\":[\"golfer\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":13},{\"unified\":\"1F3CD-FE0F\",\"name\":null,\"short_names\":[\"racing_motorcycle\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":19},{\"unified\":\"1F3CE-FE0F\",\"name\":null,\"short_names\":[\"racing_car\"],\"category\":\"Smileys & People\",\"sheet_x\":11,\"sheet_y\":20},{\"unified\":\"1F3CF\",\"name\":\"CRICKET BAT AND BALL\",\"short_names\":[\"cricket_bat_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":21},{\"unified\":\"1F3D0\",\"name\":\"VOLLEYBALL\",\"short_names\":[\"volleyball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":22},{\"unified\":\"1F3D1\",\"name\":\"FIELD HOCKEY STICK AND BALL\",\"short_names\":[\"field_hockey_stick_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":23},{\"unified\":\"1F3D2\",\"name\":\"ICE HOCKEY STICK AND PUCK\",\"short_names\":[\"ice_hockey_stick_and_puck\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":24},{\"unified\":\"1F3D3\",\"name\":\"TABLE TENNIS PADDLE AND BALL\",\"short_names\":[\"table_tennis_paddle_and_ball\"],\"category\":\"Activities\",\"sheet_x\":11,\"sheet_y\":25},{\"unified\":\"1F3D4-FE0F\",\"name\":null,\"short_names\":[\"snow_capped_mountain\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":26},{\"unified\":\"1F3D5-FE0F\",\"name\":null,\"short_names\":[\"camping\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":27},{\"unified\":\"1F3D6-FE0F\",\"name\":null,\"short_names\":[\"beach_with_umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":28},{\"unified\":\"1F3D7-FE0F\",\"name\":null,\"short_names\":[\"building_construction\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":29},{\"unified\":\"1F3D8-FE0F\",\"name\":null,\"short_names\":[\"house_buildings\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":30},{\"unified\":\"1F3D9-FE0F\",\"name\":null,\"short_names\":[\"cityscape\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":31},{\"unified\":\"1F3DA-FE0F\",\"name\":null,\"short_names\":[\"derelict_house_building\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":32},{\"unified\":\"1F3DB-FE0F\",\"name\":null,\"short_names\":[\"classical_building\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":33},{\"unified\":\"1F3DC-FE0F\",\"name\":null,\"short_names\":[\"desert\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":34},{\"unified\":\"1F3DD-FE0F\",\"name\":null,\"short_names\":[\"desert_island\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":35},{\"unified\":\"1F3DE-FE0F\",\"name\":null,\"short_names\":[\"national_park\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":36},{\"unified\":\"1F3DF-FE0F\",\"name\":null,\"short_names\":[\"stadium\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":37},{\"unified\":\"1F3E0\",\"name\":\"HOUSE BUILDING\",\"short_names\":[\"house\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":38},{\"unified\":\"1F3E1\",\"name\":\"HOUSE WITH GARDEN\",\"short_names\":[\"house_with_garden\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":39},{\"unified\":\"1F3E2\",\"name\":\"OFFICE BUILDING\",\"short_names\":[\"office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":40},{\"unified\":\"1F3E3\",\"name\":\"JAPANESE POST OFFICE\",\"short_names\":[\"post_office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":41},{\"unified\":\"1F3E4\",\"name\":\"EUROPEAN POST OFFICE\",\"short_names\":[\"european_post_office\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":42},{\"unified\":\"1F3E5\",\"name\":\"HOSPITAL\",\"short_names\":[\"hospital\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":43},{\"unified\":\"1F3E6\",\"name\":\"BANK\",\"short_names\":[\"bank\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":44},{\"unified\":\"1F3E7\",\"name\":\"AUTOMATED TELLER MACHINE\",\"short_names\":[\"atm\"],\"category\":\"Symbols\",\"sheet_x\":11,\"sheet_y\":45},{\"unified\":\"1F3E8\",\"name\":\"HOTEL\",\"short_names\":[\"hotel\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":46},{\"unified\":\"1F3E9\",\"name\":\"LOVE HOTEL\",\"short_names\":[\"love_hotel\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":47},{\"unified\":\"1F3EA\",\"name\":\"CONVENIENCE STORE\",\"short_names\":[\"convenience_store\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":48},{\"unified\":\"1F3EB\",\"name\":\"SCHOOL\",\"short_names\":[\"school\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":49},{\"unified\":\"1F3EC\",\"name\":\"DEPARTMENT STORE\",\"short_names\":[\"department_store\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":50},{\"unified\":\"1F3ED\",\"name\":\"FACTORY\",\"short_names\":[\"factory\"],\"category\":\"Travel & Places\",\"sheet_x\":11,\"sheet_y\":51},{\"unified\":\"1F3EE\",\"name\":\"IZAKAYA LANTERN\",\"short_names\":[\"izakaya_lantern\",\"lantern\"],\"category\":\"Objects\",\"sheet_x\":11,\"sheet_y\":52},{\"unified\":\"1F3EF\",\"name\":\"JAPANESE CASTLE\",\"short_names\":[\"japanese_castle\"],\"category\":\"Travel & Places\",\"sheet_x\":12,\"sheet_y\":0},{\"unified\":\"1F3F0\",\"name\":\"EUROPEAN CASTLE\",\"short_names\":[\"european_castle\"],\"category\":\"Travel & Places\",\"sheet_x\":12,\"sheet_y\":1},{\"unified\":\"1F3F3-FE0F-200D-1F308\",\"name\":null,\"short_names\":[\"rainbow-flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":2},{\"unified\":\"1F3F3-FE0F\",\"name\":null,\"short_names\":[\"waving_white_flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":3},{\"unified\":\"1F3F4-E0067-E0062-E0065-E006E-E0067-E007F\",\"name\":\"England Flag\",\"short_names\":[\"flag-england\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":5},{\"unified\":\"1F3F4-E0067-E0062-E0073-E0063-E0074-E007F\",\"name\":\"Scotland Flag\",\"short_names\":[\"flag-scotland\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":6},{\"unified\":\"1F3F4-E0067-E0062-E0077-E006C-E0073-E007F\",\"name\":\"Wales Flag\",\"short_names\":[\"flag-wales\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":7},{\"unified\":\"1F3F4\",\"name\":\"WAVING BLACK FLAG\",\"short_names\":[\"waving_black_flag\"],\"category\":\"Flags\",\"sheet_x\":12,\"sheet_y\":8},{\"unified\":\"1F3F5-FE0F\",\"name\":null,\"short_names\":[\"rosette\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":9},{\"unified\":\"1F3F7-FE0F\",\"name\":null,\"short_names\":[\"label\"],\"category\":\"Objects\",\"sheet_x\":12,\"sheet_y\":10},{\"unified\":\"1F3F8\",\"name\":\"BADMINTON RACQUET AND SHUTTLECOCK\",\"short_names\":[\"badminton_racquet_and_shuttlecock\"],\"category\":\"Activities\",\"sheet_x\":12,\"sheet_y\":11},{\"unified\":\"1F3F9\",\"name\":\"BOW AND ARROW\",\"short_names\":[\"bow_and_arrow\"],\"category\":\"Objects\",\"sheet_x\":12,\"sheet_y\":12},{\"unified\":\"1F3FA\",\"name\":\"AMPHORA\",\"short_names\":[\"amphora\"],\"category\":\"Food & Drink\",\"sheet_x\":12,\"sheet_y\":13},{\"unified\":\"1F3FB\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-1-2\",\"short_names\":[\"skin-tone-2\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":14},{\"unified\":\"1F3FC\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-3\",\"short_names\":[\"skin-tone-3\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":15},{\"unified\":\"1F3FD\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-4\",\"short_names\":[\"skin-tone-4\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":16},{\"unified\":\"1F3FE\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-5\",\"short_names\":[\"skin-tone-5\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":17},{\"unified\":\"1F3FF\",\"name\":\"EMOJI MODIFIER FITZPATRICK TYPE-6\",\"short_names\":[\"skin-tone-6\"],\"category\":\"Skin Tones\",\"sheet_x\":12,\"sheet_y\":18},{\"unified\":\"1F400\",\"name\":\"RAT\",\"short_names\":[\"rat\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":19},{\"unified\":\"1F401\",\"name\":\"MOUSE\",\"short_names\":[\"mouse2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":20},{\"unified\":\"1F402\",\"name\":\"OX\",\"short_names\":[\"ox\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":21},{\"unified\":\"1F403\",\"name\":\"WATER BUFFALO\",\"short_names\":[\"water_buffalo\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":22},{\"unified\":\"1F404\",\"name\":\"COW\",\"short_names\":[\"cow2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":23},{\"unified\":\"1F405\",\"name\":\"TIGER\",\"short_names\":[\"tiger2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":24},{\"unified\":\"1F406\",\"name\":\"LEOPARD\",\"short_names\":[\"leopard\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":25},{\"unified\":\"1F407\",\"name\":\"RABBIT\",\"short_names\":[\"rabbit2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":26},{\"unified\":\"1F408\",\"name\":\"CAT\",\"short_names\":[\"cat2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":27},{\"unified\":\"1F409\",\"name\":\"DRAGON\",\"short_names\":[\"dragon\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":28},{\"unified\":\"1F40A\",\"name\":\"CROCODILE\",\"short_names\":[\"crocodile\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":29},{\"unified\":\"1F40B\",\"name\":\"WHALE\",\"short_names\":[\"whale2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":30},{\"unified\":\"1F40C\",\"name\":\"SNAIL\",\"short_names\":[\"snail\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":31},{\"unified\":\"1F40D\",\"name\":\"SNAKE\",\"short_names\":[\"snake\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":32},{\"unified\":\"1F40E\",\"name\":\"HORSE\",\"short_names\":[\"racehorse\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":33},{\"unified\":\"1F40F\",\"name\":\"RAM\",\"short_names\":[\"ram\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":34},{\"unified\":\"1F410\",\"name\":\"GOAT\",\"short_names\":[\"goat\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":35},{\"unified\":\"1F411\",\"name\":\"SHEEP\",\"short_names\":[\"sheep\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":36},{\"unified\":\"1F412\",\"name\":\"MONKEY\",\"short_names\":[\"monkey\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":37},{\"unified\":\"1F413\",\"name\":\"ROOSTER\",\"short_names\":[\"rooster\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":38},{\"unified\":\"1F414\",\"name\":\"CHICKEN\",\"short_names\":[\"chicken\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":39},{\"unified\":\"1F415\",\"name\":\"DOG\",\"short_names\":[\"dog2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":40},{\"unified\":\"1F416\",\"name\":\"PIG\",\"short_names\":[\"pig2\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":41},{\"unified\":\"1F417\",\"name\":\"BOAR\",\"short_names\":[\"boar\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":42},{\"unified\":\"1F418\",\"name\":\"ELEPHANT\",\"short_names\":[\"elephant\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":43},{\"unified\":\"1F419\",\"name\":\"OCTOPUS\",\"short_names\":[\"octopus\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":44},{\"unified\":\"1F41A\",\"name\":\"SPIRAL SHELL\",\"short_names\":[\"shell\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":45},{\"unified\":\"1F41B\",\"name\":\"BUG\",\"short_names\":[\"bug\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":46},{\"unified\":\"1F41C\",\"name\":\"ANT\",\"short_names\":[\"ant\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":47},{\"unified\":\"1F41D\",\"name\":\"HONEYBEE\",\"short_names\":[\"bee\",\"honeybee\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":48},{\"unified\":\"1F41E\",\"name\":\"LADY BEETLE\",\"short_names\":[\"beetle\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":49},{\"unified\":\"1F41F\",\"name\":\"FISH\",\"short_names\":[\"fish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":50},{\"unified\":\"1F420\",\"name\":\"TROPICAL FISH\",\"short_names\":[\"tropical_fish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":51},{\"unified\":\"1F421\",\"name\":\"BLOWFISH\",\"short_names\":[\"blowfish\"],\"category\":\"Animals & Nature\",\"sheet_x\":12,\"sheet_y\":52},{\"unified\":\"1F422\",\"name\":\"TURTLE\",\"short_names\":[\"turtle\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":0},{\"unified\":\"1F423\",\"name\":\"HATCHING CHICK\",\"short_names\":[\"hatching_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":1},{\"unified\":\"1F424\",\"name\":\"BABY CHICK\",\"short_names\":[\"baby_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":2},{\"unified\":\"1F425\",\"name\":\"FRONT-FACING BABY CHICK\",\"short_names\":[\"hatched_chick\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":3},{\"unified\":\"1F426\",\"name\":\"BIRD\",\"short_names\":[\"bird\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":4},{\"unified\":\"1F427\",\"name\":\"PENGUIN\",\"short_names\":[\"penguin\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":5},{\"unified\":\"1F428\",\"name\":\"KOALA\",\"short_names\":[\"koala\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":6},{\"unified\":\"1F429\",\"name\":\"POODLE\",\"short_names\":[\"poodle\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":7},{\"unified\":\"1F42A\",\"name\":\"DROMEDARY CAMEL\",\"short_names\":[\"dromedary_camel\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":8},{\"unified\":\"1F42B\",\"name\":\"BACTRIAN CAMEL\",\"short_names\":[\"camel\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":9},{\"unified\":\"1F42C\",\"name\":\"DOLPHIN\",\"short_names\":[\"dolphin\",\"flipper\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":10},{\"unified\":\"1F42D\",\"name\":\"MOUSE FACE\",\"short_names\":[\"mouse\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":11},{\"unified\":\"1F42E\",\"name\":\"COW FACE\",\"short_names\":[\"cow\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":12},{\"unified\":\"1F42F\",\"name\":\"TIGER FACE\",\"short_names\":[\"tiger\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":13},{\"unified\":\"1F430\",\"name\":\"RABBIT FACE\",\"short_names\":[\"rabbit\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":14},{\"unified\":\"1F431\",\"name\":\"CAT FACE\",\"short_names\":[\"cat\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":15},{\"unified\":\"1F432\",\"name\":\"DRAGON FACE\",\"short_names\":[\"dragon_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":16},{\"unified\":\"1F433\",\"name\":\"SPOUTING WHALE\",\"short_names\":[\"whale\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":17},{\"unified\":\"1F434\",\"name\":\"HORSE FACE\",\"short_names\":[\"horse\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":18},{\"unified\":\"1F435\",\"name\":\"MONKEY FACE\",\"short_names\":[\"monkey_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":19},{\"unified\":\"1F436\",\"name\":\"DOG FACE\",\"short_names\":[\"dog\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":20},{\"unified\":\"1F437\",\"name\":\"PIG FACE\",\"short_names\":[\"pig\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":21},{\"unified\":\"1F438\",\"name\":\"FROG FACE\",\"short_names\":[\"frog\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":22},{\"unified\":\"1F439\",\"name\":\"HAMSTER FACE\",\"short_names\":[\"hamster\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":23},{\"unified\":\"1F43A\",\"name\":\"WOLF FACE\",\"short_names\":[\"wolf\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":24},{\"unified\":\"1F43B\",\"name\":\"BEAR FACE\",\"short_names\":[\"bear\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":25},{\"unified\":\"1F43C\",\"name\":\"PANDA FACE\",\"short_names\":[\"panda_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":26},{\"unified\":\"1F43D\",\"name\":\"PIG NOSE\",\"short_names\":[\"pig_nose\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":27},{\"unified\":\"1F43E\",\"name\":\"PAW PRINTS\",\"short_names\":[\"feet\",\"paw_prints\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":28},{\"unified\":\"1F43F-FE0F\",\"name\":null,\"short_names\":[\"chipmunk\"],\"category\":\"Animals & Nature\",\"sheet_x\":13,\"sheet_y\":29},{\"unified\":\"1F440\",\"name\":\"EYES\",\"short_names\":[\"eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":30},{\"unified\":\"1F441-FE0F-200D-1F5E8-FE0F\",\"name\":null,\"short_names\":[\"eye-in-speech-bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":31},{\"unified\":\"1F441-FE0F\",\"name\":null,\"short_names\":[\"eye\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":32},{\"unified\":\"1F442\",\"name\":\"EAR\",\"short_names\":[\"ear\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":33},{\"unified\":\"1F443\",\"name\":\"NOSE\",\"short_names\":[\"nose\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":39},{\"unified\":\"1F444\",\"name\":\"MOUTH\",\"short_names\":[\"lips\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":45},{\"unified\":\"1F445\",\"name\":\"TONGUE\",\"short_names\":[\"tongue\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":46},{\"unified\":\"1F446\",\"name\":\"WHITE UP POINTING BACKHAND INDEX\",\"short_names\":[\"point_up_2\"],\"category\":\"Smileys & People\",\"sheet_x\":13,\"sheet_y\":47},{\"unified\":\"1F447\",\"name\":\"WHITE DOWN POINTING BACKHAND INDEX\",\"short_names\":[\"point_down\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":0},{\"unified\":\"1F448\",\"name\":\"WHITE LEFT POINTING BACKHAND INDEX\",\"short_names\":[\"point_left\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":6},{\"unified\":\"1F449\",\"name\":\"WHITE RIGHT POINTING BACKHAND INDEX\",\"short_names\":[\"point_right\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":12},{\"unified\":\"1F44A\",\"name\":\"FISTED HAND SIGN\",\"short_names\":[\"facepunch\",\"punch\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":18},{\"unified\":\"1F44B\",\"name\":\"WAVING HAND SIGN\",\"short_names\":[\"wave\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":24},{\"unified\":\"1F44C\",\"name\":\"OK HAND SIGN\",\"short_names\":[\"ok_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":30},{\"unified\":\"1F44D\",\"name\":\"THUMBS UP SIGN\",\"short_names\":[\"+1\",\"thumbsup\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":36},{\"unified\":\"1F44E\",\"name\":\"THUMBS DOWN SIGN\",\"short_names\":[\"-1\",\"thumbsdown\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":42},{\"unified\":\"1F44F\",\"name\":\"CLAPPING HANDS SIGN\",\"short_names\":[\"clap\"],\"category\":\"Smileys & People\",\"sheet_x\":14,\"sheet_y\":48},{\"unified\":\"1F450\",\"name\":\"OPEN HANDS SIGN\",\"short_names\":[\"open_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":1},{\"unified\":\"1F451\",\"name\":\"CROWN\",\"short_names\":[\"crown\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":7},{\"unified\":\"1F452\",\"name\":\"WOMANS HAT\",\"short_names\":[\"womans_hat\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":8},{\"unified\":\"1F453\",\"name\":\"EYEGLASSES\",\"short_names\":[\"eyeglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":9},{\"unified\":\"1F454\",\"name\":\"NECKTIE\",\"short_names\":[\"necktie\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":10},{\"unified\":\"1F455\",\"name\":\"T-SHIRT\",\"short_names\":[\"shirt\",\"tshirt\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":11},{\"unified\":\"1F456\",\"name\":\"JEANS\",\"short_names\":[\"jeans\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":12},{\"unified\":\"1F457\",\"name\":\"DRESS\",\"short_names\":[\"dress\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":13},{\"unified\":\"1F458\",\"name\":\"KIMONO\",\"short_names\":[\"kimono\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":14},{\"unified\":\"1F459\",\"name\":\"BIKINI\",\"short_names\":[\"bikini\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":15},{\"unified\":\"1F45A\",\"name\":\"WOMANS CLOTHES\",\"short_names\":[\"womans_clothes\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":16},{\"unified\":\"1F45B\",\"name\":\"PURSE\",\"short_names\":[\"purse\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":17},{\"unified\":\"1F45C\",\"name\":\"HANDBAG\",\"short_names\":[\"handbag\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":18},{\"unified\":\"1F45D\",\"name\":\"POUCH\",\"short_names\":[\"pouch\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":19},{\"unified\":\"1F45E\",\"name\":\"MANS SHOE\",\"short_names\":[\"mans_shoe\",\"shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":20},{\"unified\":\"1F45F\",\"name\":\"ATHLETIC SHOE\",\"short_names\":[\"athletic_shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":21},{\"unified\":\"1F460\",\"name\":\"HIGH-HEELED SHOE\",\"short_names\":[\"high_heel\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":22},{\"unified\":\"1F461\",\"name\":\"WOMANS SANDAL\",\"short_names\":[\"sandal\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":23},{\"unified\":\"1F462\",\"name\":\"WOMANS BOOTS\",\"short_names\":[\"boot\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":24},{\"unified\":\"1F463\",\"name\":\"FOOTPRINTS\",\"short_names\":[\"footprints\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":25},{\"unified\":\"1F464\",\"name\":\"BUST IN SILHOUETTE\",\"short_names\":[\"bust_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":26},{\"unified\":\"1F465\",\"name\":\"BUSTS IN SILHOUETTE\",\"short_names\":[\"busts_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":27},{\"unified\":\"1F466\",\"name\":\"BOY\",\"short_names\":[\"boy\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":28},{\"unified\":\"1F467\",\"name\":\"GIRL\",\"short_names\":[\"girl\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":34},{\"unified\":\"1F468-200D-1F33E\",\"name\":null,\"short_names\":[\"male-farmer\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":40},{\"unified\":\"1F468-200D-1F373\",\"name\":null,\"short_names\":[\"male-cook\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":46},{\"unified\":\"1F468-200D-1F393\",\"name\":null,\"short_names\":[\"male-student\"],\"category\":\"Smileys & People\",\"sheet_x\":15,\"sheet_y\":52},{\"unified\":\"1F468-200D-1F3A4\",\"name\":null,\"short_names\":[\"male-singer\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":5},{\"unified\":\"1F468-200D-1F3A8\",\"name\":null,\"short_names\":[\"male-artist\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":11},{\"unified\":\"1F468-200D-1F3EB\",\"name\":null,\"short_names\":[\"male-teacher\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":17},{\"unified\":\"1F468-200D-1F3ED\",\"name\":null,\"short_names\":[\"male-factory-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":23},{\"unified\":\"1F468-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":29},{\"unified\":\"1F468-200D-1F466\",\"name\":null,\"short_names\":[\"man-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":30},{\"unified\":\"1F468-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":31},{\"unified\":\"1F468-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":32},{\"unified\":\"1F468-200D-1F467\",\"name\":null,\"short_names\":[\"man-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":33},{\"unified\":\"1F468-200D-1F468-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":34},{\"unified\":\"1F468-200D-1F468-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":35},{\"unified\":\"1F468-200D-1F468-200D-1F467\",\"name\":null,\"short_names\":[\"man-man-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":36},{\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-man-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":37},{\"unified\":\"1F468-200D-1F468-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-man-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":38},{\"unified\":\"1F468-200D-1F469-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-boy\",\"family\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":39},{\"unified\":\"1F468-200D-1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":40},{\"unified\":\"1F468-200D-1F469-200D-1F467\",\"name\":null,\"short_names\":[\"man-woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":41},{\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"man-woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":42},{\"unified\":\"1F468-200D-1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"man-woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":43},{\"unified\":\"1F468-200D-1F4BB\",\"name\":null,\"short_names\":[\"male-technologist\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":44},{\"unified\":\"1F468-200D-1F4BC\",\"name\":null,\"short_names\":[\"male-office-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":16,\"sheet_y\":50},{\"unified\":\"1F468-200D-1F527\",\"name\":null,\"short_names\":[\"male-mechanic\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":3},{\"unified\":\"1F468-200D-1F52C\",\"name\":null,\"short_names\":[\"male-scientist\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":9},{\"unified\":\"1F468-200D-1F680\",\"name\":null,\"short_names\":[\"male-astronaut\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":15},{\"unified\":\"1F468-200D-1F692\",\"name\":null,\"short_names\":[\"male-firefighter\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":21},{\"unified\":\"1F468-200D-2695-FE0F\",\"name\":null,\"short_names\":[\"male-doctor\"],\"category\":\"Smileys & People\",\"sheet_x\":17,\"sheet_y\":51},{\"unified\":\"1F468-200D-2696-FE0F\",\"name\":null,\"short_names\":[\"male-judge\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":4},{\"unified\":\"1F468-200D-2708-FE0F\",\"name\":null,\"short_names\":[\"male-pilot\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":10},{\"unified\":\"1F468-200D-2764-FE0F-200D-1F468\",\"name\":null,\"short_names\":[\"man-heart-man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":16},{\"unified\":\"1F468-200D-2764-FE0F-200D-1F48B-200D-1F468\",\"name\":null,\"short_names\":[\"man-kiss-man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":17},{\"unified\":\"1F468\",\"name\":\"MAN\",\"short_names\":[\"man\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":18},{\"unified\":\"1F469-200D-1F33E\",\"name\":null,\"short_names\":[\"female-farmer\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":24},{\"unified\":\"1F469-200D-1F373\",\"name\":null,\"short_names\":[\"female-cook\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":30},{\"unified\":\"1F469-200D-1F393\",\"name\":null,\"short_names\":[\"female-student\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":36},{\"unified\":\"1F469-200D-1F3A4\",\"name\":null,\"short_names\":[\"female-singer\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":42},{\"unified\":\"1F469-200D-1F3A8\",\"name\":null,\"short_names\":[\"female-artist\"],\"category\":\"Smileys & People\",\"sheet_x\":18,\"sheet_y\":48},{\"unified\":\"1F469-200D-1F3EB\",\"name\":null,\"short_names\":[\"female-teacher\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":1},{\"unified\":\"1F469-200D-1F3ED\",\"name\":null,\"short_names\":[\"female-factory-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":7},{\"unified\":\"1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":13},{\"unified\":\"1F469-200D-1F466\",\"name\":null,\"short_names\":[\"woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":14},{\"unified\":\"1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":15},{\"unified\":\"1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":16},{\"unified\":\"1F469-200D-1F467\",\"name\":null,\"short_names\":[\"woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":17},{\"unified\":\"1F469-200D-1F469-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":18},{\"unified\":\"1F469-200D-1F469-200D-1F466-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-boy-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":19},{\"unified\":\"1F469-200D-1F469-200D-1F467\",\"name\":null,\"short_names\":[\"woman-woman-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":20},{\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F466\",\"name\":null,\"short_names\":[\"woman-woman-girl-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":21},{\"unified\":\"1F469-200D-1F469-200D-1F467-200D-1F467\",\"name\":null,\"short_names\":[\"woman-woman-girl-girl\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":22},{\"unified\":\"1F469-200D-1F4BB\",\"name\":null,\"short_names\":[\"female-technologist\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":23},{\"unified\":\"1F469-200D-1F4BC\",\"name\":null,\"short_names\":[\"female-office-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":29},{\"unified\":\"1F469-200D-1F527\",\"name\":null,\"short_names\":[\"female-mechanic\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":35},{\"unified\":\"1F469-200D-1F52C\",\"name\":null,\"short_names\":[\"female-scientist\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":41},{\"unified\":\"1F469-200D-1F680\",\"name\":null,\"short_names\":[\"female-astronaut\"],\"category\":\"Smileys & People\",\"sheet_x\":19,\"sheet_y\":47},{\"unified\":\"1F469-200D-1F692\",\"name\":null,\"short_names\":[\"female-firefighter\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":0},{\"unified\":\"1F469-200D-2695-FE0F\",\"name\":null,\"short_names\":[\"female-doctor\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":30},{\"unified\":\"1F469-200D-2696-FE0F\",\"name\":null,\"short_names\":[\"female-judge\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":36},{\"unified\":\"1F469-200D-2708-FE0F\",\"name\":null,\"short_names\":[\"female-pilot\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":42},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F468\",\"name\":null,\"short_names\":[\"woman-heart-man\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":48},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F469\",\"name\":null,\"short_names\":[\"woman-heart-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":49},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F48B-200D-1F468\",\"name\":null,\"short_names\":[\"woman-kiss-man\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":50},{\"unified\":\"1F469-200D-2764-FE0F-200D-1F48B-200D-1F469\",\"name\":null,\"short_names\":[\"woman-kiss-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":51},{\"unified\":\"1F469\",\"name\":\"WOMAN\",\"short_names\":[\"woman\"],\"category\":\"Smileys & People\",\"sheet_x\":20,\"sheet_y\":52},{\"unified\":\"1F46A\",\"name\":\"FAMILY\",\"short_names\":[\"family\",\"man-woman-boy\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":5},{\"unified\":\"1F46B\",\"name\":\"MAN AND WOMAN HOLDING HANDS\",\"short_names\":[\"couple\",\"man_and_woman_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":6},{\"unified\":\"1F46C\",\"name\":\"TWO MEN HOLDING HANDS\",\"short_names\":[\"two_men_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":7},{\"unified\":\"1F46D\",\"name\":\"TWO WOMEN HOLDING HANDS\",\"short_names\":[\"two_women_holding_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":8},{\"unified\":\"1F46E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-police-officer\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":9},{\"unified\":\"1F46E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-police-officer\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":15},{\"unified\":\"1F46E\",\"name\":\"POLICE OFFICER\",\"short_names\":[\"cop\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":21},{\"unified\":\"1F46F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-with-bunny-ears-partying\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":27},{\"unified\":\"1F46F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-with-bunny-ears-partying\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":28},{\"unified\":\"1F46F\",\"name\":\"WOMAN WITH BUNNY EARS\",\"short_names\":[\"dancers\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":29},{\"unified\":\"1F470\",\"name\":\"BRIDE WITH VEIL\",\"short_names\":[\"bride_with_veil\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":30},{\"unified\":\"1F471-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"blond-haired-woman\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":36},{\"unified\":\"1F471-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"blond-haired-man\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":42},{\"unified\":\"1F471\",\"name\":\"PERSON WITH BLOND HAIR\",\"short_names\":[\"person_with_blond_hair\"],\"category\":\"Smileys & People\",\"sheet_x\":21,\"sheet_y\":48},{\"unified\":\"1F472\",\"name\":\"MAN WITH GUA PI MAO\",\"short_names\":[\"man_with_gua_pi_mao\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":1},{\"unified\":\"1F473-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-wearing-turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":7},{\"unified\":\"1F473-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-wearing-turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":13},{\"unified\":\"1F473\",\"name\":\"MAN WITH TURBAN\",\"short_names\":[\"man_with_turban\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":19},{\"unified\":\"1F474\",\"name\":\"OLDER MAN\",\"short_names\":[\"older_man\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":25},{\"unified\":\"1F475\",\"name\":\"OLDER WOMAN\",\"short_names\":[\"older_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":31},{\"unified\":\"1F476\",\"name\":\"BABY\",\"short_names\":[\"baby\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":37},{\"unified\":\"1F477-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-construction-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":43},{\"unified\":\"1F477-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-construction-worker\"],\"category\":\"Smileys & People\",\"sheet_x\":22,\"sheet_y\":49},{\"unified\":\"1F477\",\"name\":\"CONSTRUCTION WORKER\",\"short_names\":[\"construction_worker\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":2},{\"unified\":\"1F478\",\"name\":\"PRINCESS\",\"short_names\":[\"princess\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":8},{\"unified\":\"1F479\",\"name\":\"JAPANESE OGRE\",\"short_names\":[\"japanese_ogre\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":14},{\"unified\":\"1F47A\",\"name\":\"JAPANESE GOBLIN\",\"short_names\":[\"japanese_goblin\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":15},{\"unified\":\"1F47B\",\"name\":\"GHOST\",\"short_names\":[\"ghost\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":16},{\"unified\":\"1F47C\",\"name\":\"BABY ANGEL\",\"short_names\":[\"angel\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":17},{\"unified\":\"1F47D\",\"name\":\"EXTRATERRESTRIAL ALIEN\",\"short_names\":[\"alien\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":23},{\"unified\":\"1F47E\",\"name\":\"ALIEN MONSTER\",\"short_names\":[\"space_invader\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":24},{\"unified\":\"1F47F\",\"name\":\"IMP\",\"short_names\":[\"imp\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":25},{\"unified\":\"1F480\",\"name\":\"SKULL\",\"short_names\":[\"skull\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":26},{\"unified\":\"1F481-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-tipping-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":27},{\"unified\":\"1F481-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-tipping-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":33},{\"unified\":\"1F481\",\"name\":\"INFORMATION DESK PERSON\",\"short_names\":[\"information_desk_person\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":39},{\"unified\":\"1F482-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-guard\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":45},{\"unified\":\"1F482-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-guard\"],\"category\":\"Smileys & People\",\"sheet_x\":23,\"sheet_y\":51},{\"unified\":\"1F482\",\"name\":\"GUARDSMAN\",\"short_names\":[\"guardsman\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":4},{\"unified\":\"1F483\",\"name\":\"DANCER\",\"short_names\":[\"dancer\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":10},{\"unified\":\"1F484\",\"name\":\"LIPSTICK\",\"short_names\":[\"lipstick\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":16},{\"unified\":\"1F485\",\"name\":\"NAIL POLISH\",\"short_names\":[\"nail_care\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":17},{\"unified\":\"1F486-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-getting-massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":23},{\"unified\":\"1F486-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-getting-massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":29},{\"unified\":\"1F486\",\"name\":\"FACE MASSAGE\",\"short_names\":[\"massage\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":35},{\"unified\":\"1F487-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-getting-haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":41},{\"unified\":\"1F487-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-getting-haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":24,\"sheet_y\":47},{\"unified\":\"1F487\",\"name\":\"HAIRCUT\",\"short_names\":[\"haircut\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":0},{\"unified\":\"1F488\",\"name\":\"BARBER POLE\",\"short_names\":[\"barber\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":6},{\"unified\":\"1F489\",\"name\":\"SYRINGE\",\"short_names\":[\"syringe\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":7},{\"unified\":\"1F48A\",\"name\":\"PILL\",\"short_names\":[\"pill\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":8},{\"unified\":\"1F48B\",\"name\":\"KISS MARK\",\"short_names\":[\"kiss\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":9},{\"unified\":\"1F48C\",\"name\":\"LOVE LETTER\",\"short_names\":[\"love_letter\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":10},{\"unified\":\"1F48D\",\"name\":\"RING\",\"short_names\":[\"ring\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":11},{\"unified\":\"1F48E\",\"name\":\"GEM STONE\",\"short_names\":[\"gem\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":12},{\"unified\":\"1F48F\",\"name\":\"KISS\",\"short_names\":[\"couplekiss\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":13},{\"unified\":\"1F490\",\"name\":\"BOUQUET\",\"short_names\":[\"bouquet\"],\"category\":\"Animals & Nature\",\"sheet_x\":25,\"sheet_y\":14},{\"unified\":\"1F491\",\"name\":\"COUPLE WITH HEART\",\"short_names\":[\"couple_with_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":15},{\"unified\":\"1F492\",\"name\":\"WEDDING\",\"short_names\":[\"wedding\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":16},{\"unified\":\"1F493\",\"name\":\"BEATING HEART\",\"short_names\":[\"heartbeat\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":17},{\"unified\":\"1F494\",\"name\":\"BROKEN HEART\",\"short_names\":[\"broken_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":18},{\"unified\":\"1F495\",\"name\":\"TWO HEARTS\",\"short_names\":[\"two_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":19},{\"unified\":\"1F496\",\"name\":\"SPARKLING HEART\",\"short_names\":[\"sparkling_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":20},{\"unified\":\"1F497\",\"name\":\"GROWING HEART\",\"short_names\":[\"heartpulse\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":21},{\"unified\":\"1F498\",\"name\":\"HEART WITH ARROW\",\"short_names\":[\"cupid\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":22},{\"unified\":\"1F499\",\"name\":\"BLUE HEART\",\"short_names\":[\"blue_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":23},{\"unified\":\"1F49A\",\"name\":\"GREEN HEART\",\"short_names\":[\"green_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":24},{\"unified\":\"1F49B\",\"name\":\"YELLOW HEART\",\"short_names\":[\"yellow_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":25},{\"unified\":\"1F49C\",\"name\":\"PURPLE HEART\",\"short_names\":[\"purple_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":26},{\"unified\":\"1F49D\",\"name\":\"HEART WITH RIBBON\",\"short_names\":[\"gift_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":27},{\"unified\":\"1F49E\",\"name\":\"REVOLVING HEARTS\",\"short_names\":[\"revolving_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":28},{\"unified\":\"1F49F\",\"name\":\"HEART DECORATION\",\"short_names\":[\"heart_decoration\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":29},{\"unified\":\"1F4A0\",\"name\":\"DIAMOND SHAPE WITH A DOT INSIDE\",\"short_names\":[\"diamond_shape_with_a_dot_inside\"],\"category\":\"Symbols\",\"sheet_x\":25,\"sheet_y\":30},{\"unified\":\"1F4A1\",\"name\":\"ELECTRIC LIGHT BULB\",\"short_names\":[\"bulb\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":31},{\"unified\":\"1F4A2\",\"name\":\"ANGER SYMBOL\",\"short_names\":[\"anger\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":32},{\"unified\":\"1F4A3\",\"name\":\"BOMB\",\"short_names\":[\"bomb\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":33},{\"unified\":\"1F4A4\",\"name\":\"SLEEPING SYMBOL\",\"short_names\":[\"zzz\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":34},{\"unified\":\"1F4A5\",\"name\":\"COLLISION SYMBOL\",\"short_names\":[\"boom\",\"collision\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":35},{\"unified\":\"1F4A6\",\"name\":\"SPLASHING SWEAT SYMBOL\",\"short_names\":[\"sweat_drops\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":36},{\"unified\":\"1F4A7\",\"name\":\"DROPLET\",\"short_names\":[\"droplet\"],\"category\":\"Travel & Places\",\"sheet_x\":25,\"sheet_y\":37},{\"unified\":\"1F4A8\",\"name\":\"DASH SYMBOL\",\"short_names\":[\"dash\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":38},{\"unified\":\"1F4A9\",\"name\":\"PILE OF POO\",\"short_names\":[\"hankey\",\"poop\",\"shit\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":39},{\"unified\":\"1F4AA\",\"name\":\"FLEXED BICEPS\",\"short_names\":[\"muscle\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":40},{\"unified\":\"1F4AB\",\"name\":\"DIZZY SYMBOL\",\"short_names\":[\"dizzy\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":46},{\"unified\":\"1F4AC\",\"name\":\"SPEECH BALLOON\",\"short_names\":[\"speech_balloon\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":47},{\"unified\":\"1F4AD\",\"name\":\"THOUGHT BALLOON\",\"short_names\":[\"thought_balloon\"],\"category\":\"Smileys & People\",\"sheet_x\":25,\"sheet_y\":48},{\"unified\":\"1F4AE\",\"name\":\"WHITE FLOWER\",\"short_names\":[\"white_flower\"],\"category\":\"Animals & Nature\",\"sheet_x\":25,\"sheet_y\":49},{\"unified\":\"1F4AF\",\"name\":\"HUNDRED POINTS SYMBOL\",\"short_names\":[\"100\"],\"category\":\"Symbols\",\"sheet_x\":25,\"sheet_y\":50},{\"unified\":\"1F4B0\",\"name\":\"MONEY BAG\",\"short_names\":[\"moneybag\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":51},{\"unified\":\"1F4B1\",\"name\":\"CURRENCY EXCHANGE\",\"short_names\":[\"currency_exchange\"],\"category\":\"Objects\",\"sheet_x\":25,\"sheet_y\":52},{\"unified\":\"1F4B2\",\"name\":\"HEAVY DOLLAR SIGN\",\"short_names\":[\"heavy_dollar_sign\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":0},{\"unified\":\"1F4B3\",\"name\":\"CREDIT CARD\",\"short_names\":[\"credit_card\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":1},{\"unified\":\"1F4B4\",\"name\":\"BANKNOTE WITH YEN SIGN\",\"short_names\":[\"yen\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":2},{\"unified\":\"1F4B5\",\"name\":\"BANKNOTE WITH DOLLAR SIGN\",\"short_names\":[\"dollar\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":3},{\"unified\":\"1F4B6\",\"name\":\"BANKNOTE WITH EURO SIGN\",\"short_names\":[\"euro\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":4},{\"unified\":\"1F4B7\",\"name\":\"BANKNOTE WITH POUND SIGN\",\"short_names\":[\"pound\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":5},{\"unified\":\"1F4B8\",\"name\":\"MONEY WITH WINGS\",\"short_names\":[\"money_with_wings\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":6},{\"unified\":\"1F4B9\",\"name\":\"CHART WITH UPWARDS TREND AND YEN SIGN\",\"short_names\":[\"chart\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":7},{\"unified\":\"1F4BA\",\"name\":\"SEAT\",\"short_names\":[\"seat\"],\"category\":\"Travel & Places\",\"sheet_x\":26,\"sheet_y\":8},{\"unified\":\"1F4BB\",\"name\":\"PERSONAL COMPUTER\",\"short_names\":[\"computer\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":9},{\"unified\":\"1F4BC\",\"name\":\"BRIEFCASE\",\"short_names\":[\"briefcase\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":10},{\"unified\":\"1F4BD\",\"name\":\"MINIDISC\",\"short_names\":[\"minidisc\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":11},{\"unified\":\"1F4BE\",\"name\":\"FLOPPY DISK\",\"short_names\":[\"floppy_disk\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":12},{\"unified\":\"1F4BF\",\"name\":\"OPTICAL DISC\",\"short_names\":[\"cd\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":13},{\"unified\":\"1F4C0\",\"name\":\"DVD\",\"short_names\":[\"dvd\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":14},{\"unified\":\"1F4C1\",\"name\":\"FILE FOLDER\",\"short_names\":[\"file_folder\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":15},{\"unified\":\"1F4C2\",\"name\":\"OPEN FILE FOLDER\",\"short_names\":[\"open_file_folder\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":16},{\"unified\":\"1F4C3\",\"name\":\"PAGE WITH CURL\",\"short_names\":[\"page_with_curl\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":17},{\"unified\":\"1F4C4\",\"name\":\"PAGE FACING UP\",\"short_names\":[\"page_facing_up\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":18},{\"unified\":\"1F4C5\",\"name\":\"CALENDAR\",\"short_names\":[\"date\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":19},{\"unified\":\"1F4C6\",\"name\":\"TEAR-OFF CALENDAR\",\"short_names\":[\"calendar\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":20},{\"unified\":\"1F4C7\",\"name\":\"CARD INDEX\",\"short_names\":[\"card_index\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":21},{\"unified\":\"1F4C8\",\"name\":\"CHART WITH UPWARDS TREND\",\"short_names\":[\"chart_with_upwards_trend\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":22},{\"unified\":\"1F4C9\",\"name\":\"CHART WITH DOWNWARDS TREND\",\"short_names\":[\"chart_with_downwards_trend\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":23},{\"unified\":\"1F4CA\",\"name\":\"BAR CHART\",\"short_names\":[\"bar_chart\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":24},{\"unified\":\"1F4CB\",\"name\":\"CLIPBOARD\",\"short_names\":[\"clipboard\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":25},{\"unified\":\"1F4CC\",\"name\":\"PUSHPIN\",\"short_names\":[\"pushpin\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":26},{\"unified\":\"1F4CD\",\"name\":\"ROUND PUSHPIN\",\"short_names\":[\"round_pushpin\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":27},{\"unified\":\"1F4CE\",\"name\":\"PAPERCLIP\",\"short_names\":[\"paperclip\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":28},{\"unified\":\"1F4CF\",\"name\":\"STRAIGHT RULER\",\"short_names\":[\"straight_ruler\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":29},{\"unified\":\"1F4D0\",\"name\":\"TRIANGULAR RULER\",\"short_names\":[\"triangular_ruler\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":30},{\"unified\":\"1F4D1\",\"name\":\"BOOKMARK TABS\",\"short_names\":[\"bookmark_tabs\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":31},{\"unified\":\"1F4D2\",\"name\":\"LEDGER\",\"short_names\":[\"ledger\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":32},{\"unified\":\"1F4D3\",\"name\":\"NOTEBOOK\",\"short_names\":[\"notebook\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":33},{\"unified\":\"1F4D4\",\"name\":\"NOTEBOOK WITH DECORATIVE COVER\",\"short_names\":[\"notebook_with_decorative_cover\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":34},{\"unified\":\"1F4D5\",\"name\":\"CLOSED BOOK\",\"short_names\":[\"closed_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":35},{\"unified\":\"1F4D6\",\"name\":\"OPEN BOOK\",\"short_names\":[\"book\",\"open_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":36},{\"unified\":\"1F4D7\",\"name\":\"GREEN BOOK\",\"short_names\":[\"green_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":37},{\"unified\":\"1F4D8\",\"name\":\"BLUE BOOK\",\"short_names\":[\"blue_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":38},{\"unified\":\"1F4D9\",\"name\":\"ORANGE BOOK\",\"short_names\":[\"orange_book\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":39},{\"unified\":\"1F4DA\",\"name\":\"BOOKS\",\"short_names\":[\"books\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":40},{\"unified\":\"1F4DB\",\"name\":\"NAME BADGE\",\"short_names\":[\"name_badge\"],\"category\":\"Symbols\",\"sheet_x\":26,\"sheet_y\":41},{\"unified\":\"1F4DC\",\"name\":\"SCROLL\",\"short_names\":[\"scroll\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":42},{\"unified\":\"1F4DD\",\"name\":\"MEMO\",\"short_names\":[\"memo\",\"pencil\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":43},{\"unified\":\"1F4DE\",\"name\":\"TELEPHONE RECEIVER\",\"short_names\":[\"telephone_receiver\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":44},{\"unified\":\"1F4DF\",\"name\":\"PAGER\",\"short_names\":[\"pager\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":45},{\"unified\":\"1F4E0\",\"name\":\"FAX MACHINE\",\"short_names\":[\"fax\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":46},{\"unified\":\"1F4E1\",\"name\":\"SATELLITE ANTENNA\",\"short_names\":[\"satellite_antenna\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":47},{\"unified\":\"1F4E2\",\"name\":\"PUBLIC ADDRESS LOUDSPEAKER\",\"short_names\":[\"loudspeaker\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":48},{\"unified\":\"1F4E3\",\"name\":\"CHEERING MEGAPHONE\",\"short_names\":[\"mega\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":49},{\"unified\":\"1F4E4\",\"name\":\"OUTBOX TRAY\",\"short_names\":[\"outbox_tray\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":50},{\"unified\":\"1F4E5\",\"name\":\"INBOX TRAY\",\"short_names\":[\"inbox_tray\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":51},{\"unified\":\"1F4E6\",\"name\":\"PACKAGE\",\"short_names\":[\"package\"],\"category\":\"Objects\",\"sheet_x\":26,\"sheet_y\":52},{\"unified\":\"1F4E7\",\"name\":\"E-MAIL SYMBOL\",\"short_names\":[\"e-mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":0},{\"unified\":\"1F4E8\",\"name\":\"INCOMING ENVELOPE\",\"short_names\":[\"incoming_envelope\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":1},{\"unified\":\"1F4E9\",\"name\":\"ENVELOPE WITH DOWNWARDS ARROW ABOVE\",\"short_names\":[\"envelope_with_arrow\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":2},{\"unified\":\"1F4EA\",\"name\":\"CLOSED MAILBOX WITH LOWERED FLAG\",\"short_names\":[\"mailbox_closed\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":3},{\"unified\":\"1F4EB\",\"name\":\"CLOSED MAILBOX WITH RAISED FLAG\",\"short_names\":[\"mailbox\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":4},{\"unified\":\"1F4EC\",\"name\":\"OPEN MAILBOX WITH RAISED FLAG\",\"short_names\":[\"mailbox_with_mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":5},{\"unified\":\"1F4ED\",\"name\":\"OPEN MAILBOX WITH LOWERED FLAG\",\"short_names\":[\"mailbox_with_no_mail\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":6},{\"unified\":\"1F4EE\",\"name\":\"POSTBOX\",\"short_names\":[\"postbox\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":7},{\"unified\":\"1F4EF\",\"name\":\"POSTAL HORN\",\"short_names\":[\"postal_horn\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":8},{\"unified\":\"1F4F0\",\"name\":\"NEWSPAPER\",\"short_names\":[\"newspaper\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":9},{\"unified\":\"1F4F1\",\"name\":\"MOBILE PHONE\",\"short_names\":[\"iphone\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":10},{\"unified\":\"1F4F2\",\"name\":\"MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT\",\"short_names\":[\"calling\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":11},{\"unified\":\"1F4F3\",\"name\":\"VIBRATION MODE\",\"short_names\":[\"vibration_mode\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":12},{\"unified\":\"1F4F4\",\"name\":\"MOBILE PHONE OFF\",\"short_names\":[\"mobile_phone_off\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":13},{\"unified\":\"1F4F5\",\"name\":\"NO MOBILE PHONES\",\"short_names\":[\"no_mobile_phones\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":14},{\"unified\":\"1F4F6\",\"name\":\"ANTENNA WITH BARS\",\"short_names\":[\"signal_strength\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":15},{\"unified\":\"1F4F7\",\"name\":\"CAMERA\",\"short_names\":[\"camera\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":16},{\"unified\":\"1F4F8\",\"name\":\"CAMERA WITH FLASH\",\"short_names\":[\"camera_with_flash\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":17},{\"unified\":\"1F4F9\",\"name\":\"VIDEO CAMERA\",\"short_names\":[\"video_camera\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":18},{\"unified\":\"1F4FA\",\"name\":\"TELEVISION\",\"short_names\":[\"tv\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":19},{\"unified\":\"1F4FB\",\"name\":\"RADIO\",\"short_names\":[\"radio\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":20},{\"unified\":\"1F4FC\",\"name\":\"VIDEOCASSETTE\",\"short_names\":[\"vhs\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":21},{\"unified\":\"1F4FD-FE0F\",\"name\":null,\"short_names\":[\"film_projector\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":22},{\"unified\":\"1F4FF\",\"name\":\"PRAYER BEADS\",\"short_names\":[\"prayer_beads\"],\"category\":\"Smileys & People\",\"sheet_x\":27,\"sheet_y\":23},{\"unified\":\"1F500\",\"name\":\"TWISTED RIGHTWARDS ARROWS\",\"short_names\":[\"twisted_rightwards_arrows\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":24},{\"unified\":\"1F501\",\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"repeat\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":25},{\"unified\":\"1F502\",\"name\":\"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY\",\"short_names\":[\"repeat_one\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":26},{\"unified\":\"1F503\",\"name\":\"CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"arrows_clockwise\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":27},{\"unified\":\"1F504\",\"name\":\"ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS\",\"short_names\":[\"arrows_counterclockwise\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":28},{\"unified\":\"1F505\",\"name\":\"LOW BRIGHTNESS SYMBOL\",\"short_names\":[\"low_brightness\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":29},{\"unified\":\"1F506\",\"name\":\"HIGH BRIGHTNESS SYMBOL\",\"short_names\":[\"high_brightness\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":30},{\"unified\":\"1F507\",\"name\":\"SPEAKER WITH CANCELLATION STROKE\",\"short_names\":[\"mute\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":31},{\"unified\":\"1F508\",\"name\":\"SPEAKER\",\"short_names\":[\"speaker\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":32},{\"unified\":\"1F509\",\"name\":\"SPEAKER WITH ONE SOUND WAVE\",\"short_names\":[\"sound\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":33},{\"unified\":\"1F50A\",\"name\":\"SPEAKER WITH THREE SOUND WAVES\",\"short_names\":[\"loud_sound\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":34},{\"unified\":\"1F50B\",\"name\":\"BATTERY\",\"short_names\":[\"battery\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":35},{\"unified\":\"1F50C\",\"name\":\"ELECTRIC PLUG\",\"short_names\":[\"electric_plug\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":36},{\"unified\":\"1F50D\",\"name\":\"LEFT-POINTING MAGNIFYING GLASS\",\"short_names\":[\"mag\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":37},{\"unified\":\"1F50E\",\"name\":\"RIGHT-POINTING MAGNIFYING GLASS\",\"short_names\":[\"mag_right\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":38},{\"unified\":\"1F50F\",\"name\":\"LOCK WITH INK PEN\",\"short_names\":[\"lock_with_ink_pen\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":39},{\"unified\":\"1F510\",\"name\":\"CLOSED LOCK WITH KEY\",\"short_names\":[\"closed_lock_with_key\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":40},{\"unified\":\"1F511\",\"name\":\"KEY\",\"short_names\":[\"key\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":41},{\"unified\":\"1F512\",\"name\":\"LOCK\",\"short_names\":[\"lock\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":42},{\"unified\":\"1F513\",\"name\":\"OPEN LOCK\",\"short_names\":[\"unlock\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":43},{\"unified\":\"1F514\",\"name\":\"BELL\",\"short_names\":[\"bell\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":44},{\"unified\":\"1F515\",\"name\":\"BELL WITH CANCELLATION STROKE\",\"short_names\":[\"no_bell\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":45},{\"unified\":\"1F516\",\"name\":\"BOOKMARK\",\"short_names\":[\"bookmark\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":46},{\"unified\":\"1F517\",\"name\":\"LINK SYMBOL\",\"short_names\":[\"link\"],\"category\":\"Objects\",\"sheet_x\":27,\"sheet_y\":47},{\"unified\":\"1F518\",\"name\":\"RADIO BUTTON\",\"short_names\":[\"radio_button\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":48},{\"unified\":\"1F519\",\"name\":\"BACK WITH LEFTWARDS ARROW ABOVE\",\"short_names\":[\"back\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":49},{\"unified\":\"1F51A\",\"name\":\"END WITH LEFTWARDS ARROW ABOVE\",\"short_names\":[\"end\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":50},{\"unified\":\"1F51B\",\"name\":\"ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE\",\"short_names\":[\"on\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":51},{\"unified\":\"1F51C\",\"name\":\"SOON WITH RIGHTWARDS ARROW ABOVE\",\"short_names\":[\"soon\"],\"category\":\"Symbols\",\"sheet_x\":27,\"sheet_y\":52},{\"unified\":\"1F51D\",\"name\":\"TOP WITH UPWARDS ARROW ABOVE\",\"short_names\":[\"top\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":0},{\"unified\":\"1F51E\",\"name\":\"NO ONE UNDER EIGHTEEN SYMBOL\",\"short_names\":[\"underage\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":1},{\"unified\":\"1F51F\",\"name\":\"KEYCAP TEN\",\"short_names\":[\"keycap_ten\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":2},{\"unified\":\"1F520\",\"name\":\"INPUT SYMBOL FOR LATIN CAPITAL LETTERS\",\"short_names\":[\"capital_abcd\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":3},{\"unified\":\"1F521\",\"name\":\"INPUT SYMBOL FOR LATIN SMALL LETTERS\",\"short_names\":[\"abcd\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":4},{\"unified\":\"1F522\",\"name\":\"INPUT SYMBOL FOR NUMBERS\",\"short_names\":[\"1234\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":5},{\"unified\":\"1F523\",\"name\":\"INPUT SYMBOL FOR SYMBOLS\",\"short_names\":[\"symbols\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":6},{\"unified\":\"1F524\",\"name\":\"INPUT SYMBOL FOR LATIN LETTERS\",\"short_names\":[\"abc\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":7},{\"unified\":\"1F525\",\"name\":\"FIRE\",\"short_names\":[\"fire\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":8},{\"unified\":\"1F526\",\"name\":\"ELECTRIC TORCH\",\"short_names\":[\"flashlight\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":9},{\"unified\":\"1F527\",\"name\":\"WRENCH\",\"short_names\":[\"wrench\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":10},{\"unified\":\"1F528\",\"name\":\"HAMMER\",\"short_names\":[\"hammer\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":11},{\"unified\":\"1F529\",\"name\":\"NUT AND BOLT\",\"short_names\":[\"nut_and_bolt\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":12},{\"unified\":\"1F52A\",\"name\":\"HOCHO\",\"short_names\":[\"hocho\",\"knife\"],\"category\":\"Food & Drink\",\"sheet_x\":28,\"sheet_y\":13},{\"unified\":\"1F52B\",\"name\":\"PISTOL\",\"short_names\":[\"gun\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":14},{\"unified\":\"1F52C\",\"name\":\"MICROSCOPE\",\"short_names\":[\"microscope\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":15},{\"unified\":\"1F52D\",\"name\":\"TELESCOPE\",\"short_names\":[\"telescope\"],\"category\":\"Objects\",\"sheet_x\":28,\"sheet_y\":16},{\"unified\":\"1F52E\",\"name\":\"CRYSTAL BALL\",\"short_names\":[\"crystal_ball\"],\"category\":\"Activities\",\"sheet_x\":28,\"sheet_y\":17},{\"unified\":\"1F52F\",\"name\":\"SIX POINTED STAR WITH MIDDLE DOT\",\"short_names\":[\"six_pointed_star\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":18},{\"unified\":\"1F530\",\"name\":\"JAPANESE SYMBOL FOR BEGINNER\",\"short_names\":[\"beginner\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":19},{\"unified\":\"1F531\",\"name\":\"TRIDENT EMBLEM\",\"short_names\":[\"trident\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":20},{\"unified\":\"1F532\",\"name\":\"BLACK SQUARE BUTTON\",\"short_names\":[\"black_square_button\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":21},{\"unified\":\"1F533\",\"name\":\"WHITE SQUARE BUTTON\",\"short_names\":[\"white_square_button\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":22},{\"unified\":\"1F534\",\"name\":\"LARGE RED CIRCLE\",\"short_names\":[\"red_circle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":23},{\"unified\":\"1F535\",\"name\":\"LARGE BLUE CIRCLE\",\"short_names\":[\"large_blue_circle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":24},{\"unified\":\"1F536\",\"name\":\"LARGE ORANGE DIAMOND\",\"short_names\":[\"large_orange_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":25},{\"unified\":\"1F537\",\"name\":\"LARGE BLUE DIAMOND\",\"short_names\":[\"large_blue_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":26},{\"unified\":\"1F538\",\"name\":\"SMALL ORANGE DIAMOND\",\"short_names\":[\"small_orange_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":27},{\"unified\":\"1F539\",\"name\":\"SMALL BLUE DIAMOND\",\"short_names\":[\"small_blue_diamond\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":28},{\"unified\":\"1F53A\",\"name\":\"UP-POINTING RED TRIANGLE\",\"short_names\":[\"small_red_triangle\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":29},{\"unified\":\"1F53B\",\"name\":\"DOWN-POINTING RED TRIANGLE\",\"short_names\":[\"small_red_triangle_down\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":30},{\"unified\":\"1F53C\",\"name\":\"UP-POINTING SMALL RED TRIANGLE\",\"short_names\":[\"arrow_up_small\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":31},{\"unified\":\"1F53D\",\"name\":\"DOWN-POINTING SMALL RED TRIANGLE\",\"short_names\":[\"arrow_down_small\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":32},{\"unified\":\"1F549-FE0F\",\"name\":null,\"short_names\":[\"om_symbol\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":33},{\"unified\":\"1F54A-FE0F\",\"name\":null,\"short_names\":[\"dove_of_peace\"],\"category\":\"Animals & Nature\",\"sheet_x\":28,\"sheet_y\":34},{\"unified\":\"1F54B\",\"name\":\"KAABA\",\"short_names\":[\"kaaba\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":35},{\"unified\":\"1F54C\",\"name\":\"MOSQUE\",\"short_names\":[\"mosque\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":36},{\"unified\":\"1F54D\",\"name\":\"SYNAGOGUE\",\"short_names\":[\"synagogue\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":37},{\"unified\":\"1F54E\",\"name\":\"MENORAH WITH NINE BRANCHES\",\"short_names\":[\"menorah_with_nine_branches\"],\"category\":\"Symbols\",\"sheet_x\":28,\"sheet_y\":38},{\"unified\":\"1F550\",\"name\":\"CLOCK FACE ONE OCLOCK\",\"short_names\":[\"clock1\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":39},{\"unified\":\"1F551\",\"name\":\"CLOCK FACE TWO OCLOCK\",\"short_names\":[\"clock2\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":40},{\"unified\":\"1F552\",\"name\":\"CLOCK FACE THREE OCLOCK\",\"short_names\":[\"clock3\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":41},{\"unified\":\"1F553\",\"name\":\"CLOCK FACE FOUR OCLOCK\",\"short_names\":[\"clock4\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":42},{\"unified\":\"1F554\",\"name\":\"CLOCK FACE FIVE OCLOCK\",\"short_names\":[\"clock5\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":43},{\"unified\":\"1F555\",\"name\":\"CLOCK FACE SIX OCLOCK\",\"short_names\":[\"clock6\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":44},{\"unified\":\"1F556\",\"name\":\"CLOCK FACE SEVEN OCLOCK\",\"short_names\":[\"clock7\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":45},{\"unified\":\"1F557\",\"name\":\"CLOCK FACE EIGHT OCLOCK\",\"short_names\":[\"clock8\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":46},{\"unified\":\"1F558\",\"name\":\"CLOCK FACE NINE OCLOCK\",\"short_names\":[\"clock9\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":47},{\"unified\":\"1F559\",\"name\":\"CLOCK FACE TEN OCLOCK\",\"short_names\":[\"clock10\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":48},{\"unified\":\"1F55A\",\"name\":\"CLOCK FACE ELEVEN OCLOCK\",\"short_names\":[\"clock11\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":49},{\"unified\":\"1F55B\",\"name\":\"CLOCK FACE TWELVE OCLOCK\",\"short_names\":[\"clock12\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":50},{\"unified\":\"1F55C\",\"name\":\"CLOCK FACE ONE-THIRTY\",\"short_names\":[\"clock130\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":51},{\"unified\":\"1F55D\",\"name\":\"CLOCK FACE TWO-THIRTY\",\"short_names\":[\"clock230\"],\"category\":\"Travel & Places\",\"sheet_x\":28,\"sheet_y\":52},{\"unified\":\"1F55E\",\"name\":\"CLOCK FACE THREE-THIRTY\",\"short_names\":[\"clock330\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":0},{\"unified\":\"1F55F\",\"name\":\"CLOCK FACE FOUR-THIRTY\",\"short_names\":[\"clock430\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":1},{\"unified\":\"1F560\",\"name\":\"CLOCK FACE FIVE-THIRTY\",\"short_names\":[\"clock530\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":2},{\"unified\":\"1F561\",\"name\":\"CLOCK FACE SIX-THIRTY\",\"short_names\":[\"clock630\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":3},{\"unified\":\"1F562\",\"name\":\"CLOCK FACE SEVEN-THIRTY\",\"short_names\":[\"clock730\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":4},{\"unified\":\"1F563\",\"name\":\"CLOCK FACE EIGHT-THIRTY\",\"short_names\":[\"clock830\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":5},{\"unified\":\"1F564\",\"name\":\"CLOCK FACE NINE-THIRTY\",\"short_names\":[\"clock930\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":6},{\"unified\":\"1F565\",\"name\":\"CLOCK FACE TEN-THIRTY\",\"short_names\":[\"clock1030\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":7},{\"unified\":\"1F566\",\"name\":\"CLOCK FACE ELEVEN-THIRTY\",\"short_names\":[\"clock1130\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":8},{\"unified\":\"1F567\",\"name\":\"CLOCK FACE TWELVE-THIRTY\",\"short_names\":[\"clock1230\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":9},{\"unified\":\"1F56F-FE0F\",\"name\":null,\"short_names\":[\"candle\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":10},{\"unified\":\"1F570-FE0F\",\"name\":null,\"short_names\":[\"mantelpiece_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":29,\"sheet_y\":11},{\"unified\":\"1F573-FE0F\",\"name\":null,\"short_names\":[\"hole\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":12},{\"unified\":\"1F574-FE0F\",\"name\":null,\"short_names\":[\"man_in_business_suit_levitating\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":13},{\"unified\":\"1F575-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female-detective\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":19},{\"unified\":\"1F575-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male-detective\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":25},{\"unified\":\"1F575-FE0F\",\"name\":null,\"short_names\":[\"sleuth_or_spy\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":31},{\"unified\":\"1F576-FE0F\",\"name\":null,\"short_names\":[\"dark_sunglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":37},{\"unified\":\"1F577-FE0F\",\"name\":null,\"short_names\":[\"spider\"],\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":38},{\"unified\":\"1F578-FE0F\",\"name\":null,\"short_names\":[\"spider_web\"],\"category\":\"Animals & Nature\",\"sheet_x\":29,\"sheet_y\":39},{\"unified\":\"1F579-FE0F\",\"name\":null,\"short_names\":[\"joystick\"],\"category\":\"Activities\",\"sheet_x\":29,\"sheet_y\":40},{\"unified\":\"1F57A\",\"name\":\"MAN DANCING\",\"short_names\":[\"man_dancing\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":41},{\"unified\":\"1F587-FE0F\",\"name\":null,\"short_names\":[\"linked_paperclips\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":47},{\"unified\":\"1F58A-FE0F\",\"name\":null,\"short_names\":[\"lower_left_ballpoint_pen\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":48},{\"unified\":\"1F58B-FE0F\",\"name\":null,\"short_names\":[\"lower_left_fountain_pen\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":49},{\"unified\":\"1F58C-FE0F\",\"name\":null,\"short_names\":[\"lower_left_paintbrush\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":50},{\"unified\":\"1F58D-FE0F\",\"name\":null,\"short_names\":[\"lower_left_crayon\"],\"category\":\"Objects\",\"sheet_x\":29,\"sheet_y\":51},{\"unified\":\"1F590-FE0F\",\"name\":null,\"short_names\":[\"raised_hand_with_fingers_splayed\"],\"category\":\"Smileys & People\",\"sheet_x\":29,\"sheet_y\":52},{\"unified\":\"1F595\",\"name\":\"REVERSED HAND WITH MIDDLE FINGER EXTENDED\",\"short_names\":[\"middle_finger\",\"reversed_hand_with_middle_finger_extended\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":5},{\"unified\":\"1F596\",\"name\":\"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS\",\"short_names\":[\"spock-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":11},{\"unified\":\"1F5A4\",\"name\":\"BLACK HEART\",\"short_names\":[\"black_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":17},{\"unified\":\"1F5A5-FE0F\",\"name\":null,\"short_names\":[\"desktop_computer\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":18},{\"unified\":\"1F5A8-FE0F\",\"name\":null,\"short_names\":[\"printer\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":19},{\"unified\":\"1F5B1-FE0F\",\"name\":null,\"short_names\":[\"three_button_mouse\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":20},{\"unified\":\"1F5B2-FE0F\",\"name\":null,\"short_names\":[\"trackball\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":21},{\"unified\":\"1F5BC-FE0F\",\"name\":null,\"short_names\":[\"frame_with_picture\"],\"category\":\"Activities\",\"sheet_x\":30,\"sheet_y\":22},{\"unified\":\"1F5C2-FE0F\",\"name\":null,\"short_names\":[\"card_index_dividers\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":23},{\"unified\":\"1F5C3-FE0F\",\"name\":null,\"short_names\":[\"card_file_box\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":24},{\"unified\":\"1F5C4-FE0F\",\"name\":null,\"short_names\":[\"file_cabinet\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":25},{\"unified\":\"1F5D1-FE0F\",\"name\":null,\"short_names\":[\"wastebasket\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":26},{\"unified\":\"1F5D2-FE0F\",\"name\":null,\"short_names\":[\"spiral_note_pad\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":27},{\"unified\":\"1F5D3-FE0F\",\"name\":null,\"short_names\":[\"spiral_calendar_pad\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":28},{\"unified\":\"1F5DC-FE0F\",\"name\":null,\"short_names\":[\"compression\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":29},{\"unified\":\"1F5DD-FE0F\",\"name\":null,\"short_names\":[\"old_key\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":30},{\"unified\":\"1F5DE-FE0F\",\"name\":null,\"short_names\":[\"rolled_up_newspaper\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":31},{\"unified\":\"1F5E1-FE0F\",\"name\":null,\"short_names\":[\"dagger_knife\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":32},{\"unified\":\"1F5E3-FE0F\",\"name\":null,\"short_names\":[\"speaking_head_in_silhouette\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":33},{\"unified\":\"1F5E8-FE0F\",\"name\":null,\"short_names\":[\"left_speech_bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":34},{\"unified\":\"1F5EF-FE0F\",\"name\":null,\"short_names\":[\"right_anger_bubble\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":35},{\"unified\":\"1F5F3-FE0F\",\"name\":null,\"short_names\":[\"ballot_box_with_ballot\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":36},{\"unified\":\"1F5FA-FE0F\",\"name\":null,\"short_names\":[\"world_map\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":37},{\"unified\":\"1F5FB\",\"name\":\"MOUNT FUJI\",\"short_names\":[\"mount_fuji\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":38},{\"unified\":\"1F5FC\",\"name\":\"TOKYO TOWER\",\"short_names\":[\"tokyo_tower\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":39},{\"unified\":\"1F5FD\",\"name\":\"STATUE OF LIBERTY\",\"short_names\":[\"statue_of_liberty\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":40},{\"unified\":\"1F5FE\",\"name\":\"SILHOUETTE OF JAPAN\",\"short_names\":[\"japan\"],\"category\":\"Travel & Places\",\"sheet_x\":30,\"sheet_y\":41},{\"unified\":\"1F5FF\",\"name\":\"MOYAI\",\"short_names\":[\"moyai\"],\"category\":\"Objects\",\"sheet_x\":30,\"sheet_y\":42},{\"unified\":\"1F600\",\"name\":\"GRINNING FACE\",\"short_names\":[\"grinning\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":43},{\"unified\":\"1F601\",\"name\":\"GRINNING FACE WITH SMILING EYES\",\"short_names\":[\"grin\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":44},{\"unified\":\"1F602\",\"name\":\"FACE WITH TEARS OF JOY\",\"short_names\":[\"joy\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":45},{\"unified\":\"1F603\",\"name\":\"SMILING FACE WITH OPEN MOUTH\",\"short_names\":[\"smiley\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":46},{\"unified\":\"1F604\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND SMILING EYES\",\"short_names\":[\"smile\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":47},{\"unified\":\"1F605\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT\",\"short_names\":[\"sweat_smile\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":48},{\"unified\":\"1F606\",\"name\":\"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES\",\"short_names\":[\"laughing\",\"satisfied\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":49},{\"unified\":\"1F607\",\"name\":\"SMILING FACE WITH HALO\",\"short_names\":[\"innocent\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":50},{\"unified\":\"1F608\",\"name\":\"SMILING FACE WITH HORNS\",\"short_names\":[\"smiling_imp\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":51},{\"unified\":\"1F609\",\"name\":\"WINKING FACE\",\"short_names\":[\"wink\"],\"category\":\"Smileys & People\",\"sheet_x\":30,\"sheet_y\":52},{\"unified\":\"1F60A\",\"name\":\"SMILING FACE WITH SMILING EYES\",\"short_names\":[\"blush\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":0},{\"unified\":\"1F60B\",\"name\":\"FACE SAVOURING DELICIOUS FOOD\",\"short_names\":[\"yum\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":1},{\"unified\":\"1F60C\",\"name\":\"RELIEVED FACE\",\"short_names\":[\"relieved\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":2},{\"unified\":\"1F60D\",\"name\":\"SMILING FACE WITH HEART-SHAPED EYES\",\"short_names\":[\"heart_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":3},{\"unified\":\"1F60E\",\"name\":\"SMILING FACE WITH SUNGLASSES\",\"short_names\":[\"sunglasses\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":4},{\"unified\":\"1F60F\",\"name\":\"SMIRKING FACE\",\"short_names\":[\"smirk\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":5},{\"unified\":\"1F610\",\"name\":\"NEUTRAL FACE\",\"short_names\":[\"neutral_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":6},{\"unified\":\"1F611\",\"name\":\"EXPRESSIONLESS FACE\",\"short_names\":[\"expressionless\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":7},{\"unified\":\"1F612\",\"name\":\"UNAMUSED FACE\",\"short_names\":[\"unamused\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":8},{\"unified\":\"1F613\",\"name\":\"FACE WITH COLD SWEAT\",\"short_names\":[\"sweat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":9},{\"unified\":\"1F614\",\"name\":\"PENSIVE FACE\",\"short_names\":[\"pensive\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":10},{\"unified\":\"1F615\",\"name\":\"CONFUSED FACE\",\"short_names\":[\"confused\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":11},{\"unified\":\"1F616\",\"name\":\"CONFOUNDED FACE\",\"short_names\":[\"confounded\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":12},{\"unified\":\"1F617\",\"name\":\"KISSING FACE\",\"short_names\":[\"kissing\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":13},{\"unified\":\"1F618\",\"name\":\"FACE THROWING A KISS\",\"short_names\":[\"kissing_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":14},{\"unified\":\"1F619\",\"name\":\"KISSING FACE WITH SMILING EYES\",\"short_names\":[\"kissing_smiling_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":15},{\"unified\":\"1F61A\",\"name\":\"KISSING FACE WITH CLOSED EYES\",\"short_names\":[\"kissing_closed_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":16},{\"unified\":\"1F61B\",\"name\":\"FACE WITH STUCK-OUT TONGUE\",\"short_names\":[\"stuck_out_tongue\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":17},{\"unified\":\"1F61C\",\"name\":\"FACE WITH STUCK-OUT TONGUE AND WINKING EYE\",\"short_names\":[\"stuck_out_tongue_winking_eye\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":18},{\"unified\":\"1F61D\",\"name\":\"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES\",\"short_names\":[\"stuck_out_tongue_closed_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":19},{\"unified\":\"1F61E\",\"name\":\"DISAPPOINTED FACE\",\"short_names\":[\"disappointed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":20},{\"unified\":\"1F61F\",\"name\":\"WORRIED FACE\",\"short_names\":[\"worried\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":21},{\"unified\":\"1F620\",\"name\":\"ANGRY FACE\",\"short_names\":[\"angry\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":22},{\"unified\":\"1F621\",\"name\":\"POUTING FACE\",\"short_names\":[\"rage\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":23},{\"unified\":\"1F622\",\"name\":\"CRYING FACE\",\"short_names\":[\"cry\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":24},{\"unified\":\"1F623\",\"name\":\"PERSEVERING FACE\",\"short_names\":[\"persevere\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":25},{\"unified\":\"1F624\",\"name\":\"FACE WITH LOOK OF TRIUMPH\",\"short_names\":[\"triumph\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":26},{\"unified\":\"1F625\",\"name\":\"DISAPPOINTED BUT RELIEVED FACE\",\"short_names\":[\"disappointed_relieved\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":27},{\"unified\":\"1F626\",\"name\":\"FROWNING FACE WITH OPEN MOUTH\",\"short_names\":[\"frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":28},{\"unified\":\"1F627\",\"name\":\"ANGUISHED FACE\",\"short_names\":[\"anguished\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":29},{\"unified\":\"1F628\",\"name\":\"FEARFUL FACE\",\"short_names\":[\"fearful\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":30},{\"unified\":\"1F629\",\"name\":\"WEARY FACE\",\"short_names\":[\"weary\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":31},{\"unified\":\"1F62A\",\"name\":\"SLEEPY FACE\",\"short_names\":[\"sleepy\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":32},{\"unified\":\"1F62B\",\"name\":\"TIRED FACE\",\"short_names\":[\"tired_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":33},{\"unified\":\"1F62C\",\"name\":\"GRIMACING FACE\",\"short_names\":[\"grimacing\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":34},{\"unified\":\"1F62D\",\"name\":\"LOUDLY CRYING FACE\",\"short_names\":[\"sob\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":35},{\"unified\":\"1F62E\",\"name\":\"FACE WITH OPEN MOUTH\",\"short_names\":[\"open_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":36},{\"unified\":\"1F62F\",\"name\":\"HUSHED FACE\",\"short_names\":[\"hushed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":37},{\"unified\":\"1F630\",\"name\":\"FACE WITH OPEN MOUTH AND COLD SWEAT\",\"short_names\":[\"cold_sweat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":38},{\"unified\":\"1F631\",\"name\":\"FACE SCREAMING IN FEAR\",\"short_names\":[\"scream\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":39},{\"unified\":\"1F632\",\"name\":\"ASTONISHED FACE\",\"short_names\":[\"astonished\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":40},{\"unified\":\"1F633\",\"name\":\"FLUSHED FACE\",\"short_names\":[\"flushed\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":41},{\"unified\":\"1F634\",\"name\":\"SLEEPING FACE\",\"short_names\":[\"sleeping\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":42},{\"unified\":\"1F635\",\"name\":\"DIZZY FACE\",\"short_names\":[\"dizzy_face\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":43},{\"unified\":\"1F636\",\"name\":\"FACE WITHOUT MOUTH\",\"short_names\":[\"no_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":44},{\"unified\":\"1F637\",\"name\":\"FACE WITH MEDICAL MASK\",\"short_names\":[\"mask\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":45},{\"unified\":\"1F638\",\"name\":\"GRINNING CAT FACE WITH SMILING EYES\",\"short_names\":[\"smile_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":46},{\"unified\":\"1F639\",\"name\":\"CAT FACE WITH TEARS OF JOY\",\"short_names\":[\"joy_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":47},{\"unified\":\"1F63A\",\"name\":\"SMILING CAT FACE WITH OPEN MOUTH\",\"short_names\":[\"smiley_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":48},{\"unified\":\"1F63B\",\"name\":\"SMILING CAT FACE WITH HEART-SHAPED EYES\",\"short_names\":[\"heart_eyes_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":49},{\"unified\":\"1F63C\",\"name\":\"CAT FACE WITH WRY SMILE\",\"short_names\":[\"smirk_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":50},{\"unified\":\"1F63D\",\"name\":\"KISSING CAT FACE WITH CLOSED EYES\",\"short_names\":[\"kissing_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":51},{\"unified\":\"1F63E\",\"name\":\"POUTING CAT FACE\",\"short_names\":[\"pouting_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":31,\"sheet_y\":52},{\"unified\":\"1F63F\",\"name\":\"CRYING CAT FACE\",\"short_names\":[\"crying_cat_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":0},{\"unified\":\"1F640\",\"name\":\"WEARY CAT FACE\",\"short_names\":[\"scream_cat\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":1},{\"unified\":\"1F641\",\"name\":\"SLIGHTLY FROWNING FACE\",\"short_names\":[\"slightly_frowning_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":2},{\"unified\":\"1F642\",\"name\":\"SLIGHTLY SMILING FACE\",\"short_names\":[\"slightly_smiling_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":3},{\"unified\":\"1F643\",\"name\":\"UPSIDE-DOWN FACE\",\"short_names\":[\"upside_down_face\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":4},{\"unified\":\"1F644\",\"name\":\"FACE WITH ROLLING EYES\",\"short_names\":[\"face_with_rolling_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":5},{\"unified\":\"1F645-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-gesturing-no\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":6},{\"unified\":\"1F645-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-gesturing-no\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":12},{\"unified\":\"1F645\",\"name\":\"FACE WITH NO GOOD GESTURE\",\"short_names\":[\"no_good\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":18},{\"unified\":\"1F646-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-gesturing-ok\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":24},{\"unified\":\"1F646-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-gesturing-ok\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":30},{\"unified\":\"1F646\",\"name\":\"FACE WITH OK GESTURE\",\"short_names\":[\"ok_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":36},{\"unified\":\"1F647-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-bowing\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":42},{\"unified\":\"1F647-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-bowing\"],\"category\":\"Smileys & People\",\"sheet_x\":32,\"sheet_y\":48},{\"unified\":\"1F647\",\"name\":\"PERSON BOWING DEEPLY\",\"short_names\":[\"bow\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":1},{\"unified\":\"1F648\",\"name\":\"SEE-NO-EVIL MONKEY\",\"short_names\":[\"see_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":7},{\"unified\":\"1F649\",\"name\":\"HEAR-NO-EVIL MONKEY\",\"short_names\":[\"hear_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":8},{\"unified\":\"1F64A\",\"name\":\"SPEAK-NO-EVIL MONKEY\",\"short_names\":[\"speak_no_evil\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":9},{\"unified\":\"1F64B-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-raising-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":10},{\"unified\":\"1F64B-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-raising-hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":16},{\"unified\":\"1F64B\",\"name\":\"HAPPY PERSON RAISING ONE HAND\",\"short_names\":[\"raising_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":22},{\"unified\":\"1F64C\",\"name\":\"PERSON RAISING BOTH HANDS IN CELEBRATION\",\"short_names\":[\"raised_hands\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":28},{\"unified\":\"1F64D-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":34},{\"unified\":\"1F64D-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":40},{\"unified\":\"1F64D\",\"name\":\"PERSON FROWNING\",\"short_names\":[\"person_frowning\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":46},{\"unified\":\"1F64E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-pouting\"],\"category\":\"Smileys & People\",\"sheet_x\":33,\"sheet_y\":52},{\"unified\":\"1F64E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-pouting\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":5},{\"unified\":\"1F64E\",\"name\":\"PERSON WITH POUTING FACE\",\"short_names\":[\"person_with_pouting_face\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":11},{\"unified\":\"1F64F\",\"name\":\"PERSON WITH FOLDED HANDS\",\"short_names\":[\"pray\"],\"category\":\"Smileys & People\",\"sheet_x\":34,\"sheet_y\":17},{\"unified\":\"1F680\",\"name\":\"ROCKET\",\"short_names\":[\"rocket\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":23},{\"unified\":\"1F681\",\"name\":\"HELICOPTER\",\"short_names\":[\"helicopter\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":24},{\"unified\":\"1F682\",\"name\":\"STEAM LOCOMOTIVE\",\"short_names\":[\"steam_locomotive\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":25},{\"unified\":\"1F683\",\"name\":\"RAILWAY CAR\",\"short_names\":[\"railway_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":26},{\"unified\":\"1F684\",\"name\":\"HIGH-SPEED TRAIN\",\"short_names\":[\"bullettrain_side\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":27},{\"unified\":\"1F685\",\"name\":\"HIGH-SPEED TRAIN WITH BULLET NOSE\",\"short_names\":[\"bullettrain_front\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":28},{\"unified\":\"1F686\",\"name\":\"TRAIN\",\"short_names\":[\"train2\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":29},{\"unified\":\"1F687\",\"name\":\"METRO\",\"short_names\":[\"metro\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":30},{\"unified\":\"1F688\",\"name\":\"LIGHT RAIL\",\"short_names\":[\"light_rail\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":31},{\"unified\":\"1F689\",\"name\":\"STATION\",\"short_names\":[\"station\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":32},{\"unified\":\"1F68A\",\"name\":\"TRAM\",\"short_names\":[\"tram\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":33},{\"unified\":\"1F68B\",\"name\":\"TRAM CAR\",\"short_names\":[\"train\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":34},{\"unified\":\"1F68C\",\"name\":\"BUS\",\"short_names\":[\"bus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":35},{\"unified\":\"1F68D\",\"name\":\"ONCOMING BUS\",\"short_names\":[\"oncoming_bus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":36},{\"unified\":\"1F68E\",\"name\":\"TROLLEYBUS\",\"short_names\":[\"trolleybus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":37},{\"unified\":\"1F68F\",\"name\":\"BUS STOP\",\"short_names\":[\"busstop\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":38},{\"unified\":\"1F690\",\"name\":\"MINIBUS\",\"short_names\":[\"minibus\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":39},{\"unified\":\"1F691\",\"name\":\"AMBULANCE\",\"short_names\":[\"ambulance\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":40},{\"unified\":\"1F692\",\"name\":\"FIRE ENGINE\",\"short_names\":[\"fire_engine\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":41},{\"unified\":\"1F693\",\"name\":\"POLICE CAR\",\"short_names\":[\"police_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":42},{\"unified\":\"1F694\",\"name\":\"ONCOMING POLICE CAR\",\"short_names\":[\"oncoming_police_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":43},{\"unified\":\"1F695\",\"name\":\"TAXI\",\"short_names\":[\"taxi\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":44},{\"unified\":\"1F696\",\"name\":\"ONCOMING TAXI\",\"short_names\":[\"oncoming_taxi\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":45},{\"unified\":\"1F697\",\"name\":\"AUTOMOBILE\",\"short_names\":[\"car\",\"red_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":46},{\"unified\":\"1F698\",\"name\":\"ONCOMING AUTOMOBILE\",\"short_names\":[\"oncoming_automobile\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":47},{\"unified\":\"1F699\",\"name\":\"RECREATIONAL VEHICLE\",\"short_names\":[\"blue_car\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":48},{\"unified\":\"1F69A\",\"name\":\"DELIVERY TRUCK\",\"short_names\":[\"truck\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":49},{\"unified\":\"1F69B\",\"name\":\"ARTICULATED LORRY\",\"short_names\":[\"articulated_lorry\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":50},{\"unified\":\"1F69C\",\"name\":\"TRACTOR\",\"short_names\":[\"tractor\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":51},{\"unified\":\"1F69D\",\"name\":\"MONORAIL\",\"short_names\":[\"monorail\"],\"category\":\"Travel & Places\",\"sheet_x\":34,\"sheet_y\":52},{\"unified\":\"1F69E\",\"name\":\"MOUNTAIN RAILWAY\",\"short_names\":[\"mountain_railway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":0},{\"unified\":\"1F69F\",\"name\":\"SUSPENSION RAILWAY\",\"short_names\":[\"suspension_railway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":1},{\"unified\":\"1F6A0\",\"name\":\"MOUNTAIN CABLEWAY\",\"short_names\":[\"mountain_cableway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":2},{\"unified\":\"1F6A1\",\"name\":\"AERIAL TRAMWAY\",\"short_names\":[\"aerial_tramway\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":3},{\"unified\":\"1F6A2\",\"name\":\"SHIP\",\"short_names\":[\"ship\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":4},{\"unified\":\"1F6A3-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-rowing-boat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":5},{\"unified\":\"1F6A3-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-rowing-boat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":11},{\"unified\":\"1F6A3\",\"name\":\"ROWBOAT\",\"short_names\":[\"rowboat\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":17},{\"unified\":\"1F6A4\",\"name\":\"SPEEDBOAT\",\"short_names\":[\"speedboat\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":23},{\"unified\":\"1F6A5\",\"name\":\"HORIZONTAL TRAFFIC LIGHT\",\"short_names\":[\"traffic_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":24},{\"unified\":\"1F6A6\",\"name\":\"VERTICAL TRAFFIC LIGHT\",\"short_names\":[\"vertical_traffic_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":25},{\"unified\":\"1F6A7\",\"name\":\"CONSTRUCTION SIGN\",\"short_names\":[\"construction\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":26},{\"unified\":\"1F6A8\",\"name\":\"POLICE CARS REVOLVING LIGHT\",\"short_names\":[\"rotating_light\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":27},{\"unified\":\"1F6A9\",\"name\":\"TRIANGULAR FLAG ON POST\",\"short_names\":[\"triangular_flag_on_post\"],\"category\":\"Flags\",\"sheet_x\":35,\"sheet_y\":28},{\"unified\":\"1F6AA\",\"name\":\"DOOR\",\"short_names\":[\"door\"],\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":29},{\"unified\":\"1F6AB\",\"name\":\"NO ENTRY SIGN\",\"short_names\":[\"no_entry_sign\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":30},{\"unified\":\"1F6AC\",\"name\":\"SMOKING SYMBOL\",\"short_names\":[\"smoking\"],\"category\":\"Objects\",\"sheet_x\":35,\"sheet_y\":31},{\"unified\":\"1F6AD\",\"name\":\"NO SMOKING SYMBOL\",\"short_names\":[\"no_smoking\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":32},{\"unified\":\"1F6AE\",\"name\":\"PUT LITTER IN ITS PLACE SYMBOL\",\"short_names\":[\"put_litter_in_its_place\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":33},{\"unified\":\"1F6AF\",\"name\":\"DO NOT LITTER SYMBOL\",\"short_names\":[\"do_not_litter\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":34},{\"unified\":\"1F6B0\",\"name\":\"POTABLE WATER SYMBOL\",\"short_names\":[\"potable_water\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":35},{\"unified\":\"1F6B1\",\"name\":\"NON-POTABLE WATER SYMBOL\",\"short_names\":[\"non-potable_water\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":36},{\"unified\":\"1F6B2\",\"name\":\"BICYCLE\",\"short_names\":[\"bike\"],\"category\":\"Travel & Places\",\"sheet_x\":35,\"sheet_y\":37},{\"unified\":\"1F6B3\",\"name\":\"NO BICYCLES\",\"short_names\":[\"no_bicycles\"],\"category\":\"Symbols\",\"sheet_x\":35,\"sheet_y\":38},{\"unified\":\"1F6B4-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":39},{\"unified\":\"1F6B4-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":45},{\"unified\":\"1F6B4\",\"name\":\"BICYCLIST\",\"short_names\":[\"bicyclist\"],\"category\":\"Smileys & People\",\"sheet_x\":35,\"sheet_y\":51},{\"unified\":\"1F6B5-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-mountain-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":4},{\"unified\":\"1F6B5-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-mountain-biking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":10},{\"unified\":\"1F6B5\",\"name\":\"MOUNTAIN BICYCLIST\",\"short_names\":[\"mountain_bicyclist\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":16},{\"unified\":\"1F6B6-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":22},{\"unified\":\"1F6B6-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":28},{\"unified\":\"1F6B6\",\"name\":\"PEDESTRIAN\",\"short_names\":[\"walking\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":34},{\"unified\":\"1F6B7\",\"name\":\"NO PEDESTRIANS\",\"short_names\":[\"no_pedestrians\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":40},{\"unified\":\"1F6B8\",\"name\":\"CHILDREN CROSSING\",\"short_names\":[\"children_crossing\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":41},{\"unified\":\"1F6B9\",\"name\":\"MENS SYMBOL\",\"short_names\":[\"mens\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":42},{\"unified\":\"1F6BA\",\"name\":\"WOMENS SYMBOL\",\"short_names\":[\"womens\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":43},{\"unified\":\"1F6BB\",\"name\":\"RESTROOM\",\"short_names\":[\"restroom\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":44},{\"unified\":\"1F6BC\",\"name\":\"BABY SYMBOL\",\"short_names\":[\"baby_symbol\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":45},{\"unified\":\"1F6BD\",\"name\":\"TOILET\",\"short_names\":[\"toilet\"],\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":46},{\"unified\":\"1F6BE\",\"name\":\"WATER CLOSET\",\"short_names\":[\"wc\"],\"category\":\"Symbols\",\"sheet_x\":36,\"sheet_y\":47},{\"unified\":\"1F6BF\",\"name\":\"SHOWER\",\"short_names\":[\"shower\"],\"category\":\"Objects\",\"sheet_x\":36,\"sheet_y\":48},{\"unified\":\"1F6C0\",\"name\":\"BATH\",\"short_names\":[\"bath\"],\"category\":\"Smileys & People\",\"sheet_x\":36,\"sheet_y\":49},{\"unified\":\"1F6C1\",\"name\":\"BATHTUB\",\"short_names\":[\"bathtub\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":2},{\"unified\":\"1F6C2\",\"name\":\"PASSPORT CONTROL\",\"short_names\":[\"passport_control\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":3},{\"unified\":\"1F6C3\",\"name\":\"CUSTOMS\",\"short_names\":[\"customs\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":4},{\"unified\":\"1F6C4\",\"name\":\"BAGGAGE CLAIM\",\"short_names\":[\"baggage_claim\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":5},{\"unified\":\"1F6C5\",\"name\":\"LEFT LUGGAGE\",\"short_names\":[\"left_luggage\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":6},{\"unified\":\"1F6CB-FE0F\",\"name\":null,\"short_names\":[\"couch_and_lamp\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":7},{\"unified\":\"1F6CC\",\"name\":\"SLEEPING ACCOMMODATION\",\"short_names\":[\"sleeping_accommodation\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":8},{\"unified\":\"1F6CD-FE0F\",\"name\":null,\"short_names\":[\"shopping_bags\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":14},{\"unified\":\"1F6CE-FE0F\",\"name\":null,\"short_names\":[\"bellhop_bell\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":15},{\"unified\":\"1F6CF-FE0F\",\"name\":null,\"short_names\":[\"bed\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":16},{\"unified\":\"1F6D0\",\"name\":\"PLACE OF WORSHIP\",\"short_names\":[\"place_of_worship\"],\"category\":\"Symbols\",\"sheet_x\":37,\"sheet_y\":17},{\"unified\":\"1F6D1\",\"name\":\"OCTAGONAL SIGN\",\"short_names\":[\"octagonal_sign\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":18},{\"unified\":\"1F6D2\",\"name\":\"SHOPPING TROLLEY\",\"short_names\":[\"shopping_trolley\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":19},{\"unified\":\"1F6E0-FE0F\",\"name\":null,\"short_names\":[\"hammer_and_wrench\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":20},{\"unified\":\"1F6E1-FE0F\",\"name\":null,\"short_names\":[\"shield\"],\"category\":\"Objects\",\"sheet_x\":37,\"sheet_y\":21},{\"unified\":\"1F6E2-FE0F\",\"name\":null,\"short_names\":[\"oil_drum\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":22},{\"unified\":\"1F6E3-FE0F\",\"name\":null,\"short_names\":[\"motorway\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":23},{\"unified\":\"1F6E4-FE0F\",\"name\":null,\"short_names\":[\"railway_track\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":24},{\"unified\":\"1F6E5-FE0F\",\"name\":null,\"short_names\":[\"motor_boat\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":25},{\"unified\":\"1F6E9-FE0F\",\"name\":null,\"short_names\":[\"small_airplane\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":26},{\"unified\":\"1F6EB\",\"name\":\"AIRPLANE DEPARTURE\",\"short_names\":[\"airplane_departure\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":27},{\"unified\":\"1F6EC\",\"name\":\"AIRPLANE ARRIVING\",\"short_names\":[\"airplane_arriving\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":28},{\"unified\":\"1F6F0-FE0F\",\"name\":null,\"short_names\":[\"satellite\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":29},{\"unified\":\"1F6F3-FE0F\",\"name\":null,\"short_names\":[\"passenger_ship\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":30},{\"unified\":\"1F6F4\",\"name\":\"SCOOTER\",\"short_names\":[\"scooter\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":31},{\"unified\":\"1F6F5\",\"name\":\"MOTOR SCOOTER\",\"short_names\":[\"motor_scooter\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":32},{\"unified\":\"1F6F6\",\"name\":\"CANOE\",\"short_names\":[\"canoe\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":33},{\"unified\":\"1F6F7\",\"name\":\"SLED\",\"short_names\":[\"sled\"],\"category\":\"Activities\",\"sheet_x\":37,\"sheet_y\":34},{\"unified\":\"1F6F8\",\"name\":\"FLYING SAUCER\",\"short_names\":[\"flying_saucer\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":35},{\"unified\":\"1F6F9\",\"name\":\"SKATEBOARD\",\"short_names\":[\"skateboard\"],\"category\":\"Travel & Places\",\"sheet_x\":37,\"sheet_y\":36},{\"unified\":\"1F910\",\"name\":\"ZIPPER-MOUTH FACE\",\"short_names\":[\"zipper_mouth_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":37},{\"unified\":\"1F911\",\"name\":\"MONEY-MOUTH FACE\",\"short_names\":[\"money_mouth_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":38},{\"unified\":\"1F912\",\"name\":\"FACE WITH THERMOMETER\",\"short_names\":[\"face_with_thermometer\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":39},{\"unified\":\"1F913\",\"name\":\"NERD FACE\",\"short_names\":[\"nerd_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":40},{\"unified\":\"1F914\",\"name\":\"THINKING FACE\",\"short_names\":[\"thinking_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":41},{\"unified\":\"1F915\",\"name\":\"FACE WITH HEAD-BANDAGE\",\"short_names\":[\"face_with_head_bandage\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":42},{\"unified\":\"1F916\",\"name\":\"ROBOT FACE\",\"short_names\":[\"robot_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":43},{\"unified\":\"1F917\",\"name\":\"HUGGING FACE\",\"short_names\":[\"hugging_face\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":44},{\"unified\":\"1F918\",\"name\":\"SIGN OF THE HORNS\",\"short_names\":[\"the_horns\",\"sign_of_the_horns\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":45},{\"unified\":\"1F919\",\"name\":\"CALL ME HAND\",\"short_names\":[\"call_me_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":37,\"sheet_y\":51},{\"unified\":\"1F91A\",\"name\":\"RAISED BACK OF HAND\",\"short_names\":[\"raised_back_of_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":4},{\"unified\":\"1F91B\",\"name\":\"LEFT-FACING FIST\",\"short_names\":[\"left-facing_fist\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":10},{\"unified\":\"1F91C\",\"name\":\"RIGHT-FACING FIST\",\"short_names\":[\"right-facing_fist\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":16},{\"unified\":\"1F91D\",\"name\":\"HANDSHAKE\",\"short_names\":[\"handshake\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":22},{\"unified\":\"1F91E\",\"name\":\"HAND WITH INDEX AND MIDDLE FINGERS CROSSED\",\"short_names\":[\"crossed_fingers\",\"hand_with_index_and_middle_fingers_crossed\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":23},{\"unified\":\"1F91F\",\"name\":\"I LOVE YOU HAND SIGN\",\"short_names\":[\"i_love_you_hand_sign\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":29},{\"unified\":\"1F920\",\"name\":\"FACE WITH COWBOY HAT\",\"short_names\":[\"face_with_cowboy_hat\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":35},{\"unified\":\"1F921\",\"name\":\"CLOWN FACE\",\"short_names\":[\"clown_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":36},{\"unified\":\"1F922\",\"name\":\"NAUSEATED FACE\",\"short_names\":[\"nauseated_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":37},{\"unified\":\"1F923\",\"name\":\"ROLLING ON THE FLOOR LAUGHING\",\"short_names\":[\"rolling_on_the_floor_laughing\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":38},{\"unified\":\"1F924\",\"name\":\"DROOLING FACE\",\"short_names\":[\"drooling_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":39},{\"unified\":\"1F925\",\"name\":\"LYING FACE\",\"short_names\":[\"lying_face\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":40},{\"unified\":\"1F926-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-facepalming\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":41},{\"unified\":\"1F926-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-facepalming\"],\"category\":\"Smileys & People\",\"sheet_x\":38,\"sheet_y\":47},{\"unified\":\"1F926\",\"name\":\"FACE PALM\",\"short_names\":[\"face_palm\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":0},{\"unified\":\"1F927\",\"name\":\"SNEEZING FACE\",\"short_names\":[\"sneezing_face\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":6},{\"unified\":\"1F928\",\"name\":\"FACE WITH ONE EYEBROW RAISED\",\"short_names\":[\"face_with_raised_eyebrow\",\"face_with_one_eyebrow_raised\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":7},{\"unified\":\"1F929\",\"name\":\"GRINNING FACE WITH STAR EYES\",\"short_names\":[\"star-struck\",\"grinning_face_with_star_eyes\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":8},{\"unified\":\"1F92A\",\"name\":\"GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE\",\"short_names\":[\"zany_face\",\"grinning_face_with_one_large_and_one_small_eye\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":9},{\"unified\":\"1F92B\",\"name\":\"FACE WITH FINGER COVERING CLOSED LIPS\",\"short_names\":[\"shushing_face\",\"face_with_finger_covering_closed_lips\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":10},{\"unified\":\"1F92C\",\"name\":\"SERIOUS FACE WITH SYMBOLS COVERING MOUTH\",\"short_names\":[\"face_with_symbols_on_mouth\",\"serious_face_with_symbols_covering_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":11},{\"unified\":\"1F92D\",\"name\":\"SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH\",\"short_names\":[\"face_with_hand_over_mouth\",\"smiling_face_with_smiling_eyes_and_hand_covering_mouth\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":12},{\"unified\":\"1F92E\",\"name\":\"FACE WITH OPEN MOUTH VOMITING\",\"short_names\":[\"face_vomiting\",\"face_with_open_mouth_vomiting\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":13},{\"unified\":\"1F92F\",\"name\":\"SHOCKED FACE WITH EXPLODING HEAD\",\"short_names\":[\"exploding_head\",\"shocked_face_with_exploding_head\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":14},{\"unified\":\"1F930\",\"name\":\"PREGNANT WOMAN\",\"short_names\":[\"pregnant_woman\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":15},{\"unified\":\"1F931\",\"name\":\"BREAST-FEEDING\",\"short_names\":[\"breast-feeding\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":21},{\"unified\":\"1F932\",\"name\":\"PALMS UP TOGETHER\",\"short_names\":[\"palms_up_together\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":27},{\"unified\":\"1F933\",\"name\":\"SELFIE\",\"short_names\":[\"selfie\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":33},{\"unified\":\"1F934\",\"name\":\"PRINCE\",\"short_names\":[\"prince\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":39},{\"unified\":\"1F935\",\"name\":\"MAN IN TUXEDO\",\"short_names\":[\"man_in_tuxedo\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":45},{\"unified\":\"1F936\",\"name\":\"MOTHER CHRISTMAS\",\"short_names\":[\"mrs_claus\",\"mother_christmas\"],\"category\":\"Smileys & People\",\"sheet_x\":39,\"sheet_y\":51},{\"unified\":\"1F937-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-shrugging\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":4},{\"unified\":\"1F937-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-shrugging\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":10},{\"unified\":\"1F937\",\"name\":\"SHRUG\",\"short_names\":[\"shrug\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":16},{\"unified\":\"1F938-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-cartwheeling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":22},{\"unified\":\"1F938-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-cartwheeling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":28},{\"unified\":\"1F938\",\"name\":\"PERSON DOING CARTWHEEL\",\"short_names\":[\"person_doing_cartwheel\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":34},{\"unified\":\"1F939-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":40},{\"unified\":\"1F939-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":46},{\"unified\":\"1F939\",\"name\":\"JUGGLING\",\"short_names\":[\"juggling\"],\"category\":\"Smileys & People\",\"sheet_x\":40,\"sheet_y\":52},{\"unified\":\"1F93A\",\"name\":\"FENCER\",\"short_names\":[\"fencer\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":5},{\"unified\":\"1F93C-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-wrestling\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":6},{\"unified\":\"1F93C-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-wrestling\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":7},{\"unified\":\"1F93C\",\"name\":\"WRESTLERS\",\"short_names\":[\"wrestlers\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":8},{\"unified\":\"1F93D-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-playing-water-polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":9},{\"unified\":\"1F93D-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-playing-water-polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":15},{\"unified\":\"1F93D\",\"name\":\"WATER POLO\",\"short_names\":[\"water_polo\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":21},{\"unified\":\"1F93E-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-playing-handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":27},{\"unified\":\"1F93E-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-playing-handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":33},{\"unified\":\"1F93E\",\"name\":\"HANDBALL\",\"short_names\":[\"handball\"],\"category\":\"Smileys & People\",\"sheet_x\":41,\"sheet_y\":39},{\"unified\":\"1F940\",\"name\":\"WILTED FLOWER\",\"short_names\":[\"wilted_flower\"],\"category\":\"Animals & Nature\",\"sheet_x\":41,\"sheet_y\":45},{\"unified\":\"1F941\",\"name\":\"DRUM WITH DRUMSTICKS\",\"short_names\":[\"drum_with_drumsticks\"],\"category\":\"Objects\",\"sheet_x\":41,\"sheet_y\":46},{\"unified\":\"1F942\",\"name\":\"CLINKING GLASSES\",\"short_names\":[\"clinking_glasses\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":47},{\"unified\":\"1F943\",\"name\":\"TUMBLER GLASS\",\"short_names\":[\"tumbler_glass\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":48},{\"unified\":\"1F944\",\"name\":\"SPOON\",\"short_names\":[\"spoon\"],\"category\":\"Food & Drink\",\"sheet_x\":41,\"sheet_y\":49},{\"unified\":\"1F945\",\"name\":\"GOAL NET\",\"short_names\":[\"goal_net\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":50},{\"unified\":\"1F947\",\"name\":\"FIRST PLACE MEDAL\",\"short_names\":[\"first_place_medal\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":51},{\"unified\":\"1F948\",\"name\":\"SECOND PLACE MEDAL\",\"short_names\":[\"second_place_medal\"],\"category\":\"Activities\",\"sheet_x\":41,\"sheet_y\":52},{\"unified\":\"1F949\",\"name\":\"THIRD PLACE MEDAL\",\"short_names\":[\"third_place_medal\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":0},{\"unified\":\"1F94A\",\"name\":\"BOXING GLOVE\",\"short_names\":[\"boxing_glove\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":1},{\"unified\":\"1F94B\",\"name\":\"MARTIAL ARTS UNIFORM\",\"short_names\":[\"martial_arts_uniform\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":2},{\"unified\":\"1F94C\",\"name\":\"CURLING STONE\",\"short_names\":[\"curling_stone\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":3},{\"unified\":\"1F94D\",\"name\":\"LACROSSE STICK AND BALL\",\"short_names\":[\"lacrosse\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":4},{\"unified\":\"1F94E\",\"name\":\"SOFTBALL\",\"short_names\":[\"softball\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":5},{\"unified\":\"1F94F\",\"name\":\"FLYING DISC\",\"short_names\":[\"flying_disc\"],\"category\":\"Activities\",\"sheet_x\":42,\"sheet_y\":6},{\"unified\":\"1F950\",\"name\":\"CROISSANT\",\"short_names\":[\"croissant\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":7},{\"unified\":\"1F951\",\"name\":\"AVOCADO\",\"short_names\":[\"avocado\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":8},{\"unified\":\"1F952\",\"name\":\"CUCUMBER\",\"short_names\":[\"cucumber\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":9},{\"unified\":\"1F953\",\"name\":\"BACON\",\"short_names\":[\"bacon\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":10},{\"unified\":\"1F954\",\"name\":\"POTATO\",\"short_names\":[\"potato\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":11},{\"unified\":\"1F955\",\"name\":\"CARROT\",\"short_names\":[\"carrot\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":12},{\"unified\":\"1F956\",\"name\":\"BAGUETTE BREAD\",\"short_names\":[\"baguette_bread\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":13},{\"unified\":\"1F957\",\"name\":\"GREEN SALAD\",\"short_names\":[\"green_salad\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":14},{\"unified\":\"1F958\",\"name\":\"SHALLOW PAN OF FOOD\",\"short_names\":[\"shallow_pan_of_food\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":15},{\"unified\":\"1F959\",\"name\":\"STUFFED FLATBREAD\",\"short_names\":[\"stuffed_flatbread\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":16},{\"unified\":\"1F95A\",\"name\":\"EGG\",\"short_names\":[\"egg\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":17},{\"unified\":\"1F95B\",\"name\":\"GLASS OF MILK\",\"short_names\":[\"glass_of_milk\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":18},{\"unified\":\"1F95C\",\"name\":\"PEANUTS\",\"short_names\":[\"peanuts\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":19},{\"unified\":\"1F95D\",\"name\":\"KIWIFRUIT\",\"short_names\":[\"kiwifruit\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":20},{\"unified\":\"1F95E\",\"name\":\"PANCAKES\",\"short_names\":[\"pancakes\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":21},{\"unified\":\"1F95F\",\"name\":\"DUMPLING\",\"short_names\":[\"dumpling\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":22},{\"unified\":\"1F960\",\"name\":\"FORTUNE COOKIE\",\"short_names\":[\"fortune_cookie\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":23},{\"unified\":\"1F961\",\"name\":\"TAKEOUT BOX\",\"short_names\":[\"takeout_box\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":24},{\"unified\":\"1F962\",\"name\":\"CHOPSTICKS\",\"short_names\":[\"chopsticks\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":25},{\"unified\":\"1F963\",\"name\":\"BOWL WITH SPOON\",\"short_names\":[\"bowl_with_spoon\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":26},{\"unified\":\"1F964\",\"name\":\"CUP WITH STRAW\",\"short_names\":[\"cup_with_straw\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":27},{\"unified\":\"1F965\",\"name\":\"COCONUT\",\"short_names\":[\"coconut\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":28},{\"unified\":\"1F966\",\"name\":\"BROCCOLI\",\"short_names\":[\"broccoli\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":29},{\"unified\":\"1F967\",\"name\":\"PIE\",\"short_names\":[\"pie\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":30},{\"unified\":\"1F968\",\"name\":\"PRETZEL\",\"short_names\":[\"pretzel\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":31},{\"unified\":\"1F969\",\"name\":\"CUT OF MEAT\",\"short_names\":[\"cut_of_meat\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":32},{\"unified\":\"1F96A\",\"name\":\"SANDWICH\",\"short_names\":[\"sandwich\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":33},{\"unified\":\"1F96B\",\"name\":\"CANNED FOOD\",\"short_names\":[\"canned_food\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":34},{\"unified\":\"1F96C\",\"name\":\"LEAFY GREEN\",\"short_names\":[\"leafy_green\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":35},{\"unified\":\"1F96D\",\"name\":\"MANGO\",\"short_names\":[\"mango\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":36},{\"unified\":\"1F96E\",\"name\":\"MOON CAKE\",\"short_names\":[\"moon_cake\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":37},{\"unified\":\"1F96F\",\"name\":\"BAGEL\",\"short_names\":[\"bagel\"],\"category\":\"Food & Drink\",\"sheet_x\":42,\"sheet_y\":38},{\"unified\":\"1F970\",\"name\":\"SMILING FACE WITH SMILING EYES AND THREE HEARTS\",\"short_names\":[\"smiling_face_with_3_hearts\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":39},{\"unified\":\"1F973\",\"name\":\"FACE WITH PARTY HORN AND PARTY HAT\",\"short_names\":[\"partying_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":40},{\"unified\":\"1F974\",\"name\":\"FACE WITH UNEVEN EYES AND WAVY MOUTH\",\"short_names\":[\"woozy_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":41},{\"unified\":\"1F975\",\"name\":\"OVERHEATED FACE\",\"short_names\":[\"hot_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":42},{\"unified\":\"1F976\",\"name\":\"FREEZING FACE\",\"short_names\":[\"cold_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":43},{\"unified\":\"1F97A\",\"name\":\"FACE WITH PLEADING EYES\",\"short_names\":[\"pleading_face\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":44},{\"unified\":\"1F97C\",\"name\":\"LAB COAT\",\"short_names\":[\"lab_coat\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":45},{\"unified\":\"1F97D\",\"name\":\"GOGGLES\",\"short_names\":[\"goggles\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":46},{\"unified\":\"1F97E\",\"name\":\"HIKING BOOT\",\"short_names\":[\"hiking_boot\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":47},{\"unified\":\"1F97F\",\"name\":\"FLAT SHOE\",\"short_names\":[\"womans_flat_shoe\"],\"category\":\"Smileys & People\",\"sheet_x\":42,\"sheet_y\":48},{\"unified\":\"1F980\",\"name\":\"CRAB\",\"short_names\":[\"crab\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":49},{\"unified\":\"1F981\",\"name\":\"LION FACE\",\"short_names\":[\"lion_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":50},{\"unified\":\"1F982\",\"name\":\"SCORPION\",\"short_names\":[\"scorpion\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":51},{\"unified\":\"1F983\",\"name\":\"TURKEY\",\"short_names\":[\"turkey\"],\"category\":\"Animals & Nature\",\"sheet_x\":42,\"sheet_y\":52},{\"unified\":\"1F984\",\"name\":\"UNICORN FACE\",\"short_names\":[\"unicorn_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":0},{\"unified\":\"1F985\",\"name\":\"EAGLE\",\"short_names\":[\"eagle\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":1},{\"unified\":\"1F986\",\"name\":\"DUCK\",\"short_names\":[\"duck\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":2},{\"unified\":\"1F987\",\"name\":\"BAT\",\"short_names\":[\"bat\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":3},{\"unified\":\"1F988\",\"name\":\"SHARK\",\"short_names\":[\"shark\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":4},{\"unified\":\"1F989\",\"name\":\"OWL\",\"short_names\":[\"owl\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":5},{\"unified\":\"1F98A\",\"name\":\"FOX FACE\",\"short_names\":[\"fox_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":6},{\"unified\":\"1F98B\",\"name\":\"BUTTERFLY\",\"short_names\":[\"butterfly\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":7},{\"unified\":\"1F98C\",\"name\":\"DEER\",\"short_names\":[\"deer\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":8},{\"unified\":\"1F98D\",\"name\":\"GORILLA\",\"short_names\":[\"gorilla\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":9},{\"unified\":\"1F98E\",\"name\":\"LIZARD\",\"short_names\":[\"lizard\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":10},{\"unified\":\"1F98F\",\"name\":\"RHINOCEROS\",\"short_names\":[\"rhinoceros\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":11},{\"unified\":\"1F990\",\"name\":\"SHRIMP\",\"short_names\":[\"shrimp\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":12},{\"unified\":\"1F991\",\"name\":\"SQUID\",\"short_names\":[\"squid\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":13},{\"unified\":\"1F992\",\"name\":\"GIRAFFE FACE\",\"short_names\":[\"giraffe_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":14},{\"unified\":\"1F993\",\"name\":\"ZEBRA FACE\",\"short_names\":[\"zebra_face\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":15},{\"unified\":\"1F994\",\"name\":\"HEDGEHOG\",\"short_names\":[\"hedgehog\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":16},{\"unified\":\"1F995\",\"name\":\"SAUROPOD\",\"short_names\":[\"sauropod\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":17},{\"unified\":\"1F996\",\"name\":\"T-REX\",\"short_names\":[\"t-rex\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":18},{\"unified\":\"1F997\",\"name\":\"CRICKET\",\"short_names\":[\"cricket\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":19},{\"unified\":\"1F998\",\"name\":\"KANGAROO\",\"short_names\":[\"kangaroo\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":20},{\"unified\":\"1F999\",\"name\":\"LLAMA\",\"short_names\":[\"llama\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":21},{\"unified\":\"1F99A\",\"name\":\"PEACOCK\",\"short_names\":[\"peacock\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":22},{\"unified\":\"1F99B\",\"name\":\"HIPPOPOTAMUS\",\"short_names\":[\"hippopotamus\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":23},{\"unified\":\"1F99C\",\"name\":\"PARROT\",\"short_names\":[\"parrot\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":24},{\"unified\":\"1F99D\",\"name\":\"RACCOON\",\"short_names\":[\"raccoon\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":25},{\"unified\":\"1F99E\",\"name\":\"LOBSTER\",\"short_names\":[\"lobster\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":26},{\"unified\":\"1F99F\",\"name\":\"MOSQUITO\",\"short_names\":[\"mosquito\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":27},{\"unified\":\"1F9A0\",\"name\":\"MICROBE\",\"short_names\":[\"microbe\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":28},{\"unified\":\"1F9A1\",\"name\":\"BADGER\",\"short_names\":[\"badger\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":29},{\"unified\":\"1F9A2\",\"name\":\"SWAN\",\"short_names\":[\"swan\"],\"category\":\"Animals & Nature\",\"sheet_x\":43,\"sheet_y\":30},{\"unified\":\"1F9B4\",\"name\":\"BONE\",\"short_names\":[\"bone\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":31},{\"unified\":\"1F9B5\",\"name\":\"LEG\",\"short_names\":[\"leg\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":32},{\"unified\":\"1F9B6\",\"name\":\"FOOT\",\"short_names\":[\"foot\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":38},{\"unified\":\"1F9B7\",\"name\":\"TOOTH\",\"short_names\":[\"tooth\"],\"category\":\"Smileys & People\",\"sheet_x\":43,\"sheet_y\":44},{\"unified\":\"1F9C0\",\"name\":\"CHEESE WEDGE\",\"short_names\":[\"cheese_wedge\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":16},{\"unified\":\"1F9C1\",\"name\":\"CUPCAKE\",\"short_names\":[\"cupcake\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":17},{\"unified\":\"1F9C2\",\"name\":\"SALT SHAKER\",\"short_names\":[\"salt\"],\"category\":\"Food & Drink\",\"sheet_x\":44,\"sheet_y\":18},{\"unified\":\"1F9D0\",\"name\":\"FACE WITH MONOCLE\",\"short_names\":[\"face_with_monocle\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":19},{\"unified\":\"1F9D1\",\"name\":\"ADULT\",\"short_names\":[\"adult\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":20},{\"unified\":\"1F9D2\",\"name\":\"CHILD\",\"short_names\":[\"child\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":26},{\"unified\":\"1F9D3\",\"name\":\"OLDER ADULT\",\"short_names\":[\"older_adult\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":32},{\"unified\":\"1F9D4\",\"name\":\"BEARDED PERSON\",\"short_names\":[\"bearded_person\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":38},{\"unified\":\"1F9D5\",\"name\":\"PERSON WITH HEADSCARF\",\"short_names\":[\"person_with_headscarf\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":44},{\"unified\":\"1F9D6-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":44,\"sheet_y\":50},{\"unified\":\"1F9D6-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":3},{\"unified\":\"1F9D6\",\"name\":\"PERSON IN STEAMY ROOM\",\"short_names\":[\"person_in_steamy_room\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":9},{\"unified\":\"1F9D7-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":15},{\"unified\":\"1F9D7-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":21},{\"unified\":\"1F9D7\",\"name\":\"PERSON CLIMBING\",\"short_names\":[\"person_climbing\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":27},{\"unified\":\"1F9D8-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":33},{\"unified\":\"1F9D8-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":39},{\"unified\":\"1F9D8\",\"name\":\"PERSON IN LOTUS POSITION\",\"short_names\":[\"person_in_lotus_position\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":45},{\"unified\":\"1F9D9-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_mage\"],\"category\":\"Smileys & People\",\"sheet_x\":45,\"sheet_y\":51},{\"unified\":\"1F9D9-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_mage\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":4},{\"unified\":\"1F9D9\",\"name\":\"MAGE\",\"short_names\":[\"mage\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":10},{\"unified\":\"1F9DA-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":16},{\"unified\":\"1F9DA-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":22},{\"unified\":\"1F9DA\",\"name\":\"FAIRY\",\"short_names\":[\"fairy\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":28},{\"unified\":\"1F9DB-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":34},{\"unified\":\"1F9DB-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":40},{\"unified\":\"1F9DB\",\"name\":\"VAMPIRE\",\"short_names\":[\"vampire\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":46},{\"unified\":\"1F9DC-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"mermaid\"],\"category\":\"Smileys & People\",\"sheet_x\":46,\"sheet_y\":52},{\"unified\":\"1F9DC-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"merman\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":5},{\"unified\":\"1F9DC\",\"name\":\"MERPERSON\",\"short_names\":[\"merperson\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":11},{\"unified\":\"1F9DD-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":17},{\"unified\":\"1F9DD-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":23},{\"unified\":\"1F9DD\",\"name\":\"ELF\",\"short_names\":[\"elf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":29},{\"unified\":\"1F9DE-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":35},{\"unified\":\"1F9DE-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":36},{\"unified\":\"1F9DE\",\"name\":\"GENIE\",\"short_names\":[\"genie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":37},{\"unified\":\"1F9DF-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"female_zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":38},{\"unified\":\"1F9DF-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"male_zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":39},{\"unified\":\"1F9DF\",\"name\":\"ZOMBIE\",\"short_names\":[\"zombie\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":40},{\"unified\":\"1F9E0\",\"name\":\"BRAIN\",\"short_names\":[\"brain\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":41},{\"unified\":\"1F9E1\",\"name\":\"ORANGE HEART\",\"short_names\":[\"orange_heart\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":42},{\"unified\":\"1F9E2\",\"name\":\"BILLED CAP\",\"short_names\":[\"billed_cap\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":43},{\"unified\":\"1F9E3\",\"name\":\"SCARF\",\"short_names\":[\"scarf\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":44},{\"unified\":\"1F9E4\",\"name\":\"GLOVES\",\"short_names\":[\"gloves\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":45},{\"unified\":\"1F9E5\",\"name\":\"COAT\",\"short_names\":[\"coat\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":46},{\"unified\":\"1F9E6\",\"name\":\"SOCKS\",\"short_names\":[\"socks\"],\"category\":\"Smileys & People\",\"sheet_x\":47,\"sheet_y\":47},{\"unified\":\"1F9E7\",\"name\":\"RED GIFT ENVELOPE\",\"short_names\":[\"red_envelope\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":48},{\"unified\":\"1F9E8\",\"name\":\"FIRECRACKER\",\"short_names\":[\"firecracker\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":49},{\"unified\":\"1F9E9\",\"name\":\"JIGSAW PUZZLE PIECE\",\"short_names\":[\"jigsaw\"],\"category\":\"Activities\",\"sheet_x\":47,\"sheet_y\":50},{\"unified\":\"1F9EA\",\"name\":\"TEST TUBE\",\"short_names\":[\"test_tube\"],\"category\":\"Objects\",\"sheet_x\":47,\"sheet_y\":51},{\"unified\":\"1F9EB\",\"name\":\"PETRI DISH\",\"short_names\":[\"petri_dish\"],\"category\":\"Objects\",\"sheet_x\":47,\"sheet_y\":52},{\"unified\":\"1F9EC\",\"name\":\"DNA DOUBLE HELIX\",\"short_names\":[\"dna\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":0},{\"unified\":\"1F9ED\",\"name\":\"COMPASS\",\"short_names\":[\"compass\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":1},{\"unified\":\"1F9EE\",\"name\":\"ABACUS\",\"short_names\":[\"abacus\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":2},{\"unified\":\"1F9EF\",\"name\":\"FIRE EXTINGUISHER\",\"short_names\":[\"fire_extinguisher\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":3},{\"unified\":\"1F9F0\",\"name\":\"TOOLBOX\",\"short_names\":[\"toolbox\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":4},{\"unified\":\"1F9F1\",\"name\":\"BRICK\",\"short_names\":[\"bricks\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":5},{\"unified\":\"1F9F2\",\"name\":\"MAGNET\",\"short_names\":[\"magnet\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":6},{\"unified\":\"1F9F3\",\"name\":\"LUGGAGE\",\"short_names\":[\"luggage\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":7},{\"unified\":\"1F9F4\",\"name\":\"LOTION BOTTLE\",\"short_names\":[\"lotion_bottle\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":8},{\"unified\":\"1F9F5\",\"name\":\"SPOOL OF THREAD\",\"short_names\":[\"thread\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":9},{\"unified\":\"1F9F6\",\"name\":\"BALL OF YARN\",\"short_names\":[\"yarn\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":10},{\"unified\":\"1F9F7\",\"name\":\"SAFETY PIN\",\"short_names\":[\"safety_pin\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":11},{\"unified\":\"1F9F8\",\"name\":\"TEDDY BEAR\",\"short_names\":[\"teddy_bear\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":12},{\"unified\":\"1F9F9\",\"name\":\"BROOM\",\"short_names\":[\"broom\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":13},{\"unified\":\"1F9FA\",\"name\":\"BASKET\",\"short_names\":[\"basket\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":14},{\"unified\":\"1F9FB\",\"name\":\"ROLL OF PAPER\",\"short_names\":[\"roll_of_paper\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":15},{\"unified\":\"1F9FC\",\"name\":\"BAR OF SOAP\",\"short_names\":[\"soap\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":16},{\"unified\":\"1F9FD\",\"name\":\"SPONGE\",\"short_names\":[\"sponge\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":17},{\"unified\":\"1F9FE\",\"name\":\"RECEIPT\",\"short_names\":[\"receipt\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":18},{\"unified\":\"1F9FF\",\"name\":\"NAZAR AMULET\",\"short_names\":[\"nazar_amulet\"],\"category\":\"Activities\",\"sheet_x\":48,\"sheet_y\":19},{\"unified\":\"203C-FE0F\",\"name\":\"DOUBLE EXCLAMATION MARK\",\"short_names\":[\"bangbang\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":20},{\"unified\":\"2049-FE0F\",\"name\":\"EXCLAMATION QUESTION MARK\",\"short_names\":[\"interrobang\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":21},{\"unified\":\"2122-FE0F\",\"name\":\"TRADE MARK SIGN\",\"short_names\":[\"tm\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":22},{\"unified\":\"2139-FE0F\",\"name\":\"INFORMATION SOURCE\",\"short_names\":[\"information_source\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":23},{\"unified\":\"2194-FE0F\",\"name\":\"LEFT RIGHT ARROW\",\"short_names\":[\"left_right_arrow\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":24},{\"unified\":\"2195-FE0F\",\"name\":\"UP DOWN ARROW\",\"short_names\":[\"arrow_up_down\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":25},{\"unified\":\"2196-FE0F\",\"name\":\"NORTH WEST ARROW\",\"short_names\":[\"arrow_upper_left\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":26},{\"unified\":\"2197-FE0F\",\"name\":\"NORTH EAST ARROW\",\"short_names\":[\"arrow_upper_right\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":27},{\"unified\":\"2198-FE0F\",\"name\":\"SOUTH EAST ARROW\",\"short_names\":[\"arrow_lower_right\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":28},{\"unified\":\"2199-FE0F\",\"name\":\"SOUTH WEST ARROW\",\"short_names\":[\"arrow_lower_left\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":29},{\"unified\":\"21A9-FE0F\",\"name\":\"LEFTWARDS ARROW WITH HOOK\",\"short_names\":[\"leftwards_arrow_with_hook\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":30},{\"unified\":\"21AA-FE0F\",\"name\":\"RIGHTWARDS ARROW WITH HOOK\",\"short_names\":[\"arrow_right_hook\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":31},{\"unified\":\"231A\",\"name\":\"WATCH\",\"short_names\":[\"watch\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":32},{\"unified\":\"231B\",\"name\":\"HOURGLASS\",\"short_names\":[\"hourglass\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":33},{\"unified\":\"2328-FE0F\",\"name\":null,\"short_names\":[\"keyboard\"],\"category\":\"Objects\",\"sheet_x\":48,\"sheet_y\":34},{\"unified\":\"23CF-FE0F\",\"name\":null,\"short_names\":[\"eject\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":35},{\"unified\":\"23E9\",\"name\":\"BLACK RIGHT-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"fast_forward\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":36},{\"unified\":\"23EA\",\"name\":\"BLACK LEFT-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"rewind\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":37},{\"unified\":\"23EB\",\"name\":\"BLACK UP-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"arrow_double_up\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":38},{\"unified\":\"23EC\",\"name\":\"BLACK DOWN-POINTING DOUBLE TRIANGLE\",\"short_names\":[\"arrow_double_down\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":39},{\"unified\":\"23ED-FE0F\",\"name\":null,\"short_names\":[\"black_right_pointing_double_triangle_with_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":40},{\"unified\":\"23EE-FE0F\",\"name\":null,\"short_names\":[\"black_left_pointing_double_triangle_with_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":41},{\"unified\":\"23EF-FE0F\",\"name\":null,\"short_names\":[\"black_right_pointing_triangle_with_double_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":42},{\"unified\":\"23F0\",\"name\":\"ALARM CLOCK\",\"short_names\":[\"alarm_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":43},{\"unified\":\"23F1-FE0F\",\"name\":null,\"short_names\":[\"stopwatch\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":44},{\"unified\":\"23F2-FE0F\",\"name\":null,\"short_names\":[\"timer_clock\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":45},{\"unified\":\"23F3\",\"name\":\"HOURGLASS WITH FLOWING SAND\",\"short_names\":[\"hourglass_flowing_sand\"],\"category\":\"Travel & Places\",\"sheet_x\":48,\"sheet_y\":46},{\"unified\":\"23F8-FE0F\",\"name\":null,\"short_names\":[\"double_vertical_bar\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":47},{\"unified\":\"23F9-FE0F\",\"name\":null,\"short_names\":[\"black_square_for_stop\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":48},{\"unified\":\"23FA-FE0F\",\"name\":null,\"short_names\":[\"black_circle_for_record\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":49},{\"unified\":\"24C2-FE0F\",\"name\":\"CIRCLED LATIN CAPITAL LETTER M\",\"short_names\":[\"m\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":50},{\"unified\":\"25AA-FE0F\",\"name\":\"BLACK SMALL SQUARE\",\"short_names\":[\"black_small_square\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":51},{\"unified\":\"25AB-FE0F\",\"name\":\"WHITE SMALL SQUARE\",\"short_names\":[\"white_small_square\"],\"category\":\"Symbols\",\"sheet_x\":48,\"sheet_y\":52},{\"unified\":\"25B6-FE0F\",\"name\":\"BLACK RIGHT-POINTING TRIANGLE\",\"short_names\":[\"arrow_forward\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":0},{\"unified\":\"25C0-FE0F\",\"name\":\"BLACK LEFT-POINTING TRIANGLE\",\"short_names\":[\"arrow_backward\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":1},{\"unified\":\"25FB-FE0F\",\"name\":\"WHITE MEDIUM SQUARE\",\"short_names\":[\"white_medium_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":2},{\"unified\":\"25FC-FE0F\",\"name\":\"BLACK MEDIUM SQUARE\",\"short_names\":[\"black_medium_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":3},{\"unified\":\"25FD\",\"name\":\"WHITE MEDIUM SMALL SQUARE\",\"short_names\":[\"white_medium_small_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":4},{\"unified\":\"25FE\",\"name\":\"BLACK MEDIUM SMALL SQUARE\",\"short_names\":[\"black_medium_small_square\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":5},{\"unified\":\"2600-FE0F\",\"name\":\"BLACK SUN WITH RAYS\",\"short_names\":[\"sunny\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":6},{\"unified\":\"2601-FE0F\",\"name\":\"CLOUD\",\"short_names\":[\"cloud\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":7},{\"unified\":\"2602-FE0F\",\"name\":null,\"short_names\":[\"umbrella\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":8},{\"unified\":\"2603-FE0F\",\"name\":null,\"short_names\":[\"snowman\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":9},{\"unified\":\"2604-FE0F\",\"name\":null,\"short_names\":[\"comet\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":10},{\"unified\":\"260E-FE0F\",\"name\":\"BLACK TELEPHONE\",\"short_names\":[\"phone\",\"telephone\"],\"category\":\"Objects\",\"sheet_x\":49,\"sheet_y\":11},{\"unified\":\"2611-FE0F\",\"name\":\"BALLOT BOX WITH CHECK\",\"short_names\":[\"ballot_box_with_check\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":12},{\"unified\":\"2614\",\"name\":\"UMBRELLA WITH RAIN DROPS\",\"short_names\":[\"umbrella_with_rain_drops\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":13},{\"unified\":\"2615\",\"name\":\"HOT BEVERAGE\",\"short_names\":[\"coffee\"],\"category\":\"Food & Drink\",\"sheet_x\":49,\"sheet_y\":14},{\"unified\":\"2618-FE0F\",\"name\":null,\"short_names\":[\"shamrock\"],\"category\":\"Animals & Nature\",\"sheet_x\":49,\"sheet_y\":15},{\"unified\":\"261D-FE0F\",\"name\":\"WHITE UP POINTING INDEX\",\"short_names\":[\"point_up\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":16},{\"unified\":\"2620-FE0F\",\"name\":null,\"short_names\":[\"skull_and_crossbones\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":22},{\"unified\":\"2622-FE0F\",\"name\":null,\"short_names\":[\"radioactive_sign\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":23},{\"unified\":\"2623-FE0F\",\"name\":null,\"short_names\":[\"biohazard_sign\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":24},{\"unified\":\"2626-FE0F\",\"name\":null,\"short_names\":[\"orthodox_cross\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":25},{\"unified\":\"262A-FE0F\",\"name\":null,\"short_names\":[\"star_and_crescent\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":26},{\"unified\":\"262E-FE0F\",\"name\":null,\"short_names\":[\"peace_symbol\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":27},{\"unified\":\"262F-FE0F\",\"name\":null,\"short_names\":[\"yin_yang\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":28},{\"unified\":\"2638-FE0F\",\"name\":null,\"short_names\":[\"wheel_of_dharma\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":29},{\"unified\":\"2639-FE0F\",\"name\":null,\"short_names\":[\"white_frowning_face\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":30},{\"unified\":\"263A-FE0F\",\"name\":\"WHITE SMILING FACE\",\"short_names\":[\"relaxed\"],\"category\":\"Smileys & People\",\"sheet_x\":49,\"sheet_y\":31},{\"unified\":\"2648\",\"name\":\"ARIES\",\"short_names\":[\"aries\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":34},{\"unified\":\"2649\",\"name\":\"TAURUS\",\"short_names\":[\"taurus\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":35},{\"unified\":\"264A\",\"name\":\"GEMINI\",\"short_names\":[\"gemini\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":36},{\"unified\":\"264B\",\"name\":\"CANCER\",\"short_names\":[\"cancer\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":37},{\"unified\":\"264C\",\"name\":\"LEO\",\"short_names\":[\"leo\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":38},{\"unified\":\"264D\",\"name\":\"VIRGO\",\"short_names\":[\"virgo\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":39},{\"unified\":\"264E\",\"name\":\"LIBRA\",\"short_names\":[\"libra\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":40},{\"unified\":\"264F\",\"name\":\"SCORPIUS\",\"short_names\":[\"scorpius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":41},{\"unified\":\"2650\",\"name\":\"SAGITTARIUS\",\"short_names\":[\"sagittarius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":42},{\"unified\":\"2651\",\"name\":\"CAPRICORN\",\"short_names\":[\"capricorn\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":43},{\"unified\":\"2652\",\"name\":\"AQUARIUS\",\"short_names\":[\"aquarius\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":44},{\"unified\":\"2653\",\"name\":\"PISCES\",\"short_names\":[\"pisces\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":45},{\"unified\":\"2660-FE0F\",\"name\":\"BLACK SPADE SUIT\",\"short_names\":[\"spades\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":47},{\"unified\":\"2663-FE0F\",\"name\":\"BLACK CLUB SUIT\",\"short_names\":[\"clubs\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":48},{\"unified\":\"2665-FE0F\",\"name\":\"BLACK HEART SUIT\",\"short_names\":[\"hearts\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":49},{\"unified\":\"2666-FE0F\",\"name\":\"BLACK DIAMOND SUIT\",\"short_names\":[\"diamonds\"],\"category\":\"Activities\",\"sheet_x\":49,\"sheet_y\":50},{\"unified\":\"2668-FE0F\",\"name\":\"HOT SPRINGS\",\"short_names\":[\"hotsprings\"],\"category\":\"Travel & Places\",\"sheet_x\":49,\"sheet_y\":51},{\"unified\":\"267B-FE0F\",\"name\":\"BLACK UNIVERSAL RECYCLING SYMBOL\",\"short_names\":[\"recycle\"],\"category\":\"Symbols\",\"sheet_x\":49,\"sheet_y\":52},{\"unified\":\"267F\",\"name\":\"WHEELCHAIR SYMBOL\",\"short_names\":[\"wheelchair\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":1},{\"unified\":\"2692-FE0F\",\"name\":null,\"short_names\":[\"hammer_and_pick\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":2},{\"unified\":\"2693\",\"name\":\"ANCHOR\",\"short_names\":[\"anchor\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":3},{\"unified\":\"2694-FE0F\",\"name\":null,\"short_names\":[\"crossed_swords\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":4},{\"unified\":\"2696-FE0F\",\"name\":null,\"short_names\":[\"scales\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":6},{\"unified\":\"2697-FE0F\",\"name\":null,\"short_names\":[\"alembic\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":7},{\"unified\":\"2699-FE0F\",\"name\":null,\"short_names\":[\"gear\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":8},{\"unified\":\"269B-FE0F\",\"name\":null,\"short_names\":[\"atom_symbol\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":9},{\"unified\":\"269C-FE0F\",\"name\":null,\"short_names\":[\"fleur_de_lis\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":10},{\"unified\":\"26A0-FE0F\",\"name\":\"WARNING SIGN\",\"short_names\":[\"warning\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":11},{\"unified\":\"26A1\",\"name\":\"HIGH VOLTAGE SIGN\",\"short_names\":[\"zap\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":12},{\"unified\":\"26AA\",\"name\":\"MEDIUM WHITE CIRCLE\",\"short_names\":[\"white_circle\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":13},{\"unified\":\"26AB\",\"name\":\"MEDIUM BLACK CIRCLE\",\"short_names\":[\"black_circle\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":14},{\"unified\":\"26B0-FE0F\",\"name\":null,\"short_names\":[\"coffin\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":15},{\"unified\":\"26B1-FE0F\",\"name\":null,\"short_names\":[\"funeral_urn\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":16},{\"unified\":\"26BD\",\"name\":\"SOCCER BALL\",\"short_names\":[\"soccer\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":17},{\"unified\":\"26BE\",\"name\":\"BASEBALL\",\"short_names\":[\"baseball\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":18},{\"unified\":\"26C4\",\"name\":\"SNOWMAN WITHOUT SNOW\",\"short_names\":[\"snowman_without_snow\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":19},{\"unified\":\"26C5\",\"name\":\"SUN BEHIND CLOUD\",\"short_names\":[\"partly_sunny\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":20},{\"unified\":\"26C8-FE0F\",\"name\":null,\"short_names\":[\"thunder_cloud_and_rain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":21},{\"unified\":\"26CE\",\"name\":\"OPHIUCHUS\",\"short_names\":[\"ophiuchus\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":22},{\"unified\":\"26CF-FE0F\",\"name\":null,\"short_names\":[\"pick\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":23},{\"unified\":\"26D1-FE0F\",\"name\":null,\"short_names\":[\"helmet_with_white_cross\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":24},{\"unified\":\"26D3-FE0F\",\"name\":null,\"short_names\":[\"chains\"],\"category\":\"Objects\",\"sheet_x\":50,\"sheet_y\":25},{\"unified\":\"26D4\",\"name\":\"NO ENTRY\",\"short_names\":[\"no_entry\"],\"category\":\"Symbols\",\"sheet_x\":50,\"sheet_y\":26},{\"unified\":\"26E9-FE0F\",\"name\":null,\"short_names\":[\"shinto_shrine\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":27},{\"unified\":\"26EA\",\"name\":\"CHURCH\",\"short_names\":[\"church\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":28},{\"unified\":\"26F0-FE0F\",\"name\":null,\"short_names\":[\"mountain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":29},{\"unified\":\"26F1-FE0F\",\"name\":null,\"short_names\":[\"umbrella_on_ground\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":30},{\"unified\":\"26F2\",\"name\":\"FOUNTAIN\",\"short_names\":[\"fountain\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":31},{\"unified\":\"26F3\",\"name\":\"FLAG IN HOLE\",\"short_names\":[\"golf\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":32},{\"unified\":\"26F4-FE0F\",\"name\":null,\"short_names\":[\"ferry\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":33},{\"unified\":\"26F5\",\"name\":\"SAILBOAT\",\"short_names\":[\"boat\",\"sailboat\"],\"category\":\"Travel & Places\",\"sheet_x\":50,\"sheet_y\":34},{\"unified\":\"26F7-FE0F\",\"name\":null,\"short_names\":[\"skier\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":35},{\"unified\":\"26F8-FE0F\",\"name\":null,\"short_names\":[\"ice_skate\"],\"category\":\"Activities\",\"sheet_x\":50,\"sheet_y\":36},{\"unified\":\"26F9-FE0F-200D-2640-FE0F\",\"name\":null,\"short_names\":[\"woman-bouncing-ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":37},{\"unified\":\"26F9-FE0F-200D-2642-FE0F\",\"name\":null,\"short_names\":[\"man-bouncing-ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":43},{\"unified\":\"26F9-FE0F\",\"name\":null,\"short_names\":[\"person_with_ball\"],\"category\":\"Smileys & People\",\"sheet_x\":50,\"sheet_y\":49},{\"unified\":\"26FA\",\"name\":\"TENT\",\"short_names\":[\"tent\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":2},{\"unified\":\"26FD\",\"name\":\"FUEL PUMP\",\"short_names\":[\"fuelpump\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":3},{\"unified\":\"2702-FE0F\",\"name\":\"BLACK SCISSORS\",\"short_names\":[\"scissors\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":4},{\"unified\":\"2705\",\"name\":\"WHITE HEAVY CHECK MARK\",\"short_names\":[\"white_check_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":5},{\"unified\":\"2708-FE0F\",\"name\":\"AIRPLANE\",\"short_names\":[\"airplane\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":6},{\"unified\":\"2709-FE0F\",\"name\":\"ENVELOPE\",\"short_names\":[\"email\",\"envelope\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":7},{\"unified\":\"270A\",\"name\":\"RAISED FIST\",\"short_names\":[\"fist\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":8},{\"unified\":\"270B\",\"name\":\"RAISED HAND\",\"short_names\":[\"hand\",\"raised_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":14},{\"unified\":\"270C-FE0F\",\"name\":\"VICTORY HAND\",\"short_names\":[\"v\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":20},{\"unified\":\"270D-FE0F\",\"name\":null,\"short_names\":[\"writing_hand\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":26},{\"unified\":\"270F-FE0F\",\"name\":\"PENCIL\",\"short_names\":[\"pencil2\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":32},{\"unified\":\"2712-FE0F\",\"name\":\"BLACK NIB\",\"short_names\":[\"black_nib\"],\"category\":\"Objects\",\"sheet_x\":51,\"sheet_y\":33},{\"unified\":\"2714-FE0F\",\"name\":\"HEAVY CHECK MARK\",\"short_names\":[\"heavy_check_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":34},{\"unified\":\"2716-FE0F\",\"name\":\"HEAVY MULTIPLICATION X\",\"short_names\":[\"heavy_multiplication_x\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":35},{\"unified\":\"271D-FE0F\",\"name\":null,\"short_names\":[\"latin_cross\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":36},{\"unified\":\"2721-FE0F\",\"name\":null,\"short_names\":[\"star_of_david\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":37},{\"unified\":\"2728\",\"name\":\"SPARKLES\",\"short_names\":[\"sparkles\"],\"category\":\"Activities\",\"sheet_x\":51,\"sheet_y\":38},{\"unified\":\"2733-FE0F\",\"name\":\"EIGHT SPOKED ASTERISK\",\"short_names\":[\"eight_spoked_asterisk\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":39},{\"unified\":\"2734-FE0F\",\"name\":\"EIGHT POINTED BLACK STAR\",\"short_names\":[\"eight_pointed_black_star\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":40},{\"unified\":\"2744-FE0F\",\"name\":\"SNOWFLAKE\",\"short_names\":[\"snowflake\"],\"category\":\"Travel & Places\",\"sheet_x\":51,\"sheet_y\":41},{\"unified\":\"2747-FE0F\",\"name\":\"SPARKLE\",\"short_names\":[\"sparkle\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":42},{\"unified\":\"274C\",\"name\":\"CROSS MARK\",\"short_names\":[\"x\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":43},{\"unified\":\"274E\",\"name\":\"NEGATIVE SQUARED CROSS MARK\",\"short_names\":[\"negative_squared_cross_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":44},{\"unified\":\"2753\",\"name\":\"BLACK QUESTION MARK ORNAMENT\",\"short_names\":[\"question\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":45},{\"unified\":\"2754\",\"name\":\"WHITE QUESTION MARK ORNAMENT\",\"short_names\":[\"grey_question\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":46},{\"unified\":\"2755\",\"name\":\"WHITE EXCLAMATION MARK ORNAMENT\",\"short_names\":[\"grey_exclamation\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":47},{\"unified\":\"2757\",\"name\":\"HEAVY EXCLAMATION MARK SYMBOL\",\"short_names\":[\"exclamation\",\"heavy_exclamation_mark\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":48},{\"unified\":\"2763-FE0F\",\"name\":null,\"short_names\":[\"heavy_heart_exclamation_mark_ornament\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":49},{\"unified\":\"2764-FE0F\",\"name\":\"HEAVY BLACK HEART\",\"short_names\":[\"heart\"],\"category\":\"Smileys & People\",\"sheet_x\":51,\"sheet_y\":50},{\"unified\":\"2795\",\"name\":\"HEAVY PLUS SIGN\",\"short_names\":[\"heavy_plus_sign\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":51},{\"unified\":\"2796\",\"name\":\"HEAVY MINUS SIGN\",\"short_names\":[\"heavy_minus_sign\"],\"category\":\"Symbols\",\"sheet_x\":51,\"sheet_y\":52},{\"unified\":\"2797\",\"name\":\"HEAVY DIVISION SIGN\",\"short_names\":[\"heavy_division_sign\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":0},{\"unified\":\"27A1-FE0F\",\"name\":\"BLACK RIGHTWARDS ARROW\",\"short_names\":[\"arrow_right\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":1},{\"unified\":\"27B0\",\"name\":\"CURLY LOOP\",\"short_names\":[\"curly_loop\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":2},{\"unified\":\"27BF\",\"name\":\"DOUBLE CURLY LOOP\",\"short_names\":[\"loop\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":3},{\"unified\":\"2934-FE0F\",\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS\",\"short_names\":[\"arrow_heading_up\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":4},{\"unified\":\"2935-FE0F\",\"name\":\"ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS\",\"short_names\":[\"arrow_heading_down\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":5},{\"unified\":\"2B05-FE0F\",\"name\":\"LEFTWARDS BLACK ARROW\",\"short_names\":[\"arrow_left\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":6},{\"unified\":\"2B06-FE0F\",\"name\":\"UPWARDS BLACK ARROW\",\"short_names\":[\"arrow_up\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":7},{\"unified\":\"2B07-FE0F\",\"name\":\"DOWNWARDS BLACK ARROW\",\"short_names\":[\"arrow_down\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":8},{\"unified\":\"2B1B\",\"name\":\"BLACK LARGE SQUARE\",\"short_names\":[\"black_large_square\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":9},{\"unified\":\"2B1C\",\"name\":\"WHITE LARGE SQUARE\",\"short_names\":[\"white_large_square\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":10},{\"unified\":\"2B50\",\"name\":\"WHITE MEDIUM STAR\",\"short_names\":[\"star\"],\"category\":\"Travel & Places\",\"sheet_x\":52,\"sheet_y\":11},{\"unified\":\"2B55\",\"name\":\"HEAVY LARGE CIRCLE\",\"short_names\":[\"o\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":12},{\"unified\":\"3030-FE0F\",\"name\":\"WAVY DASH\",\"short_names\":[\"wavy_dash\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":13},{\"unified\":\"303D-FE0F\",\"name\":\"PART ALTERNATION MARK\",\"short_names\":[\"part_alternation_mark\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":14},{\"unified\":\"3297-FE0F\",\"name\":\"CIRCLED IDEOGRAPH CONGRATULATION\",\"short_names\":[\"congratulations\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":15},{\"unified\":\"3299-FE0F\",\"name\":\"CIRCLED IDEOGRAPH SECRET\",\"short_names\":[\"secret\"],\"category\":\"Symbols\",\"sheet_x\":52,\"sheet_y\":16}]\r\n };\r\n}\r\n\r\nConfig.Schema = Config.Schema || {};\r\n\r\nConfig.Schema.MTProto = {\"constructors\":[{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"85337187\",\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector<long>\"}],\"type\":\"ResPQ\"},{\"id\":\"-2083955988\",\"predicate\":\"p_q_inner_data\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"1013613780\",\"predicate\":\"p_q_inner_data_temp\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":\"2043348061\",\"predicate\":\"server_DH_params_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash\",\"type\":\"int128\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-790100132\",\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-1249309254\",\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":\"1715713620\",\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":\"1003222836\",\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1188831161\",\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-1499615742\",\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"-212046591\",\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":\"558156313\",\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":\"1579864942\",\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-847714938\",\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1539647305\",\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"155834844\",\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":\"-1370486635\",\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector<future_salt>\"}],\"type\":\"FutureSalts\"},{\"id\":\"880243653\",\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-501201412\",\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"1658015945\",\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1631450872\",\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":\"1945237724\",\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":\"1538843921\",\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":\"-530561358\",\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":\"812830625\",\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":\"1658238041\",\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsAck\"},{\"id\":\"-1477445615\",\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"-307542917\",\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":\"2105940488\",\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgResendReq\"},{\"id\":\"-630588590\",\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"}],\"type\":\"MsgsStateReq\"},{\"id\":\"81704317\",\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":\"-1933520591\",\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":\"661470918\",\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"-2137147681\",\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":\"1973679973\",\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"}],\"methods\":[{\"id\":\"1615239032\",\"method\":\"req_pq\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":\"-686627650\",\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":\"-184262881\",\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":\"1491380032\",\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":\"-1188971260\",\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":\"2059302892\",\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":\"-213746804\",\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":\"-414113498\",\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":\"-1835453025\",\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"}]};\r\n\r\nConfig.Schema.API = {\"constructors\":[{\"id\":\"-1132882121\",\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1720552011\",\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1072550713\",\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":\"481674261\",\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":\"-994444869\",\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":\"1450380236\",\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":\"2134579434\",\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"2107670217\",\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":\"396093539\",\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1182234929\",\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-138301121\",\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":\"-208488460\",\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":\"-181407105\",\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"-1771768449\",\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":\"505969924\",\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1279654347\",\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-104578748\",\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":\"-122978821\",\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"480546647\",\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":\"-1837345356\",\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-1991004873\",\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":\"-457104426\",\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":\"-206066487\",\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"}],\"type\":\"InputGeoPoint\"},{\"id\":\"483901197\",\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":\"1001634122\",\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":\"-539317279\",\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-1649296275\",\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1160714821\",\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"-1432995067\",\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1086091090\",\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"8322574\",\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-891180321\",\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"172975040\",\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1373745011\",\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1384777335\",\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"1258941372\",\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"-1278304028\",\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"276907596\",\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":\"537022650\",\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"User\"},{\"id\":\"1326562017\",\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":\"-321430132\",\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"164646985\",\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-306628279\",\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"9203775\",\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":\"-1683826688\",\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Chat\"},{\"id\":\"1004149726\",\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":\"120753115\",\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":\"461151667\",\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector<BotInfo>\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"ChatFull\"},{\"id\":\"-925415106\",\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-57668565\",\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":\"1061556205\",\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChatParticipant>\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":\"935395612\",\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":\"1197267925\",\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"photo_small\",\"type\":\"FileLocation\"},{\"name\":\"photo_big\",\"type\":\"FileLocation\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":\"-2082087340\",\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Message\"},{\"id\":\"1160515173\",\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector<RestrictionReason>\"}],\"type\":\"Message\"},{\"id\":\"-1642487306\",\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?int\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"}],\"type\":\"Message\"},{\"id\":\"1038967584\",\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"1766936791\",\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1457575028\",\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":\"-873313984\",\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1618676578\",\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":\"-1230047312\",\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1503425638\",\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1247687078\",\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"2144015272\",\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":\"-1780220945\",\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1217033015\",\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"MessageAction\"},{\"id\":\"-1297179892\",\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"739712882\",\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":\"590459437\",\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":\"-797637467\",\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector<PhotoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":\"236446268\",\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":\"2009052699\",\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":\"-374917894\",\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"FileLocation\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"286776671\",\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":\"43446532\",\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"GeoPoint\"},{\"id\":\"1577067778\",\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-855308010\",\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-543777747\",\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-1195615476\",\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":\"423314455\",\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"1251338318\",\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-1673717362\",\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":\"-1353671392\",\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-2122045747\",\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1539849235\",\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":\"1490799288\",\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"505595789\",\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"777640226\",\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-1376497949\",\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-512463606\",\"predicate\":\"inputReportReasonOther\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"ReportReason\"},{\"id\":\"-302941166\",\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"user\",\"type\":\"User\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"}],\"type\":\"UserFull\"},{\"id\":\"-116274796\",\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":\"-805141448\",\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":\"1444661369\",\"predicate\":\"contactBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ContactBlocked\"},{\"id\":\"-748155807\",\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":\"-1219778094\",\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":\"-353862078\",\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<Contact>\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"2010127419\",\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector<ImportedContact>\"},{\"name\":\"popular_invites\",\"type\":\"Vector<PopularContact>\"},{\"name\":\"retry_contacts\",\"type\":\"Vector<long>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"471043349\",\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"-1878523231\",\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector<ContactBlocked>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"364538944\",\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"1910543603\",\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-1938715001\",\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-923939298\",\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"1694474197\",\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-438840932\",\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-1269012015\",\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"1474492012\",\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1777752804\",\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1614803355\",\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1458172132\",\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1629621880\",\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"2129714567\",\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-3644025\",\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"522914557\",\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1318109142\",\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-1576161051\",\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1548249383\",\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"-1704596961\",\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":\"125178264\",\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":\"469489699\",\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":\"-1489818765\",\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"-1791935732\",\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"-1519637954\",\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":\"1567990072\",\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"16030880\",\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-1459938943\",\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector<EncryptedMessage>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":\"-484987010\",\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"-1857044719\",\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"377562760\",\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"int\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?int\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.3?int\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"2027216577\",\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1918567619\",\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1957577280\",\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector<Update>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1916114267\",\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"352657236\",\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photos\"},{\"id\":\"539045032\",\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"photos.Photo\"},{\"id\":\"157948117\",\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":\"414687501\",\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":\"856375399\",\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":\"-1910892683\",\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":\"497489295\",\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"help.AppUpdate\"},{\"id\":\"-1000708810\",\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":\"415997816\",\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":\"314359194\",\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"386986326\",\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1264392051\",\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"956179895\",\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1417756512\",\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1006044124\",\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-931638658\",\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-94974410\",\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"332848423\",\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-247351839\",\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":\"-1038136962\",\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":\"1248893260\",\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":\"406307684\",\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":\"1690108678\",\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"1511503333\",\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-182231723\",\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-317144808\",\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"594758406\",\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":\"-1058912715\",\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"740433629\",\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"1443858741\",\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1802240206\",\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-95482955\",\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":\"767652808\",\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":\"-364179876\",\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1851755554\",\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1906403213\",\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector<DcOption>\"}],\"type\":\"Update\"},{\"id\":\"1530447553\",\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector<InputDocument>\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"598418386\",\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-1666158377\",\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1928391342\",\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":\"448771445\",\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":\"-1160743548\",\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":\"922273905\",\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":\"-1683841855\",\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector<PhotoSize>\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"Document\"},{\"id\":\"398898678\",\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":\"-1613493288\",\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":\"-1261946036\",\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-1073230141\",\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-2131957734\",\"predicate\":\"updateUserBlocked\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":\"-1094555409\",\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":\"381645902\",\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-44119819\",\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1584933265\",\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-378127636\",\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-718310409\",\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-212740181\",\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-774682074\",\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-1441998364\",\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"393186209\",\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"1653390447\",\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-1290580579\",\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector<Peer>\"},{\"name\":\"results\",\"type\":\"Vector<Peer>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.Found\"},{\"id\":\"-337352679\",\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"Update\"},{\"id\":\"-496024847\",\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"129960444\",\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"2011940674\",\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":\"-298113238\",\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"}],\"type\":\"Update\"},{\"id\":\"1335282456\",\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-1137792208\",\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"218751099\",\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"407582158\",\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"320652927\",\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"195371015\",\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-697604407\",\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":\"-1877932953\",\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"-123988\",\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1698855810\",\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"1297858060\",\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-125240806\",\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"-1955338397\",\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":\"209668535\",\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"1352683077\",\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector<PrivacyRule>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-1194283041\",\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":\"314130811\",\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"1815593308\",\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"297109817\",\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1662637586\",\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"250621158\",\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-1739392570\",\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"358154344\",\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":\"-244016606\",\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":\"-463889475\",\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.Stickers\"},{\"id\":\"313694676\",\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector<long>\"}],\"type\":\"StickerPack\"},{\"id\":\"-395967805\",\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":\"-302170017\",\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSet>\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-1667805217\",\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"791617983\",\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-2066640507\",\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"2139689491\",\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-350980120\",\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":\"-981018084\",\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"-94051982\",\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"documents\",\"type\":\"flags.11?Vector<Document>\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"}],\"type\":\"WebPage\"},{\"id\":\"-1557277184\",\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1392388579\",\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":\"307276766\",\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<Authorization>\"}],\"type\":\"account.Authorizations\"},{\"id\":\"-1390001672\",\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"}],\"type\":\"account.Password\"},{\"id\":\"-1705233435\",\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-1036572727\",\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":\"326715557\",\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"-1052959727\",\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"784356159\",\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"-1551583367\",\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":\"1776236393\",\"predicate\":\"chatInviteEmpty\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":\"-64092740\",\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1516793212\",\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":\"-540871282\",\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector<User>\"}],\"type\":\"ChatInvite\"},{\"id\":\"-123931160\",\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1757493555\",\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-4838507\",\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":\"-1645763991\",\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-2044933984\",\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":\"-290164953\",\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.4?PhotoSize\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":\"-1240849242\",\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-1820043071\",\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector<RestrictionReason>\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":\"-1032140601\",\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":\"-1729618630\",\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector<BotCommand>\"}],\"type\":\"BotInfo\"},{\"id\":\"-1560655744\",\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"2002815875\",\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector<KeyboardButton>\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":\"-1606526075\",\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"-200242528\",\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"889353612\",\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"2072935910\",\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"-668391402\",\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":\"-1148011883\",\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-100378723\",\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1868782349\",\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1827637959\",\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1859134776\",\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1692693954\",\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1117713463\",\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-2106619040\",\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"681706865\",\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1938967520\",\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"1990644519\",\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":\"301019932\",\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector<MessageEntity>\"}],\"type\":\"Updates\"},{\"id\":\"-292807034\",\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":\"-1343524562\",\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":\"-1109531342\",\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Peer\"},{\"id\":\"548253432\",\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":\"-753232354\",\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector<RestrictionReason>\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":\"681420594\",\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":\"2131196633\",\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"763976820\",\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.12?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector<BotInfo>\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?int\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?int\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"ChatFull\"},{\"id\":\"182649427\",\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":\"-1725551049\",\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1781355374\",\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"-352032773\",\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":\"-1227598250\",\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1656358105\",\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"856380452\",\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1015733815\",\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1734268085\",\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1041346555\",\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1531132162\",\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"543450958\",\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector<Message>\"},{\"name\":\"other_updates\",\"type\":\"Vector<Update>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1798033689\",\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"-847783593\",\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector<MessageRange>\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":\"367766557\",\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-1557620115\",\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-2138237532\",\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"-566281095\",\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1268741783\",\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-1548400251\",\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-177282392\",\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector<ChannelParticipant>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"-791039645\",\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"-636267638\",\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-489233354\",\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":\"-1232070311\",\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1371385889\",\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1336546578\",\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"-1328445861\",\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"2013922064\",\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":\"1753886890\",\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":\"196268545\",\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Update\"},{\"id\":\"1135492588\",\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":\"372165663\",\"predicate\":\"foundGif\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"thumb_url\",\"type\":\"string\"},{\"name\":\"content_url\",\"type\":\"string\"},{\"name\":\"content_type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"FoundGif\"},{\"id\":\"-1670052855\",\"predicate\":\"foundGifCached\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"FoundGif\"},{\"id\":\"1212395773\",\"predicate\":\"inputMediaGifExternal\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"1158290442\",\"predicate\":\"messages.foundGifs\",\"params\":[{\"name\":\"next_offset\",\"type\":\"int\"},{\"name\":\"results\",\"type\":\"Vector<FoundGif>\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-402498398\",\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":\"772213157\",\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"gifs\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"-1821035490\",\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":\"864077702\",\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"1036876423\",\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-2000710887\",\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"1984755728\",\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1937807902\",\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"295067450\",\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1803769784\",\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector<BotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.BotResults\"},{\"id\":\"1417832080\",\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"239663460\",\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":\"1358283666\",\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"928101534\",\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1107622874\",\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1343122938\",\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"1571494644\",\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"-332168592\",\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"flags.1?int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"}],\"type\":\"MessageFwdHeader\"},{\"id\":\"457133559\",\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1738988427\",\"predicate\":\"updateChannelPinnedMessage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1799538451\",\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"1923290508\",\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1948046307\",\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"577556219\",\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":\"1035688326\",\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1073693790\",\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"1398007207\",\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"-1425815847\",\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":\"629866245\",\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1748655686\",\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1318425559\",\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-59151553\",\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"90744648\",\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1218642516\",\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector<KeyboardButtonRow>\"}],\"type\":\"ReplyMarkup\"},{\"id\":\"911761060\",\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-415938591\",\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"649453030\",\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"-469536605\",\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1045340827\",\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"1098628881\",\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1494368259\",\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-1222451611\",\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1970903652\",\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"416402882\",\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":\"-1462213465\",\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"-459324\",\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"400266251\",\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":\"-1995686519\",\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":\"-103646630\",\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":\"1008755359\",\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":\"863093588\",\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector<Dialog>\"},{\"name\":\"messages\",\"type\":\"Vector<Message>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-305282981\",\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":\"-1419371685\",\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"344356834\",\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"104314861\",\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-1122524854\",\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"371037736\",\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-75283823\",\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector<TopPeer>\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":\"-567906571\",\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":\"1891070632\",\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector<TopPeerCategoryPeers>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"892193368\",\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"546203849\",\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":\"975236280\",\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"634833351\",\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-299124375\",\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":\"453805082\",\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":\"-40996577\",\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":\"-1615153660\",\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"82699215\",\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"-123893531\",\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"},{\"name\":\"unread\",\"type\":\"Vector<long>\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1461528386\",\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"186120336\",\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":\"586395571\",\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"},{\"name\":\"dates\",\"type\":\"Vector<int>\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"-1706939360\",\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"1338747336\",\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"946083368\",\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"904138920\",\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"1678812626\",\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1574314746\",\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":\"861169551\",\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-440664550\",\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"-78455655\",\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":\"872932635\",\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector<Document>\"}],\"type\":\"StickerSetCovered\"},{\"id\":\"-1361650766\",\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":\"-1744710921\",\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":\"1251549527\",\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"70813275\",\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":\"-1107729093\",\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":\"1336154098\",\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":\"1262639204\",\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":\"-38694904\",\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":\"-750828557\",\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":\"53231223\",\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":\"-1020139510\",\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":\"1358175439\",\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1834538890\",\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":\"1493171408\",\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":\"-1707344487\",\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector<HighScore>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"messages.HighScores\"},{\"id\":\"1258196845\",\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"1081547008\",\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1663561404\",\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-599948721\",\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":\"1950782688\",\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"1730456516\",\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-653089380\",\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1054465340\",\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-1678197867\",\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1816074681\",\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"1009288385\",\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":\"-564523562\",\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"2120376535\",\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector<RichText>\"}],\"type\":\"RichText\"},{\"id\":\"324435594\",\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"1890305021\",\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1879401953\",\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1162877472\",\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":\"-1076861716\",\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-248793375\",\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1182402406\",\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1066346178\",\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"1216809369\",\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-618614392\",\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":\"-837994576\",\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":\"-454524911\",\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListItem>\"}],\"type\":\"PageBlock\"},{\"id\":\"641563686\",\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"1329878739\",\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"391759200\",\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":\"2089805750\",\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"972174080\",\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":\"-1468953147\",\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-229005301\",\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"1705048653\",\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"52401552\",\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-2054908813\",\"predicate\":\"webPageNotModified\",\"params\":[],\"type\":\"WebPage\"},{\"id\":\"-88417185\",\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1030105979\",\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-580219064\",\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"-2048646399\",\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-527056480\",\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"1471006352\",\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"-84416311\",\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":\"1852826908\",\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":\"-99664734\",\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector<DialogPeer>\"}],\"type\":\"Update\"},{\"id\":\"2104790276\",\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":\"-2095595325\",\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":\"-1684914010\",\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-886477832\",\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":\"-1022713000\",\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"Invoice\"},{\"id\":\"-186607933\",\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":\"-368917890\",\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":\"-1892568281\",\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":\"-2074799289\",\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":\"512535275\",\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":\"-1868808300\",\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":\"-1344716869\",\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":\"1080663248\",\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":\"-842892769\",\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":\"475467473\",\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":\"-1678949555\",\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"InputWebDocument\"},{\"id\":\"-1036396922\",\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":\"568808380\",\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":\"1062645411\",\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-784000893\",\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"1314881805\",\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1342771681\",\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"-74456004\",\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":\"-1056001329\",\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"873977640\",\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-614138572\",\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"-1239335713\",\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector<LabeledPrice>\"}],\"type\":\"ShippingOption\"},{\"id\":\"-523384512\",\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":\"1563376297\",\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":\"-6249322\",\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":\"-1425052898\",\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":\"506920429\",\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":\"1399245077\",\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":\"462375633\",\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-2014659757\",\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1719909046\",\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":\"-2025673089\",\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"int\"},{\"name\":\"participant_id\",\"type\":\"int\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector<PhoneConnection>\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":\"1355435489\",\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":\"-1655957568\",\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":\"-1564789301\",\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":\"-326966976\",\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"-2134272152\",\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":\"-2132731265\",\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":\"2054952868\",\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1253451181\",\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-1997373508\",\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":\"608050278\",\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":\"-242427324\",\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector<FileHash>\"}],\"type\":\"upload.File\"},{\"id\":\"-290921362\",\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-1449145777\",\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-914167110\",\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":\"1462101002\",\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector<CdnPublicKey>\"}],\"type\":\"CdnConfig\"},{\"id\":\"-283684427\",\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":\"-892239370\",\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"1816636575\",\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"695856818\",\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":\"-209337866\",\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector<LangPackString>\"}],\"type\":\"LangPackDifference\"},{\"id\":\"-288727837\",\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":\"1180041828\",\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":\"1442983757\",\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":\"-859915345\",\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?int\"},{\"name\":\"promoted_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"470789295\",\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"kicked_by\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":\"338142689\",\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"106343499\",\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"-421545947\",\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1427671598\",\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1783299128\",\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1129042607\",\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"460916654\",\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"648939889\",\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-370660328\",\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1889215493\",\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1121994683\",\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"405815507\",\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-124291086\",\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-484690728\",\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-422036098\",\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-714643696\",\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"995769920\",\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":\"-309659827\",\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<ChannelAdminLogEvent>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"-368018716\",\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":\"511092620\",\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-2143067670\",\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"1558266229\",\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":\"1200788123\",\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1634752813\",\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":\"-209768682\",\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"packs\",\"type\":\"Vector<StickerPack>\"},{\"name\":\"stickers\",\"type\":\"Vector<Document>\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-451831443\",\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1987495099\",\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":\"-1040652646\",\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1887741886\",\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":\"-1312568665\",\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-85549226\",\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"178373535\",\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-905587442\",\"predicate\":\"inputPaymentCredentialsAndroidPay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"},{\"name\":\"google_transaction_id\",\"type\":\"string\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":\"-419271411\",\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"-530392189\",\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":\"1893427255\",\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"int\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"1599903217\",\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-833715459\",\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"period\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":\"2084316681\",\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageMedia\"},{\"id\":\"1189204285\",\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1917045962\",\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1608834311\",\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-347535331\",\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"-1140172836\",\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":\"235081943\",\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector<RecentMeUrl>\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-266911767\",\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1951620897\",\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"482797855\",\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector<MessageEntity>\"}],\"type\":\"InputSingleMedia\"},{\"id\":\"-892779534\",\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":\"-313079300\",\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector<WebAuthorization>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":\"-1502174430\",\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":\"-1160215659\",\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":\"-2037963464\",\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":\"-1687559349\",\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1280209983\",\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1410748418\",\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":\"-55902537\",\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":\"-445792507\",\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":\"223655517\",\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"1359533640\",\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector<StickerSetCovered>\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"1648543603\",\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":\"-104284986\",\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector<DocumentAttribute>\"}],\"type\":\"WebDocument\"},{\"id\":\"1968737087\",\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":\"-526508104\",\"predicate\":\"help.proxyDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.ProxyData\"},{\"id\":\"737668643\",\"predicate\":\"help.proxyDataPromo\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector<Chat>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"}],\"type\":\"help.ProxyData\"},{\"id\":\"-483352705\",\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"686618977\",\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"859091184\",\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":\"1399317950\",\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":\"-876089816\",\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"1679398724\",\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":\"-534283678\",\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":\"-1964327229\",\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":\"2103482845\",\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":\"569137759\",\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":\"-1658158621\",\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"1034709504\",\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"115615172\",\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1596951477\",\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1717268701\",\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-874308058\",\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-63531698\",\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1995211763\",\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1954007928\",\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1713143702\",\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-368907213\",\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1289704741\",\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"-1908627474\",\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":\"411017418\",\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<SecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<SecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":\"-618540889\",\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector<InputSecureFile>\"},{\"name\":\"files\",\"type\":\"flags.4?Vector<InputSecureFile>\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":\"-316748368\",\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":\"-391902247\",\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"12467706\",\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-2037765467\",\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-449327402\",\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"2054162547\",\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"1717706985\",\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"871426631\",\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":\"-1389486888\",\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector<SecureRequiredType>\"},{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"},{\"name\":\"users\",\"type\":\"Vector<User>\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":\"-2128640689\",\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":\"455635795\",\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector<SecureValue>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":\"-648257196\",\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"MessageAction\"},{\"id\":\"1722786150\",\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"1783556146\",\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector<MessageEntity>\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"289586518\",\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":\"1304052993\",\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":\"700340377\",\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":\"-513517117\",\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":\"-253500010\",\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-1625153079\",\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":\"-1255369827\",\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":\"-1685456582\",\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"-732254058\",\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":\"4883767\",\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"-1141711456\",\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"-2042159726\",\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":\"354925740\",\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":\"982592842\",\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":\"-1736378792\",\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":\"-763367294\",\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":\"-2036501105\",\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-1592506512\",\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"878931416\",\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector<bytes>\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":\"-2103600678\",\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":\"41187252\",\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureRequiredType>\"}],\"type\":\"SecureRequiredType\"},{\"id\":\"-1078332329\",\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":\"-1600596305\",\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":\"488313413\",\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":\"-1059185703\",\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":\"1064139624\",\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":\"-952869270\",\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":\"736157604\",\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":\"-1222740358\",\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":\"-146520221\",\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONValue>\"}],\"type\":\"JSONValue\"},{\"id\":\"-1715350371\",\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector<JSONObjectValue>\"}],\"type\":\"JSONValue\"},{\"id\":\"1279515160\",\"predicate\":\"updateUserPinnedMessage\",\"params\":[{\"name\":\"user_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-519195831\",\"predicate\":\"updateChatPinnedMessage\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-1311015810\",\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":\"-703403793\",\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":\"-311786236\",\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"-939827711\",\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"55281185\",\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":\"483104362\",\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"136105807\",\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":\"504660880\",\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"878078826\",\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":\"-524237339\",\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector<PageTableCell>\"}],\"type\":\"PageTableRow\"},{\"id\":\"-1085412734\",\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector<PageTableRow>\"}],\"type\":\"PageBlock\"},{\"id\":\"1869903447\",\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":\"-1188055347\",\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":\"635466748\",\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListItem\"},{\"id\":\"1577484359\",\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":\"-1730311882\",\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"}],\"type\":\"PageListOrderedItem\"},{\"id\":\"-1702174239\",\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector<PageListOrderedItem>\"}],\"type\":\"PageBlock\"},{\"id\":\"1987480557\",\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":\"-1282352120\",\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":\"370236054\",\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector<PageRelatedArticle>\"}],\"type\":\"PageBlock\"},{\"id\":\"-1538310410\",\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":\"-1366746132\",\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector<PageBlock>\"},{\"name\":\"photos\",\"type\":\"Vector<Photo>\"},{\"name\":\"documents\",\"type\":\"Vector<Document>\"}],\"type\":\"Page\"},{\"id\":\"-610373422\",\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"961092808\",\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"894777186\",\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":\"-1945767479\",\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":\"-206688531\",\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":\"32192344\",\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":\"-202219658\",\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":\"-1398708869\",\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":\"1823064809\",\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":\"-716006138\",\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector<PollAnswer>\"}],\"type\":\"Poll\"},{\"id\":\"997055186\",\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":\"1465219162\",\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector<PollAnswerVoters>\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"}],\"type\":\"PollResults\"},{\"id\":\"112424539\",\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"}],\"type\":\"InputMedia\"},{\"id\":\"1272375192\",\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":\"-264117680\",\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":\"1202287072\",\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":\"-525288402\",\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":\"1605510357\",\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":\"-1626209256\",\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":\"1421875280\",\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"-433014407\",\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":\"1913199744\",\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":\"-1150621555\",\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":\"771095562\",\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-1895328189\",\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"471437699\",\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":\"1881892265\",\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"wallpapers\",\"type\":\"Vector<WallPaper>\"}],\"type\":\"account.WallPapers\"},{\"id\":\"-557924733\",\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"}],\"type\":\"CodeSettings\"},{\"id\":\"-1590738760\",\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":\"-767099577\",\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":\"1674235686\",\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":\"-709641735\",\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":\"594408994\",\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector<string>\"}],\"type\":\"EmojiKeyword\"},{\"id\":\"1556570557\",\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector<EmojiKeyword>\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"-1519029347\",\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":\"-1275374751\",\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":\"-1529000952\",\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1777096355\",\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"1461304012\",\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-1777000467\",\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-1132476723\",\"predicate\":\"fileLocationToBeDeprecated\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"FileLocation\"},{\"id\":\"1075322878\",\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-667654413\",\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":\"668375447\",\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":\"230353641\",\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":\"-11252123\",\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":\"1908216652\",\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":\"1684014375\",\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":\"1363483106\",\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":\"-70073706\",\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":\"-373643672\",\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":\"422972864\",\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<FolderPeer>\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":\"756118935\",\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"InputUser\"},{\"id\":\"707290417\",\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"InputChannel\"},{\"id\":\"398123750\",\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"-1667893317\",\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"int\"}],\"type\":\"InputPeer\"},{\"id\":\"55761658\",\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"-778378131\",\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":\"-1472172887\",\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-68239120\",\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":\"-1569748965\",\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-398136321\",\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":\"280464681\",\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-802258988\",\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":\"-1831650802\",\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-1886646706\",\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-1445536993\",\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":\"1283572154\",\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"-668769361\",\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"InputPrivacyRule\"},{\"id\":\"415136107\",\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-1397881200\",\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector<int>\"}],\"type\":\"PrivacyRule\"},{\"id\":\"-1672577397\",\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"-1090087980\",\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"34469328\",\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":\"1786671974\",\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":\"-1078612597\",\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":\"547062491\",\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":\"-901375139\",\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":\"-1263546448\",\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<PeerLocated>\"}],\"type\":\"Update\"},{\"id\":\"241923758\",\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"-606798099\",\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":\"1401984889\",\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":\"1148485274\",\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-666824391\",\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"42402760\",\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":\"967122427\",\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":\"-1870238482\",\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector<int>\"}],\"type\":\"Update\"},{\"id\":\"-797791052\",\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":\"1012306921\",\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":\"-175567375\",\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":\"1211967244\",\"predicate\":\"themeDocumentNotModified\",\"params\":[],\"type\":\"Theme\"},{\"id\":\"-136770336\",\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"installs_count\",\"type\":\"int\"}],\"type\":\"Theme\"},{\"id\":\"-199313886\",\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":\"2137482273\",\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"themes\",\"type\":\"Vector<Theme>\"}],\"type\":\"account.Themes\"},{\"id\":\"-2112423005\",\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":\"-786326563\",\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":\"1124062251\",\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"}],\"methods\":[{\"id\":\"-878758099\",\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"1036301552\",\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector<long>\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1502141361\",\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"-2131827673\",\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1126886015\",\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"1461180992\",\"method\":\"auth.logOut\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1616179942\",\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-440401971\",\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":\"-470837741\",\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-841733627\",\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"1754754159\",\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"813089983\",\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2067899501\",\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":\"313765169\",\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":\"-612493497\",\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"2018596725\",\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":\"1713919532\",\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1430579357\",\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.WallPapers\"},{\"id\":\"-1374118561\",\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"227648840\",\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Vector<User>\"},{\"id\":\"-902781519\",\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"UserFull\"},{\"id\":\"749357634\",\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"Vector<int>\"},{\"id\":\"-995929106\",\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector<ContactStatus>\"},{\"id\":\"-1071414113\",\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.Contacts\"},{\"id\":\"746589157\",\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector<InputContact>\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":\"157945344\",\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":\"269745566\",\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector<string>\"}],\"type\":\"Bool\"},{\"id\":\"858475004\",\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-448724803\",\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":\"-176409329\",\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":\"1673946374\",\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1594999949\",\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":\"-591691168\",\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-2045448344\",\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputUser\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"238054714\",\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"469850889\",\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-443640366\",\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"94983360\",\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector<ReceivedNotifyMessage>\"},{\"id\":\"-1551737264\",\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":\"1376532592\",\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"881978281\",\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-637606386\",\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"grouped\",\"type\":\"flags.9?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"random_id\",\"type\":\"Vector<long>\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-820669733\",\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"913498268\",\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"PeerSettings\"},{\"id\":\"-1115507112\",\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"reason\",\"type\":\"ReportReason\"}],\"type\":\"Bool\"},{\"id\":\"1013621127\",\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"998448230\",\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"-599447467\",\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-900957736\",\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"-106911223\",\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-530505962\",\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":\"164303470\",\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector<InputUser>\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-304838614\",\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":\"630429265\",\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":\"-256159406\",\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"UserProfilePhoto\"},{\"id\":\"1328726168\",\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"photos.Photo\"},{\"id\":\"-2016444625\",\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputPhoto>\"}],\"type\":\"Vector<long>\"},{\"id\":\"-1291540959\",\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"-1319462148\",\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":\"-990308245\",\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":\"531836966\",\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":\"1378703997\",\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":\"1295590211\",\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":\"-1848823128\",\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":\"651135312\",\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":\"-162681021\",\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":\"1035731989\",\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":\"-304536635\",\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"2031374829\",\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2135648522\",\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-1451792525\",\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"-1701831834\",\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"852769188\",\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":\"1436924774\",\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector<long>\"},{\"id\":\"1259113487\",\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":\"-562337987\",\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":\"2018609336\",\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1663104819\",\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":\"916930423\",\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"655677548\",\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1040964988\",\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"301470424\",\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":\"-623130288\",\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"-906486552\",\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector<InputPrivacyRule>\"}],\"type\":\"account.PrivacyRules\"},{\"id\":\"1099779595\",\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"150761757\",\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":\"608323678\",\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":\"-627372787\",\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-113456221\",\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":\"-2108208411\",\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1891839707\",\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":\"71126828\",\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Stickers\"},{\"id\":\"479598769\",\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"954152242\",\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1738800940\",\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1956073268\",\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"MessageMedia\"},{\"id\":\"-484392616\",\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":\"-545786948\",\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":\"1418342645\",\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":\"-1663767815\",\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":\"-1516564433\",\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":\"-779399914\",\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-661144474\",\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":\"1319464594\",\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":\"-1080796745\",\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"234312524\",\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ExportedChatInvite\"},{\"id\":\"1051570619\",\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":\"1817183516\",\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"639215886\",\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-946871200\",\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":\"-110209570\",\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"-421563528\",\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-1877938321\",\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-993483427\",\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"Vector<int>\"},{\"id\":\"-871347913\",\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-2067661490\",\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":\"-787622117\",\"method\":\"channels.deleteUserHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-32999408\",\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-1383294429\",\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<InputMessage>\"}],\"type\":\"messages.Messages\"},{\"id\":\"306054633\",\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":\"1416484774\",\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":\"176122811\",\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<InputChannel>\"}],\"type\":\"messages.Chats\"},{\"id\":\"141781513\",\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":\"1029681423\",\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":\"-751007486\",\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"1450044624\",\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-248621111\",\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":\"283557164\",\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"890549214\",\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"615851205\",\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"-130635115\",\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"429865580\",\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector<InputUser>\"}],\"type\":\"Updates\"},{\"id\":\"-1072619549\",\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":\"51854712\",\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":\"-1444503762\",\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"363051235\",\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1083038300\",\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"2016638777\",\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"864953444\",\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":\"-1080395925\",\"method\":\"messages.searchGifs\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.FoundGifs\"},{\"id\":\"-2084618926\",\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.SavedGifs\"},{\"id\":\"846868683\",\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"1364105629\",\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":\"-346119674\",\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector<InputBotInlineResult>\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":\"570955184\",\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"-826838685\",\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"grouped\",\"type\":\"Bool\"}],\"type\":\"ExportedMessageLink\"},{\"id\":\"527021574\",\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"1056025023\",\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":\"520357240\",\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-39416522\",\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":\"1224152952\",\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":\"-2091549254\",\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":\"-2130010132\",\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":\"-712043766\",\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-728224331\",\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"contacts.TopPeers\"},{\"id\":\"451113900\",\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-462373635\",\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1137057461\",\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector<MessageEntity>\"}],\"type\":\"Bool\"},{\"id\":\"1782549861\",\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":\"766298703\",\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":\"1527873830\",\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"1587647177\",\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.RecentStickers\"},{\"id\":\"958863608\",\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-1986437075\",\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":\"1475442322\",\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":\"457157256\",\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1596029123\",\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-122669393\",\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":\"1706608543\",\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AllStickers\"},{\"id\":\"-866424884\",\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector<StickerSetCovered>\"},{\"id\":\"-1907842680\",\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector<long>\"}],\"type\":\"Bool\"},{\"id\":\"-1896289088\",\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"363700068\",\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"-400399203\",\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"258170395\",\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":\"218777796\",\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":\"-341307408\",\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Chats\"},{\"id\":\"-333262899\",\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"852135825\",\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":\"-1489903017\",\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":\"991616823\",\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector<InputDialogPeer>\"}],\"type\":\"Bool\"},{\"id\":\"-692498958\",\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":\"-1440257555\",\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":\"-434028723\",\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"619086221\",\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":\"-1712285883\",\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentForm\"},{\"id\":\"-1601001088\",\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":\"1997180532\",\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":\"730364339\",\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"}],\"type\":\"payments.PaymentResult\"},{\"id\":\"1151208273\",\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":\"578650699\",\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":\"-667062079\",\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":\"-436833542\",\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector<ShippingOption>\"}],\"type\":\"Bool\"},{\"id\":\"163765653\",\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":\"-1680314774\",\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"stickers\",\"type\":\"Vector<InputStickerSetItem>\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-143257775\",\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-4795190\",\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"-2041315650\",\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":\"1369162417\",\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":\"1430593449\",\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":\"1124046573\",\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"1003664544\",\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"788404002\",\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":\"399855457\",\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":\"-1295269440\",\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"1508562471\",\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"662363518\",\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"536919235\",\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":\"-1691921240\",\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"1375900482\",\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":\"-219008246\",\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":\"-269862909\",\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<LangPackString>\"},{\"id\":\"-845657435\",\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":\"1120311183\",\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector<LangPackLanguage>\"},{\"id\":\"1920559378\",\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":\"870184064\",\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector<InputUser>\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":\"1302676017\",\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"-914493408\",\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":\"-359881479\",\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":\"567151374\",\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FavedStickers\"},{\"id\":\"-1174420133\",\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"-357180360\",\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Bool\"},{\"id\":\"-2020263951\",\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1180140658\",\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1355375294\",\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":\"1036054804\",\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":\"-356796084\",\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":\"251759059\",\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":\"-1144759543\",\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-872345397\",\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector<InputSingleMedia>\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"}],\"type\":\"Updates\"},{\"id\":\"1347929239\",\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":\"405695855\",\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":\"755087855\",\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":\"1747789204\",\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1028140917\",\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":\"-956147407\",\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector<FileHash>\"},{\"id\":\"1031231713\",\"method\":\"help.getProxyData\",\"params\":[],\"type\":\"help.ProxyData\"},{\"id\":\"749019089\",\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":\"-294455398\",\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":\"-1299661699\",\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector<SecureValue>\"},{\"id\":\"1936088002\",\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Vector<SecureValue>\"},{\"id\":\"-1986010339\",\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":\"-1199522741\",\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector<SecureValueType>\"}],\"type\":\"Bool\"},{\"id\":\"-1865902923\",\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector<SecureValueError>\"}],\"type\":\"Bool\"},{\"id\":\"-1200903967\",\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":\"-419267436\",\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"int\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector<SecureValueHash>\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":\"-1516022023\",\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":\"1305716726\",\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1880182943\",\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":\"-323339813\",\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"1072547679\",\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":\"-2098076769\",\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector<SavedContact>\"},{\"id\":\"-2092831552\",\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":\"-262453244\",\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":\"489050862\",\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":\"486505992\",\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector<MessageRange>\"},{\"id\":\"911373810\",\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1398145746\",\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":\"-1031349873\",\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":\"585256482\",\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector<DialogPeer>\"},{\"id\":\"-2062238246\",\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2119757468\",\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1735311088\",\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":\"1862465352\",\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector<InputAppEvent>\"}],\"type\":\"Bool\"},{\"id\":\"-966677240\",\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":\"1784243458\",\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":\"-760547348\",\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-1881204448\",\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"2055154197\",\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-1043606090\",\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-748624084\",\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":\"59377875\",\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":\"1723407216\",\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector<MessageEntity>\"}],\"type\":\"help.UserInfo\"},{\"id\":\"-1626880216\",\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"-806076575\",\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"1398240377\",\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":\"283795844\",\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector<bytes>\"}],\"type\":\"Updates\"},{\"id\":\"1941660731\",\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1848369232\",\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":\"-2127811866\",\"method\":\"messages.getStatsURL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"params\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":\"-554301545\",\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-1517917375\",\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":\"-57811990\",\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":\"-578472351\",\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":\"1817860919\",\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":\"-18000023\",\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":\"-1153722364\",\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":\"1457130303\",\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":\"1995661875\",\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":\"899735650\",\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"352892591\",\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":\"1318675378\",\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector<string>\"}],\"type\":\"Vector<EmojiLanguage>\"},{\"id\":\"-709817306\",\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":\"1749536939\",\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector<InputFolderPeer>\"}],\"type\":\"Updates\"},{\"id\":\"472471681\",\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"1932455680\",\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector<MessagesFilter>\"}],\"type\":\"Vector<messages.SearchCounter>\"},{\"id\":\"-170208392\",\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":\"1079520178\",\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":\"-482388461\",\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"-148247912\",\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"UrlAuthResult\"},{\"id\":\"1336717624\",\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":\"-386636848\",\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":\"-130964977\",\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":\"-1892102881\",\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":\"171270230\",\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"Updates\"},{\"id\":\"1491484525\",\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":\"-304832784\",\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":\"-490575781\",\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1111817116\",\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"messages.Messages\"},{\"id\":\"-1120369398\",\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":\"1504586518\",\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector<int>\"}],\"type\":\"Updates\"},{\"id\":\"473805619\",\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":\"729808255\",\"method\":\"account.createTheme\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"InputDocument\"}],\"type\":\"Theme\"},{\"id\":\"999203330\",\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"}],\"type\":\"Theme\"},{\"id\":\"-229175188\",\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":\"2061776695\",\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"format\",\"type\":\"flags.1?string\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"}],\"type\":\"Bool\"},{\"id\":\"-1919060949\",\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":\"676939512\",\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"account.Themes\"}]};\r\n\r\nConfig.Schema.API.layer = 105;\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nConfig.TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nConfig.LatinizeMap = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','': 'U','': 'V','': 'W','ʏ': 'Y','': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'}\r\n\r\n// ConfigStorage\r\n//;(function (window) {\r\n var keyPrefix = '';\r\n var noPrefix = false;\r\n var cache = {};\r\n var useCs = !!(window.chrome && chrome.storage && chrome.storage.local);\r\n var useLs = !useCs && !!window.localStorage;\r\n\r\n function storageSetPrefix(newPrefix) {\r\n keyPrefix = newPrefix;\r\n }\r\n\r\n function storageSetNoPrefix() {\r\n noPrefix = true;\r\n }\r\n\r\n function storageGetPrefix() {\r\n if(noPrefix) {\r\n noPrefix = false;\r\n return '';\r\n }\r\n\r\n return keyPrefix;\r\n }\r\n\r\n function storageGetValue(keys, callback) {\r\n var single = false;\r\n if(!Array.isArray(keys)) {\r\n keys = Array.prototype.slice.call(arguments);\r\n callback = keys.pop();\r\n single = keys.length == 1;\r\n }\r\n var result = [],\r\n value;\r\n var allFound = true;\r\n var prefix = storageGetPrefix(),\r\n i, key;\r\n\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i] = prefix + keys[i];\r\n if(key.substr(0, 3) != 'xt_' && cache[key] !== undefined) {\r\n result.push(cache[key]);\r\n } else if(useLs) {\r\n try {\r\n value = localStorage.getItem(key);\r\n } catch(e) {\r\n useLs = false;\r\n }\r\n\r\n try {\r\n value = (value === undefined || value === null) ? false : JSON.parse(value);\r\n } catch(e) {\r\n value = false;\r\n }\r\n result.push(cache[key] = value);\r\n } else if(!useCs) {\r\n result.push(cache[key] = false);\r\n } else {\r\n allFound = false;\r\n }\r\n }\r\n\r\n if(allFound) {\r\n return callback(single ? result[0] : result);\r\n }\r\n\r\n chrome.storage.local.get(keys, function(resultObj) {\r\n var value;\r\n result = [];\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i];\r\n value = resultObj[key];\r\n value = value === undefined || value === null ? false : JSON.parse(value);\r\n result.push(cache[key] = value);\r\n }\r\n\r\n callback(single ? result[0] : result);\r\n });\r\n }\r\n\r\n function storageSetValue(obj, callback) {\r\n var keyValues = {};\r\n var prefix = storageGetPrefix(),\r\n key, value;\r\n\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n for(key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n value = obj[key];\r\n key = prefix + key;\r\n cache[key] = value;\r\n value = JSON.stringify(value);\r\n if(useLs) {\r\n try {\r\n localStorage.setItem(key, value);\r\n } catch (e) {\r\n useLs = false;\r\n }\r\n } else {\r\n keyValues[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if(useLs || !useCs) {\r\n if(callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n chrome.storage.local.set(keyValues, callback);\r\n }\r\n\r\n function storageRemoveValue(keys, callback) {\r\n if(!Array.isArray(keys)) {\r\n keys = Array.prototype.slice.call(arguments)\r\n if(typeof keys[keys.length - 1] === 'function') {\r\n callback = keys.pop();\r\n }\r\n }\r\n\r\n var prefix = storageGetPrefix(),\r\n i, key;\r\n\r\n for(i = 0; i < keys.length; i++) {\r\n key = keys[i] = prefix + keys[i];\r\n delete cache[key];\r\n if(useLs) {\r\n try {\r\n localStorage.removeItem(key);\r\n } catch(e) {\r\n useLs = false;\r\n }\r\n }\r\n }\r\n\r\n if(useCs) {\r\n chrome.storage.local.remove(keys, callback);\r\n } else if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n function storageClear(callback) {\r\n if(useLs) {\r\n try {\r\n localStorage.clear();\r\n } catch (e) {\r\n useLs = false;\r\n }\r\n }\r\n\r\n if(useCs) {\r\n chrome.storage.local.clear(function() {\r\n cache = {};\r\n callback();\r\n })\r\n } else {\r\n cache = {};\r\n callback();\r\n }\r\n }\r\n\r\n \r\n\r\n window.ConfigStorage = {\r\n prefix: storageSetPrefix,\r\n noPrefix: storageSetNoPrefix,\r\n get: storageGetValue,\r\n set: storageSetValue,\r\n remove: storageRemoveValue,\r\n clear: storageClear\r\n };\r\n\r\n Config.Storage = window.ConfigStorage;\r\n\r\n module.exports = Config;\r\n//})(this)\r\n"
},
{
"id": 6,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/misc.ts",
"name": "./src/components/misc.ts",
"index": 37,
"index2": 35,
"size": 410,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"issuerId": 7,
"issuerName": "./src/components/pageIm.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1600,
"building": 228
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "7:13-30"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "../components/misc",
"loc": "41:13-42"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "14:13-30"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "./misc",
"loc": "7:13-30"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction putPreloader(elem) {\n var html = \"\\n <svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"preloader-circular\\\" viewBox=\\\"25 25 50 50\\\">\\n <circle class=\\\"preloader-path\\\" cx=\\\"50\\\" cy=\\\"50\\\" r=\\\"20\\\" fill=\\\"none\\\" stroke-miterlimit=\\\"10\\\"/>\\n </svg>\";\n elem.innerHTML += html;\n}\nexports.putPreloader = putPreloader;\n"
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"index": 39,
"index2": 39,
"size": 6794,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./components/pageIm",
"loc": "20:31-61"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "18:31-50"
},
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "11:31-50"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "./pageIm",
"loc": "17:31-50"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar services_1 = require(\"../lib/services\");\nvar misc_1 = require(\"./misc\");\nvar overlayscrollbars_1 = __importDefault(require(\"overlayscrollbars\"));\nexports.default = (function () {\n var chatsContainer = document.body.querySelector('.chats-container');\n var d = document.createElement('div');\n d.classList.add('preloader');\n misc_1.putPreloader(d);\n chatsContainer.append(d);\n var pageEl = document.body.getElementsByClassName('page-chats')[0];\n pageEl.style.display = '';\n var loadCount = Math.round(document.body.scrollHeight / 70 * 1.5);\n // @ts-ignore\n var chatsScroll = overlayscrollbars_1.default(chatsContainer, window.scrollbarOptions);\n // @ts-ignore\n var chatScroll = overlayscrollbars_1.default(document.getElementById('bubbles'), window.scrollbarOptions);\n /* chatScroll.options({autoUpdateInterval: 15}); */\n services_1.apiUpdatesManager.attach();\n var offsetIndex = 0;\n var loadDialogsPromise;\n var loadDialogs = function () {\n if (loadDialogsPromise)\n return Promise.resolve();\n chatsContainer.append(d);\n //let offset = appMessagesManager.generateDialogIndex();/* appMessagesManager.dialogsNum */;\n return loadDialogsPromise = services_1.appMessagesManager.getConversations('', offsetIndex, loadCount).then(function (result) {\n console.log('loaded ' + loadCount + ' dialogs by offset:', offsetIndex, result);\n d.remove();\n loadDialogsPromise = undefined;\n if (result && result.dialogs && result.dialogs.length) {\n offsetIndex = result.dialogs[result.dialogs.length - 1].index;\n result.dialogs.forEach(services_1.appDialogsManager.addDialog.bind(services_1.appDialogsManager));\n }\n });\n };\n var onScroll = function () {\n var info = chatsScroll.scroll();\n var yPos = info.position.y;\n var scrollHeight = info.max.y;\n if ((scrollHeight - yPos) <= (70 * 5) && !loadDialogsPromise) {\n loadDialogs();\n }\n };\n chatsScroll.options({\n callbacks: {\n onScroll: onScroll,\n onHostSizeChanged: onScroll\n }\n });\n // @ts-ignore\n document.addEventListener('user_update', function (e) {\n var userID = e.detail;\n var user = services_1.appUsersManager.getUser(userID);\n var dialog = services_1.appMessagesManager.getDialogByPeerID(user.id)[0];\n console.log('updating user:', user, dialog);\n if (dialog && !services_1.appUsersManager.isBot(dialog.peerID)) {\n var online = user.status._ == 'userStatusOnline';\n var dom = services_1.appDialogsManager.getDialogDom(dialog.peerID);\n if (dom) {\n if (online) {\n dom.avatarDiv.classList.add('is-online');\n }\n else {\n dom.avatarDiv.classList.remove('is-online');\n }\n }\n }\n if (services_1.appImManager.peerID == user.id) {\n services_1.appImManager.setPeerStatus();\n }\n });\n // @ts-ignore\n document.addEventListener('history_multiappend', function (e) {\n var msgIDsByPeer = e.detail;\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener(/* 'history_delete' */ 'dialog_top', function (e) {\n var dialog = e.detail;\n services_1.appDialogsManager.setLastMessage(dialog);\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener('history_delete', function (e) {\n var detail = e.detail;\n services_1.appImManager.deleteMessagesByIDs(Object.keys(detail.msgs).map(function (s) { return +s; }));\n });\n // @ts-ignore\n document.addEventListener('dialogs_multiupdate', function (e) {\n var dialogs = e.detail;\n for (var id in dialogs) {\n var dialog = dialogs[id];\n console.log('updating dialog:', dialog);\n if (!(dialog.peerID in services_1.appDialogsManager.doms)) {\n services_1.appDialogsManager.addDialog(dialog);\n continue;\n }\n services_1.appDialogsManager.setLastMessage(dialog);\n }\n services_1.appDialogsManager.sortDom();\n });\n // @ts-ignore\n document.addEventListener('dialog_unread', function (e) {\n var info = e.detail;\n var dialog = services_1.appMessagesManager.getDialogByPeerID(info.peerID)[0];\n services_1.appDialogsManager.setUnreadMessages(dialog);\n if (dialog.peerID == services_1.appImManager.peerID) {\n services_1.appImManager.updateUnreadByDialog(dialog);\n }\n });\n /*\n loadDialogs().then(result => {\n //appImManager.setScroll(chatScroll);\n });\n return;\n */\n var messageInput = document.getElementById('input-message') /* HTMLInputElement */;\n messageInput.addEventListener('keydown', function (e) {\n console.log(e);\n if (e.key == 'Enter') {\n if (e.shiftKey) {\n return;\n }\n var message = this.innerText;\n services_1.appMessagesManager.sendText(services_1.appImManager.peerID, message);\n this.innerText = '';\n /* appImManager.renderMessage({\n message: message,\n fromID: appImManager.peerID,\n date: Date.now() / 1000,\n pFlags: {\n unread: true\n }\n }); */\n }\n });\n messageInput.addEventListener('input', function (e) {\n if (!this.innerText.trim())\n this.innerHTML = '';\n });\n messageInput.addEventListener('paste', function (e) {\n e.preventDefault();\n // @ts-ignore\n var text = (e.originalEvent || e).clipboardData.getData('text/plain');\n window.document.execCommand('insertText', false, text);\n });\n var inputMessageContainer = document.getElementsByClassName('input-message-container')[0];\n var inputScroll = overlayscrollbars_1.default(inputMessageContainer, \n // @ts-ignore\n Object.assign({}, window.scrollbarOptions, { autoUpdate: false }));\n /* window.addEventListener('click', function(this, e) {\n // @ts-ignore\n let isInput = e.target.tagName == 'INPUT';\n if(!isInput && !window.getSelection().toString()) {\n console.log('click');\n messageInput.focus();\n }\n }); */\n loadDialogs().then(function (result) {\n services_1.appImManager.setScroll(chatScroll);\n });\n});\n"
},
{
"id": 8,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/storage.ts",
"name": "./src/lib/storage.ts",
"index": 21,
"index2": 18,
"size": 2741,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "56:32-52"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "39:32-52"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./storage",
"loc": "18:32-52"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar config_1 = require(\"./config\");\nvar AppStorage = /** @class */ (function () {\n function AppStorage() {\n if (config_1.Modes.test) {\n this.setPrefix('t_');\n }\n }\n AppStorage.prototype.setPrefix = function (newPrefix) {\n config_1.Storage.prefix(newPrefix);\n };\n AppStorage.prototype.noPrefix = function () {\n config_1.Storage.noPrefix();\n };\n AppStorage.prototype.proxy = function (methodName) {\n var _args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n _args[_i - 1] = arguments[_i];\n }\n var args = Array.prototype.slice.call(_args);\n var promise = new Promise(function (resolve, reject) {\n args.push(function (result) {\n resolve(result);\n });\n config_1.Storage[methodName].apply(config_1.Storage, args);\n });\n return promise;\n };\n AppStorage.prototype.get = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['get'], args));\n };\n AppStorage.prototype.set = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['set'], args));\n };\n AppStorage.prototype.remove = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['remove'], args));\n };\n AppStorage.prototype.clear = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return this.proxy.apply(this, __spread(['clear'], args));\n };\n return AppStorage;\n}());\nexports.default = new AppStorage();\n//export const appStorage = new AppStorage();\n"
},
{
"id": 9,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/filemanager.ts",
"name": "./src/lib/filemanager.ts",
"index": 33,
"index2": 30,
"size": 9753,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "61:36-60"
},
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "42:36-60"
},
{
"moduleId": 38,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"module": "./src/lib/idb.ts",
"moduleName": "./src/lib/idb.ts",
"type": "cjs require",
"userRequest": "./filemanager",
"loc": "7:36-60"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar FileManager = /** @class */ (function () {\n function FileManager() {\n /* $window.URL = $window.URL || $window.webkitURL\n $window.BlobBuilder = $window.BlobBuilder || $window.WebKitBlobBuilder || $window.MozBlobBuilder */\n this.isSafari = 'safari' in window;\n this.safariVersion = parseFloat(this.isSafari && (navigator.userAgent.match(/Version\\/(\\d+\\.\\d+).* Safari/) || [])[1]);\n this.safariWithDownload = this.isSafari && this.safariVersion >= 11.0;\n this.buggyUnknownBlob = this.isSafari && !this.safariWithDownload;\n this.blobSupported = true;\n try {\n bin_utils_1.blobConstruct([], '');\n }\n catch (e) {\n this.blobSupported = false;\n }\n }\n FileManager.prototype.isAvailable = function () {\n return this.blobSupported;\n };\n FileManager.prototype.copy = function (fromFileEntry, toFileEntry) {\n var _this = this;\n return this.getFileWriter(toFileEntry).then(function (fileWriter) {\n return _this.write(fileWriter, fromFileEntry).then(function () {\n return fileWriter;\n }, function (error) {\n try {\n // @ts-ignore\n fileWriter.truncate(0);\n }\n catch (e) { }\n return Promise.reject(error);\n });\n });\n };\n FileManager.prototype.write = function (fileWriter, bytes) {\n return new Promise(function (resolve, reject) {\n fileWriter.onwriteend = function (e) {\n resolve();\n };\n fileWriter.onerror = function (e) {\n reject(e);\n };\n if (bytes.file) {\n bytes.file(function (file) {\n fileWriter.write(file);\n }, reject);\n }\n else if (bytes instanceof Blob) { // is file bytes\n fileWriter.write(bytes);\n }\n else {\n try {\n var blob = bin_utils_1.blobConstruct([bin_utils_1.bytesToArrayBuffer(bytes)]);\n fileWriter.write(blob);\n }\n catch (e) {\n reject(e);\n }\n }\n });\n };\n FileManager.prototype.chooseSaveFile = function (fileName, ext, mimeType) {\n return Promise.reject();\n /* if(!window.chrome || !chrome.fileSystem || !chrome.fileSystem.chooseEntry) {\n //return qSync.reject()\n return Promise.reject();\n }\n var deferred = $q.defer()\n \n chrome.fileSystem.chooseEntry({\n type: 'saveFile',\n suggestedName: fileName,\n accepts: [{\n mimeTypes: [mimeType],\n extensions: [ext]\n }]\n }, function (writableFileEntry) {\n deferred.resolve(writableFileEntry)\n })\n \n return deferred.promise */\n };\n FileManager.prototype.getFileWriter = function (fileEntry) {\n return new Promise(function (resolve, reject) {\n fileEntry.createWriter(resolve, reject);\n });\n };\n FileManager.prototype.getFakeFileWriter = function (mimeType, saveFileCallback) {\n var _this = this;\n var blobParts = [];\n var fakeFileWriter = {\n write: function (blob) {\n if (!_this.blobSupported) {\n if (fakeFileWriter.onerror) {\n fakeFileWriter.onerror(new Error('Blob not supported by browser'));\n }\n return false;\n }\n blobParts.push(blob);\n setTimeout(function () {\n if (fakeFileWriter.onwriteend) {\n fakeFileWriter.onwriteend();\n }\n }, 0);\n },\n truncate: function () {\n blobParts = [];\n },\n finalize: function () {\n var blob = bin_utils_1.blobConstruct(blobParts, mimeType);\n if (saveFileCallback) {\n saveFileCallback(blob);\n }\n return blob;\n }\n };\n return fakeFileWriter;\n };\n FileManager.prototype.getUrl = function (fileData, mimeType) {\n var safeMimeType = bin_utils_1.blobSafeMimeType(mimeType);\n // console.log(dT(), 'get url', fileData, mimeType, fileData.toURL !== undefined, fileData instanceof Blob)\n if (fileData.toURL !== undefined) {\n return fileData.toURL(safeMimeType);\n }\n if (fileData instanceof Blob) {\n return URL.createObjectURL(fileData);\n }\n return 'data:' + safeMimeType + ';base64,' + bin_utils_1.bytesToBase64(fileData);\n };\n FileManager.prototype.getByteArray = function (fileData) {\n var _this = this;\n if (fileData instanceof Blob) {\n return new Promise(function (resolve, reject) {\n try {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n // @ts-ignore\n resolve(new Uint8Array(e.target.result));\n };\n reader.onerror = function (e) {\n reject(e);\n };\n reader.readAsArrayBuffer(fileData);\n }\n catch (e) {\n reject(e);\n }\n });\n }\n else if (fileData.file) {\n return new Promise(function (resolve, reject) {\n fileData.file(function (blob) {\n _this.getByteArray(blob).then(resolve, reject);\n }, reject);\n });\n }\n return Promise.resolve(fileData);\n //return $q.when(fileData);\n };\n FileManager.prototype.getDataUrl = function (blob) {\n return new Promise(function (resolve, reject) {\n try {\n var reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result);\n };\n reader.readAsDataURL(blob);\n }\n catch (e) {\n reject(e);\n }\n });\n };\n FileManager.prototype.getFileCorrectUrl = function (blob, mimeType) {\n if (this.buggyUnknownBlob && blob instanceof Blob) {\n // @ts-ignore\n mimeType = blob.type || blob.mimeType || mimeType || '';\n if (!mimeType.match(/image\\/(jpeg|gif|png|bmp)|video\\/quicktime/)) {\n return this.getDataUrl(blob);\n }\n }\n return Promise.resolve(this.getUrl(blob, mimeType));\n };\n // downloadFile\n FileManager.prototype.download = function (blob, mimeType, fileName) {\n var _this = this;\n if (window.navigator && navigator.msSaveBlob !== undefined) {\n window.navigator.msSaveBlob(blob, fileName);\n return false;\n }\n if (window.navigator && 'getDeviceStorage' in navigator) {\n var storageName = 'sdcard';\n var subdir = 'telegram/';\n switch (mimeType.split('/')[0]) {\n case 'video':\n storageName = 'videos';\n break;\n case 'audio':\n storageName = 'music';\n break;\n case 'image':\n storageName = 'pictures';\n break;\n }\n // @ts-ignore\n var deviceStorage = navigator.getDeviceStorage(storageName);\n var request = deviceStorage.addNamed(blob, subdir + fileName);\n request.onsuccess = function () {\n console.log('Device storage save result', this.result);\n };\n request.onerror = function () { };\n return;\n }\n var popup;\n if (this.isSafari && !this.safariWithDownload) {\n popup = window.open();\n }\n this.getFileCorrectUrl(blob, mimeType).then(function (url) {\n if (popup) {\n try {\n // @ts-ignore\n popup.location.href = url;\n return;\n }\n catch (e) { }\n }\n var anchor = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');\n anchor.href = url;\n if (!_this.safariWithDownload) {\n anchor.target = '_blank';\n }\n anchor.download = fileName;\n if (anchor.dataset) {\n anchor.dataset.downloadurl = ['video/quicktime', fileName, url].join(':');\n }\n anchor.style.position = 'absolute';\n anchor.style.top = '1px';\n anchor.style.left = '1px';\n document.body.append(anchor);\n try {\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n anchor.dispatchEvent(clickEvent);\n }\n catch (e) {\n console.error('Download click error', e);\n try {\n anchor.click();\n }\n catch (e) {\n window.open(url, '_blank');\n }\n }\n setTimeout(function () {\n anchor.remove();\n }, 100);\n });\n };\n return FileManager;\n}());\nexports.default = new FileManager();\n"
},
{
"id": 10,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/lottie-web/build/player/lottie.js",
"name": "./node_modules/lottie-web/build/player/lottie.js",
"index": 38,
"index2": 36,
"size": 545874,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"issuerId": 12,
"issuerName": "./src/lib/services.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1102,
"building": 243,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "44:35-56"
},
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "22:106-127"
},
{
"moduleId": 45,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"module": "./src/components/pagePassword.ts",
"moduleName": "./src/components/pagePassword.ts",
"type": "cjs require",
"userRequest": "lottie-web",
"loc": "20:97-118"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(typeof navigator !== \"undefined\") && (function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(function() {\r\n return factory(root);\r\n });\r\n } else if (typeof module === \"object\" && module.exports) {\r\n module.exports = factory(root);\r\n } else {\r\n root.lottie = factory(root);\r\n root.bodymovin = root.lottie;\r\n }\r\n}((window || {}), function(window) {\r\n \"use strict\";\r\n var svgNS = \"http://www.w3.org/2000/svg\";\r\n\r\nvar locationHref = '';\r\n\r\nvar initialDefaultFrame = -999999;\r\n\r\nvar subframeEnabled = true;\r\nvar expressionsPlugin;\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\nvar cachedColors = {};\r\nvar bm_rounder = Math.round;\r\nvar bm_rnd;\r\nvar bm_pow = Math.pow;\r\nvar bm_sqrt = Math.sqrt;\r\nvar bm_abs = Math.abs;\r\nvar bm_floor = Math.floor;\r\nvar bm_max = Math.max;\r\nvar bm_min = Math.min;\r\nvar blitter = 10;\r\n\r\nvar BMMath = {};\r\n(function(){\r\n var propertyNames = [\"abs\", \"acos\", \"acosh\", \"asin\", \"asinh\", \"atan\", \"atanh\", \"atan2\", \"ceil\", \"cbrt\", \"expm1\", \"clz32\", \"cos\", \"cosh\", \"exp\", \"floor\", \"fround\", \"hypot\", \"imul\", \"log\", \"log1p\", \"log2\", \"log10\", \"max\", \"min\", \"pow\", \"random\", \"round\", \"sign\", \"sin\", \"sinh\", \"sqrt\", \"tan\", \"tanh\", \"trunc\", \"E\", \"LN10\", \"LN2\", \"LOG10E\", \"LOG2E\", \"PI\", \"SQRT1_2\", \"SQRT2\"];\r\n var i, len = propertyNames.length;\r\n for(i=0;i<len;i+=1){\r\n BMMath[propertyNames[i]] = Math[propertyNames[i]];\r\n }\r\n}());\r\n\r\nfunction ProjectInterface(){return {};}\r\n\r\nBMMath.random = Math.random;\r\nBMMath.abs = function(val){\r\n var tOfVal = typeof val;\r\n if(tOfVal === 'object' && val.length){\r\n var absArr = createSizedArray(val.length);\r\n var i, len = val.length;\r\n for(i=0;i<len;i+=1){\r\n absArr[i] = Math.abs(val[i]);\r\n }\r\n return absArr;\r\n }\r\n return Math.abs(val);\r\n\r\n};\r\nvar defaultCurveSegments = 150;\r\nvar degToRads = Math.PI/180;\r\nvar roundCorner = 0.5519;\r\n\r\nfunction roundValues(flag){\r\n if(flag){\r\n bm_rnd = Math.round;\r\n }else{\r\n bm_rnd = function(val){\r\n return val;\r\n };\r\n }\r\n}\r\nroundValues(false);\r\n\r\nfunction styleDiv(element){\r\n element.style.position = 'absolute';\r\n element.style.top = 0;\r\n element.style.left = 0;\r\n element.style.display = 'block';\r\n element.style.transformOrigin = element.style.webkitTransformOrigin = '0 0';\r\n element.style.backfaceVisibility = element.style.webkitBackfaceVisibility = 'visible';\r\n element.style.transformStyle = element.style.webkitTransformStyle = element.style.mozTransformStyle = \"preserve-3d\";\r\n}\r\n\r\nfunction BMEnterFrameEvent(type, currentTime, totalTime, frameMultiplier){\r\n this.type = type;\r\n this.currentTime = currentTime;\r\n this.totalTime = totalTime;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMCompleteEvent(type, frameMultiplier){\r\n this.type = type;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMCompleteLoopEvent(type, totalLoops, currentLoop, frameMultiplier){\r\n this.type = type;\r\n this.currentLoop = currentLoop;\r\n this.totalLoops = totalLoops;\r\n this.direction = frameMultiplier < 0 ? -1 : 1;\r\n}\r\n\r\nfunction BMSegmentStartEvent(type, firstFrame, totalFrames){\r\n this.type = type;\r\n this.firstFrame = firstFrame;\r\n this.totalFrames = totalFrames;\r\n}\r\n\r\nfunction BMDestroyEvent(type, target){\r\n this.type = type;\r\n this.target = target;\r\n}\r\n\r\nfunction BMRenderFrameErrorEvent(nativeError, currentTime) {\r\n this.type = 'renderFrameError';\r\n this.nativeError = nativeError;\r\n this.currentTime = currentTime;\r\n}\r\n\r\nfunction BMConfigErrorEvent(nativeError) {\r\n this.type = 'configError';\r\n this.nativeError = nativeError;\r\n}\r\n\r\nfunction BMAnimationConfigErrorEvent(type, nativeError) {\r\n this.type = type;\r\n this.nativeError = nativeError;\r\n this.currentTime = currentTime;\r\n}\r\n\r\nvar createElementID = (function(){\r\n var _count = 0;\r\n return function createID() {\r\n return '__lottie_element_' + ++_count\r\n }\r\n}())\r\n\r\nfunction HSVtoRGB(h, s, v) {\r\n var r, g, b, i, f, p, q, t;\r\n i = Math.floor(h * 6);\r\n f = h * 6 - i;\r\n p = v * (1 - s);\r\n q = v * (1 - f * s);\r\n t = v * (1 - (1 - f) * s);\r\n switch (i % 6) {\r\n case 0: r = v; g = t; b = p; break;\r\n case 1: r = q; g = v; b = p; break;\r\n case 2: r = p; g = v; b = t; break;\r\n case 3: r = p; g = q; b = v; break;\r\n case 4: r = t; g = p; b = v; break;\r\n case 5: r = v; g = p; b = q; break;\r\n }\r\n return [ r,\r\n g,\r\n b ];\r\n}\r\n\r\nfunction RGBtoHSV(r, g, b) {\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b),\r\n d = max - min,\r\n h,\r\n s = (max === 0 ? 0 : d / max),\r\n v = max / 255;\r\n\r\n switch (max) {\r\n case min: h = 0; break;\r\n case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;\r\n case g: h = (b - r) + d * 2; h /= 6 * d; break;\r\n case b: h = (r - g) + d * 4; h /= 6 * d; break;\r\n }\r\n\r\n return [\r\n h,\r\n s,\r\n v\r\n ];\r\n}\r\n\r\nfunction addSaturationToRGB(color,offset){\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[1] += offset;\r\n if (hsv[1] > 1) {\r\n hsv[1] = 1;\r\n }\r\n else if (hsv[1] <= 0) {\r\n hsv[1] = 0;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nfunction addBrightnessToRGB(color,offset){\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[2] += offset;\r\n if (hsv[2] > 1) {\r\n hsv[2] = 1;\r\n }\r\n else if (hsv[2] < 0) {\r\n hsv[2] = 0;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nfunction addHueToRGB(color,offset) {\r\n var hsv = RGBtoHSV(color[0]*255,color[1]*255,color[2]*255);\r\n hsv[0] += offset/360;\r\n if (hsv[0] > 1) {\r\n hsv[0] -= 1;\r\n }\r\n else if (hsv[0] < 0) {\r\n hsv[0] += 1;\r\n }\r\n return HSVtoRGB(hsv[0],hsv[1],hsv[2]);\r\n}\r\n\r\nvar rgbToHex = (function(){\r\n var colorMap = [];\r\n var i;\r\n var hex;\r\n for(i=0;i<256;i+=1){\r\n hex = i.toString(16);\r\n colorMap[i] = hex.length == 1 ? '0' + hex : hex;\r\n }\r\n\r\n return function(r, g, b) {\r\n if(r<0){\r\n r = 0;\r\n }\r\n if(g<0){\r\n g = 0;\r\n }\r\n if(b<0){\r\n b = 0;\r\n }\r\n return '#' + colorMap[r] + colorMap[g] + colorMap[b];\r\n };\r\n}());\r\nfunction BaseEvent(){}\r\nBaseEvent.prototype = {\r\n\ttriggerEvent: function (eventName, args) {\r\n\t if (this._cbs[eventName]) {\r\n\t var len = this._cbs[eventName].length;\r\n\t for (var i = 0; i < len; i++){\r\n\t this._cbs[eventName][i](args);\r\n\t }\r\n\t }\r\n\t},\r\n\taddEventListener: function (eventName, callback) {\r\n\t if (!this._cbs[eventName]){\r\n\t this._cbs[eventName] = [];\r\n\t }\r\n\t this._cbs[eventName].push(callback);\r\n\r\n\t\treturn function() {\r\n\t\t\tthis.removeEventListener(eventName, callback);\r\n\t\t}.bind(this);\r\n\t},\r\n\tremoveEventListener: function (eventName,callback){\r\n\t if (!callback){\r\n\t this._cbs[eventName] = null;\r\n\t }else if(this._cbs[eventName]){\r\n\t var i = 0, len = this._cbs[eventName].length;\r\n\t while(i<len){\r\n\t if(this._cbs[eventName][i] === callback){\r\n\t this._cbs[eventName].splice(i,1);\r\n\t i -=1;\r\n\t len -= 1;\r\n\t }\r\n\t i += 1;\r\n\t }\r\n\t if(!this._cbs[eventName].length){\r\n\t this._cbs[eventName] = null;\r\n\t }\r\n\t }\r\n\t}\r\n};\r\nvar createTypedArray = (function(){\r\n\tfunction createRegularArray(type, len){\r\n\t\tvar i = 0, arr = [], value;\r\n\t\tswitch(type) {\r\n\t\t\tcase 'int16':\r\n\t\t\tcase 'uint8c':\r\n\t\t\t\tvalue = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tvalue = 1.1;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tarr.push(value);\r\n\t\t}\r\n\t\treturn arr;\r\n\t}\r\n\tfunction createTypedArray(type, len){\r\n\t\tif(type === 'float32') {\r\n\t\t\treturn new Float32Array(len);\r\n\t\t} else if(type === 'int16') {\r\n\t\t\treturn new Int16Array(len);\r\n\t\t} else if(type === 'uint8c') {\r\n\t\t\treturn new Uint8ClampedArray(len);\r\n\t\t}\r\n\t}\r\n\tif(typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') {\r\n\t\treturn createTypedArray;\r\n\t} else {\r\n\t\treturn createRegularArray;\r\n\t}\r\n}());\r\n\r\nfunction createSizedArray(len) {\r\n\treturn Array.apply(null,{length:len});\r\n}\r\nfunction createNS(type) {\r\n\t//return {appendChild:function(){},setAttribute:function(){},style:{}}\r\n\treturn document.createElementNS(svgNS, type);\r\n}\r\nfunction createTag(type) {\r\n\t//return {appendChild:function(){},setAttribute:function(){},style:{}}\r\n\treturn document.createElement(type);\r\n}\r\nfunction DynamicPropertyContainer(){};\r\nDynamicPropertyContainer.prototype = {\r\n\taddDynamicProperty: function(prop) {\r\n\t\tif(this.dynamicProperties.indexOf(prop) === -1) {\r\n\t this.dynamicProperties.push(prop);\r\n\t this.container.addDynamicProperty(this);\r\n\t \tthis._isAnimated = true;\r\n\t }\r\n\t},\r\n\titerateDynamicProperties: function(){\r\n\t this._mdf = false;\r\n\t var i, len = this.dynamicProperties.length;\r\n\t for(i=0;i<len;i+=1){\r\n\t this.dynamicProperties[i].getValue();\r\n\t if(this.dynamicProperties[i]._mdf) {\r\n\t this._mdf = true;\r\n\t }\r\n\t }\r\n\t},\r\n\tinitDynamicPropertyContainer: function(container){\r\n\t this.container = container;\r\n\t this.dynamicProperties = [];\r\n\t this._mdf = false;\r\n\t this._isAnimated = false;\r\n\t}\r\n}\r\nvar getBlendMode = (function() {\r\n\r\n\tvar blendModeEnums = {\r\n 0:'source-over',\r\n 1:'multiply',\r\n 2:'screen',\r\n 3:'overlay',\r\n 4:'darken',\r\n 5:'lighten',\r\n 6:'color-dodge',\r\n 7:'color-burn',\r\n 8:'hard-light',\r\n 9:'soft-light',\r\n 10:'difference',\r\n 11:'exclusion',\r\n 12:'hue',\r\n 13:'saturation',\r\n 14:'color',\r\n 15:'luminosity'\r\n }\r\n\r\n\treturn function(mode) {\r\n\t\treturn blendModeEnums[mode] || '';\r\n\t}\r\n}())\r\n/*!\r\n Transformation Matrix v2.0\r\n (c) Epistemex 2014-2015\r\n www.epistemex.com\r\n By Ken Fyrstenberg\r\n Contributions by leeoniya.\r\n License: MIT, header required.\r\n */\r\n\r\n/**\r\n * 2D transformation matrix object initialized with identity matrix.\r\n *\r\n * The matrix can synchronize a canvas context by supplying the context\r\n * as an argument, or later apply current absolute transform to an\r\n * existing context.\r\n *\r\n * All values are handled as floating point values.\r\n *\r\n * @param {CanvasRenderingContext2D} [context] - Optional context to sync with Matrix\r\n * @prop {number} a - scale x\r\n * @prop {number} b - shear y\r\n * @prop {number} c - shear x\r\n * @prop {number} d - scale y\r\n * @prop {number} e - translate x\r\n * @prop {number} f - translate y\r\n * @prop {CanvasRenderingContext2D|null} [context=null] - set or get current canvas context\r\n * @constructor\r\n */\r\n\r\nvar Matrix = (function(){\r\n\r\n var _cos = Math.cos;\r\n var _sin = Math.sin;\r\n var _tan = Math.tan;\r\n var _rnd = Math.round;\r\n\r\n function reset(){\r\n this.props[0] = 1;\r\n this.props[1] = 0;\r\n this.props[2] = 0;\r\n this.props[3] = 0;\r\n this.props[4] = 0;\r\n this.props[5] = 1;\r\n this.props[6] = 0;\r\n this.props[7] = 0;\r\n this.props[8] = 0;\r\n this.props[9] = 0;\r\n this.props[10] = 1;\r\n this.props[11] = 0;\r\n this.props[12] = 0;\r\n this.props[13] = 0;\r\n this.props[14] = 0;\r\n this.props[15] = 1;\r\n return this;\r\n }\r\n\r\n function rotate(angle) {\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateX(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(1, 0, 0, 0, 0, mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateY(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, 0, mSin, 0, 0, 1, 0, 0, -mSin, 0, mCos, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function rotateZ(angle){\r\n if(angle === 0){\r\n return this;\r\n }\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function shear(sx,sy){\r\n return this._t(1, sy, sx, 1, 0, 0);\r\n }\r\n\r\n function skew(ax, ay){\r\n return this.shear(_tan(ax), _tan(ay));\r\n }\r\n\r\n function skewFromAxis(ax, angle){\r\n var mCos = _cos(angle);\r\n var mSin = _sin(angle);\r\n return this._t(mCos, mSin, 0, 0, -mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)\r\n ._t(1, 0, 0, 0, _tan(ax), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)\r\n ._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\r\n //return this._t(mCos, mSin, -mSin, mCos, 0, 0)._t(1, 0, _tan(ax), 1, 0, 0)._t(mCos, -mSin, mSin, mCos, 0, 0);\r\n }\r\n\r\n function scale(sx, sy, sz) {\r\n if(!sz && sz !== 0) {\r\n sz = 1;\r\n }\r\n if(sx === 1 && sy === 1 && sz === 1){\r\n return this;\r\n }\r\n return this._t(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1);\r\n }\r\n\r\n function setTransform(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {\r\n this.props[0] = a;\r\n this.props[1] = b;\r\n this.props[2] = c;\r\n this.props[3] = d;\r\n this.props[4] = e;\r\n this.props[5] = f;\r\n this.props[6] = g;\r\n this.props[7] = h;\r\n this.props[8] = i;\r\n this.props[9] = j;\r\n this.props[10] = k;\r\n this.props[11] = l;\r\n this.props[12] = m;\r\n this.props[13] = n;\r\n this.props[14] = o;\r\n this.props[15] = p;\r\n return this;\r\n }\r\n\r\n function translate(tx, ty, tz) {\r\n tz = tz || 0;\r\n if(tx !== 0 || ty !== 0 || tz !== 0){\r\n return this._t(1,0,0,0,0,1,0,0,0,0,1,0,tx,ty,tz,1);\r\n }\r\n return this;\r\n }\r\n\r\n function transform(a2, b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2) {\r\n\r\n var _p = this.props;\r\n\r\n if(a2 === 1 && b2 === 0 && c2 === 0 && d2 === 0 && e2 === 0 && f2 === 1 && g2 === 0 && h2 === 0 && i2 === 0 && j2 === 0 && k2 === 1 && l2 === 0){\r\n //NOTE: commenting this condition because TurboFan deoptimizes code when present\r\n //if(m2 !== 0 || n2 !== 0 || o2 !== 0){\r\n _p[12] = _p[12] * a2 + _p[15] * m2;\r\n _p[13] = _p[13] * f2 + _p[15] * n2;\r\n _p[14] = _p[14] * k2 + _p[15] * o2;\r\n _p[15] = _p[15] * p2;\r\n //}\r\n this._identityCalculated = false;\r\n return this;\r\n }\r\n\r\n var a1 = _p[0];\r\n var b1 = _p[1];\r\n var c1 = _p[2];\r\n var d1 = _p[3];\r\n var e1 = _p[4];\r\n var f1 = _p[5];\r\n var g1 = _p[6];\r\n var h1 = _p[7];\r\n var i1 = _p[8];\r\n var j1 = _p[9];\r\n var k1 = _p[10];\r\n var l1 = _p[11];\r\n var m1 = _p[12];\r\n var n1 = _p[13];\r\n var o1 = _p[14];\r\n var p1 = _p[15];\r\n\r\n /* matrix order (canvas compatible):\r\n * ace\r\n * bdf\r\n * 001\r\n */\r\n _p[0] = a1 * a2 + b1 * e2 + c1 * i2 + d1 * m2;\r\n _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2 ;\r\n _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2 ;\r\n _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2 ;\r\n\r\n _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2 ;\r\n _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2 ;\r\n _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2 ;\r\n _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2 ;\r\n\r\n _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2 ;\r\n _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2 ;\r\n _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2 ;\r\n _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2 ;\r\n\r\n _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2 ;\r\n _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2 ;\r\n _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;\r\n _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;\r\n\r\n this._identityCalculated = false;\r\n return this;\r\n }\r\n\r\n function isIdentity() {\r\n if(!this._identityCalculated){\r\n this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0 || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0 || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0 || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);\r\n this._identityCalculated = true;\r\n }\r\n return this._identity;\r\n }\r\n\r\n function equals(matr){\r\n var i = 0;\r\n while (i < 16) {\r\n if(matr.props[i] !== this.props[i]) {\r\n return false;\r\n }\r\n i+=1;\r\n }\r\n return true;\r\n }\r\n\r\n function clone(matr){\r\n var i;\r\n for(i=0;i<16;i+=1){\r\n matr.props[i] = this.props[i];\r\n }\r\n }\r\n\r\n function cloneFromProps(props){\r\n var i;\r\n for(i=0;i<16;i+=1){\r\n this.props[i] = props[i];\r\n }\r\n }\r\n\r\n function applyToPoint(x, y, z) {\r\n\r\n return {\r\n x: x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],\r\n y: x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],\r\n z: x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]\r\n };\r\n /*return {\r\n x: x * me.a + y * me.c + me.e,\r\n y: x * me.b + y * me.d + me.f\r\n };*/\r\n }\r\n function applyToX(x, y, z) {\r\n return x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12];\r\n }\r\n function applyToY(x, y, z) {\r\n return x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13];\r\n }\r\n function applyToZ(x, y, z) {\r\n return x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14];\r\n }\r\n\r\n function inversePoint(pt) {\r\n var determinant = this.props[0] * this.props[5] - this.props[1] * this.props[4];\r\n var a = this.props[5]/determinant;\r\n var b = - this.props[1]/determinant;\r\n var c = - this.props[4]/determinant;\r\n var d = this.props[0]/determinant;\r\n var e = (this.props[4] * this.props[13] - this.props[5] * this.props[12])/determinant;\r\n var f = - (this.props[0] * this.props[13] - this.props[1] * this.props[12])/determinant;\r\n return [pt[0] * a + pt[1] * c + e, pt[0] * b + pt[1] * d + f, 0];\r\n }\r\n\r\n function inversePoints(pts){\r\n var i, len = pts.length, retPts = [];\r\n for(i=0;i<len;i+=1){\r\n retPts[i] = inversePoint(pts[i]);\r\n }\r\n return retPts;\r\n }\r\n\r\n function applyToTriplePoints(pt1, pt2, pt3) {\r\n var arr = createTypedArray('float32', 6);\r\n if(this.isIdentity()) {\r\n arr[0] = pt1[0];\r\n arr[1] = pt1[1];\r\n arr[2] = pt2[0];\r\n arr[3] = pt2[1];\r\n arr[4] = pt3[0];\r\n arr[5] = pt3[1];\r\n } else {\r\n var p0 = this.props[0], p1 = this.props[1], p4 = this.props[4], p5 = this.props[5], p12 = this.props[12], p13 = this.props[13];\r\n arr[0] = pt1[0] * p0 + pt1[1] * p4 + p12;\r\n arr[1] = pt1[0] * p1 + pt1[1] * p5 + p13;\r\n arr[2] = pt2[0] * p0 + pt2[1] * p4 + p12;\r\n arr[3] = pt2[0] * p1 + pt2[1] * p5 + p13;\r\n arr[4] = pt3[0] * p0 + pt3[1] * p4 + p12;\r\n arr[5] = pt3[0] * p1 + pt3[1] * p5 + p13;\r\n }\r\n return arr;\r\n }\r\n\r\n function applyToPointArray(x,y,z){\r\n var arr;\r\n if(this.isIdentity()) {\r\n arr = [x,y,z];\r\n } else {\r\n arr = [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];\r\n }\r\n return arr;\r\n }\r\n\r\n function applyToPointStringified(x, y) {\r\n if(this.isIdentity()) {\r\n return x + ',' + y;\r\n }\r\n var _p = this.props;\r\n return Math.round((x * _p[0] + y * _p[4] + _p[12]) * 100) / 100+','+ Math.round((x * _p[1] + y * _p[5] + _p[13]) * 100) / 100;\r\n }\r\n\r\n function toCSS() {\r\n //Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\r\n /*if(this.isIdentity()) {\r\n return '';\r\n }*/\r\n var i = 0;\r\n var props = this.props;\r\n var cssValue = 'matrix3d(';\r\n var v = 10000;\r\n while(i<16){\r\n cssValue += _rnd(props[i]*v)/v;\r\n cssValue += i === 15 ? ')':',';\r\n i += 1;\r\n }\r\n return cssValue;\r\n }\r\n\r\n function roundMatrixProperty(val) {\r\n var v = 10000;\r\n if((val < 0.000001 && val > 0) || (val > -0.000001 && val < 0)) {\r\n return _rnd(val * v) / v;\r\n }\r\n return val;\r\n }\r\n\r\n function to2dCSS() {\r\n //Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed.\r\n /*if(this.isIdentity()) {\r\n return '';\r\n }*/\r\n var props = this.props;\r\n var _a = roundMatrixProperty(props[0]);\r\n var _b = roundMatrixProperty(props[1]);\r\n var _c = roundMatrixProperty(props[4]);\r\n var _d = roundMatrixProperty(props[5]);\r\n var _e = roundMatrixProperty(props[12]);\r\n var _f = roundMatrixProperty(props[13]);\r\n return \"matrix(\" + _a + ',' + _b + ',' + _c + ',' + _d + ',' + _e + ',' + _f + \")\";\r\n }\r\n\r\n return function(){\r\n this.reset = reset;\r\n this.rotate = rotate;\r\n this.rotateX = rotateX;\r\n this.rotateY = rotateY;\r\n this.rotateZ = rotateZ;\r\n this.skew = skew;\r\n this.skewFromAxis = skewFromAxis;\r\n this.shear = shear;\r\n this.scale = scale;\r\n this.setTransform = setTransform;\r\n this.translate = translate;\r\n this.transform = transform;\r\n this.applyToPoint = applyToPoint;\r\n this.applyToX = applyToX;\r\n this.applyToY = applyToY;\r\n this.applyToZ = applyToZ;\r\n this.applyToPointArray = applyToPointArray;\r\n this.applyToTriplePoints = applyToTriplePoints;\r\n this.applyToPointStringified = applyToPointStringified;\r\n this.toCSS = toCSS;\r\n this.to2dCSS = to2dCSS;\r\n this.clone = clone;\r\n this.cloneFromProps = cloneFromProps;\r\n this.equals = equals;\r\n this.inversePoints = inversePoints;\r\n this.inversePoint = inversePoint;\r\n this._t = this.transform;\r\n this.isIdentity = isIdentity;\r\n this._identity = true;\r\n this._identityCalculated = false;\r\n\r\n this.props = createTypedArray('float32', 16);\r\n this.reset();\r\n };\r\n}());\r\n\r\n/*\r\n Copyright 2014 David Bau.\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining\r\n a copy of this software and associated documentation files (the\r\n \"Software\"), to deal in the Software without restriction, including\r\n without limitation the rights to use, copy, modify, merge, publish,\r\n distribute, sublicense, and/or sell copies of the Software, and to\r\n permit persons to whom the Software is furnished to do so, subject to\r\n the following conditions:\r\n\r\n The above copyright notice and this permission notice shall be\r\n included in all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n */\r\n\r\n(function (pool, math) {\r\n//\r\n// The following constants are related to IEEE 754 limits.\r\n//\r\n var global = this,\r\n width = 256, // each RC4 output is 0 <= x < 256\r\n chunks = 6, // at least six RC4 outputs for each double\r\n digits = 52, // there are 52 significant digits in a double\r\n rngname = 'random', // rngname: name for Math.random and Math.seedrandom\r\n startdenom = math.pow(width, chunks),\r\n significance = math.pow(2, digits),\r\n overflow = significance * 2,\r\n mask = width - 1,\r\n nodecrypto; // node.js crypto module, initialized at the bottom.\r\n\r\n//\r\n// seedrandom()\r\n// This is the seedrandom function described above.\r\n//\r\n function seedrandom(seed, options, callback) {\r\n var key = [];\r\n options = (options === true) ? { entropy: true } : (options || {});\r\n\r\n // Flatten the seed string or build one from local entropy if needed.\r\n var shortseed = mixkey(flatten(\r\n options.entropy ? [seed, tostring(pool)] :\r\n (seed === null) ? autoseed() : seed, 3), key);\r\n\r\n // Use the seed to initialize an ARC4 generator.\r\n var arc4 = new ARC4(key);\r\n\r\n // This function returns a random double in [0, 1) that contains\r\n // randomness in every bit of the mantissa of the IEEE 754 value.\r\n var prng = function() {\r\n var n = arc4.g(chunks), // Start with a numerator n < 2 ^ 48\r\n d = startdenom, // and denominator d = 2 ^ 48.\r\n x = 0; // and no 'extra last byte'.\r\n while (n < significance) { // Fill up all significant digits by\r\n n = (n + x) * width; // shifting numerator and\r\n d *= width; // denominator and generating a\r\n x = arc4.g(1); // new least-significant-byte.\r\n }\r\n while (n >= overflow) { // To avoid rounding up, before adding\r\n n /= 2; // last byte, shift everything\r\n d /= 2; // right using integer math until\r\n x >>>= 1; // we have exactly the desired bits.\r\n }\r\n return (n + x) / d; // Form the number within [0, 1).\r\n };\r\n\r\n prng.int32 = function() { return arc4.g(4) | 0; };\r\n prng.quick = function() { return arc4.g(4) / 0x100000000; };\r\n prng.double = prng;\r\n\r\n // Mix the randomness into accumulated entropy.\r\n mixkey(tostring(arc4.S), pool);\r\n\r\n // Calling convention: what to return as a function of prng, seed, is_math.\r\n return (options.pass || callback ||\r\n function(prng, seed, is_math_call, state) {\r\n if (state) {\r\n // Load the arc4 state from the given state if it has an S array.\r\n if (state.S) { copy(state, arc4); }\r\n // Only provide the .state method if requested via options.state.\r\n prng.state = function() { return copy(arc4, {}); };\r\n }\r\n\r\n // If called as a method of Math (Math.seedrandom()), mutate\r\n // Math.random because that is how seedrandom.js has worked since v1.0.\r\n if (is_math_call) { math[rngname] = prng; return seed; }\r\n\r\n // Otherwise, it is a newer calling convention, so return the\r\n // prng directly.\r\n else return prng;\r\n })(\r\n prng,\r\n shortseed,\r\n 'global' in options ? options.global : (this == math),\r\n options.state);\r\n }\r\n math['seed' + rngname] = seedrandom;\r\n\r\n//\r\n// ARC4\r\n//\r\n// An ARC4 implementation. The constructor takes a key in the form of\r\n// an array of at most (width) integers that should be 0 <= x < (width).\r\n//\r\n// The g(count) method returns a pseudorandom integer that concatenates\r\n// the next (count) outputs from ARC4. Its return value is a number x\r\n// that is in the range 0 <= x < (width ^ count).\r\n//\r\n function ARC4(key) {\r\n var t, keylen = key.length,\r\n me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\r\n\r\n // The empty key [] is treated as [0].\r\n if (!keylen) { key = [keylen++]; }\r\n\r\n // Set up S using the standard key scheduling algorithm.\r\n while (i < width) {\r\n s[i] = i++;\r\n }\r\n for (i = 0; i < width; i++) {\r\n s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\r\n s[j] = t;\r\n }\r\n\r\n // The \"g\" method returns the next (count) outputs as one number.\r\n me.g = function(count) {\r\n // Using instance members instead of closure state nearly doubles speed.\r\n var t, r = 0,\r\n i = me.i, j = me.j, s = me.S;\r\n while (count--) {\r\n t = s[i = mask & (i + 1)];\r\n r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\r\n }\r\n me.i = i; me.j = j;\r\n return r;\r\n // For robust unpredictability, the function call below automatically\r\n // discards an initial batch of values. This is called RC4-drop[256].\r\n // See http://google.com/search?q=rsa+fluhrer+response&btnI\r\n };\r\n }\r\n\r\n//\r\n// copy()\r\n// Copies internal state of ARC4 to or from a plain object.\r\n//\r\n function copy(f, t) {\r\n t.i = f.i;\r\n t.j = f.j;\r\n t.S = f.S.slice();\r\n return t;\r\n }\r\n\r\n//\r\n// flatten()\r\n// Converts an object tree to nested arrays of strings.\r\n//\r\n function flatten(obj, depth) {\r\n var result = [], typ = (typeof obj), prop;\r\n if (depth && typ == 'object') {\r\n for (prop in obj) {\r\n try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\r\n }\r\n }\r\n return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\r\n }\r\n\r\n//\r\n// mixkey()\r\n// Mixes a string seed into a key that is an array of integers, and\r\n// returns a shortened string seed that is equivalent to the result key.\r\n//\r\n function mixkey(seed, key) {\r\n var stringseed = seed + '', smear, j = 0;\r\n while (j < stringseed.length) {\r\n key[mask & j] =\r\n mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\r\n }\r\n return tostring(key);\r\n }\r\n\r\n//\r\n// autoseed()\r\n// Returns an object for autoseeding, using window.crypto and Node crypto\r\n// module if available.\r\n//\r\n function autoseed() {\r\n try {\r\n if (nodecrypto) { return tostring(nodecrypto.randomBytes(width)); }\r\n var out = new Uint8Array(width);\r\n (global.crypto || global.msCrypto).getRandomValues(out);\r\n return tostring(out);\r\n } catch (e) {\r\n var browser = global.navigator,\r\n plugins = browser && browser.plugins;\r\n return [+new Date(), global, plugins, global.screen, tostring(pool)];\r\n }\r\n }\r\n\r\n//\r\n// tostring()\r\n// Converts an array of charcodes to a string\r\n//\r\n function tostring(a) {\r\n return String.fromCharCode.apply(0, a);\r\n }\r\n\r\n//\r\n// When seedrandom.js is loaded, we immediately mix a few bits\r\n// from the built-in RNG into the entropy pool. Because we do\r\n// not want to interfere with deterministic PRNG state later,\r\n// seedrandom will not call math.random on its own again after\r\n// initialization.\r\n//\r\n mixkey(math.random(), pool);\r\n\r\n//\r\n// Nodejs and AMD support: export the implementation as a module using\r\n// either convention.\r\n//\r\n\r\n// End anonymous scope, and pass initial values.\r\n})(\r\n [], // pool: entropy pool starts empty\r\n BMMath // math: package containing random, pow, and seedrandom\r\n);\r\nvar BezierFactory = (function(){\r\n /**\r\n * BezierEasing - use bezier curve for transition easing function\r\n * by Gaëtan Renaudeau 2014 - 2015 MIT License\r\n *\r\n * Credits: is based on Firefox's nsSMILKeySpline.cpp\r\n * Usage:\r\n * var spline = BezierEasing([ 0.25, 0.1, 0.25, 1.0 ])\r\n * spline.get(x) => returns the easing value | x must be in [0, 1] range\r\n *\r\n */\r\n\r\n var ob = {};\r\n ob.getBezierEasing = getBezierEasing;\r\n var beziers = {};\r\n\r\n function getBezierEasing(a,b,c,d,nm){\r\n var str = nm || ('bez_' + a+'_'+b+'_'+c+'_'+d).replace(/\\./g, 'p');\r\n if(beziers[str]){\r\n return beziers[str];\r\n }\r\n var bezEasing = new BezierEasing([a,b,c,d]);\r\n beziers[str] = bezEasing;\r\n return bezEasing;\r\n }\r\n\r\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\r\n var NEWTON_ITERATIONS = 4;\r\n var NEWTON_MIN_SLOPE = 0.001;\r\n var SUBDIVISION_PRECISION = 0.0000001;\r\n var SUBDIVISION_MAX_ITERATIONS = 10;\r\n\r\n var kSplineTableSize = 11;\r\n var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\r\n\r\n var float32ArraySupported = typeof Float32Array === \"function\";\r\n\r\n function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\r\n function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\r\n function C (aA1) { return 3.0 * aA1; }\r\n\r\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\r\n function calcBezier (aT, aA1, aA2) {\r\n return ((A(aA1, aA2)*aT + B(aA1, aA2))*aT + C(aA1))*aT;\r\n }\r\n\r\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\r\n function getSlope (aT, aA1, aA2) {\r\n return 3.0 * A(aA1, aA2)*aT*aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\r\n }\r\n\r\n function binarySubdivide (aX, aA, aB, mX1, mX2) {\r\n var currentX, currentT, i = 0;\r\n do {\r\n currentT = aA + (aB - aA) / 2.0;\r\n currentX = calcBezier(currentT, mX1, mX2) - aX;\r\n if (currentX > 0.0) {\r\n aB = currentT;\r\n } else {\r\n aA = currentT;\r\n }\r\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\r\n return currentT;\r\n }\r\n\r\n function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\r\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\r\n var currentSlope = getSlope(aGuessT, mX1, mX2);\r\n if (currentSlope === 0.0) return aGuessT;\r\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\r\n aGuessT -= currentX / currentSlope;\r\n }\r\n return aGuessT;\r\n }\r\n\r\n /**\r\n * points is an array of [ mX1, mY1, mX2, mY2 ]\r\n */\r\n function BezierEasing (points) {\r\n this._p = points;\r\n this._mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\r\n this._precomputed = false;\r\n\r\n this.get = this.get.bind(this);\r\n }\r\n\r\n BezierEasing.prototype = {\r\n\r\n get: function (x) {\r\n var mX1 = this._p[0],\r\n mY1 = this._p[1],\r\n mX2 = this._p[2],\r\n mY2 = this._p[3];\r\n if (!this._precomputed) this._precompute();\r\n if (mX1 === mY1 && mX2 === mY2) return x; // linear\r\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\r\n if (x === 0) return 0;\r\n if (x === 1) return 1;\r\n return calcBezier(this._getTForX(x), mY1, mY2);\r\n },\r\n\r\n // Private part\r\n\r\n _precompute: function () {\r\n var mX1 = this._p[0],\r\n mY1 = this._p[1],\r\n mX2 = this._p[2],\r\n mY2 = this._p[3];\r\n this._precomputed = true;\r\n if (mX1 !== mY1 || mX2 !== mY2)\r\n this._calcSampleValues();\r\n },\r\n\r\n _calcSampleValues: function () {\r\n var mX1 = this._p[0],\r\n mX2 = this._p[2];\r\n for (var i = 0; i < kSplineTableSize; ++i) {\r\n this._mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\r\n }\r\n },\r\n\r\n /**\r\n * getTForX chose the fastest heuristic to determine the percentage value precisely from a given X projection.\r\n */\r\n _getTForX: function (aX) {\r\n var mX1 = this._p[0],\r\n mX2 = this._p[2],\r\n mSampleValues = this._mSampleValues;\r\n\r\n var intervalStart = 0.0;\r\n var currentSample = 1;\r\n var lastSample = kSplineTableSize - 1;\r\n\r\n for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\r\n intervalStart += kSampleStepSize;\r\n }\r\n --currentSample;\r\n\r\n // Interpolate to provide an initial guess for t\r\n var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample+1] - mSampleValues[currentSample]);\r\n var guessForT = intervalStart + dist * kSampleStepSize;\r\n\r\n var initialSlope = getSlope(guessForT, mX1, mX2);\r\n if (initialSlope >= NEWTON_MIN_SLOPE) {\r\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\r\n } else if (initialSlope === 0.0) {\r\n return guessForT;\r\n } else {\r\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\r\n }\r\n }\r\n };\r\n\r\n return ob;\r\n\r\n}());\r\n(function () {\r\n var lastTime = 0;\r\n var vendors = ['ms', 'moz', 'webkit', 'o'];\r\n for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\r\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\r\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\r\n }\r\n if(!window.requestAnimationFrame)\r\n window.requestAnimationFrame = function (callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function () {\r\n callback(currTime + timeToCall);\r\n },\r\n timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n if(!window.cancelAnimationFrame)\r\n window.cancelAnimationFrame = function (id) {\r\n clearTimeout(id);\r\n };\r\n}());\r\n\r\nfunction extendPrototype(sources,destination){\r\n var i, len = sources.length, sourcePrototype;\r\n for (i = 0;i < len;i += 1) {\r\n sourcePrototype = sources[i].prototype;\r\n for (var attr in sourcePrototype) {\r\n if (sourcePrototype.hasOwnProperty(attr)) destination.prototype[attr] = sourcePrototype[attr];\r\n }\r\n }\r\n}\r\n\r\nfunction getDescriptor(object, prop) {\r\n return Object.getOwnPropertyDescriptor(object, prop);\r\n}\r\n\r\nfunction createProxyFunction(prototype) {\r\n\tfunction ProxyFunction(){}\r\n\tProxyFunction.prototype = prototype;\r\n\treturn ProxyFunction;\r\n}\r\nfunction bezFunction(){\r\n\r\n var easingFunctions = [];\r\n var math = Math;\r\n\r\n function pointOnLine2D(x1,y1, x2,y2, x3,y3){\r\n var det1 = (x1*y2) + (y1*x3) + (x2*y3) - (x3*y2) - (y3*x1) - (x2*y1);\r\n return det1 > -0.001 && det1 < 0.001;\r\n }\r\n\r\n function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){\r\n if(z1 === 0 && z2 === 0 && z3 === 0) {\r\n return pointOnLine2D(x1,y1, x2,y2, x3,y3);\r\n }\r\n var dist1 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2));\r\n var dist2 = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2) + Math.pow(z3 - z1, 2));\r\n var dist3 = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2) + Math.pow(z3 - z2, 2));\r\n var diffDist;\r\n if(dist1 > dist2){\r\n if(dist1 > dist3){\r\n diffDist = dist1 - dist2 - dist3;\r\n } else {\r\n diffDist = dist3 - dist2 - dist1;\r\n }\r\n } else if(dist3 > dist2){\r\n diffDist = dist3 - dist2 - dist1;\r\n } else {\r\n diffDist = dist2 - dist1 - dist3;\r\n }\r\n return diffDist > -0.0001 && diffDist < 0.0001;\r\n }\r\n\r\n var getBezierLength = (function(){\r\n\r\n return function(pt1,pt2,pt3,pt4){\r\n var curveSegments = defaultCurveSegments;\r\n var k;\r\n var i, len;\r\n var ptCoord,perc,addedLength = 0;\r\n var ptDistance;\r\n var point = [],lastPoint = [];\r\n var lengthData = bezier_length_pool.newElement();\r\n len = pt3.length;\r\n for(k=0;k<curveSegments;k+=1){\r\n perc = k/(curveSegments-1);\r\n ptDistance = 0;\r\n for(i=0;i<len;i+=1){\r\n ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*pt3[i]+3*(1-perc)*bm_pow(perc,2)*pt4[i]+bm_pow(perc,3)*pt2[i];\r\n point[i] = ptCoord;\r\n if(lastPoint[i] !== null){\r\n ptDistance += bm_pow(point[i] - lastPoint[i],2);\r\n }\r\n lastPoint[i] = point[i];\r\n }\r\n if(ptDistance){\r\n ptDistance = bm_sqrt(ptDistance);\r\n addedLength += ptDistance;\r\n }\r\n lengthData.percents[k] = perc;\r\n lengthData.lengths[k] = addedLength;\r\n }\r\n lengthData.addedLength = addedLength;\r\n return lengthData;\r\n };\r\n }());\r\n\r\n function getSegmentsLength(shapeData) {\r\n var segmentsLength = segments_length_pool.newElement();\r\n var closed = shapeData.c;\r\n var pathV = shapeData.v;\r\n var pathO = shapeData.o;\r\n var pathI = shapeData.i;\r\n var i, len = shapeData._length;\r\n var lengths = segmentsLength.lengths;\r\n var totalLength = 0;\r\n for(i=0;i<len-1;i+=1){\r\n lengths[i] = getBezierLength(pathV[i],pathV[i+1],pathO[i],pathI[i+1]);\r\n totalLength += lengths[i].addedLength;\r\n }\r\n if(closed && len){\r\n lengths[i] = getBezierLength(pathV[i],pathV[0],pathO[i],pathI[0]);\r\n totalLength += lengths[i].addedLength;\r\n }\r\n segmentsLength.totalLength = totalLength;\r\n return segmentsLength;\r\n }\r\n\r\n function BezierData(length){\r\n this.segmentLength = 0;\r\n this.points = new Array(length);\r\n }\r\n\r\n function PointData(partial,point){\r\n this.partialLength = partial;\r\n this.point = point;\r\n }\r\n\r\n var buildBezierData = (function(){\r\n\r\n var storedData = {};\r\n\r\n return function (pt1, pt2, pt3, pt4){\r\n var bezierName = (pt1[0]+'_'+pt1[1]+'_'+pt2[0]+'_'+pt2[1]+'_'+pt3[0]+'_'+pt3[1]+'_'+pt4[0]+'_'+pt4[1]).replace(/\\./g, 'p');\r\n if(!storedData[bezierName]){\r\n var curveSegments = defaultCurveSegments;\r\n var k, i, len;\r\n var ptCoord,perc,addedLength = 0;\r\n var ptDistance;\r\n var point,lastPoint = null;\r\n if (pt1.length === 2 && (pt1[0] != pt2[0] || pt1[1] != pt2[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){\r\n curveSegments = 2;\r\n }\r\n var bezierData = new BezierData(curveSegments);\r\n len = pt3.length;\r\n for (k = 0; k < curveSegments; k += 1) {\r\n point = createSizedArray(len);\r\n perc = k / (curveSegments - 1);\r\n ptDistance = 0;\r\n for (i = 0; i < len; i += 1){\r\n ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*(pt1[i] + pt3[i])+3*(1-perc)*bm_pow(perc,2)*(pt2[i] + pt4[i])+bm_pow(perc,3)*pt2[i];\r\n point[i] = ptCoord;\r\n if(lastPoint !== null){\r\n ptDistance += bm_pow(point[i] - lastPoint[i],2);\r\n }\r\n }\r\n ptDistance = bm_sqrt(ptDistance);\r\n addedLength += ptDistance;\r\n bezierData.points[k] = new PointData(ptDistance, point);\r\n lastPoint = point;\r\n }\r\n bezierData.segmentLength = addedLength;\r\n storedData[bezierName] = bezierData;\r\n }\r\n return storedData[bezierName];\r\n };\r\n }());\r\n\r\n function getDistancePerc(perc,bezierData){\r\n var percents = bezierData.percents;\r\n var lengths = bezierData.lengths;\r\n var len = percents.length;\r\n var initPos = bm_floor((len-1)*perc);\r\n var lengthPos = perc*bezierData.addedLength;\r\n var lPerc = 0;\r\n if(initPos === len - 1 || initPos === 0 || lengthPos === lengths[initPos]){\r\n return percents[initPos];\r\n }else{\r\n var dir = lengths[initPos] > lengthPos ? -1 : 1;\r\n var flag = true;\r\n while(flag){\r\n if(lengths[initPos] <= lengthPos && lengths[initPos+1] > lengthPos){\r\n lPerc = (lengthPos - lengths[initPos]) / (lengths[initPos+1] - lengths[initPos]);\r\n flag = false;\r\n }else{\r\n initPos += dir;\r\n }\r\n if(initPos < 0 || initPos >= len - 1){\r\n //FIX for TypedArrays that don't store floating point values with enough accuracy\r\n if(initPos === len - 1) {\r\n return percents[initPos];\r\n }\r\n flag = false;\r\n }\r\n }\r\n return percents[initPos] + (percents[initPos+1] - percents[initPos])*lPerc;\r\n }\r\n }\r\n\r\n function getPointInSegment(pt1, pt2, pt3, pt4, percent, bezierData) {\r\n var t1 = getDistancePerc(percent,bezierData);\r\n var u0 = 1;\r\n var u1 = 1 - t1;\r\n var ptX = Math.round((u1*u1*u1* pt1[0] + (t1*u1*u1 + u1*t1*u1 + u1*u1*t1)* pt3[0] + (t1*t1*u1 + u1*t1*t1 + t1*u1*t1)*pt4[0] + t1*t1*t1* pt2[0])* 1000) / 1000;\r\n var ptY = Math.round((u1*u1*u1* pt1[1] + (t1*u1*u1 + u1*t1*u1 + u1*u1*t1)* pt3[1] + (t1*t1*u1 + u1*t1*t1 + t1*u1*t1)*pt4[1] + t1*t1*t1* pt2[1])* 1000) / 1000;\r\n return [ptX, ptY];\r\n }\r\n\r\n function getSegmentArray() {\r\n\r\n }\r\n\r\n var bezier_segment_points = createTypedArray('float32', 8);\r\n\r\n function getNewSegment(pt1,pt2,pt3,pt4,startPerc,endPerc, bezierData){\r\n\r\n startPerc = startPerc < 0 ? 0 : startPerc > 1 ? 1 : startPerc;\r\n var t0 = getDistancePerc(startPerc,bezierData);\r\n endPerc = endPerc > 1 ? 1 : endPerc;\r\n var t1 = getDistancePerc(endPerc,bezierData);\r\n var i, len = pt1.length;\r\n var u0 = 1 - t0;\r\n var u1 = 1 - t1;\r\n var u0u0u0 = u0*u0*u0;\r\n var t0u0u0_3 = t0*u0*u0*3;\r\n var t0t0u0_3 = t0*t0*u0*3;\r\n var t0t0t0 = t0*t0*t0;\r\n //\r\n var u0u0u1 = u0*u0*u1;\r\n var t0u0u1_3 = t0*u0*u1 + u0*t0*u1 + u0*u0*t1;\r\n var t0t0u1_3 = t0*t0*u1 + u0*t0*t1 + t0*u0*t1;\r\n var t0t0t1 = t0*t0*t1;\r\n //\r\n var u0u1u1 = u0*u1*u1;\r\n var t0u1u1_3 = t0*u1*u1 + u0*t1*u1 + u0*u1*t1;\r\n var t0t1u1_3 = t0*t1*u1 + u0*t1*t1 + t0*u1*t1;\r\n var t0t1t1 = t0*t1*t1;\r\n //\r\n var u1u1u1 = u1*u1*u1;\r\n var t1u1u1_3 = t1*u1*u1 + u1*t1*u1 + u1*u1*t1;\r\n var t1t1u1_3 = t1*t1*u1 + u1*t1*t1 + t1*u1*t1;\r\n var t1t1t1 = t1*t1*t1;\r\n for(i=0;i<len;i+=1){\r\n bezier_segment_points[i * 4] = Math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 1] = Math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 2] = Math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000;\r\n bezier_segment_points[i * 4 + 3] = Math.round((u1u1u1 * pt1[i] + t1u1u1_3 * pt3[i] + t1t1u1_3 * pt4[i] + t1t1t1 * pt2[i]) * 1000) / 1000;\r\n }\r\n\r\n return bezier_segment_points;\r\n }\r\n\r\n return {\r\n getSegmentsLength : getSegmentsLength,\r\n getNewSegment : getNewSegment,\r\n getPointInSegment : getPointInSegment,\r\n buildBezierData : buildBezierData,\r\n pointOnLine2D : pointOnLine2D,\r\n pointOnLine3D : pointOnLine3D\r\n };\r\n}\r\n\r\nvar bez = bezFunction();\r\nfunction dataFunctionManager(){\r\n\r\n //var tCanvasHelper = createTag('canvas').getContext('2d');\r\n\r\n function completeLayers(layers, comps, fontManager){\r\n var layerData;\r\n var animArray, lastFrame;\r\n var i, len = layers.length;\r\n var j, jLen, k, kLen;\r\n for(i=0;i<len;i+=1){\r\n layerData = layers[i];\r\n if(!('ks' in layerData) || layerData.completed){\r\n continue;\r\n }\r\n layerData.completed = true;\r\n if(layerData.tt){\r\n layers[i-1].td = layerData.tt;\r\n }\r\n animArray = [];\r\n lastFrame = -1;\r\n if(layerData.hasMask){\r\n var maskProps = layerData.masksProperties;\r\n jLen = maskProps.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(maskProps[j].pt.k.i){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k);\r\n }else{\r\n kLen = maskProps[j].pt.k.length;\r\n for(k=0;k<kLen;k+=1){\r\n if(maskProps[j].pt.k[k].s){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);\r\n }\r\n if(maskProps[j].pt.k[k].e){\r\n convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if(layerData.ty===0){\r\n layerData.layers = findCompLayers(layerData.refId, comps);\r\n completeLayers(layerData.layers,comps, fontManager);\r\n }else if(layerData.ty === 4){\r\n completeShapes(layerData.shapes);\r\n }else if(layerData.ty == 5){\r\n completeText(layerData, fontManager);\r\n }\r\n }\r\n }\r\n\r\n function findCompLayers(id,comps){\r\n var i = 0, len = comps.length;\r\n while(i<len){\r\n if(comps[i].id === id){\r\n if(!comps[i].layers.__used) {\r\n comps[i].layers.__used = true;\r\n return comps[i].layers;\r\n }\r\n return JSON.parse(JSON.stringify(comps[i].layers));\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function completeShapes(arr){\r\n var i, len = arr.length;\r\n var j, jLen;\r\n var hasPaths = false;\r\n for(i=len-1;i>=0;i-=1){\r\n if(arr[i].ty == 'sh'){\r\n if(arr[i].ks.k.i){\r\n convertPathsToAbsoluteValues(arr[i].ks.k);\r\n }else{\r\n jLen = arr[i].ks.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(arr[i].ks.k[j].s){\r\n convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);\r\n }\r\n if(arr[i].ks.k[j].e){\r\n convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]);\r\n }\r\n }\r\n }\r\n hasPaths = true;\r\n }else if(arr[i].ty == 'gr'){\r\n completeShapes(arr[i].it);\r\n }\r\n }\r\n /*if(hasPaths){\r\n //mx: distance\r\n //ss: sensitivity\r\n //dc: decay\r\n arr.splice(arr.length-1,0,{\r\n \"ty\": \"ms\",\r\n \"mx\":20,\r\n \"ss\":10,\r\n \"dc\":0.001,\r\n \"maxDist\":200\r\n });\r\n }*/\r\n }\r\n\r\n function convertPathsToAbsoluteValues(path){\r\n var i, len = path.i.length;\r\n for(i=0;i<len;i+=1){\r\n path.i[i][0] += path.v[i][0];\r\n path.i[i][1] += path.v[i][1];\r\n path.o[i][0] += path.v[i][0];\r\n path.o[i][1] += path.v[i][1];\r\n }\r\n }\r\n\r\n function checkVersion(minimum,animVersionString){\r\n var animVersion = animVersionString ? animVersionString.split('.') : [100,100,100];\r\n if(minimum[0]>animVersion[0]){\r\n return true;\r\n } else if(animVersion[0] > minimum[0]){\r\n return false;\r\n }\r\n if(minimum[1]>animVersion[1]){\r\n return true;\r\n } else if(animVersion[1] > minimum[1]){\r\n return false;\r\n }\r\n if(minimum[2]>animVersion[2]){\r\n return true;\r\n } else if(animVersion[2] > minimum[2]){\r\n return false;\r\n }\r\n }\r\n\r\n var checkText = (function(){\r\n var minimumVersion = [4,4,14];\r\n\r\n function updateTextLayer(textLayer){\r\n var documentData = textLayer.t.d;\r\n textLayer.t.d = {\r\n k: [\r\n {\r\n s:documentData,\r\n t:0\r\n }\r\n ]\r\n };\r\n }\r\n\r\n function iterateLayers(layers){\r\n var i, len = layers.length;\r\n for(i=0;i<len;i+=1){\r\n if(layers[i].ty === 5){\r\n updateTextLayer(layers[i]);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkChars = (function() {\r\n var minimumVersion = [4,7,99];\r\n return function (animationData){\r\n if(animationData.chars && !checkVersion(minimumVersion,animationData.v)){\r\n var i, len = animationData.chars.length, j, jLen, k, kLen;\r\n var pathData, paths;\r\n for(i = 0; i < len; i += 1) {\r\n if(animationData.chars[i].data && animationData.chars[i].data.shapes) {\r\n paths = animationData.chars[i].data.shapes[0].it;\r\n jLen = paths.length;\r\n\r\n for(j = 0; j < jLen; j += 1) {\r\n pathData = paths[j].ks.k;\r\n if(!pathData.__converted) {\r\n convertPathsToAbsoluteValues(paths[j].ks.k);\r\n pathData.__converted = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkColors = (function(){\r\n var minimumVersion = [4,1,9];\r\n\r\n function iterateShapes(shapes){\r\n var i, len = shapes.length;\r\n var j, jLen;\r\n for(i=0;i<len;i+=1){\r\n if(shapes[i].ty === 'gr'){\r\n iterateShapes(shapes[i].it);\r\n }else if(shapes[i].ty === 'fl' || shapes[i].ty === 'st'){\r\n if(shapes[i].c.k && shapes[i].c.k[0].i){\r\n jLen = shapes[i].c.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(shapes[i].c.k[j].s){\r\n shapes[i].c.k[j].s[0] /= 255;\r\n shapes[i].c.k[j].s[1] /= 255;\r\n shapes[i].c.k[j].s[2] /= 255;\r\n shapes[i].c.k[j].s[3] /= 255;\r\n }\r\n if(shapes[i].c.k[j].e){\r\n shapes[i].c.k[j].e[0] /= 255;\r\n shapes[i].c.k[j].e[1] /= 255;\r\n shapes[i].c.k[j].e[2] /= 255;\r\n shapes[i].c.k[j].e[3] /= 255;\r\n }\r\n }\r\n } else {\r\n shapes[i].c.k[0] /= 255;\r\n shapes[i].c.k[1] /= 255;\r\n shapes[i].c.k[2] /= 255;\r\n shapes[i].c.k[3] /= 255;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function iterateLayers(layers){\r\n var i, len = layers.length;\r\n for(i=0;i<len;i+=1){\r\n if(layers[i].ty === 4){\r\n iterateShapes(layers[i].shapes);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n var checkShapes = (function(){\r\n var minimumVersion = [4,4,18];\r\n\r\n\r\n\r\n function completeShapes(arr){\r\n var i, len = arr.length;\r\n var j, jLen;\r\n var hasPaths = false;\r\n for(i=len-1;i>=0;i-=1){\r\n if(arr[i].ty == 'sh'){\r\n if(arr[i].ks.k.i){\r\n arr[i].ks.k.c = arr[i].closed;\r\n }else{\r\n jLen = arr[i].ks.k.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(arr[i].ks.k[j].s){\r\n arr[i].ks.k[j].s[0].c = arr[i].closed;\r\n }\r\n if(arr[i].ks.k[j].e){\r\n arr[i].ks.k[j].e[0].c = arr[i].closed;\r\n }\r\n }\r\n }\r\n hasPaths = true;\r\n }else if(arr[i].ty == 'gr'){\r\n completeShapes(arr[i].it);\r\n }\r\n }\r\n }\r\n\r\n function iterateLayers(layers){\r\n var layerData;\r\n var i, len = layers.length;\r\n var j, jLen, k, kLen;\r\n for(i=0;i<len;i+=1){\r\n layerData = layers[i];\r\n if(layerData.hasMask){\r\n var maskProps = layerData.masksProperties;\r\n jLen = maskProps.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(maskProps[j].pt.k.i){\r\n maskProps[j].pt.k.c = maskProps[j].cl;\r\n }else{\r\n kLen = maskProps[j].pt.k.length;\r\n for(k=0;k<kLen;k+=1){\r\n if(maskProps[j].pt.k[k].s){\r\n maskProps[j].pt.k[k].s[0].c = maskProps[j].cl;\r\n }\r\n if(maskProps[j].pt.k[k].e){\r\n maskProps[j].pt.k[k].e[0].c = maskProps[j].cl;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if(layerData.ty === 4){\r\n completeShapes(layerData.shapes);\r\n }\r\n }\r\n }\r\n\r\n return function (animationData){\r\n if(checkVersion(minimumVersion,animationData.v)){\r\n iterateLayers(animationData.layers);\r\n if(animationData.assets){\r\n var i, len = animationData.assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(animationData.assets[i].layers){\r\n iterateLayers(animationData.assets[i].layers);\r\n\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }());\r\n\r\n function completeData(animationData, fontManager){\r\n if(animationData.__complete){\r\n return;\r\n }\r\n checkColors(animationData);\r\n checkText(animationData);\r\n checkChars(animationData);\r\n checkShapes(animationData);\r\n completeLayers(animationData.layers, animationData.assets, fontManager);\r\n animationData.__complete = true;\r\n //blitAnimation(animationData, animationData.assets, fontManager);\r\n }\r\n\r\n function completeText(data, fontManager){\r\n if(data.t.a.length === 0 && !('m' in data.t.p)){\r\n data.singleShape = true;\r\n }\r\n }\r\n\r\n var moduleOb = {};\r\n moduleOb.completeData = completeData;\r\n\r\n return moduleOb;\r\n}\r\n\r\nvar dataManager = dataFunctionManager();\r\nvar FontManager = (function(){\r\n\r\n var maxWaitingTime = 5000;\r\n var emptyChar = {\r\n w: 0,\r\n size:0,\r\n shapes:[]\r\n };\r\n var combinedCharacters = [];\r\n //Hindi characters\r\n combinedCharacters = combinedCharacters.concat([2304, 2305, 2306, 2307, 2362, 2363, 2364, 2364, 2366\r\n , 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379\r\n , 2380, 2381, 2382, 2383, 2387, 2388, 2389, 2390, 2391, 2402, 2403]);\r\n\r\n function setUpNode(font, family){\r\n var parentNode = createTag('span');\r\n parentNode.style.fontFamily = family;\r\n var node = createTag('span');\r\n // Characters that vary significantly among different fonts\r\n node.innerHTML = 'giItT1WQy@!-/#';\r\n // Visible - so we can measure it - but not on the screen\r\n parentNode.style.position = 'absolute';\r\n parentNode.style.left = '-10000px';\r\n parentNode.style.top = '-10000px';\r\n // Large font size makes even subtle changes obvious\r\n parentNode.style.fontSize = '300px';\r\n // Reset any font properties\r\n parentNode.style.fontVariant = 'normal';\r\n parentNode.style.fontStyle = 'normal';\r\n parentNode.style.fontWeight = 'normal';\r\n parentNode.style.letterSpacing = '0';\r\n parentNode.appendChild(node);\r\n document.body.appendChild(parentNode);\r\n\r\n // Remember width with no applied web font\r\n var width = node.offsetWidth;\r\n node.style.fontFamily = font + ', '+family;\r\n return {node:node, w:width, parent:parentNode};\r\n }\r\n\r\n function checkLoadedFonts() {\r\n var i, len = this.fonts.length;\r\n var node, w;\r\n var loadedCount = len;\r\n for(i=0;i<len; i+= 1){\r\n if(this.fonts[i].loaded){\r\n loadedCount -= 1;\r\n continue;\r\n }\r\n if(this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0){\r\n this.fonts[i].loaded = true;\r\n } else{\r\n node = this.fonts[i].monoCase.node;\r\n w = this.fonts[i].monoCase.w;\r\n if(node.offsetWidth !== w){\r\n loadedCount -= 1;\r\n this.fonts[i].loaded = true;\r\n }else{\r\n node = this.fonts[i].sansCase.node;\r\n w = this.fonts[i].sansCase.w;\r\n if(node.offsetWidth !== w){\r\n loadedCount -= 1;\r\n this.fonts[i].loaded = true;\r\n }\r\n }\r\n if(this.fonts[i].loaded){\r\n this.fonts[i].sansCase.parent.parentNode.removeChild(this.fonts[i].sansCase.parent);\r\n this.fonts[i].monoCase.parent.parentNode.removeChild(this.fonts[i].monoCase.parent);\r\n }\r\n }\r\n }\r\n\r\n if(loadedCount !== 0 && Date.now() - this.initTime < maxWaitingTime){\r\n setTimeout(this.checkLoadedFonts.bind(this),20);\r\n }else{\r\n setTimeout(function(){this.isLoaded = true;}.bind(this),0);\r\n\r\n }\r\n }\r\n\r\n function createHelper(def, fontData){\r\n var tHelper = createNS('text');\r\n tHelper.style.fontSize = '100px';\r\n //tHelper.style.fontFamily = fontData.fFamily;\r\n tHelper.setAttribute('font-family', fontData.fFamily);\r\n tHelper.setAttribute('font-style', fontData.fStyle);\r\n tHelper.setAttribute('font-weight', fontData.fWeight);\r\n tHelper.textContent = '1';\r\n if(fontData.fClass){\r\n tHelper.style.fontFamily = 'inherit';\r\n tHelper.setAttribute('class', fontData.fClass);\r\n } else {\r\n tHelper.style.fontFamily = fontData.fFamily;\r\n }\r\n def.appendChild(tHelper);\r\n var tCanvasHelper = createTag('canvas').getContext('2d');\r\n tCanvasHelper.font = fontData.fWeight + ' ' + fontData.fStyle + ' 100px '+ fontData.fFamily;\r\n //tCanvasHelper.font = ' 100px '+ fontData.fFamily;\r\n return tHelper;\r\n }\r\n\r\n function addFonts(fontData, defs){\r\n if(!fontData){\r\n this.isLoaded = true;\r\n return;\r\n }\r\n if(this.chars){\r\n this.isLoaded = true;\r\n this.fonts = fontData.list;\r\n return;\r\n }\r\n\r\n\r\n var fontArr = fontData.list;\r\n var i, len = fontArr.length;\r\n var _pendingFonts = len;\r\n for(i=0; i<len; i+= 1){\r\n var shouldLoadFont = true;\r\n var loadedSelector;\r\n var j;\r\n fontArr[i].loaded = false;\r\n fontArr[i].monoCase = setUpNode(fontArr[i].fFamily,'monospace');\r\n fontArr[i].sansCase = setUpNode(fontArr[i].fFamily,'sans-serif');\r\n if(!fontArr[i].fPath) {\r\n fontArr[i].loaded = true;\r\n _pendingFonts -= 1;\r\n }else if(fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3){\r\n loadedSelector = document.querySelectorAll('style[f-forigin=\"p\"][f-family=\"'+ fontArr[i].fFamily +'\"], style[f-origin=\"3\"][f-family=\"'+ fontArr[i].fFamily +'\"]');\r\n\r\n if (loadedSelector.length > 0) {\r\n shouldLoadFont = false;\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var s = createTag('style');\r\n s.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n s.setAttribute('f-origin', fontArr[i].origin);\r\n s.setAttribute('f-family', fontArr[i].fFamily);\r\n s.type = \"text/css\";\r\n s.innerHTML = \"@font-face {\" + \"font-family: \"+fontArr[i].fFamily+\"; font-style: normal; src: url('\"+fontArr[i].fPath+\"');}\";\r\n defs.appendChild(s);\r\n }\r\n } else if(fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1){\r\n loadedSelector = document.querySelectorAll('link[f-forigin=\"g\"], link[f-origin=\"1\"]');\r\n\r\n for (j = 0; j < loadedSelector.length; j++) {\r\n if (loadedSelector[j].href.indexOf(fontArr[i].fPath) !== -1) {\r\n // Font is already loaded\r\n shouldLoadFont = false;\r\n }\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var l = createTag('link');\r\n l.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n l.setAttribute('f-origin', fontArr[i].origin);\r\n l.type = \"text/css\";\r\n l.rel = \"stylesheet\";\r\n l.href = fontArr[i].fPath;\r\n document.body.appendChild(l);\r\n }\r\n } else if(fontArr[i].fOrigin === 't' || fontArr[i].origin === 2){\r\n loadedSelector = document.querySelectorAll('script[f-forigin=\"t\"], script[f-origin=\"2\"]');\r\n\r\n for (j = 0; j < loadedSelector.length; j++) {\r\n if (fontArr[i].fPath === loadedSelector[j].src) {\r\n // Font is already loaded\r\n shouldLoadFont = false;\r\n }\r\n }\r\n\r\n if (shouldLoadFont) {\r\n var sc = createTag('link');\r\n sc.setAttribute('f-forigin', fontArr[i].fOrigin);\r\n sc.setAttribute('f-origin', fontArr[i].origin);\r\n sc.setAttribute('rel','stylesheet');\r\n sc.setAttribute('href',fontArr[i].fPath);\r\n defs.appendChild(sc);\r\n }\r\n }\r\n fontArr[i].helper = createHelper(defs,fontArr[i]);\r\n fontArr[i].cache = {};\r\n this.fonts.push(fontArr[i]);\r\n }\r\n if (_pendingFonts === 0) {\r\n this.isLoaded = true;\r\n } else {\r\n //On some cases even if the font is loaded, it won't load correctly when measuring text on canvas.\r\n //Adding this timeout seems to fix it\r\n setTimeout(this.checkLoadedFonts.bind(this), 100);\r\n }\r\n }\r\n\r\n function addChars(chars){\r\n if(!chars){\r\n return;\r\n }\r\n if(!this.chars){\r\n this.chars = [];\r\n }\r\n var i, len = chars.length;\r\n var j, jLen = this.chars.length, found;\r\n for(i=0;i<len;i+=1){\r\n j = 0;\r\n found = false;\r\n while(j<jLen){\r\n if(this.chars[j].style === chars[i].style && this.chars[j].fFamily === chars[i].fFamily && this.chars[j].ch === chars[i].ch){\r\n found = true;\r\n }\r\n j += 1;\r\n }\r\n if(!found){\r\n this.chars.push(chars[i]);\r\n jLen += 1;\r\n }\r\n }\r\n }\r\n\r\n function getCharData(char, style, font){\r\n var i = 0, len = this.chars.length;\r\n while( i < len) {\r\n if(this.chars[i].ch === char && this.chars[i].style === style && this.chars[i].fFamily === font){\r\n\r\n return this.chars[i];\r\n }\r\n i+= 1;\r\n }\r\n if((typeof char === 'string' && char.charCodeAt(0) !== 13 || !char) && console && console.warn) {\r\n console.warn('Missing character from exported characters list: ', char, style, font);\r\n }\r\n return emptyChar;\r\n }\r\n\r\n function measureText(char, fontName, size) {\r\n var fontData = this.getFontByName(fontName);\r\n var index = char.charCodeAt(0);\r\n if(!fontData.cache[index + 1]) {\r\n var tHelper = fontData.helper;\r\n //Canvas version\r\n //fontData.cache[index] = tHelper.measureText(char).width / 100;\r\n //SVG version\r\n //console.log(tHelper.getBBox().width)\r\n if (char === ' ') {\r\n tHelper.textContent = '|' + char + '|';\r\n var doubleSize = tHelper.getComputedTextLength();\r\n tHelper.textContent = '||';\r\n var singleSize = tHelper.getComputedTextLength();\r\n fontData.cache[index + 1] = (doubleSize - singleSize)/100;\r\n } else {\r\n tHelper.textContent = char;\r\n fontData.cache[index + 1] = (tHelper.getComputedTextLength())/100;\r\n }\r\n }\r\n return fontData.cache[index + 1] * size;\r\n }\r\n\r\n function getFontByName(name){\r\n var i = 0, len = this.fonts.length;\r\n while(i<len){\r\n if(this.fonts[i].fName === name) {\r\n return this.fonts[i];\r\n }\r\n i += 1;\r\n }\r\n return this.fonts[0];\r\n }\r\n\r\n function getCombinedCharacterCodes() {\r\n return combinedCharacters;\r\n }\r\n\r\n function loaded() {\r\n return this.isLoaded;\r\n }\r\n\r\n var Font = function(){\r\n this.fonts = [];\r\n this.chars = null;\r\n this.typekitLoaded = 0;\r\n this.isLoaded = false;\r\n this.initTime = Date.now();\r\n };\r\n //TODO: for now I'm adding these methods to the Class and not the prototype. Think of a better way to implement it. \r\n Font.getCombinedCharacterCodes = getCombinedCharacterCodes;\r\n\r\n Font.prototype.addChars = addChars;\r\n Font.prototype.addFonts = addFonts;\r\n Font.prototype.getCharData = getCharData;\r\n Font.prototype.getFontByName = getFontByName;\r\n Font.prototype.measureText = measureText;\r\n Font.prototype.checkLoadedFonts = checkLoadedFonts;\r\n Font.prototype.loaded = loaded;\r\n\r\n return Font;\r\n\r\n}());\r\nvar PropertyFactory = (function(){\r\n\r\n var initFrame = initialDefaultFrame;\r\n var math_abs = Math.abs;\r\n\r\n function interpolateValue(frameNum, caching) {\r\n var offsetTime = this.offsetTime;\r\n var newValue;\r\n if (this.propType === 'multidimensional') {\r\n newValue = createTypedArray('float32', this.pv.length);\r\n }\r\n var iterationIndex = caching.lastIndex;\r\n var i = iterationIndex;\r\n var len = this.keyframes.length - 1, flag = true;\r\n var keyData, nextKeyData;\r\n\r\n while (flag) {\r\n keyData = this.keyframes[i];\r\n nextKeyData = this.keyframes[i + 1];\r\n if (i === len - 1 && frameNum >= nextKeyData.t - offsetTime){\r\n if(keyData.h){\r\n keyData = nextKeyData;\r\n }\r\n iterationIndex = 0;\r\n break;\r\n }\r\n if ((nextKeyData.t - offsetTime) > frameNum){\r\n iterationIndex = i;\r\n break;\r\n }\r\n if (i < len - 1){\r\n i += 1;\r\n } else {\r\n iterationIndex = 0;\r\n flag = false;\r\n }\r\n }\r\n\r\n var k, kLen, perc, jLen, j, fnc;\r\n var nextKeyTime = nextKeyData.t - offsetTime;\r\n var keyTime = keyData.t - offsetTime;\r\n var endValue;\r\n if (keyData.to) {\r\n if (!keyData.bezierData) {\r\n keyData.bezierData = bez.buildBezierData(keyData.s, nextKeyData.s || keyData.e, keyData.to, keyData.ti);\r\n }\r\n var bezierData = keyData.bezierData;\r\n if (frameNum >= nextKeyTime || frameNum < keyTime) {\r\n var ind = frameNum >= nextKeyTime ? bezierData.points.length - 1 : 0;\r\n kLen = bezierData.points[ind].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[ind].point[k];\r\n }\r\n // caching._lastKeyframeIndex = -1;\r\n } else {\r\n if (keyData.__fnct) {\r\n fnc = keyData.__fnct;\r\n } else {\r\n fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y, keyData.n).get;\r\n keyData.__fnct = fnc;\r\n }\r\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime));\r\n var distanceInLine = bezierData.segmentLength*perc;\r\n\r\n var segmentPerc;\r\n var addedLength = (caching.lastFrame < frameNum && caching._lastKeyframeIndex === i) ? caching._lastAddedLength : 0;\r\n j = (caching.lastFrame < frameNum && caching._lastKeyframeIndex === i) ? caching._lastPoint : 0;\r\n flag = true;\r\n jLen = bezierData.points.length;\r\n while (flag) {\r\n addedLength += bezierData.points[j].partialLength;\r\n if (distanceInLine === 0 || perc === 0 || j === bezierData.points.length - 1) {\r\n kLen = bezierData.points[j].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[j].point[k];\r\n }\r\n break;\r\n } else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {\r\n segmentPerc = (distanceInLine - addedLength) / bezierData.points[j + 1].partialLength;\r\n kLen = bezierData.points[j].point.length;\r\n for (k = 0; k < kLen; k += 1) {\r\n newValue[k] = bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc;\r\n }\r\n break;\r\n }\r\n if (j < jLen - 1){\r\n j += 1;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n caching._lastPoint = j;\r\n caching._lastAddedLength = addedLength - bezierData.points[j].partialLength;\r\n caching._lastKeyframeIndex = i;\r\n }\r\n } else {\r\n var outX, outY, inX, inY, keyValue;\r\n len = keyData.s.length;\r\n endValue = nextKeyData.s || keyData.e;\r\n if (this.sh && keyData.h !== 1) {\r\n if (frameNum >= nextKeyTime) {\r\n newValue[0] = endValue[0];\r\n newValue[1] = endValue[1];\r\n newValue[2] = endValue[2];\r\n } else if (frameNum <= keyTime) {\r\n newValue[0] = keyData.s[0];\r\n newValue[1] = keyData.s[1];\r\n newValue[2] = keyData.s[2];\r\n } else {\r\n var quatStart = createQuaternion(keyData.s);\r\n var quatEnd = createQuaternion(endValue);\r\n var time = (frameNum - keyTime) / (nextKeyTime - keyTime);\r\n quaternionToEuler(newValue, slerp(quatStart, quatEnd, time));\r\n }\r\n \r\n } else {\r\n for(i = 0; i < len; i += 1) {\r\n if (keyData.h !== 1) {\r\n if (frameNum >= nextKeyTime) {\r\n perc = 1;\r\n } else if(frameNum < keyTime) {\r\n perc = 0;\r\n } else {\r\n if(keyData.o.x.constructor === Array) {\r\n if (!keyData.__fnct) {\r\n keyData.__fnct = [];\r\n }\r\n if (!keyData.__fnct[i]) {\r\n outX = (typeof keyData.o.x[i] === 'undefined') ? keyData.o.x[0] : keyData.o.x[i];\r\n outY = (typeof keyData.o.y[i] === 'undefined') ? keyData.o.y[0] : keyData.o.y[i];\r\n inX = (typeof keyData.i.x[i] === 'undefined') ? keyData.i.x[0] : keyData.i.x[i];\r\n inY = (typeof keyData.i.y[i] === 'undefined') ? keyData.i.y[0] : keyData.i.y[i];\r\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\r\n keyData.__fnct[i] = fnc;\r\n } else {\r\n fnc = keyData.__fnct[i];\r\n }\r\n } else {\r\n if (!keyData.__fnct) {\r\n outX = keyData.o.x;\r\n outY = keyData.o.y;\r\n inX = keyData.i.x;\r\n inY = keyData.i.y;\r\n fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get;\r\n keyData.__fnct = fnc;\r\n } else {\r\n fnc = keyData.__fnct;\r\n }\r\n }\r\n perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime ));\r\n }\r\n }\r\n\r\n endValue = nextKeyData.s || keyData.e;\r\n keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (endValue[i] - keyData.s[i]) * perc;\r\n\r\n if (this.propType === 'multidimensional') {\r\n newValue[i] = keyValue;\r\n } else {\r\n newValue = keyValue;\r\n }\r\n }\r\n }\r\n }\r\n caching.lastIndex = iterationIndex;\r\n return newValue;\r\n }\r\n\r\n //based on @Toji's https://github.com/toji/gl-matrix/\r\n function slerp(a, b, t) {\r\n var out = [];\r\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\r\n bx = b[0], by = b[1], bz = b[2], bw = b[3]\r\n\r\n var omega, cosom, sinom, scale0, scale1;\r\n\r\n cosom = ax * bx + ay * by + az * bz + aw * bw;\r\n if (cosom < 0.0) {\r\n cosom = -cosom;\r\n bx = -bx;\r\n by = -by;\r\n bz = -bz;\r\n bw = -bw;\r\n }\r\n if ((1.0 - cosom) > 0.000001) {\r\n omega = Math.acos(cosom);\r\n sinom = Math.sin(omega);\r\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\r\n scale1 = Math.sin(t * omega) / sinom;\r\n } else {\r\n scale0 = 1.0 - t;\r\n scale1 = t;\r\n }\r\n out[0] = scale0 * ax + scale1 * bx;\r\n out[1] = scale0 * ay + scale1 * by;\r\n out[2] = scale0 * az + scale1 * bz;\r\n out[3] = scale0 * aw + scale1 * bw;\r\n\r\n return out;\r\n }\r\n\r\n function quaternionToEuler(out, quat) {\r\n var qx = quat[0];\r\n var qy = quat[1];\r\n var qz = quat[2];\r\n var qw = quat[3];\r\n var heading = Math.atan2(2*qy*qw-2*qx*qz , 1 - 2*qy*qy - 2*qz*qz)\r\n var attitude = Math.asin(2*qx*qy + 2*qz*qw) \r\n var bank = Math.atan2(2*qx*qw-2*qy*qz , 1 - 2*qx*qx - 2*qz*qz);\r\n out[0] = heading/degToRads;\r\n out[1] = attitude/degToRads;\r\n out[2] = bank/degToRads;\r\n }\r\n\r\n function createQuaternion(values) {\r\n var heading = values[0] * degToRads;\r\n var attitude = values[1] * degToRads;\r\n var bank = values[2] * degToRads;\r\n var c1 = Math.cos(heading / 2);\r\n var c2 = Math.cos(attitude / 2);\r\n var c3 = Math.cos(bank / 2);\r\n var s1 = Math.sin(heading / 2);\r\n var s2 = Math.sin(attitude / 2);\r\n var s3 = Math.sin(bank / 2);\r\n var w = c1 * c2 * c3 - s1 * s2 * s3;\r\n var x = s1 * s2 * c3 + c1 * c2 * s3;\r\n var y = s1 * c2 * c3 + c1 * s2 * s3;\r\n var z = c1 * s2 * c3 - s1 * c2 * s3;\r\n\r\n return [x,y,z,w];\r\n }\r\n\r\n function getValueAtCurrentTime(){\r\n var frameNum = this.comp.renderedFrame - this.offsetTime;\r\n var initTime = this.keyframes[0].t - this.offsetTime;\r\n var endTime = this.keyframes[this.keyframes.length- 1].t-this.offsetTime;\r\n if(!(frameNum === this._caching.lastFrame || (this._caching.lastFrame !== initFrame && ((this._caching.lastFrame >= endTime && frameNum >= endTime) || (this._caching.lastFrame < initTime && frameNum < initTime))))){\r\n if(this._caching.lastFrame >= frameNum) {\r\n this._caching._lastKeyframeIndex = -1;\r\n this._caching.lastIndex = 0;\r\n }\r\n\r\n var renderResult = this.interpolateValue(frameNum, this._caching);\r\n this.pv = renderResult;\r\n }\r\n this._caching.lastFrame = frameNum;\r\n return this.pv;\r\n }\r\n\r\n function setVValue(val) {\r\n var multipliedValue;\r\n if(this.propType === 'unidimensional') {\r\n multipliedValue = val * this.mult;\r\n if(math_abs(this.v - multipliedValue) > 0.00001) {\r\n this.v = multipliedValue;\r\n this._mdf = true;\r\n }\r\n } else {\r\n var i = 0, len = this.v.length;\r\n while (i < len) {\r\n multipliedValue = val[i] * this.mult;\r\n if (math_abs(this.v[i] - multipliedValue) > 0.00001) {\r\n this.v[i] = multipliedValue;\r\n this._mdf = true;\r\n }\r\n i += 1;\r\n }\r\n }\r\n }\r\n\r\n function processEffectsSequence() {\r\n if (this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) {\r\n return;\r\n }\r\n if(this.lock) {\r\n this.setVValue(this.pv);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = this._isFirstFrame;\r\n var multipliedValue;\r\n var i, len = this.effectsSequence.length;\r\n var finalValue = this.kf ? this.pv : this.data.k;\r\n for(i = 0; i < len; i += 1) {\r\n finalValue = this.effectsSequence[i](finalValue);\r\n }\r\n this.setVValue(finalValue);\r\n this._isFirstFrame = false;\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n }\r\n\r\n function addEffect(effectFunction) {\r\n this.effectsSequence.push(effectFunction);\r\n this.container.addDynamicProperty(this);\r\n }\r\n\r\n function ValueProperty(elem, data, mult, container){\r\n this.propType = 'unidimensional';\r\n this.mult = mult || 1;\r\n this.data = data;\r\n this.v = mult ? data.k * mult : data.k;\r\n this.pv = data.k;\r\n this._mdf = false;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.k = false;\r\n this.kf = false;\r\n this.vel = 0;\r\n this.effectsSequence = [];\r\n this._isFirstFrame = true;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function MultiDimensionalProperty(elem, data, mult, container) {\r\n this.propType = 'multidimensional';\r\n this.mult = mult || 1;\r\n this.data = data;\r\n this._mdf = false;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.k = false;\r\n this.kf = false;\r\n this.frameId = -1;\r\n var i, len = data.k.length;\r\n this.v = createTypedArray('float32', len);\r\n this.pv = createTypedArray('float32', len);\r\n var arr = createTypedArray('float32', len);\r\n this.vel = createTypedArray('float32', len);\r\n for (i = 0; i < len; i += 1) {\r\n this.v[i] = data.k[i] * this.mult;\r\n this.pv[i] = data.k[i];\r\n }\r\n this._isFirstFrame = true;\r\n this.effectsSequence = [];\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function KeyframedValueProperty(elem, data, mult, container) {\r\n this.propType = 'unidimensional';\r\n this.keyframes = data.k;\r\n this.offsetTime = elem.data.st;\r\n this.frameId = -1;\r\n this._caching = {lastFrame: initFrame, lastIndex: 0, value: 0, _lastKeyframeIndex: -1};\r\n this.k = true;\r\n this.kf = true;\r\n this.data = data;\r\n this.mult = mult || 1;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.v = initFrame;\r\n this.pv = initFrame;\r\n this._isFirstFrame = true;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.interpolateValue = interpolateValue;\r\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function KeyframedMultidimensionalProperty(elem, data, mult, container){\r\n this.propType = 'multidimensional';\r\n var i, len = data.k.length;\r\n var s, e,to,ti;\r\n for (i = 0; i < len - 1; i += 1) {\r\n if (data.k[i].to && data.k[i].s && data.k[i].e) {\r\n s = data.k[i].s;\r\n e = data.k[i].e;\r\n to = data.k[i].to;\r\n ti = data.k[i].ti;\r\n if((s.length === 2 && !(s[0] === e[0] && s[1] === e[1]) && bez.pointOnLine2D(s[0],s[1],e[0],e[1],s[0] + to[0],s[1] + to[1]) && bez.pointOnLine2D(s[0],s[1],e[0],e[1],e[0] + ti[0],e[1] + ti[1])) || (s.length === 3 && !(s[0] === e[0] && s[1] === e[1] && s[2] === e[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],s[0] + to[0],s[1] + to[1],s[2] + to[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],e[0] + ti[0],e[1] + ti[1],e[2] + ti[2]))){\r\n data.k[i].to = null;\r\n data.k[i].ti = null;\r\n }\r\n if(s[0] === e[0] && s[1] === e[1] && to[0] === 0 && to[1] === 0 && ti[0] === 0 && ti[1] === 0) {\r\n if(s.length === 2 || (s[2] === e[2] && to[2] === 0 && ti[2] === 0)) {\r\n data.k[i].to = null;\r\n data.k[i].ti = null;\r\n }\r\n }\r\n }\r\n }\r\n this.effectsSequence = [getValueAtCurrentTime.bind(this)];\r\n this.keyframes = data.k;\r\n this.offsetTime = elem.data.st;\r\n this.k = true;\r\n this.kf = true;\r\n this._isFirstFrame = true;\r\n this.mult = mult || 1;\r\n this.elem = elem;\r\n this.container = container;\r\n this.comp = elem.comp;\r\n this.getValue = processEffectsSequence;\r\n this.setVValue = setVValue;\r\n this.interpolateValue = interpolateValue;\r\n this.frameId = -1;\r\n var arrLen = data.k[0].s.length;\r\n this.v = createTypedArray('float32', arrLen);\r\n this.pv = createTypedArray('float32', arrLen);\r\n for (i = 0; i < arrLen; i += 1) {\r\n this.v[i] = initFrame;\r\n this.pv[i] = initFrame;\r\n }\r\n this._caching={lastFrame:initFrame,lastIndex:0,value:createTypedArray('float32', arrLen)};\r\n this.addEffect = addEffect;\r\n }\r\n\r\n function getProp(elem,data,type, mult, container) {\r\n var p;\r\n if(!data.k.length){\r\n p = new ValueProperty(elem,data, mult, container);\r\n }else if(typeof(data.k[0]) === 'number'){\r\n p = new MultiDimensionalProperty(elem,data, mult, container);\r\n }else{\r\n switch(type){\r\n case 0:\r\n p = new KeyframedValueProperty(elem,data,mult, container);\r\n break;\r\n case 1:\r\n p = new KeyframedMultidimensionalProperty(elem,data,mult, container);\r\n break;\r\n }\r\n }\r\n if(p.effectsSequence.length){\r\n container.addDynamicProperty(p);\r\n }\r\n return p;\r\n }\r\n\r\n var ob = {\r\n getProp: getProp\r\n };\r\n return ob;\r\n}());\r\nvar TransformPropertyFactory = (function() {\r\n\r\n function applyToMatrix(mat) {\r\n var _mdf = this._mdf;\r\n this.iterateDynamicProperties();\r\n this._mdf = this._mdf || _mdf;\r\n if (this.a) {\r\n mat.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n }\r\n if (this.s) {\r\n mat.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n }\r\n if (this.sk) {\r\n mat.skewFromAxis(-this.sk.v, this.sa.v);\r\n }\r\n if (this.r) {\r\n mat.rotate(-this.r.v);\r\n } else {\r\n mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n }\r\n if (this.data.p.s) {\r\n if (this.data.p.z) {\r\n mat.translate(this.px.v, this.py.v, -this.pz.v);\r\n } else {\r\n mat.translate(this.px.v, this.py.v, 0);\r\n }\r\n } else {\r\n mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]);\r\n }\r\n }\r\n function processKeys(forceRender){\r\n if (this.elem.globalData.frameId === this.frameId) {\r\n return;\r\n }\r\n if(this._isDirty) {\r\n this.precalculateMatrix();\r\n this._isDirty = false;\r\n }\r\n\r\n this.iterateDynamicProperties();\r\n\r\n if (this._mdf || forceRender) {\r\n this.v.cloneFromProps(this.pre.props);\r\n if (this.appliedTransformations < 1) {\r\n this.v.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n }\r\n if(this.appliedTransformations < 2) {\r\n this.v.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n }\r\n if (this.sk && this.appliedTransformations < 3) {\r\n this.v.skewFromAxis(-this.sk.v, this.sa.v);\r\n }\r\n if (this.r && this.appliedTransformations < 4) {\r\n this.v.rotate(-this.r.v);\r\n } else if (!this.r && this.appliedTransformations < 4){\r\n this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n }\r\n if (this.autoOriented) {\r\n var v1,v2, frameRate = this.elem.globalData.frameRate;\r\n if(this.p && this.p.keyframes && this.p.getValueAtTime) {\r\n if (this.p._caching.lastFrame+this.p.offsetTime <= this.p.keyframes[0].t) {\r\n v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / frameRate,0);\r\n v2 = this.p.getValueAtTime(this.p.keyframes[0].t / frameRate, 0);\r\n } else if(this.p._caching.lastFrame+this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) {\r\n v1 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t / frameRate), 0);\r\n v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.05) / frameRate, 0);\r\n } else {\r\n v1 = this.p.pv;\r\n v2 = this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime - 0.01) / frameRate, this.p.offsetTime);\r\n }\r\n } else if(this.px && this.px.keyframes && this.py.keyframes && this.px.getValueAtTime && this.py.getValueAtTime) {\r\n v1 = [];\r\n v2 = [];\r\n var px = this.px, py = this.py, frameRate;\r\n if (px._caching.lastFrame+px.offsetTime <= px.keyframes[0].t) {\r\n v1[0] = px.getValueAtTime((px.keyframes[0].t + 0.01) / frameRate,0);\r\n v1[1] = py.getValueAtTime((py.keyframes[0].t + 0.01) / frameRate,0);\r\n v2[0] = px.getValueAtTime((px.keyframes[0].t) / frameRate,0);\r\n v2[1] = py.getValueAtTime((py.keyframes[0].t) / frameRate,0);\r\n } else if(px._caching.lastFrame+px.offsetTime >= px.keyframes[px.keyframes.length - 1].t) {\r\n v1[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t / frameRate),0);\r\n v1[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t / frameRate),0);\r\n v2[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t - 0.01) / frameRate,0);\r\n v2[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t - 0.01) / frameRate,0);\r\n } else {\r\n v1 = [px.pv, py.pv];\r\n v2[0] = px.getValueAtTime((px._caching.lastFrame+px.offsetTime - 0.01) / frameRate,px.offsetTime);\r\n v2[1] = py.getValueAtTime((py._caching.lastFrame+py.offsetTime - 0.01) / frameRate,py.offsetTime);\r\n }\r\n }\r\n this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));\r\n }\r\n if(this.data.p && this.data.p.s){\r\n if(this.data.p.z) {\r\n this.v.translate(this.px.v, this.py.v, -this.pz.v);\r\n } else {\r\n this.v.translate(this.px.v, this.py.v, 0);\r\n }\r\n }else{\r\n this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2]);\r\n }\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n }\r\n\r\n function precalculateMatrix() {\r\n if(!this.a.k) {\r\n this.pre.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]);\r\n this.appliedTransformations = 1;\r\n } else {\r\n return;\r\n }\r\n if(!this.s.effectsSequence.length) {\r\n this.pre.scale(this.s.v[0], this.s.v[1], this.s.v[2]);\r\n this.appliedTransformations = 2;\r\n } else {\r\n return;\r\n }\r\n if(this.sk) {\r\n if(!this.sk.effectsSequence.length && !this.sa.effectsSequence.length) {\r\n this.pre.skewFromAxis(-this.sk.v, this.sa.v);\r\n this.appliedTransformations = 3;\r\n } else {\r\n return;\r\n }\r\n }\r\n if (this.r) {\r\n if(!this.r.effectsSequence.length) {\r\n this.pre.rotate(-this.r.v);\r\n this.appliedTransformations = 4;\r\n } else {\r\n return;\r\n }\r\n } else if(!this.rz.effectsSequence.length && !this.ry.effectsSequence.length && !this.rx.effectsSequence.length && !this.or.effectsSequence.length) {\r\n this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]);\r\n this.appliedTransformations = 4;\r\n }\r\n }\r\n\r\n function autoOrient(){\r\n //\r\n //var prevP = this.getValueAtTime();\r\n }\r\n\r\n function addDynamicProperty(prop) {\r\n this._addDynamicProperty(prop);\r\n this.elem.addDynamicProperty(prop);\r\n this._isDirty = true;\r\n }\r\n\r\n function TransformProperty(elem,data,container){\r\n this.elem = elem;\r\n this.frameId = -1;\r\n this.propType = 'transform';\r\n this.data = data;\r\n this.v = new Matrix();\r\n //Precalculated matrix with non animated properties\r\n this.pre = new Matrix();\r\n this.appliedTransformations = 0;\r\n this.initDynamicPropertyContainer(container || elem);\r\n if(data.p && data.p.s){\r\n this.px = PropertyFactory.getProp(elem,data.p.x,0,0,this);\r\n this.py = PropertyFactory.getProp(elem,data.p.y,0,0,this);\r\n if(data.p.z){\r\n this.pz = PropertyFactory.getProp(elem,data.p.z,0,0,this);\r\n }\r\n }else{\r\n this.p = PropertyFactory.getProp(elem,data.p || {k:[0,0,0]},1,0,this);\r\n }\r\n if(data.rx) {\r\n this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);\r\n this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this);\r\n this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);\r\n if(data.or.k[0].ti) {\r\n var i, len = data.or.k.length;\r\n for(i=0;i<len;i+=1) {\r\n data.or.k[i].to = data.or.k[i].ti = null;\r\n }\r\n }\r\n this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this);\r\n //sh Indicates it needs to be capped between -180 and 180\r\n this.or.sh = true;\r\n } else {\r\n this.r = PropertyFactory.getProp(elem, data.r || {k: 0}, 0, degToRads, this);\r\n }\r\n if(data.sk){\r\n this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);\r\n this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);\r\n }\r\n this.a = PropertyFactory.getProp(elem,data.a || {k:[0,0,0]},1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s || {k:[100,100,100]},1,0.01,this);\r\n // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.\r\n if(data.o){\r\n this.o = PropertyFactory.getProp(elem,data.o,0,0.01,elem);\r\n } else {\r\n this.o = {_mdf:false,v:1};\r\n }\r\n this._isDirty = true;\r\n if(!this.dynamicProperties.length){\r\n this.getValue(true);\r\n }\r\n }\r\n\r\n TransformProperty.prototype = {\r\n applyToMatrix: applyToMatrix,\r\n getValue: processKeys,\r\n precalculateMatrix: precalculateMatrix,\r\n autoOrient: autoOrient\r\n }\r\n\r\n extendPrototype([DynamicPropertyContainer], TransformProperty);\r\n TransformProperty.prototype.addDynamicProperty = addDynamicProperty;\r\n TransformProperty.prototype._addDynamicProperty = DynamicPropertyContainer.prototype.addDynamicProperty;\r\n\r\n function getTransformProperty(elem,data,container){\r\n return new TransformProperty(elem,data,container);\r\n }\r\n\r\n return {\r\n getTransformProperty: getTransformProperty\r\n };\r\n\r\n}());\r\nfunction ShapePath(){\r\n\tthis.c = false;\r\n\tthis._length = 0;\r\n\tthis._maxLength = 8;\r\n\tthis.v = createSizedArray(this._maxLength);\r\n\tthis.o = createSizedArray(this._maxLength);\r\n\tthis.i = createSizedArray(this._maxLength);\r\n}\r\n\r\nShapePath.prototype.setPathData = function(closed, len) {\r\n\tthis.c = closed;\r\n\tthis.setLength(len);\r\n\tvar i = 0;\r\n\twhile(i < len){\r\n\t\tthis.v[i] = point_pool.newElement();\r\n\t\tthis.o[i] = point_pool.newElement();\r\n\t\tthis.i[i] = point_pool.newElement();\r\n\t\ti += 1;\r\n\t}\r\n};\r\n\r\nShapePath.prototype.setLength = function(len) {\r\n\twhile(this._maxLength < len) {\r\n\t\tthis.doubleArrayLength();\r\n\t}\r\n\tthis._length = len;\r\n};\r\n\r\nShapePath.prototype.doubleArrayLength = function() {\r\n\tthis.v = this.v.concat(createSizedArray(this._maxLength));\r\n\tthis.i = this.i.concat(createSizedArray(this._maxLength));\r\n\tthis.o = this.o.concat(createSizedArray(this._maxLength));\r\n\tthis._maxLength *= 2;\r\n};\r\n\r\nShapePath.prototype.setXYAt = function(x, y, type, pos, replace) {\r\n\tvar arr;\r\n\tthis._length = Math.max(this._length, pos + 1);\r\n\tif(this._length >= this._maxLength) {\r\n\t\tthis.doubleArrayLength();\r\n\t}\r\n\tswitch(type){\r\n\t\tcase 'v':\r\n\t\t\tarr = this.v;\r\n\t\t\tbreak;\r\n\t\tcase 'i':\r\n\t\t\tarr = this.i;\r\n\t\t\tbreak;\r\n\t\tcase 'o':\r\n\t\t\tarr = this.o;\r\n\t\t\tbreak;\r\n\t}\r\n\tif(!arr[pos] || (arr[pos] && !replace)){\r\n\t\tarr[pos] = point_pool.newElement();\r\n\t}\r\n\tarr[pos][0] = x;\r\n\tarr[pos][1] = y;\r\n};\r\n\r\nShapePath.prototype.setTripleAt = function(vX,vY,oX,oY,iX,iY,pos, replace) {\r\n\tthis.setXYAt(vX,vY,'v',pos, replace);\r\n\tthis.setXYAt(oX,oY,'o',pos, replace);\r\n\tthis.setXYAt(iX,iY,'i',pos, replace);\r\n};\r\n\r\nShapePath.prototype.reverse = function() {\r\n\tvar newPath = new ShapePath();\r\n\tnewPath.setPathData(this.c, this._length);\r\n\tvar vertices = this.v, outPoints = this.o, inPoints = this.i;\r\n\tvar init = 0;\r\n\tif (this.c) {\r\n\t\tnewPath.setTripleAt(vertices[0][0], vertices[0][1], inPoints[0][0], inPoints[0][1], outPoints[0][0], outPoints[0][1], 0, false);\r\n init = 1;\r\n }\r\n var cnt = this._length - 1;\r\n var len = this._length;\r\n\r\n var i;\r\n for (i = init; i < len; i += 1) {\r\n \tnewPath.setTripleAt(vertices[cnt][0], vertices[cnt][1], inPoints[cnt][0], inPoints[cnt][1], outPoints[cnt][0], outPoints[cnt][1], i, false);\r\n cnt -= 1;\r\n }\r\n return newPath;\r\n};\r\nvar ShapePropertyFactory = (function(){\r\n\r\n var initFrame = -999999;\r\n\r\n function interpolateShape(frameNum, previousValue, caching) {\r\n var iterationIndex = caching.lastIndex;\r\n var keyPropS,keyPropE,isHold, j, k, jLen, kLen, perc, vertexValue;\r\n var kf = this.keyframes;\r\n if(frameNum < kf[0].t-this.offsetTime){\r\n keyPropS = kf[0].s[0];\r\n isHold = true;\r\n iterationIndex = 0;\r\n }else if(frameNum >= kf[kf.length - 1].t-this.offsetTime){\r\n keyPropS = kf[kf.length - 1].s ? kf[kf.length - 1].s[0] : kf[kf.length - 2].e[0];\r\n /*if(kf[kf.length - 1].s){\r\n keyPropS = kf[kf.length - 1].s[0];\r\n }else{\r\n keyPropS = kf[kf.length - 2].e[0];\r\n }*/\r\n isHold = true;\r\n }else{\r\n var i = iterationIndex;\r\n var len = kf.length- 1,flag = true,keyData,nextKeyData;\r\n while(flag){\r\n keyData = kf[i];\r\n nextKeyData = kf[i+1];\r\n if((nextKeyData.t - this.offsetTime) > frameNum){\r\n break;\r\n }\r\n if(i < len - 1){\r\n i += 1;\r\n }else{\r\n flag = false;\r\n }\r\n }\r\n isHold = keyData.h === 1;\r\n iterationIndex = i;\r\n if(!isHold){\r\n if(frameNum >= nextKeyData.t-this.offsetTime){\r\n perc = 1;\r\n }else if(frameNum < keyData.t-this.offsetTime){\r\n perc = 0;\r\n }else{\r\n var fnc;\r\n if(keyData.__fnct){\r\n fnc = keyData.__fnct;\r\n }else{\r\n fnc = BezierFactory.getBezierEasing(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y).get;\r\n keyData.__fnct = fnc;\r\n }\r\n perc = fnc((frameNum-(keyData.t-this.offsetTime))/((nextKeyData.t-this.offsetTime)-(keyData.t-this.offsetTime)));\r\n }\r\n keyPropE = nextKeyData.s ? nextKeyData.s[0] : keyData.e[0];\r\n }\r\n keyPropS = keyData.s[0];\r\n }\r\n jLen = previousValue._length;\r\n kLen = keyPropS.i[0].length;\r\n caching.lastIndex = iterationIndex;\r\n\r\n for(j=0;j<jLen;j+=1){\r\n for(k=0;k<kLen;k+=1){\r\n vertexValue = isHold ? keyPropS.i[j][k] : keyPropS.i[j][k]+(keyPropE.i[j][k]-keyPropS.i[j][k])*perc;\r\n previousValue.i[j][k] = vertexValue;\r\n vertexValue = isHold ? keyPropS.o[j][k] : keyPropS.o[j][k]+(keyPropE.o[j][k]-keyPropS.o[j][k])*perc;\r\n previousValue.o[j][k] = vertexValue;\r\n vertexValue = isHold ? keyPropS.v[j][k] : keyPropS.v[j][k]+(keyPropE.v[j][k]-keyPropS.v[j][k])*perc;\r\n previousValue.v[j][k] = vertexValue;\r\n }\r\n }\r\n }\r\n\r\n function interpolateShapeCurrentTime(){\r\n var frameNum = this.comp.renderedFrame - this.offsetTime;\r\n var initTime = this.keyframes[0].t - this.offsetTime;\r\n var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime;\r\n var lastFrame = this._caching.lastFrame;\r\n if(!(lastFrame !== initFrame && ((lastFrame < initTime && frameNum < initTime) || (lastFrame > endTime && frameNum > endTime)))){\r\n ////\r\n this._caching.lastIndex = lastFrame < frameNum ? this._caching.lastIndex : 0;\r\n this.interpolateShape(frameNum, this.pv, this._caching);\r\n ////\r\n }\r\n this._caching.lastFrame = frameNum;\r\n return this.pv;\r\n }\r\n\r\n function resetShape(){\r\n this.paths = this.localShapeCollection;\r\n }\r\n\r\n function shapesEqual(shape1, shape2) {\r\n if(shape1._length !== shape2._length || shape1.c !== shape2.c){\r\n return false;\r\n }\r\n var i, len = shape1._length;\r\n for(i = 0; i < len; i += 1) {\r\n if(shape1.v[i][0] !== shape2.v[i][0] \r\n || shape1.v[i][1] !== shape2.v[i][1] \r\n || shape1.o[i][0] !== shape2.o[i][0] \r\n || shape1.o[i][1] !== shape2.o[i][1] \r\n || shape1.i[i][0] !== shape2.i[i][0] \r\n || shape1.i[i][1] !== shape2.i[i][1]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n function setVValue(newPath) {\r\n if(!shapesEqual(this.v, newPath)) {\r\n this.v = shape_pool.clone(newPath);\r\n this.localShapeCollection.releaseShapes();\r\n this.localShapeCollection.addShape(this.v);\r\n this._mdf = true;\r\n this.paths = this.localShapeCollection;\r\n }\r\n }\r\n\r\n function processEffectsSequence() {\r\n if (this.elem.globalData.frameId === this.frameId) {\r\n return;\r\n } else if (!this.effectsSequence.length) {\r\n this._mdf = false;\r\n return;\r\n }\r\n if (this.lock) {\r\n this.setVValue(this.pv);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = false;\r\n var finalValue = this.kf ? this.pv : this.data.ks ? this.data.ks.k : this.data.pt.k;\r\n var i, len = this.effectsSequence.length;\r\n for(i = 0; i < len; i += 1) {\r\n finalValue = this.effectsSequence[i](finalValue);\r\n }\r\n this.setVValue(finalValue);\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n };\r\n\r\n function ShapeProperty(elem, data, type){\r\n this.propType = 'shape';\r\n this.comp = elem.comp;\r\n this.container = elem;\r\n this.elem = elem;\r\n this.data = data;\r\n this.k = false;\r\n this.kf = false;\r\n this._mdf = false;\r\n var pathData = type === 3 ? data.pt.k : data.ks.k;\r\n this.v = shape_pool.clone(pathData);\r\n this.pv = shape_pool.clone(this.v);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.paths.addShape(this.v);\r\n this.reset = resetShape;\r\n this.effectsSequence = [];\r\n }\r\n\r\n function addEffect(effectFunction) {\r\n this.effectsSequence.push(effectFunction);\r\n this.container.addDynamicProperty(this);\r\n }\r\n\r\n ShapeProperty.prototype.interpolateShape = interpolateShape;\r\n ShapeProperty.prototype.getValue = processEffectsSequence;\r\n ShapeProperty.prototype.setVValue = setVValue;\r\n ShapeProperty.prototype.addEffect = addEffect;\r\n\r\n function KeyframedShapeProperty(elem,data,type){\r\n this.propType = 'shape';\r\n this.comp = elem.comp;\r\n this.elem = elem;\r\n this.container = elem;\r\n this.offsetTime = elem.data.st;\r\n this.keyframes = type === 3 ? data.pt.k : data.ks.k;\r\n this.k = true;\r\n this.kf = true;\r\n var i, len = this.keyframes[0].s[0].i.length;\r\n var jLen = this.keyframes[0].s[0].i[0].length;\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(this.keyframes[0].s[0].c, len);\r\n this.pv = shape_pool.clone(this.v);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.paths.addShape(this.v);\r\n this.lastFrame = initFrame;\r\n this.reset = resetShape;\r\n this._caching = {lastFrame: initFrame, lastIndex: 0};\r\n this.effectsSequence = [interpolateShapeCurrentTime.bind(this)];\r\n }\r\n KeyframedShapeProperty.prototype.getValue = processEffectsSequence;\r\n KeyframedShapeProperty.prototype.interpolateShape = interpolateShape;\r\n KeyframedShapeProperty.prototype.setVValue = setVValue;\r\n KeyframedShapeProperty.prototype.addEffect = addEffect;\r\n\r\n var EllShapeProperty = (function(){\r\n\r\n var cPoint = roundCorner;\r\n\r\n function EllShapeProperty(elem,data) {\r\n /*this.v = {\r\n v: createSizedArray(4),\r\n i: createSizedArray(4),\r\n o: createSizedArray(4),\r\n c: true\r\n };*/\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(true, 4);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.paths = this.localShapeCollection;\r\n this.localShapeCollection.addShape(this.v);\r\n this.d = data.d;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.frameId = -1;\r\n this.initDynamicPropertyContainer(elem);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,0,this);\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertEllToPath();\r\n }\r\n };\r\n\r\n EllShapeProperty.prototype = {\r\n reset: resetShape,\r\n getValue: function (){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n\r\n if(this._mdf){\r\n this.convertEllToPath();\r\n }\r\n },\r\n convertEllToPath: function() {\r\n var p0 = this.p.v[0], p1 = this.p.v[1], s0 = this.s.v[0]/2, s1 = this.s.v[1]/2;\r\n var _cw = this.d !== 3;\r\n var _v = this.v;\r\n _v.v[0][0] = p0;\r\n _v.v[0][1] = p1 - s1;\r\n _v.v[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.v[1][1] = p1;\r\n _v.v[2][0] = p0;\r\n _v.v[2][1] = p1 + s1;\r\n _v.v[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.v[3][1] = p1;\r\n _v.i[0][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\r\n _v.i[0][1] = p1 - s1;\r\n _v.i[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.i[1][1] = p1 - s1 * cPoint;\r\n _v.i[2][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\r\n _v.i[2][1] = p1 + s1;\r\n _v.i[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.i[3][1] = p1 + s1 * cPoint;\r\n _v.o[0][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint;\r\n _v.o[0][1] = p1 - s1;\r\n _v.o[1][0] = _cw ? p0 + s0 : p0 - s0;\r\n _v.o[1][1] = p1 + s1 * cPoint;\r\n _v.o[2][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint;\r\n _v.o[2][1] = p1 + s1;\r\n _v.o[3][0] = _cw ? p0 - s0 : p0 + s0;\r\n _v.o[3][1] = p1 - s1 * cPoint;\r\n }\r\n }\r\n\r\n extendPrototype([DynamicPropertyContainer], EllShapeProperty);\r\n\r\n return EllShapeProperty;\r\n }());\r\n\r\n var StarShapeProperty = (function() {\r\n\r\n function StarShapeProperty(elem,data) {\r\n this.v = shape_pool.newElement();\r\n this.v.setPathData(true, 0);\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.data = data;\r\n this.frameId = -1;\r\n this.d = data.d;\r\n this.initDynamicPropertyContainer(elem);\r\n if(data.sy === 1){\r\n this.ir = PropertyFactory.getProp(elem,data.ir,0,0,this);\r\n this.is = PropertyFactory.getProp(elem,data.is,0,0.01,this);\r\n this.convertToPath = this.convertStarToPath;\r\n } else {\r\n this.convertToPath = this.convertPolygonToPath;\r\n }\r\n this.pt = PropertyFactory.getProp(elem,data.pt,0,0,this);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.r = PropertyFactory.getProp(elem,data.r,0,degToRads,this);\r\n this.or = PropertyFactory.getProp(elem,data.or,0,0,this);\r\n this.os = PropertyFactory.getProp(elem,data.os,0,0.01,this);\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.localShapeCollection.addShape(this.v);\r\n this.paths = this.localShapeCollection;\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertToPath();\r\n }\r\n };\r\n\r\n StarShapeProperty.prototype = {\r\n reset: resetShape,\r\n getValue: function() {\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n if(this._mdf){\r\n this.convertToPath();\r\n }\r\n },\r\n convertStarToPath: function() {\r\n var numPts = Math.floor(this.pt.v)*2;\r\n var angle = Math.PI*2/numPts;\r\n /*this.v.v.length = numPts;\r\n this.v.i.length = numPts;\r\n this.v.o.length = numPts;*/\r\n var longFlag = true;\r\n var longRad = this.or.v;\r\n var shortRad = this.ir.v;\r\n var longRound = this.os.v;\r\n var shortRound = this.is.v;\r\n var longPerimSegment = 2*Math.PI*longRad/(numPts*2);\r\n var shortPerimSegment = 2*Math.PI*shortRad/(numPts*2);\r\n var i, rad,roundness,perimSegment, currentAng = -Math.PI/ 2;\r\n currentAng += this.r.v;\r\n var dir = this.data.d === 3 ? -1 : 1;\r\n this.v._length = 0;\r\n for(i=0;i<numPts;i+=1){\r\n rad = longFlag ? longRad : shortRad;\r\n roundness = longFlag ? longRound : shortRound;\r\n perimSegment = longFlag ? longPerimSegment : shortPerimSegment;\r\n var x = rad * Math.cos(currentAng);\r\n var y = rad * Math.sin(currentAng);\r\n var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);\r\n var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);\r\n x += + this.p.v[0];\r\n y += + this.p.v[1];\r\n this.v.setTripleAt(x,y,x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir,x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir, i, true);\r\n\r\n /*this.v.v[i] = [x,y];\r\n this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];\r\n this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];\r\n this.v._length = numPts;*/\r\n longFlag = !longFlag;\r\n currentAng += angle*dir;\r\n }\r\n },\r\n convertPolygonToPath: function() {\r\n var numPts = Math.floor(this.pt.v);\r\n var angle = Math.PI*2/numPts;\r\n var rad = this.or.v;\r\n var roundness = this.os.v;\r\n var perimSegment = 2*Math.PI*rad/(numPts*4);\r\n var i, currentAng = -Math.PI/ 2;\r\n var dir = this.data.d === 3 ? -1 : 1;\r\n currentAng += this.r.v;\r\n this.v._length = 0;\r\n for(i=0;i<numPts;i+=1){\r\n var x = rad * Math.cos(currentAng);\r\n var y = rad * Math.sin(currentAng);\r\n var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);\r\n var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);\r\n x += + this.p.v[0];\r\n y += + this.p.v[1];\r\n this.v.setTripleAt(x,y,x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir,x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir, i, true);\r\n currentAng += angle*dir;\r\n }\r\n this.paths.length = 0;\r\n this.paths[0] = this.v;\r\n }\r\n\r\n }\r\n extendPrototype([DynamicPropertyContainer], StarShapeProperty);\r\n\r\n return StarShapeProperty;\r\n }());\r\n\r\n var RectShapeProperty = (function() {\r\n\r\n function RectShapeProperty(elem,data) {\r\n this.v = shape_pool.newElement();\r\n this.v.c = true;\r\n this.localShapeCollection = shapeCollection_pool.newShapeCollection();\r\n this.localShapeCollection.addShape(this.v);\r\n this.paths = this.localShapeCollection;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.frameId = -1;\r\n this.d = data.d;\r\n this.initDynamicPropertyContainer(elem);\r\n this.p = PropertyFactory.getProp(elem,data.p,1,0,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,0,this);\r\n this.r = PropertyFactory.getProp(elem,data.r,0,0,this);\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.k = false;\r\n this.convertRectToPath();\r\n }\r\n };\r\n\r\n RectShapeProperty.prototype = {\r\n convertRectToPath: function (){\r\n var p0 = this.p.v[0], p1 = this.p.v[1], v0 = this.s.v[0]/2, v1 = this.s.v[1]/2;\r\n var round = bm_min(v0,v1,this.r.v);\r\n var cPoint = round*(1-roundCorner);\r\n this.v._length = 0;\r\n\r\n if(this.d === 2 || this.d === 1) {\r\n this.v.setTripleAt(p0+v0, p1-v1+round,p0+v0, p1-v1+round,p0+v0,p1-v1+cPoint,0, true);\r\n this.v.setTripleAt(p0+v0, p1+v1-round,p0+v0, p1+v1-cPoint,p0+v0, p1+v1-round,1, true);\r\n if(round!== 0){\r\n this.v.setTripleAt(p0+v0-round, p1+v1,p0+v0-round,p1+v1,p0+v0-cPoint,p1+v1,2, true);\r\n this.v.setTripleAt(p0-v0+round,p1+v1,p0-v0+cPoint,p1+v1,p0-v0+round,p1+v1,3, true);\r\n this.v.setTripleAt(p0-v0,p1+v1-round,p0-v0,p1+v1-round,p0-v0,p1+v1-cPoint,4, true);\r\n this.v.setTripleAt(p0-v0,p1-v1+round,p0-v0,p1-v1+cPoint,p0-v0,p1-v1+round,5, true);\r\n this.v.setTripleAt(p0-v0+round,p1-v1,p0-v0+round,p1-v1,p0-v0+cPoint,p1-v1,6, true);\r\n this.v.setTripleAt(p0+v0-round,p1-v1,p0+v0-cPoint,p1-v1,p0+v0-round,p1-v1,7, true);\r\n } else {\r\n this.v.setTripleAt(p0-v0,p1+v1,p0-v0+cPoint,p1+v1,p0-v0,p1+v1,2);\r\n this.v.setTripleAt(p0-v0,p1-v1,p0-v0,p1-v1+cPoint,p0-v0,p1-v1,3);\r\n }\r\n }else{\r\n this.v.setTripleAt(p0+v0,p1-v1+round,p0+v0,p1-v1+cPoint,p0+v0,p1-v1+round,0, true);\r\n if(round!== 0){\r\n this.v.setTripleAt(p0+v0-round,p1-v1,p0+v0-round,p1-v1,p0+v0-cPoint,p1-v1,1, true);\r\n this.v.setTripleAt(p0-v0+round,p1-v1,p0-v0+cPoint,p1-v1,p0-v0+round,p1-v1,2, true);\r\n this.v.setTripleAt(p0-v0,p1-v1+round,p0-v0,p1-v1+round,p0-v0,p1-v1+cPoint,3, true);\r\n this.v.setTripleAt(p0-v0,p1+v1-round,p0-v0,p1+v1-cPoint,p0-v0,p1+v1-round,4, true);\r\n this.v.setTripleAt(p0-v0+round,p1+v1,p0-v0+round,p1+v1,p0-v0+cPoint,p1+v1,5, true);\r\n this.v.setTripleAt(p0+v0-round,p1+v1,p0+v0-cPoint,p1+v1,p0+v0-round,p1+v1,6, true);\r\n this.v.setTripleAt(p0+v0,p1+v1-round,p0+v0,p1+v1-round,p0+v0,p1+v1-cPoint,7, true);\r\n } else {\r\n this.v.setTripleAt(p0-v0,p1-v1,p0-v0+cPoint,p1-v1,p0-v0,p1-v1,1, true);\r\n this.v.setTripleAt(p0-v0,p1+v1,p0-v0,p1+v1-cPoint,p0-v0,p1+v1,2, true);\r\n this.v.setTripleAt(p0+v0,p1+v1,p0+v0-cPoint,p1+v1,p0+v0,p1+v1,3, true);\r\n\r\n }\r\n }\r\n },\r\n getValue: function(frameNum){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n if(this._mdf){\r\n this.convertRectToPath();\r\n }\r\n\r\n },\r\n reset: resetShape\r\n }\r\n extendPrototype([DynamicPropertyContainer], RectShapeProperty);\r\n\r\n return RectShapeProperty;\r\n }());\r\n\r\n function getShapeProp(elem,data,type){\r\n var prop;\r\n if(type === 3 || type === 4){\r\n var dataProp = type === 3 ? data.pt : data.ks;\r\n var keys = dataProp.k;\r\n if(keys.length){\r\n prop = new KeyframedShapeProperty(elem, data, type);\r\n }else{\r\n prop = new ShapeProperty(elem, data, type);\r\n }\r\n }else if(type === 5){\r\n prop = new RectShapeProperty(elem, data);\r\n }else if(type === 6){\r\n prop = new EllShapeProperty(elem, data);\r\n }else if(type === 7){\r\n prop = new StarShapeProperty(elem, data);\r\n }\r\n if(prop.k){\r\n elem.addDynamicProperty(prop);\r\n }\r\n return prop;\r\n }\r\n\r\n function getConstructorFunction() {\r\n return ShapeProperty;\r\n }\r\n\r\n function getKeyframedConstructorFunction() {\r\n return KeyframedShapeProperty;\r\n }\r\n\r\n var ob = {};\r\n ob.getShapeProp = getShapeProp;\r\n ob.getConstructorFunction = getConstructorFunction;\r\n ob.getKeyframedConstructorFunction = getKeyframedConstructorFunction;\r\n return ob;\r\n}());\r\nvar ShapeModifiers = (function(){\r\n var ob = {};\r\n var modifiers = {};\r\n ob.registerModifier = registerModifier;\r\n ob.getModifier = getModifier;\r\n\r\n function registerModifier(nm,factory){\r\n if(!modifiers[nm]){\r\n modifiers[nm] = factory;\r\n }\r\n }\r\n\r\n function getModifier(nm,elem, data){\r\n return new modifiers[nm](elem, data);\r\n }\r\n\r\n return ob;\r\n}());\r\n\r\nfunction ShapeModifier(){}\r\nShapeModifier.prototype.initModifierProperties = function(){};\r\nShapeModifier.prototype.addShapeToModifier = function(){};\r\nShapeModifier.prototype.addShape = function(data){\r\n if (!this.closed) {\r\n // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick.\r\n data.sh.container.addDynamicProperty(data.sh);\r\n var shapeData = {shape:data.sh, data: data, localShapeCollection:shapeCollection_pool.newShapeCollection()};\r\n this.shapes.push(shapeData);\r\n this.addShapeToModifier(shapeData);\r\n if (this._isAnimated) {\r\n data.setAsAnimated();\r\n }\r\n }\r\n};\r\nShapeModifier.prototype.init = function(elem,data){\r\n this.shapes = [];\r\n this.elem = elem;\r\n this.initDynamicPropertyContainer(elem);\r\n this.initModifierProperties(elem,data);\r\n this.frameId = initialDefaultFrame;\r\n this.closed = false;\r\n this.k = false;\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.getValue(true);\r\n }\r\n};\r\nShapeModifier.prototype.processKeys = function(){\r\n if(this.elem.globalData.frameId === this.frameId){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], ShapeModifier);\r\nfunction TrimModifier(){\r\n}\r\nextendPrototype([ShapeModifier], TrimModifier);\r\nTrimModifier.prototype.initModifierProperties = function(elem, data) {\r\n this.s = PropertyFactory.getProp(elem, data.s, 0, 0.01, this);\r\n this.e = PropertyFactory.getProp(elem, data.e, 0, 0.01, this);\r\n this.o = PropertyFactory.getProp(elem, data.o, 0, 0, this);\r\n this.sValue = 0;\r\n this.eValue = 0;\r\n this.getValue = this.processKeys;\r\n this.m = data.m;\r\n this._isAnimated = !!this.s.effectsSequence.length || !!this.e.effectsSequence.length || !!this.o.effectsSequence.length;\r\n};\r\n\r\nTrimModifier.prototype.addShapeToModifier = function(shapeData){\r\n shapeData.pathsData = [];\r\n};\r\n\r\nTrimModifier.prototype.calculateShapeEdges = function(s, e, shapeLength, addedLength, totalModifierLength) {\r\n var segments = [];\r\n if (e <= 1) {\r\n segments.push({\r\n s: s,\r\n e: e\r\n });\r\n } else if (s >= 1) {\r\n segments.push({\r\n s: s - 1,\r\n e: e - 1\r\n });\r\n } else {\r\n segments.push({\r\n s: s,\r\n e: 1\r\n });\r\n segments.push({\r\n s: 0,\r\n e: e - 1\r\n });\r\n }\r\n var shapeSegments = [];\r\n var i, len = segments.length, segmentOb;\r\n for (i = 0; i < len; i += 1) {\r\n segmentOb = segments[i];\r\n if (segmentOb.e * totalModifierLength < addedLength || segmentOb.s * totalModifierLength > addedLength + shapeLength) {\r\n \r\n } else {\r\n var shapeS, shapeE;\r\n if (segmentOb.s * totalModifierLength <= addedLength) {\r\n shapeS = 0;\r\n } else {\r\n shapeS = (segmentOb.s * totalModifierLength - addedLength) / shapeLength;\r\n }\r\n if(segmentOb.e * totalModifierLength >= addedLength + shapeLength) {\r\n shapeE = 1;\r\n } else {\r\n shapeE = ((segmentOb.e * totalModifierLength - addedLength) / shapeLength);\r\n }\r\n shapeSegments.push([shapeS, shapeE]);\r\n }\r\n }\r\n if (!shapeSegments.length) {\r\n shapeSegments.push([0, 0]);\r\n }\r\n return shapeSegments;\r\n};\r\n\r\nTrimModifier.prototype.releasePathsData = function(pathsData) {\r\n var i, len = pathsData.length;\r\n for (i = 0; i < len; i += 1) {\r\n segments_length_pool.release(pathsData[i]);\r\n }\r\n pathsData.length = 0;\r\n return pathsData;\r\n};\r\n\r\nTrimModifier.prototype.processShapes = function(_isFirstFrame) {\r\n var s, e;\r\n if (this._mdf || _isFirstFrame) {\r\n var o = (this.o.v % 360) / 360;\r\n if (o < 0) {\r\n o += 1;\r\n }\r\n s = (this.s.v > 1 ? 1 : this.s.v < 0 ? 0 : this.s.v) + o;\r\n e = (this.e.v > 1 ? 1 : this.e.v < 0 ? 0 : this.e.v) + o;\r\n if (s === e) {\r\n\r\n }\r\n if (s > e) {\r\n var _s = s;\r\n s = e;\r\n e = _s;\r\n }\r\n s = Math.round(s * 10000) * 0.0001;\r\n e = Math.round(e * 10000) * 0.0001;\r\n this.sValue = s;\r\n this.eValue = e;\r\n } else {\r\n s = this.sValue;\r\n e = this.eValue;\r\n }\r\n var shapePaths;\r\n var i, len = this.shapes.length, j, jLen;\r\n var pathsData, pathData, totalShapeLength, totalModifierLength = 0;\r\n\r\n if (e === s) {\r\n for (i = 0; i < len; i += 1) {\r\n this.shapes[i].localShapeCollection.releaseShapes();\r\n this.shapes[i].shape._mdf = true;\r\n this.shapes[i].shape.paths = this.shapes[i].localShapeCollection;\r\n }\r\n } else if (!((e === 1 && s === 0) || (e===0 && s === 1))){\r\n var segments = [], shapeData, localShapeCollection;\r\n for (i = 0; i < len; i += 1) {\r\n shapeData = this.shapes[i];\r\n // if shape hasn't changed and trim properties haven't changed, cached previous path can be used\r\n if (!shapeData.shape._mdf && !this._mdf && !_isFirstFrame && this.m !== 2) {\r\n shapeData.shape.paths = shapeData.localShapeCollection;\r\n } else {\r\n shapePaths = shapeData.shape.paths;\r\n jLen = shapePaths._length;\r\n totalShapeLength = 0;\r\n if (!shapeData.shape._mdf && shapeData.pathsData.length) {\r\n totalShapeLength = shapeData.totalShapeLength;\r\n } else {\r\n pathsData = this.releasePathsData(shapeData.pathsData);\r\n for (j = 0; j < jLen; j += 1) {\r\n pathData = bez.getSegmentsLength(shapePaths.shapes[j]);\r\n pathsData.push(pathData);\r\n totalShapeLength += pathData.totalLength;\r\n }\r\n shapeData.totalShapeLength = totalShapeLength;\r\n shapeData.pathsData = pathsData;\r\n }\r\n\r\n totalModifierLength += totalShapeLength;\r\n shapeData.shape._mdf = true;\r\n }\r\n }\r\n var shapeS = s, shapeE = e, addedLength = 0, edges;\r\n for (i = len - 1; i >= 0; i -= 1) {\r\n shapeData = this.shapes[i];\r\n if (shapeData.shape._mdf) {\r\n localShapeCollection = shapeData.localShapeCollection;\r\n localShapeCollection.releaseShapes();\r\n //if m === 2 means paths are trimmed individually so edges need to be found for this specific shape relative to whoel group\r\n if (this.m === 2 && len > 1) {\r\n edges = this.calculateShapeEdges(s, e, shapeData.totalShapeLength, addedLength, totalModifierLength);\r\n addedLength += shapeData.totalShapeLength;\r\n } else {\r\n edges = [[shapeS, shapeE]];\r\n }\r\n jLen = edges.length;\r\n for (j = 0; j < jLen; j += 1) {\r\n shapeS = edges[j][0];\r\n shapeE = edges[j][1];\r\n segments.length = 0;\r\n if (shapeE <= 1) {\r\n segments.push({\r\n s:shapeData.totalShapeLength * shapeS,\r\n e:shapeData.totalShapeLength * shapeE\r\n });\r\n } else if (shapeS >= 1) {\r\n segments.push({\r\n s:shapeData.totalShapeLength * (shapeS - 1),\r\n e:shapeData.totalShapeLength * (shapeE - 1)\r\n });\r\n } else {\r\n segments.push({\r\n s:shapeData.totalShapeLength * shapeS,\r\n e:shapeData.totalShapeLength\r\n });\r\n segments.push({\r\n s:0,\r\n e:shapeData.totalShapeLength * (shapeE - 1)\r\n });\r\n }\r\n var newShapesData = this.addShapes(shapeData,segments[0]);\r\n if (segments[0].s !== segments[0].e) {\r\n if (segments.length > 1) {\r\n var lastShapeInCollection = shapeData.shape.paths.shapes[shapeData.shape.paths._length - 1];\r\n if (lastShapeInCollection.c) {\r\n var lastShape = newShapesData.pop();\r\n this.addPaths(newShapesData, localShapeCollection);\r\n newShapesData = this.addShapes(shapeData, segments[1], lastShape);\r\n } else {\r\n this.addPaths(newShapesData, localShapeCollection);\r\n newShapesData = this.addShapes(shapeData, segments[1]);\r\n }\r\n } \r\n this.addPaths(newShapesData, localShapeCollection);\r\n }\r\n \r\n }\r\n shapeData.shape.paths = localShapeCollection;\r\n }\r\n }\r\n } else if (this._mdf) {\r\n for (i = 0; i < len; i += 1) {\r\n //Releasign Trim Cached paths data when no trim applied in case shapes are modified inbetween.\r\n //Don't remove this even if it's losing cached info.\r\n this.shapes[i].pathsData.length = 0;\r\n this.shapes[i].shape._mdf = true;\r\n }\r\n }\r\n};\r\n\r\nTrimModifier.prototype.addPaths = function(newPaths, localShapeCollection) {\r\n var i, len = newPaths.length;\r\n for (i = 0; i < len; i += 1) {\r\n localShapeCollection.addShape(newPaths[i]);\r\n }\r\n};\r\n\r\nTrimModifier.prototype.addSegment = function(pt1, pt2, pt3, pt4, shapePath, pos, newShape) {\r\n shapePath.setXYAt(pt2[0], pt2[1], 'o', pos);\r\n shapePath.setXYAt(pt3[0], pt3[1], 'i', pos + 1);\r\n if(newShape){\r\n shapePath.setXYAt(pt1[0], pt1[1], 'v', pos);\r\n }\r\n shapePath.setXYAt(pt4[0], pt4[1], 'v', pos + 1);\r\n};\r\n\r\nTrimModifier.prototype.addSegmentFromArray = function(points, shapePath, pos, newShape) {\r\n shapePath.setXYAt(points[1], points[5], 'o', pos);\r\n shapePath.setXYAt(points[2], points[6], 'i', pos + 1);\r\n if(newShape){\r\n shapePath.setXYAt(points[0], points[4], 'v', pos);\r\n }\r\n shapePath.setXYAt(points[3], points[7], 'v', pos + 1);\r\n};\r\n\r\nTrimModifier.prototype.addShapes = function(shapeData, shapeSegment, shapePath) {\r\n var pathsData = shapeData.pathsData;\r\n var shapePaths = shapeData.shape.paths.shapes;\r\n var i, len = shapeData.shape.paths._length, j, jLen;\r\n var addedLength = 0;\r\n var currentLengthData,segmentCount;\r\n var lengths;\r\n var segment;\r\n var shapes = [];\r\n var initPos;\r\n var newShape = true;\r\n if (!shapePath) {\r\n shapePath = shape_pool.newElement();\r\n segmentCount = 0;\r\n initPos = 0;\r\n } else {\r\n segmentCount = shapePath._length;\r\n initPos = shapePath._length;\r\n }\r\n shapes.push(shapePath);\r\n for (i = 0; i < len; i += 1) {\r\n lengths = pathsData[i].lengths;\r\n shapePath.c = shapePaths[i].c;\r\n jLen = shapePaths[i].c ? lengths.length : lengths.length + 1;\r\n for (j = 1; j < jLen; j +=1) {\r\n currentLengthData = lengths[j-1];\r\n if (addedLength + currentLengthData.addedLength < shapeSegment.s) {\r\n addedLength += currentLengthData.addedLength;\r\n shapePath.c = false;\r\n } else if(addedLength > shapeSegment.e) {\r\n shapePath.c = false;\r\n break;\r\n } else {\r\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + currentLengthData.addedLength) {\r\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[j], shapePaths[i].v[j], shapePath, segmentCount, newShape);\r\n newShape = false;\r\n } else {\r\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[j], shapePaths[i].o[j - 1], shapePaths[i].i[j], (shapeSegment.s - addedLength)/currentLengthData.addedLength,(shapeSegment.e - addedLength)/currentLengthData.addedLength, lengths[j-1]);\r\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape);\r\n // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\r\n newShape = false;\r\n shapePath.c = false;\r\n }\r\n addedLength += currentLengthData.addedLength;\r\n segmentCount += 1;\r\n }\r\n }\r\n if (shapePaths[i].c && lengths.length) {\r\n currentLengthData = lengths[j - 1];\r\n if (addedLength <= shapeSegment.e) {\r\n var segmentLength = lengths[j - 1].addedLength;\r\n if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + segmentLength) {\r\n this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[0], shapePaths[i].v[0], shapePath, segmentCount, newShape);\r\n newShape = false;\r\n } else {\r\n segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[0], shapePaths[i].o[j - 1], shapePaths[i].i[0], (shapeSegment.s - addedLength) / segmentLength, (shapeSegment.e - addedLength) / segmentLength, lengths[j - 1]);\r\n this.addSegmentFromArray(segment, shapePath, segmentCount, newShape);\r\n // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape);\r\n newShape = false;\r\n shapePath.c = false;\r\n }\r\n } else {\r\n shapePath.c = false;\r\n }\r\n addedLength += currentLengthData.addedLength;\r\n segmentCount += 1;\r\n }\r\n if (shapePath._length) {\r\n shapePath.setXYAt(shapePath.v[initPos][0], shapePath.v[initPos][1], 'i', initPos);\r\n shapePath.setXYAt(shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1],'o', shapePath._length - 1);\r\n }\r\n if (addedLength > shapeSegment.e) {\r\n break;\r\n }\r\n if (i < len - 1) {\r\n shapePath = shape_pool.newElement();\r\n newShape = true;\r\n shapes.push(shapePath);\r\n segmentCount = 0;\r\n }\r\n }\r\n return shapes;\r\n};\r\n\r\n\r\nShapeModifiers.registerModifier('tm', TrimModifier);\r\nfunction RoundCornersModifier(){}\r\nextendPrototype([ShapeModifier],RoundCornersModifier);\r\nRoundCornersModifier.prototype.initModifierProperties = function(elem,data){\r\n this.getValue = this.processKeys;\r\n this.rd = PropertyFactory.getProp(elem,data.r,0,null,this);\r\n this._isAnimated = !!this.rd.effectsSequence.length;\r\n};\r\n\r\nRoundCornersModifier.prototype.processPath = function(path, round){\r\n var cloned_path = shape_pool.newElement();\r\n cloned_path.c = path.c;\r\n var i, len = path._length;\r\n var currentV,currentI,currentO,closerV, newV,newO,newI,distance,newPosPerc,index = 0;\r\n var vX,vY,oX,oY,iX,iY;\r\n for(i=0;i<len;i+=1){\r\n currentV = path.v[i];\r\n currentO = path.o[i];\r\n currentI = path.i[i];\r\n if(currentV[0]===currentO[0] && currentV[1]===currentO[1] && currentV[0]===currentI[0] && currentV[1]===currentI[1]){\r\n if((i===0 || i === len - 1) && !path.c){\r\n cloned_path.setTripleAt(currentV[0],currentV[1],currentO[0],currentO[1],currentI[0],currentI[1],index);\r\n /*cloned_path.v[index] = currentV;\r\n cloned_path.o[index] = currentO;\r\n cloned_path.i[index] = currentI;*/\r\n index += 1;\r\n } else {\r\n if(i===0){\r\n closerV = path.v[len-1];\r\n } else {\r\n closerV = path.v[i-1];\r\n }\r\n distance = Math.sqrt(Math.pow(currentV[0]-closerV[0],2)+Math.pow(currentV[1]-closerV[1],2));\r\n newPosPerc = distance ? Math.min(distance/2,round)/distance : 0;\r\n vX = iX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc;\r\n vY = iY = currentV[1]-(currentV[1]-closerV[1])*newPosPerc;\r\n oX = vX-(vX-currentV[0])*roundCorner;\r\n oY = vY-(vY-currentV[1])*roundCorner;\r\n cloned_path.setTripleAt(vX,vY,oX,oY,iX,iY,index);\r\n index += 1;\r\n\r\n if(i === len - 1){\r\n closerV = path.v[0];\r\n } else {\r\n closerV = path.v[i+1];\r\n }\r\n distance = Math.sqrt(Math.pow(currentV[0]-closerV[0],2)+Math.pow(currentV[1]-closerV[1],2));\r\n newPosPerc = distance ? Math.min(distance/2,round)/distance : 0;\r\n vX = oX = currentV[0]+(closerV[0]-currentV[0])*newPosPerc;\r\n vY = oY = currentV[1]+(closerV[1]-currentV[1])*newPosPerc;\r\n iX = vX-(vX-currentV[0])*roundCorner;\r\n iY = vY-(vY-currentV[1])*roundCorner;\r\n cloned_path.setTripleAt(vX,vY,oX,oY,iX,iY,index);\r\n index += 1;\r\n }\r\n } else {\r\n cloned_path.setTripleAt(path.v[i][0],path.v[i][1],path.o[i][0],path.o[i][1],path.i[i][0],path.i[i][1],index);\r\n index += 1;\r\n }\r\n }\r\n return cloned_path;\r\n};\r\n\r\nRoundCornersModifier.prototype.processShapes = function(_isFirstFrame){\r\n var shapePaths;\r\n var i, len = this.shapes.length;\r\n var j, jLen;\r\n var rd = this.rd.v;\r\n\r\n if(rd !== 0){\r\n var shapeData, newPaths, localShapeCollection;\r\n for(i=0;i<len;i+=1){\r\n shapeData = this.shapes[i];\r\n newPaths = shapeData.shape.paths;\r\n localShapeCollection = shapeData.localShapeCollection;\r\n if(!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)){\r\n localShapeCollection.releaseShapes();\r\n shapeData.shape._mdf = true;\r\n shapePaths = shapeData.shape.paths.shapes;\r\n jLen = shapeData.shape.paths._length;\r\n for(j=0;j<jLen;j+=1){\r\n localShapeCollection.addShape(this.processPath(shapePaths[j],rd));\r\n }\r\n }\r\n shapeData.shape.paths = shapeData.localShapeCollection;\r\n }\r\n\r\n }\r\n if(!this.dynamicProperties.length){\r\n this._mdf = false;\r\n }\r\n};\r\n\r\nShapeModifiers.registerModifier('rd',RoundCornersModifier);\r\nfunction RepeaterModifier(){}\r\nextendPrototype([ShapeModifier], RepeaterModifier);\r\n\r\nRepeaterModifier.prototype.initModifierProperties = function(elem,data){\r\n this.getValue = this.processKeys;\r\n this.c = PropertyFactory.getProp(elem,data.c,0,null,this);\r\n this.o = PropertyFactory.getProp(elem,data.o,0,null,this);\r\n this.tr = TransformPropertyFactory.getTransformProperty(elem,data.tr,this);\r\n this.so = PropertyFactory.getProp(elem,data.tr.so,0,0.01,this);\r\n this.eo = PropertyFactory.getProp(elem,data.tr.eo,0,0.01,this);\r\n this.data = data;\r\n if(!this.dynamicProperties.length){\r\n this.getValue(true);\r\n }\r\n this._isAnimated = !!this.dynamicProperties.length;\r\n this.pMatrix = new Matrix();\r\n this.rMatrix = new Matrix();\r\n this.sMatrix = new Matrix();\r\n this.tMatrix = new Matrix();\r\n this.matrix = new Matrix();\r\n};\r\n\r\nRepeaterModifier.prototype.applyTransforms = function(pMatrix, rMatrix, sMatrix, transform, perc, inv){\r\n var dir = inv ? -1 : 1;\r\n var scaleX = transform.s.v[0] + (1 - transform.s.v[0]) * (1 - perc);\r\n var scaleY = transform.s.v[1] + (1 - transform.s.v[1]) * (1 - perc);\r\n pMatrix.translate(transform.p.v[0] * dir * perc, transform.p.v[1] * dir * perc, transform.p.v[2]);\r\n rMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\r\n rMatrix.rotate(-transform.r.v * dir * perc);\r\n rMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\r\n sMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]);\r\n sMatrix.scale(inv ? 1/scaleX : scaleX, inv ? 1/scaleY : scaleY);\r\n sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]);\r\n};\r\n\r\nRepeaterModifier.prototype.init = function(elem, arr, pos, elemsData) {\r\n this.elem = elem;\r\n this.arr = arr;\r\n this.pos = pos;\r\n this.elemsData = elemsData;\r\n this._currentCopies = 0;\r\n this._elements = [];\r\n this._groups = [];\r\n this.frameId = -1;\r\n this.initDynamicPropertyContainer(elem);\r\n this.initModifierProperties(elem,arr[pos]);\r\n var cont = 0;\r\n while(pos>0){\r\n pos -= 1;\r\n //this._elements.unshift(arr.splice(pos,1)[0]);\r\n this._elements.unshift(arr[pos]);\r\n cont += 1;\r\n }\r\n if(this.dynamicProperties.length){\r\n this.k = true;\r\n }else{\r\n this.getValue(true);\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.resetElements = function(elements){\r\n var i, len = elements.length;\r\n for(i = 0; i < len; i += 1) {\r\n elements[i]._processed = false;\r\n if(elements[i].ty === 'gr'){\r\n this.resetElements(elements[i].it);\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.cloneElements = function(elements){\r\n var i, len = elements.length;\r\n var newElements = JSON.parse(JSON.stringify(elements));\r\n this.resetElements(newElements);\r\n return newElements;\r\n};\r\n\r\nRepeaterModifier.prototype.changeGroupRender = function(elements, renderFlag) {\r\n var i, len = elements.length;\r\n for(i = 0; i < len; i += 1) {\r\n elements[i]._render = renderFlag;\r\n if(elements[i].ty === 'gr') {\r\n this.changeGroupRender(elements[i].it, renderFlag);\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.processShapes = function(_isFirstFrame) {\r\n var items, itemsTransform, i, dir, cont;\r\n if(this._mdf || _isFirstFrame){\r\n var copies = Math.ceil(this.c.v);\r\n if(this._groups.length < copies){\r\n while(this._groups.length < copies){\r\n var group = {\r\n it:this.cloneElements(this._elements),\r\n ty:'gr'\r\n };\r\n group.it.push({\"a\":{\"a\":0,\"ix\":1,\"k\":[0,0]},\"nm\":\"Transform\",\"o\":{\"a\":0,\"ix\":7,\"k\":100},\"p\":{\"a\":0,\"ix\":2,\"k\":[0,0]},\"r\":{\"a\":1,\"ix\":6,\"k\":[{s:0,e:0,t:0},{s:0,e:0,t:1}]},\"s\":{\"a\":0,\"ix\":3,\"k\":[100,100]},\"sa\":{\"a\":0,\"ix\":5,\"k\":0},\"sk\":{\"a\":0,\"ix\":4,\"k\":0},\"ty\":\"tr\"});\r\n \r\n this.arr.splice(0,0,group);\r\n this._groups.splice(0,0,group);\r\n this._currentCopies += 1;\r\n }\r\n this.elem.reloadShapes();\r\n }\r\n cont = 0;\r\n var renderFlag;\r\n for(i = 0; i <= this._groups.length - 1; i += 1){\r\n renderFlag = cont < copies;\r\n this._groups[i]._render = renderFlag;\r\n this.changeGroupRender(this._groups[i].it, renderFlag);\r\n cont += 1;\r\n }\r\n \r\n this._currentCopies = copies;\r\n ////\r\n\r\n var offset = this.o.v;\r\n var offsetModulo = offset%1;\r\n var roundOffset = offset > 0 ? Math.floor(offset) : Math.ceil(offset);\r\n var k;\r\n var tMat = this.tr.v.props;\r\n var pProps = this.pMatrix.props;\r\n var rProps = this.rMatrix.props;\r\n var sProps = this.sMatrix.props;\r\n this.pMatrix.reset();\r\n this.rMatrix.reset();\r\n this.sMatrix.reset();\r\n this.tMatrix.reset();\r\n this.matrix.reset();\r\n var iteration = 0;\r\n\r\n if(offset > 0) {\r\n while(iteration<roundOffset){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\r\n iteration += 1;\r\n }\r\n if(offsetModulo){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, offsetModulo, false);\r\n iteration += offsetModulo;\r\n }\r\n } else if(offset < 0) {\r\n while(iteration>roundOffset){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, true);\r\n iteration -= 1;\r\n }\r\n if(offsetModulo){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, - offsetModulo, true);\r\n iteration -= offsetModulo;\r\n }\r\n }\r\n i = this.data.m === 1 ? 0 : this._currentCopies - 1;\r\n dir = this.data.m === 1 ? 1 : -1;\r\n cont = this._currentCopies;\r\n var j, jLen;\r\n while(cont){\r\n items = this.elemsData[i].it;\r\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\r\n jLen = itemsTransform.length;\r\n items[items.length - 1].transform.mProps._mdf = true;\r\n items[items.length - 1].transform.op._mdf = true;\r\n items[items.length - 1].transform.op.v = this.so.v + (this.eo.v - this.so.v) * (i / (this._currentCopies - 1));\r\n if(iteration !== 0){\r\n if((i !== 0 && dir === 1) || (i !== this._currentCopies - 1 && dir === -1)){\r\n this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false);\r\n }\r\n this.matrix.transform(rProps[0],rProps[1],rProps[2],rProps[3],rProps[4],rProps[5],rProps[6],rProps[7],rProps[8],rProps[9],rProps[10],rProps[11],rProps[12],rProps[13],rProps[14],rProps[15]);\r\n this.matrix.transform(sProps[0],sProps[1],sProps[2],sProps[3],sProps[4],sProps[5],sProps[6],sProps[7],sProps[8],sProps[9],sProps[10],sProps[11],sProps[12],sProps[13],sProps[14],sProps[15]);\r\n this.matrix.transform(pProps[0],pProps[1],pProps[2],pProps[3],pProps[4],pProps[5],pProps[6],pProps[7],pProps[8],pProps[9],pProps[10],pProps[11],pProps[12],pProps[13],pProps[14],pProps[15]);\r\n \r\n for(j=0;j<jLen;j+=1) {\r\n itemsTransform[j] = this.matrix.props[j];\r\n }\r\n this.matrix.reset();\r\n } else {\r\n this.matrix.reset();\r\n for(j=0;j<jLen;j+=1) {\r\n itemsTransform[j] = this.matrix.props[j];\r\n }\r\n }\r\n iteration += 1;\r\n cont -= 1;\r\n i += dir;\r\n }\r\n } else {\r\n cont = this._currentCopies;\r\n i = 0;\r\n dir = 1;\r\n while(cont){\r\n items = this.elemsData[i].it;\r\n itemsTransform = items[items.length - 1].transform.mProps.v.props;\r\n items[items.length - 1].transform.mProps._mdf = false;\r\n items[items.length - 1].transform.op._mdf = false;\r\n cont -= 1;\r\n i += dir;\r\n }\r\n }\r\n};\r\n\r\nRepeaterModifier.prototype.addShape = function(){};\r\n\r\nShapeModifiers.registerModifier('rp',RepeaterModifier);\r\nfunction ShapeCollection(){\r\n\tthis._length = 0;\r\n\tthis._maxLength = 4;\r\n\tthis.shapes = createSizedArray(this._maxLength);\r\n}\r\n\r\nShapeCollection.prototype.addShape = function(shapeData){\r\n\tif(this._length === this._maxLength){\r\n\t\tthis.shapes = this.shapes.concat(createSizedArray(this._maxLength));\r\n\t\tthis._maxLength *= 2;\r\n\t}\r\n\tthis.shapes[this._length] = shapeData;\r\n\tthis._length += 1;\r\n};\r\n\r\nShapeCollection.prototype.releaseShapes = function(){\r\n\tvar i;\r\n\tfor(i = 0; i < this._length; i += 1) {\r\n\t\tshape_pool.release(this.shapes[i]);\r\n\t}\r\n\tthis._length = 0;\r\n};\r\nfunction DashProperty(elem, data, renderer, container) {\r\n this.elem = elem;\r\n this.frameId = -1;\r\n this.dataProps = createSizedArray(data.length);\r\n this.renderer = renderer;\r\n this.k = false;\r\n this.dashStr = '';\r\n this.dashArray = createTypedArray('float32', data.length ? data.length - 1 : 0);\r\n this.dashoffset = createTypedArray('float32', 1);\r\n this.initDynamicPropertyContainer(container);\r\n var i, len = data.length || 0, prop;\r\n for(i = 0; i < len; i += 1) {\r\n prop = PropertyFactory.getProp(elem,data[i].v,0, 0, this);\r\n this.k = prop.k || this.k;\r\n this.dataProps[i] = {n:data[i].n,p:prop};\r\n }\r\n if(!this.k){\r\n this.getValue(true);\r\n }\r\n this._isAnimated = this.k;\r\n}\r\n\r\nDashProperty.prototype.getValue = function(forceRender) {\r\n if(this.elem.globalData.frameId === this.frameId && !forceRender){\r\n return;\r\n }\r\n this.frameId = this.elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n this._mdf = this._mdf || forceRender;\r\n if (this._mdf) {\r\n var i = 0, len = this.dataProps.length;\r\n if(this.renderer === 'svg') {\r\n this.dashStr = '';\r\n }\r\n for(i=0;i<len;i+=1){\r\n if(this.dataProps[i].n != 'o'){\r\n if(this.renderer === 'svg') {\r\n this.dashStr += ' ' + this.dataProps[i].p.v;\r\n }else{\r\n this.dashArray[i] = this.dataProps[i].p.v;\r\n }\r\n }else{\r\n this.dashoffset[0] = this.dataProps[i].p.v;\r\n }\r\n }\r\n }\r\n};\r\nextendPrototype([DynamicPropertyContainer], DashProperty);\r\nfunction GradientProperty(elem,data,container){\r\n this.data = data;\r\n this.c = createTypedArray('uint8c', data.p*4);\r\n var cLength = data.k.k[0].s ? (data.k.k[0].s.length - data.p*4) : data.k.k.length - data.p*4;\r\n this.o = createTypedArray('float32', cLength);\r\n this._cmdf = false;\r\n this._omdf = false;\r\n this._collapsable = this.checkCollapsable();\r\n this._hasOpacity = cLength;\r\n this.initDynamicPropertyContainer(container);\r\n this.prop = PropertyFactory.getProp(elem,data.k,1,null,this);\r\n this.k = this.prop.k;\r\n this.getValue(true);\r\n}\r\n\r\nGradientProperty.prototype.comparePoints = function(values, points) {\r\n var i = 0, len = this.o.length/2, diff;\r\n while(i < len) {\r\n diff = Math.abs(values[i*4] - values[points*4 + i*2]);\r\n if(diff > 0.01){\r\n return false;\r\n }\r\n i += 1;\r\n }\r\n return true;\r\n};\r\n\r\nGradientProperty.prototype.checkCollapsable = function() {\r\n if (this.o.length/2 !== this.c.length/4) {\r\n return false;\r\n }\r\n if (this.data.k.k[0].s) {\r\n var i = 0, len = this.data.k.k.length;\r\n while (i < len) {\r\n if (!this.comparePoints(this.data.k.k[i].s, this.data.p)) {\r\n return false;\r\n }\r\n i += 1;\r\n }\r\n } else if(!this.comparePoints(this.data.k.k, this.data.p)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nGradientProperty.prototype.getValue = function(forceRender){\r\n this.prop.getValue();\r\n this._mdf = false;\r\n this._cmdf = false;\r\n this._omdf = false;\r\n if(this.prop._mdf || forceRender){\r\n var i, len = this.data.p*4;\r\n var mult, val;\r\n for(i=0;i<len;i+=1){\r\n mult = i%4 === 0 ? 100 : 255;\r\n val = Math.round(this.prop.v[i]*mult);\r\n if(this.c[i] !== val){\r\n this.c[i] = val;\r\n this._cmdf = !forceRender;\r\n }\r\n }\r\n if(this.o.length){\r\n len = this.prop.v.length;\r\n for(i=this.data.p*4;i<len;i+=1){\r\n mult = i%2 === 0 ? 100 : 1;\r\n val = i%2 === 0 ? Math.round(this.prop.v[i]*100):this.prop.v[i];\r\n if(this.o[i-this.data.p*4] !== val){\r\n this.o[i-this.data.p*4] = val;\r\n this._omdf = !forceRender;\r\n }\r\n }\r\n }\r\n this._mdf = !forceRender;\r\n }\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], GradientProperty);\r\nvar buildShapeString = function(pathNodes, length, closed, mat) {\r\n\tif(length === 0) {\r\n return '';\r\n }\r\n var _o = pathNodes.o;\r\n var _i = pathNodes.i;\r\n var _v = pathNodes.v;\r\n var i, shapeString = \" M\" + mat.applyToPointStringified(_v[0][0], _v[0][1]);\r\n for(i = 1; i < length; i += 1) {\r\n shapeString += \" C\" + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + \" \" + mat.applyToPointStringified(_i[i][0], _i[i][1]) + \" \" + mat.applyToPointStringified(_v[i][0], _v[i][1]);\r\n }\r\n if (closed && length) {\r\n shapeString += \" C\" + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + \" \" + mat.applyToPointStringified(_i[0][0], _i[0][1]) + \" \" + mat.applyToPointStringified(_v[0][0], _v[0][1]);\r\n shapeString += 'z';\r\n }\r\n return shapeString;\r\n}\r\nvar ImagePreloader = (function(){\r\n\r\n var proxyImage = (function(){\r\n var canvas = createTag('canvas');\r\n canvas.width = 1;\r\n canvas.height = 1;\r\n var ctx = canvas.getContext('2d');\r\n ctx.fillStyle = 'rgba(0,0,0,0)';\r\n ctx.fillRect(0, 0, 1, 1);\r\n return canvas;\r\n }())\r\n\r\n function imageLoaded(){\r\n this.loadedAssets += 1;\r\n if(this.loadedAssets === this.totalImages){\r\n if(this.imagesLoadedCb) {\r\n this.imagesLoadedCb(null);\r\n }\r\n }\r\n }\r\n\r\n function getAssetsPath(assetData, assetsPath, original_path) {\r\n var path = '';\r\n if (assetData.e) {\r\n path = assetData.p;\r\n } else if(assetsPath) {\r\n var imagePath = assetData.p;\r\n if (imagePath.indexOf('images/') !== -1) {\r\n imagePath = imagePath.split('/')[1];\r\n }\r\n path = assetsPath + imagePath;\r\n } else {\r\n path = original_path;\r\n path += assetData.u ? assetData.u : '';\r\n path += assetData.p;\r\n }\r\n return path;\r\n }\r\n\r\n function createImageData(assetData) {\r\n var path = getAssetsPath(assetData, this.assetsPath, this.path);\r\n var img = createTag('img');\r\n img.crossOrigin = 'anonymous';\r\n img.addEventListener('load', this._imageLoaded.bind(this), false);\r\n img.addEventListener('error', function() {\r\n ob.img = proxyImage;\r\n this._imageLoaded();\r\n }.bind(this), false);\r\n img.src = path;\r\n var ob = {\r\n img: img,\r\n assetData: assetData\r\n }\r\n return ob;\r\n }\r\n\r\n function loadAssets(assets, cb){\r\n this.imagesLoadedCb = cb;\r\n var i, len = assets.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!assets[i].layers){\r\n this.totalImages += 1;\r\n this.images.push(this._createImageData(assets[i]));\r\n }\r\n }\r\n }\r\n\r\n function setPath(path){\r\n this.path = path || '';\r\n }\r\n\r\n function setAssetsPath(path){\r\n this.assetsPath = path || '';\r\n }\r\n\r\n function getImage(assetData) {\r\n var i = 0, len = this.images.length;\r\n while (i < len) {\r\n if (this.images[i].assetData === assetData) {\r\n return this.images[i].img;\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function destroy() {\r\n this.imagesLoadedCb = null;\r\n this.images.length = 0;\r\n }\r\n\r\n function loaded() {\r\n return this.totalImages === this.loadedAssets;\r\n }\r\n\r\n return function ImagePreloader(){\r\n this.loadAssets = loadAssets;\r\n this.setAssetsPath = setAssetsPath;\r\n this.setPath = setPath;\r\n this.loaded = loaded;\r\n this.destroy = destroy;\r\n this.getImage = getImage;\r\n this._createImageData = createImageData;\r\n this._imageLoaded = imageLoaded;\r\n this.assetsPath = '';\r\n this.path = '';\r\n this.totalImages = 0;\r\n this.loadedAssets = 0;\r\n this.imagesLoadedCb = null;\r\n this.images = [];\r\n };\r\n}());\r\nvar featureSupport = (function(){\r\n\tvar ob = {\r\n\t\tmaskType: true\r\n\t};\r\n\tif (/MSIE 10/i.test(navigator.userAgent) || /MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)) {\r\n\t ob.maskType = false;\r\n\t}\r\n\treturn ob;\r\n}());\r\nvar filtersFactory = (function(){\r\n\tvar ob = {};\r\n\tob.createFilter = createFilter;\r\n\tob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter;\r\n\r\n\tfunction createFilter(filId){\r\n \tvar fil = createNS('filter');\r\n \tfil.setAttribute('id',filId);\r\n fil.setAttribute('filterUnits','objectBoundingBox');\r\n fil.setAttribute('x','0%');\r\n fil.setAttribute('y','0%');\r\n fil.setAttribute('width','100%');\r\n fil.setAttribute('height','100%');\r\n return fil;\r\n\t}\r\n\r\n\tfunction createAlphaToLuminanceFilter(){\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1');\r\n return feColorMatrix;\r\n\t}\r\n\r\n\treturn ob;\r\n}());\r\nvar assetLoader = (function(){\r\n\r\n\tfunction formatResponse(xhr) {\r\n\t\tif(xhr.response && typeof xhr.response === 'object') {\r\n\t\t\treturn xhr.response;\r\n\t\t} else if(xhr.response && typeof xhr.response === 'string') {\r\n\t\t\treturn JSON.parse(xhr.response);\r\n\t\t} else if(xhr.responseText) {\r\n\t\t\treturn JSON.parse(xhr.responseText);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction loadAsset(path, callback, errorCallback) {\r\n\t\tvar response;\r\n\t\tvar xhr = new XMLHttpRequest();\r\n\t\txhr.open('GET', path, true);\r\n\t\t// set responseType after calling open or IE will break.\r\n\t\ttry {\r\n\t\t // This crashes on Android WebView prior to KitKat\r\n\t\t xhr.responseType = \"json\";\r\n\t\t} catch (err) {}\r\n\t xhr.send();\r\n\t xhr.onreadystatechange = function () {\r\n\t if (xhr.readyState == 4) {\r\n\t if(xhr.status == 200){\r\n\t \tresponse = formatResponse(xhr);\r\n\t \tcallback(response);\r\n\t }else{\r\n\t try{\r\n\t \t\tresponse = formatResponse(xhr);\r\n\t \t\tcallback(response);\r\n\t }catch(err){\r\n\t \tif(errorCallback) {\r\n\t \t\terrorCallback(err);\r\n\t \t}\r\n\t }\r\n\t }\r\n\t }\r\n\t };\r\n\t}\r\n\treturn {\r\n\t\tload: loadAsset\r\n\t}\r\n}())\r\n\r\nfunction TextAnimatorProperty(textData, renderType, elem){\r\n this._isFirstFrame = true;\r\n\tthis._hasMaskedPath = false;\r\n\tthis._frameId = -1;\r\n\tthis._textData = textData;\r\n\tthis._renderType = renderType;\r\n this._elem = elem;\r\n\tthis._animatorsData = createSizedArray(this._textData.a.length);\r\n\tthis._pathData = {};\r\n\tthis._moreOptions = {\r\n\t\talignment: {}\r\n\t};\r\n\tthis.renderedLetters = [];\r\n this.lettersChangedFlag = false;\r\n this.initDynamicPropertyContainer(elem);\r\n\r\n}\r\n\r\nTextAnimatorProperty.prototype.searchProperties = function(){\r\n var i, len = this._textData.a.length, animatorProps;\r\n var getProp = PropertyFactory.getProp;\r\n for(i=0;i<len;i+=1){\r\n animatorProps = this._textData.a[i];\r\n this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this);\r\n }\r\n if(this._textData.p && 'm' in this._textData.p){\r\n this._pathData = {\r\n f: getProp(this._elem,this._textData.p.f,0,0,this),\r\n l: getProp(this._elem,this._textData.p.l,0,0,this),\r\n r: this._textData.p.r,\r\n m: this._elem.maskManager.getMaskProperty(this._textData.p.m)\r\n };\r\n this._hasMaskedPath = true;\r\n } else {\r\n this._hasMaskedPath = false;\r\n }\r\n this._moreOptions.alignment = getProp(this._elem,this._textData.m.a,1,0,this);\r\n};\r\n\r\nTextAnimatorProperty.prototype.getMeasures = function(documentData, lettersChangedFlag){\r\n this.lettersChangedFlag = lettersChangedFlag;\r\n if(!this._mdf && !this._isFirstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m._mdf)) {\r\n return;\r\n }\r\n this._isFirstFrame = false;\r\n var alignment = this._moreOptions.alignment.v;\r\n var animators = this._animatorsData;\r\n var textData = this._textData;\r\n var matrixHelper = this.mHelper;\r\n var renderType = this._renderType;\r\n var renderedLettersCount = this.renderedLetters.length;\r\n var data = this.data;\r\n var xPos,yPos;\r\n var i, len;\r\n var letters = documentData.l, pathInfo, currentLength, currentPoint, segmentLength, flag, pointInd, segmentInd, prevPoint, points, segments, partialLength, totalLength, perc, tanAngle, mask;\r\n if(this._hasMaskedPath) {\r\n mask = this._pathData.m;\r\n if(!this._pathData.n || this._pathData._mdf){\r\n var paths = mask.v;\r\n if(this._pathData.r){\r\n paths = paths.reverse();\r\n }\r\n // TODO: release bezier data cached from previous pathInfo: this._pathData.pi\r\n pathInfo = {\r\n tLength: 0,\r\n segments: []\r\n };\r\n len = paths._length - 1;\r\n var bezierData;\r\n totalLength = 0;\r\n for (i = 0; i < len; i += 1) {\r\n bezierData = bez.buildBezierData(paths.v[i]\r\n , paths.v[i + 1]\r\n , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]\r\n , [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]);\r\n pathInfo.tLength += bezierData.segmentLength;\r\n pathInfo.segments.push(bezierData);\r\n totalLength += bezierData.segmentLength;\r\n }\r\n i = len;\r\n if (mask.v.c) {\r\n bezierData = bez.buildBezierData(paths.v[i]\r\n , paths.v[0]\r\n , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]\r\n , [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]);\r\n pathInfo.tLength += bezierData.segmentLength;\r\n pathInfo.segments.push(bezierData);\r\n totalLength += bezierData.segmentLength;\r\n }\r\n this._pathData.pi = pathInfo;\r\n }\r\n pathInfo = this._pathData.pi;\r\n\r\n currentLength = this._pathData.f.v;\r\n segmentInd = 0;\r\n pointInd = 1;\r\n segmentLength = 0;\r\n flag = true;\r\n segments = pathInfo.segments;\r\n if (currentLength < 0 && mask.v.c) {\r\n if (pathInfo.tLength < Math.abs(currentLength)) {\r\n currentLength = -Math.abs(currentLength) % pathInfo.tLength;\r\n }\r\n segmentInd = segments.length - 1;\r\n points = segments[segmentInd].points;\r\n pointInd = points.length - 1;\r\n while (currentLength < 0) {\r\n currentLength += points[pointInd].partialLength;\r\n pointInd -= 1;\r\n if (pointInd < 0) {\r\n segmentInd -= 1;\r\n points = segments[segmentInd].points;\r\n pointInd = points.length - 1;\r\n }\r\n }\r\n\r\n }\r\n points = segments[segmentInd].points;\r\n prevPoint = points[pointInd - 1];\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n }\r\n\r\n\r\n len = letters.length;\r\n xPos = 0;\r\n yPos = 0;\r\n var yOff = documentData.finalSize * 1.2 * 0.714;\r\n var firstLine = true;\r\n var animatorProps, animatorSelector;\r\n var j, jLen;\r\n var letterValue;\r\n\r\n jLen = animators.length;\r\n var lastLetter;\r\n\r\n var mult, ind = -1, offf, xPathPos, yPathPos;\r\n var initPathPos = currentLength,initSegmentInd = segmentInd, initPointInd = pointInd, currentLine = -1;\r\n var elemOpacity;\r\n var sc,sw,fc,k;\r\n var lineLength = 0;\r\n var letterSw, letterSc, letterFc, letterM = '', letterP = this.defaultPropsArray, letterO;\r\n\r\n //\r\n if(documentData.j === 2 || documentData.j === 1) {\r\n var animatorJustifyOffset = 0;\r\n var animatorFirstCharOffset = 0;\r\n var justifyOffsetMult = documentData.j === 2 ? -0.5 : -1;\r\n var lastIndex = 0;\r\n var isNewLine = true;\r\n\r\n for (i = 0; i < len; i += 1) {\r\n if (letters[i].n) {\r\n if(animatorJustifyOffset) {\r\n animatorJustifyOffset += animatorFirstCharOffset;\r\n }\r\n while (lastIndex < i) {\r\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\r\n lastIndex += 1;\r\n }\r\n animatorJustifyOffset = 0;\r\n isNewLine = true;\r\n } else {\r\n for (j = 0; j < jLen; j += 1) {\r\n animatorProps = animators[j].a;\r\n if (animatorProps.t.propType) {\r\n if (isNewLine && documentData.j === 2) {\r\n animatorFirstCharOffset += animatorProps.t.v * justifyOffsetMult;\r\n }\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);\r\n if (mult.length) {\r\n animatorJustifyOffset += animatorProps.t.v*mult[0] * justifyOffsetMult;\r\n } else {\r\n animatorJustifyOffset += animatorProps.t.v*mult * justifyOffsetMult;\r\n }\r\n }\r\n }\r\n isNewLine = false;\r\n }\r\n }\r\n if(animatorJustifyOffset) {\r\n animatorJustifyOffset += animatorFirstCharOffset;\r\n }\r\n while(lastIndex < i) {\r\n letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;\r\n lastIndex += 1;\r\n }\r\n }\r\n //\r\n\r\n for( i = 0; i < len; i += 1) {\r\n\r\n matrixHelper.reset();\r\n elemOpacity = 1;\r\n if(letters[i].n) {\r\n xPos = 0;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n currentLength = initPathPos ;\r\n firstLine = false;\r\n lineLength = 0;\r\n if(this._hasMaskedPath) {\r\n segmentInd = initSegmentInd;\r\n pointInd = initPointInd;\r\n points = segments[segmentInd].points;\r\n prevPoint = points[pointInd - 1];\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n segmentLength = 0;\r\n }\r\n letterO = letterSw = letterFc = letterM = '';\r\n letterP = this.defaultPropsArray;\r\n }else{\r\n if(this._hasMaskedPath) {\r\n if(currentLine !== letters[i].line){\r\n switch(documentData.j){\r\n case 1:\r\n currentLength += totalLength - documentData.lineWidths[letters[i].line];\r\n break;\r\n case 2:\r\n currentLength += (totalLength - documentData.lineWidths[letters[i].line])/2;\r\n break;\r\n }\r\n currentLine = letters[i].line;\r\n }\r\n if (ind !== letters[i].ind) {\r\n if (letters[ind]) {\r\n currentLength += letters[ind].extra;\r\n }\r\n currentLength += letters[i].an / 2;\r\n ind = letters[i].ind;\r\n }\r\n currentLength += alignment[0] * letters[i].an / 200;\r\n var animatorOffset = 0;\r\n for (j = 0; j < jLen; j += 1) {\r\n animatorProps = animators[j].a;\r\n if (animatorProps.p.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n animatorOffset += animatorProps.p.v[0] * mult[0];\r\n } else{\r\n animatorOffset += animatorProps.p.v[0] * mult;\r\n }\r\n\r\n }\r\n if (animatorProps.a.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n animatorOffset += animatorProps.a.v[0] * mult[0];\r\n } else{\r\n animatorOffset += animatorProps.a.v[0] * mult;\r\n }\r\n\r\n }\r\n }\r\n flag = true;\r\n while (flag) {\r\n if (segmentLength + partialLength >= currentLength + animatorOffset || !points) {\r\n perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength;\r\n xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc;\r\n yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc;\r\n matrixHelper.translate(-alignment[0]*letters[i].an/200, -(alignment[1] * yOff / 100));\r\n flag = false;\r\n } else if (points) {\r\n segmentLength += currentPoint.partialLength;\r\n pointInd += 1;\r\n if (pointInd >= points.length) {\r\n pointInd = 0;\r\n segmentInd += 1;\r\n if (!segments[segmentInd]) {\r\n if (mask.v.c) {\r\n pointInd = 0;\r\n segmentInd = 0;\r\n points = segments[segmentInd].points;\r\n } else {\r\n segmentLength -= currentPoint.partialLength;\r\n points = null;\r\n }\r\n } else {\r\n points = segments[segmentInd].points;\r\n }\r\n }\r\n if (points) {\r\n prevPoint = currentPoint;\r\n currentPoint = points[pointInd];\r\n partialLength = currentPoint.partialLength;\r\n }\r\n }\r\n }\r\n offf = letters[i].an / 2 - letters[i].add;\r\n matrixHelper.translate(-offf, 0, 0);\r\n } else {\r\n offf = letters[i].an/2 - letters[i].add;\r\n matrixHelper.translate(-offf,0,0);\r\n\r\n // Grouping alignment\r\n matrixHelper.translate(-alignment[0]*letters[i].an/200, -alignment[1]*yOff/100, 0);\r\n }\r\n\r\n lineLength += letters[i].l/2;\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.t.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n //This condition is to prevent applying tracking to first character in each line. Might be better to use a boolean \"isNewLine\"\r\n if(xPos !== 0 || documentData.j !== 0) {\r\n if(this._hasMaskedPath) {\r\n if(mult.length) {\r\n currentLength += animatorProps.t.v*mult[0];\r\n } else {\r\n currentLength += animatorProps.t.v*mult;\r\n }\r\n }else{\r\n if(mult.length) {\r\n xPos += animatorProps.t.v*mult[0];\r\n } else {\r\n xPos += animatorProps.t.v*mult;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n lineLength += letters[i].l/2;\r\n if(documentData.strokeWidthAnim) {\r\n sw = documentData.sw || 0;\r\n }\r\n if(documentData.strokeColorAnim) {\r\n if(documentData.sc){\r\n sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]];\r\n }else{\r\n sc = [0,0,0];\r\n }\r\n }\r\n if(documentData.fillColorAnim && documentData.fc) {\r\n fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];\r\n }\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.a.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n\r\n if(mult.length){\r\n matrixHelper.translate(-animatorProps.a.v[0]*mult[0], -animatorProps.a.v[1]*mult[1], animatorProps.a.v[2]*mult[2]);\r\n } else {\r\n matrixHelper.translate(-animatorProps.a.v[0]*mult, -animatorProps.a.v[1]*mult, animatorProps.a.v[2]*mult);\r\n }\r\n }\r\n }\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n if (animatorProps.s.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(mult.length){\r\n matrixHelper.scale(1+((animatorProps.s.v[0]-1)*mult[0]),1+((animatorProps.s.v[1]-1)*mult[1]),1);\r\n } else {\r\n matrixHelper.scale(1+((animatorProps.s.v[0]-1)*mult),1+((animatorProps.s.v[1]-1)*mult),1);\r\n }\r\n }\r\n }\r\n for(j=0;j<jLen;j+=1) {\r\n animatorProps = animators[j].a;\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if (animatorProps.sk.propType) {\r\n if(mult.length) {\r\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult[0], animatorProps.sa.v * mult[1]);\r\n } else {\r\n matrixHelper.skewFromAxis(-animatorProps.sk.v * mult, animatorProps.sa.v * mult);\r\n }\r\n }\r\n if (animatorProps.r.propType) {\r\n if(mult.length) {\r\n matrixHelper.rotateZ(-animatorProps.r.v * mult[2]);\r\n } else {\r\n matrixHelper.rotateZ(-animatorProps.r.v * mult);\r\n }\r\n }\r\n if (animatorProps.ry.propType) {\r\n\r\n if(mult.length) {\r\n matrixHelper.rotateY(animatorProps.ry.v*mult[1]);\r\n }else{\r\n matrixHelper.rotateY(animatorProps.ry.v*mult);\r\n }\r\n }\r\n if (animatorProps.rx.propType) {\r\n if(mult.length) {\r\n matrixHelper.rotateX(animatorProps.rx.v*mult[0]);\r\n } else {\r\n matrixHelper.rotateX(animatorProps.rx.v*mult);\r\n }\r\n }\r\n if (animatorProps.o.propType) {\r\n if(mult.length) {\r\n elemOpacity += ((animatorProps.o.v)*mult[0] - elemOpacity)*mult[0];\r\n } else {\r\n elemOpacity += ((animatorProps.o.v)*mult - elemOpacity)*mult;\r\n }\r\n }\r\n if (documentData.strokeWidthAnim && animatorProps.sw.propType) {\r\n if(mult.length) {\r\n sw += animatorProps.sw.v*mult[0];\r\n } else {\r\n sw += animatorProps.sw.v*mult;\r\n }\r\n }\r\n if (documentData.strokeColorAnim && animatorProps.sc.propType) {\r\n for(k=0;k<3;k+=1){\r\n if(mult.length) {\r\n sc[k] = sc[k] + (animatorProps.sc.v[k] - sc[k])*mult[0];\r\n } else {\r\n sc[k] = sc[k] + (animatorProps.sc.v[k] - sc[k])*mult;\r\n }\r\n }\r\n }\r\n if (documentData.fillColorAnim && documentData.fc) {\r\n if(animatorProps.fc.propType){\r\n for(k=0;k<3;k+=1){\r\n if(mult.length) {\r\n fc[k] = fc[k] + (animatorProps.fc.v[k] - fc[k])*mult[0];\r\n } else {\r\n fc[k] = fc[k] + (animatorProps.fc.v[k] - fc[k])*mult;\r\n }\r\n }\r\n }\r\n if(animatorProps.fh.propType){\r\n if(mult.length) {\r\n fc = addHueToRGB(fc,animatorProps.fh.v*mult[0]);\r\n } else {\r\n fc = addHueToRGB(fc,animatorProps.fh.v*mult);\r\n }\r\n }\r\n if(animatorProps.fs.propType){\r\n if(mult.length) {\r\n fc = addSaturationToRGB(fc,animatorProps.fs.v*mult[0]);\r\n } else {\r\n fc = addSaturationToRGB(fc,animatorProps.fs.v*mult);\r\n }\r\n }\r\n if(animatorProps.fb.propType){\r\n if(mult.length) {\r\n fc = addBrightnessToRGB(fc,animatorProps.fb.v*mult[0]);\r\n } else {\r\n fc = addBrightnessToRGB(fc,animatorProps.fb.v*mult);\r\n }\r\n }\r\n }\r\n }\r\n\r\n for(j=0;j<jLen;j+=1){\r\n animatorProps = animators[j].a;\r\n\r\n if (animatorProps.p.propType) {\r\n animatorSelector = animators[j].s;\r\n mult = animatorSelector.getMult(letters[i].anIndexes[j],textData.a[j].s.totalChars);\r\n if(this._hasMaskedPath) {\r\n if(mult.length) {\r\n matrixHelper.translate(0, animatorProps.p.v[1] * mult[0], -animatorProps.p.v[2] * mult[1]);\r\n } else {\r\n matrixHelper.translate(0, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\r\n }\r\n }else{\r\n if(mult.length) {\r\n matrixHelper.translate(animatorProps.p.v[0] * mult[0], animatorProps.p.v[1] * mult[1], -animatorProps.p.v[2] * mult[2]);\r\n } else {\r\n matrixHelper.translate(animatorProps.p.v[0] * mult, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);\r\n \r\n }\r\n }\r\n }\r\n }\r\n if(documentData.strokeWidthAnim){\r\n letterSw = sw < 0 ? 0 : sw;\r\n }\r\n if(documentData.strokeColorAnim){\r\n letterSc = 'rgb('+Math.round(sc[0]*255)+','+Math.round(sc[1]*255)+','+Math.round(sc[2]*255)+')';\r\n }\r\n if(documentData.fillColorAnim && documentData.fc){\r\n letterFc = 'rgb('+Math.round(fc[0]*255)+','+Math.round(fc[1]*255)+','+Math.round(fc[2]*255)+')';\r\n }\r\n\r\n if(this._hasMaskedPath) {\r\n matrixHelper.translate(0,-documentData.ls);\r\n\r\n matrixHelper.translate(0, alignment[1]*yOff/100 + yPos,0);\r\n if (textData.p.p) {\r\n tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]);\r\n var rot = Math.atan(tanAngle) * 180 / Math.PI;\r\n if (currentPoint.point[0] < prevPoint.point[0]) {\r\n rot += 180;\r\n }\r\n matrixHelper.rotate(-rot * Math.PI / 180);\r\n }\r\n matrixHelper.translate(xPathPos, yPathPos, 0);\r\n currentLength -= alignment[0]*letters[i].an/200;\r\n if(letters[i+1] && ind !== letters[i+1].ind){\r\n currentLength += letters[i].an / 2;\r\n currentLength += documentData.tr/1000*documentData.finalSize;\r\n }\r\n }else{\r\n\r\n matrixHelper.translate(xPos,yPos,0);\r\n\r\n if(documentData.ps){\r\n //matrixHelper.translate(documentData.ps[0],documentData.ps[1],0);\r\n matrixHelper.translate(documentData.ps[0],documentData.ps[1] + documentData.ascent,0);\r\n }\r\n switch(documentData.j){\r\n case 1:\r\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]),0,0);\r\n break;\r\n case 2:\r\n matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line])/2,0,0);\r\n break;\r\n }\r\n matrixHelper.translate(0,-documentData.ls);\r\n matrixHelper.translate(offf,0,0);\r\n matrixHelper.translate(alignment[0]*letters[i].an/200,alignment[1]*yOff/100,0);\r\n xPos += letters[i].l + documentData.tr/1000*documentData.finalSize;\r\n }\r\n if(renderType === 'html'){\r\n letterM = matrixHelper.toCSS();\r\n }else if(renderType === 'svg'){\r\n letterM = matrixHelper.to2dCSS();\r\n }else{\r\n letterP = [matrixHelper.props[0],matrixHelper.props[1],matrixHelper.props[2],matrixHelper.props[3],matrixHelper.props[4],matrixHelper.props[5],matrixHelper.props[6],matrixHelper.props[7],matrixHelper.props[8],matrixHelper.props[9],matrixHelper.props[10],matrixHelper.props[11],matrixHelper.props[12],matrixHelper.props[13],matrixHelper.props[14],matrixHelper.props[15]];\r\n }\r\n letterO = elemOpacity;\r\n }\r\n\r\n if(renderedLettersCount <= i) {\r\n letterValue = new LetterProps(letterO,letterSw,letterSc,letterFc,letterM,letterP);\r\n this.renderedLetters.push(letterValue);\r\n renderedLettersCount += 1;\r\n this.lettersChangedFlag = true;\r\n } else {\r\n letterValue = this.renderedLetters[i];\r\n this.lettersChangedFlag = letterValue.update(letterO, letterSw, letterSc, letterFc, letterM, letterP) || this.lettersChangedFlag;\r\n }\r\n }\r\n};\r\n\r\nTextAnimatorProperty.prototype.getValue = function(){\r\n\tif(this._elem.globalData.frameId === this._frameId){\r\n return;\r\n }\r\n this._frameId = this._elem.globalData.frameId;\r\n this.iterateDynamicProperties();\r\n};\r\n\r\nTextAnimatorProperty.prototype.mHelper = new Matrix();\r\nTextAnimatorProperty.prototype.defaultPropsArray = [];\r\nextendPrototype([DynamicPropertyContainer], TextAnimatorProperty);\r\nfunction TextAnimatorDataProperty(elem, animatorProps, container) {\r\n\tvar defaultData = {propType:false};\r\n\tvar getProp = PropertyFactory.getProp;\r\n\tvar textAnimator_animatables = animatorProps.a;\r\n\tthis.a = {\r\n\t\tr: textAnimator_animatables.r ? getProp(elem, textAnimator_animatables.r, 0, degToRads, container) : defaultData,\r\n\t\trx: textAnimator_animatables.rx ? getProp(elem, textAnimator_animatables.rx, 0, degToRads, container) : defaultData,\r\n\t\try: textAnimator_animatables.ry ? getProp(elem, textAnimator_animatables.ry, 0, degToRads, container) : defaultData,\r\n\t\tsk: textAnimator_animatables.sk ? getProp(elem, textAnimator_animatables.sk, 0, degToRads, container) : defaultData,\r\n\t\tsa: textAnimator_animatables.sa ? getProp(elem, textAnimator_animatables.sa, 0, degToRads, container) : defaultData,\r\n\t\ts: textAnimator_animatables.s ? getProp(elem, textAnimator_animatables.s, 1, 0.01, container) : defaultData,\r\n\t\ta: textAnimator_animatables.a ? getProp(elem, textAnimator_animatables.a, 1, 0, container) : defaultData,\r\n\t\to: textAnimator_animatables.o ? getProp(elem, textAnimator_animatables.o, 0, 0.01, container) : defaultData,\r\n\t\tp: textAnimator_animatables.p ? getProp(elem,textAnimator_animatables.p, 1, 0, container) : defaultData,\r\n\t\tsw: textAnimator_animatables.sw ? getProp(elem, textAnimator_animatables.sw, 0, 0, container) : defaultData,\r\n\t\tsc: textAnimator_animatables.sc ? getProp(elem, textAnimator_animatables.sc, 1, 0, container) : defaultData,\r\n\t\tfc: textAnimator_animatables.fc ? getProp(elem, textAnimator_animatables.fc, 1, 0, container) : defaultData,\r\n\t\tfh: textAnimator_animatables.fh ? getProp(elem, textAnimator_animatables.fh, 0, 0, container) : defaultData,\r\n\t\tfs: textAnimator_animatables.fs ? getProp(elem, textAnimator_animatables.fs, 0, 0.01, container) : defaultData,\r\n\t\tfb: textAnimator_animatables.fb ? getProp(elem, textAnimator_animatables.fb, 0, 0.01, container) : defaultData,\r\n\t\tt: textAnimator_animatables.t ? getProp(elem, textAnimator_animatables.t, 0, 0, container) : defaultData\r\n\t};\r\n\r\n\tthis.s = TextSelectorProp.getTextSelectorProp(elem,animatorProps.s, container);\r\n this.s.t = animatorProps.s.t;\r\n}\r\nfunction LetterProps(o, sw, sc, fc, m, p){\r\n this.o = o;\r\n this.sw = sw;\r\n this.sc = sc;\r\n this.fc = fc;\r\n this.m = m;\r\n this.p = p;\r\n this._mdf = {\r\n \to: true,\r\n \tsw: !!sw,\r\n \tsc: !!sc,\r\n \tfc: !!fc,\r\n \tm: true,\r\n \tp: true\r\n };\r\n}\r\n\r\nLetterProps.prototype.update = function(o, sw, sc, fc, m, p) {\r\n\tthis._mdf.o = false;\r\n\tthis._mdf.sw = false;\r\n\tthis._mdf.sc = false;\r\n\tthis._mdf.fc = false;\r\n\tthis._mdf.m = false;\r\n\tthis._mdf.p = false;\r\n\tvar updated = false;\r\n\r\n\tif(this.o !== o) {\r\n\t\tthis.o = o;\r\n\t\tthis._mdf.o = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.sw !== sw) {\r\n\t\tthis.sw = sw;\r\n\t\tthis._mdf.sw = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.sc !== sc) {\r\n\t\tthis.sc = sc;\r\n\t\tthis._mdf.sc = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.fc !== fc) {\r\n\t\tthis.fc = fc;\r\n\t\tthis._mdf.fc = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(this.m !== m) {\r\n\t\tthis.m = m;\r\n\t\tthis._mdf.m = true;\r\n\t\tupdated = true;\r\n\t}\r\n\tif(p.length && (this.p[0] !== p[0] || this.p[1] !== p[1] || this.p[4] !== p[4] || this.p[5] !== p[5] || this.p[12] !== p[12] || this.p[13] !== p[13])) {\r\n\t\tthis.p = p;\r\n\t\tthis._mdf.p = true;\r\n\t\tupdated = true;\r\n\t}\r\n\treturn updated;\r\n};\r\nfunction TextProperty(elem, data){\r\n\tthis._frameId = initialDefaultFrame;\r\n\tthis.pv = '';\r\n\tthis.v = '';\r\n\tthis.kf = false;\r\n\tthis._isFirstFrame = true;\r\n\tthis._mdf = false;\r\n this.data = data;\r\n\tthis.elem = elem;\r\n this.comp = this.elem.comp;\r\n\tthis.keysIndex = 0;\r\n this.canResize = false;\r\n this.minimumFontSize = 1;\r\n this.effectsSequence = [];\r\n\tthis.currentData = {\r\n\t\tascent: 0,\r\n boxWidth: this.defaultBoxWidth,\r\n f: '',\r\n fStyle: '',\r\n fWeight: '',\r\n fc: '',\r\n j: '',\r\n justifyOffset: '',\r\n l: [],\r\n lh: 0,\r\n lineWidths: [],\r\n ls: '',\r\n of: '',\r\n s: '',\r\n sc: '',\r\n sw: 0,\r\n t: 0,\r\n tr: 0,\r\n sz:0,\r\n ps:null,\r\n fillColorAnim: false,\r\n strokeColorAnim: false,\r\n strokeWidthAnim: false,\r\n yOffset: 0,\r\n finalSize:0,\r\n finalText:[],\r\n finalLineHeight: 0,\r\n __complete: false\r\n\r\n\t};\r\n this.copyData(this.currentData, this.data.d.k[0].s);\r\n\r\n if(!this.searchProperty()) {\r\n this.completeTextData(this.currentData);\r\n }\r\n}\r\n\r\nTextProperty.prototype.defaultBoxWidth = [0,0];\r\n\r\nTextProperty.prototype.copyData = function(obj, data) {\r\n for(var s in data) {\r\n if(data.hasOwnProperty(s)) {\r\n obj[s] = data[s];\r\n }\r\n }\r\n return obj;\r\n}\r\n\r\nTextProperty.prototype.setCurrentData = function(data){\r\n if(!data.__complete) {\r\n this.completeTextData(data);\r\n }\r\n this.currentData = data;\r\n this.currentData.boxWidth = this.currentData.boxWidth || this.defaultBoxWidth;\r\n this._mdf = true;\r\n};\r\n\r\nTextProperty.prototype.searchProperty = function() {\r\n return this.searchKeyframes();\r\n};\r\n\r\nTextProperty.prototype.searchKeyframes = function() {\r\n this.kf = this.data.d.k.length > 1;\r\n if(this.kf) {\r\n this.addEffect(this.getKeyframeValue.bind(this));\r\n }\r\n return this.kf;\r\n}\r\n\r\nTextProperty.prototype.addEffect = function(effectFunction) {\r\n\tthis.effectsSequence.push(effectFunction);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.getValue = function(_finalValue) {\r\n if((this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) && !_finalValue) {\r\n return;\r\n }\r\n this.currentData.t = this.data.d.k[this.keysIndex].s.t;\r\n var currentValue = this.currentData;\r\n var currentIndex = this.keysIndex;\r\n if(this.lock) {\r\n this.setCurrentData(this.currentData);\r\n return;\r\n }\r\n this.lock = true;\r\n this._mdf = false;\r\n var multipliedValue;\r\n var i, len = this.effectsSequence.length;\r\n var finalValue = _finalValue || this.data.d.k[this.keysIndex].s;\r\n for(i = 0; i < len; i += 1) {\r\n //Checking if index changed to prevent creating a new object every time the expression updates.\r\n if(currentIndex !== this.keysIndex) {\r\n finalValue = this.effectsSequence[i](finalValue, finalValue.t);\r\n } else {\r\n finalValue = this.effectsSequence[i](this.currentData, finalValue.t);\r\n }\r\n }\r\n if(currentValue !== finalValue) {\r\n this.setCurrentData(finalValue);\r\n }\r\n this.pv = this.v = this.currentData;\r\n this.lock = false;\r\n this.frameId = this.elem.globalData.frameId;\r\n}\r\n\r\nTextProperty.prototype.getKeyframeValue = function() {\r\n var textKeys = this.data.d.k, textDocumentData;\r\n var frameNum = this.elem.comp.renderedFrame;\r\n var i = 0, len = textKeys.length;\r\n while(i <= len - 1) {\r\n textDocumentData = textKeys[i].s;\r\n if(i === len - 1 || textKeys[i+1].t > frameNum){\r\n break;\r\n }\r\n i += 1;\r\n }\r\n if(this.keysIndex !== i) {\r\n this.keysIndex = i;\r\n }\r\n return this.data.d.k[this.keysIndex].s;\r\n};\r\n\r\nTextProperty.prototype.buildFinalText = function(text) {\r\n var combinedCharacters = FontManager.getCombinedCharacterCodes();\r\n var charactersArray = [];\r\n var i = 0, len = text.length;\r\n var charCode;\r\n while (i < len) {\r\n charCode = text.charCodeAt(i);\r\n if (combinedCharacters.indexOf(charCode) !== -1) {\r\n charactersArray[charactersArray.length - 1] += text.charAt(i);\r\n } else {\r\n if (charCode >= 0xD800 && charCode <= 0xDBFF) {\r\n charCode = text.charCodeAt(i + 1);\r\n if (charCode >= 0xDC00 && charCode <= 0xDFFF) {\r\n charactersArray.push(text.substr(i, 2));\r\n ++i;\r\n } else {\r\n charactersArray.push(text.charAt(i));\r\n }\r\n } else {\r\n charactersArray.push(text.charAt(i));\r\n }\r\n }\r\n i += 1;\r\n }\r\n return charactersArray;\r\n}\r\n\r\nTextProperty.prototype.completeTextData = function(documentData) {\r\n documentData.__complete = true;\r\n var fontManager = this.elem.globalData.fontManager;\r\n var data = this.data;\r\n var letters = [];\r\n var i, len;\r\n var newLineFlag, index = 0, val;\r\n var anchorGrouping = data.m.g;\r\n var currentSize = 0, currentPos = 0, currentLine = 0, lineWidths = [];\r\n var lineWidth = 0;\r\n var maxLineWidth = 0;\r\n var j, jLen;\r\n var fontData = fontManager.getFontByName(documentData.f);\r\n var charData, cLength = 0;\r\n var styles = fontData.fStyle ? fontData.fStyle.split(' ') : [];\r\n\r\n var fWeight = 'normal', fStyle = 'normal';\r\n len = styles.length;\r\n var styleName;\r\n for(i=0;i<len;i+=1){\r\n styleName = styles[i].toLowerCase();\r\n switch(styleName) {\r\n case 'italic':\r\n fStyle = 'italic';\r\n break;\r\n case 'bold':\r\n fWeight = '700';\r\n break;\r\n case 'black':\r\n fWeight = '900';\r\n break;\r\n case 'medium':\r\n fWeight = '500';\r\n break;\r\n case 'regular':\r\n case 'normal':\r\n fWeight = '400';\r\n break;\r\n case 'light':\r\n case 'thin':\r\n fWeight = '200';\r\n break;\r\n }\r\n }\r\n documentData.fWeight = fontData.fWeight || fWeight;\r\n documentData.fStyle = fStyle;\r\n documentData.finalSize = documentData.s;\r\n documentData.finalText = this.buildFinalText(documentData.t);\r\n len = documentData.finalText.length;\r\n documentData.finalLineHeight = documentData.lh;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var charCode;\r\n if(documentData.sz){\r\n var flag = true;\r\n var boxWidth = documentData.sz[0];\r\n var boxHeight = documentData.sz[1];\r\n var currentHeight, finalText;\r\n while(flag) {\r\n finalText = this.buildFinalText(documentData.t);\r\n currentHeight = 0;\r\n lineWidth = 0;\r\n len = finalText.length;\r\n trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var lastSpaceIndex = -1;\r\n for(i=0;i<len;i+=1){\r\n charCode = finalText[i].charCodeAt(0);\r\n newLineFlag = false;\r\n if(finalText[i] === ' '){\r\n lastSpaceIndex = i;\r\n }else if(charCode === 13 || charCode === 3){\r\n lineWidth = 0;\r\n newLineFlag = true;\r\n currentHeight += documentData.finalLineHeight || documentData.finalSize*1.2;\r\n }\r\n if(fontManager.chars){\r\n charData = fontManager.getCharData(finalText[i], fontData.fStyle, fontData.fFamily);\r\n cLength = newLineFlag ? 0 : charData.w*documentData.finalSize/100;\r\n }else{\r\n //tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily;\r\n cLength = fontManager.measureText(finalText[i], documentData.f, documentData.finalSize);\r\n }\r\n if(lineWidth + cLength > boxWidth && finalText[i] !== ' '){\r\n if(lastSpaceIndex === -1){\r\n len += 1;\r\n } else {\r\n i = lastSpaceIndex;\r\n }\r\n currentHeight += documentData.finalLineHeight || documentData.finalSize*1.2;\r\n finalText.splice(i, lastSpaceIndex === i ? 1 : 0,\"\\r\");\r\n //finalText = finalText.substr(0,i) + \"\\r\" + finalText.substr(i === lastSpaceIndex ? i + 1 : i);\r\n lastSpaceIndex = -1;\r\n lineWidth = 0;\r\n }else {\r\n lineWidth += cLength;\r\n lineWidth += trackingOffset;\r\n }\r\n }\r\n currentHeight += fontData.ascent*documentData.finalSize/100;\r\n if(this.canResize && documentData.finalSize > this.minimumFontSize && boxHeight < currentHeight) {\r\n documentData.finalSize -= 1;\r\n documentData.finalLineHeight = documentData.finalSize * documentData.lh / documentData.s;\r\n } else {\r\n documentData.finalText = finalText;\r\n len = documentData.finalText.length;\r\n flag = false;\r\n }\r\n }\r\n\r\n }\r\n lineWidth = - trackingOffset;\r\n cLength = 0;\r\n var uncollapsedSpaces = 0;\r\n var currentChar;\r\n for (i = 0;i < len ;i += 1) {\r\n newLineFlag = false;\r\n currentChar = documentData.finalText[i];\r\n charCode = currentChar.charCodeAt(0);\r\n if (currentChar === ' '){\r\n val = '\\u00A0';\r\n } else if (charCode === 13 || charCode === 3) {\r\n uncollapsedSpaces = 0;\r\n lineWidths.push(lineWidth);\r\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\r\n lineWidth = - 2 * trackingOffset;\r\n val = '';\r\n newLineFlag = true;\r\n currentLine += 1;\r\n }else{\r\n val = documentData.finalText[i];\r\n }\r\n if(fontManager.chars){\r\n charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily);\r\n cLength = newLineFlag ? 0 : charData.w*documentData.finalSize/100;\r\n }else{\r\n //var charWidth = fontManager.measureText(val, documentData.f, documentData.finalSize);\r\n //tCanvasHelper.font = documentData.finalSize + 'px '+ fontManager.getFontByName(documentData.f).fFamily;\r\n cLength = fontManager.measureText(val, documentData.f, documentData.finalSize);\r\n }\r\n\r\n //\r\n if(currentChar === ' '){\r\n uncollapsedSpaces += cLength + trackingOffset;\r\n } else {\r\n lineWidth += cLength + trackingOffset + uncollapsedSpaces;\r\n uncollapsedSpaces = 0;\r\n }\r\n letters.push({l:cLength,an:cLength,add:currentSize,n:newLineFlag, anIndexes:[], val: val, line: currentLine, animatorJustifyOffset: 0});\r\n if(anchorGrouping == 2){\r\n currentSize += cLength;\r\n if(val === '' || val === '\\u00A0' || i === len - 1){\r\n if(val === '' || val === '\\u00A0'){\r\n currentSize -= cLength;\r\n }\r\n while(currentPos<=i){\r\n letters[currentPos].an = currentSize;\r\n letters[currentPos].ind = index;\r\n letters[currentPos].extra = cLength;\r\n currentPos += 1;\r\n }\r\n index += 1;\r\n currentSize = 0;\r\n }\r\n }else if(anchorGrouping == 3){\r\n currentSize += cLength;\r\n if(val === '' || i === len - 1){\r\n if(val === ''){\r\n currentSize -= cLength;\r\n }\r\n while(currentPos<=i){\r\n letters[currentPos].an = currentSize;\r\n letters[currentPos].ind = index;\r\n letters[currentPos].extra = cLength;\r\n currentPos += 1;\r\n }\r\n currentSize = 0;\r\n index += 1;\r\n }\r\n }else{\r\n letters[index].ind = index;\r\n letters[index].extra = 0;\r\n index += 1;\r\n }\r\n }\r\n documentData.l = letters;\r\n maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth;\r\n lineWidths.push(lineWidth);\r\n if(documentData.sz){\r\n documentData.boxWidth = documentData.sz[0];\r\n documentData.justifyOffset = 0;\r\n }else{\r\n documentData.boxWidth = maxLineWidth;\r\n switch(documentData.j){\r\n case 1:\r\n documentData.justifyOffset = - documentData.boxWidth;\r\n break;\r\n case 2:\r\n documentData.justifyOffset = - documentData.boxWidth/2;\r\n break;\r\n default:\r\n documentData.justifyOffset = 0;\r\n }\r\n }\r\n documentData.lineWidths = lineWidths;\r\n\r\n var animators = data.a, animatorData, letterData;\r\n jLen = animators.length;\r\n var based, ind, indexes = [];\r\n for(j=0;j<jLen;j+=1){\r\n animatorData = animators[j];\r\n if(animatorData.a.sc){\r\n documentData.strokeColorAnim = true;\r\n }\r\n if(animatorData.a.sw){\r\n documentData.strokeWidthAnim = true;\r\n }\r\n if(animatorData.a.fc || animatorData.a.fh || animatorData.a.fs || animatorData.a.fb){\r\n documentData.fillColorAnim = true;\r\n }\r\n ind = 0;\r\n based = animatorData.s.b;\r\n for(i=0;i<len;i+=1){\r\n letterData = letters[i];\r\n letterData.anIndexes[j] = ind;\r\n if((based == 1 && letterData.val !== '') || (based == 2 && letterData.val !== '' && letterData.val !== '\\u00A0') || (based == 3 && (letterData.n || letterData.val == '\\u00A0' || i == len - 1)) || (based == 4 && (letterData.n || i == len - 1))){\r\n if(animatorData.s.rn === 1){\r\n indexes.push(ind);\r\n }\r\n ind += 1;\r\n }\r\n }\r\n data.a[j].s.totalChars = ind;\r\n var currentInd = -1, newInd;\r\n if(animatorData.s.rn === 1){\r\n for(i = 0; i < len; i += 1){\r\n letterData = letters[i];\r\n if(currentInd != letterData.anIndexes[j]){\r\n currentInd = letterData.anIndexes[j];\r\n newInd = indexes.splice(Math.floor(Math.random()*indexes.length),1)[0];\r\n }\r\n letterData.anIndexes[j] = newInd;\r\n }\r\n }\r\n }\r\n documentData.yOffset = documentData.finalLineHeight || documentData.finalSize*1.2;\r\n documentData.ls = documentData.ls || 0;\r\n documentData.ascent = fontData.ascent*documentData.finalSize/100;\r\n};\r\n\r\nTextProperty.prototype.updateDocumentData = function(newData, index) {\r\n\tindex = index === undefined ? this.keysIndex : index;\r\n var dData = this.copyData({}, this.data.d.k[index].s);\r\n dData = this.copyData(dData, newData);\r\n this.data.d.k[index].s = dData;\r\n this.recalculate(index);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.recalculate = function(index) {\r\n var dData = this.data.d.k[index].s;\r\n dData.__complete = false;\r\n this.keysIndex = 0;\r\n this._isFirstFrame = true;\r\n this.getValue(dData);\r\n}\r\n\r\nTextProperty.prototype.canResizeFont = function(_canResize) {\r\n this.canResize = _canResize;\r\n this.recalculate(this.keysIndex);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nTextProperty.prototype.setMinimumFontSize = function(_fontValue) {\r\n this.minimumFontSize = Math.floor(_fontValue) || 1;\r\n this.recalculate(this.keysIndex);\r\n this.elem.addDynamicProperty(this);\r\n};\r\n\r\nvar TextSelectorProp = (function(){\r\n var max = Math.max;\r\n var min = Math.min;\r\n var floor = Math.floor;\r\n\r\n function TextSelectorProp(elem,data){\r\n this._currentTextLength = -1;\r\n this.k = false;\r\n this.data = data;\r\n this.elem = elem;\r\n this.comp = elem.comp;\r\n this.finalS = 0;\r\n this.finalE = 0;\r\n this.initDynamicPropertyContainer(elem);\r\n this.s = PropertyFactory.getProp(elem,data.s || {k:0},0,0,this);\r\n if('e' in data){\r\n this.e = PropertyFactory.getProp(elem,data.e,0,0,this);\r\n }else{\r\n this.e = {v:100};\r\n }\r\n this.o = PropertyFactory.getProp(elem,data.o || {k:0},0,0,this);\r\n this.xe = PropertyFactory.getProp(elem,data.xe || {k:0},0,0,this);\r\n this.ne = PropertyFactory.getProp(elem,data.ne || {k:0},0,0,this);\r\n this.a = PropertyFactory.getProp(elem,data.a,0,0.01,this);\r\n if(!this.dynamicProperties.length){\r\n this.getValue();\r\n }\r\n }\r\n\r\n TextSelectorProp.prototype = {\r\n getMult: function(ind) {\r\n if(this._currentTextLength !== this.elem.textProperty.currentData.l.length) {\r\n this.getValue();\r\n }\r\n //var easer = bez.getEasingCurve(this.ne.v/100,0,1-this.xe.v/100,1);\r\n var easer = BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get;\r\n var mult = 0;\r\n var s = this.finalS;\r\n var e = this.finalE;\r\n var type = this.data.sh;\r\n if(type == 2){\r\n if(e === s){\r\n mult = ind >= e ? 1 : 0;\r\n }else{\r\n mult = max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n }\r\n mult = easer(mult);\r\n }else if(type == 3){\r\n if(e === s){\r\n mult = ind >= e ? 0 : 1;\r\n }else{\r\n mult = 1 - max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n }\r\n\r\n mult = easer(mult);\r\n }else if(type == 4){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n mult = max(0,min(0.5/(e-s) + (ind-s)/(e-s),1));\r\n if(mult<0.5){\r\n mult *= 2;\r\n }else{\r\n mult = 1 - 2*(mult-0.5);\r\n }\r\n }\r\n mult = easer(mult);\r\n }else if(type == 5){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n var tot = e - s;\r\n /*ind += 0.5;\r\n mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind;*/\r\n ind = min(max(0,ind+0.5-s),e-s);\r\n var x = -tot/2+ind;\r\n var a = tot/2;\r\n mult = Math.sqrt(1 - (x*x)/(a*a));\r\n }\r\n mult = easer(mult);\r\n }else if(type == 6){\r\n if(e === s){\r\n mult = 0;\r\n }else{\r\n ind = min(max(0,ind+0.5-s),e-s);\r\n mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind)/(e-s)))))/2;\r\n /*\r\n ind = Math.min(Math.max(s,ind),e-1);\r\n mult = (1+(Math.cos((Math.PI+Math.PI*2*(ind-s)/(e-1-s)))))/2;\r\n mult = Math.max(mult,(1/(e-1-s))/(e-1-s));*/\r\n }\r\n mult = easer(mult);\r\n }else {\r\n if(ind >= floor(s)){\r\n if(ind-s < 0){\r\n mult = 1 - (s - ind);\r\n }else{\r\n mult = max(0,min(e-ind,1));\r\n }\r\n }\r\n mult = easer(mult);\r\n }\r\n return mult*this.a.v;\r\n },\r\n getValue: function(newCharsFlag) {\r\n this.iterateDynamicProperties();\r\n this._mdf = newCharsFlag || this._mdf;\r\n this._currentTextLength = this.elem.textProperty.currentData.l.length || 0;\r\n if(newCharsFlag && this.data.r === 2) {\r\n this.e.v = this._currentTextLength;\r\n }\r\n var divisor = this.data.r === 2 ? 1 : 100 / this.data.totalChars;\r\n var o = this.o.v/divisor;\r\n var s = this.s.v/divisor + o;\r\n var e = (this.e.v/divisor) + o;\r\n if(s>e){\r\n var _s = s;\r\n s = e;\r\n e = _s;\r\n }\r\n this.finalS = s;\r\n this.finalE = e;\r\n }\r\n }\r\n extendPrototype([DynamicPropertyContainer], TextSelectorProp);\r\n\r\n function getTextSelectorProp(elem, data,arr) {\r\n return new TextSelectorProp(elem, data, arr);\r\n }\r\n\r\n return {\r\n getTextSelectorProp: getTextSelectorProp\r\n };\r\n}());\r\n\r\n \r\nvar pool_factory = (function() {\r\n\treturn function(initialLength, _create, _release, _clone) {\r\n\r\n\t\tvar _length = 0;\r\n\t\tvar _maxLength = initialLength;\r\n\t\tvar pool = createSizedArray(_maxLength);\r\n\r\n\t\tvar ob = {\r\n\t\t\tnewElement: newElement,\r\n\t\t\trelease: release\r\n\t\t};\r\n\r\n\t\tfunction newElement(){\r\n\t\t\tvar element;\r\n\t\t\tif(_length){\r\n\t\t\t\t_length -= 1;\r\n\t\t\t\telement = pool[_length];\r\n\t\t\t} else {\r\n\t\t\t\telement = _create();\r\n\t\t\t}\r\n\t\t\treturn element;\r\n\t\t}\r\n\r\n\t\tfunction release(element) {\r\n\t\t\tif(_length === _maxLength) {\r\n\t\t\t\tpool = pooling.double(pool);\r\n\t\t\t\t_maxLength = _maxLength*2;\r\n\t\t\t}\r\n\t\t\tif (_release) {\r\n\t\t\t\t_release(element);\r\n\t\t\t}\r\n\t\t\tpool[_length] = element;\r\n\t\t\t_length += 1;\r\n\t\t}\r\n\r\n\t\tfunction clone() {\r\n\t\t\tvar clonedElement = newElement();\r\n\t\t\treturn _clone(clonedElement);\r\n\t\t}\r\n\r\n\t\treturn ob;\r\n\t};\r\n}());\r\n\r\nvar pooling = (function(){\r\n\r\n\tfunction double(arr){\r\n\t\treturn arr.concat(createSizedArray(arr.length));\r\n\t}\r\n\r\n\treturn {\r\n\t\tdouble: double\r\n\t};\r\n}());\r\nvar point_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn createTypedArray('float32', 2);\r\n\t}\r\n\treturn pool_factory(8, create);\r\n}());\r\nvar shape_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn new ShapePath();\r\n\t}\r\n\r\n\tfunction release(shapePath) {\r\n\t\tvar len = shapePath._length, i;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tpoint_pool.release(shapePath.v[i]);\r\n\t\t\tpoint_pool.release(shapePath.i[i]);\r\n\t\t\tpoint_pool.release(shapePath.o[i]);\r\n\t\t\tshapePath.v[i] = null;\r\n\t\t\tshapePath.i[i] = null;\r\n\t\t\tshapePath.o[i] = null;\r\n\t\t}\r\n\t\tshapePath._length = 0;\r\n\t\tshapePath.c = false;\r\n\t}\r\n\r\n\tfunction clone(shape) {\r\n\t\tvar cloned = factory.newElement();\r\n\t\tvar i, len = shape._length === undefined ? shape.v.length : shape._length;\r\n\t\tcloned.setLength(len);\r\n\t\tcloned.c = shape.c;\r\n\t\tvar pt;\r\n\t\t\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tcloned.setTripleAt(shape.v[i][0],shape.v[i][1],shape.o[i][0],shape.o[i][1],shape.i[i][0],shape.i[i][1], i);\r\n\t\t}\r\n\t\treturn cloned;\r\n\t}\r\n\r\n\tvar factory = pool_factory(4, create, release);\r\n\tfactory.clone = clone;\r\n\r\n\treturn factory;\r\n}());\r\nvar shapeCollection_pool = (function(){\r\n\tvar ob = {\r\n\t\tnewShapeCollection: newShapeCollection,\r\n\t\trelease: release\r\n\t};\r\n\r\n\tvar _length = 0;\r\n\tvar _maxLength = 4;\r\n\tvar pool = createSizedArray(_maxLength);\r\n\r\n\tfunction newShapeCollection(){\r\n\t\tvar shapeCollection;\r\n\t\tif(_length){\r\n\t\t\t_length -= 1;\r\n\t\t\tshapeCollection = pool[_length];\r\n\t\t} else {\r\n\t\t\tshapeCollection = new ShapeCollection();\r\n\t\t}\r\n\t\treturn shapeCollection;\r\n\t}\r\n\r\n\tfunction release(shapeCollection) {\r\n\t\tvar i, len = shapeCollection._length;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tshape_pool.release(shapeCollection.shapes[i]);\r\n\t\t}\r\n\t\tshapeCollection._length = 0;\r\n\r\n\t\tif(_length === _maxLength) {\r\n\t\t\tpool = pooling.double(pool);\r\n\t\t\t_maxLength = _maxLength*2;\r\n\t\t}\r\n\t\tpool[_length] = shapeCollection;\r\n\t\t_length += 1;\r\n\t}\r\n\r\n\treturn ob;\r\n}());\r\nvar segments_length_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn {\r\n\t\t\tlengths: [],\r\n\t\t\ttotalLength: 0\r\n\t\t};\r\n\t}\r\n\r\n\tfunction release(element) {\r\n\t\tvar i, len = element.lengths.length;\r\n\t\tfor(i=0;i<len;i+=1) {\r\n\t\t\tbezier_length_pool.release(element.lengths[i]);\r\n\t\t}\r\n\t\telement.lengths.length = 0;\r\n\t}\r\n\r\n\treturn pool_factory(8, create, release);\r\n}());\r\nvar bezier_length_pool = (function(){\r\n\r\n\tfunction create() {\r\n\t\treturn {\r\n addedLength: 0,\r\n percents: createTypedArray('float32', defaultCurveSegments),\r\n lengths: createTypedArray('float32', defaultCurveSegments),\r\n };\r\n\t}\r\n\treturn pool_factory(8, create);\r\n}());\r\nfunction BaseRenderer(){}\r\nBaseRenderer.prototype.checkLayers = function(num){\r\n var i, len = this.layers.length, data;\r\n this.completeLayers = true;\r\n for (i = len - 1; i >= 0; i--) {\r\n if (!this.elements[i]) {\r\n data = this.layers[i];\r\n if(data.ip - data.st <= (num - this.layers[i].st) && data.op - data.st > (num - this.layers[i].st))\r\n {\r\n this.buildItem(i);\r\n }\r\n }\r\n this.completeLayers = this.elements[i] ? this.completeLayers:false;\r\n }\r\n this.checkPendingElements();\r\n};\r\n\r\nBaseRenderer.prototype.createItem = function(layer){\r\n switch(layer.ty){\r\n case 2:\r\n return this.createImage(layer);\r\n case 0:\r\n return this.createComp(layer);\r\n case 1:\r\n return this.createSolid(layer);\r\n case 3:\r\n return this.createNull(layer);\r\n case 4:\r\n return this.createShape(layer);\r\n case 5:\r\n return this.createText(layer);\r\n case 13:\r\n return this.createCamera(layer);\r\n }\r\n return this.createNull(layer);\r\n};\r\n\r\nBaseRenderer.prototype.createCamera = function(){\r\n throw new Error('You\\'re using a 3d camera. Try the html renderer.');\r\n};\r\n\r\nBaseRenderer.prototype.buildAllItems = function(){\r\n var i, len = this.layers.length;\r\n for(i=0;i<len;i+=1){\r\n this.buildItem(i);\r\n }\r\n this.checkPendingElements();\r\n};\r\n\r\nBaseRenderer.prototype.includeLayers = function(newLayers){\r\n this.completeLayers = false;\r\n var i, len = newLayers.length;\r\n var j, jLen = this.layers.length;\r\n for(i=0;i<len;i+=1){\r\n j = 0;\r\n while(j<jLen){\r\n if(this.layers[j].id == newLayers[i].id){\r\n this.layers[j] = newLayers[i];\r\n break;\r\n }\r\n j += 1;\r\n }\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.setProjectInterface = function(pInterface){\r\n this.globalData.projectInterface = pInterface;\r\n};\r\n\r\nBaseRenderer.prototype.initItems = function(){\r\n if(!this.globalData.progressiveLoad){\r\n this.buildAllItems();\r\n }\r\n};\r\nBaseRenderer.prototype.buildElementParenting = function(element, parentName, hierarchy) {\r\n var elements = this.elements;\r\n var layers = this.layers;\r\n var i=0, len = layers.length;\r\n while (i < len) {\r\n if (layers[i].ind == parentName) {\r\n if (!elements[i] || elements[i] === true) {\r\n this.buildItem(i);\r\n this.addPendingElement(element);\r\n } else {\r\n hierarchy.push(elements[i]);\r\n elements[i].setAsParent();\r\n if(layers[i].parent !== undefined) {\r\n this.buildElementParenting(element, layers[i].parent, hierarchy);\r\n } else {\r\n element.setHierarchy(hierarchy);\r\n }\r\n }\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.addPendingElement = function(element){\r\n this.pendingElements.push(element);\r\n};\r\n\r\nBaseRenderer.prototype.searchExtraCompositions = function(assets){\r\n var i, len = assets.length;\r\n for(i=0;i<len;i+=1){\r\n if(assets[i].xt){\r\n var comp = this.createComp(assets[i]);\r\n comp.initExpressions();\r\n this.globalData.projectInterface.registerComposition(comp);\r\n }\r\n }\r\n};\r\n\r\nBaseRenderer.prototype.setupGlobalData = function(animData, fontsContainer) {\r\n this.globalData.fontManager = new FontManager();\r\n this.globalData.fontManager.addChars(animData.chars);\r\n this.globalData.fontManager.addFonts(animData.fonts, fontsContainer);\r\n this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);\r\n this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);\r\n this.globalData.imageLoader = this.animationItem.imagePreloader;\r\n this.globalData.frameId = 0;\r\n this.globalData.frameRate = animData.fr;\r\n this.globalData.nm = animData.nm;\r\n this.globalData.compSize = {\r\n w: animData.w,\r\n h: animData.h\r\n }\r\n}\r\nfunction SVGRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.layers = null;\r\n this.renderedFrame = -1;\r\n this.svgElement = createNS('svg');\r\n var ariaLabel = '';\r\n if (config && config.title) {\r\n var titleElement = createNS('title');\r\n var titleId = createElementID();\r\n titleElement.setAttribute('id', titleId);\r\n titleElement.textContent = config.title;\r\n this.svgElement.appendChild(titleElement);\r\n ariaLabel += titleId;\r\n }\r\n if (config && config.description) {\r\n var descElement = createNS('desc');\r\n var descId = createElementID();\r\n descElement.setAttribute('id', descId);\r\n descElement.textContent = config.description;\r\n this.svgElement.appendChild(descElement);\r\n ariaLabel += ' ' + descId;\r\n }\r\n if (ariaLabel) {\r\n this.svgElement.setAttribute('aria-labelledby', ariaLabel)\r\n }\r\n var defs = createNS( 'defs');\r\n this.svgElement.appendChild(defs);\r\n var maskElement = createNS('g');\r\n this.svgElement.appendChild(maskElement);\r\n this.layerElement = maskElement;\r\n this.renderConfig = {\r\n preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n progressiveLoad: (config && config.progressiveLoad) || false,\r\n hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true,\r\n viewBoxOnly: (config && config.viewBoxOnly) || false,\r\n viewBoxSize: (config && config.viewBoxSize) || false,\r\n className: (config && config.className) || '',\r\n focusable: config && config.focusable\r\n };\r\n\r\n this.globalData = {\r\n _mdf: false,\r\n frameNum: -1,\r\n defs: defs,\r\n renderConfig: this.renderConfig\r\n };\r\n this.elements = [];\r\n this.pendingElements = [];\r\n this.destroyed = false;\r\n this.rendererType = 'svg';\r\n\r\n}\r\n\r\nextendPrototype([BaseRenderer],SVGRenderer);\r\n\r\nSVGRenderer.prototype.createNull = function (data) {\r\n return new NullElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createShape = function (data) {\r\n return new SVGShapeElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createText = function (data) {\r\n return new SVGTextElement(data,this.globalData,this);\r\n\r\n};\r\n\r\nSVGRenderer.prototype.createImage = function (data) {\r\n return new IImageElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.createComp = function (data) {\r\n return new SVGCompElement(data,this.globalData,this);\r\n\r\n};\r\n\r\nSVGRenderer.prototype.createSolid = function (data) {\r\n return new ISolidElement(data,this.globalData,this);\r\n};\r\n\r\nSVGRenderer.prototype.configAnimation = function(animData){\r\n this.svgElement.setAttribute('xmlns','http://www.w3.org/2000/svg');\r\n if(this.renderConfig.viewBoxSize) {\r\n this.svgElement.setAttribute('viewBox',this.renderConfig.viewBoxSize);\r\n } else {\r\n this.svgElement.setAttribute('viewBox','0 0 '+animData.w+' '+animData.h);\r\n }\r\n\r\n if(!this.renderConfig.viewBoxOnly) {\r\n this.svgElement.setAttribute('width',animData.w);\r\n this.svgElement.setAttribute('height',animData.h);\r\n this.svgElement.style.width = '100%';\r\n this.svgElement.style.height = '100%';\r\n this.svgElement.style.transform = 'translate3d(0,0,0)';\r\n }\r\n if(this.renderConfig.className) {\r\n this.svgElement.setAttribute('class', this.renderConfig.className);\r\n }\r\n if(this.renderConfig.focusable !== undefined) {\r\n this.svgElement.setAttribute('focusable', this.renderConfig.focusable);\r\n }\r\n this.svgElement.setAttribute('preserveAspectRatio',this.renderConfig.preserveAspectRatio);\r\n //this.layerElement.style.transform = 'translate3d(0,0,0)';\r\n //this.layerElement.style.transformOrigin = this.layerElement.style.mozTransformOrigin = this.layerElement.style.webkitTransformOrigin = this.layerElement.style['-webkit-transform'] = \"0px 0px 0px\";\r\n this.animationItem.wrapper.appendChild(this.svgElement);\r\n //Mask animation\r\n var defs = this.globalData.defs;\r\n\r\n this.setupGlobalData(animData, defs);\r\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\r\n this.data = animData;\r\n\r\n var maskElement = createNS( 'clipPath');\r\n var rect = createNS('rect');\r\n rect.setAttribute('width',animData.w);\r\n rect.setAttribute('height',animData.h);\r\n rect.setAttribute('x',0);\r\n rect.setAttribute('y',0);\r\n var maskId = createElementID();\r\n maskElement.setAttribute('id', maskId);\r\n maskElement.appendChild(rect);\r\n this.layerElement.setAttribute(\"clip-path\", \"url(\" + locationHref + \"#\"+maskId+\")\");\r\n\r\n defs.appendChild(maskElement);\r\n this.layers = animData.layers;\r\n this.elements = createSizedArray(animData.layers.length);\r\n};\r\n\r\n\r\nSVGRenderer.prototype.destroy = function () {\r\n this.animationItem.wrapper.innerHTML = '';\r\n this.layerElement = null;\r\n this.globalData.defs = null;\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = 0; i < len; i++) {\r\n if(this.elements[i]){\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.elements.length = 0;\r\n this.destroyed = true;\r\n this.animationItem = null;\r\n};\r\n\r\nSVGRenderer.prototype.updateContainerSize = function () {\r\n};\r\n\r\nSVGRenderer.prototype.buildItem = function(pos){\r\n var elements = this.elements;\r\n if(elements[pos] || this.layers[pos].ty == 99){\r\n return;\r\n }\r\n elements[pos] = true;\r\n var element = this.createItem(this.layers[pos]);\r\n\r\n elements[pos] = element;\r\n if(expressionsPlugin){\r\n if(this.layers[pos].ty === 0){\r\n this.globalData.projectInterface.registerComposition(element);\r\n }\r\n element.initExpressions();\r\n }\r\n this.appendElementInPos(element,pos);\r\n if(this.layers[pos].tt){\r\n if(!this.elements[pos - 1] || this.elements[pos - 1] === true){\r\n this.buildItem(pos - 1);\r\n this.addPendingElement(element);\r\n } else {\r\n element.setMatte(elements[pos - 1].layerId);\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n if(element.data.tt){\r\n var i = 0, len = this.elements.length;\r\n while(i<len){\r\n if(this.elements[i] === element){\r\n element.setMatte(this.elements[i - 1].layerId);\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.renderFrame = function(num){\r\n if(this.renderedFrame === num || this.destroyed){\r\n return;\r\n }\r\n if(num === null){\r\n num = this.renderedFrame;\r\n }else{\r\n this.renderedFrame = num;\r\n }\r\n // console.log('-------');\r\n // console.log('FRAME ',num);\r\n this.globalData.frameNum = num;\r\n this.globalData.frameId += 1;\r\n this.globalData.projectInterface.currentFrame = num;\r\n this.globalData._mdf = false;\r\n var i, len = this.layers.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(num);\r\n }\r\n for (i = len - 1; i >= 0; i--) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(num - this.layers[i].st);\r\n }\r\n }\r\n if(this.globalData._mdf) {\r\n for (i = 0; i < len; i += 1) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.appendElementInPos = function(element, pos){\r\n var newElement = element.getBaseElement();\r\n if(!newElement){\r\n return;\r\n }\r\n var i = 0;\r\n var nextElement;\r\n while(i<pos){\r\n if(this.elements[i] && this.elements[i]!== true && this.elements[i].getBaseElement()){\r\n nextElement = this.elements[i].getBaseElement();\r\n }\r\n i += 1;\r\n }\r\n if(nextElement){\r\n this.layerElement.insertBefore(newElement, nextElement);\r\n } else {\r\n this.layerElement.appendChild(newElement);\r\n }\r\n};\r\n\r\nSVGRenderer.prototype.hide = function(){\r\n this.layerElement.style.display = 'none';\r\n};\r\n\r\nSVGRenderer.prototype.show = function(){\r\n this.layerElement.style.display = 'block';\r\n};\r\n\r\nfunction CanvasRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.renderConfig = {\r\n clearCanvas: (config && config.clearCanvas !== undefined) ? config.clearCanvas : true,\r\n context: (config && config.context) || null,\r\n progressiveLoad: (config && config.progressiveLoad) || false,\r\n preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n className: (config && config.className) || ''\r\n };\r\n this.renderConfig.dpr = (config && config.dpr) || 1;\r\n if (this.animationItem.wrapper) {\r\n this.renderConfig.dpr = (config && config.dpr) || window.devicePixelRatio || 1;\r\n }\r\n this.renderedFrame = -1;\r\n this.globalData = {\r\n frameNum: -1,\r\n _mdf: false,\r\n renderConfig: this.renderConfig,\r\n currentGlobalAlpha: -1\r\n };\r\n this.contextData = new CVContextData();\r\n this.elements = [];\r\n this.pendingElements = [];\r\n this.transformMat = new Matrix();\r\n this.completeLayers = false;\r\n this.rendererType = 'canvas';\r\n}\r\nextendPrototype([BaseRenderer],CanvasRenderer);\r\n\r\nCanvasRenderer.prototype.createShape = function (data) {\r\n return new CVShapeElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createText = function (data) {\r\n return new CVTextElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createImage = function (data) {\r\n return new CVImageElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createComp = function (data) {\r\n return new CVCompElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createSolid = function (data) {\r\n return new CVSolidElement(data, this.globalData, this);\r\n};\r\n\r\nCanvasRenderer.prototype.createNull = SVGRenderer.prototype.createNull;\r\n\r\nCanvasRenderer.prototype.ctxTransform = function(props){\r\n if(props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0){\r\n return;\r\n }\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.transform(props[0],props[1],props[4],props[5],props[12],props[13]);\r\n return;\r\n }\r\n this.transformMat.cloneFromProps(props);\r\n var cProps = this.contextData.cTr.props;\r\n this.transformMat.transform(cProps[0],cProps[1],cProps[2],cProps[3],cProps[4],cProps[5],cProps[6],cProps[7],cProps[8],cProps[9],cProps[10],cProps[11],cProps[12],cProps[13],cProps[14],cProps[15]);\r\n //this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n this.contextData.cTr.cloneFromProps(this.transformMat.props);\r\n var trProps = this.contextData.cTr.props;\r\n this.canvasContext.setTransform(trProps[0],trProps[1],trProps[4],trProps[5],trProps[12],trProps[13]);\r\n};\r\n\r\nCanvasRenderer.prototype.ctxOpacity = function(op){\r\n /*if(op === 1){\r\n return;\r\n }*/\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.globalAlpha *= op < 0 ? 0 : op;\r\n this.globalData.currentGlobalAlpha = this.contextData.cO;\r\n return;\r\n }\r\n this.contextData.cO *= op < 0 ? 0 : op;\r\n if(this.globalData.currentGlobalAlpha !== this.contextData.cO) {\r\n this.canvasContext.globalAlpha = this.contextData.cO;\r\n this.globalData.currentGlobalAlpha = this.contextData.cO;\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.reset = function(){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.restore();\r\n return;\r\n }\r\n this.contextData.reset();\r\n};\r\n\r\nCanvasRenderer.prototype.save = function(actionFlag){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.save();\r\n return;\r\n }\r\n if(actionFlag){\r\n this.canvasContext.save();\r\n }\r\n var props = this.contextData.cTr.props;\r\n if(this.contextData._length <= this.contextData.cArrPos) {\r\n this.contextData.duplicate();\r\n }\r\n var i, arr = this.contextData.saved[this.contextData.cArrPos];\r\n for (i = 0; i < 16; i += 1) {\r\n arr[i] = props[i];\r\n }\r\n this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO;\r\n this.contextData.cArrPos += 1;\r\n};\r\n\r\nCanvasRenderer.prototype.restore = function(actionFlag){\r\n if(!this.renderConfig.clearCanvas){\r\n this.canvasContext.restore();\r\n return;\r\n }\r\n if(actionFlag){\r\n this.canvasContext.restore();\r\n this.globalData.blendMode = 'source-over';\r\n }\r\n this.contextData.cArrPos -= 1;\r\n var popped = this.contextData.saved[this.contextData.cArrPos];\r\n var i,arr = this.contextData.cTr.props;\r\n for(i=0;i<16;i+=1){\r\n arr[i] = popped[i];\r\n }\r\n this.canvasContext.setTransform(popped[0],popped[1],popped[4],popped[5],popped[12],popped[13]);\r\n popped = this.contextData.savedOp[this.contextData.cArrPos];\r\n this.contextData.cO = popped;\r\n if(this.globalData.currentGlobalAlpha !== popped) {\r\n this.canvasContext.globalAlpha = popped;\r\n this.globalData.currentGlobalAlpha = popped;\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.configAnimation = function(animData){\r\n if(this.animationItem.wrapper){\r\n this.animationItem.container = createTag('canvas');\r\n this.animationItem.container.style.width = '100%';\r\n this.animationItem.container.style.height = '100%';\r\n //this.animationItem.container.style.transform = 'translate3d(0,0,0)';\r\n //this.animationItem.container.style.webkitTransform = 'translate3d(0,0,0)';\r\n this.animationItem.container.style.transformOrigin = this.animationItem.container.style.mozTransformOrigin = this.animationItem.container.style.webkitTransformOrigin = this.animationItem.container.style['-webkit-transform'] = \"0px 0px 0px\";\r\n this.animationItem.wrapper.appendChild(this.animationItem.container);\r\n this.canvasContext = this.animationItem.container.getContext('2d');\r\n if(this.renderConfig.className) {\r\n this.animationItem.container.setAttribute('class', this.renderConfig.className);\r\n }\r\n }else{\r\n this.canvasContext = this.renderConfig.context;\r\n }\r\n this.data = animData;\r\n this.layers = animData.layers;\r\n this.transformCanvas = {\r\n w: animData.w,\r\n h:animData.h,\r\n sx:0,\r\n sy:0,\r\n tx:0,\r\n ty:0\r\n };\r\n this.setupGlobalData(animData, document.body);\r\n this.globalData.canvasContext = this.canvasContext;\r\n this.globalData.renderer = this;\r\n this.globalData.isDashed = false;\r\n this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;\r\n this.globalData.transformCanvas = this.transformCanvas;\r\n this.elements = createSizedArray(animData.layers.length);\r\n\r\n this.updateContainerSize();\r\n};\r\n\r\nCanvasRenderer.prototype.updateContainerSize = function () {\r\n this.reset();\r\n var elementWidth,elementHeight;\r\n if(this.animationItem.wrapper && this.animationItem.container){\r\n elementWidth = this.animationItem.wrapper.offsetWidth;\r\n elementHeight = this.animationItem.wrapper.offsetHeight;\r\n this.animationItem.container.setAttribute('width',elementWidth * this.renderConfig.dpr );\r\n this.animationItem.container.setAttribute('height',elementHeight * this.renderConfig.dpr);\r\n }else{\r\n elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr;\r\n elementHeight = this.canvasContext.canvas.height * this.renderConfig.dpr;\r\n }\r\n var elementRel,animationRel;\r\n if(this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1){\r\n var par = this.renderConfig.preserveAspectRatio.split(' ');\r\n var fillType = par[1] || 'meet';\r\n var pos = par[0] || 'xMidYMid';\r\n var xPos = pos.substr(0,4);\r\n var yPos = pos.substr(4);\r\n elementRel = elementWidth/elementHeight;\r\n animationRel = this.transformCanvas.w/this.transformCanvas.h;\r\n if(animationRel>elementRel && fillType === 'meet' || animationRel<elementRel && fillType === 'slice'){\r\n this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n }else{\r\n this.transformCanvas.sx = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementHeight/(this.transformCanvas.h / this.renderConfig.dpr);\r\n }\r\n\r\n if(xPos === 'xMid' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){\r\n this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))/2*this.renderConfig.dpr;\r\n } else if(xPos === 'xMax' && ((animationRel<elementRel && fillType==='meet') || (animationRel>elementRel && fillType === 'slice'))){\r\n this.transformCanvas.tx = (elementWidth-this.transformCanvas.w*(elementHeight/this.transformCanvas.h))*this.renderConfig.dpr;\r\n } else {\r\n this.transformCanvas.tx = 0;\r\n }\r\n if(yPos === 'YMid' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){\r\n this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w))/2)*this.renderConfig.dpr;\r\n } else if(yPos === 'YMax' && ((animationRel>elementRel && fillType==='meet') || (animationRel<elementRel && fillType === 'slice'))){\r\n this.transformCanvas.ty = ((elementHeight-this.transformCanvas.h*(elementWidth/this.transformCanvas.w)))*this.renderConfig.dpr;\r\n } else {\r\n this.transformCanvas.ty = 0;\r\n }\r\n\r\n }else if(this.renderConfig.preserveAspectRatio == 'none'){\r\n this.transformCanvas.sx = elementWidth/(this.transformCanvas.w/this.renderConfig.dpr);\r\n this.transformCanvas.sy = elementHeight/(this.transformCanvas.h/this.renderConfig.dpr);\r\n this.transformCanvas.tx = 0;\r\n this.transformCanvas.ty = 0;\r\n }else{\r\n this.transformCanvas.sx = this.renderConfig.dpr;\r\n this.transformCanvas.sy = this.renderConfig.dpr;\r\n this.transformCanvas.tx = 0;\r\n this.transformCanvas.ty = 0;\r\n }\r\n this.transformCanvas.props = [this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1];\r\n /*var i, len = this.elements.length;\r\n for(i=0;i<len;i+=1){\r\n if(this.elements[i] && this.elements[i].data.ty === 0){\r\n this.elements[i].resize(this.globalData.transformCanvas);\r\n }\r\n }*/\r\n this.ctxTransform(this.transformCanvas.props);\r\n this.canvasContext.beginPath();\r\n this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h);\r\n this.canvasContext.closePath();\r\n this.canvasContext.clip();\r\n\r\n this.renderFrame(this.renderedFrame, true);\r\n};\r\n\r\nCanvasRenderer.prototype.destroy = function () {\r\n if(this.renderConfig.clearCanvas) {\r\n this.animationItem.wrapper.innerHTML = '';\r\n }\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = len - 1; i >= 0; i-=1) {\r\n if(this.elements[i]) {\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.elements.length = 0;\r\n this.globalData.canvasContext = null;\r\n this.animationItem.container = null;\r\n this.destroyed = true;\r\n};\r\n\r\nCanvasRenderer.prototype.renderFrame = function(num, forceRender){\r\n if((this.renderedFrame === num && this.renderConfig.clearCanvas === true && !forceRender) || this.destroyed || num === -1){\r\n return;\r\n }\r\n this.renderedFrame = num;\r\n this.globalData.frameNum = num - this.animationItem._isFirstFrame;\r\n this.globalData.frameId += 1;\r\n this.globalData._mdf = !this.renderConfig.clearCanvas || forceRender;\r\n this.globalData.projectInterface.currentFrame = num;\r\n\r\n // console.log('--------');\r\n // console.log('NEW: ',num);\r\n var i, len = this.layers.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(num);\r\n }\r\n\r\n for (i = 0; i < len; i++) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(num - this.layers[i].st);\r\n }\r\n }\r\n if(this.globalData._mdf) {\r\n if(this.renderConfig.clearCanvas === true){\r\n this.canvasContext.clearRect(0, 0, this.transformCanvas.w, this.transformCanvas.h);\r\n }else{\r\n this.save();\r\n }\r\n for (i = len - 1; i >= 0; i-=1) {\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n if(this.renderConfig.clearCanvas !== true){\r\n this.restore();\r\n }\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.buildItem = function(pos){\r\n var elements = this.elements;\r\n if(elements[pos] || this.layers[pos].ty == 99){\r\n return;\r\n }\r\n var element = this.createItem(this.layers[pos], this,this.globalData);\r\n elements[pos] = element;\r\n element.initExpressions();\r\n /*if(this.layers[pos].ty === 0){\r\n element.resize(this.globalData.transformCanvas);\r\n }*/\r\n};\r\n\r\nCanvasRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n }\r\n};\r\n\r\nCanvasRenderer.prototype.hide = function(){\r\n this.animationItem.container.style.display = 'none';\r\n};\r\n\r\nCanvasRenderer.prototype.show = function(){\r\n this.animationItem.container.style.display = 'block';\r\n};\r\n\r\nfunction HybridRenderer(animationItem, config){\r\n this.animationItem = animationItem;\r\n this.layers = null;\r\n this.renderedFrame = -1;\r\n this.renderConfig = {\r\n className: (config && config.className) || '',\r\n imagePreserveAspectRatio: (config && config.imagePreserveAspectRatio) || 'xMidYMid slice',\r\n hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true\r\n };\r\n this.globalData = {\r\n _mdf: false,\r\n frameNum: -1,\r\n renderConfig: this.renderConfig\r\n };\r\n this.pendingElements = [];\r\n this.elements = [];\r\n this.threeDElements = [];\r\n this.destroyed = false;\r\n this.camera = null;\r\n this.supports3d = true;\r\n this.rendererType = 'html';\r\n\r\n}\r\n\r\nextendPrototype([BaseRenderer],HybridRenderer);\r\n\r\nHybridRenderer.prototype.buildItem = SVGRenderer.prototype.buildItem;\r\n\r\nHybridRenderer.prototype.checkPendingElements = function(){\r\n while(this.pendingElements.length){\r\n var element = this.pendingElements.pop();\r\n element.checkParenting();\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.appendElementInPos = function(element, pos){\r\n var newDOMElement = element.getBaseElement();\r\n if(!newDOMElement){\r\n return;\r\n }\r\n var layer = this.layers[pos];\r\n if(!layer.ddd || !this.supports3d){\r\n if(this.threeDElements) {\r\n this.addTo3dContainer(newDOMElement,pos);\r\n } else {\r\n var i = 0;\r\n var nextDOMElement, nextLayer, tmpDOMElement;\r\n while(i<pos){\r\n if(this.elements[i] && this.elements[i]!== true && this.elements[i].getBaseElement){\r\n nextLayer = this.elements[i];\r\n tmpDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.getBaseElement();\r\n nextDOMElement = tmpDOMElement || nextDOMElement;\r\n }\r\n i += 1;\r\n }\r\n if(nextDOMElement){\r\n if(!layer.ddd || !this.supports3d){\r\n this.layerElement.insertBefore(newDOMElement, nextDOMElement);\r\n }\r\n } else {\r\n if(!layer.ddd || !this.supports3d){\r\n this.layerElement.appendChild(newDOMElement);\r\n }\r\n }\r\n }\r\n \r\n } else {\r\n this.addTo3dContainer(newDOMElement,pos);\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.createShape = function (data) {\r\n if(!this.supports3d){\r\n return new SVGShapeElement(data, this.globalData, this);\r\n }\r\n return new HShapeElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createText = function (data) {\r\n if(!this.supports3d){\r\n return new SVGTextElement(data, this.globalData, this);\r\n }\r\n return new HTextElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createCamera = function (data) {\r\n this.camera = new HCameraElement(data, this.globalData, this);\r\n return this.camera;\r\n};\r\n\r\nHybridRenderer.prototype.createImage = function (data) {\r\n if(!this.supports3d){\r\n return new IImageElement(data, this.globalData, this);\r\n }\r\n return new HImageElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createComp = function (data) {\r\n if(!this.supports3d){\r\n return new SVGCompElement(data, this.globalData, this);\r\n }\r\n return new HCompElement(data, this.globalData, this);\r\n\r\n};\r\n\r\nHybridRenderer.prototype.createSolid = function (data) {\r\n if(!this.supports3d){\r\n return new ISolidElement(data, this.globalData, this);\r\n }\r\n return new HSolidElement(data, this.globalData, this);\r\n};\r\n\r\nHybridRenderer.prototype.createNull = SVGRenderer.prototype.createNull;\r\n\r\nHybridRenderer.prototype.getThreeDContainerByPos = function(pos){\r\n var i = 0, len = this.threeDElements.length;\r\n while(i<len) {\r\n if(this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) {\r\n return this.threeDElements[i].perspectiveElem;\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.createThreeDContainer = function(pos, type){\r\n var perspectiveElem = createTag('div');\r\n styleDiv(perspectiveElem);\r\n var container = createTag('div');\r\n styleDiv(container);\r\n if(type === '3d') {\r\n perspectiveElem.style.width = this.globalData.compSize.w+'px';\r\n perspectiveElem.style.height = this.globalData.compSize.h+'px';\r\n perspectiveElem.style.transformOrigin = perspectiveElem.style.mozTransformOrigin = perspectiveElem.style.webkitTransformOrigin = \"50% 50%\";\r\n container.style.transform = container.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\r\n }\r\n \r\n perspectiveElem.appendChild(container);\r\n //this.resizerElem.appendChild(perspectiveElem);\r\n var threeDContainerData = {\r\n container:container,\r\n perspectiveElem:perspectiveElem,\r\n startPos: pos,\r\n endPos: pos,\r\n type: type\r\n };\r\n this.threeDElements.push(threeDContainerData);\r\n return threeDContainerData;\r\n};\r\n\r\nHybridRenderer.prototype.build3dContainers = function(){\r\n var i, len = this.layers.length;\r\n var lastThreeDContainerData;\r\n var currentContainer = '';\r\n for(i=0;i<len;i+=1){\r\n if(this.layers[i].ddd && this.layers[i].ty !== 3){\r\n if(currentContainer !== '3d'){\r\n currentContainer = '3d';\r\n lastThreeDContainerData = this.createThreeDContainer(i,'3d');\r\n }\r\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);\r\n } else {\r\n if(currentContainer !== '2d'){\r\n currentContainer = '2d';\r\n lastThreeDContainerData = this.createThreeDContainer(i,'2d');\r\n }\r\n lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos,i);\r\n }\r\n }\r\n len = this.threeDElements.length;\r\n for(i = len - 1; i >= 0; i --) {\r\n this.resizerElem.appendChild(this.threeDElements[i].perspectiveElem);\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.addTo3dContainer = function(elem,pos){\r\n var i = 0, len = this.threeDElements.length;\r\n while(i<len){\r\n if(pos <= this.threeDElements[i].endPos){\r\n var j = this.threeDElements[i].startPos;\r\n var nextElement;\r\n while(j<pos){\r\n if(this.elements[j] && this.elements[j].getBaseElement){\r\n nextElement = this.elements[j].getBaseElement();\r\n }\r\n j += 1;\r\n }\r\n if(nextElement){\r\n this.threeDElements[i].container.insertBefore(elem, nextElement);\r\n } else {\r\n this.threeDElements[i].container.appendChild(elem);\r\n }\r\n break;\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.configAnimation = function(animData){\r\n var resizerElem = createTag('div');\r\n var wrapper = this.animationItem.wrapper;\r\n resizerElem.style.width = animData.w+'px';\r\n resizerElem.style.height = animData.h+'px';\r\n this.resizerElem = resizerElem;\r\n styleDiv(resizerElem);\r\n resizerElem.style.transformStyle = resizerElem.style.webkitTransformStyle = resizerElem.style.mozTransformStyle = \"flat\";\r\n if(this.renderConfig.className) {\r\n resizerElem.setAttribute('class', this.renderConfig.className);\r\n }\r\n wrapper.appendChild(resizerElem);\r\n\r\n resizerElem.style.overflow = 'hidden';\r\n var svg = createNS('svg');\r\n svg.setAttribute('width','1');\r\n svg.setAttribute('height','1');\r\n styleDiv(svg);\r\n this.resizerElem.appendChild(svg);\r\n var defs = createNS('defs');\r\n svg.appendChild(defs);\r\n this.data = animData;\r\n //Mask animation\r\n this.setupGlobalData(animData, svg);\r\n this.globalData.defs = defs;\r\n this.layers = animData.layers;\r\n this.layerElement = this.resizerElem;\r\n this.build3dContainers();\r\n this.updateContainerSize();\r\n};\r\n\r\nHybridRenderer.prototype.destroy = function () {\r\n this.animationItem.wrapper.innerHTML = '';\r\n this.animationItem.container = null;\r\n this.globalData.defs = null;\r\n var i, len = this.layers ? this.layers.length : 0;\r\n for (i = 0; i < len; i++) {\r\n this.elements[i].destroy();\r\n }\r\n this.elements.length = 0;\r\n this.destroyed = true;\r\n this.animationItem = null;\r\n};\r\n\r\nHybridRenderer.prototype.updateContainerSize = function () {\r\n var elementWidth = this.animationItem.wrapper.offsetWidth;\r\n var elementHeight = this.animationItem.wrapper.offsetHeight;\r\n var elementRel = elementWidth/elementHeight;\r\n var animationRel = this.globalData.compSize.w/this.globalData.compSize.h;\r\n var sx,sy,tx,ty;\r\n if(animationRel>elementRel){\r\n sx = elementWidth/(this.globalData.compSize.w);\r\n sy = elementWidth/(this.globalData.compSize.w);\r\n tx = 0;\r\n ty = ((elementHeight-this.globalData.compSize.h*(elementWidth/this.globalData.compSize.w))/2);\r\n }else{\r\n sx = elementHeight/(this.globalData.compSize.h);\r\n sy = elementHeight/(this.globalData.compSize.h);\r\n tx = (elementWidth-this.globalData.compSize.w*(elementHeight/this.globalData.compSize.h))/2;\r\n ty = 0;\r\n }\r\n this.resizerElem.style.transform = this.resizerElem.style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,'+sy+',0,0,0,0,1,0,'+tx+','+ty+',0,1)';\r\n};\r\n\r\nHybridRenderer.prototype.renderFrame = SVGRenderer.prototype.renderFrame;\r\n\r\nHybridRenderer.prototype.hide = function(){\r\n this.resizerElem.style.display = 'none';\r\n};\r\n\r\nHybridRenderer.prototype.show = function(){\r\n this.resizerElem.style.display = 'block';\r\n};\r\n\r\nHybridRenderer.prototype.initItems = function(){\r\n this.buildAllItems();\r\n if(this.camera){\r\n this.camera.setup();\r\n } else {\r\n var cWidth = this.globalData.compSize.w;\r\n var cHeight = this.globalData.compSize.h;\r\n var i, len = this.threeDElements.length;\r\n for(i=0;i<len;i+=1){\r\n this.threeDElements[i].perspectiveElem.style.perspective = this.threeDElements[i].perspectiveElem.style.webkitPerspective = Math.sqrt(Math.pow(cWidth,2) + Math.pow(cHeight,2)) + 'px';\r\n }\r\n }\r\n};\r\n\r\nHybridRenderer.prototype.searchExtraCompositions = function(assets){\r\n var i, len = assets.length;\r\n var floatingContainer = createTag('div');\r\n for(i=0;i<len;i+=1){\r\n if(assets[i].xt){\r\n var comp = this.createComp(assets[i],floatingContainer,this.globalData.comp,null);\r\n comp.initExpressions();\r\n this.globalData.projectInterface.registerComposition(comp);\r\n }\r\n }\r\n};\r\n\r\nfunction MaskElement(data,element,globalData) {\r\n this.data = data;\r\n this.element = element;\r\n this.globalData = globalData;\r\n this.storedData = [];\r\n this.masksProperties = this.data.masksProperties || [];\r\n this.maskElement = null;\r\n var defs = this.globalData.defs;\r\n var i, len = this.masksProperties ? this.masksProperties.length : 0;\r\n this.viewData = createSizedArray(len);\r\n this.solidPath = '';\r\n\r\n\r\n var path, properties = this.masksProperties;\r\n var count = 0;\r\n var currentMasks = [];\r\n var j, jLen;\r\n var layerId = createElementID();\r\n var rect, expansor, feMorph,x;\r\n var maskType = 'clipPath', maskRef = 'clip-path';\r\n for (i = 0; i < len; i++) {\r\n if((properties[i].mode !== 'a' && properties[i].mode !== 'n')|| properties[i].inv || properties[i].o.k !== 100 || properties[i].o.x){\r\n maskType = 'mask';\r\n maskRef = 'mask';\r\n }\r\n\r\n if((properties[i].mode == 's' || properties[i].mode == 'i') && count === 0){\r\n rect = createNS( 'rect');\r\n rect.setAttribute('fill', '#ffffff');\r\n rect.setAttribute('width', this.element.comp.data.w || 0);\r\n rect.setAttribute('height', this.element.comp.data.h || 0);\r\n currentMasks.push(rect);\r\n } else {\r\n rect = null;\r\n }\r\n\r\n path = createNS( 'path');\r\n if(properties[i].mode == 'n') {\r\n // TODO move this to a factory or to a constructor\r\n this.viewData[i] = {\r\n op: PropertyFactory.getProp(this.element,properties[i].o,0,0.01,this.element),\r\n prop: ShapePropertyFactory.getShapeProp(this.element,properties[i],3),\r\n elem: path,\r\n lastPath: ''\r\n };\r\n defs.appendChild(path);\r\n continue;\r\n }\r\n count += 1;\r\n\r\n path.setAttribute('fill', properties[i].mode === 's' ? '#000000':'#ffffff');\r\n path.setAttribute('clip-rule','nonzero');\r\n var filterID;\r\n\r\n if (properties[i].x.k !== 0) {\r\n maskType = 'mask';\r\n maskRef = 'mask';\r\n x = PropertyFactory.getProp(this.element,properties[i].x,0,null,this.element);\r\n filterID = createElementID();\r\n expansor = createNS('filter');\r\n expansor.setAttribute('id',filterID);\r\n feMorph = createNS('feMorphology');\r\n feMorph.setAttribute('operator','erode');\r\n feMorph.setAttribute('in','SourceGraphic');\r\n feMorph.setAttribute('radius','0');\r\n expansor.appendChild(feMorph);\r\n defs.appendChild(expansor);\r\n path.setAttribute('stroke', properties[i].mode === 's' ? '#000000':'#ffffff');\r\n } else {\r\n feMorph = null;\r\n x = null;\r\n }\r\n\r\n // TODO move this to a factory or to a constructor\r\n this.storedData[i] = {\r\n elem: path,\r\n x: x,\r\n expan: feMorph,\r\n lastPath: '',\r\n lastOperator:'',\r\n filterId:filterID,\r\n lastRadius:0\r\n };\r\n if(properties[i].mode == 'i'){\r\n jLen = currentMasks.length;\r\n var g = createNS('g');\r\n for(j=0;j<jLen;j+=1){\r\n g.appendChild(currentMasks[j]);\r\n }\r\n var mask = createNS('mask');\r\n mask.setAttribute('mask-type','alpha');\r\n mask.setAttribute('id',layerId+'_'+count);\r\n mask.appendChild(path);\r\n defs.appendChild(mask);\r\n g.setAttribute('mask','url(' + locationHref + '#'+layerId+'_'+count+')');\r\n\r\n currentMasks.length = 0;\r\n currentMasks.push(g);\r\n }else{\r\n currentMasks.push(path);\r\n }\r\n if(properties[i].inv && !this.solidPath){\r\n this.solidPath = this.createLayerSolidPath();\r\n }\r\n // TODO move this to a factory or to a constructor\r\n this.viewData[i] = {\r\n elem: path,\r\n lastPath: '',\r\n op: PropertyFactory.getProp(this.element,properties[i].o,0,0.01,this.element),\r\n prop:ShapePropertyFactory.getShapeProp(this.element,properties[i],3),\r\n invRect: rect\r\n };\r\n if(!this.viewData[i].prop.k){\r\n this.drawPath(properties[i],this.viewData[i].prop.v,this.viewData[i]);\r\n }\r\n }\r\n\r\n this.maskElement = createNS( maskType);\r\n\r\n len = currentMasks.length;\r\n for(i=0;i<len;i+=1){\r\n this.maskElement.appendChild(currentMasks[i]);\r\n }\r\n\r\n if(count > 0){\r\n this.maskElement.setAttribute('id', layerId);\r\n this.element.maskedElement.setAttribute(maskRef, \"url(\" + locationHref + \"#\" + layerId + \")\");\r\n defs.appendChild(this.maskElement);\r\n }\r\n if (this.viewData.length) {\r\n this.element.addRenderableComponent(this);\r\n }\r\n\r\n}\r\n\r\nMaskElement.prototype.getMaskProperty = function(pos){\r\n return this.viewData[pos].prop;\r\n};\r\n\r\nMaskElement.prototype.renderFrame = function (isFirstFrame) {\r\n var finalMat = this.element.finalTransform.mat;\r\n var i, len = this.masksProperties.length;\r\n for (i = 0; i < len; i++) {\r\n if(this.viewData[i].prop._mdf || isFirstFrame){\r\n this.drawPath(this.masksProperties[i],this.viewData[i].prop.v,this.viewData[i]);\r\n }\r\n if(this.viewData[i].op._mdf || isFirstFrame){\r\n this.viewData[i].elem.setAttribute('fill-opacity',this.viewData[i].op.v);\r\n }\r\n if(this.masksProperties[i].mode !== 'n'){\r\n if(this.viewData[i].invRect && (this.element.finalTransform.mProp._mdf || isFirstFrame)){\r\n this.viewData[i].invRect.setAttribute('x', -finalMat.props[12]);\r\n this.viewData[i].invRect.setAttribute('y', -finalMat.props[13]);\r\n }\r\n if(this.storedData[i].x && (this.storedData[i].x._mdf || isFirstFrame)){\r\n var feMorph = this.storedData[i].expan;\r\n if(this.storedData[i].x.v < 0){\r\n if(this.storedData[i].lastOperator !== 'erode'){\r\n this.storedData[i].lastOperator = 'erode';\r\n this.storedData[i].elem.setAttribute('filter','url(' + locationHref + '#'+this.storedData[i].filterId+')');\r\n }\r\n feMorph.setAttribute('radius',-this.storedData[i].x.v);\r\n }else{\r\n if(this.storedData[i].lastOperator !== 'dilate'){\r\n this.storedData[i].lastOperator = 'dilate';\r\n this.storedData[i].elem.setAttribute('filter',null);\r\n }\r\n this.storedData[i].elem.setAttribute('stroke-width', this.storedData[i].x.v*2);\r\n\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nMaskElement.prototype.getMaskelement = function () {\r\n return this.maskElement;\r\n};\r\n\r\nMaskElement.prototype.createLayerSolidPath = function(){\r\n var path = 'M0,0 ';\r\n path += ' h' + this.globalData.compSize.w ;\r\n path += ' v' + this.globalData.compSize.h ;\r\n path += ' h-' + this.globalData.compSize.w ;\r\n path += ' v-' + this.globalData.compSize.h + ' ';\r\n return path;\r\n};\r\n\r\nMaskElement.prototype.drawPath = function(pathData,pathNodes,viewData){\r\n var pathString = \" M\"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n var i, len;\r\n len = pathNodes._length;\r\n for(i=1;i<len;i+=1){\r\n //pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[i][0]+','+pathNodes.i[i][1] + \" \"+pathNodes.v[i][0]+','+pathNodes.v[i][1];\r\n pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[i][0]+','+pathNodes.i[i][1] + \" \"+pathNodes.v[i][0]+','+pathNodes.v[i][1];\r\n }\r\n //pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[0][0]+','+pathNodes.i[0][1] + \" \"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n if(pathNodes.c && len > 1){\r\n pathString += \" C\"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + \" \"+pathNodes.i[0][0]+','+pathNodes.i[0][1] + \" \"+pathNodes.v[0][0]+','+pathNodes.v[0][1];\r\n }\r\n //pathNodes.__renderedString = pathString;\r\n\r\n if(viewData.lastPath !== pathString){\r\n var pathShapeValue = '';\r\n if(viewData.elem){\r\n if(pathNodes.c){\r\n pathShapeValue = pathData.inv ? this.solidPath + pathString : pathString;\r\n }\r\n viewData.elem.setAttribute('d',pathShapeValue);\r\n }\r\n viewData.lastPath = pathString;\r\n }\r\n};\r\n\r\nMaskElement.prototype.destroy = function(){\r\n this.element = null;\r\n this.globalData = null;\r\n this.maskElement = null;\r\n this.data = null;\r\n this.masksProperties = null;\r\n};\r\n\r\n/**\r\n * @file \r\n * Handles AE's layer parenting property.\r\n *\r\n */\r\n\r\nfunction HierarchyElement(){}\r\n\r\nHierarchyElement.prototype = {\r\n\t/**\r\n * @function \r\n * Initializes hierarchy properties\r\n *\r\n */\r\n\tinitHierarchy: function() {\r\n\t\t//element's parent list\r\n\t this.hierarchy = [];\r\n\t //if element is parent of another layer _isParent will be true\r\n\t this._isParent = false;\r\n\t this.checkParenting();\r\n\t},\r\n\t/**\r\n * @function \r\n * Sets layer's hierarchy.\r\n * @param {array} hierarch\r\n * layer's parent list\r\n *\r\n */ \r\n\tsetHierarchy: function(hierarchy){\r\n\t this.hierarchy = hierarchy;\r\n\t},\r\n\t/**\r\n * @function \r\n * Sets layer as parent.\r\n *\r\n */ \r\n\tsetAsParent: function() {\r\n\t this._isParent = true;\r\n\t},\r\n\t/**\r\n * @function \r\n * Searches layer's parenting chain\r\n *\r\n */ \r\n\tcheckParenting: function(){\r\n\t if (this.data.parent !== undefined){\r\n\t this.comp.buildElementParenting(this, this.data.parent, []);\r\n\t }\r\n\t}\r\n};\r\n/**\r\n * @file \r\n * Handles element's layer frame update.\r\n * Checks layer in point and out point\r\n *\r\n */\r\n\r\nfunction FrameElement(){}\r\n\r\nFrameElement.prototype = {\r\n /**\r\n * @function \r\n * Initializes frame related properties.\r\n *\r\n */\r\n initFrame: function(){\r\n //set to true when inpoint is rendered\r\n this._isFirstFrame = false;\r\n //list of animated properties\r\n this.dynamicProperties = [];\r\n // If layer has been modified in current tick this will be true\r\n this._mdf = false;\r\n },\r\n /**\r\n * @function \r\n * Calculates all dynamic values\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n * @param {boolean} isVisible\r\n * if layers is currently in range\r\n * \r\n */\r\n prepareProperties: function(num, isVisible) {\r\n var i, len = this.dynamicProperties.length;\r\n for (i = 0;i < len; i += 1) {\r\n if (isVisible || (this._isParent && this.dynamicProperties[i].propType === 'transform')) {\r\n this.dynamicProperties[i].getValue();\r\n if (this.dynamicProperties[i]._mdf) {\r\n this.globalData._mdf = true;\r\n this._mdf = true;\r\n }\r\n }\r\n }\r\n },\r\n addDynamicProperty: function(prop) {\r\n if(this.dynamicProperties.indexOf(prop) === -1) {\r\n this.dynamicProperties.push(prop);\r\n }\r\n }\r\n};\r\nfunction TransformElement(){}\r\n\r\nTransformElement.prototype = {\r\n initTransform: function() {\r\n this.finalTransform = {\r\n mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : {o:0},\r\n _matMdf: false,\r\n _opMdf: false,\r\n mat: new Matrix()\r\n };\r\n if (this.data.ao) {\r\n this.finalTransform.mProp.autoOriented = true;\r\n }\r\n\r\n //TODO: check TYPE 11: Guided elements\r\n if (this.data.ty !== 11) {\r\n //this.createElements();\r\n }\r\n },\r\n renderTransform: function() {\r\n\r\n this.finalTransform._opMdf = this.finalTransform.mProp.o._mdf || this._isFirstFrame;\r\n this.finalTransform._matMdf = this.finalTransform.mProp._mdf || this._isFirstFrame;\r\n\r\n if (this.hierarchy) {\r\n var mat;\r\n var finalMat = this.finalTransform.mat;\r\n var i = 0, len = this.hierarchy.length;\r\n //Checking if any of the transformation matrices in the hierarchy chain has changed.\r\n if (!this.finalTransform._matMdf) {\r\n while (i < len) {\r\n if (this.hierarchy[i].finalTransform.mProp._mdf) {\r\n this.finalTransform._matMdf = true;\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n \r\n if (this.finalTransform._matMdf) {\r\n mat = this.finalTransform.mProp.v.props;\r\n finalMat.cloneFromProps(mat);\r\n for (i = 0; i < len; i += 1) {\r\n mat = this.hierarchy[i].finalTransform.mProp.v.props;\r\n finalMat.transform(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5], mat[6], mat[7], mat[8], mat[9], mat[10], mat[11], mat[12], mat[13], mat[14], mat[15]);\r\n }\r\n }\r\n }\r\n },\r\n globalToLocal: function(pt) {\r\n var transforms = [];\r\n transforms.push(this.finalTransform);\r\n var flag = true;\r\n var comp = this.comp;\r\n while (flag) {\r\n if (comp.finalTransform) {\r\n if (comp.data.hasMask) {\r\n transforms.splice(0, 0, comp.finalTransform);\r\n }\r\n comp = comp.comp;\r\n } else {\r\n flag = false;\r\n }\r\n }\r\n var i, len = transforms.length,ptNew;\r\n for (i = 0; i < len; i += 1) {\r\n ptNew = transforms[i].mat.applyToPointArray(0, 0, 0);\r\n //ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]);\r\n pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0];\r\n }\r\n return pt;\r\n },\r\n mHelper: new Matrix()\r\n};\r\nfunction RenderableElement(){\r\n\r\n}\r\n\r\nRenderableElement.prototype = {\r\n initRenderable: function() {\r\n //layer's visibility related to inpoint and outpoint. Rename isVisible to isInRange\r\n this.isInRange = false;\r\n //layer's display state\r\n this.hidden = false;\r\n // If layer's transparency equals 0, it can be hidden\r\n this.isTransparent = false;\r\n //list of animated components\r\n this.renderableComponents = [];\r\n },\r\n addRenderableComponent: function(component) {\r\n if(this.renderableComponents.indexOf(component) === -1) {\r\n this.renderableComponents.push(component);\r\n }\r\n },\r\n removeRenderableComponent: function(component) {\r\n if(this.renderableComponents.indexOf(component) !== -1) {\r\n this.renderableComponents.splice(this.renderableComponents.indexOf(component), 1);\r\n }\r\n },\r\n prepareRenderableFrame: function(num) {\r\n this.checkLayerLimits(num);\r\n },\r\n checkTransparency: function(){\r\n if(this.finalTransform.mProp.o.v <= 0) {\r\n if(!this.isTransparent && this.globalData.renderConfig.hideOnTransparent){\r\n this.isTransparent = true;\r\n this.hide();\r\n }\r\n } else if(this.isTransparent) {\r\n this.isTransparent = false;\r\n this.show();\r\n }\r\n },\r\n /**\r\n * @function \r\n * Initializes frame related properties.\r\n *\r\n * @param {number} num\r\n * current frame number in Layer's time\r\n * \r\n */\r\n checkLayerLimits: function(num) {\r\n if(this.data.ip - this.data.st <= num && this.data.op - this.data.st > num)\r\n {\r\n if(this.isInRange !== true){\r\n this.globalData._mdf = true;\r\n this._mdf = true;\r\n this.isInRange = true;\r\n this.show();\r\n }\r\n } else {\r\n if(this.isInRange !== false){\r\n this.globalData._mdf = true;\r\n this.isInRange = false;\r\n this.hide();\r\n }\r\n }\r\n },\r\n renderRenderable: function() {\r\n var i, len = this.renderableComponents.length;\r\n for(i = 0; i < len; i += 1) {\r\n this.renderableComponents[i].renderFrame(this._isFirstFrame);\r\n }\r\n /*this.maskManager.renderFrame(this.finalTransform.mat);\r\n this.renderableEffectsManager.renderFrame(this._isFirstFrame);*/\r\n },\r\n sourceRectAtTime: function(){\r\n return {\r\n top:0,\r\n left:0,\r\n width:100,\r\n height:100\r\n };\r\n },\r\n getLayerSize: function(){\r\n if(this.data.ty === 5){\r\n return {w:this.data.textData.width,h:this.data.textData.height};\r\n }else{\r\n return {w:this.data.width,h:this.data.height};\r\n }\r\n }\r\n};\r\nfunction RenderableDOMElement() {}\r\n\r\n(function(){\r\n var _prototype = {\r\n initElement: function(data,globalData,comp) {\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n this.initRenderable();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n this.createContent();\r\n this.hide();\r\n },\r\n hide: function(){\r\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\r\n var elem = this.baseElement || this.layerElement;\r\n elem.style.display = 'none';\r\n this.hidden = true;\r\n }\r\n },\r\n show: function(){\r\n if (this.isInRange && !this.isTransparent){\r\n if (!this.data.hd) {\r\n var elem = this.baseElement || this.layerElement;\r\n elem.style.display = 'block';\r\n }\r\n this.hidden = false;\r\n this._isFirstFrame = true;\r\n }\r\n },\r\n renderFrame: function() {\r\n //If it is exported as hidden (data.hd === true) no need to render\r\n //If it is not visible no need to render\r\n if (this.data.hd || this.hidden) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.renderElement();\r\n this.renderInnerContent();\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n renderInnerContent: function() {},\r\n prepareFrame: function(num) {\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n this.checkTransparency();\r\n },\r\n destroy: function(){\r\n this.innerElem = null;\r\n this.destroyBaseElement();\r\n }\r\n };\r\n extendPrototype([RenderableElement, createProxyFunction(_prototype)], RenderableDOMElement);\r\n}());\r\nfunction ProcessedElement(element, position) {\r\n\tthis.elem = element;\r\n\tthis.pos = position;\r\n}\r\nfunction SVGStyleData(data, level) {\r\n\tthis.data = data;\r\n\tthis.type = data.ty;\r\n\tthis.d = '';\r\n\tthis.lvl = level;\r\n\tthis._mdf = false;\r\n\tthis.closed = data.hd === true;\r\n\tthis.pElem = createNS('path');\r\n\tthis.msElem = null;\r\n}\r\n\r\nSVGStyleData.prototype.reset = function() {\r\n\tthis.d = '';\r\n\tthis._mdf = false;\r\n};\r\nfunction SVGShapeData(transformers, level, shape) {\r\n this.caches = [];\r\n this.styles = [];\r\n this.transformers = transformers;\r\n this.lStr = '';\r\n this.sh = shape;\r\n this.lvl = level;\r\n //TODO find if there are some cases where _isAnimated can be false. \r\n // For now, since shapes add up with other shapes. They have to be calculated every time.\r\n // One way of finding out is checking if all styles associated to this shape depend only of this shape\r\n this._isAnimated = !!shape.k;\r\n // TODO: commenting this for now since all shapes are animated\r\n var i = 0, len = transformers.length;\r\n while(i < len) {\r\n \tif(transformers[i].mProps.dynamicProperties.length) {\r\n \t\tthis._isAnimated = true;\r\n \t\tbreak;\r\n \t}\r\n \ti += 1;\r\n }\r\n}\r\n\r\nSVGShapeData.prototype.setAsAnimated = function() {\r\n this._isAnimated = true;\r\n}\r\nfunction SVGTransformData(mProps, op, container) {\r\n\tthis.transform = {\r\n\t\tmProps: mProps,\r\n\t\top: op,\r\n\t\tcontainer: container\r\n\t};\r\n\tthis.elements = [];\r\n this._isAnimated = this.transform.mProps.dynamicProperties.length || this.transform.op.effectsSequence.length;\r\n}\r\nfunction SVGStrokeStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n\tthis.w = PropertyFactory.getProp(elem,data.w,0,null,this);\r\n\tthis.d = new DashProperty(elem,data.d||{},'svg',this);\r\n\tthis.c = PropertyFactory.getProp(elem,data.c,1,255,this);\r\n\tthis.style = styleOb;\r\n this._isAnimated = !!this._isAnimated;\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGStrokeStyleData);\r\nfunction SVGFillStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n\tthis.c = PropertyFactory.getProp(elem,data.c,1,255,this);\r\n\tthis.style = styleOb;\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGFillStyleData);\r\nfunction SVGGradientFillStyleData(elem, data, styleOb){\r\n this.initDynamicPropertyContainer(elem);\r\n this.getValue = this.iterateDynamicProperties;\r\n this.initGradientData(elem, data, styleOb);\r\n}\r\n\r\nSVGGradientFillStyleData.prototype.initGradientData = function(elem, data, styleOb){\r\n this.o = PropertyFactory.getProp(elem,data.o,0,0.01,this);\r\n this.s = PropertyFactory.getProp(elem,data.s,1,null,this);\r\n this.e = PropertyFactory.getProp(elem,data.e,1,null,this);\r\n this.h = PropertyFactory.getProp(elem,data.h||{k:0},0,0.01,this);\r\n this.a = PropertyFactory.getProp(elem,data.a||{k:0},0,degToRads,this);\r\n this.g = new GradientProperty(elem,data.g,this);\r\n this.style = styleOb;\r\n this.stops = [];\r\n this.setGradientData(styleOb.pElem, data);\r\n this.setGradientOpacity(data, styleOb);\r\n this._isAnimated = !!this._isAnimated;\r\n\r\n};\r\n\r\nSVGGradientFillStyleData.prototype.setGradientData = function(pathElement,data){\r\n\r\n var gradientId = createElementID();\r\n var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\r\n gfill.setAttribute('id',gradientId);\r\n gfill.setAttribute('spreadMethod','pad');\r\n gfill.setAttribute('gradientUnits','userSpaceOnUse');\r\n var stops = [];\r\n var stop, j, jLen;\r\n jLen = data.g.p*4;\r\n for(j=0;j<jLen;j+=4){\r\n stop = createNS('stop');\r\n gfill.appendChild(stop);\r\n stops.push(stop);\r\n }\r\n pathElement.setAttribute( data.ty === 'gf' ? 'fill':'stroke','url(' + locationHref + '#'+gradientId+')');\r\n \r\n this.gf = gfill;\r\n this.cst = stops;\r\n};\r\n\r\nSVGGradientFillStyleData.prototype.setGradientOpacity = function(data, styleOb){\r\n if(this.g._hasOpacity && !this.g._collapsable){\r\n var stop, j, jLen;\r\n var mask = createNS(\"mask\");\r\n var maskElement = createNS( 'path');\r\n mask.appendChild(maskElement);\r\n var opacityId = createElementID();\r\n var maskId = createElementID();\r\n mask.setAttribute('id',maskId);\r\n var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');\r\n opFill.setAttribute('id',opacityId);\r\n opFill.setAttribute('spreadMethod','pad');\r\n opFill.setAttribute('gradientUnits','userSpaceOnUse');\r\n jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;\r\n var stops = this.stops;\r\n for(j=data.g.p*4;j<jLen;j+=2){\r\n stop = createNS('stop');\r\n stop.setAttribute('stop-color','rgb(255,255,255)');\r\n opFill.appendChild(stop);\r\n stops.push(stop);\r\n }\r\n maskElement.setAttribute( data.ty === 'gf' ? 'fill':'stroke','url(' + locationHref + '#'+opacityId+')');\r\n this.of = opFill;\r\n this.ms = mask;\r\n this.ost = stops;\r\n this.maskId = maskId;\r\n styleOb.msElem = maskElement;\r\n }\r\n};\r\n\r\nextendPrototype([DynamicPropertyContainer], SVGGradientFillStyleData);\r\nfunction SVGGradientStrokeStyleData(elem, data, styleOb){\r\n\tthis.initDynamicPropertyContainer(elem);\r\n\tthis.getValue = this.iterateDynamicProperties;\r\n\tthis.w = PropertyFactory.getProp(elem,data.w,0,null,this);\r\n\tthis.d = new DashProperty(elem,data.d||{},'svg',this);\r\n this.initGradientData(elem, data, styleOb);\r\n this._isAnimated = !!this._isAnimated;\r\n}\r\n\r\nextendPrototype([SVGGradientFillStyleData, DynamicPropertyContainer], SVGGradientStrokeStyleData);\r\nfunction ShapeGroupData() {\r\n\tthis.it = [];\r\n this.prevViewData = [];\r\n this.gr = createNS('g');\r\n}\r\nvar SVGElementsRenderer = (function() {\r\n\tvar _identityMatrix = new Matrix();\r\n\tvar _matrixHelper = new Matrix();\r\n\r\n\tvar ob = {\r\n\t\tcreateRenderFunction: createRenderFunction\r\n\t}\r\n\r\n\tfunction createRenderFunction(data) {\r\n\t var ty = data.ty;\r\n\t switch(data.ty) {\r\n\t case 'fl':\r\n\t return renderFill;\r\n\t case 'gf':\r\n\t return renderGradient;\r\n\t case 'gs':\r\n\t return renderGradientStroke;\r\n\t case 'st':\r\n\t return renderStroke;\r\n\t case 'sh':\r\n\t case 'el':\r\n\t case 'rc':\r\n\t case 'sr':\r\n\t return renderPath;\r\n\t case 'tr':\r\n\t return renderContentTransform;\r\n\t }\r\n\t}\r\n\r\n\tfunction renderContentTransform(styleData, itemData, isFirstFrame) {\r\n\t if(isFirstFrame || itemData.transform.op._mdf){\r\n\t itemData.transform.container.setAttribute('opacity',itemData.transform.op.v);\r\n\t }\r\n\t if(isFirstFrame || itemData.transform.mProps._mdf){\r\n\t itemData.transform.container.setAttribute('transform',itemData.transform.mProps.v.to2dCSS());\r\n\t }\r\n\t}\r\n\r\n\tfunction renderPath(styleData, itemData, isFirstFrame) {\r\n\t var j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.styles.length;\r\n\t var lvl = itemData.lvl;\r\n\t var paths, mat, props, iterations, k;\r\n\t for(l=0;l<lLen;l+=1){\r\n\t redraw = itemData.sh._mdf || isFirstFrame;\r\n\t if(itemData.styles[l].lvl < lvl){\r\n\t mat = _matrixHelper.reset();\r\n\t iterations = lvl - itemData.styles[l].lvl;\r\n\t k = itemData.transformers.length-1;\r\n\t while(!redraw && iterations > 0) {\r\n\t redraw = itemData.transformers[k].mProps._mdf || redraw;\r\n\t iterations --;\r\n\t k --;\r\n\t }\r\n\t if(redraw) {\r\n\t iterations = lvl - itemData.styles[l].lvl;\r\n\t k = itemData.transformers.length-1;\r\n\t while(iterations > 0) {\r\n\t props = itemData.transformers[k].mProps.v.props;\r\n\t mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n\t iterations --;\r\n\t k --;\r\n\t }\r\n\t }\r\n\t } else {\r\n\t mat = _identityMatrix;\r\n\t }\r\n\t paths = itemData.sh.paths;\r\n\t jLen = paths._length;\r\n\t if(redraw){\r\n\t pathStringTransformed = '';\r\n\t for(j=0;j<jLen;j+=1){\r\n\t pathNodes = paths.shapes[j];\r\n\t if(pathNodes && pathNodes._length){\r\n\t pathStringTransformed += buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);\r\n\t }\r\n\t }\r\n\t itemData.caches[l] = pathStringTransformed;\r\n\t } else {\r\n\t pathStringTransformed = itemData.caches[l];\r\n\t }\r\n\t itemData.styles[l].d += styleData.hd === true ? '' : pathStringTransformed;\r\n\t itemData.styles[l]._mdf = redraw || itemData.styles[l]._mdf;\r\n\t }\r\n\t}\r\n\r\n\tfunction renderFill (styleData,itemData, isFirstFrame){\r\n\t var styleElem = itemData.style;\r\n\r\n\t if(itemData.c._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('fill','rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')');\r\n\t }\r\n\t if(itemData.o._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('fill-opacity',itemData.o.v);\r\n\t }\r\n\t};\r\n\r\n\tfunction renderGradientStroke (styleData, itemData, isFirstFrame) {\r\n\t renderGradient(styleData, itemData, isFirstFrame);\r\n\t renderStroke(styleData, itemData, isFirstFrame);\r\n\t}\r\n\r\n\tfunction renderGradient(styleData, itemData, isFirstFrame) {\r\n\t var gfill = itemData.gf;\r\n\t var hasOpacity = itemData.g._hasOpacity;\r\n\t var pt1 = itemData.s.v, pt2 = itemData.e.v;\r\n\r\n\t if (itemData.o._mdf || isFirstFrame) {\r\n\t var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity';\r\n\t itemData.style.pElem.setAttribute(attr, itemData.o.v);\r\n\t }\r\n\t if (itemData.s._mdf || isFirstFrame) {\r\n\t var attr1 = styleData.t === 1 ? 'x1' : 'cx';\r\n\t var attr2 = attr1 === 'x1' ? 'y1' : 'cy';\r\n\t gfill.setAttribute(attr1, pt1[0]);\r\n\t gfill.setAttribute(attr2, pt1[1]);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute(attr1, pt1[0]);\r\n\t itemData.of.setAttribute(attr2, pt1[1]);\r\n\t }\r\n\t }\r\n\t var stops, i, len, stop;\r\n\t if (itemData.g._cmdf || isFirstFrame) {\r\n\t stops = itemData.cst;\r\n\t var cValues = itemData.g.c;\r\n\t len = stops.length;\r\n\t for (i = 0; i < len; i += 1){\r\n\t stop = stops[i];\r\n\t stop.setAttribute('offset', cValues[i * 4] + '%');\r\n\t stop.setAttribute('stop-color','rgb('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ')');\r\n\t }\r\n\t }\r\n\t if (hasOpacity && (itemData.g._omdf || isFirstFrame)) {\r\n\t var oValues = itemData.g.o;\r\n\t if(itemData.g._collapsable) {\r\n\t stops = itemData.cst;\r\n\t } else {\r\n\t stops = itemData.ost;\r\n\t }\r\n\t len = stops.length;\r\n\t for (i = 0; i < len; i += 1) {\r\n\t stop = stops[i];\r\n\t if(!itemData.g._collapsable) {\r\n\t stop.setAttribute('offset', oValues[i * 2] + '%');\r\n\t }\r\n\t stop.setAttribute('stop-opacity', oValues[i * 2 + 1]);\r\n\t }\r\n\t }\r\n\t if (styleData.t === 1) {\r\n\t if (itemData.e._mdf || isFirstFrame) {\r\n\t gfill.setAttribute('x2', pt2[0]);\r\n\t gfill.setAttribute('y2', pt2[1]);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute('x2', pt2[0]);\r\n\t itemData.of.setAttribute('y2', pt2[1]);\r\n\t }\r\n\t }\r\n\t } else {\r\n\t var rad;\r\n\t if (itemData.s._mdf || itemData.e._mdf || isFirstFrame) {\r\n\t rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n\t gfill.setAttribute('r', rad);\r\n\t if(hasOpacity && !itemData.g._collapsable){\r\n\t itemData.of.setAttribute('r', rad);\r\n\t }\r\n\t }\r\n\t if (itemData.e._mdf || itemData.h._mdf || itemData.a._mdf || isFirstFrame) {\r\n\t if (!rad) {\r\n\t rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n\t }\r\n\t var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\r\n\r\n\t var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;\r\n\t var dist = rad * percent;\r\n\t var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\r\n\t var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\r\n\t gfill.setAttribute('fx', x);\r\n\t gfill.setAttribute('fy', y);\r\n\t if (hasOpacity && !itemData.g._collapsable) {\r\n\t itemData.of.setAttribute('fx', x);\r\n\t itemData.of.setAttribute('fy', y);\r\n\t }\r\n\t }\r\n\t //gfill.setAttribute('fy','200');\r\n\t }\r\n\t};\r\n\r\n\tfunction renderStroke(styleData, itemData, isFirstFrame) {\r\n\t var styleElem = itemData.style;\r\n\t var d = itemData.d;\r\n\t if (d && (d._mdf || isFirstFrame) && d.dashStr) {\r\n\t styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr);\r\n\t styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]);\r\n\t }\r\n\t if(itemData.c && (itemData.c._mdf || isFirstFrame)){\r\n\t styleElem.pElem.setAttribute('stroke','rgb(' + bm_floor(itemData.c.v[0]) + ',' + bm_floor(itemData.c.v[1]) + ',' + bm_floor(itemData.c.v[2]) + ')');\r\n\t }\r\n\t if(itemData.o._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v);\r\n\t }\r\n\t if(itemData.w._mdf || isFirstFrame){\r\n\t styleElem.pElem.setAttribute('stroke-width', itemData.w.v);\r\n\t if(styleElem.msElem){\r\n\t styleElem.msElem.setAttribute('stroke-width', itemData.w.v);\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\treturn ob;\r\n}())\r\nfunction ShapeTransformManager() {\r\n\tthis.sequences = {};\r\n\tthis.sequenceList = [];\r\n this.transform_key_count = 0;\r\n}\r\n\r\nShapeTransformManager.prototype = {\r\n\taddTransformSequence: function(transforms) {\r\n\t\tvar i, len = transforms.length;\r\n\t\tvar key = '_';\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\tkey += transforms[i].transform.key + '_';\r\n\t\t}\r\n\t\tvar sequence = this.sequences[key];\r\n\t\tif(!sequence) {\r\n\t\t\tsequence = {\r\n\t\t\t\ttransforms: [].concat(transforms),\r\n\t\t\t\tfinalTransform: new Matrix(),\r\n\t\t\t\t_mdf: false\r\n\t\t\t};\r\n\t\t\tthis.sequences[key] = sequence;\r\n\t\t\tthis.sequenceList.push(sequence);\r\n\t\t}\r\n\t\treturn sequence;\r\n\t},\r\n\tprocessSequence: function(sequence, isFirstFrame) {\r\n\t\tvar i = 0, len = sequence.transforms.length, _mdf = isFirstFrame;\r\n\t\twhile (i < len && !isFirstFrame) {\r\n\t\t\tif (sequence.transforms[i].transform.mProps._mdf) {\r\n\t\t\t\t_mdf = true;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\ti += 1\r\n\t\t}\r\n\t\tif (_mdf) {\r\n\t\t\tvar props;\r\n\t\t\tsequence.finalTransform.reset();\r\n\t\t\tfor (i = len - 1; i >= 0; i -= 1) {\r\n\t\t props = sequence.transforms[i].transform.mProps.v.props;\r\n\t\t sequence.finalTransform.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsequence._mdf = _mdf;\r\n\t\t\r\n\t},\r\n\tprocessSequences: function(isFirstFrame) {\r\n\t\tvar i, len = this.sequenceList.length;\r\n\t\tfor (i = 0; i < len; i += 1) {\r\n\t\t\tthis.processSequence(this.sequenceList[i], isFirstFrame);\r\n\t\t}\r\n\r\n\t},\r\n\tgetNewKey: function() {\r\n\t\treturn '_' + this.transform_key_count++;\r\n\t}\r\n}\r\nfunction CVShapeData(element, data, styles, transformsManager) {\r\n this.styledShapes = [];\r\n this.tr = [0,0,0,0,0,0];\r\n var ty = 4;\r\n if(data.ty == 'rc'){\r\n ty = 5;\r\n }else if(data.ty == 'el'){\r\n ty = 6;\r\n }else if(data.ty == 'sr'){\r\n ty = 7;\r\n }\r\n this.sh = ShapePropertyFactory.getShapeProp(element,data,ty,element);\r\n var i , len = styles.length,styledShape;\r\n for (i = 0; i < len; i += 1) {\r\n if (!styles[i].closed) {\r\n styledShape = {\r\n transforms: transformsManager.addTransformSequence(styles[i].transforms),\r\n trNodes: []\r\n }\r\n this.styledShapes.push(styledShape);\r\n styles[i].elements.push(styledShape);\r\n }\r\n }\r\n}\r\n\r\nCVShapeData.prototype.setAsAnimated = SVGShapeData.prototype.setAsAnimated;\r\nfunction BaseElement(){\r\n}\r\n\r\nBaseElement.prototype = {\r\n checkMasks: function(){\r\n if(!this.data.hasMask){\r\n return false;\r\n }\r\n var i = 0, len = this.data.masksProperties.length;\r\n while(i<len) {\r\n if((this.data.masksProperties[i].mode !== 'n' && this.data.masksProperties[i].cl !== false)) {\r\n return true;\r\n }\r\n i += 1;\r\n }\r\n return false;\r\n },\r\n initExpressions: function(){\r\n this.layerInterface = LayerExpressionInterface(this);\r\n if(this.data.hasMask && this.maskManager) {\r\n this.layerInterface.registerMaskInterface(this.maskManager);\r\n }\r\n var effectsInterface = EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);\r\n this.layerInterface.registerEffectsInterface(effectsInterface);\r\n\r\n if(this.data.ty === 0 || this.data.xt){\r\n this.compInterface = CompExpressionInterface(this);\r\n } else if(this.data.ty === 4){\r\n this.layerInterface.shapeInterface = ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface);\r\n this.layerInterface.content = this.layerInterface.shapeInterface;\r\n } else if(this.data.ty === 5){\r\n this.layerInterface.textInterface = TextExpressionInterface(this);\r\n this.layerInterface.text = this.layerInterface.textInterface;\r\n }\r\n },\r\n setBlendMode: function(){\r\n var blendModeValue = getBlendMode(this.data.bm);\r\n var elem = this.baseElement || this.layerElement;\r\n\r\n elem.style['mix-blend-mode'] = blendModeValue;\r\n },\r\n initBaseData: function(data, globalData, comp){\r\n this.globalData = globalData;\r\n this.comp = comp;\r\n this.data = data;\r\n this.layerId = createElementID();\r\n \r\n //Stretch factor for old animations missing this property.\r\n if(!this.data.sr){\r\n this.data.sr = 1;\r\n }\r\n // effects manager\r\n this.effectsManager = new EffectsManager(this.data,this,this.dynamicProperties);\r\n \r\n },\r\n getType: function(){\r\n return this.type;\r\n }\r\n ,sourceRectAtTime: function(){}\r\n}\r\nfunction NullElement(data,globalData,comp){\r\n this.initFrame();\r\n\tthis.initBaseData(data, globalData, comp);\r\n this.initFrame();\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n}\r\n\r\nNullElement.prototype.prepareFrame = function(num) {\r\n this.prepareProperties(num, true);\r\n};\r\n\r\nNullElement.prototype.renderFrame = function() {\r\n};\r\n\r\nNullElement.prototype.getBaseElement = function() {\r\n\treturn null;\r\n};\r\n\r\nNullElement.prototype.destroy = function() {\r\n};\r\n\r\nNullElement.prototype.sourceRectAtTime = function() {\r\n};\r\n\r\nNullElement.prototype.hide = function() {\r\n};\r\n\r\nextendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement], NullElement);\r\n\r\nfunction SVGBaseElement(){\r\n}\r\n\r\nSVGBaseElement.prototype = {\r\n initRendererElement: function() {\r\n this.layerElement = createNS('g');\r\n },\r\n createContainerElements: function(){\r\n this.matteElement = createNS('g');\r\n this.transformedElement = this.layerElement;\r\n this.maskedElement = this.layerElement;\r\n this._sizeChanged = false;\r\n var layerElementParent = null;\r\n //If this layer acts as a mask for the following layer\r\n var filId, fil, gg;\r\n if (this.data.td) {\r\n if (this.data.td == 3 || this.data.td == 1) {\r\n var masker = createNS('mask');\r\n masker.setAttribute('id', this.layerId);\r\n masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');\r\n masker.appendChild(this.layerElement);\r\n layerElementParent = masker;\r\n this.globalData.defs.appendChild(masker);\r\n // This is only for IE and Edge when mask if of type alpha\r\n if (!featureSupport.maskType && this.data.td == 1) {\r\n masker.setAttribute('mask-type', 'luminance');\r\n filId = createElementID();\r\n fil = filtersFactory.createFilter(filId);\r\n this.globalData.defs.appendChild(fil);\r\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\r\n gg = createNS('g');\r\n gg.appendChild(this.layerElement);\r\n layerElementParent = gg;\r\n masker.appendChild(gg);\r\n gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');\r\n }\r\n } else if(this.data.td == 2) {\r\n var maskGroup = createNS('mask');\r\n maskGroup.setAttribute('id', this.layerId);\r\n maskGroup.setAttribute('mask-type','alpha');\r\n var maskGrouper = createNS('g');\r\n maskGroup.appendChild(maskGrouper);\r\n filId = createElementID();\r\n fil = filtersFactory.createFilter(filId);\r\n ////\r\n\r\n // This solution doesn't work on Android when meta tag with viewport attribute is set\r\n /*var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type', 'matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');\r\n fil.appendChild(feColorMatrix);*/\r\n ////\r\n var feCTr = createNS('feComponentTransfer');\r\n feCTr.setAttribute('in','SourceGraphic');\r\n fil.appendChild(feCTr);\r\n var feFunc = createNS('feFuncA');\r\n feFunc.setAttribute('type','table');\r\n feFunc.setAttribute('tableValues','1.0 0.0');\r\n feCTr.appendChild(feFunc);\r\n ////\r\n this.globalData.defs.appendChild(fil);\r\n var alphaRect = createNS('rect');\r\n alphaRect.setAttribute('width', this.comp.data.w);\r\n alphaRect.setAttribute('height', this.comp.data.h);\r\n alphaRect.setAttribute('x','0');\r\n alphaRect.setAttribute('y','0');\r\n alphaRect.setAttribute('fill','#ffffff');\r\n alphaRect.setAttribute('opacity','0');\r\n maskGrouper.setAttribute('filter', 'url(' + locationHref + '#'+filId+')');\r\n maskGrouper.appendChild(alphaRect);\r\n maskGrouper.appendChild(this.layerElement);\r\n layerElementParent = maskGrouper;\r\n if (!featureSupport.maskType) {\r\n maskGroup.setAttribute('mask-type', 'luminance');\r\n fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());\r\n gg = createNS('g');\r\n maskGrouper.appendChild(alphaRect);\r\n gg.appendChild(this.layerElement);\r\n layerElementParent = gg;\r\n maskGrouper.appendChild(gg);\r\n }\r\n this.globalData.defs.appendChild(maskGroup);\r\n }\r\n } else if (this.data.tt) {\r\n this.matteElement.appendChild(this.layerElement);\r\n layerElementParent = this.matteElement;\r\n this.baseElement = this.matteElement;\r\n } else {\r\n this.baseElement = this.layerElement;\r\n }\r\n if (this.data.ln) {\r\n this.layerElement.setAttribute('id', this.data.ln);\r\n }\r\n if (this.data.cl) {\r\n this.layerElement.setAttribute('class', this.data.cl);\r\n }\r\n //Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped\r\n if (this.data.ty === 0 && !this.data.hd) {\r\n var cp = createNS( 'clipPath');\r\n var pt = createNS('path');\r\n pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');\r\n var clipId = createElementID();\r\n cp.setAttribute('id',clipId);\r\n cp.appendChild(pt);\r\n this.globalData.defs.appendChild(cp);\r\n\r\n if (this.checkMasks()) {\r\n var cpGroup = createNS('g');\r\n cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');\r\n cpGroup.appendChild(this.layerElement);\r\n this.transformedElement = cpGroup;\r\n if (layerElementParent) {\r\n layerElementParent.appendChild(this.transformedElement);\r\n } else {\r\n this.baseElement = this.transformedElement;\r\n }\r\n } else {\r\n this.layerElement.setAttribute('clip-path','url(' + locationHref + '#'+clipId+')');\r\n }\r\n \r\n }\r\n if (this.data.bm !== 0) {\r\n this.setBlendMode();\r\n }\r\n\r\n },\r\n renderElement: function() {\r\n if (this.finalTransform._matMdf) {\r\n this.transformedElement.setAttribute('transform', this.finalTransform.mat.to2dCSS());\r\n }\r\n if (this.finalTransform._opMdf) {\r\n this.transformedElement.setAttribute('opacity', this.finalTransform.mProp.o.v);\r\n }\r\n },\r\n destroyBaseElement: function() {\r\n this.layerElement = null;\r\n this.matteElement = null;\r\n this.maskManager.destroy();\r\n },\r\n getBaseElement: function() {\r\n if (this.data.hd) {\r\n return null;\r\n }\r\n return this.baseElement;\r\n },\r\n createRenderableComponents: function() {\r\n this.maskManager = new MaskElement(this.data, this, this.globalData);\r\n this.renderableEffectsManager = new SVGEffects(this);\r\n },\r\n setMatte: function(id) {\r\n if (!this.matteElement) {\r\n return;\r\n }\r\n this.matteElement.setAttribute(\"mask\", \"url(\" + locationHref + \"#\" + id + \")\");\r\n }\r\n};\r\nfunction IShapeElement(){\r\n}\r\n\r\nIShapeElement.prototype = {\r\n addShapeToModifiers: function(data) {\r\n var i, len = this.shapeModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n this.shapeModifiers[i].addShape(data);\r\n }\r\n },\r\n isShapeInAnimatedModifiers: function(data) {\r\n var i = 0, len = this.shapeModifiers.length;\r\n while(i < len) {\r\n if(this.shapeModifiers[i].isAnimatedWithShape(data)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n renderModifiers: function() {\r\n if(!this.shapeModifiers.length){\r\n return;\r\n }\r\n var i, len = this.shapes.length;\r\n for(i=0;i<len;i+=1){\r\n this.shapes[i].sh.reset();\r\n }\r\n\r\n len = this.shapeModifiers.length;\r\n for(i=len-1;i>=0;i-=1){\r\n this.shapeModifiers[i].processShapes(this._isFirstFrame);\r\n }\r\n },\r\n lcEnum: {\r\n '1': 'butt',\r\n '2': 'round',\r\n '3': 'square'\r\n },\r\n ljEnum: {\r\n '1': 'miter',\r\n '2': 'round',\r\n '3': 'bevel'\r\n },\r\n searchProcessedElement: function(elem){\r\n var elements = this.processedElements;\r\n var i = 0, len = elements.length;\r\n while (i < len) {\r\n if (elements[i].elem === elem) {\r\n return elements[i].pos;\r\n }\r\n i += 1;\r\n }\r\n return 0;\r\n },\r\n addProcessedElement: function(elem, pos){\r\n var elements = this.processedElements;\r\n var i = elements.length;\r\n while(i) {\r\n i -= 1;\r\n if (elements[i].elem === elem) {\r\n elements[i].pos = pos;\r\n return;\r\n }\r\n }\r\n elements.push(new ProcessedElement(elem, pos));\r\n },\r\n prepareFrame: function(num) {\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n }\r\n};\r\nfunction ITextElement(){\r\n}\r\n\r\nITextElement.prototype.initElement = function(data,globalData,comp){\r\n this.lettersChangedFlag = true;\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.textProperty = new TextProperty(this, data.t, this.dynamicProperties);\r\n this.textAnimator = new TextAnimatorProperty(data.t, this.renderType, this);\r\n this.initTransform(data, globalData, comp);\r\n this.initHierarchy();\r\n this.initRenderable();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n this.createContent();\r\n this.hide();\r\n this.textAnimator.searchProperties(this.dynamicProperties);\r\n};\r\n\r\nITextElement.prototype.prepareFrame = function(num) {\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n if(this.textProperty._mdf || this.textProperty._isFirstFrame) {\r\n this.buildNewText();\r\n this.textProperty._isFirstFrame = false;\r\n this.textProperty._mdf = false;\r\n }\r\n};\r\n\r\nITextElement.prototype.createPathShape = function(matrixHelper, shapes) {\r\n var j,jLen = shapes.length;\r\n var k, kLen, pathNodes;\r\n var shapeStr = '';\r\n for(j=0;j<jLen;j+=1){\r\n pathNodes = shapes[j].ks.k;\r\n shapeStr += buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);\r\n }\r\n return shapeStr;\r\n};\r\n\r\nITextElement.prototype.updateDocumentData = function(newData, index) {\r\n this.textProperty.updateDocumentData(newData, index);\r\n};\r\n\r\nITextElement.prototype.canResizeFont = function(_canResize) {\r\n this.textProperty.canResizeFont(_canResize);\r\n};\r\n\r\nITextElement.prototype.setMinimumFontSize = function(_fontSize) {\r\n this.textProperty.setMinimumFontSize(_fontSize);\r\n};\r\n\r\nITextElement.prototype.applyTextPropertiesToMatrix = function(documentData, matrixHelper, lineNumber, xPos, yPos) {\r\n if(documentData.ps){\r\n matrixHelper.translate(documentData.ps[0],documentData.ps[1] + documentData.ascent,0);\r\n }\r\n matrixHelper.translate(0,-documentData.ls,0);\r\n switch(documentData.j){\r\n case 1:\r\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]),0,0);\r\n break;\r\n case 2:\r\n matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber] )/2,0,0);\r\n break;\r\n }\r\n matrixHelper.translate(xPos, yPos, 0);\r\n};\r\n\r\n\r\nITextElement.prototype.buildColor = function(colorData) {\r\n return 'rgb(' + Math.round(colorData[0]*255) + ',' + Math.round(colorData[1]*255) + ',' + Math.round(colorData[2]*255) + ')';\r\n};\r\n\r\nITextElement.prototype.emptyProp = new LetterProps();\r\n\r\nITextElement.prototype.destroy = function(){\r\n \r\n};\r\nfunction ICompElement(){}\r\n\r\nextendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement, RenderableDOMElement], ICompElement);\r\n\r\nICompElement.prototype.initElement = function(data,globalData,comp) {\r\n this.initFrame();\r\n this.initBaseData(data, globalData, comp);\r\n this.initTransform(data, globalData, comp);\r\n this.initRenderable();\r\n this.initHierarchy();\r\n this.initRendererElement();\r\n this.createContainerElements();\r\n this.createRenderableComponents();\r\n if(this.data.xt || !globalData.progressiveLoad){\r\n this.buildAllItems();\r\n }\r\n this.hide();\r\n};\r\n\r\n/*ICompElement.prototype.hide = function(){\r\n if(!this.hidden){\r\n this.hideElement();\r\n var i,len = this.elements.length;\r\n for( i = 0; i < len; i+=1 ){\r\n if(this.elements[i]){\r\n this.elements[i].hide();\r\n }\r\n }\r\n }\r\n};*/\r\n\r\nICompElement.prototype.prepareFrame = function(num){\r\n this._mdf = false;\r\n this.prepareRenderableFrame(num);\r\n this.prepareProperties(num, this.isInRange);\r\n if(!this.isInRange && !this.data.xt){\r\n return;\r\n }\r\n\r\n if (!this.tm._placeholder) {\r\n var timeRemapped = this.tm.v;\r\n if(timeRemapped === this.data.op){\r\n timeRemapped = this.data.op - 1;\r\n }\r\n this.renderedFrame = timeRemapped;\r\n } else {\r\n this.renderedFrame = num/this.data.sr;\r\n }\r\n var i,len = this.elements.length;\r\n if(!this.completeLayers){\r\n this.checkLayers(this.renderedFrame);\r\n }\r\n //This iteration needs to be backwards because of how expressions connect between each other\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].prepareFrame(this.renderedFrame - this.layers[i].st);\r\n if(this.elements[i]._mdf) {\r\n this._mdf = true;\r\n }\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.renderInnerContent = function() {\r\n var i,len = this.layers.length;\r\n for( i = 0; i < len; i += 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.setElements = function(elems){\r\n this.elements = elems;\r\n};\r\n\r\nICompElement.prototype.getElements = function(){\r\n return this.elements;\r\n};\r\n\r\nICompElement.prototype.destroyElements = function(){\r\n var i,len = this.layers.length;\r\n for( i = 0; i < len; i+=1 ){\r\n if(this.elements[i]){\r\n this.elements[i].destroy();\r\n }\r\n }\r\n};\r\n\r\nICompElement.prototype.destroy = function(){\r\n this.destroyElements();\r\n this.destroyBaseElement();\r\n};\r\n\r\nfunction IImageElement(data,globalData,comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.initElement(data,globalData,comp);\r\n this.sourceRect = {top:0,left:0,width:this.assetData.w,height:this.assetData.h};\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement], IImageElement);\r\n\r\nIImageElement.prototype.createContent = function(){\r\n\r\n var assetPath = this.globalData.getAssetsPath(this.assetData);\r\n\r\n this.innerElem = createNS('image');\r\n this.innerElem.setAttribute('width',this.assetData.w+\"px\");\r\n this.innerElem.setAttribute('height',this.assetData.h+\"px\");\r\n this.innerElem.setAttribute('preserveAspectRatio',this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio);\r\n this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);\r\n \r\n this.layerElement.appendChild(this.innerElem);\r\n};\r\n\r\nIImageElement.prototype.sourceRectAtTime = function() {\r\n\treturn this.sourceRect;\r\n}\r\nfunction ISolidElement(data,globalData,comp){\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([IImageElement], ISolidElement);\r\n\r\nISolidElement.prototype.createContent = function(){\r\n\r\n var rect = createNS('rect');\r\n ////rect.style.width = this.data.sw;\r\n ////rect.style.height = this.data.sh;\r\n ////rect.style.fill = this.data.sc;\r\n rect.setAttribute('width',this.data.sw);\r\n rect.setAttribute('height',this.data.sh);\r\n rect.setAttribute('fill',this.data.sc);\r\n this.layerElement.appendChild(rect);\r\n};\r\nfunction SVGCompElement(data,globalData,comp){\r\n this.layers = data.layers;\r\n this.supports3d = true;\r\n this.completeLayers = false;\r\n this.pendingElements = [];\r\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\r\n //this.layerElement = createNS('g');\r\n this.initElement(data,globalData,comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([SVGRenderer, ICompElement, SVGBaseElement], SVGCompElement);\r\nfunction SVGTextElement(data,globalData,comp){\r\n this.textSpans = [];\r\n this.renderType = 'svg';\r\n this.initElement(data,globalData,comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], SVGTextElement);\r\n\r\nSVGTextElement.prototype.createContent = function(){\r\n\r\n if (this.data.singleShape && !this.globalData.fontManager.chars) {\r\n this.textContainer = createNS('text');\r\n }\r\n};\r\n\r\nSVGTextElement.prototype.buildTextContents = function(textArray) {\r\n var i = 0, len = textArray.length;\r\n var textContents = [], currentTextContent = '';\r\n while (i < len) {\r\n if(textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) {\r\n textContents.push(currentTextContent);\r\n currentTextContent = '';\r\n } else {\r\n currentTextContent += textArray[i];\r\n }\r\n i += 1;\r\n }\r\n textContents.push(currentTextContent);\r\n return textContents;\r\n}\r\n\r\nSVGTextElement.prototype.buildNewText = function(){\r\n var i, len;\r\n\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0);\r\n if(documentData.fc) {\r\n this.layerElement.setAttribute('fill', this.buildColor(documentData.fc));\r\n }else{\r\n this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)');\r\n }\r\n if(documentData.sc){\r\n this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc));\r\n this.layerElement.setAttribute('stroke-width', documentData.sw);\r\n }\r\n this.layerElement.setAttribute('font-size', documentData.finalSize);\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n if(fontData.fClass){\r\n this.layerElement.setAttribute('class',fontData.fClass);\r\n } else {\r\n this.layerElement.setAttribute('font-family', fontData.fFamily);\r\n var fWeight = documentData.fWeight, fStyle = documentData.fStyle;\r\n this.layerElement.setAttribute('font-style', fStyle);\r\n this.layerElement.setAttribute('font-weight', fWeight);\r\n }\r\n this.layerElement.setAttribute('aria-label', documentData.t);\r\n\r\n var letters = documentData.l || [];\r\n var usesGlyphs = !!this.globalData.fontManager.chars;\r\n len = letters.length;\r\n\r\n var tSpan;\r\n var matrixHelper = this.mHelper;\r\n var shapes, shapeStr = '', singleShape = this.data.singleShape;\r\n var xPos = 0, yPos = 0, firstLine = true;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n if(singleShape && !usesGlyphs && !documentData.sz) {\r\n var tElement = this.textContainer;\r\n var justify = 'start';\r\n switch(documentData.j) {\r\n case 1:\r\n justify = 'end';\r\n break;\r\n case 2:\r\n justify = 'middle';\r\n break;\r\n }\r\n tElement.setAttribute('text-anchor',justify);\r\n tElement.setAttribute('letter-spacing',trackingOffset);\r\n var textContent = this.buildTextContents(documentData.finalText);\r\n len = textContent.length;\r\n yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0;\r\n for ( i = 0; i < len; i += 1) {\r\n tSpan = this.textSpans[i] || createNS('tspan');\r\n tSpan.textContent = textContent[i];\r\n tSpan.setAttribute('x', 0);\r\n tSpan.setAttribute('y', yPos);\r\n tSpan.style.display = 'inherit';\r\n tElement.appendChild(tSpan);\r\n this.textSpans[i] = tSpan;\r\n yPos += documentData.finalLineHeight;\r\n }\r\n \r\n this.layerElement.appendChild(tElement);\r\n } else {\r\n var cachedSpansLength = this.textSpans.length;\r\n var shapeData, charData;\r\n for (i = 0; i < len; i += 1) {\r\n if(!usesGlyphs || !singleShape || i === 0){\r\n tSpan = cachedSpansLength > i ? this.textSpans[i] : createNS(usesGlyphs?'path':'text');\r\n if (cachedSpansLength <= i) {\r\n tSpan.setAttribute('stroke-linecap', 'butt');\r\n tSpan.setAttribute('stroke-linejoin','round');\r\n tSpan.setAttribute('stroke-miterlimit','4');\r\n this.textSpans[i] = tSpan;\r\n this.layerElement.appendChild(tSpan);\r\n }\r\n tSpan.style.display = 'inherit';\r\n }\r\n \r\n matrixHelper.reset();\r\n matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100);\r\n if (singleShape) {\r\n if(letters[i].n) {\r\n xPos = -trackingOffset;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n firstLine = false;\r\n }\r\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\r\n xPos += letters[i].l || 0;\r\n //xPos += letters[i].val === ' ' ? 0 : trackingOffset;\r\n xPos += trackingOffset;\r\n }\r\n if(usesGlyphs) {\r\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n shapeData = charData && charData.data || {};\r\n shapes = shapeData.shapes ? shapeData.shapes[0].it : [];\r\n if(!singleShape){\r\n tSpan.setAttribute('d',this.createPathShape(matrixHelper,shapes));\r\n } else {\r\n shapeStr += this.createPathShape(matrixHelper,shapes);\r\n }\r\n } else {\r\n if(singleShape) {\r\n tSpan.setAttribute(\"transform\", \"translate(\" + matrixHelper.props[12] + \",\" + matrixHelper.props[13] + \")\");\r\n }\r\n tSpan.textContent = letters[i].val;\r\n tSpan.setAttributeNS(\"http://www.w3.org/XML/1998/namespace\", \"xml:space\",\"preserve\");\r\n }\r\n //\r\n }\r\n if (singleShape && tSpan) {\r\n tSpan.setAttribute('d',shapeStr);\r\n }\r\n }\r\n while (i < this.textSpans.length){\r\n this.textSpans[i].style.display = 'none';\r\n i += 1;\r\n }\r\n \r\n this._sizeChanged = true;\r\n};\r\n\r\nSVGTextElement.prototype.sourceRectAtTime = function(time){\r\n this.prepareFrame(this.comp.renderedFrame - this.data.st);\r\n this.renderInnerContent();\r\n if(this._sizeChanged){\r\n this._sizeChanged = false;\r\n var textBox = this.layerElement.getBBox();\r\n this.bbox = {\r\n top: textBox.y,\r\n left: textBox.x,\r\n width: textBox.width,\r\n height: textBox.height\r\n };\r\n }\r\n return this.bbox;\r\n};\r\n\r\nSVGTextElement.prototype.renderInnerContent = function(){\r\n\r\n if(!this.data.singleShape){\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n if(this.lettersChangedFlag || this.textAnimator.lettersChangedFlag){\r\n this._sizeChanged = true;\r\n var i,len;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter, textSpan;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n continue;\r\n }\r\n renderedLetter = renderedLetters[i];\r\n textSpan = this.textSpans[i];\r\n if(renderedLetter._mdf.m) {\r\n textSpan.setAttribute('transform',renderedLetter.m);\r\n }\r\n if(renderedLetter._mdf.o) {\r\n textSpan.setAttribute('opacity',renderedLetter.o);\r\n }\r\n if(renderedLetter._mdf.sw){\r\n textSpan.setAttribute('stroke-width',renderedLetter.sw);\r\n }\r\n if(renderedLetter._mdf.sc){\r\n textSpan.setAttribute('stroke',renderedLetter.sc);\r\n }\r\n if(renderedLetter._mdf.fc){\r\n textSpan.setAttribute('fill',renderedLetter.fc);\r\n }\r\n }\r\n }\r\n }\r\n};\r\n\r\nfunction SVGShapeElement(data,globalData,comp){\r\n //List of drawable elements\r\n this.shapes = [];\r\n // Full shape data\r\n this.shapesData = data.shapes;\r\n //List of styles that will be applied to shapes\r\n this.stylesList = [];\r\n //List of modifiers that will be applied to shapes\r\n this.shapeModifiers = [];\r\n //List of items in shape tree\r\n this.itemsData = [];\r\n //List of items in previous shape tree\r\n this.processedElements = [];\r\n // List of animated components\r\n this.animatedContents = [];\r\n this.initElement(data,globalData,comp);\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n // List of elements that have been created\r\n this.prevViewData = [];\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement], SVGShapeElement);\r\n\r\nSVGShapeElement.prototype.initSecondaryElement = function() {\r\n};\r\n\r\nSVGShapeElement.prototype.identityMatrix = new Matrix();\r\n\r\nSVGShapeElement.prototype.buildExpressionInterface = function(){};\r\n\r\nSVGShapeElement.prototype.createContent = function(){\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);\r\n this.filterUniqueShapes();\r\n};\r\n\r\n/*\r\nThis method searches for multiple shapes that affect a single element and one of them is animated\r\n*/\r\nSVGShapeElement.prototype.filterUniqueShapes = function(){\r\n var i, len = this.shapes.length, shape;\r\n var j, jLen = this.stylesList.length;\r\n var style, count = 0;\r\n var tempShapes = [];\r\n var areAnimated = false;\r\n for(j = 0; j < jLen; j += 1) {\r\n style = this.stylesList[j];\r\n areAnimated = false;\r\n tempShapes.length = 0;\r\n for(i = 0; i < len; i += 1) {\r\n shape = this.shapes[i];\r\n if(shape.styles.indexOf(style) !== -1) {\r\n tempShapes.push(shape);\r\n areAnimated = shape._isAnimated || areAnimated;\r\n }\r\n }\r\n if(tempShapes.length > 1 && areAnimated) {\r\n this.setShapesAsAnimated(tempShapes);\r\n }\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.setShapesAsAnimated = function(shapes){\r\n var i, len = shapes.length;\r\n for(i = 0; i < len; i += 1) {\r\n shapes[i].setAsAnimated();\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.createStyleElement = function(data, level){\r\n //TODO: prevent drawing of hidden styles\r\n var elementData;\r\n var styleOb = new SVGStyleData(data, level);\r\n\r\n var pathElement = styleOb.pElem;\r\n if(data.ty === 'st') {\r\n elementData = new SVGStrokeStyleData(this, data, styleOb);\r\n } else if(data.ty === 'fl') {\r\n elementData = new SVGFillStyleData(this, data, styleOb);\r\n } else if(data.ty === 'gf' || data.ty === 'gs') {\r\n var gradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData;\r\n elementData = new gradientConstructor(this, data, styleOb);\r\n this.globalData.defs.appendChild(elementData.gf);\r\n if (elementData.maskId) {\r\n this.globalData.defs.appendChild(elementData.ms);\r\n this.globalData.defs.appendChild(elementData.of);\r\n pathElement.setAttribute('mask','url(' + locationHref + '#' + elementData.maskId + ')');\r\n }\r\n }\r\n \r\n if(data.ty === 'st' || data.ty === 'gs') {\r\n pathElement.setAttribute('stroke-linecap', this.lcEnum[data.lc] || 'round');\r\n pathElement.setAttribute('stroke-linejoin',this.ljEnum[data.lj] || 'round');\r\n pathElement.setAttribute('fill-opacity','0');\r\n if(data.lj === 1) {\r\n pathElement.setAttribute('stroke-miterlimit',data.ml);\r\n }\r\n }\r\n\r\n if(data.r === 2) {\r\n pathElement.setAttribute('fill-rule', 'evenodd');\r\n }\r\n\r\n if(data.ln){\r\n pathElement.setAttribute('id',data.ln);\r\n }\r\n if(data.cl){\r\n pathElement.setAttribute('class',data.cl);\r\n }\r\n if(data.bm){\r\n pathElement.style['mix-blend-mode'] = getBlendMode(data.bm);\r\n }\r\n this.stylesList.push(styleOb);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createGroupElement = function(data) {\r\n var elementData = new ShapeGroupData();\r\n if(data.ln){\r\n elementData.gr.setAttribute('id',data.ln);\r\n }\r\n if(data.cl){\r\n elementData.gr.setAttribute('class',data.cl);\r\n }\r\n if(data.bm){\r\n elementData.gr.style['mix-blend-mode'] = getBlendMode(data.bm);\r\n }\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createTransformElement = function(data, container) {\r\n var transformProperty = TransformPropertyFactory.getTransformProperty(this,data,this);\r\n var elementData = new SVGTransformData(transformProperty, transformProperty.o, container);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.createShapeElement = function(data, ownTransformers, level) {\r\n var ty = 4;\r\n if(data.ty === 'rc'){\r\n ty = 5;\r\n }else if(data.ty === 'el'){\r\n ty = 6;\r\n }else if(data.ty === 'sr'){\r\n ty = 7;\r\n }\r\n var shapeProperty = ShapePropertyFactory.getShapeProp(this,data,ty,this);\r\n var elementData = new SVGShapeData(ownTransformers, level, shapeProperty);\r\n this.shapes.push(elementData);\r\n this.addShapeToModifiers(elementData);\r\n this.addToAnimatedContents(data, elementData);\r\n return elementData;\r\n};\r\n\r\nSVGShapeElement.prototype.addToAnimatedContents = function(data, element) {\r\n var i = 0, len = this.animatedContents.length;\r\n while(i < len) {\r\n if(this.animatedContents[i].element === element) {\r\n return;\r\n }\r\n i += 1;\r\n }\r\n this.animatedContents.push({\r\n fn: SVGElementsRenderer.createRenderFunction(data),\r\n element: element,\r\n data: data\r\n });\r\n};\r\n\r\nSVGShapeElement.prototype.setElementStyles = function(elementData){\r\n var arr = elementData.styles;\r\n var j, jLen = this.stylesList.length;\r\n for (j = 0; j < jLen; j += 1) {\r\n if (!this.stylesList[j].closed) {\r\n arr.push(this.stylesList[j]);\r\n }\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.reloadShapes = function(){\r\n this._isFirstFrame = true;\r\n var i, len = this.itemsData.length;\r\n for( i = 0; i < len; i += 1) {\r\n this.prevViewData[i] = this.itemsData[i];\r\n }\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);\r\n this.filterUniqueShapes();\r\n len = this.dynamicProperties.length;\r\n for(i = 0; i < len; i += 1) {\r\n this.dynamicProperties[i].getValue();\r\n }\r\n this.renderModifiers();\r\n};\r\n\r\nSVGShapeElement.prototype.searchShapes = function(arr,itemsData,prevViewData,container, level, transformers, render){\r\n var ownTransformers = [].concat(transformers);\r\n var i, len = arr.length - 1;\r\n var j, jLen;\r\n var ownStyles = [], ownModifiers = [], styleOb, currentTransform, modifier, processedPos;\r\n for(i=len;i>=0;i-=1){\r\n processedPos = this.searchProcessedElement(arr[i]);\r\n if(!processedPos){\r\n arr[i]._render = render;\r\n } else {\r\n itemsData[i] = prevViewData[processedPos - 1];\r\n }\r\n if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){\r\n if(!processedPos){\r\n itemsData[i] = this.createStyleElement(arr[i], level);\r\n } else {\r\n itemsData[i].style.closed = false;\r\n }\r\n if(arr[i]._render){\r\n container.appendChild(itemsData[i].style.pElem);\r\n }\r\n ownStyles.push(itemsData[i].style);\r\n }else if(arr[i].ty == 'gr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createGroupElement(arr[i]);\r\n } else {\r\n jLen = itemsData[i].it.length;\r\n for(j=0;j<jLen;j+=1){\r\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\r\n }\r\n }\r\n this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData,itemsData[i].gr, level + 1, ownTransformers, render);\r\n if(arr[i]._render){\r\n container.appendChild(itemsData[i].gr);\r\n }\r\n }else if(arr[i].ty == 'tr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createTransformElement(arr[i], container);\r\n }\r\n currentTransform = itemsData[i].transform;\r\n ownTransformers.push(currentTransform);\r\n }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level);\r\n }\r\n this.setElementStyles(itemsData[i]);\r\n\r\n }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n modifier.init(this,arr[i]);\r\n itemsData[i] = modifier;\r\n this.shapeModifiers.push(modifier);\r\n } else {\r\n modifier = itemsData[i];\r\n modifier.closed = false;\r\n }\r\n ownModifiers.push(modifier);\r\n }else if(arr[i].ty == 'rp'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n itemsData[i] = modifier;\r\n modifier.init(this,arr,i,itemsData);\r\n this.shapeModifiers.push(modifier);\r\n render = false;\r\n }else{\r\n modifier = itemsData[i];\r\n modifier.closed = true;\r\n }\r\n ownModifiers.push(modifier);\r\n }\r\n this.addProcessedElement(arr[i], i + 1);\r\n }\r\n len = ownStyles.length;\r\n for(i=0;i<len;i+=1){\r\n ownStyles[i].closed = true;\r\n }\r\n len = ownModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n ownModifiers[i].closed = true;\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.renderInnerContent = function() {\r\n this.renderModifiers();\r\n var i, len = this.stylesList.length;\r\n for(i=0;i<len;i+=1){\r\n this.stylesList[i].reset();\r\n }\r\n this.renderShape();\r\n\r\n for (i = 0; i < len; i += 1) {\r\n if (this.stylesList[i]._mdf || this._isFirstFrame) {\r\n if(this.stylesList[i].msElem){\r\n this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);\r\n //Adding M0 0 fixes same mask bug on all browsers\r\n this.stylesList[i].d = 'M0 0' + this.stylesList[i].d;\r\n }\r\n this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0');\r\n }\r\n }\r\n};\r\n\r\nSVGShapeElement.prototype.renderShape = function() {\r\n var i, len = this.animatedContents.length;\r\n var animatedContent;\r\n for(i = 0; i < len; i += 1) {\r\n animatedContent = this.animatedContents[i];\r\n if((this._isFirstFrame || animatedContent.element._isAnimated) && animatedContent.data !== true) {\r\n animatedContent.fn(animatedContent.data, animatedContent.element, this._isFirstFrame);\r\n }\r\n }\r\n}\r\n\r\nSVGShapeElement.prototype.destroy = function(){\r\n this.destroyBaseElement();\r\n this.shapesData = null;\r\n this.itemsData = null;\r\n};\r\n\r\nfunction SVGTintFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');\r\n feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f1');\r\n filter.appendChild(feColorMatrix);\r\n feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f2');\r\n filter.appendChild(feColorMatrix);\r\n this.matrixFilter = feColorMatrix;\r\n if(filterManager.effectElements[2].p.v !== 100 || filterManager.effectElements[2].p.k){\r\n var feMerge = createNS('feMerge');\r\n filter.appendChild(feMerge);\r\n var feMergeNode;\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','SourceGraphic');\r\n feMerge.appendChild(feMergeNode);\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','f2');\r\n feMerge.appendChild(feMergeNode);\r\n }\r\n}\r\n\r\nSVGTintFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var colorBlack = this.filterManager.effectElements[0].p.v;\r\n var colorWhite = this.filterManager.effectElements[1].p.v;\r\n var opacity = this.filterManager.effectElements[2].p.v/100;\r\n this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');\r\n }\r\n};\r\nfunction SVGFillFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','sRGB');\r\n feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0');\r\n filter.appendChild(feColorMatrix);\r\n this.matrixFilter = feColorMatrix;\r\n}\r\nSVGFillFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var color = this.filterManager.effectElements[2].p.v;\r\n var opacity = this.filterManager.effectElements[6].p.v;\r\n this.matrixFilter.setAttribute('values','0 0 0 0 '+color[0]+' 0 0 0 0 '+color[1]+' 0 0 0 0 '+color[2]+' 0 0 0 '+opacity+' 0');\r\n }\r\n};\r\nfunction SVGGaussianBlurEffect(filter, filterManager){\r\n // Outset the filter region by 100% on all sides to accommodate blur expansion.\r\n filter.setAttribute('x','-100%');\r\n filter.setAttribute('y','-100%');\r\n filter.setAttribute('width','300%');\r\n filter.setAttribute('height','300%');\r\n\r\n this.filterManager = filterManager;\r\n var feGaussianBlur = createNS('feGaussianBlur');\r\n filter.appendChild(feGaussianBlur);\r\n this.feGaussianBlur = feGaussianBlur;\r\n}\r\n\r\nSVGGaussianBlurEffect.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n // Empirical value, matching AE's blur appearance.\r\n var kBlurrinessToSigma = 0.3;\r\n var sigma = this.filterManager.effectElements[0].p.v * kBlurrinessToSigma;\r\n\r\n // Dimensions mapping:\r\n //\r\n // 1 -> horizontal & vertical\r\n // 2 -> horizontal only\r\n // 3 -> vertical only\r\n //\r\n var dimensions = this.filterManager.effectElements[1].p.v;\r\n var sigmaX = (dimensions == 3) ? 0 : sigma;\r\n var sigmaY = (dimensions == 2) ? 0 : sigma;\r\n\r\n this.feGaussianBlur.setAttribute('stdDeviation', sigmaX + \" \" + sigmaY);\r\n\r\n // Repeat edges mapping:\r\n //\r\n // 0 -> off -> duplicate\r\n // 1 -> on -> wrap\r\n var edgeMode = (this.filterManager.effectElements[2].p.v == 1) ? 'wrap' : 'duplicate';\r\n this.feGaussianBlur.setAttribute('edgeMode', edgeMode);\r\n }\r\n}\r\nfunction SVGStrokeEffect(elem, filterManager){\r\n this.initialized = false;\r\n this.filterManager = filterManager;\r\n this.elem = elem;\r\n this.paths = [];\r\n}\r\n\r\nSVGStrokeEffect.prototype.initialize = function(){\r\n\r\n var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\r\n var path,groupPath, i, len;\r\n if(this.filterManager.effectElements[1].p.v === 1){\r\n len = this.elem.maskManager.masksProperties.length;\r\n i = 0;\r\n } else {\r\n i = this.filterManager.effectElements[0].p.v - 1;\r\n len = i + 1;\r\n }\r\n groupPath = createNS('g'); \r\n groupPath.setAttribute('fill','none');\r\n groupPath.setAttribute('stroke-linecap','round');\r\n groupPath.setAttribute('stroke-dashoffset',1);\r\n for(i;i<len;i+=1){\r\n path = createNS('path');\r\n groupPath.appendChild(path);\r\n this.paths.push({p:path,m:i});\r\n }\r\n if(this.filterManager.effectElements[10].p.v === 3){\r\n var mask = createNS('mask');\r\n var id = createElementID();\r\n mask.setAttribute('id',id);\r\n mask.setAttribute('mask-type','alpha');\r\n mask.appendChild(groupPath);\r\n this.elem.globalData.defs.appendChild(mask);\r\n var g = createNS('g');\r\n g.setAttribute('mask','url(' + locationHref + '#'+id+')');\r\n while (elemChildren[0]) {\r\n g.appendChild(elemChildren[0]);\r\n }\r\n this.elem.layerElement.appendChild(g);\r\n this.masker = mask;\r\n groupPath.setAttribute('stroke','#fff');\r\n } else if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){\r\n if(this.filterManager.effectElements[10].p.v === 2){\r\n elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes;\r\n while(elemChildren.length){\r\n this.elem.layerElement.removeChild(elemChildren[0]);\r\n }\r\n }\r\n this.elem.layerElement.appendChild(groupPath);\r\n this.elem.layerElement.removeAttribute('mask');\r\n groupPath.setAttribute('stroke','#fff');\r\n }\r\n this.initialized = true;\r\n this.pathMasker = groupPath;\r\n};\r\n\r\nSVGStrokeEffect.prototype.renderFrame = function(forceRender){\r\n if(!this.initialized){\r\n this.initialize();\r\n }\r\n var i, len = this.paths.length;\r\n var mask, path;\r\n for(i=0;i<len;i+=1){\r\n if(this.paths[i].m === -1) {\r\n continue;\r\n }\r\n mask = this.elem.maskManager.viewData[this.paths[i].m];\r\n path = this.paths[i].p;\r\n if(forceRender || this.filterManager._mdf || mask.prop._mdf){\r\n path.setAttribute('d',mask.lastPath);\r\n }\r\n if(forceRender || this.filterManager.effectElements[9].p._mdf || this.filterManager.effectElements[4].p._mdf || this.filterManager.effectElements[7].p._mdf || this.filterManager.effectElements[8].p._mdf || mask.prop._mdf){\r\n var dasharrayValue;\r\n if(this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100){\r\n var s = Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;\r\n var e = Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100;\r\n var l = path.getTotalLength();\r\n dasharrayValue = '0 0 0 ' + l*s + ' ';\r\n var lineLength = l*(e-s);\r\n var segment = 1+this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;\r\n var units = Math.floor(lineLength/segment);\r\n var j;\r\n for(j=0;j<units;j+=1){\r\n dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100 + ' ';\r\n }\r\n dasharrayValue += '0 ' + l*10 + ' 0 0';\r\n } else {\r\n dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v*2*this.filterManager.effectElements[9].p.v/100;\r\n }\r\n path.setAttribute('stroke-dasharray',dasharrayValue);\r\n }\r\n }\r\n if(forceRender || this.filterManager.effectElements[4].p._mdf){\r\n this.pathMasker.setAttribute('stroke-width',this.filterManager.effectElements[4].p.v*2);\r\n }\r\n \r\n if(forceRender || this.filterManager.effectElements[6].p._mdf){\r\n this.pathMasker.setAttribute('opacity',this.filterManager.effectElements[6].p.v);\r\n }\r\n if(this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2){\r\n if(forceRender || this.filterManager.effectElements[3].p._mdf){\r\n var color = this.filterManager.effectElements[3].p.v;\r\n this.pathMasker.setAttribute('stroke','rgb('+bm_floor(color[0]*255)+','+bm_floor(color[1]*255)+','+bm_floor(color[2]*255)+')');\r\n }\r\n }\r\n};\r\nfunction SVGTritoneFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var feColorMatrix = createNS('feColorMatrix');\r\n feColorMatrix.setAttribute('type','matrix');\r\n feColorMatrix.setAttribute('color-interpolation-filters','linearRGB');\r\n feColorMatrix.setAttribute('values','0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0');\r\n feColorMatrix.setAttribute('result','f1');\r\n filter.appendChild(feColorMatrix);\r\n var feComponentTransfer = createNS('feComponentTransfer');\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n this.matrixFilter = feComponentTransfer;\r\n var feFuncR = createNS('feFuncR');\r\n feFuncR.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncR);\r\n this.feFuncR = feFuncR;\r\n var feFuncG = createNS('feFuncG');\r\n feFuncG.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncG);\r\n this.feFuncG = feFuncG;\r\n var feFuncB = createNS('feFuncB');\r\n feFuncB.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFuncB);\r\n this.feFuncB = feFuncB;\r\n}\r\n\r\nSVGTritoneFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var color1 = this.filterManager.effectElements[0].p.v;\r\n var color2 = this.filterManager.effectElements[1].p.v;\r\n var color3 = this.filterManager.effectElements[2].p.v;\r\n var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0];\r\n var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1];\r\n var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2];\r\n this.feFuncR.setAttribute('tableValues', tableR);\r\n this.feFuncG.setAttribute('tableValues', tableG);\r\n this.feFuncB.setAttribute('tableValues', tableB);\r\n //var opacity = this.filterManager.effectElements[2].p.v/100;\r\n //this.matrixFilter.setAttribute('values',(colorWhite[0]- colorBlack[0])+' 0 0 0 '+ colorBlack[0] +' '+ (colorWhite[1]- colorBlack[1]) +' 0 0 0 '+ colorBlack[1] +' '+ (colorWhite[2]- colorBlack[2]) +' 0 0 0 '+ colorBlack[2] +' 0 0 0 ' + opacity + ' 0');\r\n }\r\n};\r\nfunction SVGProLevelsFilter(filter, filterManager){\r\n this.filterManager = filterManager;\r\n var effectElements = this.filterManager.effectElements;\r\n var feComponentTransfer = createNS('feComponentTransfer');\r\n var feFuncR, feFuncG, feFuncB;\r\n \r\n if(effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1){\r\n this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer);\r\n }\r\n if(effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1){\r\n this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer);\r\n }\r\n if(effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1){\r\n this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer);\r\n }\r\n if(effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1){\r\n this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer);\r\n }\r\n \r\n if(this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA){\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n feComponentTransfer = createNS('feComponentTransfer');\r\n }\r\n\r\n if(effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1){\r\n\r\n feComponentTransfer.setAttribute('color-interpolation-filters','sRGB');\r\n filter.appendChild(feComponentTransfer);\r\n this.feFuncRComposed = this.createFeFunc('feFuncR', feComponentTransfer);\r\n this.feFuncGComposed = this.createFeFunc('feFuncG', feComponentTransfer);\r\n this.feFuncBComposed = this.createFeFunc('feFuncB', feComponentTransfer);\r\n }\r\n}\r\n\r\nSVGProLevelsFilter.prototype.createFeFunc = function(type, feComponentTransfer) {\r\n var feFunc = createNS(type);\r\n feFunc.setAttribute('type','table');\r\n feComponentTransfer.appendChild(feFunc);\r\n return feFunc;\r\n};\r\n\r\nSVGProLevelsFilter.prototype.getTableValue = function(inputBlack, inputWhite, gamma, outputBlack, outputWhite) {\r\n var cnt = 0;\r\n var segments = 256;\r\n var perc;\r\n var min = Math.min(inputBlack, inputWhite);\r\n var max = Math.max(inputBlack, inputWhite);\r\n var table = Array.call(null,{length:segments});\r\n var colorValue;\r\n var pos = 0;\r\n var outputDelta = outputWhite - outputBlack; \r\n var inputDelta = inputWhite - inputBlack; \r\n while(cnt <= 256) {\r\n perc = cnt/256;\r\n if(perc <= min){\r\n colorValue = inputDelta < 0 ? outputWhite : outputBlack;\r\n } else if(perc >= max){\r\n colorValue = inputDelta < 0 ? outputBlack : outputWhite;\r\n } else {\r\n colorValue = (outputBlack + outputDelta * Math.pow((perc - inputBlack) / inputDelta, 1 / gamma));\r\n }\r\n table[pos++] = colorValue;\r\n cnt += 256/(segments-1);\r\n }\r\n return table.join(' ');\r\n};\r\n\r\nSVGProLevelsFilter.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n var val, cnt, perc, bezier;\r\n var effectElements = this.filterManager.effectElements;\r\n if(this.feFuncRComposed && (forceRender || effectElements[3].p._mdf || effectElements[4].p._mdf || effectElements[5].p._mdf || effectElements[6].p._mdf || effectElements[7].p._mdf)){\r\n val = this.getTableValue(effectElements[3].p.v,effectElements[4].p.v,effectElements[5].p.v,effectElements[6].p.v,effectElements[7].p.v);\r\n this.feFuncRComposed.setAttribute('tableValues',val);\r\n this.feFuncGComposed.setAttribute('tableValues',val);\r\n this.feFuncBComposed.setAttribute('tableValues',val);\r\n }\r\n\r\n\r\n if(this.feFuncR && (forceRender || effectElements[10].p._mdf || effectElements[11].p._mdf || effectElements[12].p._mdf || effectElements[13].p._mdf || effectElements[14].p._mdf)){\r\n val = this.getTableValue(effectElements[10].p.v,effectElements[11].p.v,effectElements[12].p.v,effectElements[13].p.v,effectElements[14].p.v);\r\n this.feFuncR.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncG && (forceRender || effectElements[17].p._mdf || effectElements[18].p._mdf || effectElements[19].p._mdf || effectElements[20].p._mdf || effectElements[21].p._mdf)){\r\n val = this.getTableValue(effectElements[17].p.v,effectElements[18].p.v,effectElements[19].p.v,effectElements[20].p.v,effectElements[21].p.v);\r\n this.feFuncG.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncB && (forceRender || effectElements[24].p._mdf || effectElements[25].p._mdf || effectElements[26].p._mdf || effectElements[27].p._mdf || effectElements[28].p._mdf)){\r\n val = this.getTableValue(effectElements[24].p.v,effectElements[25].p.v,effectElements[26].p.v,effectElements[27].p.v,effectElements[28].p.v);\r\n this.feFuncB.setAttribute('tableValues',val);\r\n }\r\n\r\n if(this.feFuncA && (forceRender || effectElements[31].p._mdf || effectElements[32].p._mdf || effectElements[33].p._mdf || effectElements[34].p._mdf || effectElements[35].p._mdf)){\r\n val = this.getTableValue(effectElements[31].p.v,effectElements[32].p.v,effectElements[33].p.v,effectElements[34].p.v,effectElements[35].p.v);\r\n this.feFuncA.setAttribute('tableValues',val);\r\n }\r\n \r\n }\r\n};\r\nfunction SVGDropShadowEffect(filter, filterManager){\r\n filter.setAttribute('x','-100%');\r\n filter.setAttribute('y','-100%');\r\n filter.setAttribute('width','400%');\r\n filter.setAttribute('height','400%');\r\n this.filterManager = filterManager;\r\n\r\n var feGaussianBlur = createNS('feGaussianBlur');\r\n feGaussianBlur.setAttribute('in','SourceAlpha');\r\n feGaussianBlur.setAttribute('result','drop_shadow_1');\r\n feGaussianBlur.setAttribute('stdDeviation','0');\r\n this.feGaussianBlur = feGaussianBlur;\r\n filter.appendChild(feGaussianBlur);\r\n\r\n var feOffset = createNS('feOffset');\r\n feOffset.setAttribute('dx','25');\r\n feOffset.setAttribute('dy','0');\r\n feOffset.setAttribute('in','drop_shadow_1');\r\n feOffset.setAttribute('result','drop_shadow_2');\r\n this.feOffset = feOffset;\r\n filter.appendChild(feOffset);\r\n var feFlood = createNS('feFlood');\r\n feFlood.setAttribute('flood-color','#00ff00');\r\n feFlood.setAttribute('flood-opacity','1');\r\n feFlood.setAttribute('result','drop_shadow_3');\r\n this.feFlood = feFlood;\r\n filter.appendChild(feFlood);\r\n\r\n var feComposite = createNS('feComposite');\r\n feComposite.setAttribute('in','drop_shadow_3');\r\n feComposite.setAttribute('in2','drop_shadow_2');\r\n feComposite.setAttribute('operator','in');\r\n feComposite.setAttribute('result','drop_shadow_4');\r\n filter.appendChild(feComposite);\r\n\r\n\r\n var feMerge = createNS('feMerge');\r\n filter.appendChild(feMerge);\r\n var feMergeNode;\r\n feMergeNode = createNS('feMergeNode');\r\n feMerge.appendChild(feMergeNode);\r\n feMergeNode = createNS('feMergeNode');\r\n feMergeNode.setAttribute('in','SourceGraphic');\r\n this.feMergeNode = feMergeNode;\r\n this.feMerge = feMerge;\r\n this.originalNodeAdded = false;\r\n feMerge.appendChild(feMergeNode);\r\n}\r\n\r\nSVGDropShadowEffect.prototype.renderFrame = function(forceRender){\r\n if(forceRender || this.filterManager._mdf){\r\n if(forceRender || this.filterManager.effectElements[4].p._mdf){\r\n this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);\r\n }\r\n if(forceRender || this.filterManager.effectElements[0].p._mdf){\r\n var col = this.filterManager.effectElements[0].p.v;\r\n this.feFlood.setAttribute('flood-color',rgbToHex(Math.round(col[0]*255),Math.round(col[1]*255),Math.round(col[2]*255)));\r\n }\r\n if(forceRender || this.filterManager.effectElements[1].p._mdf){\r\n this.feFlood.setAttribute('flood-opacity',this.filterManager.effectElements[1].p.v/255);\r\n }\r\n if(forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf){\r\n var distance = this.filterManager.effectElements[3].p.v;\r\n var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads;\r\n var x = distance * Math.cos(angle);\r\n var y = distance * Math.sin(angle);\r\n this.feOffset.setAttribute('dx', x);\r\n this.feOffset.setAttribute('dy', y);\r\n }\r\n /*if(forceRender || this.filterManager.effectElements[5].p._mdf){\r\n if(this.filterManager.effectElements[5].p.v === 1 && this.originalNodeAdded) {\r\n this.feMerge.removeChild(this.feMergeNode);\r\n this.originalNodeAdded = false;\r\n } else if(this.filterManager.effectElements[5].p.v === 0 && !this.originalNodeAdded) {\r\n this.feMerge.appendChild(this.feMergeNode);\r\n this.originalNodeAdded = true;\r\n }\r\n }*/\r\n }\r\n};\r\nvar _svgMatteSymbols = [];\r\n\r\nfunction SVGMatte3Effect(filterElem, filterManager, elem){\r\n this.initialized = false;\r\n this.filterManager = filterManager;\r\n this.filterElem = filterElem;\r\n this.elem = elem;\r\n elem.matteElement = createNS('g');\r\n elem.matteElement.appendChild(elem.layerElement);\r\n elem.matteElement.appendChild(elem.transformedElement);\r\n elem.baseElement = elem.matteElement;\r\n}\r\n\r\nSVGMatte3Effect.prototype.findSymbol = function(mask) {\r\n var i = 0, len = _svgMatteSymbols.length;\r\n while(i < len) {\r\n if(_svgMatteSymbols[i] === mask) {\r\n return _svgMatteSymbols[i];\r\n }\r\n i += 1;\r\n }\r\n return null;\r\n};\r\n\r\nSVGMatte3Effect.prototype.replaceInParent = function(mask, symbolId) {\r\n var parentNode = mask.layerElement.parentNode;\r\n if(!parentNode) {\r\n return;\r\n }\r\n var children = parentNode.children;\r\n var i = 0, len = children.length;\r\n while (i < len) {\r\n if (children[i] === mask.layerElement) {\r\n break;\r\n }\r\n i += 1;\r\n }\r\n var nextChild;\r\n if (i <= len - 2) {\r\n nextChild = children[i + 1];\r\n }\r\n var useElem = createNS('use');\r\n useElem.setAttribute('href', '#' + symbolId);\r\n if(nextChild) {\r\n parentNode.insertBefore(useElem, nextChild);\r\n } else {\r\n parentNode.appendChild(useElem);\r\n }\r\n};\r\n\r\nSVGMatte3Effect.prototype.setElementAsMask = function(elem, mask) {\r\n if(!this.findSymbol(mask)) {\r\n var symbolId = createElementID();\r\n var masker = createNS('mask');\r\n masker.setAttribute('id', mask.layerId);\r\n masker.setAttribute('mask-type', 'alpha');\r\n _svgMatteSymbols.push(mask);\r\n var defs = elem.globalData.defs;\r\n defs.appendChild(masker);\r\n var symbol = createNS('symbol');\r\n symbol.setAttribute('id', symbolId);\r\n this.replaceInParent(mask, symbolId);\r\n symbol.appendChild(mask.layerElement);\r\n defs.appendChild(symbol);\r\n var useElem = createNS('use');\r\n useElem.setAttribute('href', '#' + symbolId);\r\n masker.appendChild(useElem);\r\n mask.data.hd = false;\r\n mask.show();\r\n }\r\n elem.setMatte(mask.layerId);\r\n};\r\n\r\nSVGMatte3Effect.prototype.initialize = function() {\r\n var ind = this.filterManager.effectElements[0].p.v;\r\n var elements = this.elem.comp.elements;\r\n var i = 0, len = elements.length;\r\n while (i < len) {\r\n \tif (elements[i] && elements[i].data.ind === ind) {\r\n \t\tthis.setElementAsMask(this.elem, elements[i]);\r\n \t}\r\n \ti += 1;\r\n }\r\n this.initialized = true;\r\n};\r\n\r\nSVGMatte3Effect.prototype.renderFrame = function() {\r\n\tif(!this.initialized) {\r\n\t\tthis.initialize();\r\n\t}\r\n};\r\nfunction SVGEffects(elem){\r\n var i, len = elem.data.ef ? elem.data.ef.length : 0;\r\n var filId = createElementID();\r\n var fil = filtersFactory.createFilter(filId);\r\n var count = 0;\r\n this.filters = [];\r\n var filterManager;\r\n for(i=0;i<len;i+=1){\r\n filterManager = null;\r\n if(elem.data.ef[i].ty === 20){\r\n count += 1;\r\n filterManager = new SVGTintFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 21){\r\n count += 1;\r\n filterManager = new SVGFillFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 22){\r\n filterManager = new SVGStrokeEffect(elem, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 23){\r\n count += 1;\r\n filterManager = new SVGTritoneFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 24){\r\n count += 1;\r\n filterManager = new SVGProLevelsFilter(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 25){\r\n count += 1;\r\n filterManager = new SVGDropShadowEffect(fil, elem.effectsManager.effectElements[i]);\r\n }else if(elem.data.ef[i].ty === 28){\r\n //count += 1;\r\n filterManager = new SVGMatte3Effect(fil, elem.effectsManager.effectElements[i], elem);\r\n }else if(elem.data.ef[i].ty === 29){\r\n count += 1;\r\n filterManager = new SVGGaussianBlurEffect(fil, elem.effectsManager.effectElements[i]);\r\n }\r\n if(filterManager) {\r\n this.filters.push(filterManager);\r\n }\r\n }\r\n if(count){\r\n elem.globalData.defs.appendChild(fil);\r\n elem.layerElement.setAttribute('filter','url(' + locationHref + '#'+filId+')');\r\n }\r\n if (this.filters.length) {\r\n elem.addRenderableComponent(this);\r\n }\r\n}\r\n\r\nSVGEffects.prototype.renderFrame = function(_isFirstFrame){\r\n var i, len = this.filters.length;\r\n for(i=0;i<len;i+=1){\r\n this.filters[i].renderFrame(_isFirstFrame);\r\n }\r\n};\r\nfunction CVContextData() {\r\n\tthis.saved = [];\r\n this.cArrPos = 0;\r\n this.cTr = new Matrix();\r\n this.cO = 1;\r\n var i, len = 15;\r\n this.savedOp = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n this.saved[i] = createTypedArray('float32', 16);\r\n }\r\n this._length = len;\r\n}\r\n\r\nCVContextData.prototype.duplicate = function() {\r\n\tvar newLength = this._length * 2;\r\n\tvar currentSavedOp = this.savedOp;\r\n this.savedOp = createTypedArray('float32', newLength);\r\n this.savedOp.set(currentSavedOp);\r\n var i = 0;\r\n for(i = this._length; i < newLength; i += 1) {\r\n this.saved[i] = createTypedArray('float32', 16);\r\n }\r\n this._length = newLength;\r\n};\r\n\r\nCVContextData.prototype.reset = function() {\r\n\tthis.cArrPos = 0;\r\n\tthis.cTr.reset();\r\n this.cO = 1;\r\n};\r\nfunction CVBaseElement(){\r\n}\r\n\r\nCVBaseElement.prototype = {\r\n createElements: function(){},\r\n initRendererElement: function(){},\r\n createContainerElements: function(){\r\n this.canvasContext = this.globalData.canvasContext;\r\n this.renderableEffectsManager = new CVEffects(this);\r\n },\r\n createContent: function(){},\r\n setBlendMode: function(){\r\n var globalData = this.globalData;\r\n if(globalData.blendMode !== this.data.bm) {\r\n globalData.blendMode = this.data.bm;\r\n var blendModeValue = getBlendMode(this.data.bm);\r\n globalData.canvasContext.globalCompositeOperation = blendModeValue;\r\n }\r\n },\r\n createRenderableComponents: function(){\r\n this.maskManager = new CVMaskElement(this.data, this);\r\n },\r\n hideElement: function(){\r\n if (!this.hidden && (!this.isInRange || this.isTransparent)) {\r\n this.hidden = true;\r\n }\r\n },\r\n showElement: function(){\r\n if (this.isInRange && !this.isTransparent){\r\n this.hidden = false;\r\n this._isFirstFrame = true;\r\n this.maskManager._isFirstFrame = true;\r\n }\r\n },\r\n renderFrame: function() {\r\n if (this.hidden || this.data.hd) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.setBlendMode();\r\n var forceRealStack = this.data.ty === 0;\r\n this.globalData.renderer.save(forceRealStack);\r\n this.globalData.renderer.ctxTransform(this.finalTransform.mat.props);\r\n this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v);\r\n this.renderInnerContent();\r\n this.globalData.renderer.restore(forceRealStack);\r\n if(this.maskManager.hasMasks) {\r\n this.globalData.renderer.restore(true);\r\n }\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n destroy: function(){\r\n this.canvasContext = null;\r\n this.data = null;\r\n this.globalData = null;\r\n this.maskManager.destroy();\r\n },\r\n mHelper: new Matrix()\r\n};\r\nCVBaseElement.prototype.hide = CVBaseElement.prototype.hideElement;\r\nCVBaseElement.prototype.show = CVBaseElement.prototype.showElement;\r\n\r\nfunction CVImageElement(data, globalData, comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.img = globalData.imageLoader.getImage(this.assetData);\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVImageElement);\r\n\r\nCVImageElement.prototype.initElement = SVGShapeElement.prototype.initElement;\r\nCVImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\r\n\r\nCVImageElement.prototype.createContent = function(){\r\n\r\n if (this.img.width && (this.assetData.w !== this.img.width || this.assetData.h !== this.img.height)) {\r\n var canvas = createTag('canvas');\r\n canvas.width = this.assetData.w;\r\n canvas.height = this.assetData.h;\r\n var ctx = canvas.getContext('2d');\r\n\r\n var imgW = this.img.width;\r\n var imgH = this.img.height;\r\n var imgRel = imgW / imgH;\r\n var canvasRel = this.assetData.w/this.assetData.h;\r\n var widthCrop, heightCrop;\r\n var par = this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio;\r\n if((imgRel > canvasRel && par === 'xMidYMid slice') || (imgRel < canvasRel && par !== 'xMidYMid slice')) {\r\n heightCrop = imgH;\r\n widthCrop = heightCrop*canvasRel;\r\n } else {\r\n widthCrop = imgW;\r\n heightCrop = widthCrop/canvasRel;\r\n }\r\n ctx.drawImage(this.img,(imgW-widthCrop)/2,(imgH-heightCrop)/2,widthCrop,heightCrop,0,0,this.assetData.w,this.assetData.h);\r\n this.img = canvas;\r\n }\r\n\r\n};\r\n\r\nCVImageElement.prototype.renderInnerContent = function(parentMatrix){\r\n this.canvasContext.drawImage(this.img, 0, 0);\r\n};\r\n\r\nCVImageElement.prototype.destroy = function(){\r\n this.img = null;\r\n};\r\nfunction CVCompElement(data, globalData, comp) {\r\n this.completeLayers = false;\r\n this.layers = data.layers;\r\n this.pendingElements = [];\r\n this.elements = createSizedArray(this.layers.length);\r\n this.initElement(data, globalData, comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate, this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([CanvasRenderer, ICompElement, CVBaseElement], CVCompElement);\r\n\r\nCVCompElement.prototype.renderInnerContent = function() {\r\n var ctx = this.canvasContext;\r\n ctx.beginPath();\r\n ctx.moveTo(0, 0);\r\n ctx.lineTo(this.data.w, 0);\r\n ctx.lineTo(this.data.w, this.data.h);\r\n ctx.lineTo(0, this.data.h);\r\n ctx.lineTo(0, 0);\r\n ctx.clip();\r\n var i,len = this.layers.length;\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.completeLayers || this.elements[i]){\r\n this.elements[i].renderFrame();\r\n }\r\n }\r\n};\r\n\r\nCVCompElement.prototype.destroy = function(){\r\n var i,len = this.layers.length;\r\n for( i = len - 1; i >= 0; i -= 1 ){\r\n if(this.elements[i]) {\r\n this.elements[i].destroy();\r\n }\r\n }\r\n this.layers = null;\r\n this.elements = null;\r\n};\r\n\r\nfunction CVMaskElement(data,element){\r\n this.data = data;\r\n this.element = element;\r\n this.masksProperties = this.data.masksProperties || [];\r\n this.viewData = createSizedArray(this.masksProperties.length);\r\n var i, len = this.masksProperties.length, hasMasks = false;\r\n for (i = 0; i < len; i++) {\r\n if(this.masksProperties[i].mode !== 'n'){\r\n hasMasks = true;\r\n }\r\n this.viewData[i] = ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[i],3);\r\n }\r\n this.hasMasks = hasMasks;\r\n if(hasMasks) {\r\n this.element.addRenderableComponent(this);\r\n }\r\n}\r\n\r\nCVMaskElement.prototype.renderFrame = function () {\r\n if(!this.hasMasks){\r\n return;\r\n }\r\n var transform = this.element.finalTransform.mat;\r\n var ctx = this.element.canvasContext;\r\n var i, len = this.masksProperties.length;\r\n var pt,pts,data;\r\n ctx.beginPath();\r\n for (i = 0; i < len; i++) {\r\n if(this.masksProperties[i].mode !== 'n'){\r\n if (this.masksProperties[i].inv) {\r\n ctx.moveTo(0, 0);\r\n ctx.lineTo(this.element.globalData.compSize.w, 0);\r\n ctx.lineTo(this.element.globalData.compSize.w, this.element.globalData.compSize.h);\r\n ctx.lineTo(0, this.element.globalData.compSize.h);\r\n ctx.lineTo(0, 0);\r\n }\r\n data = this.viewData[i].v;\r\n pt = transform.applyToPointArray(data.v[0][0],data.v[0][1],0);\r\n ctx.moveTo(pt[0], pt[1]);\r\n var j, jLen = data._length;\r\n for (j = 1; j < jLen; j++) {\r\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[j], data.v[j]);\r\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\r\n }\r\n pts = transform.applyToTriplePoints(data.o[j - 1], data.i[0], data.v[0]);\r\n ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\r\n }\r\n }\r\n this.element.globalData.renderer.save(true);\r\n ctx.clip();\r\n};\r\n\r\nCVMaskElement.prototype.getMaskProperty = MaskElement.prototype.getMaskProperty;\r\n\r\nCVMaskElement.prototype.destroy = function(){\r\n this.element = null;\r\n};\r\nfunction CVShapeElement(data, globalData, comp) {\r\n this.shapes = [];\r\n this.shapesData = data.shapes;\r\n this.stylesList = [];\r\n this.itemsData = [];\r\n this.prevViewData = [];\r\n this.shapeModifiers = [];\r\n this.processedElements = [];\r\n this.transformsManager = new ShapeTransformManager();\r\n this.initElement(data, globalData, comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,CVBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableElement], CVShapeElement);\r\n\r\nCVShapeElement.prototype.initElement = RenderableDOMElement.prototype.initElement;\r\n\r\nCVShapeElement.prototype.transformHelper = {opacity:1,_opMdf:false};\r\n\r\nCVShapeElement.prototype.dashResetter = [];\r\n\r\nCVShapeElement.prototype.createContent = function(){\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData, true, []);\r\n};\r\n\r\nCVShapeElement.prototype.createStyleElement = function(data, transforms) {\r\n var styleElem = {\r\n data: data,\r\n type: data.ty,\r\n preTransforms: this.transformsManager.addTransformSequence(transforms),\r\n transforms: [],\r\n elements: [],\r\n closed: data.hd === true\r\n };\r\n var elementData = {};\r\n if(data.ty == 'fl' || data.ty == 'st'){\r\n elementData.c = PropertyFactory.getProp(this,data.c,1,255,this);\r\n if(!elementData.c.k){\r\n styleElem.co = 'rgb('+bm_floor(elementData.c.v[0])+','+bm_floor(elementData.c.v[1])+','+bm_floor(elementData.c.v[2])+')';\r\n }\r\n } else if (data.ty === 'gf' || data.ty === 'gs') {\r\n elementData.s = PropertyFactory.getProp(this,data.s,1,null,this);\r\n elementData.e = PropertyFactory.getProp(this,data.e,1,null,this);\r\n elementData.h = PropertyFactory.getProp(this,data.h||{k:0},0,0.01,this);\r\n elementData.a = PropertyFactory.getProp(this,data.a||{k:0},0,degToRads,this);\r\n elementData.g = new GradientProperty(this,data.g,this);\r\n }\r\n elementData.o = PropertyFactory.getProp(this,data.o,0,0.01,this);\r\n if(data.ty == 'st' || data.ty == 'gs') {\r\n styleElem.lc = this.lcEnum[data.lc] || 'round';\r\n styleElem.lj = this.ljEnum[data.lj] || 'round';\r\n if(data.lj == 1) {\r\n styleElem.ml = data.ml;\r\n }\r\n elementData.w = PropertyFactory.getProp(this,data.w,0,null,this);\r\n if(!elementData.w.k){\r\n styleElem.wi = elementData.w.v;\r\n }\r\n if(data.d){\r\n var d = new DashProperty(this,data.d,'canvas', this);\r\n elementData.d = d;\r\n if(!elementData.d.k){\r\n styleElem.da = elementData.d.dashArray;\r\n styleElem.do = elementData.d.dashoffset[0];\r\n }\r\n }\r\n } else {\r\n styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero';\r\n }\r\n this.stylesList.push(styleElem);\r\n elementData.style = styleElem;\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createGroupElement = function(data) {\r\n var elementData = {\r\n it: [],\r\n prevViewData: []\r\n };\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createTransformElement = function(data) {\r\n var elementData = {\r\n transform : {\r\n opacity: 1,\r\n _opMdf:false,\r\n key: this.transformsManager.getNewKey(),\r\n op: PropertyFactory.getProp(this,data.o,0,0.01,this),\r\n mProps: TransformPropertyFactory.getTransformProperty(this,data,this)\r\n }\r\n };\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.createShapeElement = function(data) {\r\n var elementData = new CVShapeData(this, data, this.stylesList, this.transformsManager);\r\n \r\n this.shapes.push(elementData);\r\n this.addShapeToModifiers(elementData);\r\n return elementData;\r\n};\r\n\r\nCVShapeElement.prototype.reloadShapes = function() {\r\n this._isFirstFrame = true;\r\n var i, len = this.itemsData.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.prevViewData[i] = this.itemsData[i];\r\n }\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData, true, []);\r\n len = this.dynamicProperties.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.dynamicProperties[i].getValue();\r\n }\r\n this.renderModifiers();\r\n this.transformsManager.processSequences(this._isFirstFrame);\r\n};\r\n\r\nCVShapeElement.prototype.addTransformToStyleList = function(transform) {\r\n var i, len = this.stylesList.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!this.stylesList[i].closed) {\r\n this.stylesList[i].transforms.push(transform);\r\n }\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.removeTransformFromStyleList = function() {\r\n var i, len = this.stylesList.length;\r\n for (i = 0; i < len; i += 1) {\r\n if(!this.stylesList[i].closed) {\r\n this.stylesList[i].transforms.pop();\r\n }\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.closeStyles = function(styles) {\r\n var i, len = styles.length, j, jLen;\r\n for (i = 0; i < len; i += 1) {\r\n styles[i].closed = true;\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.searchShapes = function(arr,itemsData, prevViewData, shouldRender, transforms){\r\n var i, len = arr.length - 1;\r\n var j, jLen;\r\n var ownStyles = [], ownModifiers = [], processedPos, modifier, currentTransform;\r\n var ownTransforms = [].concat(transforms);\r\n for(i=len;i>=0;i-=1){\r\n processedPos = this.searchProcessedElement(arr[i]);\r\n if(!processedPos){\r\n arr[i]._shouldRender = shouldRender;\r\n } else {\r\n itemsData[i] = prevViewData[processedPos - 1];\r\n }\r\n if(arr[i].ty == 'fl' || arr[i].ty == 'st'|| arr[i].ty == 'gf'|| arr[i].ty == 'gs'){\r\n if(!processedPos){\r\n itemsData[i] = this.createStyleElement(arr[i], ownTransforms);\r\n } else {\r\n itemsData[i].style.closed = false;\r\n }\r\n \r\n ownStyles.push(itemsData[i].style);\r\n }else if(arr[i].ty == 'gr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createGroupElement(arr[i]);\r\n } else {\r\n jLen = itemsData[i].it.length;\r\n for(j=0;j<jLen;j+=1){\r\n itemsData[i].prevViewData[j] = itemsData[i].it[j];\r\n }\r\n }\r\n this.searchShapes(arr[i].it,itemsData[i].it,itemsData[i].prevViewData, shouldRender, ownTransforms);\r\n }else if(arr[i].ty == 'tr'){\r\n if(!processedPos){\r\n currentTransform = this.createTransformElement(arr[i]);\r\n itemsData[i] = currentTransform;\r\n }\r\n ownTransforms.push(itemsData[i]);\r\n this.addTransformToStyleList(itemsData[i]);\r\n }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){\r\n if(!processedPos){\r\n itemsData[i] = this.createShapeElement(arr[i]);\r\n }\r\n \r\n }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n modifier.init(this,arr[i]);\r\n itemsData[i] = modifier;\r\n this.shapeModifiers.push(modifier);\r\n } else {\r\n modifier = itemsData[i];\r\n modifier.closed = false;\r\n }\r\n ownModifiers.push(modifier);\r\n } else if(arr[i].ty == 'rp'){\r\n if(!processedPos){\r\n modifier = ShapeModifiers.getModifier(arr[i].ty);\r\n itemsData[i] = modifier;\r\n modifier.init(this,arr,i,itemsData);\r\n this.shapeModifiers.push(modifier);\r\n shouldRender = false;\r\n }else{\r\n modifier = itemsData[i];\r\n modifier.closed = true;\r\n }\r\n ownModifiers.push(modifier);\r\n }\r\n this.addProcessedElement(arr[i], i + 1);\r\n }\r\n this.removeTransformFromStyleList();\r\n this.closeStyles(ownStyles);\r\n len = ownModifiers.length;\r\n for(i=0;i<len;i+=1){\r\n ownModifiers[i].closed = true;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderInnerContent = function() {\r\n this.transformHelper.opacity = 1;\r\n this.transformHelper._opMdf = false;\r\n this.renderModifiers();\r\n this.transformsManager.processSequences(this._isFirstFrame);\r\n this.renderShape(this.transformHelper,this.shapesData,this.itemsData,true);\r\n};\r\n\r\nCVShapeElement.prototype.renderShapeTransform = function(parentTransform, groupTransform) {\r\n var props, groupMatrix;\r\n if(parentTransform._opMdf || groupTransform.op._mdf || this._isFirstFrame) {\r\n groupTransform.opacity = parentTransform.opacity;\r\n groupTransform.opacity *= groupTransform.op.v;\r\n groupTransform._opMdf = true;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.drawLayer = function() {\r\n var i, len = this.stylesList.length;\r\n var j, jLen, k, kLen,elems,nodes, renderer = this.globalData.renderer, ctx = this.globalData.canvasContext, type, currentStyle;\r\n for(i=0;i<len;i+=1){\r\n currentStyle = this.stylesList[i];\r\n type = currentStyle.type;\r\n\r\n //Skipping style when\r\n //Stroke width equals 0\r\n //style should not be rendered (extra unused repeaters)\r\n //current opacity equals 0\r\n //global opacity equals 0\r\n if(((type === 'st' || type === 'gs') && currentStyle.wi === 0) || !currentStyle.data._shouldRender || currentStyle.coOp === 0 || this.globalData.currentGlobalAlpha === 0){\r\n continue;\r\n }\r\n renderer.save();\r\n elems = currentStyle.elements;\r\n if(type === 'st' || type === 'gs'){\r\n ctx.strokeStyle = type === 'st' ? currentStyle.co : currentStyle.grd;\r\n ctx.lineWidth = currentStyle.wi;\r\n ctx.lineCap = currentStyle.lc;\r\n ctx.lineJoin = currentStyle.lj;\r\n ctx.miterLimit = currentStyle.ml || 0;\r\n } else {\r\n ctx.fillStyle = type === 'fl' ? currentStyle.co : currentStyle.grd;\r\n }\r\n renderer.ctxOpacity(currentStyle.coOp);\r\n if(type !== 'st' && type !== 'gs'){\r\n ctx.beginPath();\r\n }\r\n renderer.ctxTransform(currentStyle.preTransforms.finalTransform.props);\r\n jLen = elems.length;\r\n for(j=0;j<jLen;j+=1){\r\n if(type === 'st' || type === 'gs'){\r\n ctx.beginPath();\r\n if(currentStyle.da){\r\n ctx.setLineDash(currentStyle.da);\r\n ctx.lineDashOffset = currentStyle.do;\r\n }\r\n }\r\n nodes = elems[j].trNodes;\r\n kLen = nodes.length;\r\n\r\n for(k=0;k<kLen;k+=1){\r\n if(nodes[k].t == 'm'){\r\n ctx.moveTo(nodes[k].p[0],nodes[k].p[1]);\r\n }else if(nodes[k].t == 'c'){\r\n ctx.bezierCurveTo(nodes[k].pts[0],nodes[k].pts[1],nodes[k].pts[2],nodes[k].pts[3],nodes[k].pts[4],nodes[k].pts[5]);\r\n }else{\r\n ctx.closePath();\r\n }\r\n }\r\n if(type === 'st' || type === 'gs'){\r\n ctx.stroke();\r\n if(currentStyle.da){\r\n ctx.setLineDash(this.dashResetter);\r\n }\r\n }\r\n }\r\n if(type !== 'st' && type !== 'gs'){\r\n ctx.fill(currentStyle.r);\r\n }\r\n renderer.restore();\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderShape = function(parentTransform,items,data,isMain){\r\n var i, len = items.length - 1;\r\n var groupTransform;\r\n groupTransform = parentTransform;\r\n for(i=len;i>=0;i-=1){\r\n if(items[i].ty == 'tr'){\r\n groupTransform = data[i].transform;\r\n this.renderShapeTransform(parentTransform, groupTransform);\r\n }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){\r\n this.renderPath(items[i],data[i]);\r\n }else if(items[i].ty == 'fl'){\r\n this.renderFill(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'st'){\r\n this.renderStroke(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'gf' || items[i].ty == 'gs'){\r\n this.renderGradientFill(items[i],data[i],groupTransform);\r\n }else if(items[i].ty == 'gr'){\r\n this.renderShape(groupTransform,items[i].it,data[i].it);\r\n }else if(items[i].ty == 'tm'){\r\n //\r\n }\r\n }\r\n if(isMain){\r\n this.drawLayer();\r\n }\r\n \r\n};\r\n\r\nCVShapeElement.prototype.renderStyledShape = function(styledShape, shape){\r\n if(this._isFirstFrame || shape._mdf || styledShape.transforms._mdf) {\r\n var shapeNodes = styledShape.trNodes;\r\n var paths = shape.paths;\r\n var i, len, j, jLen = paths._length;\r\n shapeNodes.length = 0;\r\n var groupTransformMat = styledShape.transforms.finalTransform;\r\n for (j = 0; j < jLen; j += 1) {\r\n var pathNodes = paths.shapes[j];\r\n if(pathNodes && pathNodes.v){\r\n len = pathNodes._length;\r\n for (i = 1; i < len; i += 1) {\r\n if (i === 1) {\r\n shapeNodes.push({\r\n t: 'm',\r\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\r\n });\r\n }\r\n shapeNodes.push({\r\n t: 'c',\r\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[i], pathNodes.v[i])\r\n });\r\n }\r\n if (len === 1) {\r\n shapeNodes.push({\r\n t: 'm',\r\n p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0)\r\n });\r\n }\r\n if (pathNodes.c && len) {\r\n shapeNodes.push({\r\n t: 'c',\r\n pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[0], pathNodes.v[0])\r\n });\r\n shapeNodes.push({\r\n t: 'z'\r\n });\r\n }\r\n }\r\n }\r\n styledShape.trNodes = shapeNodes;\r\n }\r\n}\r\n\r\nCVShapeElement.prototype.renderPath = function(pathData,itemData){\r\n if(pathData.hd !== true && pathData._shouldRender) {\r\n var i, len = itemData.styledShapes.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.renderStyledShape(itemData.styledShapes[i], itemData.sh);\r\n }\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderFill = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n\r\n if (itemData.c._mdf || this._isFirstFrame) {\r\n styleElem.co = 'rgb(' \r\n + bm_floor(itemData.c.v[0]) + ',' \r\n + bm_floor(itemData.c.v[1]) + ',' \r\n + bm_floor(itemData.c.v[2]) + ')';\r\n }\r\n if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) {\r\n styleElem.coOp = itemData.o.v * groupTransform.opacity;\r\n }\r\n};\r\n\r\nCVShapeElement.prototype.renderGradientFill = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n if(!styleElem.grd || itemData.g._mdf || itemData.s._mdf || itemData.e._mdf || (styleData.t !== 1 && (itemData.h._mdf || itemData.a._mdf))) {\r\n var ctx = this.globalData.canvasContext;\r\n var grd;\r\n var pt1 = itemData.s.v, pt2 = itemData.e.v;\r\n if (styleData.t === 1) {\r\n grd = ctx.createLinearGradient(pt1[0], pt1[1], pt2[0], pt2[1]);\r\n } else {\r\n var rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2));\r\n var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]);\r\n\r\n var percent = itemData.h.v >= 1 ? 0.99 : itemData.h.v <= -1 ? -0.99: itemData.h.v;\r\n var dist = rad * percent;\r\n var x = Math.cos(ang + itemData.a.v) * dist + pt1[0];\r\n var y = Math.sin(ang + itemData.a.v) * dist + pt1[1];\r\n var grd = ctx.createRadialGradient(x, y, 0, pt1[0], pt1[1], rad);\r\n }\r\n\r\n var i, len = styleData.g.p;\r\n var cValues = itemData.g.c;\r\n var opacity = 1;\r\n\r\n for (i = 0; i < len; i += 1){\r\n if(itemData.g._hasOpacity && itemData.g._collapsable) {\r\n opacity = itemData.g.o[i*2 + 1];\r\n }\r\n grd.addColorStop(cValues[i * 4] / 100,'rgba('+ cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ','+cValues[i * 4 + 3] + ',' + opacity + ')');\r\n }\r\n styleElem.grd = grd;\r\n }\r\n styleElem.coOp = itemData.o.v*groupTransform.opacity;\r\n \r\n};\r\n\r\nCVShapeElement.prototype.renderStroke = function(styleData,itemData, groupTransform){\r\n var styleElem = itemData.style;\r\n var d = itemData.d;\r\n if(d && (d._mdf || this._isFirstFrame)){\r\n styleElem.da = d.dashArray;\r\n styleElem.do = d.dashoffset[0];\r\n }\r\n if(itemData.c._mdf || this._isFirstFrame){\r\n styleElem.co = 'rgb('+bm_floor(itemData.c.v[0])+','+bm_floor(itemData.c.v[1])+','+bm_floor(itemData.c.v[2])+')';\r\n }\r\n if(itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame){\r\n styleElem.coOp = itemData.o.v*groupTransform.opacity;\r\n }\r\n if(itemData.w._mdf || this._isFirstFrame){\r\n styleElem.wi = itemData.w.v;\r\n }\r\n};\r\n\r\n\r\nCVShapeElement.prototype.destroy = function(){\r\n this.shapesData = null;\r\n this.globalData = null;\r\n this.canvasContext = null;\r\n this.stylesList.length = 0;\r\n this.itemsData.length = 0;\r\n};\r\n\r\n\r\nfunction CVSolidElement(data, globalData, comp) {\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVSolidElement);\r\n\r\nCVSolidElement.prototype.initElement = SVGShapeElement.prototype.initElement;\r\nCVSolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;\r\n\r\nCVSolidElement.prototype.renderInnerContent = function() {\r\n var ctx = this.canvasContext;\r\n ctx.fillStyle = this.data.sc;\r\n ctx.fillRect(0, 0, this.data.sw, this.data.sh);\r\n //\r\n};\r\nfunction CVTextElement(data, globalData, comp){\r\n this.textSpans = [];\r\n this.yOffset = 0;\r\n this.fillColorAnim = false;\r\n this.strokeColorAnim = false;\r\n this.strokeWidthAnim = false;\r\n this.stroke = false;\r\n this.fill = false;\r\n this.justifyOffset = 0;\r\n this.currentRender = null;\r\n this.renderType = 'canvas';\r\n this.values = {\r\n fill: 'rgba(0,0,0,0)',\r\n stroke: 'rgba(0,0,0,0)',\r\n sWidth: 0,\r\n fValue: ''\r\n };\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement,TransformElement,CVBaseElement,HierarchyElement,FrameElement,RenderableElement,ITextElement], CVTextElement);\r\n\r\nCVTextElement.prototype.tHelper = createTag('canvas').getContext('2d');\r\n\r\nCVTextElement.prototype.buildNewText = function(){\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\r\n\r\n var hasFill = false;\r\n if(documentData.fc) {\r\n hasFill = true;\r\n this.values.fill = this.buildColor(documentData.fc);\r\n }else{\r\n this.values.fill = 'rgba(0,0,0,0)';\r\n }\r\n this.fill = hasFill;\r\n var hasStroke = false;\r\n if(documentData.sc){\r\n hasStroke = true;\r\n this.values.stroke = this.buildColor(documentData.sc);\r\n this.values.sWidth = documentData.sw;\r\n }\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n var i, len;\r\n var letters = documentData.l;\r\n var matrixHelper = this.mHelper;\r\n this.stroke = hasStroke;\r\n this.values.fValue = documentData.finalSize + 'px '+ this.globalData.fontManager.getFontByName(documentData.f).fFamily;\r\n len = documentData.finalText.length;\r\n //this.tHelper.font = this.values.fValue;\r\n var charData, shapeData, k, kLen, shapes, j, jLen, pathNodes, commands, pathArr, singleShape = this.data.singleShape;\r\n var trackingOffset = documentData.tr/1000*documentData.finalSize;\r\n var xPos = 0, yPos = 0, firstLine = true;\r\n var cnt = 0;\r\n for (i = 0; i < len; i += 1) {\r\n charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n shapeData = charData && charData.data || {};\r\n matrixHelper.reset();\r\n if(singleShape && letters[i].n) {\r\n xPos = -trackingOffset;\r\n yPos += documentData.yOffset;\r\n yPos += firstLine ? 1 : 0;\r\n firstLine = false;\r\n }\r\n\r\n shapes = shapeData.shapes ? shapeData.shapes[0].it : [];\r\n jLen = shapes.length;\r\n matrixHelper.scale(documentData.finalSize/100,documentData.finalSize/100);\r\n if(singleShape){\r\n this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos);\r\n }\r\n commands = createSizedArray(jLen);\r\n for(j=0;j<jLen;j+=1){\r\n kLen = shapes[j].ks.k.i.length;\r\n pathNodes = shapes[j].ks.k;\r\n pathArr = [];\r\n for(k=1;k<kLen;k+=1){\r\n if(k==1){\r\n pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));\r\n }\r\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToY(pathNodes.i[k][0],pathNodes.i[k][1],0),matrixHelper.applyToX(pathNodes.v[k][0],pathNodes.v[k][1],0),matrixHelper.applyToY(pathNodes.v[k][0],pathNodes.v[k][1],0));\r\n }\r\n pathArr.push(matrixHelper.applyToX(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToY(pathNodes.o[k-1][0],pathNodes.o[k-1][1],0),matrixHelper.applyToX(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToY(pathNodes.i[0][0],pathNodes.i[0][1],0),matrixHelper.applyToX(pathNodes.v[0][0],pathNodes.v[0][1],0),matrixHelper.applyToY(pathNodes.v[0][0],pathNodes.v[0][1],0));\r\n commands[j] = pathArr;\r\n }\r\n if(singleShape){\r\n xPos += letters[i].l;\r\n xPos += trackingOffset;\r\n }\r\n if(this.textSpans[cnt]){\r\n this.textSpans[cnt].elem = commands;\r\n } else {\r\n this.textSpans[cnt] = {elem: commands};\r\n }\r\n cnt +=1;\r\n }\r\n};\r\n\r\nCVTextElement.prototype.renderInnerContent = function(){\r\n var ctx = this.canvasContext;\r\n var finalMat = this.finalTransform.mat.props;\r\n ctx.font = this.values.fValue;\r\n ctx.lineCap = 'butt';\r\n ctx.lineJoin = 'miter';\r\n ctx.miterLimit = 4;\r\n\r\n if(!this.data.singleShape){\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n }\r\n\r\n var i,len, j, jLen, k, kLen;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter;\r\n var lastFill = null, lastStroke = null, lastStrokeW = null, commands, pathArr;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n continue;\r\n }\r\n renderedLetter = renderedLetters[i];\r\n if(renderedLetter){\r\n this.globalData.renderer.save();\r\n this.globalData.renderer.ctxTransform(renderedLetter.p);\r\n this.globalData.renderer.ctxOpacity(renderedLetter.o);\r\n }\r\n if(this.fill){\r\n if(renderedLetter && renderedLetter.fc){\r\n if(lastFill !== renderedLetter.fc){\r\n lastFill = renderedLetter.fc;\r\n ctx.fillStyle = renderedLetter.fc;\r\n }\r\n }else if(lastFill !== this.values.fill){\r\n lastFill = this.values.fill;\r\n ctx.fillStyle = this.values.fill;\r\n }\r\n commands = this.textSpans[i].elem;\r\n jLen = commands.length;\r\n this.globalData.canvasContext.beginPath();\r\n for(j=0;j<jLen;j+=1) {\r\n pathArr = commands[j];\r\n kLen = pathArr.length;\r\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\r\n for (k = 2; k < kLen; k += 6) {\r\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\r\n }\r\n }\r\n this.globalData.canvasContext.closePath();\r\n this.globalData.canvasContext.fill();\r\n ///ctx.fillText(this.textSpans[i].val,0,0);\r\n }\r\n if(this.stroke){\r\n if(renderedLetter && renderedLetter.sw){\r\n if(lastStrokeW !== renderedLetter.sw){\r\n lastStrokeW = renderedLetter.sw;\r\n ctx.lineWidth = renderedLetter.sw;\r\n }\r\n }else if(lastStrokeW !== this.values.sWidth){\r\n lastStrokeW = this.values.sWidth;\r\n ctx.lineWidth = this.values.sWidth;\r\n }\r\n if(renderedLetter && renderedLetter.sc){\r\n if(lastStroke !== renderedLetter.sc){\r\n lastStroke = renderedLetter.sc;\r\n ctx.strokeStyle = renderedLetter.sc;\r\n }\r\n }else if(lastStroke !== this.values.stroke){\r\n lastStroke = this.values.stroke;\r\n ctx.strokeStyle = this.values.stroke;\r\n }\r\n commands = this.textSpans[i].elem;\r\n jLen = commands.length;\r\n this.globalData.canvasContext.beginPath();\r\n for(j=0;j<jLen;j+=1) {\r\n pathArr = commands[j];\r\n kLen = pathArr.length;\r\n this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]);\r\n for (k = 2; k < kLen; k += 6) {\r\n this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]);\r\n }\r\n }\r\n this.globalData.canvasContext.closePath();\r\n this.globalData.canvasContext.stroke();\r\n ///ctx.strokeText(letters[i].val,0,0);\r\n }\r\n if(renderedLetter) {\r\n this.globalData.renderer.restore();\r\n }\r\n }\r\n};\r\nfunction CVEffects() {\r\n\r\n}\r\nCVEffects.prototype.renderFrame = function(){};\r\nfunction HBaseElement(data,globalData,comp){}\r\nHBaseElement.prototype = {\r\n checkBlendMode: function(){},\r\n initRendererElement: function(){\r\n this.baseElement = createTag(this.data.tg || 'div');\r\n if(this.data.hasMask) {\r\n this.svgElement = createNS('svg');\r\n this.layerElement = createNS('g');\r\n this.maskedElement = this.layerElement;\r\n this.svgElement.appendChild(this.layerElement);\r\n this.baseElement.appendChild(this.svgElement);\r\n } else {\r\n this.layerElement = this.baseElement;\r\n }\r\n styleDiv(this.baseElement);\r\n },\r\n createContainerElements: function(){\r\n this.renderableEffectsManager = new CVEffects(this);\r\n this.transformedElement = this.baseElement;\r\n this.maskedElement = this.layerElement;\r\n if (this.data.ln) {\r\n this.layerElement.setAttribute('id',this.data.ln);\r\n }\r\n if (this.data.cl) {\r\n this.layerElement.setAttribute('class', this.data.cl);\r\n }\r\n if (this.data.bm !== 0) {\r\n this.setBlendMode();\r\n }\r\n },\r\n renderElement: function() {\r\n if(this.finalTransform._matMdf){\r\n this.transformedElement.style.transform = this.transformedElement.style.webkitTransform = this.finalTransform.mat.toCSS();\r\n }\r\n if(this.finalTransform._opMdf){\r\n this.transformedElement.style.opacity = this.finalTransform.mProp.o.v;\r\n }\r\n },\r\n renderFrame: function() {\r\n //If it is exported as hidden (data.hd === true) no need to render\r\n //If it is not visible no need to render\r\n if (this.data.hd || this.hidden) {\r\n return;\r\n }\r\n this.renderTransform();\r\n this.renderRenderable();\r\n this.renderElement();\r\n this.renderInnerContent();\r\n if (this._isFirstFrame) {\r\n this._isFirstFrame = false;\r\n }\r\n },\r\n destroy: function(){\r\n this.layerElement = null;\r\n this.transformedElement = null;\r\n if(this.matteElement) {\r\n this.matteElement = null;\r\n }\r\n if(this.maskManager) {\r\n this.maskManager.destroy();\r\n this.maskManager = null;\r\n }\r\n },\r\n createRenderableComponents: function(){\r\n this.maskManager = new MaskElement(this.data, this, this.globalData);\r\n },\r\n addEffects: function(){\r\n },\r\n setMatte: function(){}\r\n};\r\nHBaseElement.prototype.getBaseElement = SVGBaseElement.prototype.getBaseElement;\r\nHBaseElement.prototype.destroyBaseElement = HBaseElement.prototype.destroy;\r\nHBaseElement.prototype.buildElementParenting = HybridRenderer.prototype.buildElementParenting;\r\nfunction HSolidElement(data,globalData,comp){\r\n this.initElement(data,globalData,comp);\r\n}\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement], HSolidElement);\r\n\r\nHSolidElement.prototype.createContent = function(){\r\n var rect;\r\n if(this.data.hasMask){\r\n rect = createNS('rect');\r\n rect.setAttribute('width',this.data.sw);\r\n rect.setAttribute('height',this.data.sh);\r\n rect.setAttribute('fill',this.data.sc);\r\n this.svgElement.setAttribute('width',this.data.sw);\r\n this.svgElement.setAttribute('height',this.data.sh);\r\n } else {\r\n rect = createTag('div');\r\n rect.style.width = this.data.sw + 'px';\r\n rect.style.height = this.data.sh + 'px';\r\n rect.style.backgroundColor = this.data.sc;\r\n }\r\n this.layerElement.appendChild(rect);\r\n};\r\n\r\nfunction HCompElement(data,globalData,comp){\r\n this.layers = data.layers;\r\n this.supports3d = !data.hasMask;\r\n this.completeLayers = false;\r\n this.pendingElements = [];\r\n this.elements = this.layers ? createSizedArray(this.layers.length) : [];\r\n this.initElement(data,globalData,comp);\r\n this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate,this) : {_placeholder:true};\r\n}\r\n\r\nextendPrototype([HybridRenderer, ICompElement, HBaseElement], HCompElement);\r\nHCompElement.prototype._createBaseContainerElements = HCompElement.prototype.createContainerElements;\r\n\r\nHCompElement.prototype.createContainerElements = function(){\r\n this._createBaseContainerElements();\r\n //divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)';\r\n if(this.data.hasMask){\r\n this.svgElement.setAttribute('width',this.data.w);\r\n this.svgElement.setAttribute('height',this.data.h);\r\n this.transformedElement = this.baseElement;\r\n } else {\r\n this.transformedElement = this.layerElement;\r\n }\r\n};\r\n\r\nHCompElement.prototype.addTo3dContainer = function(elem,pos) {\r\n var j = 0;\r\n var nextElement;\r\n while(j<pos){\r\n if(this.elements[j] && this.elements[j].getBaseElement){\r\n nextElement = this.elements[j].getBaseElement();\r\n }\r\n j += 1;\r\n }\r\n if(nextElement){\r\n this.layerElement.insertBefore(elem, nextElement);\r\n } else {\r\n this.layerElement.appendChild(elem);\r\n }\r\n}\r\n\r\nfunction HShapeElement(data,globalData,comp){\r\n //List of drawable elements\r\n this.shapes = [];\r\n // Full shape data\r\n this.shapesData = data.shapes;\r\n //List of styles that will be applied to shapes\r\n this.stylesList = [];\r\n //List of modifiers that will be applied to shapes\r\n this.shapeModifiers = [];\r\n //List of items in shape tree\r\n this.itemsData = [];\r\n //List of items in previous shape tree\r\n this.processedElements = [];\r\n // List of animated components\r\n this.animatedContents = [];\r\n this.shapesContainer = createNS('g');\r\n this.initElement(data,globalData,comp);\r\n //Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties.\r\n // List of elements that have been created\r\n this.prevViewData = [];\r\n this.currentBBox = {\r\n x:999999,\r\n y: -999999,\r\n h: 0,\r\n w: 0\r\n };\r\n}\r\nextendPrototype([BaseElement,TransformElement,HSolidElement,SVGShapeElement,HBaseElement,HierarchyElement,FrameElement,RenderableElement], HShapeElement);\r\nHShapeElement.prototype._renderShapeFrame = HShapeElement.prototype.renderInnerContent;\r\n\r\nHShapeElement.prototype.createContent = function(){\r\n var cont;\r\n this.baseElement.style.fontSize = 0;\r\n if (this.data.hasMask) {\r\n this.layerElement.appendChild(this.shapesContainer);\r\n cont = this.svgElement;\r\n } else {\r\n cont = createNS('svg');\r\n var size = this.comp.data ? this.comp.data : this.globalData.compSize;\r\n cont.setAttribute('width',size.w);\r\n cont.setAttribute('height',size.h);\r\n cont.appendChild(this.shapesContainer);\r\n this.layerElement.appendChild(cont);\r\n }\r\n\r\n this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.shapesContainer,0, [], true);\r\n this.filterUniqueShapes();\r\n this.shapeCont = cont;\r\n};\r\n\r\nHShapeElement.prototype.getTransformedPoint = function(transformers, point) {\r\n var i, len = transformers.length;\r\n for(i = 0; i < len; i += 1) {\r\n point = transformers[i].mProps.v.applyToPointArray(point[0], point[1], 0);\r\n }\r\n return point;\r\n}\r\n\r\nHShapeElement.prototype.calculateShapeBoundingBox = function(item, boundingBox) {\r\n var shape = item.sh.v;\r\n var transformers = item.transformers;\r\n var i, len = shape._length, vPoint, oPoint, nextIPoint, nextVPoint, bounds;\r\n if (len <= 1) {\r\n return;\r\n }\r\n for (i = 0; i < len - 1; i += 1) {\r\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\r\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\r\n nextIPoint = this.getTransformedPoint(transformers, shape.i[i + 1]);\r\n nextVPoint = this.getTransformedPoint(transformers, shape.v[i + 1]);\r\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\r\n }\r\n if(shape.c) {\r\n vPoint = this.getTransformedPoint(transformers, shape.v[i]);\r\n oPoint = this.getTransformedPoint(transformers, shape.o[i]);\r\n nextIPoint = this.getTransformedPoint(transformers, shape.i[0]);\r\n nextVPoint = this.getTransformedPoint(transformers, shape.v[0]);\r\n this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox);\r\n }\r\n}\r\n\r\nHShapeElement.prototype.checkBounds = function(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox) {\r\n this.getBoundsOfCurve(vPoint, oPoint, nextIPoint, nextVPoint);\r\n var bounds = this.shapeBoundingBox;\r\n boundingBox.x = bm_min(bounds.left, boundingBox.x);\r\n boundingBox.xMax = bm_max(bounds.right, boundingBox.xMax);\r\n boundingBox.y = bm_min(bounds.top, boundingBox.y);\r\n boundingBox.yMax = bm_max(bounds.bottom, boundingBox.yMax);\r\n}\r\n\r\nHShapeElement.prototype.shapeBoundingBox = {\r\n left:0,\r\n right:0,\r\n top:0,\r\n bottom:0,\r\n}\r\n\r\nHShapeElement.prototype.tempBoundingBox = {\r\n x:0,\r\n xMax:0,\r\n y:0,\r\n yMax:0,\r\n width:0,\r\n height:0\r\n}\r\n\r\nHShapeElement.prototype.getBoundsOfCurve = function(p0, p1, p2, p3) {\r\n\r\n var bounds = [[p0[0],p3[0]], [p0[1],p3[1]]];\r\n\r\n for (var a, b, c, t, b2ac, t1, t2, i = 0; i < 2; ++i) {\r\n\r\n b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\r\n a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\r\n c = 3 * p1[i] - 3 * p0[i];\r\n\r\n b = b | 0;\r\n a = a | 0;\r\n c = c | 0;\r\n\r\n if (a === 0) {\r\n\r\n if (b === 0) {\r\n continue;\r\n }\r\n\r\n t = -c / b;\r\n\r\n if (0 < t && t < 1) {\r\n bounds[i].push(this.calculateF(t,p0,p1,p2,p3,i));\r\n }\r\n continue;\r\n }\r\n\r\n b2ac = b * b - 4 * c * a;\r\n\r\n if (b2ac < 0) {\r\n continue;\r\n }\r\n\r\n t1 = (-b + bm_sqrt(b2ac))/(2 * a);\r\n if (0 < t1 && t1 < 1) bounds[i].push(this.calculateF(t1,p0,p1,p2,p3,i));\r\n\r\n t2 = (-b - bm_sqrt(b2ac))/(2 * a);\r\n if (0 < t2 && t2 < 1) bounds[i].push(this.calculateF(t2,p0,p1,p2,p3,i));\r\n\r\n }\r\n\r\n this.shapeBoundingBox.left = bm_min.apply(null, bounds[0]);\r\n this.shapeBoundingBox.top = bm_min.apply(null, bounds[1]);\r\n this.shapeBoundingBox.right = bm_max.apply(null, bounds[0]);\r\n this.shapeBoundingBox.bottom = bm_max.apply(null, bounds[1]);\r\n };\r\n\r\n HShapeElement.prototype.calculateF = function(t, p0, p1, p2, p3, i) {\r\n return bm_pow(1-t, 3) * p0[i]\r\n + 3 * bm_pow(1-t, 2) * t * p1[i]\r\n + 3 * (1-t) * bm_pow(t, 2) * p2[i]\r\n + bm_pow(t, 3) * p3[i];\r\n }\r\n\r\nHShapeElement.prototype.calculateBoundingBox = function(itemsData, boundingBox) {\r\n var i, len = itemsData.length, path;\r\n for(i = 0; i < len; i += 1) {\r\n if(itemsData[i] && itemsData[i].sh) {\r\n this.calculateShapeBoundingBox(itemsData[i], boundingBox)\r\n } else if(itemsData[i] && itemsData[i].it) {\r\n this.calculateBoundingBox(itemsData[i].it, boundingBox)\r\n }\r\n }\r\n}\r\n\r\nHShapeElement.prototype.currentBoxContains = function(box) {\r\n return this.currentBBox.x <= box.x \r\n && this.currentBBox.y <= box.y \r\n && this.currentBBox.width + this.currentBBox.x >= box.x + box.width\r\n && this.currentBBox.height + this.currentBBox.y >= box.y + box.height\r\n}\r\n\r\nHShapeElement.prototype.renderInnerContent = function() {\r\n this._renderShapeFrame();\r\n\r\n if(!this.hidden && (this._isFirstFrame || this._mdf)) {\r\n var tempBoundingBox = this.tempBoundingBox;\r\n var max = 999999;\r\n tempBoundingBox.x = max;\r\n tempBoundingBox.xMax = -max;\r\n tempBoundingBox.y = max;\r\n tempBoundingBox.yMax = -max;\r\n this.calculateBoundingBox(this.itemsData, tempBoundingBox);\r\n tempBoundingBox.width = tempBoundingBox.xMax < tempBoundingBox.x ? 0 : tempBoundingBox.xMax - tempBoundingBox.x;\r\n tempBoundingBox.height = tempBoundingBox.yMax < tempBoundingBox.y ? 0 : tempBoundingBox.yMax - tempBoundingBox.y;\r\n //var tempBoundingBox = this.shapeCont.getBBox();\r\n if(this.currentBoxContains(tempBoundingBox)) {\r\n return;\r\n }\r\n var changed = false;\r\n if(this.currentBBox.w !== tempBoundingBox.width){\r\n this.currentBBox.w = tempBoundingBox.width;\r\n this.shapeCont.setAttribute('width',tempBoundingBox.width);\r\n changed = true;\r\n }\r\n if(this.currentBBox.h !== tempBoundingBox.height){\r\n this.currentBBox.h = tempBoundingBox.height;\r\n this.shapeCont.setAttribute('height',tempBoundingBox.height);\r\n changed = true;\r\n }\r\n if(changed || this.currentBBox.x !== tempBoundingBox.x || this.currentBBox.y !== tempBoundingBox.y){\r\n this.currentBBox.w = tempBoundingBox.width;\r\n this.currentBBox.h = tempBoundingBox.height;\r\n this.currentBBox.x = tempBoundingBox.x;\r\n this.currentBBox.y = tempBoundingBox.y;\r\n\r\n this.shapeCont.setAttribute('viewBox',this.currentBBox.x+' '+this.currentBBox.y+' '+this.currentBBox.w+' '+this.currentBBox.h);\r\n this.shapeCont.style.transform = this.shapeCont.style.webkitTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\r\n }\r\n }\r\n\r\n};\r\nfunction HTextElement(data,globalData,comp){\r\n this.textSpans = [];\r\n this.textPaths = [];\r\n this.currentBBox = {\r\n x:999999,\r\n y: -999999,\r\n h: 0,\r\n w: 0\r\n };\r\n this.renderType = 'svg';\r\n this.isMasked = false;\r\n this.initElement(data,globalData,comp);\r\n\r\n}\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement], HTextElement);\r\n\r\nHTextElement.prototype.createContent = function(){\r\n this.isMasked = this.checkMasks();\r\n if(this.isMasked){\r\n this.renderType = 'svg';\r\n this.compW = this.comp.data.w;\r\n this.compH = this.comp.data.h;\r\n this.svgElement.setAttribute('width',this.compW);\r\n this.svgElement.setAttribute('height',this.compH);\r\n var g = createNS('g');\r\n this.maskedElement.appendChild(g);\r\n this.innerElem = g;\r\n } else {\r\n this.renderType = 'html';\r\n this.innerElem = this.layerElement;\r\n }\r\n\r\n this.checkParenting();\r\n\r\n};\r\n\r\nHTextElement.prototype.buildNewText = function(){\r\n var documentData = this.textProperty.currentData;\r\n this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0);\r\n var innerElemStyle = this.innerElem.style;\r\n innerElemStyle.color = innerElemStyle.fill = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)';\r\n if(documentData.sc){\r\n innerElemStyle.stroke = this.buildColor(documentData.sc);\r\n innerElemStyle.strokeWidth = documentData.sw+'px';\r\n }\r\n var fontData = this.globalData.fontManager.getFontByName(documentData.f);\r\n if(!this.globalData.fontManager.chars){\r\n innerElemStyle.fontSize = documentData.finalSize+'px';\r\n innerElemStyle.lineHeight = documentData.finalSize+'px';\r\n if(fontData.fClass){\r\n this.innerElem.className = fontData.fClass;\r\n } else {\r\n innerElemStyle.fontFamily = fontData.fFamily;\r\n var fWeight = documentData.fWeight, fStyle = documentData.fStyle;\r\n innerElemStyle.fontStyle = fStyle;\r\n innerElemStyle.fontWeight = fWeight;\r\n }\r\n }\r\n var i, len;\r\n\r\n var letters = documentData.l;\r\n len = letters.length;\r\n var tSpan,tParent,tCont;\r\n var matrixHelper = this.mHelper;\r\n var shapes, shapeStr = '';\r\n var cnt = 0;\r\n for (i = 0;i < len ;i += 1) {\r\n if(this.globalData.fontManager.chars){\r\n if(!this.textPaths[cnt]){\r\n tSpan = createNS('path');\r\n tSpan.setAttribute('stroke-linecap', 'butt');\r\n tSpan.setAttribute('stroke-linejoin','round');\r\n tSpan.setAttribute('stroke-miterlimit','4');\r\n } else {\r\n tSpan = this.textPaths[cnt];\r\n }\r\n if(!this.isMasked){\r\n if(this.textSpans[cnt]){\r\n tParent = this.textSpans[cnt];\r\n tCont = tParent.children[0];\r\n } else {\r\n\r\n tParent = createTag('div');\r\n tParent.style.lineHeight = 0;\r\n tCont = createNS('svg');\r\n tCont.appendChild(tSpan);\r\n styleDiv(tParent);\r\n }\r\n }\r\n }else{\r\n if(!this.isMasked){\r\n if(this.textSpans[cnt]){\r\n tParent = this.textSpans[cnt];\r\n tSpan = this.textPaths[cnt];\r\n } else {\r\n tParent = createTag('span');\r\n styleDiv(tParent);\r\n tSpan = createTag('span');\r\n styleDiv(tSpan);\r\n tParent.appendChild(tSpan);\r\n }\r\n } else {\r\n tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text');\r\n }\r\n }\r\n //tSpan.setAttribute('visibility', 'hidden');\r\n if(this.globalData.fontManager.chars){\r\n var charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily);\r\n var shapeData;\r\n if(charData){\r\n shapeData = charData.data;\r\n } else {\r\n shapeData = null;\r\n }\r\n matrixHelper.reset();\r\n if(shapeData && shapeData.shapes){\r\n shapes = shapeData.shapes[0].it;\r\n matrixHelper.scale(documentData.finalSize/100,documentData.finalSize/100);\r\n shapeStr = this.createPathShape(matrixHelper,shapes);\r\n tSpan.setAttribute('d',shapeStr);\r\n }\r\n if(!this.isMasked){\r\n this.innerElem.appendChild(tParent);\r\n if(shapeData && shapeData.shapes){\r\n\r\n //document.body.appendChild is needed to get exact measure of shape\r\n document.body.appendChild(tCont);\r\n var boundingBox = tCont.getBBox();\r\n tCont.setAttribute('width',boundingBox.width + 2);\r\n tCont.setAttribute('height',boundingBox.height + 2);\r\n tCont.setAttribute('viewBox',(boundingBox.x-1)+' '+ (boundingBox.y-1)+' '+ (boundingBox.width+2)+' '+ (boundingBox.height+2));\r\n tCont.style.transform = tCont.style.webkitTransform = 'translate(' + (boundingBox.x-1) + 'px,' + (boundingBox.y-1) + 'px)';\r\n\r\n letters[i].yOffset = boundingBox.y-1;\r\n\r\n } else{\r\n tCont.setAttribute('width',1);\r\n tCont.setAttribute('height',1);\r\n }\r\n tParent.appendChild(tCont);\r\n }else{\r\n this.innerElem.appendChild(tSpan);\r\n }\r\n }else{\r\n tSpan.textContent = letters[i].val;\r\n tSpan.setAttributeNS(\"http://www.w3.org/XML/1998/namespace\", \"xml:space\",\"preserve\");\r\n if(!this.isMasked){\r\n this.innerElem.appendChild(tParent);\r\n //\r\n tSpan.style.transform = tSpan.style.webkitTransform = 'translate3d(0,'+ -documentData.finalSize/1.2+'px,0)';\r\n } else {\r\n this.innerElem.appendChild(tSpan);\r\n }\r\n }\r\n //\r\n if(!this.isMasked){\r\n this.textSpans[cnt] = tParent;\r\n }else{\r\n this.textSpans[cnt] = tSpan;\r\n }\r\n this.textSpans[cnt].style.display = 'block';\r\n this.textPaths[cnt] = tSpan;\r\n cnt += 1;\r\n }\r\n while(cnt < this.textSpans.length){\r\n this.textSpans[cnt].style.display = 'none';\r\n cnt += 1;\r\n }\r\n};\r\n\r\nHTextElement.prototype.renderInnerContent = function() {\r\n\r\n if(this.data.singleShape){\r\n if(!this._isFirstFrame && !this.lettersChangedFlag){\r\n return;\r\n } else {\r\n // Todo Benchmark if using this is better than getBBox\r\n if(this.isMasked && this.finalTransform._matMdf){\r\n this.svgElement.setAttribute('viewBox',-this.finalTransform.mProp.p.v[0]+' '+ -this.finalTransform.mProp.p.v[1]+' '+this.compW+' '+this.compH);\r\n this.svgElement.style.transform = this.svgElement.style.webkitTransform = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)';\r\n }\r\n }\r\n }\r\n\r\n this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag);\r\n if(!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag){\r\n return;\r\n }\r\n var i,len, count = 0;\r\n var renderedLetters = this.textAnimator.renderedLetters;\r\n\r\n var letters = this.textProperty.currentData.l;\r\n\r\n len = letters.length;\r\n var renderedLetter, textSpan, textPath;\r\n for(i=0;i<len;i+=1){\r\n if(letters[i].n){\r\n count += 1;\r\n continue;\r\n }\r\n textSpan = this.textSpans[i];\r\n textPath = this.textPaths[i];\r\n renderedLetter = renderedLetters[count];\r\n count += 1;\r\n if(renderedLetter._mdf.m) {\r\n if(!this.isMasked){\r\n textSpan.style.transform = textSpan.style.webkitTransform = renderedLetter.m;\r\n }else{\r\n textSpan.setAttribute('transform',renderedLetter.m);\r\n }\r\n }\r\n ////textSpan.setAttribute('opacity',renderedLetter.o);\r\n textSpan.style.opacity = renderedLetter.o;\r\n if(renderedLetter.sw && renderedLetter._mdf.sw){\r\n textPath.setAttribute('stroke-width',renderedLetter.sw);\r\n }\r\n if(renderedLetter.sc && renderedLetter._mdf.sc){\r\n textPath.setAttribute('stroke',renderedLetter.sc);\r\n }\r\n if(renderedLetter.fc && renderedLetter._mdf.fc){\r\n textPath.setAttribute('fill',renderedLetter.fc);\r\n textPath.style.color = renderedLetter.fc;\r\n }\r\n }\r\n\r\n if(this.innerElem.getBBox && !this.hidden && (this._isFirstFrame || this._mdf)){\r\n var boundingBox = this.innerElem.getBBox();\r\n\r\n if(this.currentBBox.w !== boundingBox.width){\r\n this.currentBBox.w = boundingBox.width;\r\n this.svgElement.setAttribute('width',boundingBox.width);\r\n }\r\n if(this.currentBBox.h !== boundingBox.height){\r\n this.currentBBox.h = boundingBox.height;\r\n this.svgElement.setAttribute('height',boundingBox.height);\r\n }\r\n\r\n var margin = 1;\r\n if(this.currentBBox.w !== (boundingBox.width + margin*2) || this.currentBBox.h !== (boundingBox.height + margin*2) || this.currentBBox.x !== (boundingBox.x - margin) || this.currentBBox.y !== (boundingBox.y - margin)){\r\n this.currentBBox.w = boundingBox.width + margin*2;\r\n this.currentBBox.h = boundingBox.height + margin*2;\r\n this.currentBBox.x = boundingBox.x - margin;\r\n this.currentBBox.y = boundingBox.y - margin;\r\n\r\n this.svgElement.setAttribute('viewBox',this.currentBBox.x+' '+this.currentBBox.y+' '+this.currentBBox.w+' '+this.currentBBox.h);\r\n this.svgElement.style.transform = this.svgElement.style.webkitTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)';\r\n }\r\n }\r\n};\r\nfunction HImageElement(data,globalData,comp){\r\n this.assetData = globalData.getAssetData(data.refId);\r\n this.initElement(data,globalData,comp);\r\n}\r\n\r\nextendPrototype([BaseElement,TransformElement,HBaseElement,HSolidElement,HierarchyElement,FrameElement,RenderableElement], HImageElement);\r\n\r\n\r\nHImageElement.prototype.createContent = function(){\r\n var assetPath = this.globalData.getAssetsPath(this.assetData);\r\n var img = new Image();\r\n\r\n if(this.data.hasMask){\r\n this.imageElem = createNS('image');\r\n this.imageElem.setAttribute('width',this.assetData.w+\"px\");\r\n this.imageElem.setAttribute('height',this.assetData.h+\"px\");\r\n this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);\r\n this.layerElement.appendChild(this.imageElem);\r\n this.baseElement.setAttribute('width',this.assetData.w);\r\n this.baseElement.setAttribute('height',this.assetData.h);\r\n } else {\r\n this.layerElement.appendChild(img);\r\n }\r\n img.src = assetPath;\r\n if(this.data.ln){\r\n this.baseElement.setAttribute('id',this.data.ln);\r\n }\r\n};\r\nfunction HCameraElement(data,globalData,comp){\r\n this.initFrame();\r\n this.initBaseData(data,globalData,comp);\r\n this.initHierarchy();\r\n var getProp = PropertyFactory.getProp;\r\n this.pe = getProp(this,data.pe,0,0,this);\r\n if(data.ks.p.s){\r\n this.px = getProp(this,data.ks.p.x,1,0,this);\r\n this.py = getProp(this,data.ks.p.y,1,0,this);\r\n this.pz = getProp(this,data.ks.p.z,1,0,this);\r\n }else{\r\n this.p = getProp(this,data.ks.p,1,0,this);\r\n }\r\n if(data.ks.a){\r\n this.a = getProp(this,data.ks.a,1,0,this);\r\n }\r\n if(data.ks.or.k.length && data.ks.or.k[0].to){\r\n var i,len = data.ks.or.k.length;\r\n for(i=0;i<len;i+=1){\r\n data.ks.or.k[i].to = null;\r\n data.ks.or.k[i].ti = null;\r\n }\r\n }\r\n this.or = getProp(this,data.ks.or,1,degToRads,this);\r\n this.or.sh = true;\r\n this.rx = getProp(this,data.ks.rx,0,degToRads,this);\r\n this.ry = getProp(this,data.ks.ry,0,degToRads,this);\r\n this.rz = getProp(this,data.ks.rz,0,degToRads,this);\r\n this.mat = new Matrix();\r\n this._prevMat = new Matrix();\r\n this._isFirstFrame = true;\r\n \r\n // TODO: find a better way to make the HCamera element to be compatible with the LayerInterface and TransformInterface.\r\n this.finalTransform = {\r\n mProp: this\r\n };\r\n}\r\nextendPrototype([BaseElement, FrameElement, HierarchyElement], HCameraElement);\r\n\r\nHCameraElement.prototype.setup = function() {\r\n var i, len = this.comp.threeDElements.length, comp;\r\n for(i=0;i<len;i+=1){\r\n //[perspectiveElem,container]\r\n comp = this.comp.threeDElements[i];\r\n if(comp.type === '3d') {\r\n comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';\r\n comp.container.style.transformOrigin = comp.container.style.mozTransformOrigin = comp.container.style.webkitTransformOrigin = \"0px 0px 0px\";\r\n comp.perspectiveElem.style.transform = comp.perspectiveElem.style.webkitTransform = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)';\r\n }\r\n }\r\n};\r\n\r\nHCameraElement.prototype.createElements = function(){\r\n};\r\n\r\nHCameraElement.prototype.hide = function(){\r\n};\r\n\r\nHCameraElement.prototype.renderFrame = function(){\r\n var _mdf = this._isFirstFrame;\r\n var i, len;\r\n if(this.hierarchy){\r\n len = this.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf;\r\n }\r\n }\r\n if(_mdf || this.pe._mdf || (this.p && this.p._mdf) || (this.px && (this.px._mdf || this.py._mdf || this.pz._mdf)) || this.rx._mdf || this.ry._mdf || this.rz._mdf || this.or._mdf || (this.a && this.a._mdf)) {\r\n this.mat.reset();\r\n\r\n if(this.hierarchy){\r\n var mat;\r\n len = this.hierarchy.length - 1;\r\n for (i = len; i >= 0; i -= 1) {\r\n var mTransf = this.hierarchy[i].finalTransform.mProp;\r\n this.mat.translate(-mTransf.p.v[0],-mTransf.p.v[1],mTransf.p.v[2]);\r\n this.mat.rotateX(-mTransf.or.v[0]).rotateY(-mTransf.or.v[1]).rotateZ(mTransf.or.v[2]);\r\n this.mat.rotateX(-mTransf.rx.v).rotateY(-mTransf.ry.v).rotateZ(mTransf.rz.v);\r\n this.mat.scale(1/mTransf.s.v[0],1/mTransf.s.v[1],1/mTransf.s.v[2]);\r\n this.mat.translate(mTransf.a.v[0],mTransf.a.v[1],mTransf.a.v[2]);\r\n }\r\n }\r\n if (this.p) {\r\n this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]);\r\n } else {\r\n this.mat.translate(-this.px.v,-this.py.v,this.pz.v);\r\n }\r\n if (this.a) {\r\n var diffVector\r\n if (this.p) {\r\n diffVector = [this.p.v[0] - this.a.v[0], this.p.v[1] - this.a.v[1], this.p.v[2] - this.a.v[2]];\r\n } else {\r\n diffVector = [this.px.v - this.a.v[0], this.py.v - this.a.v[1], this.pz.v - this.a.v[2]];\r\n }\r\n var mag = Math.sqrt(Math.pow(diffVector[0],2)+Math.pow(diffVector[1],2)+Math.pow(diffVector[2],2));\r\n //var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v));\r\n var lookDir = [diffVector[0]/mag,diffVector[1]/mag,diffVector[2]/mag];\r\n var lookLengthOnXZ = Math.sqrt( lookDir[2]*lookDir[2] + lookDir[0]*lookDir[0] );\r\n var m_rotationX = (Math.atan2( lookDir[1], lookLengthOnXZ ));\r\n var m_rotationY = (Math.atan2( lookDir[0], -lookDir[2]));\r\n this.mat.rotateY(m_rotationY).rotateX(-m_rotationX);\r\n\r\n }\r\n this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v);\r\n this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]);\r\n this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0);\r\n this.mat.translate(0,0,this.pe.v);\r\n\r\n\r\n \r\n\r\n var hasMatrixChanged = !this._prevMat.equals(this.mat);\r\n if((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) {\r\n len = this.comp.threeDElements.length;\r\n var comp;\r\n for(i=0;i<len;i+=1){\r\n comp = this.comp.threeDElements[i];\r\n if(comp.type === '3d') {\r\n if(hasMatrixChanged) {\r\n comp.container.style.transform = comp.container.style.webkitTransform = this.mat.toCSS();\r\n }\r\n if(this.pe._mdf) {\r\n comp.perspectiveElem.style.perspective = comp.perspectiveElem.style.webkitPerspective = this.pe.v+'px';\r\n }\r\n }\r\n }\r\n this.mat.clone(this._prevMat);\r\n }\r\n }\r\n this._isFirstFrame = false;\r\n};\r\n\r\nHCameraElement.prototype.prepareFrame = function(num) {\r\n this.prepareProperties(num, true);\r\n};\r\n\r\nHCameraElement.prototype.destroy = function(){\r\n};\r\nHCameraElement.prototype.getBaseElement = function(){return null;};\r\nfunction HEffects() {\r\n}\r\nHEffects.prototype.renderFrame = function(){};\r\nvar animationManager = (function(){\r\n var moduleOb = {};\r\n var registeredAnimations = [];\r\n var initTime = 0;\r\n var len = 0;\r\n var playingAnimationsNum = 0;\r\n var _stopped = true;\r\n var _isFrozen = false;\r\n\r\n function removeElement(ev){\r\n var i = 0;\r\n var animItem = ev.target;\r\n while(i<len) {\r\n if (registeredAnimations[i].animation === animItem) {\r\n registeredAnimations.splice(i, 1);\r\n i -= 1;\r\n len -= 1;\r\n if(!animItem.isPaused){\r\n subtractPlayingCount();\r\n }\r\n }\r\n i += 1;\r\n }\r\n }\r\n\r\n function registerAnimation(element, animationData){\r\n if(!element){\r\n return null;\r\n }\r\n var i=0;\r\n while(i<len){\r\n if(registeredAnimations[i].elem == element && registeredAnimations[i].elem !== null ){\r\n return registeredAnimations[i].animation;\r\n }\r\n i+=1;\r\n }\r\n var animItem = new AnimationItem();\r\n setupAnimation(animItem, element);\r\n animItem.setData(element, animationData);\r\n return animItem;\r\n }\r\n\r\n function getRegisteredAnimations() {\r\n var i, len = registeredAnimations.length;\r\n var animations = [];\r\n for(i = 0; i < len; i += 1) {\r\n animations.push(registeredAnimations[i].animation);\r\n }\r\n return animations;\r\n }\r\n\r\n function addPlayingCount(){\r\n playingAnimationsNum += 1;\r\n activate();\r\n }\r\n\r\n function subtractPlayingCount(){\r\n playingAnimationsNum -= 1;\r\n }\r\n\r\n function setupAnimation(animItem, element){\r\n animItem.addEventListener('destroy',removeElement);\r\n animItem.addEventListener('_active',addPlayingCount);\r\n animItem.addEventListener('_idle',subtractPlayingCount);\r\n registeredAnimations.push({elem: element,animation:animItem});\r\n len += 1;\r\n }\r\n\r\n function loadAnimation(params){\r\n var animItem = new AnimationItem();\r\n setupAnimation(animItem, null);\r\n animItem.setParams(params);\r\n return animItem;\r\n }\r\n\r\n\r\n function setSpeed(val,animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.setSpeed(val, animation);\r\n }\r\n }\r\n\r\n function setDirection(val, animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.setDirection(val, animation);\r\n }\r\n }\r\n\r\n function play(animation){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.play(animation);\r\n }\r\n }\r\n function resume(nowTime) {\r\n var elapsedTime = nowTime - initTime;\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.advanceTime(elapsedTime);\r\n }\r\n initTime = nowTime;\r\n if(playingAnimationsNum && !_isFrozen) {\r\n window.requestAnimationFrame(resume);\r\n } else {\r\n _stopped = true;\r\n }\r\n }\r\n\r\n function first(nowTime){\r\n initTime = nowTime;\r\n window.requestAnimationFrame(resume);\r\n }\r\n\r\n function pause(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.pause(animation);\r\n }\r\n }\r\n\r\n function goToAndStop(value,isFrame,animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.goToAndStop(value,isFrame,animation);\r\n }\r\n }\r\n\r\n function stop(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.stop(animation);\r\n }\r\n }\r\n\r\n function togglePause(animation) {\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.togglePause(animation);\r\n }\r\n }\r\n\r\n function destroy(animation) {\r\n var i;\r\n for(i=(len-1);i>=0;i-=1){\r\n registeredAnimations[i].animation.destroy(animation);\r\n }\r\n }\r\n\r\n function searchAnimations(animationData, standalone, renderer){\r\n var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')),\r\n [].slice.call(document.getElementsByClassName('bodymovin')));\r\n var i, len = animElements.length;\r\n for(i=0;i<len;i+=1){\r\n if(renderer){\r\n animElements[i].setAttribute('data-bm-type',renderer);\r\n }\r\n registerAnimation(animElements[i], animationData);\r\n }\r\n if(standalone && len === 0){\r\n if(!renderer){\r\n renderer = 'svg';\r\n }\r\n var body = document.getElementsByTagName('body')[0];\r\n body.innerHTML = '';\r\n var div = createTag('div');\r\n div.style.width = '100%';\r\n div.style.height = '100%';\r\n div.setAttribute('data-bm-type',renderer);\r\n body.appendChild(div);\r\n registerAnimation(div, animationData);\r\n }\r\n }\r\n\r\n function resize(){\r\n var i;\r\n for(i=0;i<len;i+=1){\r\n registeredAnimations[i].animation.resize();\r\n }\r\n }\r\n\r\n function activate(){\r\n if(!_isFrozen && playingAnimationsNum){\r\n if(_stopped) {\r\n window.requestAnimationFrame(first);\r\n _stopped = false;\r\n }\r\n }\r\n }\r\n\r\n function freeze() {\r\n _isFrozen = true;\r\n }\r\n\r\n function unfreeze() {\r\n _isFrozen = false;\r\n activate();\r\n }\r\n\r\n moduleOb.registerAnimation = registerAnimation;\r\n moduleOb.loadAnimation = loadAnimation;\r\n moduleOb.setSpeed = setSpeed;\r\n moduleOb.setDirection = setDirection;\r\n moduleOb.play = play;\r\n moduleOb.pause = pause;\r\n moduleOb.stop = stop;\r\n moduleOb.togglePause = togglePause;\r\n moduleOb.searchAnimations = searchAnimations;\r\n moduleOb.resize = resize;\r\n //moduleOb.start = start;\r\n moduleOb.goToAndStop = goToAndStop;\r\n moduleOb.destroy = destroy;\r\n moduleOb.freeze = freeze;\r\n moduleOb.unfreeze = unfreeze;\r\n moduleOb.getRegisteredAnimations = getRegisteredAnimations;\r\n return moduleOb;\r\n}());\r\n\r\nvar AnimationItem = function () {\r\n this._cbs = [];\r\n this.name = '';\r\n this.path = '';\r\n this.isLoaded = false;\r\n this.currentFrame = 0;\r\n this.currentRawFrame = 0;\r\n this.totalFrames = 0;\r\n this.frameRate = 0;\r\n this.frameMult = 0;\r\n this.playSpeed = 1;\r\n this.playDirection = 1;\r\n this.playCount = 0;\r\n this.animationData = {};\r\n this.assets = [];\r\n this.isPaused = true;\r\n this.autoplay = false;\r\n this.loop = true;\r\n this.renderer = null;\r\n this.animationID = createElementID();\r\n this.assetsPath = '';\r\n this.timeCompleted = 0;\r\n this.segmentPos = 0;\r\n this.subframeEnabled = subframeEnabled;\r\n this.segments = [];\r\n this._idle = true;\r\n this._completedLoop = false;\r\n this.projectInterface = ProjectInterface();\r\n this.imagePreloader = new ImagePreloader();\r\n};\r\n\r\nextendPrototype([BaseEvent], AnimationItem);\r\n\r\nAnimationItem.prototype.setParams = function(params) {\r\n if(params.context){\r\n this.context = params.context;\r\n }\r\n if(params.wrapper || params.container){\r\n this.wrapper = params.wrapper || params.container;\r\n }\r\n var animType = params.animType ? params.animType : params.renderer ? params.renderer : 'svg';\r\n switch(animType){\r\n case 'canvas':\r\n this.renderer = new CanvasRenderer(this, params.rendererSettings);\r\n break;\r\n case 'svg':\r\n this.renderer = new SVGRenderer(this, params.rendererSettings);\r\n break;\r\n default:\r\n this.renderer = new HybridRenderer(this, params.rendererSettings);\r\n break;\r\n }\r\n this.renderer.setProjectInterface(this.projectInterface);\r\n this.animType = animType;\r\n\r\n if(params.loop === '' || params.loop === null){\r\n }else if(params.loop === false){\r\n this.loop = false;\r\n }else if(params.loop === true){\r\n this.loop = true;\r\n }else{\r\n this.loop = parseInt(params.loop);\r\n }\r\n this.autoplay = 'autoplay' in params ? params.autoplay : true;\r\n this.name = params.name ? params.name : '';\r\n this.autoloadSegments = params.hasOwnProperty('autoloadSegments') ? params.autoloadSegments : true;\r\n this.assetsPath = params.assetsPath;\r\n if (params.animationData) {\r\n this.configAnimation(params.animationData);\r\n } else if(params.path){\r\n\r\n if( params.path.lastIndexOf('\\\\') !== -1){\r\n this.path = params.path.substr(0,params.path.lastIndexOf('\\\\')+1);\r\n } else {\r\n this.path = params.path.substr(0,params.path.lastIndexOf('/')+1);\r\n }\r\n this.fileName = params.path.substr(params.path.lastIndexOf('/')+1);\r\n this.fileName = this.fileName.substr(0,this.fileName.lastIndexOf('.json'));\r\n\r\n assetLoader.load(params.path, this.configAnimation.bind(this), function() {\r\n this.trigger('data_failed');\r\n }.bind(this));\r\n }\r\n};\r\n\r\nAnimationItem.prototype.setData = function (wrapper, animationData) {\r\n var params = {\r\n wrapper: wrapper,\r\n animationData: animationData ? (typeof animationData === \"object\") ? animationData : JSON.parse(animationData) : null\r\n };\r\n var wrapperAttributes = wrapper.attributes;\r\n\r\n params.path = wrapperAttributes.getNamedItem('data-animation-path') ? wrapperAttributes.getNamedItem('data-animation-path').value : wrapperAttributes.getNamedItem('data-bm-path') ? wrapperAttributes.getNamedItem('data-bm-path').value : wrapperAttributes.getNamedItem('bm-path') ? wrapperAttributes.getNamedItem('bm-path').value : '';\r\n params.animType = wrapperAttributes.getNamedItem('data-anim-type') ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') ? wrapperAttributes.getNamedItem('bm-type').value : wrapperAttributes.getNamedItem('data-bm-renderer') ? wrapperAttributes.getNamedItem('data-bm-renderer').value : wrapperAttributes.getNamedItem('bm-renderer') ? wrapperAttributes.getNamedItem('bm-renderer').value : 'canvas';\r\n\r\n var loop = wrapperAttributes.getNamedItem('data-anim-loop') ? wrapperAttributes.getNamedItem('data-anim-loop').value : wrapperAttributes.getNamedItem('data-bm-loop') ? wrapperAttributes.getNamedItem('data-bm-loop').value : wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : '';\r\n if(loop === ''){\r\n }else if(loop === 'false'){\r\n params.loop = false;\r\n }else if(loop === 'true'){\r\n params.loop = true;\r\n }else{\r\n params.loop = parseInt(loop);\r\n }\r\n var autoplay = wrapperAttributes.getNamedItem('data-anim-autoplay') ? wrapperAttributes.getNamedItem('data-anim-autoplay').value : wrapperAttributes.getNamedItem('data-bm-autoplay') ? wrapperAttributes.getNamedItem('data-bm-autoplay').value : wrapperAttributes.getNamedItem('bm-autoplay') ? wrapperAttributes.getNamedItem('bm-autoplay').value : true;\r\n params.autoplay = autoplay !== \"false\";\r\n\r\n params.name = wrapperAttributes.getNamedItem('data-name') ? wrapperAttributes.getNamedItem('data-name').value : wrapperAttributes.getNamedItem('data-bm-name') ? wrapperAttributes.getNamedItem('data-bm-name').value : wrapperAttributes.getNamedItem('bm-name') ? wrapperAttributes.getNamedItem('bm-name').value : '';\r\n var prerender = wrapperAttributes.getNamedItem('data-anim-prerender') ? wrapperAttributes.getNamedItem('data-anim-prerender').value : wrapperAttributes.getNamedItem('data-bm-prerender') ? wrapperAttributes.getNamedItem('data-bm-prerender').value : wrapperAttributes.getNamedItem('bm-prerender') ? wrapperAttributes.getNamedItem('bm-prerender').value : '';\r\n\r\n if(prerender === 'false'){\r\n params.prerender = false;\r\n }\r\n this.setParams(params);\r\n};\r\n\r\nAnimationItem.prototype.includeLayers = function(data) {\r\n if(data.op > this.animationData.op){\r\n this.animationData.op = data.op;\r\n this.totalFrames = Math.floor(data.op - this.animationData.ip);\r\n }\r\n var layers = this.animationData.layers;\r\n var i, len = layers.length;\r\n var newLayers = data.layers;\r\n var j, jLen = newLayers.length;\r\n for(j=0;j<jLen;j+=1){\r\n i = 0;\r\n while(i<len){\r\n if(layers[i].id == newLayers[j].id){\r\n layers[i] = newLayers[j];\r\n break;\r\n }\r\n i += 1;\r\n }\r\n }\r\n if(data.chars || data.fonts){\r\n this.renderer.globalData.fontManager.addChars(data.chars);\r\n this.renderer.globalData.fontManager.addFonts(data.fonts, this.renderer.globalData.defs);\r\n }\r\n if(data.assets){\r\n len = data.assets.length;\r\n for(i = 0; i < len; i += 1){\r\n this.animationData.assets.push(data.assets[i]);\r\n }\r\n }\r\n this.animationData.__complete = false;\r\n dataManager.completeData(this.animationData,this.renderer.globalData.fontManager);\r\n this.renderer.includeLayers(data.layers);\r\n if(expressionsPlugin){\r\n expressionsPlugin.initExpressions(this);\r\n }\r\n this.loadNextSegment();\r\n};\r\n\r\nAnimationItem.prototype.loadNextSegment = function() {\r\n var segments = this.animationData.segments;\r\n if(!segments || segments.length === 0 || !this.autoloadSegments){\r\n this.trigger('data_ready');\r\n this.timeCompleted = this.totalFrames;\r\n return;\r\n }\r\n var segment = segments.shift();\r\n this.timeCompleted = segment.time * this.frameRate;\r\n var segmentPath = this.path+this.fileName+'_' + this.segmentPos + '.json';\r\n this.segmentPos += 1;\r\n assetLoader.load(segmentPath, this.includeLayers.bind(this), function() {\r\n this.trigger('data_failed');\r\n }.bind(this));\r\n};\r\n\r\nAnimationItem.prototype.loadSegments = function() {\r\n var segments = this.animationData.segments;\r\n if(!segments) {\r\n this.timeCompleted = this.totalFrames;\r\n }\r\n this.loadNextSegment();\r\n};\r\n\r\nAnimationItem.prototype.imagesLoaded = function() {\r\n this.trigger('loaded_images');\r\n this.checkLoaded()\r\n}\r\n\r\nAnimationItem.prototype.preloadImages = function() {\r\n this.imagePreloader.setAssetsPath(this.assetsPath);\r\n this.imagePreloader.setPath(this.path);\r\n this.imagePreloader.loadAssets(this.animationData.assets, this.imagesLoaded.bind(this));\r\n}\r\n\r\nAnimationItem.prototype.configAnimation = function (animData) {\r\n if(!this.renderer){\r\n return;\r\n }\r\n try {\r\n this.animationData = animData;\r\n this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip);\r\n this.renderer.configAnimation(animData);\r\n if(!animData.assets){\r\n animData.assets = [];\r\n }\r\n\r\n this.assets = this.animationData.assets;\r\n this.frameRate = this.animationData.fr;\r\n this.firstFrame = Math.round(this.animationData.ip);\r\n this.frameMult = this.animationData.fr / 1000;\r\n this.renderer.searchExtraCompositions(animData.assets);\r\n this.trigger('config_ready');\r\n this.preloadImages();\r\n this.loadSegments();\r\n this.updaFrameModifier();\r\n this.waitForFontsLoaded();\r\n } catch(error) {\r\n this.triggerConfigError(error);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.waitForFontsLoaded = function(){\r\n if(!this.renderer) {\r\n return;\r\n }\r\n if(this.renderer.globalData.fontManager.loaded()){\r\n this.checkLoaded();\r\n }else{\r\n setTimeout(this.waitForFontsLoaded.bind(this),20);\r\n }\r\n}\r\n\r\nAnimationItem.prototype.checkLoaded = function () {\r\n if (!this.isLoaded && this.renderer.globalData.fontManager.loaded() && (this.imagePreloader.loaded() || this.renderer.rendererType !== 'canvas')) {\r\n this.isLoaded = true;\r\n dataManager.completeData(this.animationData, this.renderer.globalData.fontManager);\r\n if(expressionsPlugin){\r\n expressionsPlugin.initExpressions(this);\r\n }\r\n this.renderer.initItems();\r\n setTimeout(function() {\r\n this.trigger('DOMLoaded');\r\n }.bind(this), 0);\r\n this.gotoFrame();\r\n if(this.autoplay){\r\n this.play();\r\n }\r\n }\r\n};\r\n\r\nAnimationItem.prototype.resize = function () {\r\n this.renderer.updateContainerSize();\r\n};\r\n\r\nAnimationItem.prototype.setSubframe = function(flag){\r\n this.subframeEnabled = flag ? true : false;\r\n};\r\n\r\nAnimationItem.prototype.gotoFrame = function () {\r\n this.currentFrame = this.subframeEnabled ? this.currentRawFrame : ~~this.currentRawFrame;\r\n\r\n if(this.timeCompleted !== this.totalFrames && this.currentFrame > this.timeCompleted){\r\n this.currentFrame = this.timeCompleted;\r\n }\r\n this.trigger('enterFrame');\r\n this.renderFrame();\r\n};\r\n\r\nAnimationItem.prototype.renderFrame = function () {\r\n if(this.isLoaded === false){\r\n return;\r\n }\r\n try {\r\n this.renderer.renderFrame(this.currentFrame + this.firstFrame);\r\n } catch(error) {\r\n this.triggerRenderFrameError(error);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.play = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === true){\r\n this.isPaused = false;\r\n if(this._idle){\r\n this._idle = false;\r\n this.trigger('_active');\r\n }\r\n }\r\n};\r\n\r\nAnimationItem.prototype.pause = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === false){\r\n this.isPaused = true;\r\n this._idle = true;\r\n this.trigger('_idle');\r\n }\r\n};\r\n\r\nAnimationItem.prototype.togglePause = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(this.isPaused === true){\r\n this.play();\r\n }else{\r\n this.pause();\r\n }\r\n};\r\n\r\nAnimationItem.prototype.stop = function (name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n this.pause();\r\n this.playCount = 0;\r\n this._completedLoop = false;\r\n this.setCurrentRawFrameValue(0);\r\n};\r\n\r\nAnimationItem.prototype.goToAndStop = function (value, isFrame, name) {\r\n if(name && this.name != name){\r\n return;\r\n }\r\n if(isFrame){\r\n this.setCurrentRawFrameValue(value);\r\n }else{\r\n this.setCurrentRawFrameValue(value * this.frameModifier);\r\n }\r\n this.pause();\r\n};\r\n\r\nAnimationItem.prototype.goToAndPlay = function (value, isFrame, name) {\r\n this.goToAndStop(value, isFrame, name);\r\n this.play();\r\n};\r\n\r\nAnimationItem.prototype.advanceTime = function (value) {\r\n if (this.isPaused === true || this.isLoaded === false) {\r\n return;\r\n }\r\n var nextValue = this.currentRawFrame + value * this.frameModifier;\r\n var _isComplete = false;\r\n // Checking if nextValue > totalFrames - 1 for addressing non looping and looping animations.\r\n // If animation won't loop, it should stop at totalFrames - 1. If it will loop it should complete the last frame and then loop.\r\n if (nextValue >= this.totalFrames - 1 && this.frameModifier > 0) {\r\n if (!this.loop || this.playCount === this.loop) {\r\n if (!this.checkSegments(nextValue > this.totalFrames ? nextValue % this.totalFrames : 0)) {\r\n _isComplete = true;\r\n nextValue = this.totalFrames - 1;\r\n }\r\n } else if (nextValue >= this.totalFrames) {\r\n this.playCount += 1;\r\n if (!this.checkSegments(nextValue % this.totalFrames)) {\r\n this.setCurrentRawFrameValue(nextValue % this.totalFrames);\r\n this._completedLoop = true;\r\n this.trigger('loopComplete');\r\n }\r\n } else {\r\n this.setCurrentRawFrameValue(nextValue);\r\n }\r\n } else if(nextValue < 0) {\r\n if (!this.checkSegments(nextValue % this.totalFrames)) {\r\n if (this.loop && !(this.playCount-- <= 0 && this.loop !== true)) {\r\n this.setCurrentRawFrameValue(this.totalFrames + (nextValue % this.totalFrames));\r\n if(!this._completedLoop) {\r\n this._completedLoop = true;\r\n } else {\r\n this.trigger('loopComplete');\r\n }\r\n } else {\r\n _isComplete = true;\r\n nextValue = 0;\r\n }\r\n }\r\n } else {\r\n this.setCurrentRawFrameValue(nextValue);\r\n }\r\n if (_isComplete) {\r\n this.setCurrentRawFrameValue(nextValue);\r\n this.pause();\r\n this.trigger('complete');\r\n }\r\n};\r\n\r\nAnimationItem.prototype.adjustSegment = function(arr, offset){\r\n this.playCount = 0;\r\n if(arr[1] < arr[0]){\r\n if(this.frameModifier > 0){\r\n if(this.playSpeed < 0){\r\n this.setSpeed(-this.playSpeed);\r\n } else {\r\n this.setDirection(-1);\r\n }\r\n }\r\n this.timeCompleted = this.totalFrames = arr[0] - arr[1];\r\n this.firstFrame = arr[1];\r\n this.setCurrentRawFrameValue(this.totalFrames - 0.001 - offset);\r\n } else if(arr[1] > arr[0]){\r\n if(this.frameModifier < 0){\r\n if(this.playSpeed < 0){\r\n this.setSpeed(-this.playSpeed);\r\n } else {\r\n this.setDirection(1);\r\n }\r\n }\r\n this.timeCompleted = this.totalFrames = arr[1] - arr[0];\r\n this.firstFrame = arr[0];\r\n this.setCurrentRawFrameValue(0.001 + offset);\r\n }\r\n this.trigger('segmentStart');\r\n};\r\nAnimationItem.prototype.setSegment = function (init,end) {\r\n var pendingFrame = -1;\r\n if(this.isPaused) {\r\n if (this.currentRawFrame + this.firstFrame < init) {\r\n pendingFrame = init;\r\n } else if (this.currentRawFrame + this.firstFrame > end) {\r\n pendingFrame = end - init;\r\n }\r\n }\r\n\r\n this.firstFrame = init;\r\n this.timeCompleted = this.totalFrames = end - init;\r\n if(pendingFrame !== -1) {\r\n this.goToAndStop(pendingFrame,true);\r\n }\r\n};\r\n\r\nAnimationItem.prototype.playSegments = function (arr, forceFlag) {\r\n if (forceFlag) {\r\n this.segments.length = 0;\r\n }\r\n if (typeof arr[0] === 'object') {\r\n var i, len = arr.length;\r\n for (i = 0; i < len; i += 1) {\r\n this.segments.push(arr[i]);\r\n }\r\n } else {\r\n this.segments.push(arr);\r\n }\r\n if (this.segments.length && forceFlag) {\r\n this.adjustSegment(this.segments.shift(), 0);\r\n }\r\n if (this.isPaused) {\r\n this.play();\r\n }\r\n};\r\n\r\nAnimationItem.prototype.resetSegments = function (forceFlag) {\r\n this.segments.length = 0;\r\n this.segments.push([this.animationData.ip,this.animationData.op]);\r\n //this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op - this.animationData.ip+this.animationData.ip*this.frameRate)]);\r\n if (forceFlag) {\r\n this.checkSegments(0);\r\n }\r\n};\r\nAnimationItem.prototype.checkSegments = function(offset) {\r\n if (this.segments.length) {\r\n this.adjustSegment(this.segments.shift(), offset);\r\n return true;\r\n }\r\n return false;\r\n};\r\n\r\nAnimationItem.prototype.destroy = function (name) {\r\n if ((name && this.name != name) || !this.renderer) {\r\n return;\r\n }\r\n this.renderer.destroy();\r\n this.imagePreloader.destroy();\r\n this.trigger('destroy');\r\n this._cbs = null;\r\n this.onEnterFrame = this.onLoopComplete = this.onComplete = this.onSegmentStart = this.onDestroy = null;\r\n this.renderer = null;\r\n};\r\n\r\nAnimationItem.prototype.setCurrentRawFrameValue = function(value){\r\n this.currentRawFrame = value;\r\n this.gotoFrame();\r\n};\r\n\r\nAnimationItem.prototype.setSpeed = function (val) {\r\n this.playSpeed = val;\r\n this.updaFrameModifier();\r\n};\r\n\r\nAnimationItem.prototype.setDirection = function (val) {\r\n this.playDirection = val < 0 ? -1 : 1;\r\n this.updaFrameModifier();\r\n};\r\n\r\nAnimationItem.prototype.updaFrameModifier = function () {\r\n this.frameModifier = this.frameMult * this.playSpeed * this.playDirection;\r\n};\r\n\r\nAnimationItem.prototype.getPath = function () {\r\n return this.path;\r\n};\r\n\r\nAnimationItem.prototype.getAssetsPath = function (assetData) {\r\n var path = '';\r\n if(assetData.e) {\r\n path = assetData.p;\r\n } else if(this.assetsPath){\r\n var imagePath = assetData.p;\r\n if(imagePath.indexOf('images/') !== -1){\r\n imagePath = imagePath.split('/')[1];\r\n }\r\n path = this.assetsPath + imagePath;\r\n } else {\r\n path = this.path;\r\n path += assetData.u ? assetData.u : '';\r\n path += assetData.p;\r\n }\r\n return path;\r\n};\r\n\r\nAnimationItem.prototype.getAssetData = function (id) {\r\n var i = 0, len = this.assets.length;\r\n while (i < len) {\r\n if(id == this.assets[i].id){\r\n return this.assets[i];\r\n }\r\n i += 1;\r\n }\r\n};\r\n\r\nAnimationItem.prototype.hide = function () {\r\n this.renderer.hide();\r\n};\r\n\r\nAnimationItem.prototype.show = function () {\r\n this.renderer.show();\r\n};\r\n\r\nAnimationItem.prototype.getDuration = function (isFrame) {\r\n return isFrame ? this.totalFrames : this.totalFrames / this.frameRate;\r\n};\r\n\r\nAnimationItem.prototype.trigger = function(name){\r\n if(this._cbs && this._cbs[name]){\r\n switch(name){\r\n case 'enterFrame':\r\n this.triggerEvent(name,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameModifier));\r\n break;\r\n case 'loopComplete':\r\n this.triggerEvent(name,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));\r\n break;\r\n case 'complete':\r\n this.triggerEvent(name,new BMCompleteEvent(name,this.frameMult));\r\n break;\r\n case 'segmentStart':\r\n this.triggerEvent(name,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));\r\n break;\r\n case 'destroy':\r\n this.triggerEvent(name,new BMDestroyEvent(name,this));\r\n break;\r\n default:\r\n this.triggerEvent(name);\r\n }\r\n }\r\n if(name === 'enterFrame' && this.onEnterFrame){\r\n this.onEnterFrame.call(this,new BMEnterFrameEvent(name,this.currentFrame,this.totalFrames,this.frameMult));\r\n }\r\n if(name === 'loopComplete' && this.onLoopComplete){\r\n this.onLoopComplete.call(this,new BMCompleteLoopEvent(name,this.loop,this.playCount,this.frameMult));\r\n }\r\n if(name === 'complete' && this.onComplete){\r\n this.onComplete.call(this,new BMCompleteEvent(name,this.frameMult));\r\n }\r\n if(name === 'segmentStart' && this.onSegmentStart){\r\n this.onSegmentStart.call(this,new BMSegmentStartEvent(name,this.firstFrame,this.totalFrames));\r\n }\r\n if(name === 'destroy' && this.onDestroy){\r\n this.onDestroy.call(this,new BMDestroyEvent(name,this));\r\n }\r\n};\r\n\r\nAnimationItem.prototype.triggerRenderFrameError = function(nativeError) {\r\n\r\n var error = new BMRenderFrameErrorEvent(nativeError, this.currentFrame);\r\n this.triggerEvent('error', error);\r\n\r\n if (this.onError) {\r\n this.onError.call(this, error);\r\n }\r\n}\r\n\r\nAnimationItem.prototype.triggerConfigError = function(nativeError) {\r\n\r\n var error = new BMConfigErrorEvent(nativeError, this.currentFrame);\r\n this.triggerEvent('error', error);\r\n\r\n if (this.onError) {\r\n this.onError.call(this, error);\r\n }\r\n}\r\nvar Expressions = (function(){\r\n var ob = {};\r\n ob.initExpressions = initExpressions;\r\n\r\n\r\n function initExpressions(animation){\r\n\r\n \tvar stackCount = 0;\r\n \tvar registers = [];\r\n\r\n \tfunction pushExpression() {\r\n\t\t\tstackCount += 1;\r\n \t}\r\n\r\n \tfunction popExpression() {\r\n\t\t\tstackCount -= 1;\r\n\t\t\tif (stackCount === 0) {\r\n\t\t\t\treleaseInstances();\r\n\t\t\t}\r\n \t}\r\n\r\n \tfunction registerExpressionProperty(expression) {\r\n \t\tif (registers.indexOf(expression) === -1) {\r\n\t\t\t\tregisters.push(expression)\r\n \t\t}\r\n \t}\r\n\r\n \tfunction releaseInstances() {\r\n \t\tvar i, len = registers.length;\r\n \t\tfor (i = 0; i < len; i += 1) {\r\n\t\t\t\tregisters[i].release();\r\n \t\t}\r\n \t\tregisters.length = 0;\r\n \t}\r\n\r\n animation.renderer.compInterface = CompExpressionInterface(animation.renderer);\r\n animation.renderer.globalData.projectInterface.registerComposition(animation.renderer);\r\n animation.renderer.globalData.pushExpression = pushExpression;\r\n animation.renderer.globalData.popExpression = popExpression;\r\n animation.renderer.globalData.registerExpressionProperty = registerExpressionProperty;\r\n }\r\n return ob;\r\n}());\r\n\r\nexpressionsPlugin = Expressions;\r\n\r\nvar ExpressionManager = (function(){\r\n 'use strict';\r\n var ob = {};\r\n var Math = BMMath;\r\n var window = null;\r\n var document = null;\r\n\r\n function $bm_isInstanceOfArray(arr) {\r\n return arr.constructor === Array || arr.constructor === Float32Array;\r\n }\r\n\r\n function isNumerable(tOfV, v) {\r\n return tOfV === 'number' || tOfV === 'boolean' || tOfV === 'string' || v instanceof Number;\r\n }\r\n\r\n function $bm_neg(a){\r\n var tOfA = typeof a;\r\n if(tOfA === 'number' || tOfA === 'boolean' || a instanceof Number ){\r\n return -a;\r\n }\r\n if($bm_isInstanceOfArray(a)){\r\n var i, lenA = a.length;\r\n var retArr = [];\r\n for(i=0;i<lenA;i+=1){\r\n retArr[i] = -a[i];\r\n }\r\n return retArr;\r\n }\r\n if (a.propType) {\r\n return a.v;\r\n }\r\n }\r\n\r\n var easeInBez = BezierFactory.getBezierEasing(0.333,0,.833,.833, 'easeIn').get;\r\n var easeOutBez = BezierFactory.getBezierEasing(0.167,0.167,.667,1, 'easeOut').get;\r\n var easeInOutBez = BezierFactory.getBezierEasing(.33,0,.667,1, 'easeInOut').get;\r\n\r\n function sum(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n if(tOfA === 'string' || tOfB === 'string'){\r\n return a + b;\r\n }\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a + b;\r\n }\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n a = a.slice(0);\r\n a[0] = a[0] + b;\r\n return a;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n b = b.slice(0);\r\n b[0] = a + b[0];\r\n return b;\r\n }\r\n if($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)){\r\n \r\n var i = 0, lenA = a.length, lenB = b.length;\r\n var retArr = [];\r\n while(i<lenA || i < lenB){\r\n if((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)){\r\n retArr[i] = a[i] + b[i];\r\n }else{\r\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\r\n }\r\n i += 1;\r\n }\r\n return retArr;\r\n }\r\n return 0;\r\n }\r\n var add = sum;\r\n\r\n function sub(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n if(tOfA === 'string') {\r\n a = parseInt(a);\r\n }\r\n if(tOfB === 'string') {\r\n b = parseInt(b);\r\n }\r\n return a - b;\r\n }\r\n if( $bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n a = a.slice(0);\r\n a[0] = a[0] - b;\r\n return a;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n b = b.slice(0);\r\n b[0] = a - b[0];\r\n return b;\r\n }\r\n if($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)){\r\n var i = 0, lenA = a.length, lenB = b.length;\r\n var retArr = [];\r\n while(i<lenA || i < lenB){\r\n if((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)){\r\n retArr[i] = a[i] - b[i];\r\n }else{\r\n retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i];\r\n }\r\n i += 1;\r\n }\r\n return retArr;\r\n }\r\n return 0;\r\n }\r\n\r\n function mul(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n var arr;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a * b;\r\n }\r\n\r\n var i, len;\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n len = a.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a[i] * b;\r\n }\r\n return arr;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n len = b.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a * b[i];\r\n }\r\n return arr;\r\n }\r\n return 0;\r\n }\r\n\r\n function div(a,b) {\r\n var tOfA = typeof a;\r\n var tOfB = typeof b;\r\n var arr;\r\n if(isNumerable(tOfA, a) && isNumerable(tOfB, b)) {\r\n return a / b;\r\n }\r\n var i, len;\r\n if($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)){\r\n len = a.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a[i] / b;\r\n }\r\n return arr;\r\n }\r\n if(isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)){\r\n len = b.length;\r\n arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = a / b[i];\r\n }\r\n return arr;\r\n }\r\n return 0;\r\n }\r\n function mod(a,b) {\r\n if(typeof a === 'string') {\r\n a = parseInt(a);\r\n }\r\n if(typeof b === 'string') {\r\n b = parseInt(b);\r\n }\r\n return a % b;\r\n }\r\n var $bm_sum = sum;\r\n var $bm_sub = sub;\r\n var $bm_mul = mul;\r\n var $bm_div = div;\r\n var $bm_mod = mod;\r\n\r\n function clamp(num, min, max) {\r\n if(min > max){\r\n var mm = max;\r\n max = min;\r\n min = mm;\r\n }\r\n return Math.min(Math.max(num, min), max);\r\n }\r\n\r\n function radiansToDegrees(val) {\r\n return val/degToRads;\r\n }\r\n var radians_to_degrees = radiansToDegrees;\r\n\r\n function degreesToRadians(val) {\r\n return val*degToRads;\r\n }\r\n var degrees_to_radians = radiansToDegrees;\r\n\r\n var helperLengthArray = [0,0,0,0,0,0];\r\n\r\n function length(arr1, arr2) {\r\n if (typeof arr1 === 'number' || arr1 instanceof Number) {\r\n arr2 = arr2 || 0;\r\n return Math.abs(arr1 - arr2);\r\n }\r\n if(!arr2) {\r\n arr2 = helperLengthArray;\r\n }\r\n var i, len = Math.min(arr1.length, arr2.length);\r\n var addedLength = 0;\r\n for (i = 0; i < len; i += 1) {\r\n addedLength += Math.pow(arr2[i] - arr1[i], 2);\r\n }\r\n return Math.sqrt(addedLength);\r\n }\r\n\r\n function normalize(vec) {\r\n return div(vec, length(vec));\r\n }\r\n\r\n function rgbToHsl(val) {\r\n var r = val[0]; var g = val[1]; var b = val[2];\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b);\r\n var h, s, l = (max + min) / 2;\r\n\r\n if(max == min){\r\n h = s = 0; // achromatic\r\n }else{\r\n var d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch(max){\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return [h, s, l,val[3]];\r\n }\r\n\r\n function hue2rgb(p, q, t){\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n function hslToRgb(val){\r\n var h = val[0];\r\n var s = val[1];\r\n var l = val[2];\r\n\r\n var r, g, b;\r\n\r\n if(s === 0){\r\n r = g = b = l; // achromatic\r\n }else{\r\n\r\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n var p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [r, g , b, val[3]];\r\n }\r\n\r\n function linear(t, tMin, tMax, value1, value2){\r\n if(value1 === undefined || value2 === undefined){\r\n value1 = tMin;\r\n value2 = tMax;\r\n tMin = 0;\r\n tMax = 1;\r\n }\r\n if(tMax < tMin) {\r\n var _tMin = tMax;\r\n tMax = tMin;\r\n tMin = _tMin;\r\n }\r\n if(t <= tMin) {\r\n return value1;\r\n }else if(t >= tMax){\r\n return value2;\r\n }\r\n var perc = tMax === tMin ? 0 : (t-tMin)/(tMax-tMin);\r\n if(!value1.length){\r\n return value1 + (value2-value1)*perc;\r\n }\r\n var i, len = value1.length;\r\n var arr = createTypedArray('float32', len);\r\n for(i=0;i<len;i+=1){\r\n arr[i] = value1[i] + (value2[i]-value1[i])*perc;\r\n }\r\n return arr;\r\n }\r\n function random(min,max){\r\n if(max === undefined){\r\n if(min === undefined){\r\n min = 0;\r\n max = 1;\r\n } else {\r\n max = min;\r\n min = undefined;\r\n }\r\n }\r\n if(max.length){\r\n var i, len = max.length;\r\n if(!min){\r\n min = createTypedArray('float32', len);\r\n }\r\n var arr = createTypedArray('float32', len);\r\n var rnd = BMMath.random();\r\n for(i=0;i<len;i+=1){\r\n arr[i] = min[i] + rnd*(max[i]-min[i]);\r\n }\r\n return arr;\r\n }\r\n if(min === undefined){\r\n min = 0;\r\n }\r\n var rndm = BMMath.random();\r\n return min + rndm*(max-min);\r\n }\r\n\r\n function createPath(points, inTangents, outTangents, closed) {\r\n var i, len = points.length;\r\n var path = shape_pool.newElement();\r\n path.setPathData(!!closed, len);\r\n var arrPlaceholder = [0,0], inVertexPoint, outVertexPoint;\r\n for(i = 0; i < len; i += 1) {\r\n inVertexPoint = (inTangents && inTangents[i]) ? inTangents[i] : arrPlaceholder;\r\n outVertexPoint = (outTangents && outTangents[i]) ? outTangents[i] : arrPlaceholder;\r\n path.setTripleAt(points[i][0],points[i][1],outVertexPoint[0] + points[i][0],outVertexPoint[1] + points[i][1],inVertexPoint[0] + points[i][0],inVertexPoint[1] + points[i][1],i,true);\r\n }\r\n return path;\r\n }\r\n\r\n function initiateExpression(elem,data,property){\r\n var val = data.x;\r\n var needsVelocity = /velocity(?![\\w\\d])/.test(val);\r\n var _needsRandom = val.indexOf('random') !== -1;\r\n var elemType = elem.data.ty;\r\n var transform,$bm_transform,content,effect;\r\n var thisProperty = property;\r\n thisProperty.valueAtTime = thisProperty.getValueAtTime;\r\n Object.defineProperty(thisProperty, 'value', {\r\n get: function() {\r\n return thisProperty.v\r\n }\r\n })\r\n elem.comp.frameDuration = 1/elem.comp.globalData.frameRate;\r\n elem.comp.displayStartTime = 0;\r\n var inPoint = elem.data.ip/elem.comp.globalData.frameRate;\r\n var outPoint = elem.data.op/elem.comp.globalData.frameRate;\r\n var width = elem.data.sw ? elem.data.sw : 0;\r\n var height = elem.data.sh ? elem.data.sh : 0;\r\n var name = elem.data.nm;\r\n var loopIn, loop_in, loopOut, loop_out, smooth;\r\n var toWorld,fromWorld,fromComp,toComp,fromCompToSurface, position, rotation, anchorPoint, scale, thisLayer, thisComp,mask,valueAtTime,velocityAtTime;\r\n var __expression_functions = [];\r\n if(data.xf) {\r\n var i, len = data.xf.length;\r\n for(i = 0; i < len; i += 1) {\r\n __expression_functions[i] = eval('(function(){ return ' + data.xf[i] + '}())');\r\n }\r\n }\r\n\r\n var scoped_bm_rt;\r\n var expression_function = eval('[function _expression_function(){' + val+';scoped_bm_rt=$bm_rt}' + ']')[0];\r\n var numKeys = property.kf ? data.k.length : 0;\r\n\r\n var active = !this.data || this.data.hd !== true;\r\n\r\n var wiggle = function wiggle(freq,amp){\r\n var i,j, len = this.pv.length ? this.pv.length : 1;\r\n var addedAmps = createTypedArray('float32', len);\r\n freq = 5;\r\n var iterations = Math.floor(time*freq);\r\n i = 0;\r\n j = 0;\r\n while(i<iterations){\r\n //var rnd = BMMath.random();\r\n for(j=0;j<len;j+=1){\r\n addedAmps[j] += -amp + amp*2*BMMath.random();\r\n //addedAmps[j] += -amp + amp*2*rnd;\r\n }\r\n i += 1;\r\n }\r\n //var rnd2 = BMMath.random();\r\n var periods = time*freq;\r\n var perc = periods - Math.floor(periods);\r\n var arr = createTypedArray('float32', len);\r\n if(len>1){\r\n for(j=0;j<len;j+=1){\r\n arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*BMMath.random())*perc;\r\n //arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc;\r\n //arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc);\r\n }\r\n return arr;\r\n } else {\r\n return this.pv + addedAmps[0] + (-amp + amp*2*BMMath.random())*perc;\r\n }\r\n }.bind(this);\r\n\r\n if(thisProperty.loopIn) {\r\n loopIn = thisProperty.loopIn.bind(thisProperty);\r\n loop_in = loopIn;\r\n }\r\n\r\n if(thisProperty.loopOut) {\r\n loopOut = thisProperty.loopOut.bind(thisProperty);\r\n loop_out = loopOut;\r\n }\r\n\r\n if(thisProperty.smooth) {\r\n smooth = thisProperty.smooth.bind(thisProperty);\r\n }\r\n\r\n function loopInDuration(type,duration){\r\n return loopIn(type,duration,true);\r\n }\r\n\r\n function loopOutDuration(type,duration){\r\n return loopOut(type,duration,true);\r\n }\r\n\r\n if(this.getValueAtTime) {\r\n valueAtTime = this.getValueAtTime.bind(this);\r\n }\r\n\r\n if(this.getVelocityAtTime) {\r\n velocityAtTime = this.getVelocityAtTime.bind(this);\r\n }\r\n\r\n var comp = elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface);\r\n\r\n function lookAt(elem1,elem2){\r\n var fVec = [elem2[0]-elem1[0],elem2[1]-elem1[1],elem2[2]-elem1[2]];\r\n var pitch = Math.atan2(fVec[0],Math.sqrt(fVec[1]*fVec[1]+fVec[2]*fVec[2]))/degToRads;\r\n var yaw = -Math.atan2(fVec[1],fVec[2])/degToRads;\r\n return [yaw,pitch,0];\r\n }\r\n\r\n function easeOut(t, tMin, tMax, val1, val2){\r\n return applyEase(easeOutBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function easeIn(t, tMin, tMax, val1, val2){\r\n return applyEase(easeInBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function ease(t, tMin, tMax, val1, val2){\r\n return applyEase(easeInOutBez, t, tMin, tMax, val1, val2);\r\n }\r\n\r\n function applyEase(fn, t, tMin, tMax, val1, val2) {\r\n if(val1 === undefined){\r\n val1 = tMin;\r\n val2 = tMax;\r\n } else {\r\n t = (t - tMin) / (tMax - tMin);\r\n }\r\n t = t > 1 ? 1 : t < 0 ? 0 : t;\r\n var mult = fn(t);\r\n if($bm_isInstanceOfArray(val1)) {\r\n var i, len = val1.length;\r\n var arr = createTypedArray('float32', len);\r\n for (i = 0; i < len; i += 1) {\r\n arr[i] = (val2[i] - val1[i]) * mult + val1[i];\r\n }\r\n return arr;\r\n } else {\r\n return (val2 - val1) * mult + val1;\r\n }\r\n }\r\n\r\n function nearestKey(time){\r\n var i, len = data.k.length,index,keyTime;\r\n if(!data.k.length || typeof(data.k[0]) === 'number'){\r\n index = 0;\r\n keyTime = 0;\r\n } else {\r\n index = -1;\r\n time *= elem.comp.globalData.frameRate;\r\n if (time < data.k[0].t) {\r\n index = 1;\r\n keyTime = data.k[0].t;\r\n } else {\r\n for(i=0;i<len-1;i+=1){\r\n if(time === data.k[i].t){\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n break;\r\n }else if(time>data.k[i].t && time<data.k[i+1].t){\r\n if(time-data.k[i].t > data.k[i+1].t - time){\r\n index = i + 2;\r\n keyTime = data.k[i+1].t;\r\n } else {\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n }\r\n break;\r\n }\r\n }\r\n if(index === -1){\r\n index = i + 1;\r\n keyTime = data.k[i].t;\r\n }\r\n }\r\n \r\n }\r\n var ob = {};\r\n ob.index = index;\r\n ob.time = keyTime/elem.comp.globalData.frameRate;\r\n return ob;\r\n }\r\n\r\n function key(ind){\r\n var ob, i, len;\r\n if(!data.k.length || typeof(data.k[0]) === 'number'){\r\n throw new Error('The property has no keyframe at index ' + ind);\r\n }\r\n ind -= 1;\r\n ob = {\r\n time: data.k[ind].t/elem.comp.globalData.frameRate,\r\n value: []\r\n };\r\n var arr = data.k[ind].hasOwnProperty('s') ? data.k[ind].s : data.k[ind - 1].e;\r\n\r\n len = arr.length;\r\n for(i=0;i<len;i+=1){\r\n ob[i] = arr[i];\r\n ob.value[i] = arr[i]\r\n }\r\n return ob;\r\n }\r\n\r\n function framesToTime(frames, fps) { \r\n if (!fps) {\r\n fps = elem.comp.globalData.frameRate;\r\n }\r\n return frames / fps;\r\n }\r\n\r\n function timeToFrames(t, fps) {\r\n if (!t && t !== 0) {\r\n t = time;\r\n }\r\n if (!fps) {\r\n fps = elem.comp.globalData.frameRate;\r\n }\r\n return t * fps;\r\n }\r\n\r\n function seedRandom(seed){\r\n BMMath.seedrandom(randSeed + seed);\r\n }\r\n\r\n function sourceRectAtTime() {\r\n return elem.sourceRectAtTime();\r\n }\r\n\r\n function substring(init, end) {\r\n if(typeof value === 'string') {\r\n if(end === undefined) {\r\n return value.substring(init)\r\n }\r\n return value.substring(init, end)\r\n }\r\n return '';\r\n }\r\n\r\n function substr(init, end) {\r\n if(typeof value === 'string') {\r\n if(end === undefined) {\r\n return value.substr(init)\r\n }\r\n return value.substr(init, end)\r\n }\r\n return '';\r\n }\r\n\r\n var time, velocity, value, text, textIndex, textTotal, selectorValue;\r\n var index = elem.data.ind;\r\n var hasParent = !!(elem.hierarchy && elem.hierarchy.length);\r\n var parent;\r\n var randSeed = Math.floor(Math.random()*1000000);\r\n var globalData = elem.globalData;\r\n function executeExpression(_value) {\r\n // globalData.pushExpression();\r\n value = _value;\r\n if (_needsRandom) {\r\n seedRandom(randSeed);\r\n }\r\n if (this.frameExpressionId === elem.globalData.frameId && this.propType !== 'textSelector') {\r\n return value;\r\n }\r\n if(this.propType === 'textSelector'){\r\n textIndex = this.textIndex;\r\n textTotal = this.textTotal;\r\n selectorValue = this.selectorValue;\r\n }\r\n if (!thisLayer) {\r\n text = elem.layerInterface.text;\r\n thisLayer = elem.layerInterface;\r\n thisComp = elem.comp.compInterface;\r\n toWorld = thisLayer.toWorld.bind(thisLayer);\r\n fromWorld = thisLayer.fromWorld.bind(thisLayer);\r\n fromComp = thisLayer.fromComp.bind(thisLayer);\r\n toComp = thisLayer.toComp.bind(thisLayer);\r\n mask = thisLayer.mask ? thisLayer.mask.bind(thisLayer) : null;\r\n fromCompToSurface = fromComp;\r\n }\r\n if (!transform) {\r\n transform = elem.layerInterface(\"ADBE Transform Group\");\r\n $bm_transform = transform;\r\n if(transform) {\r\n anchorPoint = transform.anchorPoint;\r\n /*position = transform.position;\r\n rotation = transform.rotation;\r\n scale = transform.scale;*/\r\n }\r\n }\r\n \r\n if (elemType === 4 && !content) {\r\n content = thisLayer(\"ADBE Root Vectors Group\");\r\n }\r\n if (!effect) {\r\n effect = thisLayer(4);\r\n }\r\n hasParent = !!(elem.hierarchy && elem.hierarchy.length);\r\n if (hasParent && !parent) {\r\n parent = elem.hierarchy[0].layerInterface;\r\n }\r\n time = this.comp.renderedFrame/this.comp.globalData.frameRate;\r\n if (needsVelocity) {\r\n velocity = velocityAtTime(time);\r\n }\r\n expression_function();\r\n this.frameExpressionId = elem.globalData.frameId;\r\n\r\n\r\n //TODO: Check if it's possible to return on ShapeInterface the .v value\r\n if (scoped_bm_rt.propType === \"shape\") {\r\n scoped_bm_rt = scoped_bm_rt.v;\r\n }\r\n // globalData.popExpression();\r\n return scoped_bm_rt;\r\n }\r\n return executeExpression;\r\n }\r\n\r\n ob.initiateExpression = initiateExpression;\r\n return ob;\r\n}());\r\nvar expressionHelpers = (function(){\r\n\r\n function searchExpressions(elem,data,prop){\r\n if(data.x){\r\n prop.k = true;\r\n prop.x = true;\r\n prop.initiateExpression = ExpressionManager.initiateExpression;\r\n prop.effectsSequence.push(prop.initiateExpression(elem,data,prop).bind(prop));\r\n }\r\n }\r\n\r\n function getValueAtTime(frameNum) {\r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastFrame) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;\r\n this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime);\r\n this._cachingAtTime.lastFrame = frameNum;\r\n }\r\n return this._cachingAtTime.value;\r\n\r\n }\r\n\r\n function getSpeedAtTime(frameNum) {\r\n var delta = -0.01;\r\n var v1 = this.getValueAtTime(frameNum);\r\n var v2 = this.getValueAtTime(frameNum + delta);\r\n var speed = 0;\r\n if(v1.length){\r\n var i;\r\n for(i=0;i<v1.length;i+=1){\r\n speed += Math.pow(v2[i] - v1[i], 2);\r\n }\r\n speed = Math.sqrt(speed) * 100;\r\n } else {\r\n speed = 0;\r\n }\r\n return speed;\r\n }\r\n\r\n function getVelocityAtTime(frameNum) {\r\n if(this.vel !== undefined){\r\n return this.vel;\r\n }\r\n var delta = -0.001;\r\n //frameNum += this.elem.data.st;\r\n var v1 = this.getValueAtTime(frameNum);\r\n var v2 = this.getValueAtTime(frameNum + delta);\r\n var velocity;\r\n if(v1.length){\r\n velocity = createTypedArray('float32', v1.length);\r\n var i;\r\n for(i=0;i<v1.length;i+=1){\r\n //removing frameRate\r\n //if needed, don't add it here\r\n //velocity[i] = this.elem.globalData.frameRate*((v2[i] - v1[i])/delta);\r\n velocity[i] = (v2[i] - v1[i])/delta;\r\n }\r\n } else {\r\n velocity = (v2 - v1)/delta;\r\n }\r\n return velocity;\r\n }\r\n\r\n function getStaticValueAtTime() {\r\n return this.pv;\r\n }\r\n\r\n function setGroupProperty(propertyGroup){\r\n this.propertyGroup = propertyGroup;\r\n }\r\n\r\n\treturn {\r\n\t\tsearchExpressions: searchExpressions,\r\n\t\tgetSpeedAtTime: getSpeedAtTime,\r\n\t\tgetVelocityAtTime: getVelocityAtTime,\r\n\t\tgetValueAtTime: getValueAtTime,\r\n\t\tgetStaticValueAtTime: getStaticValueAtTime,\r\n\t\tsetGroupProperty: setGroupProperty,\r\n\t}\r\n}());\r\n(function addPropertyDecorator() {\r\n\r\n function loopOut(type,duration,durationFlag){\r\n if(!this.k || !this.keyframes){\r\n return this.pv;\r\n }\r\n type = type ? type.toLowerCase() : '';\r\n var currentFrame = this.comp.renderedFrame;\r\n var keyframes = this.keyframes;\r\n var lastKeyFrame = keyframes[keyframes.length - 1].t;\r\n if(currentFrame<=lastKeyFrame){\r\n return this.pv;\r\n }else{\r\n var cycleDuration, firstKeyFrame;\r\n if(!durationFlag){\r\n if(!duration || duration > keyframes.length - 1){\r\n duration = keyframes.length - 1;\r\n }\r\n firstKeyFrame = keyframes[keyframes.length - 1 - duration].t;\r\n cycleDuration = lastKeyFrame - firstKeyFrame;\r\n } else {\r\n if(!duration){\r\n cycleDuration = Math.max(0,lastKeyFrame - this.elem.data.ip);\r\n } else {\r\n cycleDuration = Math.abs(lastKeyFrame - elem.comp.globalData.frameRate*duration);\r\n }\r\n firstKeyFrame = lastKeyFrame - cycleDuration;\r\n }\r\n var i, len, ret;\r\n if(type === 'pingpong') {\r\n var iterations = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);\r\n if(iterations % 2 !== 0){\r\n return this.getValueAtTime(((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n } else if(type === 'offset'){\r\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0);\r\n var repeats = Math.floor((currentFrame - firstKeyFrame)/cycleDuration);\r\n if(this.pv.length){\r\n ret = new Array(initV.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = (endV[i]-initV[i])*repeats + current[i];\r\n }\r\n return ret;\r\n }\r\n return (endV-initV)*repeats + current;\r\n } else if(type === 'continue'){\r\n var lastValue = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp.globalData.frameRate, 0);\r\n if(this.pv.length){\r\n ret = new Array(lastValue.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = lastValue[i] + (lastValue[i]-nextLastValue[i])*((currentFrame - lastKeyFrame)/ this.comp.globalData.frameRate)/0.0005;\r\n }\r\n return ret;\r\n }\r\n return lastValue + (lastValue-nextLastValue)*(((currentFrame - lastKeyFrame))/0.001);\r\n }\r\n return this.getValueAtTime((((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n }\r\n\r\n function loopIn(type,duration, durationFlag) {\r\n if(!this.k){\r\n return this.pv;\r\n }\r\n type = type ? type.toLowerCase() : '';\r\n var currentFrame = this.comp.renderedFrame;\r\n var keyframes = this.keyframes;\r\n var firstKeyFrame = keyframes[0].t;\r\n if(currentFrame>=firstKeyFrame){\r\n return this.pv;\r\n }else{\r\n var cycleDuration, lastKeyFrame;\r\n if(!durationFlag){\r\n if(!duration || duration > keyframes.length - 1){\r\n duration = keyframes.length - 1;\r\n }\r\n lastKeyFrame = keyframes[duration].t;\r\n cycleDuration = lastKeyFrame - firstKeyFrame;\r\n } else {\r\n if(!duration){\r\n cycleDuration = Math.max(0,this.elem.data.op - firstKeyFrame);\r\n } else {\r\n cycleDuration = Math.abs(elem.comp.globalData.frameRate*duration);\r\n }\r\n lastKeyFrame = firstKeyFrame + cycleDuration;\r\n }\r\n var i, len, ret;\r\n if(type === 'pingpong') {\r\n var iterations = Math.floor((firstKeyFrame - currentFrame)/cycleDuration);\r\n if(iterations % 2 === 0){\r\n return this.getValueAtTime((((firstKeyFrame - currentFrame)%cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n } else if(type === 'offset'){\r\n var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0);\r\n var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame)%cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0);\r\n var repeats = Math.floor((firstKeyFrame - currentFrame)/cycleDuration)+1;\r\n if(this.pv.length){\r\n ret = new Array(initV.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = current[i]-(endV[i]-initV[i])*repeats;\r\n }\r\n return ret;\r\n }\r\n return current-(endV-initV)*repeats;\r\n } else if(type === 'continue'){\r\n var firstValue = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0);\r\n var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp.globalData.frameRate, 0);\r\n if(this.pv.length){\r\n ret = new Array(firstValue.length);\r\n len = ret.length;\r\n for(i=0;i<len;i+=1){\r\n ret[i] = firstValue[i] + (firstValue[i]-nextFirstValue[i])*(firstKeyFrame - currentFrame)/0.001;\r\n }\r\n return ret;\r\n }\r\n return firstValue + (firstValue-nextFirstValue)*(firstKeyFrame - currentFrame)/0.001;\r\n }\r\n return this.getValueAtTime(((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0);\r\n }\r\n }\r\n\r\n function smooth(width, samples) {\r\n if (!this.k){\r\n return this.pv;\r\n }\r\n width = (width || 0.4) * 0.5;\r\n samples = Math.floor(samples || 5);\r\n if (samples <= 1) {\r\n return this.pv;\r\n }\r\n var currentTime = this.comp.renderedFrame / this.comp.globalData.frameRate;\r\n var initFrame = currentTime - width;\r\n var endFrame = currentTime + width;\r\n var sampleFrequency = samples > 1 ? (endFrame - initFrame) / (samples - 1) : 1;\r\n var i = 0, j = 0;\r\n var value;\r\n if (this.pv.length) {\r\n value = createTypedArray('float32', this.pv.length);\r\n } else {\r\n value = 0;\r\n }\r\n var sampleValue;\r\n while (i < samples) {\r\n sampleValue = this.getValueAtTime(initFrame + i * sampleFrequency);\r\n if(this.pv.length) {\r\n for (j = 0; j < this.pv.length; j += 1) {\r\n value[j] += sampleValue[j];\r\n }\r\n } else {\r\n value += sampleValue;\r\n }\r\n i += 1;\r\n }\r\n if(this.pv.length) {\r\n for (j = 0; j < this.pv.length; j += 1) {\r\n value[j] /= samples;\r\n }\r\n } else {\r\n value /= samples;\r\n }\r\n return value;\r\n }\r\n\r\n function getValueAtTime(frameNum) {\r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastFrame) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0;\r\n this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime);\r\n this._cachingAtTime.lastFrame = frameNum;\r\n }\r\n return this._cachingAtTime.value;\r\n\r\n }\r\n\r\n function getTransformValueAtTime(time) {\r\n console.warn('Transform at time not supported');\r\n }\r\n\r\n function getTransformStaticValueAtTime(time) {\r\n\r\n }\r\n\r\n var getTransformProperty = TransformPropertyFactory.getTransformProperty;\r\n TransformPropertyFactory.getTransformProperty = function(elem, data, container) {\r\n var prop = getTransformProperty(elem, data, container);\r\n if(prop.dynamicProperties.length) {\r\n prop.getValueAtTime = getTransformValueAtTime.bind(prop);\r\n } else {\r\n prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop);\r\n }\r\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\r\n return prop;\r\n };\r\n\r\n var propertyGetProp = PropertyFactory.getProp;\r\n PropertyFactory.getProp = function(elem,data,type, mult, container){\r\n var prop = propertyGetProp(elem,data,type, mult, container);\r\n //prop.getVelocityAtTime = getVelocityAtTime;\r\n //prop.loopOut = loopOut;\r\n //prop.loopIn = loopIn;\r\n if(prop.kf){\r\n prop.getValueAtTime = expressionHelpers.getValueAtTime.bind(prop);\r\n } else {\r\n prop.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(prop);\r\n }\r\n prop.setGroupProperty = expressionHelpers.setGroupProperty;\r\n prop.loopOut = loopOut;\r\n prop.loopIn = loopIn;\r\n prop.smooth = smooth;\r\n prop.getVelocityAtTime = expressionHelpers.getVelocityAtTime.bind(prop);\r\n prop.getSpeedAtTime = expressionHelpers.getSpeedAtTime.bind(prop);\r\n prop.numKeys = data.a === 1 ? data.k.length : 0;\r\n prop.propertyIndex = data.ix;\r\n var value = 0;\r\n if(type !== 0) {\r\n value = createTypedArray('float32', data.a === 1 ? data.k[0].s.length : data.k.length);\r\n }\r\n prop._cachingAtTime = {\r\n lastFrame: initialDefaultFrame,\r\n lastIndex: 0,\r\n value: value\r\n };\r\n expressionHelpers.searchExpressions(elem,data,prop);\r\n if(prop.k){\r\n container.addDynamicProperty(prop);\r\n }\r\n\r\n return prop;\r\n };\r\n\r\n function getShapeValueAtTime(frameNum) {\r\n //For now this caching object is created only when needed instead of creating it when the shape is initialized.\r\n if (!this._cachingAtTime) {\r\n this._cachingAtTime = {\r\n shapeValue: shape_pool.clone(this.pv),\r\n lastIndex: 0,\r\n lastTime: initialDefaultFrame\r\n };\r\n }\r\n \r\n frameNum *= this.elem.globalData.frameRate;\r\n frameNum -= this.offsetTime;\r\n if(frameNum !== this._cachingAtTime.lastTime) {\r\n this._cachingAtTime.lastIndex = this._cachingAtTime.lastTime < frameNum ? this._caching.lastIndex : 0;\r\n this._cachingAtTime.lastTime = frameNum;\r\n this.interpolateShape(frameNum, this._cachingAtTime.shapeValue, this._cachingAtTime);\r\n }\r\n return this._cachingAtTime.shapeValue;\r\n }\r\n\r\n var ShapePropertyConstructorFunction = ShapePropertyFactory.getConstructorFunction();\r\n var KeyframedShapePropertyConstructorFunction = ShapePropertyFactory.getKeyframedConstructorFunction();\r\n\r\n function ShapeExpressions(){}\r\n ShapeExpressions.prototype = {\r\n vertices: function(prop, time){\r\n if (this.k) {\r\n this.getValue();\r\n }\r\n var shapePath = this.v;\r\n if(time !== undefined) {\r\n shapePath = this.getValueAtTime(time, 0);\r\n }\r\n var i, len = shapePath._length;\r\n var vertices = shapePath[prop];\r\n var points = shapePath.v;\r\n var arr = createSizedArray(len);\r\n for(i = 0; i < len; i += 1) {\r\n if(prop === 'i' || prop === 'o') {\r\n arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]];\r\n } else {\r\n arr[i] = [vertices[i][0], vertices[i][1]];\r\n }\r\n \r\n }\r\n return arr;\r\n },\r\n points: function(time){\r\n return this.vertices('v', time);\r\n },\r\n inTangents: function(time){\r\n return this.vertices('i', time);\r\n },\r\n outTangents: function(time){\r\n return this.vertices('o', time);\r\n },\r\n isClosed: function(){\r\n return this.v.c;\r\n },\r\n pointOnPath: function(perc, time){\r\n var shapePath = this.v;\r\n if(time !== undefined) {\r\n shapePath = this.getValueAtTime(time, 0);\r\n }\r\n if(!this._segmentsLength) {\r\n this._segmentsLength = bez.getSegmentsLength(shapePath);\r\n }\r\n\r\n var segmentsLength = this._segmentsLength;\r\n var lengths = segmentsLength.lengths;\r\n var lengthPos = segmentsLength.totalLength * perc;\r\n var i = 0, len = lengths.length;\r\n var j = 0, jLen;\r\n var accumulatedLength = 0, pt;\r\n while(i < len) {\r\n if(accumulatedLength + lengths[i].addedLength > lengthPos) {\r\n var initIndex = i;\r\n var endIndex = (shapePath.c && i === len - 1) ? 0 : i + 1;\r\n var segmentPerc = (lengthPos - accumulatedLength)/lengths[i].addedLength;\r\n pt = bez.getPointInSegment(shapePath.v[initIndex], shapePath.v[endIndex], shapePath.o[initIndex], shapePath.i[endIndex], segmentPerc, lengths[i]);\r\n break;\r\n } else {\r\n accumulatedLength += lengths[i].addedLength;\r\n }\r\n i += 1;\r\n }\r\n if(!pt){\r\n pt = shapePath.c ? [shapePath.v[0][0],shapePath.v[0][1]]:[shapePath.v[shapePath._length-1][0],shapePath.v[shapePath._length-1][1]];\r\n }\r\n return pt;\r\n },\r\n vectorOnPath: function(perc, time, vectorType){\r\n //perc doesn't use triple equality because it can be a Number object as well as a primitive.\r\n perc = perc == 1 ? this.v.c ? 0 : 0.999 : perc;\r\n var pt1 = this.pointOnPath(perc, time);\r\n var pt2 = this.pointOnPath(perc + 0.001, time);\r\n var xLength = pt2[0] - pt1[0];\r\n var yLength = pt2[1] - pt1[1];\r\n var magnitude = Math.sqrt(Math.pow(xLength,2) + Math.pow(yLength,2));\r\n if (magnitude === 0) {\r\n return [0,0];\r\n }\r\n var unitVector = vectorType === 'tangent' ? [xLength/magnitude, yLength/magnitude] : [-yLength/magnitude, xLength/magnitude];\r\n return unitVector;\r\n },\r\n tangentOnPath: function(perc, time){\r\n return this.vectorOnPath(perc, time, 'tangent');\r\n },\r\n normalOnPath: function(perc, time){\r\n return this.vectorOnPath(perc, time, 'normal');\r\n },\r\n setGroupProperty: expressionHelpers.setGroupProperty,\r\n getValueAtTime: expressionHelpers.getStaticValueAtTime\r\n };\r\n extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction);\r\n extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction);\r\n KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime;\r\n KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression;\r\n\r\n var propertyGetShapeProp = ShapePropertyFactory.getShapeProp;\r\n ShapePropertyFactory.getShapeProp = function(elem,data,type, arr, trims){\r\n var prop = propertyGetShapeProp(elem,data,type, arr, trims);\r\n prop.propertyIndex = data.ix;\r\n prop.lock = false;\r\n if(type === 3){\r\n expressionHelpers.searchExpressions(elem,data.pt,prop);\r\n } else if(type === 4){\r\n expressionHelpers.searchExpressions(elem,data.ks,prop);\r\n }\r\n if(prop.k){\r\n elem.addDynamicProperty(prop);\r\n }\r\n return prop;\r\n };\r\n}());\r\n(function addDecorator() {\r\n\r\n function searchExpressions(){\r\n if(this.data.d.x){\r\n this.calculateExpression = ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this);\r\n this.addEffect(this.getExpressionValue.bind(this));\r\n return true;\r\n }\r\n }\r\n\r\n TextProperty.prototype.getExpressionValue = function(currentValue, text) {\r\n var newValue = this.calculateExpression(text);\r\n if(currentValue.t !== newValue) {\r\n var newData = {};\r\n this.copyData(newData, currentValue);\r\n newData.t = newValue.toString();\r\n newData.__complete = false;\r\n return newData;\r\n }\r\n return currentValue;\r\n }\r\n\r\n TextProperty.prototype.searchProperty = function(){\r\n\r\n var isKeyframed = this.searchKeyframes();\r\n var hasExpressions = this.searchExpressions();\r\n this.kf = isKeyframed || hasExpressions;\r\n return this.kf;\r\n };\r\n\r\n TextProperty.prototype.searchExpressions = searchExpressions;\r\n \r\n}());\r\nvar ShapeExpressionInterface = (function(){\r\n\r\n function iterateElements(shapes,view, propertyGroup){\r\n var arr = [];\r\n var i, len = shapes ? shapes.length : 0;\r\n for(i=0;i<len;i+=1){\r\n if(shapes[i].ty == 'gr'){\r\n arr.push(groupInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'fl'){\r\n arr.push(fillInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'st'){\r\n arr.push(strokeInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'tm'){\r\n arr.push(trimInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'tr'){\r\n //arr.push(transformInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'el'){\r\n arr.push(ellipseInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }else if(shapes[i].ty == 'sr'){\r\n arr.push(starInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'sh'){\r\n arr.push(pathInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rc'){\r\n arr.push(rectInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rd'){\r\n arr.push(roundedInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n } else if(shapes[i].ty == 'rp'){\r\n arr.push(repeaterInterfaceFactory(shapes[i],view[i],propertyGroup));\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function contentsInterfaceFactory(shape,view, propertyGroup){\r\n var interfaces;\r\n var interfaceFunction = function _interfaceFunction(value){\r\n var i = 0, len = interfaces.length;\r\n while(i<len){\r\n if(interfaces[i]._name === value || interfaces[i].mn === value || interfaces[i].propertyIndex === value || interfaces[i].ix === value || interfaces[i].ind === value){\r\n return interfaces[i];\r\n }\r\n i+=1;\r\n }\r\n if(typeof value === 'number'){\r\n return interfaces[value-1];\r\n }\r\n };\r\n interfaceFunction.propertyGroup = function(val){\r\n if(val === 1){\r\n return interfaceFunction;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n };\r\n interfaces = iterateElements(shape.it, view.it, interfaceFunction.propertyGroup);\r\n interfaceFunction.numProperties = interfaces.length;\r\n interfaceFunction.propertyIndex = shape.cix;\r\n interfaceFunction._name = shape.nm;\r\n\r\n return interfaceFunction;\r\n }\r\n\r\n function groupInterfaceFactory(shape,view, propertyGroup){\r\n var interfaceFunction = function _interfaceFunction(value){\r\n switch(value){\r\n case 'ADBE Vectors Group':\r\n case 'Contents':\r\n case 2:\r\n return interfaceFunction.content;\r\n //Not necessary for now. Keeping them here in case a new case appears\r\n //case 'ADBE Vector Transform Group':\r\n //case 3:\r\n default:\r\n return interfaceFunction.transform;\r\n }\r\n };\r\n interfaceFunction.propertyGroup = function(val){\r\n if(val === 1){\r\n return interfaceFunction;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n };\r\n var content = contentsInterfaceFactory(shape,view,interfaceFunction.propertyGroup);\r\n var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1],view.it[view.it.length - 1],interfaceFunction.propertyGroup);\r\n interfaceFunction.content = content;\r\n interfaceFunction.transform = transformInterface;\r\n Object.defineProperty(interfaceFunction, '_name', {\r\n get: function(){\r\n return shape.nm;\r\n }\r\n });\r\n //interfaceFunction.content = interfaceFunction;\r\n interfaceFunction.numProperties = shape.np;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n interfaceFunction.nm = shape.nm;\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function fillInterfaceFactory(shape,view,propertyGroup){\r\n function interfaceFunction(val){\r\n if(val === 'Color' || val === 'color'){\r\n return interfaceFunction.color;\r\n } else if(val === 'Opacity' || val === 'opacity'){\r\n return interfaceFunction.opacity;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'color': {\r\n get: ExpressionPropertyInterface(view.c)\r\n },\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n '_name': { value: shape.nm },\r\n 'mn': { value: shape.mn }\r\n });\r\n\r\n view.c.setGroupProperty(propertyGroup);\r\n view.o.setGroupProperty(propertyGroup);\r\n return interfaceFunction;\r\n }\r\n\r\n function strokeInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val === 1){\r\n return ob;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n }\r\n function _dashPropertyGroup(val){\r\n if(val === 1){\r\n return dashOb;\r\n } else{\r\n return _propertyGroup(val-1);\r\n }\r\n }\r\n function addPropertyToDashOb(i) {\r\n Object.defineProperty(dashOb, shape.d[i].nm, {\r\n get: ExpressionPropertyInterface(view.d.dataProps[i].p)\r\n });\r\n }\r\n var i, len = shape.d ? shape.d.length : 0;\r\n var dashOb = {};\r\n for (i = 0; i < len; i += 1) {\r\n addPropertyToDashOb(i);\r\n view.d.dataProps[i].p.setGroupProperty(_dashPropertyGroup);\r\n }\r\n\r\n function interfaceFunction(val){\r\n if(val === 'Color' || val === 'color'){\r\n return interfaceFunction.color;\r\n } else if(val === 'Opacity' || val === 'opacity'){\r\n return interfaceFunction.opacity;\r\n } else if(val === 'Stroke Width' || val === 'stroke width'){\r\n return interfaceFunction.strokeWidth;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'color': {\r\n get: ExpressionPropertyInterface(view.c)\r\n },\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n 'strokeWidth': {\r\n get: ExpressionPropertyInterface(view.w)\r\n },\r\n 'dash': {\r\n get: function() {\r\n return dashOb;\r\n }\r\n },\r\n '_name': { value: shape.nm },\r\n 'mn': { value: shape.mn }\r\n });\r\n\r\n view.c.setGroupProperty(_propertyGroup);\r\n view.o.setGroupProperty(_propertyGroup);\r\n view.w.setGroupProperty(_propertyGroup);\r\n return interfaceFunction;\r\n }\r\n\r\n function trimInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n\r\n view.s.setGroupProperty(_propertyGroup);\r\n view.e.setGroupProperty(_propertyGroup);\r\n view.o.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(val){\r\n if(val === shape.e.ix || val === 'End' || val === 'end'){\r\n return interfaceFunction.end;\r\n }\r\n if(val === shape.s.ix){\r\n return interfaceFunction.start;\r\n }\r\n if(val === shape.o.ix){\r\n return interfaceFunction.offset;\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n interfaceFunction.propertyGroup = propertyGroup;\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'start': {\r\n get: ExpressionPropertyInterface(view.s)\r\n },\r\n 'end': {\r\n get: ExpressionPropertyInterface(view.e)\r\n },\r\n 'offset': {\r\n get: ExpressionPropertyInterface(view.o)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function transformInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n view.transform.mProps.o.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.p.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.a.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.s.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.r.setGroupProperty(_propertyGroup);\r\n if(view.transform.mProps.sk){\r\n view.transform.mProps.sk.setGroupProperty(_propertyGroup);\r\n view.transform.mProps.sa.setGroupProperty(_propertyGroup);\r\n }\r\n view.transform.op.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.a.ix === value || value === 'Anchor Point'){\r\n return interfaceFunction.anchorPoint;\r\n }\r\n if(shape.o.ix === value || value === 'Opacity'){\r\n return interfaceFunction.opacity;\r\n }\r\n if(shape.p.ix === value || value === 'Position'){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value || value === 'Rotation' || value === 'ADBE Vector Rotation'){\r\n return interfaceFunction.rotation;\r\n }\r\n if(shape.s.ix === value || value === 'Scale'){\r\n return interfaceFunction.scale;\r\n }\r\n if(shape.sk && shape.sk.ix === value || value === 'Skew'){\r\n return interfaceFunction.skew;\r\n }\r\n if(shape.sa && shape.sa.ix === value || value === 'Skew Axis'){\r\n return interfaceFunction.skewAxis;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'opacity': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.o)\r\n },\r\n 'position': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.p)\r\n },\r\n 'anchorPoint': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.a)\r\n },\r\n 'scale': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.s)\r\n },\r\n 'rotation': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.r)\r\n },\r\n 'skew': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.sk)\r\n },\r\n 'skewAxis': {\r\n get: ExpressionPropertyInterface(view.transform.mProps.sa)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.ty = 'tr';\r\n interfaceFunction.mn = shape.mn;\r\n interfaceFunction.propertyGroup = propertyGroup;\r\n return interfaceFunction;\r\n }\r\n\r\n function ellipseInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n interfaceFunction.propertyIndex = shape.ix;\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n prop.s.setGroupProperty(_propertyGroup);\r\n prop.p.setGroupProperty(_propertyGroup);\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.s.ix === value){\r\n return interfaceFunction.size;\r\n }\r\n }\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'size': {\r\n get: ExpressionPropertyInterface(prop.s)\r\n },\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function starInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.or.setGroupProperty(_propertyGroup);\r\n prop.os.setGroupProperty(_propertyGroup);\r\n prop.pt.setGroupProperty(_propertyGroup);\r\n prop.p.setGroupProperty(_propertyGroup);\r\n prop.r.setGroupProperty(_propertyGroup);\r\n if(shape.ir){\r\n prop.ir.setGroupProperty(_propertyGroup);\r\n prop.is.setGroupProperty(_propertyGroup);\r\n }\r\n\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value){\r\n return interfaceFunction.rotation;\r\n }\r\n if(shape.pt.ix === value){\r\n return interfaceFunction.points;\r\n }\r\n if(shape.or.ix === value || 'ADBE Vector Star Outer Radius' === value){\r\n return interfaceFunction.outerRadius;\r\n }\r\n if(shape.os.ix === value){\r\n return interfaceFunction.outerRoundness;\r\n }\r\n if(shape.ir && (shape.ir.ix === value || 'ADBE Vector Star Inner Radius' === value)){\r\n return interfaceFunction.innerRadius;\r\n }\r\n if(shape.is && shape.is.ix === value){\r\n return interfaceFunction.innerRoundness;\r\n }\r\n\r\n }\r\n\r\n Object.defineProperties(interfaceFunction, {\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n 'rotation': {\r\n get: ExpressionPropertyInterface(prop.r)\r\n },\r\n 'points': {\r\n get: ExpressionPropertyInterface(prop.pt)\r\n },\r\n 'outerRadius': {\r\n get: ExpressionPropertyInterface(prop.or)\r\n },\r\n 'outerRoundness': {\r\n get: ExpressionPropertyInterface(prop.os)\r\n },\r\n 'innerRadius': {\r\n get: ExpressionPropertyInterface(prop.ir)\r\n },\r\n 'innerRoundness': {\r\n get: ExpressionPropertyInterface(prop.is)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function rectInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.p.setGroupProperty(_propertyGroup);\r\n prop.s.setGroupProperty(_propertyGroup);\r\n prop.r.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.p.ix === value){\r\n return interfaceFunction.position;\r\n }\r\n if(shape.r.ix === value){\r\n return interfaceFunction.roundness;\r\n }\r\n if(shape.s.ix === value || value === 'Size' || value === 'ADBE Vector Rect Size'){\r\n return interfaceFunction.size;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'position': {\r\n get: ExpressionPropertyInterface(prop.p)\r\n },\r\n 'roundness': {\r\n get: ExpressionPropertyInterface(prop.r)\r\n },\r\n 'size': {\r\n get: ExpressionPropertyInterface(prop.s)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function roundedInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.rd.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.r.ix === value || 'Round Corners 1' === value){\r\n return interfaceFunction.radius;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'radius': {\r\n get: ExpressionPropertyInterface(prop.rd)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function repeaterInterfaceFactory(shape,view,propertyGroup){\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n var prop = view;\r\n interfaceFunction.propertyIndex = shape.ix;\r\n prop.c.setGroupProperty(_propertyGroup);\r\n prop.o.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(value){\r\n if(shape.c.ix === value || 'Copies' === value){\r\n return interfaceFunction.copies;\r\n } else if(shape.o.ix === value || 'Offset' === value){\r\n return interfaceFunction.offset;\r\n }\r\n\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'copies': {\r\n get: ExpressionPropertyInterface(prop.c)\r\n },\r\n 'offset': {\r\n get: ExpressionPropertyInterface(prop.o)\r\n },\r\n '_name': { value: shape.nm }\r\n });\r\n interfaceFunction.mn = shape.mn;\r\n return interfaceFunction;\r\n }\r\n\r\n function pathInterfaceFactory(shape,view,propertyGroup){\r\n var prop = view.sh;\r\n function _propertyGroup(val){\r\n if(val == 1){\r\n return interfaceFunction;\r\n } else {\r\n return propertyGroup(--val);\r\n }\r\n }\r\n prop.setGroupProperty(_propertyGroup);\r\n\r\n function interfaceFunction(val){\r\n if(val === 'Shape' || val === 'shape' || val === 'Path' || val === 'path' || val === 'ADBE Vector Shape' || val === 2){\r\n return interfaceFunction.path;\r\n }\r\n }\r\n Object.defineProperties(interfaceFunction, {\r\n 'path': {\r\n get: function(){\r\n if(prop.k){\r\n prop.getValue();\r\n }\r\n return prop;\r\n }\r\n },\r\n 'shape': {\r\n get: function(){\r\n if(prop.k){\r\n prop.getValue();\r\n }\r\n return prop;\r\n }\r\n },\r\n '_name': { value: shape.nm },\r\n 'ix': { value: shape.ix },\r\n 'propertyIndex': { value: shape.ix },\r\n 'mn': { value: shape.mn }\r\n });\r\n return interfaceFunction;\r\n }\r\n\r\n return function(shapes,view,propertyGroup) {\r\n var interfaces;\r\n function _interfaceFunction(value){\r\n if(typeof value === 'number'){\r\n return interfaces[value-1];\r\n } else {\r\n var i = 0, len = interfaces.length;\r\n while(i<len){\r\n if(interfaces[i]._name === value){\r\n return interfaces[i];\r\n }\r\n i+=1;\r\n }\r\n }\r\n }\r\n _interfaceFunction.propertyGroup = propertyGroup;\r\n interfaces = iterateElements(shapes, view, _interfaceFunction);\r\n _interfaceFunction.numProperties = interfaces.length;\r\n return _interfaceFunction;\r\n };\r\n}());\r\n\r\nvar TextExpressionInterface = (function(){\r\n\treturn function(elem){\r\n var _prevValue, _sourceText;\r\n function _thisLayerFunction(){\r\n }\r\n Object.defineProperty(_thisLayerFunction, \"sourceText\", {\r\n get: function(){\r\n elem.textProperty.getValue()\r\n var stringValue = elem.textProperty.currentData.t;\r\n if(stringValue !== _prevValue) {\r\n elem.textProperty.currentData.t = _prevValue;\r\n _sourceText = new String(stringValue);\r\n //If stringValue is an empty string, eval returns undefined, so it has to be returned as a String primitive\r\n _sourceText.value = stringValue ? stringValue : new String(stringValue);\r\n }\r\n return _sourceText;\r\n }\r\n });\r\n return _thisLayerFunction;\r\n };\r\n}());\r\nvar LayerExpressionInterface = (function (){\r\n function toWorld(arr, time){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n var transformMat;\r\n if(time) {\r\n //Todo implement value at time on transform properties\r\n //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);\r\n transformMat = this._elem.finalTransform.mProp;\r\n } else {\r\n transformMat = this._elem.finalTransform.mProp;\r\n }\r\n transformMat.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);\r\n }\r\n return toWorldMat.applyToPointArray(arr[0],arr[1],arr[2]||0);\r\n }\r\n function fromWorld(arr, time){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n var transformMat;\r\n if(time) {\r\n //Todo implement value at time on transform properties\r\n //transformMat = this._elem.finalTransform.mProp.getValueAtTime(time);\r\n transformMat = this._elem.finalTransform.mProp;\r\n } else {\r\n transformMat = this._elem.finalTransform.mProp;\r\n }\r\n transformMat.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n function fromComp(arr){\r\n var toWorldMat = new Matrix();\r\n toWorldMat.reset();\r\n this._elem.finalTransform.mProp.applyToMatrix(toWorldMat);\r\n if(this._elem.hierarchy && this._elem.hierarchy.length){\r\n var i, len = this._elem.hierarchy.length;\r\n for(i=0;i<len;i+=1){\r\n this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n return toWorldMat.inversePoint(arr);\r\n }\r\n\r\n function sampleImage() {\r\n return [1,1,1,1];\r\n }\r\n\r\n\r\n return function(elem){\r\n\r\n var transformInterface;\r\n\r\n function _registerMaskInterface(maskManager){\r\n _thisLayerFunction.mask = new MaskManagerInterface(maskManager, elem);\r\n }\r\n function _registerEffectsInterface(effects){\r\n _thisLayerFunction.effect = effects;\r\n }\r\n\r\n function _thisLayerFunction(name){\r\n switch(name){\r\n case \"ADBE Root Vectors Group\":\r\n case \"Contents\":\r\n case 2:\r\n return _thisLayerFunction.shapeInterface;\r\n case 1:\r\n case 6:\r\n case \"Transform\":\r\n case \"transform\":\r\n case \"ADBE Transform Group\":\r\n return transformInterface;\r\n case 4:\r\n case \"ADBE Effect Parade\":\r\n case \"effects\":\r\n case \"Effects\":\r\n return _thisLayerFunction.effect;\r\n }\r\n }\r\n _thisLayerFunction.toWorld = toWorld;\r\n _thisLayerFunction.fromWorld = fromWorld;\r\n _thisLayerFunction.toComp = toWorld;\r\n _thisLayerFunction.fromComp = fromComp;\r\n _thisLayerFunction.sampleImage = sampleImage;\r\n _thisLayerFunction.sourceRectAtTime = elem.sourceRectAtTime.bind(elem);\r\n _thisLayerFunction._elem = elem;\r\n transformInterface = TransformExpressionInterface(elem.finalTransform.mProp);\r\n var anchorPointDescriptor = getDescriptor(transformInterface, 'anchorPoint');\r\n Object.defineProperties(_thisLayerFunction,{\r\n hasParent: {\r\n get: function(){\r\n return elem.hierarchy.length;\r\n }\r\n },\r\n parent: {\r\n get: function(){\r\n return elem.hierarchy[0].layerInterface;\r\n }\r\n },\r\n rotation: getDescriptor(transformInterface, 'rotation'),\r\n scale: getDescriptor(transformInterface, 'scale'),\r\n position: getDescriptor(transformInterface, 'position'),\r\n opacity: getDescriptor(transformInterface, 'opacity'),\r\n anchorPoint: anchorPointDescriptor,\r\n anchor_point: anchorPointDescriptor,\r\n transform: {\r\n get: function () {\r\n return transformInterface;\r\n }\r\n },\r\n active: {\r\n get: function(){\r\n return elem.isInRange;\r\n }\r\n }\r\n });\r\n\r\n _thisLayerFunction.startTime = elem.data.st;\r\n _thisLayerFunction.index = elem.data.ind;\r\n _thisLayerFunction.source = elem.data.refId;\r\n _thisLayerFunction.height = elem.data.ty === 0 ? elem.data.h : 100;\r\n _thisLayerFunction.width = elem.data.ty === 0 ? elem.data.w : 100;\r\n _thisLayerFunction.inPoint = elem.data.ip/elem.comp.globalData.frameRate;\r\n _thisLayerFunction.outPoint = elem.data.op/elem.comp.globalData.frameRate;\r\n _thisLayerFunction._name = elem.data.nm;\r\n\r\n _thisLayerFunction.registerMaskInterface = _registerMaskInterface;\r\n _thisLayerFunction.registerEffectsInterface = _registerEffectsInterface;\r\n return _thisLayerFunction;\r\n };\r\n}());\r\n\r\nvar CompExpressionInterface = (function () {\r\n return function(comp) {\r\n function _thisLayerFunction(name) {\r\n var i = 0, len = comp.layers.length;\r\n while ( i < len) {\r\n if (comp.layers[i].nm === name || comp.layers[i].ind === name) {\r\n return comp.elements[i].layerInterface;\r\n }\r\n i += 1;\r\n }\r\n return null;\r\n //return {active:false};\r\n }\r\n Object.defineProperty(_thisLayerFunction, \"_name\", { value: comp.data.nm });\r\n _thisLayerFunction.layer = _thisLayerFunction;\r\n _thisLayerFunction.pixelAspect = 1;\r\n _thisLayerFunction.height = comp.data.h || comp.globalData.compSize.h;\r\n _thisLayerFunction.width = comp.data.w || comp.globalData.compSize.w;\r\n _thisLayerFunction.pixelAspect = 1;\r\n _thisLayerFunction.frameDuration = 1 / comp.globalData.frameRate;\r\n _thisLayerFunction.displayStartTime = 0;\r\n _thisLayerFunction.numLayers = comp.layers.length;\r\n return _thisLayerFunction;\r\n };\r\n}());\r\nvar TransformExpressionInterface = (function (){\r\n return function(transform){\r\n function _thisFunction(name){\r\n switch(name){\r\n case \"scale\":\r\n case \"Scale\":\r\n case \"ADBE Scale\":\r\n case 6:\r\n return _thisFunction.scale;\r\n case \"rotation\":\r\n case \"Rotation\":\r\n case \"ADBE Rotation\":\r\n case \"ADBE Rotate Z\":\r\n case 10:\r\n return _thisFunction.rotation;\r\n case \"ADBE Rotate X\":\r\n return _thisFunction.xRotation;\r\n case \"ADBE Rotate Y\":\r\n return _thisFunction.yRotation;\r\n case \"position\":\r\n case \"Position\":\r\n case \"ADBE Position\":\r\n case 2:\r\n return _thisFunction.position;\r\n case 'ADBE Position_0':\r\n return _thisFunction.xPosition;\r\n case 'ADBE Position_1':\r\n return _thisFunction.yPosition;\r\n case 'ADBE Position_2':\r\n return _thisFunction.zPosition;\r\n case \"anchorPoint\":\r\n case \"AnchorPoint\":\r\n case \"Anchor Point\":\r\n case \"ADBE AnchorPoint\":\r\n case 1:\r\n return _thisFunction.anchorPoint;\r\n case \"opacity\":\r\n case \"Opacity\":\r\n case 11:\r\n return _thisFunction.opacity;\r\n }\r\n }\r\n\r\n Object.defineProperty(_thisFunction, \"rotation\", {\r\n get: ExpressionPropertyInterface(transform.r || transform.rz)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"zRotation\", {\r\n get: ExpressionPropertyInterface(transform.rz || transform.r)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"xRotation\", {\r\n get: ExpressionPropertyInterface(transform.rx)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"yRotation\", {\r\n get: ExpressionPropertyInterface(transform.ry)\r\n });\r\n Object.defineProperty(_thisFunction, \"scale\", {\r\n get: ExpressionPropertyInterface(transform.s)\r\n });\r\n\r\n if(transform.p) {\r\n var _transformFactory = ExpressionPropertyInterface(transform.p);\r\n }\r\n Object.defineProperty(_thisFunction, \"position\", {\r\n get: function () {\r\n if(transform.p) {\r\n return _transformFactory();\r\n } else {\r\n return [transform.px.v, transform.py.v, transform.pz ? transform.pz.v : 0];\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"xPosition\", {\r\n get: ExpressionPropertyInterface(transform.px)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"yPosition\", {\r\n get: ExpressionPropertyInterface(transform.py)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"zPosition\", {\r\n get: ExpressionPropertyInterface(transform.pz)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"anchorPoint\", {\r\n get: ExpressionPropertyInterface(transform.a)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"opacity\", {\r\n get: ExpressionPropertyInterface(transform.o)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"skew\", {\r\n get: ExpressionPropertyInterface(transform.sk)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"skewAxis\", {\r\n get: ExpressionPropertyInterface(transform.sa)\r\n });\r\n\r\n Object.defineProperty(_thisFunction, \"orientation\", {\r\n get: ExpressionPropertyInterface(transform.or)\r\n });\r\n\r\n return _thisFunction;\r\n };\r\n}());\r\nvar ProjectInterface = (function (){\r\n\r\n function registerComposition(comp){\r\n this.compositions.push(comp);\r\n }\r\n\r\n return function(){\r\n function _thisProjectFunction(name){\r\n var i = 0, len = this.compositions.length;\r\n while(i<len){\r\n if(this.compositions[i].data && this.compositions[i].data.nm === name){\r\n if(this.compositions[i].prepareFrame && this.compositions[i].data.xt) {\r\n this.compositions[i].prepareFrame(this.currentFrame);\r\n }\r\n return this.compositions[i].compInterface;\r\n }\r\n i+=1;\r\n }\r\n }\r\n\r\n _thisProjectFunction.compositions = [];\r\n _thisProjectFunction.currentFrame = 0;\r\n\r\n _thisProjectFunction.registerComposition = registerComposition;\r\n\r\n\r\n\r\n return _thisProjectFunction;\r\n };\r\n}());\r\nvar EffectsExpressionInterface = (function (){\r\n var ob = {\r\n createEffectsInterface: createEffectsInterface\r\n };\r\n\r\n function createEffectsInterface(elem, propertyGroup){\r\n if(elem.effectsManager){\r\n\r\n var effectElements = [];\r\n var effectsData = elem.data.ef;\r\n var i, len = elem.effectsManager.effectElements.length;\r\n for(i=0;i<len;i+=1){\r\n effectElements.push(createGroupInterface(effectsData[i],elem.effectsManager.effectElements[i],propertyGroup,elem));\r\n }\r\n\r\n return function(name){\r\n var effects = elem.data.ef || [], i = 0, len = effects.length;\r\n while(i<len) {\r\n if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){\r\n return effectElements[i];\r\n }\r\n i += 1;\r\n }\r\n };\r\n }\r\n }\r\n\r\n function createGroupInterface(data,elements, propertyGroup, elem){\r\n var effectElements = [];\r\n var i, len = data.ef.length;\r\n for(i=0;i<len;i+=1){\r\n if(data.ef[i].ty === 5){\r\n effectElements.push(createGroupInterface(data.ef[i],elements.effectElements[i],elements.effectElements[i].propertyGroup, elem));\r\n } else {\r\n effectElements.push(createValueInterface(elements.effectElements[i],data.ef[i].ty, elem, _propertyGroup));\r\n }\r\n }\r\n\r\n function _propertyGroup(val) {\r\n if(val === 1){\r\n return groupInterface;\r\n } else{\r\n return propertyGroup(val-1);\r\n }\r\n }\r\n\r\n var groupInterface = function(name){\r\n var effects = data.ef, i = 0, len = effects.length;\r\n while(i<len) {\r\n if(name === effects[i].nm || name === effects[i].mn || name === effects[i].ix){\r\n if(effects[i].ty === 5){\r\n return effectElements[i];\r\n } else {\r\n return effectElements[i]();\r\n }\r\n }\r\n i += 1;\r\n }\r\n return effectElements[0]();\r\n };\r\n\r\n groupInterface.propertyGroup = _propertyGroup;\r\n\r\n if(data.mn === 'ADBE Color Control'){\r\n Object.defineProperty(groupInterface, 'color', {\r\n get: function(){\r\n return effectElements[0]();\r\n }\r\n });\r\n }\r\n Object.defineProperty(groupInterface, 'numProperties', {\r\n get: function(){\r\n return data.np;\r\n }\r\n });\r\n groupInterface.active = groupInterface.enabled = data.en !== 0;\r\n return groupInterface;\r\n }\r\n\r\n function createValueInterface(element, type, elem, propertyGroup){\r\n var expressionProperty = ExpressionPropertyInterface(element.p);\r\n function interfaceFunction(){\r\n if(type === 10){\r\n return elem.comp.compInterface(element.p.v);\r\n }\r\n return expressionProperty();\r\n }\r\n\r\n if(element.p.setGroupProperty) {\r\n element.p.setGroupProperty(propertyGroup);\r\n }\r\n\r\n return interfaceFunction;\r\n }\r\n\r\n return ob;\r\n\r\n}());\r\nvar MaskManagerInterface = (function(){\r\n\r\n\tfunction MaskInterface(mask, data){\r\n\t\tthis._mask = mask;\r\n\t\tthis._data = data;\r\n\t}\r\n\tObject.defineProperty(MaskInterface.prototype, 'maskPath', {\r\n get: function(){\r\n if(this._mask.prop.k){\r\n this._mask.prop.getValue();\r\n }\r\n return this._mask.prop;\r\n }\r\n });\r\n\tObject.defineProperty(MaskInterface.prototype, 'maskOpacity', {\r\n get: function(){\r\n if(this._mask.op.k){\r\n this._mask.op.getValue();\r\n }\r\n return this._mask.op.v * 100;\r\n }\r\n });\r\n\r\n\tvar MaskManager = function(maskManager, elem){\r\n\t\tvar _maskManager = maskManager;\r\n\t\tvar _elem = elem;\r\n\t\tvar _masksInterfaces = createSizedArray(maskManager.viewData.length);\r\n\t\tvar i, len = maskManager.viewData.length;\r\n\t\tfor(i = 0; i < len; i += 1) {\r\n\t\t\t_masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]);\r\n\t\t}\r\n\r\n\t\tvar maskFunction = function(name){\r\n\t\t\ti = 0;\r\n\t\t while(i<len){\r\n\t\t if(maskManager.masksProperties[i].nm === name){\r\n\t\t return _masksInterfaces[i];\r\n\t\t }\r\n\t\t i += 1;\r\n\t\t }\r\n\t\t};\r\n\t\treturn maskFunction;\r\n\t};\r\n\treturn MaskManager;\r\n}());\r\n\r\nvar ExpressionPropertyInterface = (function() {\r\n\r\n var defaultUnidimensionalValue = {pv:0, v:0, mult: 1}\r\n var defaultMultidimensionalValue = {pv:[0,0,0], v:[0,0,0], mult: 1}\r\n\r\n function completeProperty(expressionValue, property, type) {\r\n Object.defineProperty(expressionValue, 'velocity', {\r\n get: function(){\r\n return property.getVelocityAtTime(property.comp.currentFrame);\r\n }\r\n });\r\n expressionValue.numKeys = property.keyframes ? property.keyframes.length : 0;\r\n expressionValue.key = function(pos) {\r\n if (!expressionValue.numKeys) {\r\n return 0;\r\n } else {\r\n var value = '';\r\n if ('s' in property.keyframes[pos-1]) {\r\n value = property.keyframes[pos-1].s;\r\n } else if ('e' in property.keyframes[pos-2]) {\r\n value = property.keyframes[pos-2].e;\r\n } else {\r\n value = property.keyframes[pos-2].s;\r\n }\r\n var valueProp = type === 'unidimensional' ? new Number(value) : Object.assign({}, value);\r\n valueProp.time = property.keyframes[pos-1].t / property.elem.comp.globalData.frameRate;\r\n return valueProp;\r\n }\r\n };\r\n expressionValue.valueAtTime = property.getValueAtTime;\r\n expressionValue.speedAtTime = property.getSpeedAtTime;\r\n expressionValue.velocityAtTime = property.getVelocityAtTime;\r\n expressionValue.propertyGroup = property.propertyGroup;\r\n }\r\n\r\n function UnidimensionalPropertyInterface(property) {\r\n if(!property || !('pv' in property)) {\r\n property = defaultUnidimensionalValue;\r\n }\r\n var mult = 1 / property.mult;\r\n var val = property.pv * mult;\r\n var expressionValue = new Number(val);\r\n expressionValue.value = val;\r\n completeProperty(expressionValue, property, 'unidimensional');\r\n\r\n return function() {\r\n if (property.k) {\r\n property.getValue();\r\n }\r\n val = property.v * mult;\r\n if(expressionValue.value !== val) {\r\n expressionValue = new Number(val);\r\n expressionValue.value = val;\r\n completeProperty(expressionValue, property, 'unidimensional');\r\n }\r\n return expressionValue;\r\n }\r\n }\r\n\r\n function MultidimensionalPropertyInterface(property) {\r\n if(!property || !('pv' in property)) {\r\n property = defaultMultidimensionalValue;\r\n }\r\n var mult = 1 / property.mult;\r\n var len = property.pv.length;\r\n var expressionValue = createTypedArray('float32', len);\r\n var arrValue = createTypedArray('float32', len);\r\n expressionValue.value = arrValue;\r\n completeProperty(expressionValue, property, 'multidimensional');\r\n\r\n return function() {\r\n if (property.k) {\r\n property.getValue();\r\n }\r\n for (var i = 0; i < len; i += 1) {\r\n expressionValue[i] = arrValue[i] = property.v[i] * mult;\r\n }\r\n return expressionValue;\r\n }\r\n }\r\n\r\n //TODO: try to avoid using this getter\r\n function defaultGetter() {\r\n return defaultUnidimensionalValue;\r\n }\r\n \r\n return function(property) {\r\n if(!property) {\r\n return defaultGetter;\r\n } else if (property.propType === 'unidimensional') {\r\n return UnidimensionalPropertyInterface(property);\r\n } else {\r\n return MultidimensionalPropertyInterface(property);\r\n }\r\n }\r\n}());\r\n\r\n(function(){\r\n\r\n var TextExpressionSelectorProp = (function(){\r\n\r\n function getValueProxy(index,total){\r\n this.textIndex = index+1;\r\n this.textTotal = total;\r\n this.v = this.getValue() * this.mult;\r\n return this.v;\r\n }\r\n\r\n return function TextExpressionSelectorProp(elem,data){\r\n this.pv = 1;\r\n this.comp = elem.comp;\r\n this.elem = elem;\r\n this.mult = 0.01;\r\n this.propType = 'textSelector';\r\n this.textTotal = data.totalChars;\r\n this.selectorValue = 100;\r\n this.lastValue = [1,1,1];\r\n this.k = true;\r\n this.x = true;\r\n this.getValue = ExpressionManager.initiateExpression.bind(this)(elem,data,this);\r\n this.getMult = getValueProxy;\r\n this.getVelocityAtTime = expressionHelpers.getVelocityAtTime;\r\n if(this.kf){\r\n this.getValueAtTime = expressionHelpers.getValueAtTime.bind(this);\r\n } else {\r\n this.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(this);\r\n }\r\n this.setGroupProperty = expressionHelpers.setGroupProperty;\r\n };\r\n }());\r\n\r\n\tvar propertyGetTextProp = TextSelectorProp.getTextSelectorProp;\r\n\tTextSelectorProp.getTextSelectorProp = function(elem, data,arr){\r\n\t if(data.t === 1){\r\n\t return new TextExpressionSelectorProp(elem, data,arr);\r\n\t } else {\r\n\t return propertyGetTextProp(elem,data,arr);\r\n\t }\r\n\t};\r\n}());\r\nfunction SliderEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction AngleEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction ColorEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,1,0,container);\r\n}\r\nfunction PointEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,1,0,container);\r\n}\r\nfunction LayerIndexEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction MaskIndexEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction CheckboxEffect(data,elem, container){\r\n this.p = PropertyFactory.getProp(elem,data.v,0,0,container);\r\n}\r\nfunction NoValueEffect(){\r\n this.p = {};\r\n}\r\nfunction EffectsManager(){}\r\nfunction EffectsManager(data,element){\r\n var effects = data.ef || [];\r\n this.effectElements = [];\r\n var i,len = effects.length;\r\n var effectItem;\r\n for(i=0;i<len;i++) {\r\n effectItem = new GroupEffect(effects[i],element);\r\n this.effectElements.push(effectItem);\r\n }\r\n}\r\n\r\nfunction GroupEffect(data,element){\r\n this.init(data,element);\r\n}\r\n\r\nextendPrototype([DynamicPropertyContainer], GroupEffect);\r\n\r\nGroupEffect.prototype.getValue = GroupEffect.prototype.iterateDynamicProperties;\r\n\r\nGroupEffect.prototype.init = function(data,element){\r\n this.data = data;\r\n this.effectElements = [];\r\n this.initDynamicPropertyContainer(element);\r\n var i, len = this.data.ef.length;\r\n var eff, effects = this.data.ef;\r\n for(i=0;i<len;i+=1){\r\n eff = null;\r\n switch(effects[i].ty){\r\n case 0:\r\n eff = new SliderEffect(effects[i],element,this);\r\n break;\r\n case 1:\r\n eff = new AngleEffect(effects[i],element,this);\r\n break;\r\n case 2:\r\n eff = new ColorEffect(effects[i],element,this);\r\n break;\r\n case 3:\r\n eff = new PointEffect(effects[i],element,this);\r\n break;\r\n case 4:\r\n case 7:\r\n eff = new CheckboxEffect(effects[i],element,this);\r\n break;\r\n case 10:\r\n eff = new LayerIndexEffect(effects[i],element,this);\r\n break;\r\n case 11:\r\n eff = new MaskIndexEffect(effects[i],element,this);\r\n break;\r\n case 5:\r\n eff = new EffectsManager(effects[i],element,this);\r\n break;\r\n //case 6:\r\n default:\r\n eff = new NoValueEffect(effects[i],element,this);\r\n break;\r\n }\r\n if(eff) {\r\n this.effectElements.push(eff);\r\n }\r\n }\r\n};\r\n\r\n var lottiejs = {};\r\n\r\n var _isFrozen = false;\r\n\r\n function setLocationHref (href) {\r\n locationHref = href;\r\n }\r\n\r\n function searchAnimations() {\r\n if (standalone === true) {\r\n animationManager.searchAnimations(animationData, standalone, renderer);\r\n } else {\r\n animationManager.searchAnimations();\r\n }\r\n }\r\n\r\n function setSubframeRendering(flag) {\r\n subframeEnabled = flag;\r\n }\r\n\r\n function loadAnimation(params) {\r\n if (standalone === true) {\r\n params.animationData = JSON.parse(animationData);\r\n }\r\n return animationManager.loadAnimation(params);\r\n }\r\n\r\n function setQuality(value) {\r\n if (typeof value === 'string') {\r\n switch (value) {\r\n case 'high':\r\n defaultCurveSegments = 200;\r\n break;\r\n case 'medium':\r\n defaultCurveSegments = 50;\r\n break;\r\n case 'low':\r\n defaultCurveSegments = 10;\r\n break;\r\n }\r\n } else if (!isNaN(value) && value > 1) {\r\n defaultCurveSegments = value;\r\n }\r\n if (defaultCurveSegments >= 50) {\r\n roundValues(false);\r\n } else {\r\n roundValues(true);\r\n }\r\n }\r\n\r\n function inBrowser() {\r\n return typeof navigator !== 'undefined';\r\n }\r\n\r\n function installPlugin(type, plugin) {\r\n if (type === 'expressions') {\r\n expressionsPlugin = plugin;\r\n }\r\n }\r\n\r\n function getFactory(name) {\r\n switch (name) {\r\n case \"propertyFactory\":\r\n return PropertyFactory;\r\n case \"shapePropertyFactory\":\r\n return ShapePropertyFactory;\r\n case \"matrix\":\r\n return Matrix;\r\n }\r\n }\r\n\r\n lottiejs.play = animationManager.play;\r\n lottiejs.pause = animationManager.pause;\r\n lottiejs.setLocationHref = setLocationHref;\r\n lottiejs.togglePause = animationManager.togglePause;\r\n lottiejs.setSpeed = animationManager.setSpeed;\r\n lottiejs.setDirection = animationManager.setDirection;\r\n lottiejs.stop = animationManager.stop;\r\n lottiejs.searchAnimations = searchAnimations;\r\n lottiejs.registerAnimation = animationManager.registerAnimation;\r\n lottiejs.loadAnimation = loadAnimation;\r\n lottiejs.setSubframeRendering = setSubframeRendering;\r\n lottiejs.resize = animationManager.resize;\r\n //lottiejs.start = start;\r\n lottiejs.goToAndStop = animationManager.goToAndStop;\r\n lottiejs.destroy = animationManager.destroy;\r\n lottiejs.setQuality = setQuality;\r\n lottiejs.inBrowser = inBrowser;\r\n lottiejs.installPlugin = installPlugin;\r\n lottiejs.freeze = animationManager.freeze;\r\n lottiejs.unfreeze = animationManager.unfreeze;\r\n lottiejs.getRegisteredAnimations = animationManager.getRegisteredAnimations;\r\n lottiejs.__getFactory = getFactory;\r\n lottiejs.version = '5.5.9';\r\n\r\n function checkReady() {\r\n if (document.readyState === \"complete\") {\r\n clearInterval(readyStateCheckInterval);\r\n searchAnimations();\r\n }\r\n }\r\n\r\n function getQueryVariable(variable) {\r\n var vars = queryString.split('&');\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split('=');\r\n if (decodeURIComponent(pair[0]) == variable) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n }\r\n var standalone = '__[STANDALONE]__';\r\n var animationData = '__[ANIMATIONDATA]__';\r\n var renderer = '';\r\n if (standalone) {\r\n var scripts = document.getElementsByTagName('script');\r\n var index = scripts.length - 1;\r\n var myScript = scripts[index] || {\r\n src: ''\r\n };\r\n var queryString = myScript.src.replace(/^[^\\?]+\\??/, '');\r\n renderer = getQueryVariable('renderer');\r\n }\r\n var readyStateCheckInterval = setInterval(checkReady, 100);\r\n return lottiejs;\r\n}));\r\n"
},
{
"id": 11,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/runtime/getUrl.js",
"name": "./node_modules/css-loader/dist/runtime/getUrl.js",
"index": 9,
"index2": 6,
"size": 626,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/getUrl.js",
"loc": "3:13-76"
},
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../../node_modules/css-loader/dist/runtime/getUrl.js",
"loc": "3:13-76"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\n\nmodule.exports = function (url, needQuotes) {\n // eslint-disable-next-line no-underscore-dangle, no-param-reassign\n url = url.__esModule ? url.default : url;\n\n if (typeof url !== 'string') {\n return url;\n } // If url is already wrapped in quotes, remove them\n\n\n if (/^['\"].*['\"]$/.test(url)) {\n // eslint-disable-next-line no-param-reassign\n url = url.slice(1, -1);\n } // Should url be wrapped?\n // See https://drafts.csswg.org/css-values-3/#urls\n\n\n if (/[\"'() \\t\\n]/.test(url) || needQuotes) {\n return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n'), \"\\\"\");\n }\n\n return url;\n};"
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"index": 18,
"index2": 37,
"size": 229721,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "../lib/services",
"loc": "6:17-43"
},
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./lib/services",
"loc": "10:17-42"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __spread = (this && this.__spread) || function () {\n for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));\n return ar;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"./mtproto\");\nvar utils_1 = require(\"./utils\");\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar richtextprocessor_1 = require(\"./richtextprocessor\");\nvar misc_1 = require(\"../components/misc\");\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar bin_utils_1 = require(\"./bin_utils\");\nvar lottie_web_1 = __importDefault(require(\"lottie-web\"));\nlottie_web_1.default.setQuality('low');\nvar _ = function (str) { return str; };\nvar $rootScope = {\n $broadcast: function (name, detail) {\n console.log(utils_1.dT(), 'Broadcasting ' + name + ' event, with args:', detail);\n //console.trace();\n var myCustomEvent = new CustomEvent(name, { detail: detail });\n document.dispatchEvent(myCustomEvent);\n },\n $on: function (name, callback) {\n document.addEventListener(name, callback);\n },\n selectedPeerID: 0,\n idle: {\n isIDLE: false\n }\n};\nvar AppUsersManager = /** @class */ (function () {\n function AppUsersManager() {\n var _this = this;\n this.users = {};\n this.usernames = {};\n this.userAccess = {};\n this.cachedPhotoLocations = {};\n this.contactsIndex = utils_1.SearchIndexManager.createIndex();\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n setInterval(this.updateUsersStatuses.bind(this), 60000);\n $rootScope.$on('stateSynchronized', this.updateUsersStatuses.bind(this));\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n console.log('on apiUpdate', update);\n switch (update._) {\n case 'updateUserStatus':\n var userID = update.user_id;\n var user = _this.users[userID];\n if (user) {\n user.status = update.status;\n if (user.status) {\n if (user.status.expires) {\n user.status.expires -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (user.status.was_online) {\n user.status.was_online -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n }\n user.sortStatus = _this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', userID);\n }\n else\n console.warn('No user by id:', userID);\n break;\n case 'updateUserPhoto':\n var userID = update.user_id;\n var user = _this.users[userID];\n if (user) {\n _this.forceUserOnline(userID);\n if (!user.photo) {\n user.photo = update.photo;\n }\n else {\n utils_1.safeReplaceObject(user.photo, update.photo);\n }\n if (_this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(_this.cachedPhotoLocations[userID], update.photo ?\n update.photo : { empty: true });\n }\n $rootScope.$broadcast('user_update', userID);\n }\n else\n console.warn('No user by id:', userID);\n break;\n case 'updateContactLink':\n _this.onContactUpdated(update.user_id, update.my_link._ == 'contactLinkContact');\n break;\n }\n });\n }\n /* public fillContacts () {\n if(this.contactsFillPromise) {\n return this.contactsFillPromise;\n }\n \n return this.contactsFillPromise = MTProto.apiManager.invokeApi('contacts.getContacts', {\n hash: 0\n }).then((result: any) => {\n var userID, searchText;\n var i;\n this.contactsList = [];\n this.saveApiUsers(result.users);\n \n for(var i = 0; i < result.contacts.length; i++) {\n userID = result.contacts[i].user_id\n this.contactsList.push(userID);\n //SearchIndexManager.indexObject(userID, getUserSearchText(userID), contactsIndex); WARNING\n }\n \n return this.contactsList;\n })\n } */\n AppUsersManager.prototype.getUserSearchText = function (id) {\n var user = this.users[id];\n if (!user) {\n return false;\n }\n var serviceText = '';\n if (user.pFlags.self) {\n serviceText = 'user_name_saved_msgs_raw';\n }\n return (user.first_name || '') +\n ' ' + (user.last_name || '') +\n ' ' + (user.phone || '') +\n ' ' + (user.username || '') +\n ' ' + serviceText;\n };\n /* function getContacts (query) {\n return fillContacts().then(function (contactsList) {\n if (angular.isString(query) && query.length) {\n var results = SearchIndexManager.search(query, contactsIndex)\n var filteredContactsList = []\n \n for (var i = 0; i < contactsList.length; i++) {\n if (results[contactsList[i]]) {\n filteredContactsList.push(contactsList[i])\n }\n }\n contactsList = filteredContactsList\n }\n \n contactsList.sort(function (userID1, userID2) {\n var sortName1 = (users[userID1] || {}.sortName) || ''\n var sortName2 = (users[userID2] || {}.sortName) || ''\n if (sortName1 == sortName2) {\n return 0\n }\n return sortName1 > sortName2 ? 1 : -1\n })\n \n return contactsList\n })\n } */\n AppUsersManager.prototype.resolveUsername = function (username) {\n return this.usernames[username] || 0;\n };\n AppUsersManager.prototype.saveApiUsers = function (apiUsers) {\n // @ts-ignore\n apiUsers.forEach(this.saveApiUser.bind(this));\n };\n AppUsersManager.prototype.saveApiUser = function (apiUser, noReplace) {\n if (!utils_1.isObject(apiUser) ||\n noReplace && utils_1.isObject(this.users[apiUser.id]) && this.users[apiUser.id].first_name) {\n return;\n }\n var userID = apiUser.id;\n var result = this.users[userID];\n if (apiUser.pFlags === undefined) {\n apiUser.pFlags = {};\n }\n if (apiUser.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiUser.phone) {\n //apiUser.rPhone = $filter('phoneNumber')(apiUser.phone); // warning\n }\n apiUser.num = (Math.abs(userID) % 8) + 1;\n if (apiUser.first_name) {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name, { noLinks: true, noLinebreaks: true });\n apiUser.rFullName = apiUser.last_name ? richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.first_name + ' ' + (apiUser.last_name || ''), { noLinks: true, noLinebreaks: true }) : apiUser.rFirstName;\n }\n else {\n apiUser.rFirstName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_first_name_deleted';\n apiUser.rFullName = richtextprocessor_1.RichTextProcessor.wrapRichText(apiUser.last_name, { noLinks: true, noLinebreaks: true }) || apiUser.rPhone || 'user_name_deleted';\n }\n if (apiUser.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiUser.username);\n this.usernames[searchUsername] = userID;\n }\n apiUser.sortName = apiUser.pFlags.deleted ? '' : utils_1.SearchIndexManager.cleanSearchText(apiUser.first_name + ' ' + (apiUser.last_name || ''));\n var nameWords = apiUser.sortName.split(' ');\n var firstWord = nameWords.shift();\n var lastWord = nameWords.pop();\n apiUser.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n if (apiUser.status) {\n if (apiUser.status.expires) {\n apiUser.status.expires -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (apiUser.status.was_online) {\n apiUser.status.was_online -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n }\n if (apiUser.pFlags.bot) {\n apiUser.sortStatus = -1;\n }\n else {\n apiUser.sortStatus = this.getUserStatusForSort(apiUser.status);\n }\n var result = this.users[userID];\n if (result === undefined) {\n result = this.users[userID] = apiUser;\n }\n else {\n utils_1.safeReplaceObject(result, apiUser);\n }\n $rootScope.$broadcast('user_update', userID);\n if (this.cachedPhotoLocations[userID] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[userID], apiUser &&\n apiUser.photo ? apiUser.photo : { empty: true });\n }\n };\n AppUsersManager.prototype.saveUserAccess = function (id, accessHash) {\n this.userAccess[id] = accessHash;\n };\n AppUsersManager.prototype.getUserStatusForSort = function (status) {\n if (status) {\n var expires = status.expires || status.was_online;\n if (expires) {\n return expires;\n }\n var timeNow = utils_1.tsNow(true);\n switch (status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n }\n }\n return 0;\n };\n AppUsersManager.prototype.getUser = function (id) {\n if (utils_1.isObject(id)) {\n return id;\n }\n return this.users[id] || { id: id, deleted: true, num: 1, access_hash: this.userAccess[id] };\n };\n AppUsersManager.prototype.getSelf = function () {\n return this.getUser(this.myID);\n };\n AppUsersManager.prototype.isBot = function (id) {\n return this.users[id] && this.users[id].pFlags.bot;\n };\n AppUsersManager.prototype.hasUser = function (id, allowMin) {\n var user = this.users[id];\n return utils_1.isObject(user) && (allowMin || !user.pFlags.min);\n };\n AppUsersManager.prototype.getUserPhoto = function (id) {\n var user = this.getUser(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = user && user.photo ? user.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n };\n AppUsersManager.prototype.getUserString = function (id) {\n var user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n };\n AppUsersManager.prototype.getUserInput = function (id) {\n var user = this.getUser(id);\n if (user.pFlags.self) {\n return { _: 'inputUserSelf' };\n }\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash || 0\n };\n };\n AppUsersManager.prototype.updateUsersStatuses = function () {\n var timestampNow = utils_1.tsNow(true);\n for (var i in this.users) {\n var user = this.users[i];\n if (user.status &&\n user.status._ == 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = user.status.wasStatus || { _: 'userStatusOffline', was_online: user.status.expires };\n delete user.status.wasStatus;\n $rootScope.$broadcast('user_update', user.id);\n }\n }\n };\n AppUsersManager.prototype.forceUserOnline = function (id) {\n if (this.isBot(id)) {\n return;\n }\n var user = this.getUser(id);\n if (user &&\n user.status &&\n user.status._ != 'userStatusOnline' &&\n user.status._ != 'userStatusEmpty') {\n var wasStatus;\n if (user.status._ != 'userStatusOffline') {\n delete user.status.wasStatus;\n wasStatus = utils_1.copy(user.status);\n }\n user.status = {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 60,\n wasStatus: wasStatus\n };\n user.sortStatus = this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', id);\n }\n };\n AppUsersManager.prototype.wrapForFull = function (id) {\n var user = this.getUser(id);\n return user;\n };\n /* public openUser(userID: number, override) {\n var scope = $rootScope.$new()\n scope.userID = userID\n scope.override = override || {}\n \n var modalInstance = $modal.open({\n templateUrl: templateUrl('user_modal'),\n controller: 'UserModalController',\n scope: scope,\n windowClass: 'user_modal_window mobile_modal',\n backdrop: 'single'\n })\n } */\n /* function importContact (phone, firstName, lastName) {\n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: [{\n _: 'inputPhoneContact',\n client_id: '1',\n phone: phone,\n first_name: firstName,\n last_name: lastName\n }],\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var foundUserID = false\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(foundUserID = importedContact.user_id, true)\n })\n \n return foundUserID || false\n })\n }\n \n function importContacts (contacts) {\n var inputContacts = [],\n i\n var j\n \n for (i = 0; i < contacts.length; i++) {\n for (j = 0; j < contacts[i].phones.length; j++) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n })\n }\n }\n \n return MtpApiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts,\n replace: false\n }).then(function (importedContactsResult) {\n saveApiUsers(importedContactsResult.users)\n \n var result = []\n angular.forEach(importedContactsResult.imported, function (importedContact) {\n onContactUpdated(importedContact.user_id, true)\n result.push(importedContact.user_id)\n })\n \n return result\n })\n } */\n AppUsersManager.prototype.deleteContacts = function (userIDs) {\n var _this = this;\n var ids = [];\n userIDs.forEach(function (userID) {\n ids.push(_this.getUserInput(userID));\n });\n return mtproto_1.MTProto.apiManager.invokeApi('contacts.deleteContacts', {\n id: ids\n }).then(function () {\n userIDs.forEach(function (userID) {\n _this.onContactUpdated(userID, false);\n });\n });\n };\n AppUsersManager.prototype.onContactUpdated = function (userID, isContact) {\n userID = parseInt('' + userID);\n if (Array.isArray(this.contactsList)) {\n var curPos = this.contactsList.indexOf(userID);\n var curIsContact = curPos != -1;\n if (isContact != curIsContact) {\n if (isContact) {\n this.contactsList.push(userID);\n utils_1.SearchIndexManager.indexObject(userID, this.getUserSearchText(userID), this.contactsIndex);\n }\n else {\n this.contactsList.splice(curPos, 1);\n }\n $rootScope.$broadcast('contacts_update', userID);\n }\n }\n };\n /* function openImportContact () {\n return $modal.open({\n templateUrl: templateUrl('import_contact_modal'),\n controller: 'ImportContactModalController',\n windowClass: 'md_simple_modal_window mobile_modal'\n }).result.then(function (foundUserID) {\n if (!foundUserID) {\n return $q.reject()\n }\n return foundUserID\n })\n } */\n AppUsersManager.prototype.setUserStatus = function (userID, offline) {\n if (this.isBot(userID)) {\n return;\n }\n var user = this.users[userID];\n if (user) {\n var status = offline ? {\n _: 'userStatusOffline',\n was_online: utils_1.tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: utils_1.tsNow(true) + 500\n };\n user.status = status;\n user.sortStatus = this.getUserStatusForSort(user.status);\n $rootScope.$broadcast('user_update', userID);\n }\n };\n return AppUsersManager;\n}());\nvar AppChatsManager = /** @class */ (function () {\n function AppChatsManager() {\n this.chats = {};\n this.usernames = {};\n this.channelAccess = {};\n this.megagroups = {};\n this.cachedPhotoLocations = {};\n $rootScope.$on('apiUpdate', function (e) {\n // console.log('on apiUpdate', update)\n var update = e.detail;\n switch (update._) {\n case 'updateChannel':\n var channelID = update.channel_id;\n $rootScope.$broadcast('channel_settings', { channelID: channelID });\n break;\n }\n });\n }\n AppChatsManager.prototype.saveApiChats = function (apiChats) {\n apiChats.forEach(this.saveApiChat.bind(this));\n };\n AppChatsManager.prototype.saveApiChat = function (apiChat) {\n if (!utils_1.isObject(apiChat)) {\n return;\n }\n apiChat.rTitle = apiChat.title || 'chat_title_deleted';\n apiChat.rTitle = richtextprocessor_1.RichTextProcessor.wrapRichText(apiChat.title, { noLinks: true, noLinebreaks: true }) || 'chat_title_deleted';\n var result = this.chats[apiChat.id];\n var titleWords = utils_1.SearchIndexManager.cleanSearchText(apiChat.title || '').split(' ');\n var firstWord = titleWords.shift();\n var lastWord = titleWords.pop();\n apiChat.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1));\n apiChat.num = (Math.abs(apiChat.id >> 1) % 8) + 1;\n if (apiChat.pFlags === undefined) {\n apiChat.pFlags = {};\n }\n if (apiChat.pFlags.min) {\n if (result !== undefined) {\n return;\n }\n }\n if (apiChat._ == 'channel' &&\n apiChat.participants_count === undefined &&\n result !== undefined &&\n result.participants_count) {\n apiChat.participants_count = result.participants_count;\n }\n if (apiChat.username) {\n var searchUsername = utils_1.SearchIndexManager.cleanUsername(apiChat.username);\n this.usernames[searchUsername] = apiChat.id;\n }\n if (result === undefined) {\n result = this.chats[apiChat.id] = apiChat;\n }\n else {\n utils_1.safeReplaceObject(result, apiChat);\n $rootScope.$broadcast('chat_update', apiChat.id);\n }\n if (this.cachedPhotoLocations[apiChat.id] !== undefined) {\n utils_1.safeReplaceObject(this.cachedPhotoLocations[apiChat.id], apiChat &&\n apiChat.photo ? apiChat.photo : { empty: true });\n }\n };\n AppChatsManager.prototype.getChat = function (id) {\n return this.chats[id] || { id: id, deleted: true, access_hash: this.channelAccess[id] };\n };\n AppChatsManager.prototype.hasRights = function (id, action) {\n if (!(id in this.chats)) {\n return false;\n }\n var chat = this.getChat(id);\n if (chat._ == 'chatForbidden' ||\n chat._ == 'channelForbidden' ||\n chat.pFlags.kicked ||\n chat.pFlags.left) {\n return false;\n }\n if (chat.pFlags.creator) {\n return true;\n }\n switch (action) {\n case 'send':\n if (chat._ == 'channel' &&\n !chat.pFlags.megagroup &&\n !chat.pFlags.editor) {\n return false;\n }\n break;\n case 'edit_title':\n case 'edit_photo':\n case 'invite':\n if (chat._ == 'channel') {\n if (chat.pFlags.megagroup) {\n if (!chat.pFlags.editor &&\n !(action == 'invite' && chat.pFlags.democracy)) {\n return false;\n }\n }\n else {\n return false;\n }\n }\n else {\n if (chat.pFlags.admins_enabled &&\n !chat.pFlags.admin) {\n return false;\n }\n }\n break;\n }\n return true;\n };\n AppChatsManager.prototype.resolveUsername = function (username) {\n return this.usernames[username] || 0;\n };\n AppChatsManager.prototype.saveChannelAccess = function (id, accessHash) {\n this.channelAccess[id] = accessHash;\n };\n AppChatsManager.prototype.saveIsMegagroup = function (id) {\n this.megagroups[id] = true;\n };\n AppChatsManager.prototype.isChannel = function (id) {\n var chat = this.chats[id];\n if (chat && (chat._ == 'channel' || chat._ == 'channelForbidden') ||\n this.channelAccess[id]) {\n return true;\n }\n return false;\n };\n AppChatsManager.prototype.isMegagroup = function (id) {\n if (this.megagroups[id]) {\n return true;\n }\n var chat = this.chats[id];\n if (chat && chat._ == 'channel' && chat.pFlags.megagroup) {\n return true;\n }\n return false;\n };\n AppChatsManager.prototype.isBroadcast = function (id) {\n return this.isChannel(id) && !this.isMegagroup(id);\n };\n AppChatsManager.prototype.getChatInput = function (id) {\n return id || 0;\n };\n AppChatsManager.prototype.getChannelInput = function (id) {\n if (!id) {\n return { _: 'inputChannelEmpty' };\n }\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash || this.channelAccess[id] || 0\n };\n };\n AppChatsManager.prototype.hasChat = function (id, allowMin) {\n var chat = this.chats[id];\n return utils_1.isObject(chat) && (allowMin || !chat.pFlags.min);\n };\n AppChatsManager.prototype.getChatPhoto = function (id) {\n var chat = this.getChat(id);\n if (this.cachedPhotoLocations[id] === undefined) {\n this.cachedPhotoLocations[id] = chat && chat.photo ? chat.photo : { empty: true };\n }\n return this.cachedPhotoLocations[id];\n };\n AppChatsManager.prototype.getChatString = function (id) {\n var chat = this.getChat(id);\n if (this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n };\n AppChatsManager.prototype.wrapForFull = function (id, fullChat) {\n var chatFull = utils_1.copy(fullChat);\n var chat = this.getChat(id);\n if (!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n if (chatFull.participants &&\n chatFull.participants._ == 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n if (chatFull.about) {\n chatFull.rAbout = richtextprocessor_1.RichTextProcessor.wrapRichText(chatFull.about, { noLinebreaks: true });\n }\n chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n return chatFull;\n };\n AppChatsManager.prototype.wrapParticipants = function (id, participants) {\n var chat = this.getChat(id);\n var myID = exports.appUsersManager.getSelf().id;\n if (this.isChannel(id)) {\n var isAdmin = chat.pFlags.creator || chat.pFlags.editor || chat.pFlags.moderator;\n participants.forEach(function (participant) {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = isAdmin && participant._ == 'channelParticipant';\n // just for order by last seen\n participant.user = exports.appUsersManager.getUser(participant.user_id);\n });\n }\n else {\n var isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach(function (participant) {\n participant.canLeave = myID == participant.user_id;\n participant.canKick = !participant.canLeave && (chat.pFlags.creator ||\n participant._ == 'chatParticipant' && (isAdmin || myID == participant.inviter_id));\n // just for order by last seen\n participant.user = exports.appUsersManager.getUser(participant.user_id);\n });\n }\n return participants;\n };\n return AppChatsManager;\n}());\nexports.appUsersManager = new AppUsersManager();\nexports.appChatsManager = new AppChatsManager();\nexports.appPeersManager = {\n getPeerPhoto: function (peerID) {\n return peerID > 0\n ? exports.appUsersManager.getUserPhoto(peerID)\n : exports.appChatsManager.getChatPhoto(-peerID);\n },\n getPeerMigratedTo: function (peerID) {\n if (peerID >= 0) {\n return false;\n }\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n return exports.appPeersManager.getPeerID(chat.migrated_to);\n }\n return false;\n },\n getPeerTitle: function (peerID) {\n var peer = {};\n if (!utils_1.isObject(peerID)) {\n peer = exports.appPeersManager.getPeer(peerID);\n }\n else\n peer = peerID;\n var title = '';\n if (peerID > 0) {\n if (peer.first_name)\n title += peer.first_name;\n if (peer.last_name)\n title += ' ' + peer.last_name;\n if (!title)\n title = peer.pFlags.deleted ? 'Deleted account' : peer.username;\n else\n title = title.trim();\n }\n else {\n title = peer.title;\n }\n return title;\n },\n getOutputPeer: function (peerID) {\n if (peerID > 0) {\n return { _: 'peerUser', user_id: peerID };\n }\n var chatID = -peerID;\n if (exports.appChatsManager.isChannel(chatID)) {\n return { _: 'peerChannel', channel_id: chatID };\n }\n return { _: 'peerChat', chat_id: chatID };\n },\n getPeerString: function (peerID) {\n if (peerID > 0) {\n return exports.appUsersManager.getUserString(peerID);\n }\n return exports.appChatsManager.getChatString(-peerID);\n },\n getPeer: function (peerID) {\n return peerID > 0\n ? exports.appUsersManager.getUser(peerID)\n : exports.appChatsManager.getChat(-peerID);\n },\n getPeerID: function (peerString) {\n if (utils_1.isObject(peerString)) {\n return peerString.user_id\n ? peerString.user_id\n : -(peerString.channel_id || peerString.chat_id);\n }\n var isUser = peerString.charAt(0) == 'u';\n var peerParams = peerString.substr(1).split('_');\n return isUser ? peerParams[0] : -peerParams[0] || 0;\n },\n isChannel: function (peerID) {\n return (peerID < 0) && exports.appChatsManager.isChannel(-peerID);\n },\n getInputPeerByID: function (peerID) {\n if (!peerID) {\n return { _: 'inputPeerEmpty' };\n }\n if (peerID < 0) {\n var chatID = -peerID;\n if (!exports.appChatsManager.isChannel(chatID)) {\n return {\n _: 'inputPeerChat',\n chat_id: chatID\n };\n }\n else {\n return {\n _: 'inputPeerChannel',\n channel_id: chatID,\n access_hash: exports.appChatsManager.getChat(chatID).access_hash || 0\n };\n }\n }\n return {\n _: 'inputPeerUser',\n user_id: peerID,\n access_hash: exports.appUsersManager.getUser(peerID).access_hash || 0\n };\n },\n isMegagroup: function (peerID) {\n return (peerID < 0) && exports.appChatsManager.isMegagroup(-peerID);\n },\n getPeerSearchText: function (peerID) {\n var text;\n if (peerID > 0) {\n text = '%pu ' + exports.appUsersManager.getUserSearchText(peerID);\n }\n else if (peerID < 0) {\n var chat = exports.appChatsManager.getChat(-peerID);\n text = '%pg ' + (chat.title || '');\n }\n return text;\n }\n};\nvar AppMessagesIDsManager = /** @class */ (function () {\n function AppMessagesIDsManager() {\n this.channelLocals = {};\n this.channelsByLocals = {};\n this.channelCurLocal = 0;\n this.fullMsgIDModulus = 4294967296;\n }\n AppMessagesIDsManager.prototype.getFullMessageID = function (msgID, channelID) {\n if (!channelID || msgID <= 0) {\n return msgID;\n }\n msgID = this.getMessageLocalID(msgID);\n var localStart = this.channelLocals[channelID];\n if (!localStart) {\n localStart = (++this.channelCurLocal) * this.fullMsgIDModulus;\n this.channelsByLocals[localStart] = channelID;\n this.channelLocals[channelID] = localStart;\n }\n return localStart + msgID;\n };\n AppMessagesIDsManager.prototype.getMessageIDInfo = function (fullMsgID) {\n if (fullMsgID < this.fullMsgIDModulus) {\n return [fullMsgID, 0];\n }\n var msgID = fullMsgID % this.fullMsgIDModulus;\n var channelID = this.channelsByLocals[fullMsgID - msgID];\n return [msgID, channelID];\n };\n AppMessagesIDsManager.prototype.getMessageLocalID = function (fullMsgID) {\n if (!fullMsgID) {\n return 0;\n }\n return fullMsgID % this.fullMsgIDModulus;\n };\n AppMessagesIDsManager.prototype.splitMessageIDsByChannels = function (mids) {\n var msgIDsByChannels = {};\n var midsByChannels = {};\n var i;\n var mid, msgChannel;\n var channelID;\n for (i = 0; i < mids.length; i++) {\n mid = mids[i];\n msgChannel = this.getMessageIDInfo(mid);\n channelID = msgChannel[1];\n if (msgIDsByChannels[channelID] === undefined) {\n msgIDsByChannels[channelID] = [];\n midsByChannels[channelID] = [];\n }\n msgIDsByChannels[channelID].push(msgChannel[0]);\n midsByChannels[channelID].push(mid);\n }\n return {\n msgIDs: msgIDsByChannels,\n mids: midsByChannels\n };\n };\n return AppMessagesIDsManager;\n}());\n;\nvar AppProfileManager = /** @class */ (function () {\n function AppProfileManager() {\n var _this = this;\n this.botInfos = {};\n this.chatsFull = {};\n this.chatFullPromises = {};\n this.chatParticipantsPromises = {};\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n // console.log('on apiUpdate', update)\n switch (update._) {\n case 'updateChatParticipants':\n var participants = update.participants;\n var chatFull = _this.chatsFull[participants.id];\n if (chatFull !== undefined) {\n chatFull.participants = update.participants;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n }\n break;\n case 'updateChatParticipantAdd':\n var chatFull = _this.chatsFull[update.chat_id];\n if (chatFull !== undefined) {\n var participants = chatFull.participants.participants || [];\n for (var i = 0, length = participants.length; i < length; i++) {\n if (participants[i].user_id == update.user_id) {\n return;\n }\n }\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: utils_1.tsNow(true)\n });\n chatFull.participants.version = update.version;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n }\n break;\n case 'updateChatParticipantDelete':\n var chatFull = _this.chatsFull[update.chat_id];\n if (chatFull !== undefined) {\n var participants = chatFull.participants.participants || [];\n for (var i = 0, length = participants.length; i < length; i++) {\n if (participants[i].user_id == update.user_id) {\n participants.splice(i, 1);\n chatFull.participants.version = update.version;\n $rootScope.$broadcast('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n break;\n case 'updateChannelPinnedMessage':\n var channelID = update.channel_id;\n var fullChannel = _this.chatsFull[channelID];\n if (fullChannel !== undefined) {\n fullChannel.pinned_msg_id = exports.appMessagesIDsManager.getFullMessageID(update.id, channelID);\n $rootScope.$broadcast('peer_pinned_message', -channelID);\n }\n break;\n }\n });\n $rootScope.$on('chat_update', function (e) {\n var chatID = e.detail;\n var fullChat = _this.chatsFull[chatID];\n var chat = exports.appChatsManager.getChat(chatID);\n if (!chat.photo || !fullChat) {\n return;\n }\n var emptyPhoto = chat.photo._ == 'chatPhotoEmpty';\n console.log('chat_update:', fullChat);\n if (fullChat.chat_photo && emptyPhoto != (fullChat.chat_photo._ == 'photoEmpty')) {\n delete _this.chatsFull[chatID];\n $rootScope.$broadcast('chat_full_update', chatID);\n return;\n }\n if (emptyPhoto) {\n return;\n }\n var smallUserpic = chat.photo.photo_small;\n var smallPhotoSize = exports.appPhotosManager.choosePhotoSize(fullChat.chat_photo, 0, 0);\n if (JSON.stringify(smallUserpic) !== JSON.stringify(smallPhotoSize.location)) {\n delete _this.chatsFull[chatID];\n $rootScope.$broadcast('chat_full_update', chatID);\n }\n });\n }\n AppProfileManager.prototype.saveBotInfo = function (botInfo) {\n var botID = botInfo && botInfo.user_id;\n if (!botID) {\n return false;\n }\n var commands = {};\n botInfo.commands.forEach(function (botCommand) {\n commands[botCommand.command] = botCommand.description;\n });\n return this.botInfos[botID] = {\n id: botID,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n };\n AppProfileManager.prototype.getProfile = function (id, override) {\n var _this = this;\n return mtproto_1.MTProto.apiManager.invokeApi('users.getFullUser', {\n id: exports.appUsersManager.getUserInput(id)\n }).then(function (userFull) {\n if (override && override.phone_number) {\n userFull.user.phone = override.phone_number;\n if (override.first_name || override.last_name) {\n userFull.user.first_name = override.first_name;\n userFull.user.last_name = override.last_name;\n }\n exports.appUsersManager.saveApiUser(userFull.user);\n }\n else {\n exports.appUsersManager.saveApiUser(userFull.user, true);\n }\n if (userFull.profile_photo) {\n exports.appPhotosManager.savePhoto(userFull.profile_photo, {\n user_id: id\n });\n }\n if (userFull.about !== undefined) {\n userFull.rAbout = richtextprocessor_1.RichTextProcessor.wrapRichText(userFull.about, { noLinebreaks: true });\n }\n // NotificationsManager.savePeerSettings(id, userFull.notify_settings); // warning\n if (userFull.bot_info) {\n userFull.bot_info = _this.saveBotInfo(userFull.bot_info);\n }\n return userFull;\n });\n };\n AppProfileManager.prototype.getPeerBots = function (peerID) {\n var _this = this;\n var peerBots = [];\n if (peerID >= 0 && !exports.appUsersManager.isBot(peerID) ||\n (exports.appPeersManager.isChannel(peerID) && !exports.appPeersManager.isMegagroup(peerID))) {\n return Promise.resolve(peerBots);\n }\n if (peerID >= 0) {\n return this.getProfile(peerID).then(function (userFull) {\n var botInfo = userFull.bot_info;\n if (botInfo && botInfo._ != 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n return this.getChatFull(-peerID).then(function (chatFull) {\n chatFull.bot_info.forEach(function (botInfo) {\n peerBots.push(_this.saveBotInfo(botInfo));\n });\n return peerBots;\n });\n };\n AppProfileManager.prototype.getChatFull = function (id) {\n var _this = this;\n if (exports.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id);\n }\n if (this.chatsFull[id] !== undefined) {\n var chat = exports.appChatsManager.getChat(id);\n if (chat.version == this.chatsFull[id].participants.version ||\n chat.pFlags.left) {\n return Promise.resolve(this.chatsFull[id]);\n }\n }\n if (this.chatFullPromises[id] !== undefined) {\n return this.chatFullPromises[id];\n }\n // console.trace(dT(), 'Get chat full', id, appChatsManager.getChat(id))\n return this.chatFullPromises[id] = mtproto_1.MTProto.apiManager.invokeApi('messages.getFullChat', {\n chat_id: exports.appChatsManager.getChatInput(id)\n }).then(function (result) {\n exports.appChatsManager.saveApiChats(result.chats);\n exports.appUsersManager.saveApiUsers(result.users);\n var fullChat = result.full_chat;\n if (fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n exports.appPhotosManager.savePhoto(fullChat.chat_photo);\n }\n /* NotificationsManager.savePeerSettings(-id, fullChat.notify_settings); */ // warning\n delete _this.chatFullPromises[id];\n _this.chatsFull[id] = fullChat;\n $rootScope.$broadcast('chat_full_update', id);\n return fullChat;\n });\n };\n AppProfileManager.prototype.getChatInviteLink = function (id, force) {\n var _this = this;\n return this.getChatFull(id).then(function (chatFull) {\n if (!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n var promise;\n if (exports.appChatsManager.isChannel(id)) {\n promise = mtproto_1.MTProto.apiManager.invokeApi('channels.exportInvite', {\n channel: exports.appChatsManager.getChannelInput(id)\n });\n }\n else {\n promise = mtproto_1.MTProto.apiManager.invokeApi('messages.exportChatInvite', {\n chat_id: exports.appChatsManager.getChatInput(id)\n });\n }\n return promise.then(function (exportedInvite) {\n if (_this.chatsFull[id] !== undefined) {\n _this.chatsFull[id].exported_invite = exportedInvite;\n }\n return exportedInvite.link;\n });\n });\n };\n AppProfileManager.prototype.getChannelParticipants = function (id, filter, limit, offset) {\n filter = filter || { _: 'channelParticipantsRecent' };\n limit = limit || 200;\n offset = offset || 0;\n var promiseKey = [id, filter._, offset, limit].join('_');\n var promiseData = this.chatParticipantsPromises[promiseKey];\n if (filter._ == 'channelParticipantsRecent') {\n var chat = exports.appChatsManager.getChat(id);\n if (chat &&\n chat.pFlags && (chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights)) {\n return Promise.reject();\n }\n }\n var fetchParticipants = function (cachedParticipants) {\n var hash = 0;\n if (cachedParticipants) {\n var userIDs = [];\n cachedParticipants.forEach(function (participant) {\n userIDs.push(participant.user_id);\n });\n userIDs.sort();\n userIDs.forEach(function (userID) {\n hash = ((hash * 20261) + 0x80000000 + userID) % 0x80000000;\n });\n }\n return mtproto_1.MTProto.apiManager.invokeApi('channels.getParticipants', {\n channel: exports.appChatsManager.getChannelInput(id),\n filter: filter,\n offset: offset,\n limit: limit,\n hash: hash\n }).then(function (result) {\n if (result._ == 'channels.channelParticipantsNotModified') {\n return cachedParticipants;\n }\n exports.appUsersManager.saveApiUsers(result.users);\n return result.participants;\n });\n };\n var maybeAddSelf = function (participants) {\n var chat = exports.appChatsManager.getChat(id);\n var selfMustBeFirst = filter._ == 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n if (selfMustBeFirst) {\n participants = utils_1.copy(participants);\n var myID = exports.appUsersManager.getSelf().id;\n var myIndex = false;\n var myParticipant;\n for (var i = 0, len = participants.length; i < len; i++) {\n if (participants[i].user_id == myID) {\n myIndex = i;\n break;\n }\n }\n if (myIndex !== false) {\n myParticipant = participants[i];\n participants.splice(i, 1);\n }\n else {\n myParticipant = { _: 'channelParticipantSelf', user_id: myID };\n }\n participants.unshift(myParticipant);\n }\n return participants;\n };\n var timeNow = utils_1.tsNow();\n if (promiseData !== undefined) {\n var promise = promiseData[1];\n if (promiseData[0] > timeNow - 60000) {\n return promise;\n }\n var newPromise_1 = promise.then(function (cachedParticipants) {\n return fetchParticipants(cachedParticipants).then(maybeAddSelf);\n });\n this.chatParticipantsPromises[promiseKey] = [timeNow, newPromise_1];\n return newPromise_1;\n }\n var newPromise = fetchParticipants().then(maybeAddSelf);\n this.chatParticipantsPromises[promiseKey] = [timeNow, newPromise];\n return newPromise;\n };\n AppProfileManager.prototype.getChannelFull = function (id, force) {\n var _this = this;\n if (this.chatsFull[id] !== undefined && !force) {\n return Promise.resolve(this.chatsFull[id]);\n }\n if (this.chatFullPromises[id] !== undefined) {\n return this.chatFullPromises[id];\n }\n return this.chatFullPromises[id] = mtproto_1.MTProto.apiManager.invokeApi('channels.getFullChannel', {\n channel: exports.appChatsManager.getChannelInput(id)\n }).then(function (result) {\n exports.appChatsManager.saveApiChats(result.chats);\n exports.appUsersManager.saveApiUsers(result.users);\n var fullChannel = result.full_chat;\n if (fullChannel && fullChannel.chat_photo.id) {\n exports.appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n /* NotificationsManager.savePeerSettings(-id, fullChannel.notify_settings) */ // warning\n if (fullChannel.pinned_msg_id) {\n fullChannel.pinned_msg_id = exports.appMessagesIDsManager.getFullMessageID(fullChannel.pinned_msg_id, id);\n }\n delete _this.chatFullPromises[id];\n _this.chatsFull[id] = fullChannel;\n $rootScope.$broadcast('chat_full_update', id);\n return fullChannel;\n }, function (error) {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n var channel = exports.appChatsManager.getChat(id);\n channel = { _: 'channelForbidden', access_hash: channel.access_hash, title: channel.title };\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n return Promise.reject(error);\n });\n };\n AppProfileManager.prototype.invalidateChannelParticipants = function (id) {\n delete this.chatsFull[id];\n delete this.chatFullPromises[id];\n for (var key in this.chatParticipantsPromises) {\n var val = this.chatParticipantsPromises[key];\n if (+key.split('_')[0] == id) {\n delete this.chatParticipantsPromises[key];\n }\n }\n $rootScope.$broadcast('chat_full_update', id);\n };\n AppProfileManager.prototype.getChannelPinnedMessage = function (id) {\n return this.getChannelFull(id).then(function (fullChannel) {\n var pinnedMessageID = fullChannel && fullChannel.pinned_msg_id;\n if (!pinnedMessageID) {\n return false;\n }\n return storage_1.default.get('pinned_hidden' + id).then(function (hiddenMessageID) {\n if (exports.appMessagesIDsManager.getMessageLocalID(pinnedMessageID) == hiddenMessageID) {\n return false;\n }\n return pinnedMessageID;\n });\n });\n };\n AppProfileManager.prototype.hideChannelPinnedMessage = function (id, pinnedMessageID) {\n var setKeys = {};\n setKeys['pinned_hidden' + id] = exports.appMessagesIDsManager.getMessageLocalID(pinnedMessageID);\n storage_1.default.set(setKeys);\n $rootScope.$broadcast('peer_pinned_message', -id);\n };\n return AppProfileManager;\n}());\nvar ApiUpdatesManager = /** @class */ (function () {\n function ApiUpdatesManager() {\n var _this = this;\n this.updatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: false,\n syncLoading: true\n };\n this.channelStates = {};\n this.myID = 0;\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n }\n ApiUpdatesManager.prototype.popPendingSeqUpdate = function () {\n var nextSeq = this.updatesState.seq + 1;\n var pendingUpdatesData = this.updatesState.pendingSeqUpdates[nextSeq];\n if (!pendingUpdatesData) {\n return false;\n }\n var updates = pendingUpdatesData.updates;\n var length;\n for (var i = 0, length = updates.length; i < length; i++) {\n this.saveUpdate(updates[i]);\n }\n this.updatesState.seq = pendingUpdatesData.seq;\n if (pendingUpdatesData.date && this.updatesState.date < pendingUpdatesData.date) {\n this.updatesState.date = pendingUpdatesData.date;\n }\n delete this.updatesState.pendingSeqUpdates[nextSeq];\n if (!this.popPendingSeqUpdate() &&\n this.updatesState.syncPending &&\n this.updatesState.syncPending.seqAwaiting &&\n this.updatesState.seq >= this.updatesState.syncPending.seqAwaiting) {\n if (!this.updatesState.syncPending.ptsAwaiting) {\n clearTimeout(this.updatesState.syncPending.timeout);\n this.updatesState.syncPending = false;\n }\n else {\n delete this.updatesState.syncPending.seqAwaiting;\n }\n }\n return true;\n };\n ApiUpdatesManager.prototype.popPendingPtsUpdate = function (channelID) {\n var curState = channelID ? this.getChannelState(channelID) : this.updatesState;\n if (!curState.pendingPtsUpdates.length) {\n return false;\n }\n curState.pendingPtsUpdates.sort(function (a, b) {\n return a.pts - b.pts;\n });\n // console.log(dT(), 'pop update', channelID, curState.pendingPtsUpdates)\n var curPts = curState.pts;\n var goodPts = false;\n var goodIndex = 0;\n var update;\n for (var i = 0, length = curState.pendingPtsUpdates.length; i < length; i++) {\n update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if (curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n if (!goodPts) {\n return false;\n }\n console.log(utils_1.dT(), 'pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n curState.pts = goodPts;\n for (i = 0; i <= goodIndex; i++) {\n update = curState.pendingPtsUpdates[i];\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n if (!curState.pendingPtsUpdates.length && curState.syncPending) {\n if (!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = false;\n }\n else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n return true;\n };\n ApiUpdatesManager.prototype.forceGetDifference = function () {\n if (!this.updatesState.syncLoading) {\n this.getDifference();\n }\n };\n ApiUpdatesManager.prototype.processUpdateMessage = function (updateMessage) {\n var _this = this;\n // return forceGetDifference()\n var processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n };\n switch (updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n case 'updateShortMessage':\n case 'updateShortChatMessage':\n var isOut = updateMessage.flags & 2;\n var fromID = updateMessage.from_id || (isOut ? this.myID : updateMessage.user_id);\n var toID = updateMessage.chat_id\n ? -updateMessage.chat_id\n : (isOut ? updateMessage.user_id : this.myID);\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n flags: updateMessage.flags,\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(toID),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to_msg_id: updateMessage.reply_to_msg_id,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n case 'updatesCombined':\n case 'updates':\n exports.appUsersManager.saveApiUsers(updateMessage.users);\n exports.appChatsManager.saveApiChats(updateMessage.chats);\n updateMessage.updates.forEach(function (update) {\n _this.processUpdate(update, processOpts);\n });\n break;\n default:\n console.warn(utils_1.dT(), 'Unknown update message', updateMessage);\n }\n };\n ApiUpdatesManager.prototype.getDifference = function () {\n var _this = this;\n // console.trace(dT(), 'Get full diff')\n var updatesState = this.updatesState;\n if (!updatesState.syncLoading) {\n updatesState.syncLoading = true;\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n if (updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = false;\n }\n mtproto_1.MTProto.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then(function (differenceResult) {\n if (differenceResult._ == 'updates.differenceEmpty') {\n console.log(utils_1.dT(), 'apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n updatesState.syncLoading = false;\n $rootScope.$broadcast('stateSynchronized');\n return false;\n }\n exports.appUsersManager.saveApiUsers(differenceResult.users);\n exports.appChatsManager.saveApiChats(differenceResult.chats);\n // Should be first because of updateMessageID\n // console.log(dT(), 'applying', differenceResult.other_updates.length, 'other updates')\n differenceResult.other_updates.forEach(function (update) {\n switch (update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n _this.processUpdate(update);\n return;\n }\n _this.saveUpdate(update);\n });\n // console.log(dT(), 'applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach(function (apiMessage) {\n _this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n var nextState = differenceResult.intermediate_state || differenceResult.state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n // console.log(dT(), 'apply diff', updatesState.seq, updatesState.pts)\n if (differenceResult._ == 'updates.differenceSlice') {\n _this.getDifference();\n }\n else {\n // console.log(dT(), 'finished get diff')\n $rootScope.$broadcast('stateSynchronized');\n updatesState.syncLoading = false;\n }\n }, function () {\n updatesState.syncLoading = false;\n });\n };\n ApiUpdatesManager.prototype.getChannelDifference = function (channelID) {\n var _this = this;\n var channelState = this.getChannelState(channelID);\n if (!channelState.syncLoading) {\n channelState.syncLoading = true;\n channelState.pendingPtsUpdates = [];\n }\n if (channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = false;\n }\n // console.log(dT(), 'Get channel diff', appChatsManager.getChat(channelID), channelState.pts)\n mtproto_1.MTProto.apiManager.invokeApi('updates.getChannelDifference', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n filter: { _: 'channelMessagesFilterEmpty' },\n pts: channelState.pts,\n limit: 30\n }, { timeout: 0x7fffffff }).then(function (differenceResult) {\n // console.log(dT(), 'channel diff result', differenceResult)\n channelState.pts = differenceResult.pts;\n if (differenceResult._ == 'updates.channelDifferenceEmpty') {\n console.log(utils_1.dT(), 'apply channel empty diff', differenceResult);\n channelState.syncLoading = false;\n $rootScope.$broadcast('stateSynchronized');\n return false;\n }\n if (differenceResult._ == 'updates.channelDifferenceTooLong') {\n console.log(utils_1.dT(), 'channel diff too long', differenceResult);\n channelState.syncLoading = false;\n delete _this.channelStates[channelID];\n _this.saveUpdate({ _: 'updateChannelReload', channel_id: channelID });\n return false;\n }\n exports.appUsersManager.saveApiUsers(differenceResult.users);\n exports.appChatsManager.saveApiChats(differenceResult.chats);\n // Should be first because of updateMessageID\n console.log(utils_1.dT(), 'applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach(function (update) {\n _this.saveUpdate(update);\n });\n console.log(utils_1.dT(), 'applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach(function (apiMessage) {\n _this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n console.log(utils_1.dT(), 'apply channel diff', channelState.pts);\n if (differenceResult._ == 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n _this.getChannelDifference(channelID);\n }\n else {\n console.log(utils_1.dT(), 'finished channel get diff');\n $rootScope.$broadcast('stateSynchronized');\n channelState.syncLoading = false;\n }\n }, function () {\n channelState.syncLoading = false;\n });\n };\n ApiUpdatesManager.prototype.addChannelState = function (channelID, pts) {\n if (!pts) {\n throw new Error('Add channel state without pts ' + channelID);\n }\n if (!(channelID in this.channelStates)) {\n this.channelStates[channelID] = {\n pts: pts,\n pendingPtsUpdates: [],\n syncPending: false,\n syncLoading: false\n };\n return true;\n }\n return false;\n };\n ApiUpdatesManager.prototype.getChannelState = function (channelID, pts) {\n if (this.channelStates[channelID] === undefined) {\n this.addChannelState(channelID, pts);\n }\n return this.channelStates[channelID];\n };\n ApiUpdatesManager.prototype.processUpdate = function (update, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n var channelID = false;\n switch (update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelID = -exports.appPeersManager.getPeerID(update.message.to_id);\n break;\n case 'updateDeleteChannelMessages':\n channelID = update.channel_id;\n break;\n case 'updateChannelTooLong':\n channelID = update.channel_id;\n if (!(channelID in this.channelStates)) {\n return false;\n }\n break;\n }\n var curState = channelID ? this.getChannelState(channelID, update.pts) : this.updatesState;\n // console.log(dT(), 'process', channelID, curState.pts, update)\n if (curState.syncLoading) {\n return false;\n }\n if (update._ == 'updateChannelTooLong') {\n if (!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < utils_1.tsNow() - 10000) {\n // console.trace(dT(), 'channel too long, get diff', channelID, update)\n this.getChannelDifference(channelID);\n }\n return false;\n }\n if (update._ == 'updateNewMessage' ||\n update._ == 'updateEditMessage' ||\n update._ == 'updateNewChannelMessage' ||\n update._ == 'updateEditChannelMessage') {\n var message = update.message;\n var toPeerID = exports.appPeersManager.getPeerID(message.to_id);\n var fwdHeader = message.fwd_from || {};\n var reason = false;\n if (message.from_id && !exports.appUsersManager.hasUser(message.from_id, message.pFlags.post /* || channelID*/) && (reason = 'author') ||\n fwdHeader.from_id && !exports.appUsersManager.hasUser(fwdHeader.from_id, !!fwdHeader.channel_id) && (reason = 'fwdAuthor') ||\n fwdHeader.channel_id && !exports.appChatsManager.hasChat(fwdHeader.channel_id, true) && (reason = 'fwdChannel') ||\n toPeerID > 0 && !exports.appUsersManager.hasUser(toPeerID) && (reason = 'toPeer User') ||\n toPeerID < 0 && !exports.appChatsManager.hasChat(-toPeerID) && (reason = 'toPeer Chat')) {\n console.warn(utils_1.dT(), 'Not enough data for message update', toPeerID, reason, message);\n if (channelID && exports.appChatsManager.hasChat(channelID)) {\n this.getChannelDifference(channelID);\n }\n else {\n this.forceGetDifference();\n }\n return false;\n }\n }\n else if (channelID && !exports.appChatsManager.hasChat(channelID)) {\n // console.log(dT(), 'skip update, missing channel', channelID, update)\n return false;\n }\n var popPts;\n var popSeq;\n if (update.pts) {\n var newPts = curState.pts + (update.pts_count || 0);\n if (newPts < update.pts) {\n console.warn(utils_1.dT(), 'Pts hole', curState, update, channelID && exports.appChatsManager.getChat(channelID));\n curState.pendingPtsUpdates.push(update);\n if (!curState.syncPending) {\n curState.syncPending = {\n timeout: setTimeout(function () {\n if (channelID) {\n _this.getChannelDifference(channelID);\n }\n else {\n _this.getDifference();\n }\n }, 5000)\n };\n }\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n if (update.pts > curState.pts) {\n curState.pts = update.pts;\n popPts = true;\n curState.lastPtsUpdateTime = utils_1.tsNow();\n }\n else if (update.pts_count) {\n // console.warn(dT(), 'Duplicate update', update)\n return false;\n }\n if (channelID && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n }\n else if (!channelID && options.seq > 0) {\n var seq = options.seq;\n var seqStart = options.seqStart || seq;\n if (seqStart != curState.seq + 1) {\n if (seqStart > curState.seq) {\n console.warn(utils_1.dT(), 'Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n if (curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = { seq: seq, date: options.date, updates: [] };\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n if (!curState.syncPending) {\n curState.syncPending = {\n timeout: setTimeout(function () {\n _this.getDifference();\n }, 5000)\n };\n }\n if (!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n if (curState.seq != seq) {\n curState.seq = seq;\n if (options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n popSeq = true;\n }\n }\n this.saveUpdate(update);\n if (popPts) {\n this.popPendingPtsUpdate(channelID);\n }\n else if (popSeq) {\n this.popPendingSeqUpdate();\n }\n };\n ApiUpdatesManager.prototype.saveUpdate = function (update) {\n $rootScope.$broadcast('apiUpdate', update);\n };\n ApiUpdatesManager.prototype.attach = function () {\n var _this = this;\n mtproto_1.MTProto.networkerFactory.setUpdatesProcessor(this.processUpdateMessage.bind(this));\n mtproto_1.MTProto.apiManager.invokeApi('updates.getState', {}, { noErrorBox: true }).then(function (stateResult) {\n _this.updatesState.seq = stateResult.seq;\n _this.updatesState.pts = stateResult.pts;\n _this.updatesState.date = stateResult.date;\n setTimeout(function () {\n _this.updatesState.syncLoading = false;\n }, 1000);\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n };\n return ApiUpdatesManager;\n}());\nexports.appMessagesIDsManager = new AppMessagesIDsManager();\nexports.apiUpdatesManager = new ApiUpdatesManager();\nvar AppPhotosManager = /** @class */ (function () {\n function AppPhotosManager() {\n this.photos = {};\n this.windowW = document.body.scrollWidth;\n this.windowH = document.body.scrollHeight;\n /* $rootScope.openPhoto = openPhoto\n $rootScope.preloadPhoto = preloadPhoto; */\n }\n AppPhotosManager.prototype.savePhoto = function (apiPhoto, context) {\n if (context) {\n Object.assign(apiPhoto, context);\n }\n this.photos[apiPhoto.id] = apiPhoto;\n apiPhoto.sizes.forEach(function (photoSize) {\n if (photoSize._ == 'photoCachedSize') {\n mtproto_1.MTProto.apiFileManager.saveSmallFile(photoSize.location, photoSize.bytes);\n // Memory\n photoSize.size = photoSize.bytes.length;\n delete photoSize.bytes;\n photoSize._ = 'photoSize';\n }\n });\n };\n AppPhotosManager.prototype.choosePhotoSize = function (photo, width, height) {\n if (width === void 0) { width = 0; }\n if (height === void 0) { height = 0; }\n if (Config.Navigator.retina) {\n width *= 2;\n height *= 2;\n }\n var bestPhotoSize = { _: 'photoSizeEmpty' };\n var bestDiff = 0xFFFFFF;\n photo.sizes.forEach(function (photoSize) {\n var diff = Math.abs(photoSize.w * photoSize.h - width * height);\n if (diff < bestDiff) {\n bestPhotoSize = photoSize;\n bestDiff = diff;\n }\n });\n // console.log('choosing', photo, width, height, bestPhotoSize)\n return bestPhotoSize;\n };\n AppPhotosManager.prototype.getUserPhotos = function (userID, maxID, limit) {\n var _this = this;\n var inputUser = exports.appUsersManager.getUserInput(userID);\n return mtproto_1.MTProto.apiManager.invokeApi('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit: limit || 20,\n max_id: maxID || 0\n }).then(function (photosResult) {\n exports.appUsersManager.saveApiUsers(photosResult.users);\n var photoIDs = [];\n var context = { user_id: userID };\n for (var i = 0; i < photosResult.photos.length; i++) {\n _this.savePhoto(photosResult.photos[i], context);\n photoIDs.push(photosResult.photos[i].id);\n }\n return {\n count: photosResult.count || photosResult.photos.length,\n photos: photoIDs\n };\n });\n };\n AppPhotosManager.prototype.preloadPhoto = function (photoID) {\n if (!this.photos[photoID]) {\n return Promise.reject();\n }\n var photo = this.photos[photoID];\n var fullWidth = document.body.scrollHeight - (Config.Mobile ? 20 : 32);\n var fullHeight = document.body.scrollWidth - (Config.Mobile ? 150 : 116);\n if (fullWidth > 800) {\n fullWidth -= 208;\n }\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n if (fullPhotoSize /* && !fullPhotoSize.preloaded */) {\n fullPhotoSize.preloaded = true;\n if (fullPhotoSize.size) {\n return mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, {\n _: 'inputPhotoFileLocation',\n id: photoID,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: fullPhotoSize.type\n }, fullPhotoSize.size);\n }\n else {\n console.log('downloadSmallFile exec');\n return mtproto_1.MTProto.apiFileManager.downloadSmallFile(fullPhotoSize.location);\n }\n }\n else\n return Promise.reject('no fullPhotoSize');\n };\n AppPhotosManager.prototype.getPhoto = function (photoID) {\n return this.photos[photoID] || { _: 'photoEmpty' };\n };\n AppPhotosManager.prototype.wrapForHistory = function (photoID, options) {\n if (options === void 0) { options = {}; }\n var photo = utils_1.copy(this.photos[photoID]) || { _: 'photoEmpty' };\n var width = options.website ? 64 : Math.min(this.windowW - 80, Config.Mobile ? 210 : 260);\n var height = options.website ? 64 : Math.min(this.windowH - 100, Config.Mobile ? 210 : 260);\n var thumbPhotoSize = this.choosePhotoSize(photo, width, height);\n var thumb = {\n width: width,\n height: height\n };\n if (options.website && Config.Mobile) {\n width = 50;\n height = 50;\n }\n // console.log('chosen photo size', photoID, thumbPhotoSize)\n if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') {\n var dim = utils_1.calcImageInBox(thumbPhotoSize.w, thumbPhotoSize.h, width, height);\n thumb.width = dim.w;\n thumb.height = dim.h;\n thumb.location = thumbPhotoSize.location;\n thumb.size = thumbPhotoSize.size;\n }\n else {\n thumb.width = 100;\n thumb.height = 100;\n }\n photo.thumb = thumb;\n return photo;\n };\n AppPhotosManager.prototype.wrapForFull = function (photoID) {\n var photo = this.wrapForHistory(photoID);\n var fullWidth = document.body.scrollWidth - (Config.Mobile ? 0 : 32);\n var fullHeight = document.body.scrollHeight - (Config.Mobile ? 0 : 116);\n if (!Config.Mobile && fullWidth > 800) {\n fullWidth -= 208;\n }\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var full = {};\n full.width = fullWidth;\n full.height = fullHeight;\n if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') {\n var wh = utils_1.calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, true);\n full.width = wh.w;\n full.height = wh.h;\n full.modalWidth = Math.max(full.width, Math.min(400, fullWidth));\n full.location = fullPhotoSize.location;\n full.size = fullPhotoSize.size;\n }\n photo.full = full;\n return photo;\n };\n /* public openPhoto(photoID: number, list: any) {\n if(!photoID || photoID === '0') {\n return false;\n }\n \n var scope = $rootScope.$new(true);\n \n scope.photoID = photoID;\n \n var controller = 'PhotoModalController';\n if (list && list.p > 0) {\n controller = 'UserpicModalController';\n scope.userID = list.p;\n } else if (list && list.p < 0) {\n controller = 'ChatpicModalController';\n scope.chatID = -list.p;\n } else if (list && list.m > 0) {\n scope.messageID = list.m;\n if (list.w) {\n scope.webpageID = list.w;\n }\n }\n \n var modalInstance = $modal.open({\n templateUrl: templateUrl('photo_modal'),\n windowTemplateUrl: templateUrl('media_modal_layout'),\n controller: controller,\n scope: scope,\n windowClass: 'photo_modal_window'\n });\n } */\n AppPhotosManager.prototype.downloadPhoto = function (photoID) {\n var photo = this.photos[photoID];\n var ext = 'jpg';\n var mimeType = 'image/jpeg';\n var fileName = 'photo' + photoID + '.' + ext;\n var fullWidth = Math.max(screen.width || 0, document.body.scrollWidth - 36, 800);\n var fullHeight = Math.max(screen.height || 0, document.body.scrollHeight - 150, 800);\n var fullPhotoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n var inputFileLocation = {\n _: 'inputFileLocation',\n volume_id: fullPhotoSize.location.volume_id,\n local_id: fullPhotoSize.location.local_id,\n secret: fullPhotoSize.location.secret\n };\n filemanager_1.default.chooseSaveFile(fileName, ext, mimeType).then(function (writableFileEntry) {\n if (writableFileEntry) {\n mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, {\n mime: mimeType,\n toFileEntry: writableFileEntry\n }).then(function () {\n // console.log('file save done')\n }, function (e) {\n console.log('photo download failed', e);\n });\n }\n }, function () {\n var cachedBlob = mtproto_1.MTProto.apiFileManager.getCachedFile(inputFileLocation);\n if (cachedBlob) {\n return filemanager_1.default.download(cachedBlob, mimeType, fileName);\n }\n mtproto_1.MTProto.apiFileManager.downloadFile(photo.dc_id, inputFileLocation, fullPhotoSize.size, { mime: mimeType }).then(function (blob) {\n filemanager_1.default.download(blob, mimeType, fileName);\n }, function (e) {\n console.log('photo download failed', e);\n });\n });\n };\n return AppPhotosManager;\n}());\nvar AppMessagesManager = /** @class */ (function () {\n function AppMessagesManager() {\n var _this = this;\n this.messagesStorage = {};\n this.messagesForHistory = {};\n this.messagesForDialogs = {};\n this.historiesStorage = {};\n this.dialogsStorage = { count: null, dialogs: [] };\n this.pendingByRandomID = {};\n this.pendingByMessageID = {};\n this.pendingAfterMsgs = {};\n this.pendingTopMsgs = {};\n this.sendFilePromise = Promise.resolve();\n this.tempID = -1;\n this.tempFinalizeCallbacks = {};\n this.dialogsIndex = utils_1.SearchIndexManager.createIndex();\n this.cachedResults = { query: false };\n this.lastSearchFilter = {};\n this.lastSearchResults = [];\n this.needSingleMessages = [];\n this.fetchSingleMessagesTimeout = 0;\n this.incrementedMessageViews = {};\n this.needIncrementMessageViews = [];\n this.incrementMessageViewsTimeout = false;\n this.maxSeenID = 0;\n this.allDialogsLoaded = false;\n this.dialogsOffsetDate = 0;\n this.pinnedIndex = 0;\n this.dialogsNum = 0;\n this.migratedFromTo = {};\n this.migratedToFrom = {};\n this.newMessagesHandlePromise = 0;\n this.newMessagesToHandle = {};\n this.newDialogsHandlePromise = 0;\n this.newDialogsToHandle = {};\n this.notificationsHandlePromise = 0;\n this.notificationsToHandle = {};\n this.newUpdatesAfterReloadToHandle = {};\n this.fwdMessagesPluralize = _('conversation_forwarded_X_messages');\n this.gameScorePluralize = _('conversation_scored_X');\n storage_1.default.get('max_seen_msg').then(function (maxID) {\n if (maxID &&\n !exports.appMessagesIDsManager.getMessageIDInfo(maxID)[1]) {\n _this.maxSeenID = maxID;\n }\n });\n $rootScope.$on('apiUpdate', function (e) {\n var update = e.detail;\n // if (update._ != 'updateUserStatus') {\n // console.log('on apiUpdate', update)\n // }\n _this.handleUpdate(update);\n });\n /* $rootScope.$on('webpage_updated', (e: CustomEvent) => {\n let eventData = e.detail;\n eventData.msgs((msgID: number) => {\n var historyMessage = this.messagesForHistory[msgID];\n if (historyMessage) {\n historyMessage.media = {\n _: 'messageMediaWebPage',\n webpage: AppWebPagesManager.wrapForHistory(eventData.id)\n };\n \n $rootScope.$broadcast('message_edit', {\n peerID: this.getMessagePeer(historyMessage),\n id: historyMessage.id,\n mid: msgID,\n justMedia: true\n });\n }\n });\n }); */\n $rootScope.$on('draft_updated', function (e) {\n var eventData = e.detail;\n ;\n var peerID = eventData.peerID;\n var draft = eventData.draft;\n var dialog = _this.getDialogByPeerID(peerID)[0];\n if (dialog) {\n var topDate;\n if (draft && draft.date) {\n topDate = draft.date;\n }\n else {\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var topDate = _this.getMessage(dialog.top_message).date;\n if (channelID) {\n var channel = exports.appChatsManager.getChat(channelID);\n if (!topDate || channel.date && channel.date > topDate) {\n topDate = channel.date;\n }\n }\n }\n if (!dialog.pFlags.pinned) {\n dialog.index = _this.generateDialogIndex(topDate);\n }\n _this.pushDialogToStorage(dialog);\n $rootScope.$broadcast('dialog_draft', {\n peerID: peerID,\n draft: draft,\n index: dialog.index\n });\n }\n });\n }\n AppMessagesManager.prototype.getInputEntities = function (entities) {\n var sendEntites = utils_1.copy(entities);\n sendEntites.forEach(function (entity) {\n if (entity._ == 'messageEntityMentionName') {\n entity._ = 'inputMessageEntityMentionName';\n entity.user_id = exports.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n };\n AppMessagesManager.prototype.sendText = function (peerID, text, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n if (typeof (text) != 'string') {\n return;\n }\n peerID = exports.appPeersManager.getPeerMigratedTo(peerID) || peerID;\n var entities = options.entities || [];\n if (!options.viaBotID) {\n text = richtextprocessor_1.RichTextProcessor.parseMarkdown(text, entities);\n }\n if (!text.length) {\n return;\n }\n var sendEntites = this.getInputEntities(entities);\n var messageID = this.tempID--;\n var randomID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n var randomIDS = bin_utils_1.bigint(randomID[0]).shiftLeft(32).add(bin_utils_1.bigint(randomID[1])).toString();\n var historyStorage = this.historiesStorage[peerID];\n var flags = 0;\n var pFlags = {};\n var replyToMsgID = options.replyToMsgID;\n var isChannel = exports.appPeersManager.isChannel(peerID);\n var isMegagroup = isChannel && exports.appPeersManager.isMegagroup(peerID);\n var asChannel = isChannel && !isMegagroup ? true : false;\n var message;\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = { count: null, history: [], pending: [] };\n }\n var fromID = exports.appUsersManager.getSelf().id;\n if (peerID != fromID) {\n flags |= 2;\n pFlags.out = true;\n if (!isChannel && !exports.appUsersManager.isBot(peerID)) {\n flags |= 1;\n pFlags.unread = true;\n }\n }\n if (replyToMsgID) {\n flags |= 8;\n }\n if (asChannel) {\n fromID = 0;\n pFlags.post = true;\n }\n else {\n flags |= 256;\n }\n message = {\n _: 'message',\n id: messageID,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: flags,\n pFlags: pFlags,\n date: utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n message: text,\n random_id: randomIDS,\n reply_to_msg_id: replyToMsgID,\n via_bot_id: options.viaBotID,\n reply_markup: options.reply_markup,\n entities: entities,\n views: asChannel && 1,\n pending: true\n };\n var toggleError = function (on) {\n var historyMessage = _this.messagesForHistory[messageID];\n if (on) {\n message.error = true;\n if (historyMessage) {\n historyMessage.error = true;\n }\n }\n else {\n delete message.error;\n if (historyMessage) {\n delete historyMessage.error;\n }\n }\n $rootScope.$broadcast('messages_pending');\n };\n message.send = function () {\n toggleError(false);\n var sentRequestOptions = {};\n if (_this.pendingAfterMsgs[peerID]) {\n sentRequestOptions.afterMessageID = _this.pendingAfterMsgs[peerID].messageID;\n }\n var flags = 0;\n if (replyToMsgID) {\n flags |= 1;\n }\n if (asChannel) {\n flags |= 16;\n }\n if (options.clearDraft) {\n flags |= 128;\n }\n var apiPromise;\n if (options.viaBotID) {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.sendInlineBotResult', {\n flags: flags,\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n random_id: randomID,\n reply_to_msg_id: exports.appMessagesIDsManager.getMessageLocalID(replyToMsgID),\n query_id: options.queryID,\n id: options.resultID\n }, sentRequestOptions);\n }\n else {\n if (sendEntites.length) {\n flags |= 8;\n }\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.sendMessage', {\n flags: flags,\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n message: text,\n random_id: randomID,\n reply_to_msg_id: exports.appMessagesIDsManager.getMessageLocalID(replyToMsgID),\n entities: sendEntites\n }, sentRequestOptions);\n }\n // console.log(flags, entities)\n apiPromise.then(function (updates) {\n if (updates._ == 'updateShortSentMessage') {\n message.flags = updates.flags;\n message.date = updates.date;\n message.id = updates.id;\n message.media = updates.media;\n message.entities = updates.entities;\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n updates: [{\n _: 'updateMessageID',\n random_id: randomIDS,\n id: updates.id\n }, {\n _: isChannel\n ? 'updateNewChannelMessage'\n : 'updateNewMessage',\n message: message,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n }\n else if (updates.updates) {\n updates.updates.forEach(function (update) {\n if (update._ == 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n exports.apiUpdatesManager.processUpdateMessage(updates);\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n }, function (error) {\n toggleError(true);\n }).finally(function () {\n if (_this.pendingAfterMsgs[peerID] === sentRequestOptions) {\n delete _this.pendingAfterMsgs[peerID];\n }\n });\n _this.pendingAfterMsgs[peerID] = sentRequestOptions;\n };\n this.saveMessages([message]);\n historyStorage.pending.unshift(messageID);\n $rootScope.$broadcast('history_append', { peerID: peerID, messageID: messageID, my: true });\n setTimeout(function () { return message.send(); }, 0);\n // setTimeout(function () {\n // message.send()\n // }, 5000)\n /* if(options.clearDraft) { // WARNING\n DraftsManager.clearDraft(peerID)\n } */\n this.pendingByRandomID[randomIDS] = [peerID, messageID];\n };\n AppMessagesManager.prototype.getConversations = function (query, offsetIndex, limit) {\n var _this = this;\n if (limit === void 0) { limit = 20; }\n var curDialogStorage = this.dialogsStorage;\n var isSearch = typeof (query) == 'string' && query.length;\n if (isSearch) {\n if (!limit || this.cachedResults.query !== query) {\n this.cachedResults.query = query;\n var results = utils_1.SearchIndexManager.search(query, this.dialogsIndex);\n this.cachedResults.dialogs = [];\n this.dialogsStorage.dialogs.forEach(function (dialog) {\n if (results[dialog.peerID]) {\n _this.cachedResults.dialogs.push(dialog);\n }\n });\n this.cachedResults.count = this.cachedResults.dialogs.length;\n }\n curDialogStorage = this.cachedResults;\n }\n else {\n this.cachedResults.query = false;\n }\n var offset = 0;\n if (offsetIndex > 0) {\n for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n break;\n }\n }\n }\n if (isSearch ||\n this.allDialogsLoaded ||\n curDialogStorage.dialogs.length >= offset + limit) {\n return Promise.resolve({\n dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n });\n }\n return this.getTopMessages(limit).then(function () {\n offset = 0;\n if (offsetIndex > 0) {\n for (offset = 0; offset < curDialogStorage.dialogs.length; offset++) {\n if (offsetIndex > curDialogStorage.dialogs[offset].index) {\n break;\n }\n }\n }\n console.warn(offset, offset + limit, curDialogStorage.dialogs.length, _this.dialogsStorage.dialogs.length);\n return {\n dialogs: curDialogStorage.dialogs.slice(offset, offset + limit)\n };\n });\n };\n AppMessagesManager.prototype.getTopMessages = function (limit) {\n var _this = this;\n var dialogs = this.dialogsStorage.dialogs;\n var offsetDate = 0;\n var offsetID = 0;\n var offsetPeerID = 0;\n var offsetIndex = 0;\n var flags = 0;\n if (this.dialogsOffsetDate) {\n offsetDate = this.dialogsOffsetDate + mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n offsetIndex = this.dialogsOffsetDate * 0x10000;\n flags |= 1;\n }\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getDialogs', {\n flags: flags,\n offset_date: offsetDate,\n offset_id: exports.appMessagesIDsManager.getMessageLocalID(offsetID),\n offset_peer: exports.appPeersManager.getInputPeerByID(offsetPeerID),\n limit: limit\n }, {\n timeout: 300\n }).then(function (dialogsResult) {\n if (!offsetDate) {\n mtproto_1.telegramMeWebService.setAuthorized(true);\n }\n exports.appUsersManager.saveApiUsers(dialogsResult.users);\n exports.appChatsManager.saveApiChats(dialogsResult.chats);\n _this.saveMessages(dialogsResult.messages);\n var maxSeenIdIncremented = offsetDate ? true : false;\n var hasPrepend = false;\n dialogsResult.dialogs.reverse();\n dialogsResult.dialogs.forEach(function (dialog) {\n _this.saveConversation(dialog);\n if (offsetIndex && dialog.index > offsetIndex) {\n _this.newDialogsToHandle[dialog.peerID] = dialog;\n hasPrepend = true;\n }\n if (!maxSeenIdIncremented &&\n !exports.appPeersManager.isChannel(exports.appPeersManager.getPeerID(dialog.peer))) {\n _this.incrementMaxSeenID(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n });\n dialogsResult.dialogs.reverse();\n if (!dialogsResult.dialogs.length ||\n !dialogsResult.count ||\n dialogs.length >= dialogsResult.count) {\n _this.allDialogsLoaded = true;\n }\n if (hasPrepend &&\n !_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n else {\n $rootScope.$broadcast('dialogs_multiupdate', {});\n }\n });\n };\n AppMessagesManager.prototype.generateDialogIndex = function (date) {\n if (date === undefined) {\n date = utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n return (date * 0x10000) + ((++this.dialogsNum) & 0xFFFF);\n };\n AppMessagesManager.prototype.pushDialogToStorage = function (dialog, offsetDate) {\n var dialogs = this.dialogsStorage.dialogs;\n var pos = this.getDialogByPeerID(dialog.peerID)[1];\n if (pos !== undefined) {\n dialogs.splice(pos, 1);\n }\n if (offsetDate &&\n !dialog.pFlags.pinned &&\n (!this.dialogsOffsetDate || offsetDate < this.dialogsOffsetDate)) {\n if (pos !== undefined) {\n // So the dialog jumped to the last position\n return false;\n }\n this.dialogsOffsetDate = offsetDate;\n }\n var index = dialog.index;\n var i;\n var len = dialogs.length;\n if (!len || index < dialogs[len - 1].index) {\n dialogs.push(dialog);\n }\n else if (index >= dialogs[0].index) {\n dialogs.unshift(dialog);\n }\n else {\n for (i = 0; i < len; i++) {\n if (index > dialogs[i].index) {\n dialogs.splice(i, 0, dialog);\n break;\n }\n }\n }\n };\n AppMessagesManager.prototype.getMessage = function (messageID) {\n return this.messagesStorage[messageID] || {\n _: 'messageEmpty',\n deleted: true,\n pFlags: { out: false, unread: false }\n };\n };\n AppMessagesManager.prototype.getMessagePeer = function (message) {\n var toID = message.to_id && exports.appPeersManager.getPeerID(message.to_id) || 0;\n if (toID < 0) {\n return toID;\n }\n else if (message.pFlags && message.pFlags.out || message.flags & 2) {\n return toID;\n }\n return message.from_id;\n };\n AppMessagesManager.prototype.getDialogByPeerID = function (peerID) {\n for (var i = 0; i < this.dialogsStorage.dialogs.length; i++) {\n if (this.dialogsStorage.dialogs[i].peerID == peerID) {\n return [this.dialogsStorage.dialogs[i], i];\n }\n }\n return [];\n };\n AppMessagesManager.prototype.reloadConversation = function (peerID) {\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getPeerDialogs', {\n peers: [\n exports.appPeersManager.getInputPeerByID(peerID)\n ]\n }).then(this.applyConversations.bind(this));\n };\n AppMessagesManager.prototype.saveMessages = function (apiMessages, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n apiMessages.forEach(function (apiMessage) {\n if (apiMessage.pFlags === undefined) {\n apiMessage.pFlags = {};\n }\n if (!apiMessage.pFlags.out) {\n apiMessage.pFlags.out = false;\n }\n if (!apiMessage.pFlags.unread) {\n apiMessage.pFlags.unread = false;\n }\n if (apiMessage._ == 'messageEmpty') {\n return;\n }\n var peerID = _this.getMessagePeer(apiMessage);\n var isChannel = apiMessage.to_id._ == 'peerChannel';\n var channelID = isChannel ? -peerID : 0;\n var isBroadcast = isChannel && exports.appChatsManager.isBroadcast(channelID);\n var mid = exports.appMessagesIDsManager.getFullMessageID(apiMessage.id, channelID);\n apiMessage.mid = mid;\n var dialog = _this.getDialogByPeerID(peerID)[0];\n if (dialog && mid > 0) {\n var dialogKey = apiMessage.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id';\n apiMessage.pFlags.unread = mid > dialog[dialogKey];\n }\n else if (options.isNew) {\n apiMessage.pFlags.unread = true;\n }\n // console.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n if (apiMessage.reply_to_msg_id) {\n apiMessage.reply_to_mid = exports.appMessagesIDsManager.getFullMessageID(apiMessage.reply_to_msg_id, channelID);\n }\n apiMessage.date -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n apiMessage.peerID = peerID;\n apiMessage.fromID = apiMessage.pFlags.post ? peerID : apiMessage.from_id;\n var fwdHeader = apiMessage.fwd_from;\n if (fwdHeader) {\n if (peerID == exports.appUsersManager.getSelf().id) {\n if (fwdHeader.saved_from_peer && fwdHeader.saved_from_msg_id) {\n var savedFromPeerID = exports.appPeersManager.getPeerID(fwdHeader.saved_from_peer);\n var savedFromMid = exports.appMessagesIDsManager.getFullMessageID(fwdHeader.saved_from_msg_id, exports.appPeersManager.isChannel(savedFromPeerID) ? -savedFromPeerID : 0);\n apiMessage.savedFrom = savedFromPeerID + '_' + savedFromMid;\n }\n apiMessage.fromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id;\n }\n else {\n apiMessage.fwdFromID = fwdHeader.channel_id ? -fwdHeader.channel_id : fwdHeader.from_id;\n apiMessage.fwdPostID = fwdHeader.channel_post;\n }\n fwdHeader.date -= mtproto_1.MTProto.serverTimeManager.serverTimeOffset;\n }\n if (apiMessage.via_bot_id > 0) {\n apiMessage.viaBotID = apiMessage.via_bot_id;\n }\n var mediaContext = {\n user_id: apiMessage.fromID,\n date: apiMessage.date\n };\n if (apiMessage.media) {\n switch (apiMessage.media._) {\n case 'messageMediaEmpty':\n delete apiMessage.media;\n break;\n case 'messageMediaPhoto':\n if (apiMessage.media.ttl_seconds) {\n apiMessage.media = { _: 'messageMediaUnsupportedWeb' };\n }\n else {\n exports.appPhotosManager.savePhoto(apiMessage.media.photo, mediaContext);\n }\n break;\n /* case 'messageMediaDocument':\n if(apiMessage.media.ttl_seconds) {\n apiMessage.media = {_: 'messageMediaUnsupportedWeb'};\n } else {\n AppDocsManager.saveDoc(apiMessage.media.document, mediaContext);\n }\n break;\n case 'messageMediaWebPage':\n AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.mid, mediaContext);\n break;\n case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n case 'messageMediaInvoice':\n apiMessage.media = { _: 'messageMediaUnsupportedWeb' };\n break;\n case 'messageMediaGeoLive':\n apiMessage.media._ = 'messageMediaGeo';\n break;\n }\n }\n if (apiMessage.action) {\n var migrateFrom;\n var migrateTo;\n switch (apiMessage.action._) {\n case 'messageActionChatEditPhoto':\n exports.appPhotosManager.savePhoto(apiMessage.action.photo, mediaContext);\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelEditPhoto';\n }\n break;\n case 'messageActionChatEditTitle':\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelEditTitle';\n }\n break;\n case 'messageActionChatDeletePhoto':\n if (isBroadcast) {\n apiMessage.action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n case 'messageActionChatAddUser':\n if (apiMessage.action.users.length == 1) {\n apiMessage.action.user_id = apiMessage.action.users[0];\n if (apiMessage.fromID == apiMessage.action.user_id) {\n if (isChannel) {\n apiMessage.action._ = 'messageActionChatJoined';\n }\n else {\n apiMessage.action._ = 'messageActionChatReturn';\n }\n }\n }\n else if (apiMessage.action.users.length > 1) {\n apiMessage.action._ = 'messageActionChatAddUsers';\n }\n break;\n case 'messageActionChatDeleteUser':\n if (apiMessage.fromID == apiMessage.action.user_id) {\n apiMessage.action._ = 'messageActionChatLeave';\n }\n break;\n case 'messageActionChannelMigrateFrom':\n migrateFrom = -apiMessage.action.chat_id;\n migrateTo = -channelID;\n break;\n case 'messageActionChatMigrateTo':\n migrateFrom = -channelID;\n migrateTo = -apiMessage.action.channel_id;\n break;\n case 'messageActionHistoryClear':\n apiMessage.deleted = true;\n apiMessage.clear_history = true;\n apiMessage.pFlags.out = false;\n apiMessage.pFlags.unread = false;\n break;\n case 'messageActionPhoneCall':\n delete apiMessage.fromID;\n apiMessage.action.type =\n (apiMessage.pFlags.out ? 'out_' : 'in_') +\n (apiMessage.action.reason._ == 'phoneCallDiscardReasonMissed' ||\n apiMessage.action.reason._ == 'phoneCallDiscardReasonBusy'\n ? 'missed'\n : 'ok');\n break;\n }\n if (migrateFrom &&\n migrateTo &&\n !_this.migratedFromTo[migrateFrom] &&\n !_this.migratedToFrom[migrateTo]) {\n _this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n if (apiMessage.message && apiMessage.message.length) {\n var myEntities = richtextprocessor_1.RichTextProcessor.parseEntities(apiMessage.message);\n var apiEntities = apiMessage.entities || [];\n apiMessage.totalEntities = richtextprocessor_1.RichTextProcessor.mergeEntities(myEntities, apiEntities, !apiMessage.pending);\n }\n apiMessage.canBeEdited = _this.canMessageBeEdited(apiMessage);\n if (!options.isEdited) {\n _this.messagesStorage[mid] = apiMessage;\n }\n });\n };\n AppMessagesManager.prototype.migrateChecks = function (migrateFrom, migrateTo) {\n var _this = this;\n if (!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n exports.appChatsManager.hasChat(-migrateTo)) {\n var fromChat = exports.appChatsManager.getChat(-migrateFrom);\n if (fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id == -migrateTo) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n setTimeout(function () {\n var foundDialog = _this.getDialogByPeerID(migrateFrom);\n if (foundDialog.length) {\n _this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: migrateFrom });\n }\n $rootScope.$broadcast('dialog_migrate', { migrateFrom: migrateFrom, migrateTo: migrateTo });\n }, 100);\n }\n }\n };\n AppMessagesManager.prototype.canMessageBeEdited = function (message) {\n var goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage',\n 'messageMediaPending'\n ];\n if (message._ != 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) == -1 ||\n message.fromID && exports.appUsersManager.isBot(message.fromID)) {\n return false;\n }\n if (message.media &&\n message.media._ == 'messageMediaDocument' &&\n message.media.document.sticker) {\n return false;\n }\n return true;\n };\n AppMessagesManager.prototype.applyConversations = function (dialogsResult) {\n var _this = this;\n exports.appUsersManager.saveApiUsers(dialogsResult.users);\n exports.appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n var updatedDialogs = {};\n var hasUpdated = false;\n dialogsResult.dialogs.forEach(function (dialog) {\n var peerID = exports.appPeersManager.getPeerID(dialog.peer);\n var topMessage = dialog.top_message;\n var topPendingMesage = _this.pendingTopMsgs[peerID];\n if (topPendingMesage) {\n if (!topMessage || _this.getMessage(topPendingMesage).date > _this.getMessage(topMessage).date) {\n dialog.top_message = topMessage = topPendingMesage;\n }\n }\n if (topMessage) {\n var wasBefore = _this.getDialogByPeerID(peerID).length > 0;\n _this.saveConversation(dialog);\n if (wasBefore) {\n _this.clearDialogCache(topMessage);\n $rootScope.$broadcast('dialog_top', dialog);\n }\n else {\n updatedDialogs[peerID] = dialog;\n hasUpdated = true;\n }\n }\n else {\n var foundDialog = _this.getDialogByPeerID(peerID);\n if (foundDialog.length) {\n _this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: peerID });\n }\n }\n if (_this.newUpdatesAfterReloadToHandle[peerID] !== undefined) {\n for (var i in _this.newUpdatesAfterReloadToHandle[peerID]) {\n var update = _this.newUpdatesAfterReloadToHandle[peerID][i];\n _this.handleUpdate(update);\n }\n delete _this.newUpdatesAfterReloadToHandle[peerID];\n }\n });\n if (hasUpdated) {\n $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs);\n }\n };\n AppMessagesManager.prototype.clearDialogCache = function (msgID) {\n delete this.messagesForDialogs[msgID];\n };\n AppMessagesManager.prototype.saveConversation = function (dialog) {\n var peerID = exports.appPeersManager.getPeerID(dialog.peer);\n if (!peerID) {\n return false;\n }\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var peerText = exports.appPeersManager.getPeerSearchText(peerID);\n utils_1.SearchIndexManager.indexObject(peerID, peerText, this.dialogsIndex);\n var isMegagroup = exports.appPeersManager.isMegagroup(channelID);\n if (dialog.top_message) {\n var mid = exports.appMessagesIDsManager.getFullMessageID(dialog.top_message, channelID);\n var message = this.getMessage(mid);\n }\n else {\n var mid = this.tempID--;\n var message = {\n _: 'message',\n id: mid,\n mid: mid,\n from_id: exports.appUsersManager.getSelf().id,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n deleted: true,\n flags: 0,\n pFlags: { unread: false, out: true },\n date: 0,\n message: ''\n };\n this.saveMessages([message]);\n }\n var offsetDate = message.date;\n if (!channelID && peerID < 0) {\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat && chat.migrated_to && chat.pFlags.deactivated) {\n var migratedToPeer = exports.appPeersManager.getPeerID(chat.migrated_to);\n this.migratedFromTo[peerID] = migratedToPeer;\n this.migratedToFrom[migratedToPeer] = peerID;\n return;\n }\n }\n dialog.top_message = mid;\n dialog.read_inbox_max_id = exports.appMessagesIDsManager.getFullMessageID(dialog.read_inbox_max_id, channelID);\n dialog.read_outbox_max_id = exports.appMessagesIDsManager.getFullMessageID(dialog.read_outbox_max_id, channelID);\n var topDate = message.date;\n if (channelID) {\n var channel = exports.appChatsManager.getChat(channelID);\n if (!topDate || channel.date && channel.date > topDate) {\n topDate = channel.date;\n }\n }\n var savedDraft = {}; // DraftsManager.saveDraft(peerID, dialog.draft); // warning\n if (savedDraft && savedDraft.date > topDate) {\n topDate = savedDraft.date;\n }\n if (dialog.pFlags.pinned) {\n topDate = this.generateDialogPinnedDate();\n }\n dialog.index = this.generateDialogIndex(topDate);\n dialog.peerID = peerID;\n this.pushDialogToStorage(dialog, offsetDate);\n // Because we saved message without dialog present\n var unreadKey = message.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id';\n if (message.mid && message.mid > dialog[unreadKey]) {\n message.pFlags.unread = true;\n }\n if (this.historiesStorage[peerID] === undefined &&\n !message.deleted) {\n var historyStorage = { count: null, history: [], pending: [] };\n historyStorage[mid > 0 ? 'history' : 'pending'].push(mid);\n if (mid < 0 && message.pFlags.unread) {\n dialog.unread_count++;\n }\n this.historiesStorage[peerID] = historyStorage;\n if (this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n }\n //NotificationsManager.savePeerSettings(peerID, dialog.notify_settings); // warning\n if (channelID && dialog.pts) {\n exports.apiUpdatesManager.addChannelState(channelID, dialog.pts);\n }\n if (Config.Modes.packed &&\n !channelID &&\n dialog.unread_count > 0 &&\n this.maxSeenID &&\n dialog.top_message > this.maxSeenID &&\n message.pFlags.unread &&\n !message.pFlags.out) {\n var notifyPeer = message.flags & 16 ? message.from_id : peerID;\n /* NotificationsManager.getPeerMuted(notifyPeer).then((muted: any) => {\n if(!muted) {\n this.notifyAboutMessage(message);\n }\n }); */ // WARNING\n }\n };\n AppMessagesManager.prototype.handleNotifications = function () {\n var _this = this;\n clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n var timeout = $rootScope.idle.isIDLE /* && StatusManager.isOtherDeviceActive() */ ? 30000 : 1000;\n Object.keys(this.notificationsToHandle).forEach(function (key) {\n var notifyPeerToHandle = _this.notificationsToHandle[key];\n notifyPeerToHandle.isMutedPromise.then(function (muted) {\n var topMessage = notifyPeerToHandle.top_message;\n if (muted ||\n !topMessage.pFlags.unread) {\n return;\n }\n setTimeout(function () {\n if (topMessage.pFlags.unread) {\n _this.notifyAboutMessage(topMessage, {\n fwd_count: notifyPeerToHandle.fwd_count\n });\n }\n }, timeout);\n });\n });\n this.notificationsToHandle = {};\n };\n AppMessagesManager.prototype.notifyAboutMessage = function (message, options) {\n if (options === void 0) { options = {}; }\n var peerID = this.getMessagePeer(message);\n var peerString;\n var notification = {};\n var notificationMessage = '', notificationPhoto;\n var notifySettings = {}; //NotificationsManager.getNotifySettings(); // warning\n if (message.fwdFromID && options.fwd_count) {\n notificationMessage = options.fwd_count; // this.fwdMessagesPluralize(options.fwd_count); // warning\n }\n else if (message.message) {\n if (notifySettings.nopreview) {\n notificationMessage = 'conversation_message_sent';\n }\n else {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(message.message);\n }\n }\n else if (message.media) {\n var captionEmoji = '';\n switch (message.media._) {\n case 'messageMediaPhoto':\n notificationMessage = _('conversation_media_photo_raw');\n captionEmoji = 'рџ–ј';\n break;\n case 'messageMediaDocument':\n switch (message.media.document.type) {\n case 'gif':\n notificationMessage = _('conversation_media_gif_raw');\n captionEmoji = 'рџЋ¬';\n break;\n case 'sticker':\n notificationMessage = _('conversation_media_sticker');\n var stickerEmoji = message.media.document.stickerEmojiRaw;\n if (stickerEmoji !== undefined) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(stickerEmoji) + ' ' + notificationMessage;\n }\n break;\n case 'video':\n notificationMessage = _('conversation_media_video_raw');\n captionEmoji = 'рџ“№';\n break;\n case 'round':\n notificationMessage = _('conversation_media_round_raw');\n captionEmoji = 'рџ“№';\n break;\n case 'voice':\n case 'audio':\n notificationMessage = _('conversation_media_audio_raw');\n break;\n default:\n if (message.media.document.file_name) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText('рџ“Ћ ' + message.media.document.file_name);\n }\n else {\n notificationMessage = _('conversation_media_document_raw');\n captionEmoji = 'рџ“Ћ';\n }\n break;\n }\n break;\n case 'messageMediaGeo':\n case 'messageMediaVenue':\n notificationMessage = _('conversation_media_location_raw');\n captionEmoji = 'рџ“Ќ';\n break;\n case 'messageMediaContact':\n notificationMessage = _('conversation_media_contact_raw');\n break;\n case 'messageMediaGame':\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText('рџЋ® ' + message.media.game.title);\n break;\n case 'messageMediaUnsupported':\n notificationMessage = _('conversation_media_unsupported_raw');\n break;\n default:\n notificationMessage = _('conversation_media_attachment_raw');\n break;\n }\n if (captionEmoji != '' &&\n message.media.caption) {\n notificationMessage = richtextprocessor_1.RichTextProcessor.wrapPlainText(captionEmoji + ' ' + message.media.caption);\n }\n }\n else if (message._ == 'messageService') {\n switch (message.action._) {\n case 'messageActionChatCreate':\n notificationMessage = _('conversation_group_created_raw');\n break;\n case 'messageActionChatEditTitle':\n notificationMessage = _('conversation_group_renamed_raw');\n break;\n case 'messageActionChatEditPhoto':\n notificationMessage = _('conversation_group_photo_updated_raw');\n break;\n case 'messageActionChatDeletePhoto':\n notificationMessage = _('conversation_group_photo_removed_raw');\n break;\n case 'messageActionChatAddUser':\n case 'messageActionChatAddUsers':\n notificationMessage = _('conversation_invited_user_message_raw');\n break;\n case 'messageActionChatReturn':\n notificationMessage = _('conversation_returned_to_group_raw');\n break;\n case 'messageActionChatJoined':\n notificationMessage = _('conversation_joined_group_raw');\n break;\n case 'messageActionChatDeleteUser':\n notificationMessage = _('conversation_kicked_user_message_raw');\n break;\n case 'messageActionChatLeave':\n notificationMessage = _('conversation_left_group_raw');\n break;\n case 'messageActionChatJoinedByLink':\n notificationMessage = _('conversation_joined_by_link_raw');\n break;\n case 'messageActionChannelCreate':\n notificationMessage = _('conversation_created_channel_raw');\n break;\n case 'messageActionChannelEditTitle':\n notificationMessage = _('conversation_changed_channel_name_raw');\n break;\n case 'messageActionChannelEditPhoto':\n notificationMessage = _('conversation_changed_channel_photo_raw');\n break;\n case 'messageActionChannelDeletePhoto':\n notificationMessage = _('conversation_removed_channel_photo_raw');\n break;\n case 'messageActionPinMessage':\n notificationMessage = _('conversation_pinned_message_raw');\n break;\n case 'messageActionGameScore':\n notificationMessage = message.action.score; //this.gameScorePluralize(message.action.score); // warning\n break;\n case 'messageActionPhoneCall':\n switch (message.action.type) {\n case 'out_missed':\n notificationMessage = _('message_service_phonecall_canceled_raw');\n break;\n case 'in_missed':\n notificationMessage = _('message_service_phonecall_missed_raw');\n break;\n case 'out_ok':\n notificationMessage = _('message_service_phonecall_outgoing_raw');\n break;\n case 'in_ok':\n notificationMessage = _('message_service_phonecall_incoming_raw');\n break;\n }\n break;\n }\n }\n if (peerID > 0) {\n var fromUser = exports.appUsersManager.getUser(message.from_id);\n var fromPhoto = exports.appUsersManager.getUserPhoto(message.from_id);\n notification.title = (fromUser.first_name || '') +\n (fromUser.first_name && fromUser.last_name ? ' ' : '') +\n (fromUser.last_name || '');\n if (!notification.title) {\n notification.title = fromUser.phone || _('conversation_unknown_user_raw');\n }\n notificationPhoto = fromPhoto;\n peerString = exports.appUsersManager.getUserString(peerID);\n }\n else {\n notification.title = exports.appChatsManager.getChat(-peerID).title || _('conversation_unknown_chat_raw');\n if (message.from_id > 0) {\n var fromUser = exports.appUsersManager.getUser(message.from_id);\n notification.title = (fromUser.first_name || fromUser.last_name || _('conversation_unknown_user_raw')) +\n ' @ ' +\n notification.title;\n }\n notificationPhoto = exports.appChatsManager.getChatPhoto(-peerID);\n peerString = exports.appChatsManager.getChatString(-peerID);\n }\n notification.title = richtextprocessor_1.RichTextProcessor.wrapPlainText(notification.title);\n notification.onclick = function () {\n $rootScope.$broadcast('history_focus', {\n peerString: peerString,\n messageID: message.flags & 16 ? message.mid : 0\n });\n };\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = message.pFlags.silent || false;\n if (notificationPhoto.location && !notificationPhoto.location.empty) {\n mtproto_1.MTProto.apiFileManager.downloadSmallFile(notificationPhoto.location /* , notificationPhoto.size */)\n .then(function (blob) {\n if (message.pFlags.unread) {\n notification.image = blob;\n // NotificationsManager.notify(notification) // warning\n }\n });\n }\n else {\n // NotificationsManager.notify(notification) // warning\n }\n };\n AppMessagesManager.prototype.mergeReplyKeyboard = function (historyStorage, message) {\n // console.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if (!message.reply_markup &&\n !message.pFlags.out &&\n !message.action) {\n return false;\n }\n if (message.reply_markup &&\n message.reply_markup._ == 'replyInlineMarkup') {\n return false;\n }\n var messageReplyMarkup = message.reply_markup;\n var lastReplyMarkup = historyStorage.reply_markup;\n if (messageReplyMarkup) {\n if (lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n if (messageReplyMarkup.pFlags.selective &&\n !(message.flags & 16)) {\n return false;\n }\n if (historyStorage.maxOutID &&\n message.mid < historyStorage.maxOutID &&\n messageReplyMarkup.pFlags.single_use) {\n messageReplyMarkup.pFlags.hidden = true;\n }\n messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup);\n if (messageReplyMarkup._ != 'replyKeyboardHide') {\n messageReplyMarkup.fromID = message.from_id;\n }\n historyStorage.reply_markup = messageReplyMarkup;\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n if (message.pFlags.out) {\n if (lastReplyMarkup) {\n if (lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.mid < 0) &&\n message.message) {\n lastReplyMarkup.pFlags.hidden = true;\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n }\n else if (!historyStorage.maxOutID ||\n message.mid > historyStorage.maxOutID) {\n historyStorage.maxOutID = message.mid;\n }\n }\n if (message.action &&\n message.action._ == 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id == lastReplyMarkup.fromID\n : exports.appUsersManager.isBot(message.action.user_id))) {\n historyStorage.reply_markup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n flags: 0,\n pFlags: {}\n };\n // console.log('set', historyStorage.reply_markup)\n return true;\n }\n return false;\n };\n AppMessagesManager.prototype.generateDialogPinnedDate = function () {\n return 0x7fffff00 + ((this.pinnedIndex++) & 0xff);\n };\n AppMessagesManager.prototype.handleNewMessages = function () {\n clearTimeout(this.newMessagesHandlePromise);\n this.newMessagesHandlePromise = 0;\n $rootScope.$broadcast('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n AppMessagesManager.prototype.handleNewDialogs = function () {\n var _this = this;\n clearTimeout(this.newDialogsHandlePromise);\n this.newDialogsHandlePromise = 0;\n var newMaxSeenID = 0;\n Object.keys(this.newDialogsToHandle).forEach(function (peerID) {\n var dialog = _this.newDialogsToHandle[peerID];\n if (dialog.reload) {\n _this.reloadConversation(+peerID);\n delete _this.newDialogsToHandle[peerID];\n }\n else {\n _this.pushDialogToStorage(dialog);\n if (!exports.appPeersManager.isChannel(+peerID)) {\n newMaxSeenID = Math.max(newMaxSeenID, dialog.top_message || 0);\n }\n }\n });\n if (newMaxSeenID != 0) {\n this.incrementMaxSeenID(newMaxSeenID);\n }\n $rootScope.$broadcast('dialogs_multiupdate', this.newDialogsToHandle);\n this.newDialogsToHandle = {};\n };\n AppMessagesManager.prototype.readHistory = function (peerID, maxID) {\n if (maxID === void 0) { maxID = 0; }\n // console.trace('start read')\n var isChannel = exports.appPeersManager.isChannel(peerID);\n var historyStorage = this.historiesStorage[peerID];\n var foundDialog = this.getDialogByPeerID(peerID)[0];\n if (!foundDialog || !foundDialog.unread_count) {\n if (!historyStorage || !historyStorage.history.length) {\n return false;\n }\n var messageID, message;\n var foundUnread = false;\n for (i = historyStorage.history.length; i >= 0; i--) {\n messageID = historyStorage.history[i];\n message = this.messagesStorage[messageID];\n if (message && !message.pFlags.out && message.pFlags.unread) {\n foundUnread = true;\n break;\n }\n }\n if (!foundUnread) {\n return false;\n }\n }\n if (historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n var apiPromise;\n if (isChannel) {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('channels.readHistory', {\n channel: exports.appChatsManager.getChannelInput(-peerID),\n max_id: maxID\n });\n }\n else {\n apiPromise = mtproto_1.MTProto.apiManager.invokeApi('messages.readHistory', {\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n max_id: maxID\n }).then(function (affectedMessages) {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n historyStorage.readPromise = apiPromise.then(function () {\n if (foundDialog) {\n // console.log('done read history', peerID)\n var index = -1;\n if (maxID != 0 && historyStorage && historyStorage.history.length) {\n index = historyStorage.history.findIndex(function (mid) { return mid == maxID; });\n }\n foundDialog.unread_count = index == -1 ? 0 : index;\n $rootScope.$broadcast('dialog_unread', { peerID: peerID, count: foundDialog.unread_count });\n $rootScope.$broadcast('messages_read');\n if (historyStorage && historyStorage.history.length) {\n console.warn('readPromise:', index, historyStorage.history[index != -1 ? index : 0]);\n foundDialog.read_inbox_max_id = historyStorage.history[index != -1 ? index : 0];\n }\n }\n /* if (foundDialog) {\n // console.log('done read history', peerID)\n foundDialog.unread_count = 0\n $rootScope.$broadcast('dialog_unread', {peerID: peerID, count: 0})\n $rootScope.$broadcast('messages_read')\n if (historyStorage && historyStorage.history.length) {\n foundDialog.read_inbox_max_id = historyStorage.history[0]\n }\n } */\n }).finally(function () {\n delete historyStorage.readPromise;\n });\n if (historyStorage && historyStorage.history.length) {\n var messageID;\n var message, i;\n var peerID, foundDialog;\n for (i = 0; i < historyStorage.history.length; i++) {\n messageID = historyStorage.history[i];\n message = this.messagesStorage[messageID];\n if (message && !message.pFlags.out) {\n message.pFlags.unread = false;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].pFlags.unread = false;\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].pFlags.unread = false;\n }\n //NotificationsManager.cancel('msg' + messageID); // warning\n }\n if (messageID == maxID)\n break;\n }\n }\n // NotificationsManager.soundReset(AppPeersManager.getPeerString(peerID)) // warning\n return historyStorage.readPromise;\n };\n AppMessagesManager.prototype.readMessages = function (messageIDs) {\n var splitted = exports.appMessagesIDsManager.splitMessageIDsByChannels(messageIDs);\n Object.keys(splitted.msgIDs).forEach(function (channelID) {\n channelID = +channelID;\n var msgIDs = splitted.msgIDs[channelID];\n if (channelID > 0) {\n mtproto_1.MTProto.apiManager.invokeApi('channels.readMessageContents', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n id: msgIDs\n }).then(function () {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelID,\n messages: msgIDs\n }\n });\n });\n }\n else {\n mtproto_1.MTProto.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIDs\n }).then(function (affectedMessages) {\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateReadMessagesContents',\n messages: msgIDs,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n });\n };\n AppMessagesManager.prototype.handleUpdate = function (update) {\n var _this = this;\n switch (update._) {\n case 'updateMessageID':\n var randomID = update.random_id;\n var pendingData = this.pendingByRandomID[randomID];\n if (pendingData) {\n var peerID = pendingData[0];\n var tempID = pendingData[1];\n var channelID = exports.appPeersManager.isChannel(peerID) ? -peerID : 0;\n var mid = exports.appMessagesIDsManager.getFullMessageID(update.id, channelID);\n var message = this.messagesStorage[mid];\n if (message) {\n var historyStorage = this.historiesStorage[peerID];\n var pos = historyStorage.pending.indexOf(tempID);\n if (pos != -1) {\n historyStorage.pending.splice(pos, 1);\n }\n delete this.messagesForHistory[tempID];\n delete this.messagesStorage[tempID];\n var msgs = {};\n msgs[tempID] = true;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: msgs });\n this.finalizePendingMessageCallbacks(tempID, mid);\n }\n else {\n this.pendingByMessageID[mid] = randomID;\n }\n }\n break;\n case 'updateNewMessage':\n case 'updateNewChannelMessage':\n var message = update.message;\n var peerID = this.getMessagePeer(message);\n var historyStorage = this.historiesStorage[peerID];\n var foundDialog = this.getDialogByPeerID(peerID);\n if (!foundDialog.length) {\n this.newDialogsToHandle[peerID] = { reload: true };\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n if (this.newUpdatesAfterReloadToHandle[peerID] === undefined) {\n this.newUpdatesAfterReloadToHandle[peerID] = [];\n }\n this.newUpdatesAfterReloadToHandle[peerID].push(update);\n break;\n }\n if (update._ == 'updateNewChannelMessage') {\n var chat = exports.appChatsManager.getChat(-peerID);\n if (chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n break;\n }\n }\n this.saveMessages([message], { isNew: true });\n // console.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = {\n count: null,\n history: [],\n pending: []\n };\n }\n var history = message.mid > 0 ? historyStorage.history : historyStorage.pending;\n if (history.indexOf(message.mid) != -1) {\n return false;\n }\n var topMsgID = history[0];\n history.unshift(message.mid);\n if (message.mid > 0 && message.mid < topMsgID) {\n history.sort(function (a, b) {\n return b - a;\n });\n }\n if (message.mid > 0 &&\n historyStorage.count !== null) {\n historyStorage.count++;\n }\n if (this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n if (!message.pFlags.out && message.from_id) {\n exports.appUsersManager.forceUserOnline(message.from_id);\n }\n var randomID = this.pendingByMessageID[message.mid], pendingMessage;\n if (randomID) {\n if (pendingMessage = this.finalizePendingMessage(randomID, message)) {\n $rootScope.$broadcast('history_update', { peerID: peerID });\n }\n delete this.pendingByMessageID[message.mid];\n }\n if (!pendingMessage) {\n if (this.newMessagesToHandle[peerID] === undefined) {\n this.newMessagesToHandle[peerID] = [];\n }\n this.newMessagesToHandle[peerID].push(message.mid);\n if (!this.newMessagesHandlePromise) {\n this.newMessagesHandlePromise = window.setTimeout(this.handleNewMessages.bind(this), 0);\n }\n }\n var inboxUnread = !message.pFlags.out && message.pFlags.unread;\n var dialog = foundDialog[0];\n dialog.top_message = message.mid;\n if (inboxUnread) {\n dialog.unread_count++;\n }\n if (!dialog.pFlags.pinned || !dialog.index) {\n dialog.index = this.generateDialogIndex(message.date);\n }\n this.newDialogsToHandle[peerID] = dialog;\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n if (inboxUnread &&\n ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE)) {\n var notifyPeer = message.flags & 16 ? message.from_id : peerID;\n var notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if (notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n isMutedPromise: Promise.resolve() /* NotificationsManager.getPeerMuted(notifyPeer) */,\n fwd_count: 0,\n from_id: 0\n };\n }\n if (notifyPeerToHandle.from_id != message.from_id) {\n notifyPeerToHandle.from_id = message.from_id;\n notifyPeerToHandle.fwd_count = 0;\n }\n if (message.fwdFromID) {\n notifyPeerToHandle.fwd_count++;\n }\n notifyPeerToHandle.top_message = message;\n if (!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications.bind(this), 1000);\n }\n }\n break;\n case 'updateDialogPinned':\n var peerID = exports.appPeersManager.getPeerID(update.peer);\n var foundDialog = this.getDialogByPeerID(peerID);\n if (!foundDialog.length || !update.pFlags.pinned) {\n this.newDialogsToHandle[peerID] = { reload: true };\n if (!this.newDialogsHandlePromise) {\n this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0);\n }\n break;\n }\n var dialog = foundDialog[0];\n dialog.index = this.generateDialogIndex(this.generateDialogPinnedDate());\n dialog.pFlags.pinned = true;\n break;\n case 'updatePinnedDialogs':\n var newPinned = {};\n if (!update.order) {\n mtproto_1.MTProto.apiManager.invokeApi('messages.getPinnedDialogs', {}).then(function (dialogsResult) {\n dialogsResult.dialogs.reverse();\n _this.applyConversations(dialogsResult);\n dialogsResult.dialogs.forEach(function (dialog) {\n newPinned[dialog.peerID] = true;\n });\n _this.dialogsStorage.dialogs.forEach(function (dialog) {\n var peerID = dialog.peerID;\n if (dialog.pFlags.pinned && !newPinned[peerID]) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n }\n });\n });\n break;\n }\n update.order.reverse();\n update.order.forEach(function (peer) {\n var peerID = exports.appPeersManager.getPeerID(peer);\n newPinned[peerID] = true;\n var foundDialog = _this.getDialogByPeerID(peerID);\n if (!foundDialog.length) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n return;\n }\n var dialog = foundDialog[0];\n dialog.index = _this.generateDialogIndex(_this.generateDialogPinnedDate());\n dialog.pFlags.pinned = true;\n _this.newDialogsToHandle[peerID] = dialog;\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n });\n this.dialogsStorage.dialogs.forEach(function (dialog) {\n var peerID = dialog.peerID;\n if (dialog.pFlags.pinned && !newPinned[peerID]) {\n _this.newDialogsToHandle[peerID] = { reload: true };\n if (!_this.newDialogsHandlePromise) {\n _this.newDialogsHandlePromise = window.setTimeout(_this.handleNewDialogs.bind(_this), 0);\n }\n }\n });\n break;\n case 'updateEditMessage':\n case 'updateEditChannelMessage':\n var message = update.message;\n var peerID = this.getMessagePeer(message);\n var channelID = message.to_id._ == 'peerChannel' ? -peerID : 0;\n var mid = exports.appMessagesIDsManager.getFullMessageID(message.id, channelID);\n if (this.messagesStorage[mid] === undefined) {\n break;\n }\n // console.trace(dT(), 'edit message', message)\n this.saveMessages([message], { isEdited: true });\n utils_1.safeReplaceObject(this.messagesStorage[mid], message);\n var wasForHistory = this.messagesForHistory[mid];\n if (wasForHistory !== undefined) {\n delete this.messagesForHistory[mid];\n var newForHistory = this.wrapForHistory(mid);\n utils_1.safeReplaceObject(wasForHistory, newForHistory);\n this.messagesForHistory[mid] = wasForHistory;\n }\n var dialog = this.getDialogByPeerID(peerID)[0];\n var isTopMessage = dialog && dialog.top_message == mid;\n if (message.clear_history) {\n if (isTopMessage) {\n $rootScope.$broadcast('dialog_flush', { peerID: peerID });\n }\n else {\n var msgs = {};\n msgs[mid] = true;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: msgs });\n }\n }\n else {\n $rootScope.$broadcast('message_edit', {\n peerID: peerID,\n id: message.id,\n mid: mid\n });\n if (isTopMessage) {\n var updatedDialogs = {};\n updatedDialogs[peerID] = dialog;\n $rootScope.$broadcast('dialogs_multiupdate', updatedDialogs);\n }\n }\n break;\n case 'updateReadHistoryInbox':\n case 'updateReadHistoryOutbox':\n case 'updateReadChannelInbox':\n case 'updateReadChannelOutbox':\n var isOut = update._ == 'updateReadHistoryOutbox' || update._ == 'updateReadChannelOutbox';\n var channelID = update.channel_id;\n var maxID = exports.appMessagesIDsManager.getFullMessageID(update.max_id, channelID);\n var peerID = channelID ? -channelID : exports.appPeersManager.getPeerID(update.peer);\n var foundDialog = this.getDialogByPeerID(peerID);\n var history = (this.historiesStorage[peerID] || {}).history || [];\n var newUnreadCount = 0;\n var length = history.length;\n var foundAffected = false;\n var messageID, message;\n var i;\n //console.warn(dT(), 'read', peerID, isOut ? 'out' : 'in', maxID)\n if (peerID > 0 && isOut) {\n exports.appUsersManager.forceUserOnline(peerID);\n }\n for (i = 0; i < length; i++) {\n messageID = history[i];\n if (messageID > maxID) {\n continue;\n }\n message = this.messagesStorage[messageID];\n if (message.pFlags.out != isOut) {\n continue;\n }\n if (!message.pFlags.unread) {\n break;\n }\n // console.warn('read', messageID, message.pFlags.unread, message)\n if (message && message.pFlags.unread) {\n message.pFlags.unread = false;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].pFlags.unread = false;\n if (!foundAffected) {\n foundAffected = true;\n }\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].pFlags.unread = false;\n }\n if (!message.pFlags.out) {\n if (foundDialog[0]) {\n newUnreadCount = --foundDialog[0].unread_count;\n }\n //NotificationsManager.cancel('msg' + messageID); // warning\n }\n }\n }\n if (foundDialog[0]) {\n if (!isOut &&\n newUnreadCount &&\n foundDialog[0].top_message <= maxID) {\n newUnreadCount = foundDialog[0].unread_count = 0;\n }\n var dialogKey = isOut ? 'read_outbox_max_id' : 'read_inbox_max_id';\n foundDialog[0][dialogKey] = maxID;\n }\n //if(newUnreadCount != 0 || !isOut) { // fix 16.11.2019 (maybe not)\n console.warn(utils_1.dT(), 'cnt', peerID, newUnreadCount);\n $rootScope.$broadcast('dialog_unread', { peerID: peerID, count: newUnreadCount });\n //}\n if (foundAffected) {\n $rootScope.$broadcast('messages_read');\n }\n break;\n case 'updateChannelReadMessagesContents':\n var channelID = update.channel_id;\n var newMessages = [];\n update.messages.forEach(function (msgID) {\n newMessages.push(exports.appMessagesIDsManager.getFullMessageID(msgID, channelID));\n });\n update.messages = newMessages;\n case 'updateReadMessagesContents':\n var messages = update.messages;\n var len = messages.length;\n var i;\n var messageID, message;\n var historyMessage;\n for (i = 0; i < len; i++) {\n messageID = messages[i];\n if (message = this.messagesStorage[messageID]) {\n delete message.pFlags.media_unread;\n }\n if (historyMessage = this.messagesForHistory[messageID]) {\n delete historyMessage.pFlags.media_unread;\n }\n }\n break;\n case 'updateChannelAvailableMessages':\n var channelID = update.channel_id;\n var messages = [];\n var peerID = -channelID;\n var history = (this.historiesStorage[peerID] || {}).history || [];\n if (history.length) {\n history.forEach(function (msgID) {\n if (!update.available_min_id ||\n exports.appMessagesIDsManager.getMessageLocalID(msgID) <= update.available_min_id) {\n messages.push(msgID);\n }\n });\n }\n update.messages = messages;\n case 'updateDeleteMessages':\n case 'updateDeleteChannelMessages':\n var dialogsUpdated = {};\n var historiesUpdated = {};\n var channelID = update.channel_id;\n var messageID;\n var message, i;\n var peerID, foundDialog;\n var history;\n var peerMessagesToHandle;\n var peerMessagesHandlePos;\n for (i = 0; i < update.messages.length; i++) {\n messageID = exports.appMessagesIDsManager.getFullMessageID(update.messages[i], channelID);\n message = this.messagesStorage[messageID];\n if (message) {\n peerID = this.getMessagePeer(message);\n history = historiesUpdated[peerID] || (historiesUpdated[peerID] = { count: 0, unread: 0, msgs: {} });\n if (!message.pFlags.out && message.pFlags.unread) {\n history.unread++;\n // NotificationsManager.cancel('msg' + messageID); // warning\n }\n history.count++;\n history.msgs[messageID] = true;\n if (this.messagesForHistory[messageID]) {\n this.messagesForHistory[messageID].deleted = true;\n delete this.messagesForHistory[messageID];\n }\n if (this.messagesForDialogs[messageID]) {\n this.messagesForDialogs[messageID].deleted = true;\n delete this.messagesForDialogs[messageID];\n }\n message.deleted = true;\n this.messagesStorage[messageID] = {\n deleted: true,\n id: messageID,\n from_id: message.from_id,\n to_id: message.to_id,\n flags: message.flags,\n pFlags: message.pFlags,\n date: message.date\n };\n peerMessagesToHandle = this.newMessagesToHandle[peerID];\n if (peerMessagesToHandle && peerMessagesToHandle.length) {\n peerMessagesHandlePos = peerMessagesToHandle.indexOf(messageID);\n if (peerMessagesHandlePos != -1) {\n peerMessagesToHandle.splice(peerMessagesHandlePos);\n }\n }\n }\n }\n Object.keys(historiesUpdated).forEach(function (peerID) {\n var updatedData = historiesUpdated[peerID];\n var historyStorage = _this.historiesStorage[peerID];\n if (historyStorage !== undefined) {\n var newHistory = [];\n var newPending = [];\n for (var i = 0; i < historyStorage.history.length; i++) {\n if (!updatedData.msgs[historyStorage.history[i]]) {\n newHistory.push(historyStorage.history[i]);\n }\n }\n historyStorage.history = newHistory;\n if (updatedData.count &&\n historyStorage.count !== null &&\n historyStorage.count > 0) {\n historyStorage.count -= updatedData.count;\n if (historyStorage.count < 0) {\n historyStorage.count = 0;\n }\n }\n for (var i = 0; i < historyStorage.pending.length; i++) {\n if (!updatedData.msgs[historyStorage.pending[i]]) {\n newPending.push(historyStorage.pending[i]);\n }\n }\n historyStorage.pending = newPending;\n $rootScope.$broadcast('history_delete', { peerID: peerID, msgs: updatedData.msgs });\n }\n var foundDialog = _this.getDialogByPeerID(+peerID)[0];\n if (foundDialog) {\n if (updatedData.unread) {\n foundDialog.unread_count -= updatedData.unread;\n $rootScope.$broadcast('dialog_unread', {\n peerID: peerID,\n count: foundDialog.unread_count\n });\n }\n if (updatedData.msgs[foundDialog.top_message]) {\n _this.reloadConversation(+peerID);\n }\n }\n });\n break;\n case 'updateChannel':\n var channelID = update.channel_id;\n var peerID = -channelID;\n var channel = exports.appChatsManager.getChat(channelID);\n var needDialog = channel._ == 'channel' && (!channel.pFlags.left && !channel.pFlags.kicked);\n var foundDialog = this.getDialogByPeerID(peerID);\n var hasDialog = foundDialog.length > 0;\n var canViewHistory = channel._ == 'channel' && (channel.username || !channel.pFlags.left && !channel.pFlags.kicked) && true || false;\n var hasHistory = this.historiesStorage[peerID] !== undefined;\n if (canViewHistory != hasHistory) {\n delete this.historiesStorage[peerID];\n $rootScope.$broadcast('history_forbidden', peerID);\n }\n if (hasDialog != needDialog) {\n if (needDialog) {\n this.reloadConversation(-channelID);\n }\n else {\n if (foundDialog[0]) {\n this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n $rootScope.$broadcast('dialog_drop', { peerID: peerID });\n }\n }\n }\n break;\n case 'updateChannelReload':\n var channelID = update.channel_id;\n var peerID = -channelID;\n var foundDialog = this.getDialogByPeerID(peerID);\n if (foundDialog[0]) {\n this.dialogsStorage.dialogs.splice(foundDialog[1], 1);\n }\n delete this.historiesStorage[peerID];\n this.reloadConversation(-channelID).then(function () {\n $rootScope.$broadcast('history_reload', peerID);\n });\n break;\n case 'updateChannelMessageViews':\n var views = update.views;\n var mid = exports.appMessagesIDsManager.getFullMessageID(update.id, update.channel_id);\n var message = this.getMessage(mid);\n if (message && message.views && message.views < views) {\n message.views = views;\n $rootScope.$broadcast('message_views', {\n mid: mid,\n views: views\n });\n }\n break;\n case 'updateServiceNotification':\n // update.inbox_date = tsNow(true)\n // update.pFlags = {popup: true}\n var fromID = 777000;\n var peerID = fromID;\n var messageID = this.tempID--;\n var message = {\n _: 'message',\n id: messageID,\n from_id: fromID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: 0,\n pFlags: { unread: true },\n date: (update.inbox_date || utils_1.tsNow(true)) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if (!exports.appUsersManager.hasUser(fromID)) {\n exports.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromID,\n pFlags: { verified: true },\n access_hash: 0,\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message]);\n if (update.inbox_date) {\n this.pendingTopMsgs[peerID] = messageID;\n this.handleUpdate({\n _: 'updateNewMessage',\n message: message\n });\n }\n if (update.pFlags.popup && update.message) {\n var historyMessage = this.wrapForHistory(messageID);\n //ErrorService.show({error: {code: 400, type: 'UPDATE_SERVICE_NOTIFICATION'}, historyMessage: historyMessage}); // warning\n }\n break;\n }\n };\n AppMessagesManager.prototype.wrapForHistory = function (msgID) {\n if (this.messagesForHistory[msgID] !== undefined) {\n return this.messagesForHistory[msgID];\n }\n var message = utils_1.copy(this.messagesStorage[msgID]) || { id: msgID };\n if (message.media && message.media.progress !== undefined) {\n message.media.progress = this.messagesStorage[msgID].media.progress;\n }\n var fromUser = message.from_id && exports.appUsersManager.getUser(message.from_id);\n var fromBot = fromUser && fromUser.pFlags.bot && fromUser.username || false;\n var withBot = (fromBot ||\n message.to_id && (message.to_id.chat_id ||\n message.to_id.user_id && exports.appUsersManager.isBot(message.to_id.user_id)));\n if (message.media) {\n if (message.media.caption &&\n message.media.caption.length) {\n message.media.rCaption = richtextprocessor_1.RichTextProcessor.wrapRichText(message.media.caption, {\n noCommands: !withBot,\n fromBot: fromBot\n });\n }\n switch (message.media._) {\n case 'messageMediaPhoto':\n message.media.photo = exports.appPhotosManager.wrapForHistory(message.media.photo.id);\n break;\n /* case 'messageMediaDocument':\n message.media.document = AppDocsManager.wrapForHistory(message.media.document.id)\n break */\n case 'messageMediaGeo':\n var mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long'];\n message.media.mapUrl = mapUrl; //$sce.trustAsResourceUrl(mapUrl) // warning\n break;\n case 'messageMediaVenue':\n var mapUrl;\n if (message.media.provider == 'foursquare' &&\n message.media.venue_id) {\n mapUrl = 'https://foursquare.com/v/' + encodeURIComponent(message.media.venue_id);\n }\n else {\n mapUrl = 'https://maps.google.com/?q=' + message.media.geo['lat'] + ',' + message.media.geo['long'];\n }\n message.media.mapUrl = mapUrl; //$sce.trustAsResourceUrl(mapUrl) // warning\n break;\n case 'messageMediaContact':\n message.media.rFullName = richtextprocessor_1.RichTextProcessor.wrapRichText(message.media.first_name + ' ' + (message.media.last_name || ''), { noLinks: true, noLinebreaks: true });\n break;\n /* case 'messageMediaWebPage':\n if (!message.media.webpage ||\n message.media.webpage._ == 'webPageEmpty') {\n delete message.media\n break\n }\n message.media.webpage = AppWebPagesManager.wrapForHistory(message.media.webpage.id)\n break\n \n case 'messageMediaGame':\n message.media.game = AppGamesManager.wrapForHistory(message.media.game.id)\n break */\n }\n }\n else if (message.action) {\n switch (message.action._) {\n case 'messageActionChatEditPhoto':\n case 'messageActionChannelEditPhoto':\n message.action.photo = exports.appPhotosManager.wrapForHistory(message.action.photo.id);\n break;\n case 'messageActionChatCreate':\n case 'messageActionChatEditTitle':\n case 'messageActionChannelCreate':\n case 'messageActionChannelEditTitle':\n message.action.rTitle = richtextprocessor_1.RichTextProcessor.wrapRichText(message.action.title, { noLinebreaks: true }) || 'chat_title_deleted';\n break;\n case 'messageActionBotIntro':\n message.action.rDescription = richtextprocessor_1.RichTextProcessor.wrapRichText(message.action.description, {\n noCommands: !withBot,\n fromBot: fromBot\n });\n break;\n }\n }\n return this.messagesForHistory[msgID] = message;\n };\n AppMessagesManager.prototype.finalizePendingMessage = function (randomID, finalMessage) {\n var pendingData = this.pendingByRandomID[randomID];\n // console.log('pdata', randomID, pendingData)\n if (pendingData) {\n var peerID = pendingData[0];\n var tempID = pendingData[1];\n var historyStorage = this.historiesStorage[peerID], message, historyMessage;\n // console.log('pending', randomID, historyStorage.pending)\n var pos = historyStorage.pending.indexOf(tempID);\n if (pos != -1) {\n historyStorage.pending.splice(pos, 1);\n }\n if (message = this.messagesStorage[tempID]) {\n delete message.pending;\n delete message.error;\n delete message.random_id;\n delete message.send;\n }\n if (historyMessage = this.messagesForHistory[tempID]) {\n this.messagesForHistory[finalMessage.mid] = Object.assign(historyMessage, this.wrapForHistory(finalMessage.mid));\n delete historyMessage.pending;\n delete historyMessage.error;\n delete historyMessage.random_id;\n delete historyMessage.send;\n $rootScope.$broadcast('messages_pending');\n }\n delete this.messagesForHistory[tempID];\n delete this.messagesStorage[tempID];\n this.finalizePendingMessageCallbacks(tempID, finalMessage.mid);\n return message;\n }\n return false;\n };\n AppMessagesManager.prototype.finalizePendingMessageCallbacks = function (tempID, mid) {\n var callbacks = this.tempFinalizeCallbacks[tempID];\n console.warn(utils_1.dT(), callbacks, tempID);\n if (callbacks !== undefined) {\n callbacks.forEach(function (callback) {\n callback(mid);\n });\n delete this.tempFinalizeCallbacks[tempID];\n }\n };\n AppMessagesManager.prototype.incrementMaxSeenID = function (maxID) {\n if (!maxID || !(!this.maxSeenID || maxID > this.maxSeenID)) {\n return false;\n }\n storage_1.default.set({\n max_seen_msg: maxID\n });\n mtproto_1.MTProto.apiManager.invokeApi('messages.receivedMessages', {\n max_id: maxID\n });\n };\n AppMessagesManager.prototype.getHistory = function (peerID, maxID, limit, backLimit, prerendered) {\n var _this = this;\n if (this.migratedFromTo[peerID]) {\n peerID = this.migratedFromTo[peerID];\n }\n var historyStorage = this.historiesStorage[peerID];\n var offset = 0;\n var offsetNotFound = false;\n var unreadOffset = 0;\n var unreadSkip = false;\n prerendered = prerendered ? Math.min(50, prerendered) : 0;\n if (historyStorage === undefined) {\n historyStorage = this.historiesStorage[peerID] = { count: null, history: [], pending: [] };\n }\n if (maxID < 0) {\n maxID = 0;\n }\n var isMigrated = false;\n var reqPeerID = peerID;\n if (this.migratedToFrom[peerID]) {\n isMigrated = true;\n if (maxID && maxID < exports.appMessagesIDsManager.fullMsgIDModulus) {\n reqPeerID = this.migratedToFrom[peerID];\n }\n }\n if (!limit && !maxID) {\n var foundDialog = this.getDialogByPeerID(peerID)[0];\n if (foundDialog && foundDialog.unread_count > 1) {\n var unreadCount = foundDialog.unread_count;\n if (unreadSkip = (unreadCount > 50)) {\n if (foundDialog.read_inbox_max_id) {\n maxID = foundDialog.read_inbox_max_id;\n backLimit = 16;\n unreadOffset = 16;\n limit = 4;\n }\n else {\n limit = 20;\n unreadOffset = 16;\n offset = unreadCount - unreadOffset;\n }\n }\n else {\n limit = Math.max(10, prerendered, unreadCount + 2);\n unreadOffset = unreadCount;\n }\n }\n else if ('Mobile' in Config) {\n limit = 20;\n }\n }\n if (maxID > 0) {\n offsetNotFound = true;\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n offsetNotFound = false;\n break;\n }\n }\n }\n if (!offsetNotFound && (historyStorage.count !== null && historyStorage.history.length == historyStorage.count ||\n historyStorage.history.length >= offset + (limit || 1))) {\n if (backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n }\n else {\n limit = limit || (offset ? 20 : (prerendered || 5));\n }\n var history = historyStorage.history.slice(offset, offset + limit);\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n }\n if (!backLimit && !limit) {\n limit = prerendered || 20;\n }\n if (offsetNotFound) {\n offset = 0;\n }\n if (backLimit || unreadSkip || maxID && historyStorage.history.indexOf(maxID) == -1) {\n if (backLimit) {\n offset = -backLimit;\n limit += backLimit;\n }\n return this.requestHistory(reqPeerID, maxID, limit, offset).then(function (historyResult) {\n historyStorage.count = historyResult.count || historyResult.messages.length;\n if (isMigrated) {\n historyStorage.count++;\n }\n var history = [];\n historyResult.messages.forEach(function (message) {\n history.push(message.mid);\n });\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return _this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n });\n }\n return this.fillHistoryStorage(peerID, maxID, limit, historyStorage).then(function () {\n offset = 0;\n if (maxID > 0) {\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n break;\n }\n }\n }\n var history = historyStorage.history.slice(offset, offset + limit);\n if (!maxID && historyStorage.pending.length) {\n history = historyStorage.pending.slice().concat(history);\n }\n return _this.wrapHistoryResult(peerID, {\n count: historyStorage.count,\n history: history,\n unreadOffset: unreadOffset,\n unreadSkip: unreadSkip\n });\n });\n };\n AppMessagesManager.prototype.fillHistoryStorage = function (peerID, maxID, fullLimit, historyStorage) {\n var _this = this;\n // console.log('fill history storage', peerID, maxID, fullLimit, angular.copy(historyStorage))\n var offset = (this.migratedFromTo[peerID] && !maxID) ? 1 : 0;\n return this.requestHistory(peerID, maxID, fullLimit, offset).then(function (historyResult) {\n historyStorage.count = historyResult.count || historyResult.messages.length;\n var offset = 0;\n if (!maxID && historyResult.messages.length) {\n maxID = historyResult.messages[0].mid + 1;\n }\n if (maxID > 0) {\n for (offset = 0; offset < historyStorage.history.length; offset++) {\n if (maxID > historyStorage.history[offset]) {\n break;\n }\n }\n }\n var wasTotalCount = historyStorage.history.length;\n historyStorage.history.splice(offset, historyStorage.history.length - offset);\n historyResult.messages.forEach(function (message) {\n if (_this.mergeReplyKeyboard(historyStorage, message)) {\n $rootScope.$broadcast('history_reply_markup', { peerID: peerID });\n }\n historyStorage.history.push(message.mid);\n });\n var totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n var migratedNextPeer = _this.migratedFromTo[peerID];\n var migratedPrevPeer = _this.migratedToFrom[peerID];\n var isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n if (isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n if (fullLimit > 0) {\n maxID = historyStorage.history[totalCount - 1];\n if (isMigrated) {\n if (!historyResult.messages.length) {\n if (migratedPrevPeer) {\n maxID = 0;\n peerID = migratedPrevPeer;\n }\n else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n return _this.fillHistoryStorage(peerID, maxID, fullLimit, historyStorage);\n }\n else if (totalCount < historyStorage.count) {\n return _this.fillHistoryStorage(peerID, maxID, fullLimit, historyStorage);\n }\n }\n return true;\n });\n };\n AppMessagesManager.prototype.wrapHistoryResult = function (peerID, result) {\n var unreadOffset = result.unreadOffset;\n if (unreadOffset) {\n var i;\n var message;\n for (i = result.history.length - 1; i >= 0; i--) {\n message = this.messagesStorage[result.history[i]];\n if (message && !message.pFlags.out && message.pFlags.unread) {\n result.unreadOffset = i + 1;\n break;\n }\n }\n }\n return Promise.resolve(result);\n };\n AppMessagesManager.prototype.requestHistory = function (peerID, maxID, limit, offset) {\n var _this = this;\n var isChannel = exports.appPeersManager.isChannel(peerID);\n return mtproto_1.MTProto.apiManager.invokeApi('messages.getHistory', {\n peer: exports.appPeersManager.getInputPeerByID(peerID),\n offset_id: maxID ? exports.appMessagesIDsManager.getMessageLocalID(maxID) : 0,\n offset_date: 0,\n add_offset: offset || 0,\n limit: limit || 0,\n max_id: 0,\n min_id: 0,\n hash: 0\n }, {\n timeout: 300,\n noErrorBox: true\n }).then(function (historyResult) {\n exports.appUsersManager.saveApiUsers(historyResult.users);\n exports.appChatsManager.saveApiChats(historyResult.chats);\n _this.saveMessages(historyResult.messages);\n if (isChannel) {\n exports.apiUpdatesManager.addChannelState(-peerID, historyResult.pts);\n }\n var length = historyResult.messages.length;\n if (length &&\n historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n historyResult.count--;\n }\n if (peerID < 0 ||\n !exports.appUsersManager.isBot(peerID) ||\n (length == limit && limit < historyResult.count)) {\n return historyResult;\n }\n return exports.appProfileManager.getProfile(peerID).then(function (userFull) {\n var description = userFull.bot_info && userFull.bot_info.description;\n if (description) {\n var messageID = _this.tempID--;\n var message = {\n _: 'messageService',\n id: messageID,\n from_id: peerID,\n to_id: exports.appPeersManager.getOutputPeer(peerID),\n flags: 0,\n pFlags: {},\n date: utils_1.tsNow(true) + mtproto_1.MTProto.serverTimeManager.serverTimeOffset,\n action: {\n _: 'messageActionBotIntro',\n description: description\n }\n };\n _this.saveMessages([message]);\n historyResult.messages.push(message);\n if (historyResult.count) {\n historyResult.count++;\n }\n }\n return historyResult;\n });\n }, function (error) {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n var channel = exports.appChatsManager.getChat(-peerID);\n channel = { _: 'channelForbidden', access_hash: channel.access_hash, title: channel.title };\n exports.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: -peerID\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n return Promise.reject(error);\n });\n };\n AppMessagesManager.prototype.wrapForDialog = function (msgID, dialog) {\n var useCache = msgID && dialog !== undefined;\n var unreadCount = dialog && dialog.unread_count;\n if (useCache && this.messagesForDialogs[msgID] !== undefined) {\n delete this.messagesForDialogs[msgID].typing;\n this.messagesForDialogs[msgID].unreadCount = unreadCount;\n return this.messagesForDialogs[msgID];\n }\n var message = utils_1.copy(this.messagesStorage[msgID]);\n if (!message || !message.to_id) {\n if (dialog && dialog.peerID) {\n message = {\n _: 'message',\n to_id: exports.appPeersManager.getOutputPeer(dialog.peerID),\n deleted: true,\n date: utils_1.tsNow(true),\n pFlags: { out: true }\n };\n }\n else {\n return message;\n }\n }\n message.peerID = this.getMessagePeer(message);\n message.peerData = exports.appPeersManager.getPeer(message.peerID);\n message.peerString = exports.appPeersManager.getPeerString(message.peerID);\n message.unreadCount = unreadCount;\n message.index = dialog && dialog.index || (message.date * 0x10000);\n message.pinned = dialog && dialog.pFlags.pinned || false;\n if (message._ == 'messageService' && message.action.user_id) {\n message.action.user = exports.appUsersManager.getUser(message.action.user_id);\n }\n if (message.message && message.message.length) {\n message.richMessage = richtextprocessor_1.RichTextProcessor.wrapRichText(message.message.substr(0, 128), { noLinks: true, noLinebreaks: true });\n }\n message.dateText = message.date; //dateOrTimeFilter(message.date); // warning\n if (useCache) {\n message.draft = ''; //DraftsManager.getServerDraft(message.peerID); // warning\n this.messagesForDialogs[msgID] = message;\n }\n return message;\n };\n AppMessagesManager.prototype.fetchSingleMessages = function () {\n var _this = this;\n if (this.fetchSingleMessagesTimeout !== 0) {\n clearTimeout(this.fetchSingleMessagesTimeout);\n this.fetchSingleMessagesTimeout = 0;\n }\n if (!this.needSingleMessages.length) {\n return;\n }\n var mids = this.needSingleMessages.slice();\n this.needSingleMessages = [];\n var splitted = exports.appMessagesIDsManager.splitMessageIDsByChannels(mids);\n Object.keys(splitted.msgIDs).forEach(function (channelID) {\n var msgIDs = splitted.msgIDs[channelID];\n var promise;\n channelID = +channelID;\n if (channelID > 0) {\n promise = mtproto_1.MTProto.apiManager.invokeApi('channels.getMessages', {\n channel: exports.appChatsManager.getChannelInput(channelID),\n id: msgIDs\n });\n }\n else {\n promise = mtproto_1.MTProto.apiManager.invokeApi('messages.getMessages', {\n id: msgIDs\n });\n }\n promise.then(function (getMessagesResult) {\n exports.appUsersManager.saveApiUsers(getMessagesResult.users);\n exports.appChatsManager.saveApiChats(getMessagesResult.chats);\n _this.saveMessages(getMessagesResult.messages);\n $rootScope.$broadcast('messages_downloaded', splitted.mids[channelID]);\n });\n });\n };\n AppMessagesManager.prototype.wrapSingleMessage = function (msgID) {\n if (this.messagesStorage[msgID]) {\n return this.wrapForDialog(msgID);\n }\n if (this.needSingleMessages.indexOf(msgID) == -1) {\n this.needSingleMessages.push(msgID);\n if (this.fetchSingleMessagesTimeout == 0) {\n this.fetchSingleMessagesTimeout = window.setTimeout(this.fetchSingleMessages.bind(this), 100);\n }\n }\n return { mid: msgID, loading: true };\n };\n return AppMessagesManager;\n}());\nvar AppDialogsManager = /** @class */ (function () {\n function AppDialogsManager() {\n var _this = this;\n this.pinnedChatList = document.getElementById('dialogs-pinned');\n this.chatList = document.getElementById('dialogs');\n this.myID = 0;\n this.doms = {};\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n var findUpTag = function (el, tag) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.tagName === tag)\n return el;\n }\n return null;\n };\n var onClick = function (e) {\n var target = e.target;\n var elem = target.tagName != 'LI' ? findUpTag(target, 'LI') : target;\n document.getElementById('chat-closed').style.display = 'none';\n var peerID = +elem.getAttribute('data-peerID');\n exports.appImManager.setPeer(peerID);\n };\n this.pinnedChatList.addEventListener('click', onClick);\n this.chatList.addEventListener('click', onClick);\n }\n AppDialogsManager.prototype.loadDialogPhoto = function (div, peerID, isDialog) {\n if (isDialog === void 0) { isDialog = false; }\n var inputPeer;\n var location;\n if (typeof (peerID) != 'string') {\n inputPeer = exports.appPeersManager.getInputPeerByID(peerID);\n location = exports.appPeersManager.getPeerPhoto(peerID);\n }\n //console.log('loadDialogPhoto location:', location, inputPeer);\n if (!location || location.empty || !location.photo_small) {\n if (div.firstChild) {\n div.firstChild.remove();\n }\n div.classList.remove('tgico-savedmessages');\n div.style.fontSize = '';\n var abbrSplitted = (typeof (peerID) != 'string' ? exports.appPeersManager.getPeerTitle(peerID) : peerID).split(' ');\n var abbr = (abbrSplitted.length == 2 ?\n abbrSplitted[0][0] + abbrSplitted[1][0] :\n abbrSplitted[0][0]).toUpperCase();\n //div.innerText = peer.initials.toUpperCase();\n div.innerText = abbr.toUpperCase();\n return Promise.resolve(true);\n }\n else if (peerID == this.myID && (isDialog || $rootScope.selectedPeerID == this.myID)) {\n if (div.firstChild) {\n div.firstChild.remove();\n }\n div.style.fontSize = '';\n div.classList.add('tgico-savedmessages');\n return Promise.resolve(true);\n }\n return mtproto_1.MTProto.apiFileManager.downloadSmallFile({\n _: 'inputPeerPhotoFileLocation',\n dc_id: location.dc_id,\n flags: 0,\n peer: inputPeer,\n volume_id: location.photo_small.volume_id,\n local_id: location.photo_small.local_id\n })\n .then(function (res) {\n var img = new Image();\n img.src = URL.createObjectURL(res);\n div.innerHTML = '';\n div.style.fontSize = '0'; // need\n div.append(img);\n return true;\n });\n };\n AppDialogsManager.prototype.sortDom = function () {\n var _this = this;\n var sorted = exports.appMessagesManager.dialogsStorage.dialogs\n .filter(function (d) { return !d.pFlags.pinned; })\n .sort(function (a, b) {\n var timeA = exports.appMessagesManager.getMessage(a.top_message).date;\n var timeB = exports.appMessagesManager.getMessage(b.top_message).date;\n return timeB - timeA;\n })\n .forEach(function (d) {\n var dom = _this.getDialogDom(d.peerID);\n if (!dom)\n return;\n _this.chatList.append(dom.listEl);\n });\n };\n AppDialogsManager.prototype.setLastMessage = function (dialog) {\n var e_1, _a;\n var lastMessage = exports.appMessagesManager.getMessage(dialog.top_message);\n if (lastMessage._ == 'messageEmpty')\n return;\n var dom = exports.appDialogsManager.getDialogDom(dialog.peerID);\n var peer = dialog.peer;\n var peerID = dialog.peerID;\n //let peerID = appMessagesManager.getMessagePeer(lastMessage);\n console.log('setting last message:', lastMessage);\n var lastMessageText = '';\n if (lastMessage.media) {\n switch (lastMessage.media._) {\n case 'messageMediaPhoto':\n lastMessageText += '<i>Photo' + (lastMessage.message ? ', ' : '') + '</i>';\n break;\n case 'messageMediaDocument':\n var document_1 = lastMessage.media.document;\n var found = false;\n try {\n for (var _b = __values(document_1.attributes), _c = _b.next(); !_c.done; _c = _b.next()) {\n var attribute = _c.value;\n if (found)\n break;\n switch (attribute._) {\n case 'documentAttributeSticker':\n lastMessageText += attribute.alt + '<i>Sticker</i>';\n found = true;\n break;\n case 'documentAttributeFilename':\n lastMessageText += '<i>' + attribute.file_name + '</i>';\n found = true;\n break;\n /* default:\n console.warn('Got unknown document type!', lastMessage);\n break; */\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n break;\n default:\n console.warn('Got unknown lastMessage.media type!', lastMessage);\n break;\n }\n }\n dom.lastMessageSpan.innerHTML = lastMessageText +\n (lastMessage.message ? lastMessage.message.replace(/\\n/g, '') : '');\n /* if(lastMessage.from_id == auth.id) { // You: */\n if (peer._ != 'peerUser' && peerID != -lastMessage.from_id) {\n var sender = exports.appUsersManager.getUser(lastMessage.from_id);\n if (sender && sender.id) {\n var senderBold = document.createElement('b');\n senderBold.innerText = (sender.first_name || sender.last_name || sender.username) + ': ';\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n }\n else\n console.log('no sender', lastMessage, peerID);\n }\n var timeStr = '';\n var timestamp = lastMessage.date;\n var now = Date.now() / 1000;\n var time = new Date(lastMessage.date * 1000);\n if ((now - timestamp) < 86400) {\n timeStr = ('0' + time.getHours()).slice(-2) +\n ':' + ('0' + time.getMinutes()).slice(-2);\n }\n else if ((now - timestamp) < (86400 * 7)) {\n var date = new Date(timestamp * 1000);\n timeStr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()];\n }\n else {\n timeStr = ('0' + (time.getMonth() + 1)).slice(-2) +\n '.' + ('0' + time.getDate()).slice(-2);\n }\n dom.lastTimeSpan.innerHTML = timeStr;\n this.setUnreadMessages(dialog);\n };\n AppDialogsManager.prototype.setUnreadMessages = function (dialog) {\n var dom = this.getDialogDom(dialog.peerID);\n dom.statusSpan.innerHTML = '';\n var lastMessage = exports.appMessagesManager.getMessage(dialog.top_message);\n if (lastMessage._ != 'messageEmpty' &&\n lastMessage.from_id == this.myID && lastMessage.peerID != this.myID) {\n var outgoing = (lastMessage.pFlags && lastMessage.pFlags.unread) && dialog.read_outbox_max_id != 0;\n console.log('outgoing', outgoing, lastMessage);\n if (outgoing) {\n dom.statusSpan.classList.remove('tgico-check-read');\n dom.statusSpan.classList.add('tgico-check-sent');\n }\n else {\n dom.statusSpan.classList.remove('tgico-check-sent');\n dom.statusSpan.classList.add('tgico-check-read');\n }\n }\n else\n dom.statusSpan.classList.remove('tgico-check-sent', 'tgico-check-read');\n dom.unreadMessagesSpan.innerHTML = '';\n if (dialog.unread_count) {\n dom.unreadMessagesSpan.innerHTML = dialog.unread_count;\n dom.unreadMessagesSpan.classList.remove('tgico-pinnedchat');\n dom.unreadMessagesSpan.classList.add(new Date(dialog.notify_settings.mute_until * 1000) > new Date() ?\n 'unread-muted' : 'unread');\n }\n else if (dialog.pFlags.pinned) {\n dom.unreadMessagesSpan.classList.remove('unread', 'unread-muted');\n dom.unreadMessagesSpan.classList.add('tgico-pinnedchat');\n }\n };\n AppDialogsManager.prototype.getDialogDom = function (peerID) {\n return this.doms[peerID];\n };\n AppDialogsManager.prototype.addDialog = function (dialog) {\n var peerID = dialog.peerID;\n if (peerID in this.doms)\n return;\n var peer = dialog.peer;\n var title = exports.appPeersManager.getPeerTitle(peerID);\n var avatarDiv = document.createElement('div');\n avatarDiv.classList.add('user-avatar');\n switch (peer._) {\n case 'peerUser':\n var user = exports.appUsersManager.getUser(peerID);\n //console.log('found user', user);\n if (user.status && user.status._ == 'userStatusOnline') {\n avatarDiv.classList.add('is-online');\n }\n break;\n default:\n break;\n }\n var captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n var titleSpan = document.createElement('span');\n titleSpan.classList.add('user-title');\n if (peerID == this.myID) {\n title = 'Saved Messages';\n }\n //console.log('trying to load photo for:', title);\n this.loadDialogPhoto(avatarDiv, dialog.peerID, true);\n titleSpan.innerText = title;\n //p.classList.add('')\n var span = document.createElement('span');\n span.classList.add('user-last-message');\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n var li = document.createElement('li');\n li.classList.add('rp');\n li.append(avatarDiv);\n li.append(captionDiv);\n li.setAttribute('data-peerID', '' + peerID);\n utils_1.ripple(li);\n /* let detailsDiv = document.createElement('div');\n detailsDiv.classList.add('dialog-details'); */\n var statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status');\n var lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n var unreadMessagesSpan = document.createElement('span');\n var titleP = document.createElement('p');\n var rightSpan = document.createElement('span');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpan, rightSpan);\n var messageP = document.createElement('p');\n messageP.append(span, unreadMessagesSpan);\n captionDiv.append(titleP, messageP);\n (dialog.pFlags.pinned ? this.pinnedChatList : this.chatList).append(li);\n var dom = {\n avatarDiv: avatarDiv,\n captionDiv: captionDiv,\n titleSpan: titleSpan,\n statusSpan: statusSpan,\n lastTimeSpan: lastTimeSpan,\n unreadMessagesSpan: unreadMessagesSpan,\n lastMessageSpan: span,\n listEl: li\n };\n this.doms[dialog.peerID] = dom;\n this.setLastMessage(dialog);\n };\n return AppDialogsManager;\n}());\nexports.appPhotosManager = new AppPhotosManager();\nexports.appDialogsManager = new AppDialogsManager();\nexports.appMessagesManager = new AppMessagesManager();\nexports.appProfileManager = new AppProfileManager();\nvar AppImManager = /** @class */ (function () {\n function AppImManager() {\n var _this = this;\n this.avatarEl = document.getElementById('im-avatar');\n this.titleEl = document.getElementById('im-title');\n this.subtitleEl = document.getElementById('im-subtitle');\n this.chatInner = document.getElementById('bubbles-inner');\n this.scroll = false;\n this.scrollTimeout = 0;\n this.myID = 0;\n this.peerID = 0;\n this.bubbles = {};\n this.unreaded = [];\n this.unreadOut = [];\n /* public animations: AnimationItem[] = []; */\n this.animations = {};\n this.offline = false;\n this.updateStatusInterval = 0;\n this.lastYScroll = 0;\n this.loadMediaQueue = [];\n mtproto_1.MTProto.apiManager.getUserID().then(function (id) {\n _this.myID = id;\n });\n $rootScope.$on('user_auth', function (e) {\n var userAuth = e.detail;\n _this.myID = userAuth ? userAuth.id : 0;\n });\n $rootScope.$on('history_append', function (e) {\n var details = e.detail;\n _this.renderMessagesByIDs([details.messageID]);\n });\n $rootScope.$on('history_multiappend', function (e) {\n var msgIDsByPeer = e.detail;\n if (!(_this.peerID in msgIDsByPeer))\n return;\n var msgIDs = msgIDsByPeer[_this.peerID];\n _this.renderMessagesByIDs(msgIDs);\n });\n window.addEventListener('blur', function () {\n for (var id in _this.animations) {\n _this.animations[id].pause();\n }\n _this.offline = true;\n _this.updateStatus();\n clearInterval(_this.updateStatusInterval);\n window.addEventListener('focus', function () {\n for (var id in _this.animations) {\n _this.animations[id].play();\n }\n _this.offline = false;\n _this.updateStatus();\n _this.updateStatusInterval = window.setInterval(function () { return _this.updateStatus(); }, 50e3);\n }, { once: true });\n });\n this.updateStatusInterval = window.setInterval(function () { return _this.updateStatus(); }, 50e3);\n this.updateStatus();\n setInterval(function () { return _this.setPeerStatus(); }, 60e3);\n this.loadMediaQueueProcess();\n }\n AppImManager.prototype.loadMediaQueueProcess = function () {\n var _this = this;\n Promise.all(this.loadMediaQueue.splice(-5, 5).map(function (f) { return f().then(function (div) {\n /* setTimeout(() => {\n console.log('will scrol by', div.scrollHeight);\n this.scroll.scroll({y: '+= ' + div.scrollHeight + 'px'});\n }, 50); */\n }); })).then(function (results) {\n if (!_this.loadMediaQueue.length)\n setTimeout(function () { return _this.loadMediaQueueProcess(); }, 100);\n else\n _this.loadMediaQueueProcess();\n }).catch(function (err) { return console.error(err); });\n };\n AppImManager.prototype.updateStatus = function () {\n if (!this.myID)\n return Promise.resolve();\n exports.appUsersManager.setUserStatus(this.myID, this.offline);\n return mtproto_1.MTProto.apiManager.invokeApi('account.updateStatus', {\n offline: this.offline\n }, { noErrorBox: true });\n };\n AppImManager.prototype.onScroll = function () {\n var length = this.unreaded.length;\n var readed = [];\n for (var i = length - 1; i >= 0; --i) {\n var msgID = this.unreaded[i];\n var bubble = this.bubbles[msgID];\n if (utils_1.isElementInViewport(bubble)) {\n readed.push(msgID);\n this.unreaded.splice(i, 1);\n }\n }\n for (var msgID in this.animations) {\n var bubble = this.bubbles[msgID];\n var animation = this.animations[msgID];\n if (!utils_1.isElementInViewport(bubble)) {\n animation.pause();\n }\n else {\n animation.play();\n }\n }\n var max = Math.max.apply(Math, __spread(readed));\n //appMessagesManager.readMessages(readed);\n exports.appMessagesManager.readHistory(this.peerID, max);\n this.lastYScroll = this.scroll.scroll().ratio.y;\n // load more history\n if (!this.getHistoryPromise) {\n var history_1 = Object.keys(this.bubbles).sort();\n /* let history = appMessagesManager.historiesStorage[this.peerID].history;\n let length = history.length; */\n for (var i = 0; i < 5; ++i) {\n /* for(let i = length - 1; i >= length - 5; --i) { */\n var msgID = history_1[i];\n if (!(msgID in this.bubbles) || !msgID)\n continue;\n var bubble = this.bubbles[+msgID];\n if (utils_1.isElementInViewport(bubble)) {\n console.log('Will load more history, maxID:', history_1[0], msgID);\n this.getHistory(+history_1[0], true).then(function () {\n });\n break;\n }\n }\n }\n };\n AppImManager.prototype.setScroll = function (scroll) {\n this.scroll = scroll;\n this.scroll.options({\n callbacks: {\n onScroll: this.onScroll.bind(this),\n }\n });\n };\n AppImManager.prototype.setPeerStatus = function () {\n var _this = this;\n if (!this.myID)\n return;\n // set subtitle\n this.subtitleEl.innerText = '';\n this.subtitleEl.classList.remove('online');\n if (this.peerID < 0) { // human\n var chat = exports.appPeersManager.getPeer(this.peerID);\n var func = (chat._ == 'channel' ?\n exports.appProfileManager.getChannelFull :\n exports.appProfileManager.getChatFull).bind(exports.appProfileManager);\n console.log(chat);\n func(chat.id).then(function (res) {\n console.log('chatInfo res:', res);\n var participants_count = res.participants_count || res.participants.participants.length;\n var subtitle = utils_1.numberWithCommas(participants_count) + ' members';\n _this.subtitleEl.innerText = subtitle;\n });\n }\n else if (!exports.appUsersManager.isBot(this.peerID)) { // chat\n var user = exports.appUsersManager.getUser(this.peerID);\n this.subtitleEl.classList.remove('online');\n if (user && user.status) {\n var subtitle = '';\n switch (user.status._) {\n case 'userStatusRecently':\n subtitle += 'last seen recently';\n break;\n case 'userStatusOffline':\n subtitle = 'last seen ';\n var date = user.status.was_online;\n var now = Date.now() / 1000;\n if ((now - date) < 60) {\n subtitle += ' just now';\n }\n else if ((now - date) < 3600) {\n subtitle += ((now - date) / 60 | 0) + ' minutes ago';\n }\n else if (now - date < 86400) {\n subtitle += ((now - date) / 3600 | 0) + ' hours ago';\n }\n else {\n var d = new Date(date * 1000);\n subtitle += ('0' + d.getDate()).slice(-2) + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + ' at ' +\n ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2);\n }\n break;\n case 'userStatusOnline':\n this.subtitleEl.classList.add('online');\n subtitle = 'online';\n break;\n }\n this.subtitleEl.innerText = subtitle;\n }\n }\n };\n AppImManager.prototype.setPeer = function (peerID) {\n var _this = this;\n if (this.peerID == peerID)\n return Promise.resolve(true);\n // clear \n if (this.lastContainerDiv)\n this.lastContainerDiv.remove();\n if (this.firstContainerDiv)\n this.firstContainerDiv.remove();\n this.lastContainerDiv = undefined;\n this.firstContainerDiv = undefined;\n for (var i in this.bubbles) {\n var bubble = this.bubbles[i];\n bubble.remove();\n }\n this.bubbles = {};\n this.unreaded = [];\n this.unreadOut = [];\n this.loadMediaQueue = [];\n for (var id in this.animations) {\n this.animations[id].destroy();\n }\n this.animations = {};\n this.chatInner.innerHTML = '';\n // set new\n this.peerID = $rootScope.selectedPeerID = peerID;\n /* this.lastYScroll = 100; */\n // no dialog\n if (!exports.appMessagesManager.getDialogByPeerID(this.peerID).length) {\n console.error('No dialog by peerID:', this.peerID);\n return Promise.reject();\n }\n var d = document.createElement('div');\n d.classList.add('preloader');\n misc_1.putPreloader(d);\n this.chatInner.append(d);\n if (this.lastDialog) {\n var lastDom = exports.appDialogsManager.getDialogDom(this.lastDialog.peerID);\n lastDom.listEl.classList.remove('active');\n }\n var dialog = this.lastDialog = exports.appMessagesManager.getDialogByPeerID(this.peerID)[0];\n console.log('setPeer peerID:', this.peerID, dialog);\n exports.appDialogsManager.loadDialogPhoto(this.avatarEl, dialog.peerID);\n var dom = exports.appDialogsManager.getDialogDom(this.peerID);\n if (!dom) {\n console.warn('No rendered dialog by peerID:', this.peerID);\n exports.appDialogsManager.addDialog(dialog);\n dom = exports.appDialogsManager.getDialogDom(this.peerID);\n }\n // warning need check\n dom.listEl.classList.add('active');\n this.setPeerStatus();\n this.titleEl.innerText = dom.titleSpan.innerText;\n if (this.scroll)\n this.scroll.scroll({ y: '100%' });\n return this.getHistory().then(function () {\n console.log('setPeer removing preloader');\n if (_this.scroll)\n _this.scroll.scroll({ y: '100%' });\n d.remove();\n /* if(this.scroll) {\n let lastID = dialog.top_message;\n if(lastID in this.bubbles) {\n this.bubbles[lastID].scrollIntoView();\n }\n } */\n return true;\n });\n };\n AppImManager.prototype.updateUnreadByDialog = function (dialog) {\n var maxID = dialog.read_outbox_max_id;\n var length = this.unreadOut.length;\n for (var i = length - 1; i >= 0; --i) {\n var msgID = this.unreadOut[i];\n if (msgID <= maxID) {\n var bubble = this.bubbles[msgID];\n bubble.classList.remove('sent');\n bubble.classList.add('read');\n this.unreadOut.splice(i, 1);\n }\n }\n };\n AppImManager.prototype.deleteMessagesByIDs = function (msgIDs) {\n var _this = this;\n msgIDs.forEach(function (id) {\n if (!(id in _this.bubbles))\n return;\n var bubble = _this.bubbles[id];\n var parent = bubble.parentNode;\n delete _this.bubbles[id];\n bubble.remove();\n if (!parent.childNodes.length) {\n parent.remove();\n }\n if (id in _this.animations) {\n _this.animations[id].destroy();\n delete _this.animations[id];\n }\n });\n };\n AppImManager.prototype.renderMessagesByIDs = function (msgIDs) {\n var _this = this;\n var scrollInfo = {};\n if (this.scroll) {\n scrollInfo = this.scroll.scroll();\n }\n msgIDs.forEach(function (msgID) {\n var message = exports.appMessagesManager.getMessage(msgID);\n console.log('got new message to append:', message);\n _this.unreaded.push(msgID);\n _this.renderMessage(message);\n });\n if (this.scroll && Math.round(scrollInfo.ratio.y * 100) >= 95) {\n this.scroll.scroll({ y: '100%' });\n }\n };\n AppImManager.prototype.renderMessage = function (message, reverse) {\n var _this = this;\n if (reverse === void 0) { reverse = false; }\n var peerID = this.peerID;\n var our = message.fromID == this.myID;\n var messageDiv = document.createElement('div');\n messageDiv.classList.add('message');\n messageDiv.innerHTML = richtextprocessor_1.RichTextProcessor.wrapRichText(message.message, {\n entities: message.totalEntities\n });\n //messageDiv.innerText = message.message;\n console.log('message to render:', message);\n // time section\n var date = new Date(message.date * 1000);\n var time = ('0' + date.getHours()).slice(-2) +\n ':' + ('0' + date.getMinutes()).slice(-2);\n var timeSpan = document.createElement('span');\n timeSpan.classList.add('time');\n var timeInner = document.createElement('div');\n timeInner.classList.add('inner', 'tgico');\n timeInner.innerText = time;\n // bubble\n var bubble = document.createElement('div');\n bubble.classList.add('bubble');\n this.bubbles[message.mid] = bubble;\n timeSpan.appendChild(timeInner);\n messageDiv.append(timeSpan);\n bubble.append(messageDiv);\n if (our) {\n if (message.pFlags.unread)\n this.unreadOut.push(message.mid);\n var status_1 = message.pFlags.unread ? 'sent' : 'read';\n bubble.classList.add(status_1);\n }\n // media\n if (message.media) {\n var attachmentDiv_1 = document.createElement('div');\n attachmentDiv_1.classList.add('attachment');\n var processingWebPage = false;\n switch (message.media._) {\n case 'messageMediaPhoto': {\n var photo_1 = message.media.photo;\n var load = function () { return exports.appPhotosManager.preloadPhoto(photo_1.id).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return attachmentDiv_1;\n }\n var image = new Image();\n image.src = URL.createObjectURL(blob);\n attachmentDiv_1.append(image);\n return attachmentDiv_1;\n }); };\n this.loadMediaQueue.push(load);\n break;\n }\n case 'messageMediaWebPage': {\n processingWebPage = true;\n var webpage_1 = message.media.webpage;\n if (webpage_1._ == 'webPageEmpty') {\n break;\n }\n var box = document.createElement('div');\n box.classList.add('box', 'web');\n var quote = document.createElement('div');\n quote.classList.add('quote');\n var nameEl = document.createElement('a');\n nameEl.classList.add('name');\n var titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n var textDiv = document.createElement('div');\n textDiv.classList.add('text');\n if (webpage_1.photo) {\n var preview_1 = document.createElement('div');\n preview_1.classList.add('preview');\n exports.appPhotosManager.savePhoto(webpage_1.photo); // hot-fix because no webpage manager\n var load = function () { return exports.appPhotosManager.preloadPhoto(webpage_1.photo.id).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return preview_1;\n }\n var img = new Image();\n img.src = URL.createObjectURL(blob);\n preview_1.append(img);\n return preview_1;\n }); };\n this.loadMediaQueue.push(load);\n quote.append(preview_1);\n }\n nameEl.setAttribute('target', '_blank');\n nameEl.href = webpage_1.url;\n nameEl.innerText = webpage_1.site_name;\n textDiv.innerText = webpage_1.description;\n quote.append(nameEl, titleDiv, textDiv);\n box.append(quote);\n bubble.prepend(box);\n break;\n }\n case 'messageMediaDocument': {\n var document_2 = message.media.document;\n if (document_2.size > 1e6) { // 1mb\n break;\n }\n console.log('messageMediaDocument', document_2);\n var stickerType_1 = document_2.mime_type == \"application/x-tgsticker\" ? 2 :\n (document_2.mime_type == \"image/webp\" ? 1 : 0);\n if (stickerType_1) {\n bubble.classList.add('sticker');\n var load = function () { return mtproto_1.MTProto.apiFileManager.downloadSmallFile({\n _: 'inputDocumentFileLocation',\n access_hash: document_2.access_hash,\n file_reference: document_2.file_reference,\n thumb_size: '' /* document.thumbs[0].type */,\n id: document_2.id,\n stickerType: stickerType_1\n }, { mimeType: document_2.mime_type, dcID: document_2.dc_id }).then(function (blob) {\n if (_this.peerID != peerID) {\n console.warn('peer changed, canceling sticker attach');\n return attachmentDiv_1;\n }\n console.log('loaded sticker:', blob);\n if (stickerType_1 == 2) {\n var reader = new FileReader();\n reader.addEventListener('loadend', function (e) {\n // @ts-ignore\n var text = e.srcElement.result;\n var json = bin_utils_1.gzipUncompress(text, true);\n var animation = lottie_web_1.default.loadAnimation({\n container: attachmentDiv_1,\n renderer: 'svg',\n loop: true,\n autoplay: true,\n animationData: JSON.parse(json)\n });\n _this.animations[message.mid] = animation;\n });\n reader.readAsArrayBuffer(blob);\n }\n else if (stickerType_1 == 1) {\n var img = new Image();\n img.src = URL.createObjectURL(blob);\n attachmentDiv_1.append(img);\n }\n return attachmentDiv_1;\n }); };\n this.loadMediaQueue.push(load);\n }\n break;\n }\n default:\n console.warn('unrecognized media type:', message.media._);\n break;\n }\n if (!message.message) {\n messageDiv.classList.add('message-empty');\n }\n if (!processingWebPage) {\n bubble.append(attachmentDiv_1);\n }\n }\n if (message.fwd_from) {\n var fwd = message.fwd_from;\n //let peerFrom = appPeersManager.getPeerTitle()\n var fromTitle = exports.appPeersManager.getPeerTitle(fwd.from_id);\n }\n if ((this.peerID < 0 && !our) || message.fwd_from) { // chat\n var title_1 = exports.appPeersManager.getPeerTitle(message.fwdFromID || message.fromID);\n //console.log(title);\n if (message.fwdFromID) {\n bubble.classList.add('forwarded');\n if (!bubble.classList.contains('sticker')) {\n var nameDiv = document.createElement('div');\n nameDiv.classList.add('name');\n nameDiv.innerText = 'Forwarded from ' + title_1;\n bubble.append(nameDiv);\n }\n }\n else {\n var avatarDiv_1 = document.createElement('div');\n avatarDiv_1.classList.add('user-avatar');\n console.log('exec loadDialogPhoto', message);\n if (message.fromID) { // if no - user hidden\n var load = function () { return exports.appDialogsManager.loadDialogPhoto(avatarDiv_1, message.fromID).then(function () { return avatarDiv_1; }); };\n this.loadMediaQueue.push(load);\n }\n else if (!title_1 && message.fwd_from && message.fwd_from.from_name) {\n title_1 = message.fwd_from.from_name;\n var load = function () { return exports.appDialogsManager.loadDialogPhoto(avatarDiv_1, title_1).then(function () { return avatarDiv_1; }); };\n this.loadMediaQueue.push(load);\n }\n if (message.reply_to_mid) {\n var box = document.createElement('div');\n box.classList.add('box');\n var quote = document.createElement('div');\n quote.classList.add('quote');\n var nameEl = document.createElement('a');\n nameEl.classList.add('name');\n var textDiv = document.createElement('div');\n textDiv.classList.add('text');\n var originalMessage = exports.appMessagesManager.getMessage(message.reply_to_mid);\n var originalPeerTitle = exports.appPeersManager.getPeerTitle(originalMessage.fromID) || '';\n nameEl.innerText = originalPeerTitle;\n textDiv.innerHTML = richtextprocessor_1.RichTextProcessor.wrapRichText(originalMessage.message, {\n entities: originalMessage.totalEntities\n });\n quote.append(nameEl, textDiv);\n box.append(quote);\n bubble.append(box);\n }\n if (!message.media || message.media._ == 'messageMediaWebPage') {\n var nameDiv = document.createElement('div');\n nameDiv.classList.add('name');\n nameDiv.innerText = title_1;\n bubble.append(nameDiv);\n }\n bubble.prepend(avatarDiv_1);\n }\n }\n var type = our ? 'out' : 'in';\n var containerDiv = reverse ? this.firstContainerDiv : this.lastContainerDiv;\n if (!containerDiv || !containerDiv.classList.contains(type)) {\n /* if(containerDiv) {\n if(reverse) this.chatInner.prepend(containerDiv);\n else this.chatInner.append(containerDiv);\n } */\n containerDiv = document.createElement('div');\n containerDiv.classList.add(type);\n if (!this.firstContainerDiv)\n this.firstContainerDiv = containerDiv;\n if (reverse)\n this.firstContainerDiv = containerDiv;\n else\n this.lastContainerDiv = containerDiv;\n }\n if (reverse) {\n containerDiv.prepend(bubble);\n this.chatInner.prepend(containerDiv);\n }\n else {\n containerDiv.append(bubble);\n this.chatInner.append(containerDiv);\n }\n /* if(this.scroll) {\n clearTimeout(this.scrollTimeout);\n setTimeout(() => {\n console.log(this.chatInner.scrollHeight, this.scroll);\n this.scroll.scroll({y: '100%'});\n }, 1);\n } */\n //console.log('history msg', message);\n };\n AppImManager.prototype.getHistory = function (maxID, reverse) {\n var _this = this;\n if (maxID === void 0) { maxID = 0; }\n if (reverse === void 0) { reverse = false; }\n var peerID = this.peerID;\n /* let dialog = appMessagesManager.getDialogByPeerID(peerID)[0];\n if(dialog && dialog.top_message) {\n maxID = dialog.top_message;\n } */\n return this.getHistoryPromise = exports.appMessagesManager.getHistory(this.peerID, maxID, 20)\n .then(function (result) {\n console.log('getHistory result:', result);\n if (!result || !result.history)\n return true;\n if (_this.peerID != peerID) {\n console.warn('peer changed');\n return Promise.reject();\n }\n //this.chatInner.innerHTML = '';\n var history = result.history.slice();\n if (reverse)\n history.reverse();\n var length = history.length;\n for (var i = length - 1; i >= 0; --i) {\n var msgID = history[i];\n var message = exports.appMessagesManager.getMessage(msgID);\n _this.renderMessage(message, reverse);\n }\n _this.getHistoryPromise = undefined;\n return true;\n });\n };\n return AppImManager;\n}());\nexports.appImManager = new AppImManager();\n// @ts-ignore\nwindow.Services = {\n appUsersManager: exports.appUsersManager,\n appChatsManager: exports.appChatsManager,\n apiUpdatesManager: exports.apiUpdatesManager,\n appMessagesManager: exports.appMessagesManager,\n appPeersManager: exports.appPeersManager,\n appProfileManager: exports.appProfileManager,\n appPhotosManager: exports.appPhotosManager,\n appDialogsManager: exports.appDialogsManager,\n appImManager: exports.appImManager\n};\n"
},
{
"id": 13,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/jsbn/index.js",
"name": "./node_modules/jsbn/index.js",
"index": 23,
"index2": 19,
"size": 42308,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "56:13-28"
},
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "129:13-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(function(){\n\n // Copyright (c) 2005 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Basic JavaScript BN library - subset useful for RSA encryption.\n\n // Bits per digit\n var dbits;\n\n // JavaScript engine analysis\n var canary = 0xdeadbeefcafe;\n var j_lm = ((canary&0xffffff)==0xefcafe);\n\n // (public) Constructor\n function BigInteger(a,b,c) {\n if(a != null)\n if(\"number\" == typeof a) this.fromNumber(a,b,c);\n else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n else this.fromString(a,b);\n }\n\n // return new, unset BigInteger\n function nbi() { return new BigInteger(null); }\n\n // am: Compute w_j += (x*this_i), propagate carries,\n // c is initial carry, returns final carry.\n // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n // We need to select the fastest one that works in this environment.\n\n // am1: use a single mult and divide to get the high bits,\n // max digit bits should be 26 because\n // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n function am1(i,x,w,j,c,n) {\n while(--n >= 0) {\n var v = x*this[i++]+w[j]+c;\n c = Math.floor(v/0x4000000);\n w[j++] = v&0x3ffffff;\n }\n return c;\n }\n // am2 avoids a big mult-and-extract completely.\n // Max digit bits should be <= 30 because we do bitwise ops\n // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n function am2(i,x,w,j,c,n) {\n var xl = x&0x7fff, xh = x>>15;\n while(--n >= 0) {\n var l = this[i]&0x7fff;\n var h = this[i++]>>15;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n w[j++] = l&0x3fffffff;\n }\n return c;\n }\n // Alternately, set max digit bits to 28 since some\n // browsers slow down when dealing with 32-bit numbers.\n function am3(i,x,w,j,c,n) {\n var xl = x&0x3fff, xh = x>>14;\n while(--n >= 0) {\n var l = this[i]&0x3fff;\n var h = this[i++]>>14;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n c = (l>>28)+(m>>14)+xh*h;\n w[j++] = l&0xfffffff;\n }\n return c;\n }\n var inBrowser = typeof navigator !== \"undefined\";\n if(inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n BigInteger.prototype.am = am2;\n dbits = 30;\n }\n else if(inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n BigInteger.prototype.am = am1;\n dbits = 26;\n }\n else { // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n }\n\n BigInteger.prototype.DB = dbits;\n BigInteger.prototype.DM = ((1<<dbits)-1);\n BigInteger.prototype.DV = (1<<dbits);\n\n var BI_FP = 52;\n BigInteger.prototype.FV = Math.pow(2,BI_FP);\n BigInteger.prototype.F1 = BI_FP-dbits;\n BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n // Digit conversions\n var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n var BI_RC = new Array();\n var rr,vv;\n rr = \"0\".charCodeAt(0);\n for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n rr = \"a\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n rr = \"A\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n function int2char(n) { return BI_RM.charAt(n); }\n function intAt(s,i) {\n var c = BI_RC[s.charCodeAt(i)];\n return (c==null)?-1:c;\n }\n\n // (protected) copy this to r\n function bnpCopyTo(r) {\n for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n }\n\n // (protected) set from integer value x, -DV <= x < DV\n function bnpFromInt(x) {\n this.t = 1;\n this.s = (x<0)?-1:0;\n if(x > 0) this[0] = x;\n else if(x < -1) this[0] = x+this.DV;\n else this.t = 0;\n }\n\n // return bigint initialized to value\n function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n // (protected) set from string and radix\n function bnpFromString(s,b) {\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 256) k = 8; // byte array\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else { this.fromRadix(s,b); return; }\n this.t = 0;\n this.s = 0;\n var i = s.length, mi = false, sh = 0;\n while(--i >= 0) {\n var x = (k==8)?s[i]&0xff:intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if(sh == 0)\n this[this.t++] = x;\n else if(sh+k > this.DB) {\n this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n this[this.t++] = (x>>(this.DB-sh));\n }\n else\n this[this.t-1] |= x<<sh;\n sh += k;\n if(sh >= this.DB) sh -= this.DB;\n }\n if(k == 8 && (s[0]&0x80) != 0) {\n this.s = -1;\n if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n }\n this.clamp();\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) clamp off excess high words\n function bnpClamp() {\n var c = this.s&this.DM;\n while(this.t > 0 && this[this.t-1] == c) --this.t;\n }\n\n // (public) return string representation in given radix\n function bnToString(b) {\n if(this.s < 0) return \"-\"+this.negate().toString(b);\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n var p = this.DB-(i*this.DB)%k;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n while(i >= 0) {\n if(p < k) {\n d = (this[i]&((1<<p)-1))<<(k-p);\n d |= this[--i]>>(p+=this.DB-k);\n }\n else {\n d = (this[i]>>(p-=k))&km;\n if(p <= 0) { p += this.DB; --i; }\n }\n if(d > 0) m = true;\n if(m) r += int2char(d);\n }\n }\n return m?r:\"0\";\n }\n\n // (public) -this\n function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n // (public) |this|\n function bnAbs() { return (this.s<0)?this.negate():this; }\n\n // (public) return + if this > a, - if this < a, 0 if equal\n function bnCompareTo(a) {\n var r = this.s-a.s;\n if(r != 0) return r;\n var i = this.t;\n r = i-a.t;\n if(r != 0) return (this.s<0)?-r:r;\n while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n return 0;\n }\n\n // returns bit length of the integer x\n function nbits(x) {\n var r = 1, t;\n if((t=x>>>16) != 0) { x = t; r += 16; }\n if((t=x>>8) != 0) { x = t; r += 8; }\n if((t=x>>4) != 0) { x = t; r += 4; }\n if((t=x>>2) != 0) { x = t; r += 2; }\n if((t=x>>1) != 0) { x = t; r += 1; }\n return r;\n }\n\n // (public) return the number of bits in \"this\"\n function bnBitLength() {\n if(this.t <= 0) return 0;\n return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n }\n\n // (protected) r = this << n*DB\n function bnpDLShiftTo(n,r) {\n var i;\n for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n for(i = n-1; i >= 0; --i) r[i] = 0;\n r.t = this.t+n;\n r.s = this.s;\n }\n\n // (protected) r = this >> n*DB\n function bnpDRShiftTo(n,r) {\n for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n r.t = Math.max(this.t-n,0);\n r.s = this.s;\n }\n\n // (protected) r = this << n\n function bnpLShiftTo(n,r) {\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<cbs)-1;\n var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n for(i = this.t-1; i >= 0; --i) {\n r[i+ds+1] = (this[i]>>cbs)|c;\n c = (this[i]&bm)<<bs;\n }\n for(i = ds-1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t+ds+1;\n r.s = this.s;\n r.clamp();\n }\n\n // (protected) r = this >> n\n function bnpRShiftTo(n,r) {\n r.s = this.s;\n var ds = Math.floor(n/this.DB);\n if(ds >= this.t) { r.t = 0; return; }\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<bs)-1;\n r[0] = this[ds]>>bs;\n for(var i = ds+1; i < this.t; ++i) {\n r[i-ds-1] |= (this[i]&bm)<<cbs;\n r[i-ds] = this[i]>>bs;\n }\n if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n r.t = this.t-ds;\n r.clamp();\n }\n\n // (protected) r = this - a\n function bnpSubTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]-a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c -= a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c -= a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c<0)?-1:0;\n if(c < -1) r[i++] = this.DV+c;\n else if(c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n }\n\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyTo(a,r) {\n var x = this.abs(), y = a.abs();\n var i = x.t;\n r.t = i+y.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n r.s = 0;\n r.clamp();\n if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n }\n\n // (protected) r = this^2, r != this (HAC 14.16)\n function bnpSquareTo(r) {\n var x = this.abs();\n var i = r.t = 2*x.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < x.t-1; ++i) {\n var c = x.am(i,x[i],r,2*i,0,1);\n if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n r[i+x.t] -= x.DV;\n r[i+x.t+1] = 1;\n }\n }\n if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n r.s = 0;\n r.clamp();\n }\n\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n function bnpDivRemTo(m,q,r) {\n var pm = m.abs();\n if(pm.t <= 0) return;\n var pt = this.abs();\n if(pt.t < pm.t) {\n if(q != null) q.fromInt(0);\n if(r != null) this.copyTo(r);\n return;\n }\n if(r == null) r = nbi();\n var y = nbi(), ts = this.s, ms = m.s;\n var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus\n if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n else { pm.copyTo(y); pt.copyTo(r); }\n var ys = y.t;\n var y0 = y[ys-1];\n if(y0 == 0) return;\n var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n y.dlShiftTo(j,t);\n if(r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t,r);\n }\n BigInteger.ONE.dlShiftTo(ys,t);\n t.subTo(y,y); // \"negative\" y so we can replace sub with am later\n while(y.t < ys) y[y.t++] = 0;\n while(--j >= 0) {\n // Estimate quotient digit\n var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out\n y.dlShiftTo(j,t);\n r.subTo(t,r);\n while(r[i] < --qd) r.subTo(t,r);\n }\n }\n if(q != null) {\n r.drShiftTo(ys,q);\n if(ts != ms) BigInteger.ZERO.subTo(q,q);\n }\n r.t = ys;\n r.clamp();\n if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder\n if(ts < 0) BigInteger.ZERO.subTo(r,r);\n }\n\n // (public) this mod a\n function bnMod(a) {\n var r = nbi();\n this.abs().divRemTo(a,null,r);\n if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n return r;\n }\n\n // Modular reduction using \"classic\" algorithm\n function Classic(m) { this.m = m; }\n function cConvert(x) {\n if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n }\n function cRevert(x) { return x; }\n function cReduce(x) { x.divRemTo(this.m,null,x); }\n function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n Classic.prototype.convert = cConvert;\n Classic.prototype.revert = cRevert;\n Classic.prototype.reduce = cReduce;\n Classic.prototype.mulTo = cMulTo;\n Classic.prototype.sqrTo = cSqrTo;\n\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n // justification:\n // xy == 1 (mod m)\n // xy = 1+km\n // xy(2-xy) = (1+km)(1-km)\n // x[y(2-xy)] = 1-k^2m^2\n // x[y(2-xy)] == 1 (mod m^2)\n // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n function bnpInvDigit() {\n if(this.t < 1) return 0;\n var x = this[0];\n if((x&1) == 0) return 0;\n var y = x&3; // y == 1/x mod 2^2\n y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4\n y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8\n y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y>0)?this.DV-y:-y;\n }\n\n // Montgomery reduction\n function Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp&0x7fff;\n this.mph = this.mp>>15;\n this.um = (1<<(m.DB-15))-1;\n this.mt2 = 2*m.t;\n }\n\n // xR mod m\n function montConvert(x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t,r);\n r.divRemTo(this.m,null,r);\n if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n return r;\n }\n\n // x/R mod m\n function montRevert(x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n\n // x = x/R mod m (HAC 14.32)\n function montReduce(x) {\n while(x.t <= this.mt2) // pad x so am has enough room later\n x[x.t++] = 0;\n for(var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i]&0x7fff;\n var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i+this.m.t;\n x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n // propagate carry\n while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n }\n x.clamp();\n x.drShiftTo(this.m.t,x);\n if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = \"x^2/R mod m\"; x != r\n function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = \"xy/R mod m\"; x,y != r\n function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Montgomery.prototype.convert = montConvert;\n Montgomery.prototype.revert = montRevert;\n Montgomery.prototype.reduce = montReduce;\n Montgomery.prototype.mulTo = montMulTo;\n Montgomery.prototype.sqrTo = montSqrTo;\n\n // (protected) true iff this is even\n function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n function bnpExp(e,z) {\n if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n g.copyTo(r);\n while(--i >= 0) {\n z.sqrTo(r,r2);\n if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n else { var t = r; r = r2; r2 = t; }\n }\n return z.revert(r);\n }\n\n // (public) this^e % m, 0 <= e < 2^32\n function bnModPowInt(e,m) {\n var z;\n if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n return this.exp(e,z);\n }\n\n // protected\n BigInteger.prototype.copyTo = bnpCopyTo;\n BigInteger.prototype.fromInt = bnpFromInt;\n BigInteger.prototype.fromString = bnpFromString;\n BigInteger.prototype.clamp = bnpClamp;\n BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n BigInteger.prototype.lShiftTo = bnpLShiftTo;\n BigInteger.prototype.rShiftTo = bnpRShiftTo;\n BigInteger.prototype.subTo = bnpSubTo;\n BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n BigInteger.prototype.squareTo = bnpSquareTo;\n BigInteger.prototype.divRemTo = bnpDivRemTo;\n BigInteger.prototype.invDigit = bnpInvDigit;\n BigInteger.prototype.isEven = bnpIsEven;\n BigInteger.prototype.exp = bnpExp;\n\n // public\n BigInteger.prototype.toString = bnToString;\n BigInteger.prototype.negate = bnNegate;\n BigInteger.prototype.abs = bnAbs;\n BigInteger.prototype.compareTo = bnCompareTo;\n BigInteger.prototype.bitLength = bnBitLength;\n BigInteger.prototype.mod = bnMod;\n BigInteger.prototype.modPowInt = bnModPowInt;\n\n // \"constants\"\n BigInteger.ZERO = nbv(0);\n BigInteger.ONE = nbv(1);\n\n // Copyright (c) 2005-2009 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Extended JavaScript BN functions, required for RSA private ops.\n\n // Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n // Version 1.2: square() API, isProbablePrime fix\n\n // (public)\n function bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n // (public) return value as integer\n function bnIntValue() {\n if(this.s < 0) {\n if(this.t == 1) return this[0]-this.DV;\n else if(this.t == 0) return -1;\n }\n else if(this.t == 1) return this[0];\n else if(this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n }\n\n // (public) return value as byte\n function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n // (public) return value as short (assumes DB>=16)\n function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n // (protected) return x s.t. r^x < DV\n function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n // (public) 0 if this == 0, 1 if this > 0\n function bnSigNum() {\n if(this.s < 0) return -1;\n else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n }\n\n // (protected) convert to radix string\n function bnpToRadix(b) {\n if(b == null) b = 10;\n if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b,cs);\n var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n this.divRemTo(d,y,z);\n while(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n }\n return z.intValue().toString(b) + r;\n }\n\n // (protected) convert from radix string\n function bnpFromRadix(s,b) {\n this.fromInt(0);\n if(b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n for(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w,0);\n j = 0;\n w = 0;\n }\n }\n if(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n }\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) alternate constructor\n function bnpFromNumber(a,b,c) {\n if(\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n this.fromNumber(a,c);\n if(!this.testBit(a-1)) // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n if(this.isEven()) this.dAddOffset(1,0); // force odd\n while(!this.isProbablePrime(b)) {\n this.dAddOffset(2,0);\n if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n }\n }\n }\n else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n }\n }\n\n // (public) convert to bigendian byte array\n function bnToByteArray() {\n var i = this.t, r = new Array();\n r[0] = this.s;\n var p = this.DB-(i*this.DB)%8, d, k = 0;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n if(p < 8) {\n d = (this[i]&((1<<p)-1))<<(8-p);\n d |= this[--i]>>(p+=this.DB-8);\n }\n else {\n d = (this[i]>>(p-=8))&0xff;\n if(p <= 0) { p += this.DB; --i; }\n }\n if((d&0x80) != 0) d |= -256;\n if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n if(k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n }\n\n function bnEquals(a) { return(this.compareTo(a)==0); }\n function bnMin(a) { return(this.compareTo(a)<0)?this:a; }\n function bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n // (protected) r = this op a (bitwise)\n function bnpBitwiseTo(a,op,r) {\n var i, f, m = Math.min(a.t,this.t);\n for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n if(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n r.t = this.t;\n }\n else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n r.t = a.t;\n }\n r.s = op(this.s,a.s);\n r.clamp();\n }\n\n // (public) this & a\n function op_and(x,y) { return x&y; }\n function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n // (public) this | a\n function op_or(x,y) { return x|y; }\n function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n // (public) this ^ a\n function op_xor(x,y) { return x^y; }\n function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n // (public) this & ~a\n function op_andnot(x,y) { return x&~y; }\n function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n // (public) ~this\n function bnNot() {\n var r = nbi();\n for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n }\n\n // (public) this << n\n function bnShiftLeft(n) {\n var r = nbi();\n if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n return r;\n }\n\n // (public) this >> n\n function bnShiftRight(n) {\n var r = nbi();\n if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n return r;\n }\n\n // return index of lowest 1-bit in x, x < 2^31\n function lbit(x) {\n if(x == 0) return -1;\n var r = 0;\n if((x&0xffff) == 0) { x >>= 16; r += 16; }\n if((x&0xff) == 0) { x >>= 8; r += 8; }\n if((x&0xf) == 0) { x >>= 4; r += 4; }\n if((x&3) == 0) { x >>= 2; r += 2; }\n if((x&1) == 0) ++r;\n return r;\n }\n\n // (public) returns index of lowest 1-bit (or -1 if none)\n function bnGetLowestSetBit() {\n for(var i = 0; i < this.t; ++i)\n if(this[i] != 0) return i*this.DB+lbit(this[i]);\n if(this.s < 0) return this.t*this.DB;\n return -1;\n }\n\n // return number of 1 bits in x\n function cbit(x) {\n var r = 0;\n while(x != 0) { x &= x-1; ++r; }\n return r;\n }\n\n // (public) return number of set bits\n function bnBitCount() {\n var r = 0, x = this.s&this.DM;\n for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n return r;\n }\n\n // (public) true iff nth bit is set\n function bnTestBit(n) {\n var j = Math.floor(n/this.DB);\n if(j >= this.t) return(this.s!=0);\n return((this[j]&(1<<(n%this.DB)))!=0);\n }\n\n // (protected) this op (1<<n)\n function bnpChangeBit(n,op) {\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r,op,r);\n return r;\n }\n\n // (public) this | (1<<n)\n function bnSetBit(n) { return this.changeBit(n,op_or); }\n\n // (public) this & ~(1<<n)\n function bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n // (public) this ^ (1<<n)\n function bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n // (protected) r = this + a\n function bnpAddTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]+a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c += a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c<0)?-1:0;\n if(c > 0) r[i++] = c;\n else if(c < -1) r[i++] = this.DV+c;\n r.t = i;\n r.clamp();\n }\n\n // (public) this + a\n function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n // (public) this - a\n function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n // (public) this * a\n function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n // (public) this^2\n function bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n // (public) this / a\n function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n // (public) this % a\n function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n // (public) [this/a,this%a]\n function bnDivideAndRemainder(a) {\n var q = nbi(), r = nbi();\n this.divRemTo(a,q,r);\n return new Array(q,r);\n }\n\n // (protected) this *= n, this >= 0, 1 < n < DV\n function bnpDMultiply(n) {\n this[this.t] = this.am(0,n-1,this,0,0,this.t);\n ++this.t;\n this.clamp();\n }\n\n // (protected) this += n << w words, this >= 0\n function bnpDAddOffset(n,w) {\n if(n == 0) return;\n while(this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while(this[w] >= this.DV) {\n this[w] -= this.DV;\n if(++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n }\n\n // A \"null\" reducer\n function NullExp() {}\n function nNop(x) { return x; }\n function nMulTo(x,y,r) { x.multiplyTo(y,r); }\n function nSqrTo(x,r) { x.squareTo(r); }\n\n NullExp.prototype.convert = nNop;\n NullExp.prototype.revert = nNop;\n NullExp.prototype.mulTo = nMulTo;\n NullExp.prototype.sqrTo = nSqrTo;\n\n // (public) this^e\n function bnPow(e) { return this.exp(e,new NullExp()); }\n\n // (protected) r = lower n words of \"this * a\", a.t <= n\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyLowerTo(a,n,r) {\n var i = Math.min(this.t+a.t,n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while(i > 0) r[--i] = 0;\n var j;\n for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n r.clamp();\n }\n\n // (protected) r = \"this * a\" without lower n words, n > 0\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyUpperTo(a,n,r) {\n --n;\n var i = r.t = this.t+a.t-n;\n r.s = 0; // assumes a,this >= 0\n while(--i >= 0) r[i] = 0;\n for(i = Math.max(n-this.t,0); i < a.t; ++i)\n r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n r.clamp();\n r.drShiftTo(1,r);\n }\n\n // Barrett modular reduction\n function Barrett(m) {\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n }\n\n function barrettConvert(x) {\n if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n else if(x.compareTo(this.m) < 0) return x;\n else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n }\n\n function barrettRevert(x) { return x; }\n\n // x = x mod m (HAC 14.42)\n function barrettReduce(x) {\n x.drShiftTo(this.m.t-1,this.r2);\n if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n x.subTo(this.r2,x);\n while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = x^2 mod m; x != r\n function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = x*y mod m; x,y != r\n function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Barrett.prototype.convert = barrettConvert;\n Barrett.prototype.revert = barrettRevert;\n Barrett.prototype.reduce = barrettReduce;\n Barrett.prototype.mulTo = barrettMulTo;\n Barrett.prototype.sqrTo = barrettSqrTo;\n\n // (public) this^e % m (HAC 14.85)\n function bnModPow(e,m) {\n var i = e.bitLength(), k, r = nbv(1), z;\n if(i <= 0) return r;\n else if(i < 18) k = 1;\n else if(i < 48) k = 3;\n else if(i < 144) k = 4;\n else if(i < 768) k = 5;\n else k = 6;\n if(i < 8)\n z = new Classic(m);\n else if(m.isEven())\n z = new Barrett(m);\n else\n z = new Montgomery(m);\n\n // precomputation\n var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n g[1] = z.convert(this);\n if(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n g[n] = nbi();\n z.mulTo(g2,g[n-2],g[n]);\n n += 2;\n }\n }\n\n var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n i = nbits(e[j])-1;\n while(j >= 0) {\n if(i >= k1) w = (e[j]>>(i-k1))&km;\n else {\n w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else {\n while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e[j]&(1<<i)) == 0) {\n z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n if(--i < 0) { i = this.DB-1; --j; }\n }\n }\n return z.revert(r);\n }\n\n // (public) gcd(this,a) (HAC 14.54)\n function bnGCD(a) {\n var x = (this.s<0)?this.negate():this.clone();\n var y = (a.s<0)?a.negate():a.clone();\n if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n if(g < 0) return x;\n if(i < g) g = i;\n if(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n }\n while(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n x.subTo(y,x);\n x.rShiftTo(1,x);\n }\n else {\n y.subTo(x,y);\n y.rShiftTo(1,y);\n }\n }\n if(g > 0) y.lShiftTo(g,y);\n return y;\n }\n\n // (protected) this % n, n < 2^26\n function bnpModInt(n) {\n if(n <= 0) return 0;\n var d = this.DV%n, r = (this.s<0)?n-1:0;\n if(this.t > 0)\n if(d == 0) r = this[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n return r;\n }\n\n // (public) 1/this % m (HAC 14.61)\n function bnModInverse(m) {\n var ac = m.isEven();\n if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(), v = this.clone();\n var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n while(u.signum() != 0) {\n while(u.isEven()) {\n u.rShiftTo(1,u);\n if(ac) {\n if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n a.rShiftTo(1,a);\n }\n else if(!b.isEven()) b.subTo(m,b);\n b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n v.rShiftTo(1,v);\n if(ac) {\n if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n c.rShiftTo(1,c);\n }\n else if(!d.isEven()) d.subTo(m,d);\n d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n u.subTo(v,u);\n if(ac) a.subTo(c,a);\n b.subTo(d,b);\n }\n else {\n v.subTo(u,v);\n if(ac) c.subTo(a,c);\n d.subTo(b,d);\n }\n }\n if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if(d.compareTo(m) >= 0) return d.subtract(m);\n if(d.signum() < 0) d.addTo(m,d); else return d;\n if(d.signum() < 0) return d.add(m); else return d;\n }\n\n var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\n var lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n // (public) test primality with certainty >= 1-.5^t\n function bnIsProbablePrime(t) {\n var i, x = this.abs();\n if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n if(x[0] == lowprimes[i]) return true;\n return false;\n }\n if(x.isEven()) return false;\n i = 1;\n while(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n }\n\n // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n function bnpMillerRabin(t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if(k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t+1)>>1;\n if(t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for(var i = 0; i < t; ++i) {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while(j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2,this);\n if(y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if(y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n }\n\n // protected\n BigInteger.prototype.chunkSize = bnpChunkSize;\n BigInteger.prototype.toRadix = bnpToRadix;\n BigInteger.prototype.fromRadix = bnpFromRadix;\n BigInteger.prototype.fromNumber = bnpFromNumber;\n BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n BigInteger.prototype.changeBit = bnpChangeBit;\n BigInteger.prototype.addTo = bnpAddTo;\n BigInteger.prototype.dMultiply = bnpDMultiply;\n BigInteger.prototype.dAddOffset = bnpDAddOffset;\n BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n BigInteger.prototype.modInt = bnpModInt;\n BigInteger.prototype.millerRabin = bnpMillerRabin;\n\n // public\n BigInteger.prototype.clone = bnClone;\n BigInteger.prototype.intValue = bnIntValue;\n BigInteger.prototype.byteValue = bnByteValue;\n BigInteger.prototype.shortValue = bnShortValue;\n BigInteger.prototype.signum = bnSigNum;\n BigInteger.prototype.toByteArray = bnToByteArray;\n BigInteger.prototype.equals = bnEquals;\n BigInteger.prototype.min = bnMin;\n BigInteger.prototype.max = bnMax;\n BigInteger.prototype.and = bnAnd;\n BigInteger.prototype.or = bnOr;\n BigInteger.prototype.xor = bnXor;\n BigInteger.prototype.andNot = bnAndNot;\n BigInteger.prototype.not = bnNot;\n BigInteger.prototype.shiftLeft = bnShiftLeft;\n BigInteger.prototype.shiftRight = bnShiftRight;\n BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n BigInteger.prototype.bitCount = bnBitCount;\n BigInteger.prototype.testBit = bnTestBit;\n BigInteger.prototype.setBit = bnSetBit;\n BigInteger.prototype.clearBit = bnClearBit;\n BigInteger.prototype.flipBit = bnFlipBit;\n BigInteger.prototype.add = bnAdd;\n BigInteger.prototype.subtract = bnSubtract;\n BigInteger.prototype.multiply = bnMultiply;\n BigInteger.prototype.divide = bnDivide;\n BigInteger.prototype.remainder = bnRemainder;\n BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n BigInteger.prototype.modPow = bnModPow;\n BigInteger.prototype.modInverse = bnModInverse;\n BigInteger.prototype.pow = bnPow;\n BigInteger.prototype.gcd = bnGCD;\n BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n // JSBN-specific extension\n BigInteger.prototype.square = bnSquare;\n\n // Expose the Barrett function\n BigInteger.prototype.Barrett = Barrett\n\n // BigInteger interfaces not implemented in jsbn:\n\n // BigInteger(int signum, byte[] magnitude)\n // double doubleValue()\n // float floatValue()\n // int hashCode()\n // long longValue()\n // static BigInteger valueOf(long val)\n\n // Random number generator - requires a PRNG backend, e.g. prng4.js\n\n // For best results, put code like\n // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n // in your main HTML document.\n\n var rng_state;\n var rng_pool;\n var rng_pptr;\n\n // Mix in a 32-bit integer into the pool\n function rng_seed_int(x) {\n rng_pool[rng_pptr++] ^= x & 255;\n rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n }\n\n // Mix in the current time (w/milliseconds) into the pool\n function rng_seed_time() {\n rng_seed_int(new Date().getTime());\n }\n\n // Initialize the pool with junk if needed.\n if(rng_pool == null) {\n rng_pool = new Array();\n rng_pptr = 0;\n var t;\n if(typeof window !== \"undefined\" && window.crypto) {\n if (window.crypto.getRandomValues) {\n // Use webcrypto if available\n var ua = new Uint8Array(32);\n window.crypto.getRandomValues(ua);\n for(t = 0; t < 32; ++t)\n rng_pool[rng_pptr++] = ua[t];\n }\n else if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n // Extract entropy (256 bits) from NS4 RNG if available\n var z = window.crypto.random(32);\n for(t = 0; t < z.length; ++t)\n rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n }\n }\n while(rng_pptr < rng_psize) { // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = t >>> 8;\n rng_pool[rng_pptr++] = t & 255;\n }\n rng_pptr = 0;\n rng_seed_time();\n //rng_seed_int(window.screenX);\n //rng_seed_int(window.screenY);\n }\n\n function rng_get_byte() {\n if(rng_state == null) {\n rng_seed_time();\n rng_state = prng_newstate();\n rng_state.init(rng_pool);\n for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n rng_pool[rng_pptr] = 0;\n rng_pptr = 0;\n //rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n }\n\n function rng_get_bytes(ba) {\n var i;\n for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n }\n\n function SecureRandom() {}\n\n SecureRandom.prototype.nextBytes = rng_get_bytes;\n\n // prng4.js - uses Arcfour as a PRNG\n\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = new Array();\n }\n\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n function ARC4init(key) {\n var i, j, t;\n for(i = 0; i < 256; ++i)\n this.S[i] = i;\n j = 0;\n for(i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n }\n\n function ARC4next() {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n }\n\n Arcfour.prototype.init = ARC4init;\n Arcfour.prototype.next = ARC4next;\n\n // Plug in your RNG constructor here\n function prng_newstate() {\n return new Arcfour();\n }\n\n // Pool size must be a multiple of 4 and greater than 32.\n // An array of bytes the size of the pool will be passed to init()\n var rng_psize = 256;\n\n if (typeof exports !== 'undefined') {\n exports = module.exports = {\n default: BigInteger,\n BigInteger: BigInteger,\n SecureRandom: SecureRandom,\n };\n } else {\n this.jsbn = {\n BigInteger: BigInteger,\n SecureRandom: SecureRandom\n };\n }\n\n}).call(this);\n"
},
{
"id": 14,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/leemon/es/index.js",
"name": "./node_modules/leemon/es/index.js",
"index": 25,
"index2": 21,
"size": 57067,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "59:15-32"
},
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "64:15-32"
}
],
"usedExports": true,
"providedExports": [
"bpe",
"one",
"zero",
"findPrimes",
"millerRabinInt",
"millerRabin",
"bitSize",
"expand",
"randTruePrime",
"randProbPrime",
"randProbPrimeRounds",
"mod",
"addInt",
"mult",
"powMod",
"sub",
"add",
"inverseMod",
"multMod",
"randTruePrime_",
"randBigInt",
"randBigInt_",
"GCD",
"GCD_",
"inverseMod_",
"inverseModInt",
"eGCD_",
"negative",
"greaterShift",
"greater",
"divide_",
"carry_",
"modInt",
"int2bigInt",
"str2bigInt",
"equalsInt",
"equals",
"isZero",
"bigInt2str",
"dup",
"copy_",
"copyInt_",
"addInt_",
"rightShift_",
"halve_",
"leftShift_",
"multInt_",
"divInt_",
"linComb_",
"linCombShift_",
"addShift_",
"subShift_",
"sub_",
"add_",
"mult_",
"mod_",
"multMod_",
"squareMod_",
"trim",
"powMod_",
"mont_"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/lib/bin_utils.ts (referenced with cjs require), ./src/lib/mtproto.ts (referenced with cjs require)"
],
"depth": 2,
"source": "'use strict';\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int, 1<b<x)\n// bigInt mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int modInt(x,n) //return x mod n for bigInt x and integer n.\n// bigInt mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.\n// boolean negative(x) //is bigInt x negative?\n// bigInt powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.\n// bigInt randBigInt(n,s) //return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.\n// void linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n) //do x=x*x mod n for bigInts x,n\n// void subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n// powMod_() = algorithm 14.94, Montgomery exponentiation\n// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n// GCD_() = algorothm 14.57, Lehmer's algorithm\n// mont_() = algorithm 14.36, Montgomery multiplication\n// divide_() = algorithm 14.20 Multiple-precision division\n// squareMod_() = algorithm 14.16 Multiple-precision squaring\n// randTruePrime_() = algorithm 4.62, Maurer's algorithm\n// millerRabin() = algorithm 4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n// randTruePrime_() spends:\n// 10% of its time in calls to powMod_()\n// 85% of its time in calls to millerRabin()\n// millerRabin() spends:\n// 99% of its time in calls to powMod_() (always with a base of 2)\n// powMod_() spends:\n// 94% of its time in calls to mont_() (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n// -- this should especially focus on being fast when raising 2 to a power mod n\n// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n// - tune the parameters in randTruePrime_(), including c, m, and recLimit\n// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n// within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\n//globals\nexport var bpe = 0; //bits stored per array element\n\nvar mask = 0; //AND this with an array element to chop it down to bpe bits\n\nvar radix = mask + 1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n//the digits for converting to different bases\n\nvar digitsStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'; //initialize the global variables\n//bpe=number of bits in the mantissa on this platform\n\nfor (bpe = 0; 1 << bpe + 1 > 1 << bpe; bpe++) {\n ;\n}\n\nbpe >>= 1; //bpe=number of bits in one element of the array representing the bigInt\n\nmask = (1 << bpe) - 1; //AND the mask with an integer to get its bpe least significant bits\n\nradix = mask + 1; //2^bpe. a single 1 bit to the left of the first bit of mask\n\nexport var one = int2bigInt(1, 1, 1); //constant used in powMod_()\n\nexport var zero = int2bigInt(0, 1, 1); //the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\n\nvar t = new Array(0);\nvar ss = t; //used in mult_()\n\nvar s0 = t; //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\n\nvar s3 = t; //used in powMod_()\n\nvar s4 = t,\n s5 = t; //used in mod_()\n\nvar s6 = t; //used in bigInt2str()\n\nvar s7 = t; //used in powMod_()\n\nvar T = t; //used in GCD_()\n\nvar sa = t; //used in mont_()\n\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t,\n //used in millerRabin()\neg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t,\n //used in eGCD_(), inverseMod_()\n//, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\nprimes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t,\n //used in randTruePrime_()\nrpprb = t; //used in randProbPrimeRounds() (which also uses \"primes\")\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff;\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function findPrimes(n) {\n var i, s, p, ans;\n s = new Array(n);\n\n for (i = 0; i < n; i++) {\n s[i] = 0;\n }\n\n s[0] = 2;\n p = 0; //first p elements of s are primes, the rest are a sieve\n\n for (; s[p] < n;) {\n //s[p] is the pth prime\n for (i = s[p] * s[p]; i < n; i += s[p] //mark multiples of s[p]\n ) {\n s[i] = 1;\n }\n\n p++;\n s[p] = s[p - 1] + 1;\n\n for (; s[p] < n && s[s[p]]; s[p]++) {\n ;\n } //find next prime (where s[p]==0)\n\n }\n\n ans = new Array(p);\n\n for (i = 0; i < p; i++) {\n ans[i] = s[i];\n }\n\n return ans;\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabinInt(x, b) {\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copyInt_(mr_a, b);\n return millerRabin(x, mr_a);\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x and b are bigInts with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number[]} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabin(x, b) {\n var i, j, k, s;\n\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copy_(mr_a, b);\n copy_(mr_r, x);\n copy_(mr_x1, x);\n addInt_(mr_r, -1);\n addInt_(mr_x1, -1); //s=the highest power of two that divides mr_r\n\n k = 0;\n\n for (i = 0; i < mr_r.length; i++) {\n for (j = 1; j < mask; j <<= 1) {\n if (x[i] & j) {\n s = k < mr_r.length + bpe ? k : 0;\n i = mr_r.length;\n j = mask;\n } else k++;\n }\n }\n\n if (s) rightShift_(mr_r, s);\n powMod_(mr_a, mr_r, x);\n\n if (!equalsInt(mr_a, 1) && !equals(mr_a, mr_x1)) {\n j = 1; //$off\n\n while (j <= s - 1 && !equals(mr_a, mr_x1)) {\n squareMod_(mr_a, x);\n\n if (equalsInt(mr_a, 1)) {\n return 0;\n }\n\n j++;\n }\n\n if (!equals(mr_a, mr_x1)) {\n return 0;\n }\n }\n\n return 1;\n}\n/**\n * returns how many bits long the bigInt is, not counting leading zeros.\n *\n * @param {number[]} x\n * @returns {number}\n */\n\nexport function bitSize(x) {\n var j, z, w;\n\n for (j = x.length - 1; x[j] == 0 && j > 0; j--) {\n ;\n }\n\n for (z = 0, w = x[j]; w; w >>= 1, z++) {\n ;\n }\n\n z += bpe * j;\n return z;\n}\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function expand(x, n) {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0);\n copy_(ans, x);\n return ans;\n}\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randTruePrime(k) {\n var ans = int2bigInt(0, k, 0);\n randTruePrime_(ans, k);\n return trim(ans, 1);\n}\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randProbPrime(k) {\n if (k >= 600) return randProbPrimeRounds(k, 2); //numbers from HAC table 4.3\n\n if (k >= 550) return randProbPrimeRounds(k, 4);\n if (k >= 500) return randProbPrimeRounds(k, 5);\n if (k >= 400) return randProbPrimeRounds(k, 6);\n if (k >= 350) return randProbPrimeRounds(k, 7);\n if (k >= 300) return randProbPrimeRounds(k, 9);\n if (k >= 250) return randProbPrimeRounds(k, 12); //numbers from HAC table 4.4\n\n if (k >= 200) return randProbPrimeRounds(k, 15);\n if (k >= 150) return randProbPrimeRounds(k, 18);\n if (k >= 100) return randProbPrimeRounds(k, 27);\n return randProbPrimeRounds(k, 40); //number from HAC remark 4.26 (only an estimate)\n}\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function randProbPrimeRounds(k, n) {\n var ans, i, divisible, B;\n B = 30000; //B is largest prime to use in trial division\n\n ans = int2bigInt(0, k, 0); //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans);\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n randBigInt_(ans, k, 0); //ans = a random odd number to check\n\n ans[0] |= 1;\n divisible = 0; //check ans for divisibility by small primes up to B\n\n for (i = 0; i < primes.length && primes[i] <= B; i++) {\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1;\n break;\n }\n } //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n //do n rounds of Miller Rabin, with random bases less than ans\n\n\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0);\n\n while (!greater(ans, rpprb) //pick a random rpprb that's < ans\n ) {\n randBigInt_(rpprb, k, 0);\n }\n\n if (!millerRabin(ans, rpprb)) divisible = 1;\n }\n\n if (!divisible) return ans;\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function mod(x, n) {\n var ans = dup(x);\n mod_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function addInt(x, n) {\n var ans = expand(x, x.length + 1);\n addInt_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return x*y for bigInts x and y. This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function mult(x, y) {\n var ans = expand(x, x.length + y.length);\n mult_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.\n *\n * 0**0=1.\n *\n * Faster for odd n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function powMod(x, y, n) {\n var ans = expand(x, n.length);\n powMod_( //this should work without the trim, but doesn't\n ans, trim(y, 2), trim(n, 2));\n return trim(ans, 1);\n}\n/**\n * return (x-y) for bigInts x and y\n *\n * Negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function sub(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n sub_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function add(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n add_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n\nexport function inverseMod(x, n) {\n var ans = expand(x, n.length);\n var s = inverseMod_(ans, n);\n return s ? trim(ans, 1) : null;\n}\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function multMod(x, y, n) {\n var ans = expand(x, n.length);\n multMod_(ans, y, n);\n return trim(ans, 1);\n}\n/**\n * generate a k-bit true random prime using Maurer's algorithm, and put it into ans.\n *\n * The bigInt ans must be large enough to hold it.\n *\n * @export\n * @param {number[]} ans\n * @param {number} k\n * @return {void}\n */\n\nexport function randTruePrime_(ans, k) {\n var c, m, pm, dd, j, r, B, divisible, z, zz, recSize;\n var w;\n if (primes.length == 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (pows.length == 0) {\n pows = new Array(512);\n\n for (j = 0; j < 512; j++) {\n pows[j] = Math.pow(2, j / 511 - 1);\n }\n } //c and m should be tuned for a particular machine and value of k, to maximize speed\n\n\n c = 0.1; //c=0.1 in HAC\n\n m = 20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n\n var recLimit = 20; //stop recursion when k <=recLimit. Must have recLimit >= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans);\n s_R = dup(ans);\n s_n1 = dup(ans);\n s_r2 = dup(ans);\n s_d = dup(ans);\n s_x1 = dup(ans); //TODO Seems like a bug in eslint, reports as unused\n\n s_x2 = dup(ans);\n s_b = dup(ans);\n s_n = dup(ans);\n s_i = dup(ans);\n s_rm = dup(ans);\n s_q = dup(ans);\n s_a = dup(ans);\n s_aa = dup(ans);\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << (k + 2 >> 1)) - 1; //pm is binary number with all ones, just over sqrt(2^k)\n\n copyInt_(ans, 0);\n\n for (dd = 1; dd;) {\n dd = 0;\n ans[0] = 1 | 1 << k - 1 | Math.floor(Math.random() * (1 << k)); //random, k-bit, odd integer, with msb 1\n\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1;\n break;\n }\n }\n }\n\n carry_(ans);\n return;\n }\n\n B = c * k * k; //try small primes up to B (or all the primes[] array if the largest is less than B).\n\n if (k > 2 * m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m;) {\n r = pows[Math.floor(Math.random() * 512)];\n } //r=Math.pow(2,Math.random()-1);\n else r = 0.5; //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1;\n randTruePrime_(s_q, recSize);\n copyInt_(s_i2, 0);\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << (k - 2) % bpe; //s_i2=2^(k-2)\n\n divide_(s_i2, s_q, s_i, s_rm); //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i);\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0);\n if (greater(s_i, s_R)) break;\n } //now s_R is in the range [0,s_i-1]\n\n\n addInt_(s_R, 1); //now s_R is in the range [1,s_i]\n\n add_(s_R, s_i); //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q);\n mult_(s_n, s_R);\n multInt_(s_n, 2);\n addInt_(s_n, 1); //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R);\n multInt_(s_r2, 2); //s_r2=2*s_R\n //check s_n for divisibility by small primes up to B\n\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++) {\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1;\n break;\n }\n }\n\n if (!divisible) if (!millerRabinInt(s_n, 2)) //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1;\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3);\n\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--) {\n ;\n } //strip leading zeros\n\n\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++) {\n ;\n }\n\n zz += bpe * j; //zz=number of bits in s_n, ignoring leading zeros\n\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0);\n if (greater(s_n, s_a)) break;\n } //now s_a is in the range [0,s_n-1]\n\n\n addInt_(s_n, 3); //now s_a is in the range [0,s_n-4]\n\n addInt_(s_a, 2); //now s_a is in the range [2,s_n-2]\n\n copy_(s_b, s_a);\n copy_(s_n1, s_n);\n addInt_(s_n1, -1);\n powMod_(s_b, s_n1, s_n); //s_b=s_a^(s_n-1) modulo s_n\n\n addInt_(s_b, -1);\n\n if (isZero(s_b)) {\n copy_(s_b, s_a);\n powMod_(s_b, s_r2, s_n);\n addInt_(s_b, -1);\n copy_(s_aa, s_n);\n copy_(s_d, s_b);\n GCD_(s_d, s_n); //if s_b and s_n are relatively prime, then s_n is a prime\n\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa);\n return; //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n}\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n\nexport function randBigInt(n, s) {\n var a, b;\n a = Math.floor((n - 1) / bpe) + 2; //# array elements to hold the BigInt with a leading 0 element\n\n b = int2bigInt(0, 0, a);\n randBigInt_(b, n, s);\n return b;\n}\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n\nexport function randBigInt_(b, n, s) {\n var i, a;\n\n for (i = 0; i < b.length; i++) {\n b[i] = 0;\n }\n\n a = Math.floor((n - 1) / bpe) + 1; //# array elements to hold the BigInt\n\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << bpe - 1));\n }\n\n b[a - 1] &= (2 << (n - 1) % bpe) - 1;\n if (s == 1) b[a - 1] |= 1 << (n - 1) % bpe;\n}\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function GCD(x, y) {\n var xc, yc;\n xc = dup(x);\n yc = dup(y);\n GCD_(xc, yc);\n return xc;\n}\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\n\nexport function GCD_(x, y) {\n var i, xp, yp, A, B, C, D, q, sing;\n var qp;\n if (T.length !== x.length) T = dup(x);\n sing = 1;\n\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0;\n\n for (i = 1; i < y.length; i++ //check if y has nonzero elements other than 0\n ) {\n if (y[i]) {\n sing = 1;\n break;\n }\n }\n\n if (!sing) break; //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--) {\n ;\n } //find most significant element of x\n\n\n xp = x[i];\n yp = y[i];\n A = 1;\n B = 0;\n C = 0;\n D = 1;\n\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C));\n qp = Math.floor((xp + B) / (yp + D));\n if (q != qp) break;\n t = A - q * C;\n A = C;\n C = t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n\n t = B - q * D;\n B = D;\n D = t;\n t = xp - q * yp;\n xp = yp;\n yp = t;\n }\n\n if (B) {\n copy_(T, x);\n linComb_(x, y, A, B); //x=A*x+B*y\n\n linComb_(y, T, D, C); //y=D*y+C*T\n } else {\n mod_(x, y);\n copy_(T, x);\n copy_(x, y);\n copy_(y, T);\n }\n }\n\n if (y[0] === 0) return;\n t = modInt(x, y[0]);\n copyInt_(x, y[0]);\n y[0] = t;\n\n while (y[0]) {\n x[0] %= y[0];\n t = x[0];\n x[0] = y[0];\n y[0] = t;\n }\n}\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n\nexport function inverseMod_(x, n) {\n var k = 1 + 2 * Math.max(x.length, n.length);\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0);\n return 0;\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_v = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n copy_(eg_u, x);\n copy_(eg_v, n);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, n);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, n);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C) //make sure answer is nonnegative\n ) {\n add_(eg_C, n);\n }\n\n copy_(x, eg_C);\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0);\n return 0;\n }\n\n return 1;\n }\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function inverseModInt(x, n) {\n var a = 1,\n b = 0,\n t;\n\n for (;;) {\n if (x === 1) return a;\n if (x === 0) return 0;\n b -= a * Math.floor(n / x); //$off\n\n n %= x;\n if (n === 1) return b; //to avoid negatives, change this b to n-b, and each -= to +=\n\n if (n === 0) return 0;\n a -= b * Math.floor(x / n); //$off\n\n x %= n;\n }\n /*::\n declare var never: empty\n return never\n */\n\n} //this deprecated function is for backward compatibility only.\n\nfunction inverseModInt_(x, n) {\n return inverseModInt(x, n);\n}\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\n\n\nexport function eGCD_(x, y, v, a, b) {\n var g = 0;\n var k = Math.max(x.length, y.length);\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x);\n halve_(y);\n g++;\n }\n\n copy_(eg_u, x);\n copy_(v, y);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, y);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, y);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //v>u\n sub_(v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y);\n sub_(eg_D, x);\n }\n\n multInt_(eg_D, -1); ///make sure b (D) is nonnegative\n\n copy_(a, eg_C);\n copy_(b, eg_D);\n leftShift_(v, g);\n return;\n }\n }\n}\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function negative(x) {\n //TODO Flow Bool type inference\n return x[x.length - 1] >> bpe - 1 & 1;\n}\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\n\nexport function greaterShift(x, y, shift) {\n var i,\n kx = x.length,\n ky = y.length;\n k = kx + shift < ky ? kx + shift : ky;\n\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) {\n if (x[i] > 0) return 1;\n } //if there are nonzeros in x to the left of the first column of y, then x is bigger\n\n\n for (i = kx - 1 + shift; i < ky; i++) {\n if (y[i] > 0) return 0;\n } //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n\n\n for (i = k - 1; i >= shift; i--) {\n if (x[i - shift] > y[i]) return 1;else if (x[i - shift] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function greater(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = x.length; i < y.length; i++) {\n if (y[i]) return 0;\n } //y has more digits\n\n\n for (i = y.length; i < x.length; i++) {\n if (x[i]) return 1;\n } //x has more digits\n\n\n for (i = k - 1; i >= 0; i--) {\n if (x[i] > y[i]) return 1;else if (x[i] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\n\nexport function divide_(x, y, q, r) {\n var kx, ky;\n var i, j, y1, y2, c, a, b;\n copy_(r, x);\n\n for (ky = y.length; y[ky - 1] === 0; ky--) {\n ;\n } //ky is number of elements in y, not including leading zeros\n //normalize: ensure the most significant element of y has its highest bit set\n\n\n b = y[ky - 1];\n\n for (a = 0; b; a++) {\n b >>= 1;\n }\n\n a = bpe - a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n\n leftShift_(y, a); //multiply both by 1<<a now, then divide both by that at the end\n\n leftShift_(r, a); //Rob Visser discovered a bug: the following line was originally just before the normalization.\n\n for (kx = r.length; r[kx - 1] === 0 && kx > ky; kx--) {\n ;\n } //kx is number of elements in normalized x, not including leading zeros\n\n\n copyInt_(q, 0); // q=0\n\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky); // r=r-leftShift_(y,kx-ky)\n\n q[kx - ky]++; // q[kx-ky]++;\n } // }\n\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask;else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1]); //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky];\n c = y2 >> bpe;\n y2 = y2 & mask;\n y1 = c + q[i - ky] * y[ky - 1];\n c = y1 >> bpe;\n y1 = y1 & mask;\n if (c == r[i] ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1] : c > r[i]) q[i - ky]--;else break;\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky); //r=r-q[i-ky]*leftShift_(y,i-ky)\n\n if (negative(r)) {\n addShift_(r, y, i - ky); //r=r+leftShift_(y,i-ky)\n\n q[i - ky]--;\n }\n }\n\n rightShift_(y, a); //undo the normalization step\n\n rightShift_(r, a); //undo the normalization step\n}\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\n\nexport function carry_(x) {\n var i, k, c, b;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function modInt(x, n) {\n var i,\n c = 0;\n\n for (i = x.length - 1; i >= 0; i--) {\n c = (c * radix + x[i]) % n;\n }\n\n return c;\n}\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\n\nexport function int2bigInt(t, bits, minSize) {\n var i, k;\n k = Math.ceil(bits / bpe) + 1;\n k = minSize > k ? minSize : k;\n var buff = new Array(k);\n copyInt_(buff, t);\n return buff;\n}\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\n\nexport function str2bigInt(s, base, minSize) {\n var d, i, x, y, kk;\n var k = s.length;\n\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0);\n\n for (;;) {\n y = new Array(x.length + 1);\n\n for (i = 0; i < x.length; i++) {\n y[i + 1] = x[i];\n }\n\n y[0] = parseInt(s, 10); //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n\n x = y;\n d = s.indexOf(',', 0);\n if (d < 1) break; //$off\n\n s = s.substring(d + 1);\n if (s.length == 0) break;\n } //$off\n\n\n if (x.length < minSize) {\n //$off\n y = new Array(minSize);\n copy_(y, x);\n return y;\n }\n\n return x;\n }\n\n x = int2bigInt(0, base * k, 0);\n\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0);\n if (base <= 36 && d >= 36) //convert lowercase to uppercase if base<=36\n d -= 26;\n\n if (d >= base || d < 0) {\n //stop at first illegal character\n break;\n }\n\n multInt_(x, base);\n addInt_(x, d);\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--) {\n ;\n } //strip off leading zeros\n //$off\n\n\n k = minSize > k + 1 ? minSize : k + 1; //$off\n\n y = new Array(k); //$off\n\n kk = k < x.length ? k : x.length; //$off\n\n for (i = 0; i < kk; i++) {\n y[i] = x[i];\n } //$off\n\n\n for (; i < k; i++) {\n y[i] = 0;\n }\n\n return y;\n} //return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i<x.length;i++)\n// y[i+1]=x[i];\n// y[0]=parseInt(s,10);\n// x=y;\n// d=s.indexOf(',',0);\n// if (d<1)\n// break;\n// s=s.substring(d+1);\n// if (s.length==0)\n// break;\n// }\n// if (x.length<minSize) {\n// y=new Array(minSize);\n// copy_(y,x);\n// return y;\n// }\n// return x;\n// }\n// x=int2bigInt(0,base*k,0);\n// for (i=0;i<k;i++) {\n// d=str.indexOf(s.substring(i,i+1),0);\n// if (base<=36 && d>=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k<x.length ? k : x.length;\n// for (i=0;i<kk;i++)\n// y[i]=x[i];\n// for (;i<k;i++)\n// y[i]=0;\n// return y;\n// }\n\n/**\n * is bigint x equal to integer y?\n *\n * y must have less than bpe bits\n *\n * @export\n * @param {number[]} x\n * @param {number} y\n * @returns {(1 | 0)}\n */\n\nexport function equalsInt(x, y) {\n var i;\n if (x[0] != y) return 0;\n\n for (i = 1; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * are bigints x and y equal?\n *\n * this works even if x and y are different lengths and have arbitrarily many leading zeros\n *\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function equals(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n if (x[i] !== y[i]) return 0;\n }\n\n if (x.length > y.length) {\n for (; i < x.length; i++) {\n if (x[i]) return 0;\n }\n } else {\n for (; i < y.length; i++) {\n if (y[i]) return 0;\n }\n }\n\n return 1;\n}\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function isZero(x) {\n var i;\n\n for (i = 0; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\n\nexport function bigInt2str(x, base) {\n var i,\n t,\n s = '';\n if (s6.length !== x.length) s6 = dup(x);else copy_(s6, x);\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) {\n s += x[i] + ',';\n }\n\n s += x[0];\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base); //t=s6 % base; s6=floor(s6/base);\n\n s = digitsStr.substring(t, t + 1) + s;\n }\n }\n\n if (s.length === 0) s = '0';\n return s;\n}\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\n\nexport function dup(x) {\n var i;\n buff = Array(x.length);\n copy_(buff, x);\n return buff;\n}\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\n\nexport function copy_(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n x[i] = y[i];\n }\n\n for (i = k; i < x.length; i++) {\n x[i] = 0;\n }\n}\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function copyInt_(x, n) {\n var i, c;\n var len = x.length; //TODO .length in for loop have perfomance costs. Bench this\n\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function addInt_(x, n) {\n var i, k, c, b;\n x[0] += n;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n if (!c) return; //stop carrying as soon as the carry is zero\n }\n}\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\n\nexport function rightShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = 0; i < x.length - k; i++ //right shift x by k elements\n ) {\n x[i] = x[i + k];\n }\n\n for (; i < x.length; i++) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - n | x[i] >> n);\n }\n\n x[i] >>= n;\n}\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\n\nexport function halve_(x) {\n var i;\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - 1 | x[i] >> 1);\n }\n\n x[i] = x[i] >> 1 | x[i] & radix >> 1; //most significant bit stays the same\n}\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function leftShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = x.length; i >= k; i-- //left shift x by k elements\n ) {\n x[i] = x[i - k];\n }\n\n for (; i >= 0; i--) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n if (!n) return;\n\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & (x[i] << n | x[i - 1] >> bpe - n);\n }\n\n x[i] = mask & x[i] << n;\n}\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function multInt_(x, n) {\n var i, k, c, b;\n if (!n) return;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i] * n;\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\n\nexport function divInt_(x, n) {\n var i,\n r = 0,\n s;\n\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i];\n x[i] = Math.floor(s / n);\n r = s % n;\n }\n\n return r;\n}\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\n\nexport function linComb_(x, y, a, b) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n kk = x.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; i < kk; i++) {\n c += a * x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\n\nexport function linCombShift_(x, y, b, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function addShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function subShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function sub_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function add_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function mult_(x, y) {\n var i;\n if (ss.length != 2 * x.length) ss = new Array(2 * x.length);\n copyInt_(ss, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(ss, x, y[i], i);\n } //ss=1*ss+y[i]*(x<<(i*bpe))\n\n\n copy_(x, ss);\n}\n/**\n * do x=x mod n for bigInts x and n\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function mod_(x, n) {\n if (s4.length !== x.length) s4 = dup(x);else copy_(s4, x);\n if (s5.length !== x.length) s5 = dup(x);\n divide_(s4, n, s5, x); //x = remainder of s4 / n\n}\n/**\n * do x=x*y mod n for bigInts x,y,n.\n *\n * for greater speed, let y<x.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function multMod_(x, y, n) {\n var i;\n if (s0.length != 2 * x.length) s0 = new Array(2 * x.length);\n copyInt_(s0, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(s0, x, y[i], i);\n } //s0=1*s0+y[i]*(x<<(i*bpe))\n\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * do x=x*x mod n for bigInts x,n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function squareMod_(x, n) {\n var i, j, d, c, kx, kn, k;\n\n for (kx = x.length; kx > 0 && !x[kx - 1]; kx--) {\n ;\n } //ignore leading zeros in x\n\n\n k = kx > n.length ? 2 * kx : 2 * n.length; //k=# elements in the product, which is twice the elements in the larger of x and n\n\n if (s0.length != k) s0 = new Array(k);\n copyInt_(s0, 0);\n\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i];\n s0[2 * i] = c & mask;\n c >>= bpe;\n\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c;\n s0[i + j] = c & mask;\n c >>= bpe;\n }\n\n s0[i + kx] = c;\n }\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function trim(x, k) {\n var i, y;\n\n for (i = x.length; i > 0 && !x[i - 1]; i--) {\n ;\n }\n\n y = new Array(i + k);\n copy_(y, x);\n return y;\n}\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function powMod_(x, y, n) {\n var k1, k2, kn, np;\n if (s7.length != n.length) s7 = dup(n); //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n\n if ((n[0] & 1) == 0) {\n copy_(s7, x);\n copyInt_(x, 1);\n\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n);\n divInt_(y, 2);\n squareMod_(s7, n);\n }\n\n return;\n } //calculate np from n for the Montgomery multiplications\n\n\n copyInt_(s7, 0);\n\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--) {\n ;\n }\n\n np = radix - inverseModInt(modInt(n, radix), radix);\n s7[kn] = 1;\n multMod_(x, s7, n); // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x);else copy_(s3, x); //$off\n\n for (k1 = y.length - 1; k1 > 0 & !y[k1]; k1--) {\n ;\n } //k1=first nonzero element of y\n\n\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1);\n return;\n }\n\n for (k2 = 1 << bpe - 1; k2 && !(y[k1] & k2); k2 >>= 1) {\n ;\n } //k2=position of first 1 bit in y[k1]\n\n\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--;\n\n if (k1 < 0) {\n mont_(x, one, n, np);\n return;\n }\n\n k2 = 1 << bpe - 1;\n }\n\n mont_(x, x, n, np);\n if (k2 & y[k1]) //if next bit is a 1\n mont_(x, s3, n, np);\n }\n}\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\n\nexport function mont_(x, y, n, np) {\n var i, j, c, ui, t, ks;\n var kn = n.length;\n var ky = y.length;\n if (sa.length != kn) sa = new Array(kn);\n copyInt_(sa, 0);\n\n for (; kn > 0 && n[kn - 1] == 0; kn--) {\n ;\n } //ignore leading zeros of n\n\n\n for (; ky > 0 && y[ky - 1] == 0; ky--) {\n ;\n } //ignore leading zeros of y\n\n\n ks = sa.length - 1; //sa will never have more than this many nonzero elements.\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0];\n ui = (t & mask) * np & mask; //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n\n c = t + ui * n[0] >> bpe;\n t = x[i]; //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n\n j = 1;\n\n for (; j < ky - 4;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ky;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn - 4;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ks;) {\n c += sa[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n sa[j - 1] = c & mask;\n }\n\n if (!greater(n, sa)) sub_(sa, n);\n copy_(x, sa);\n}\n//# sourceMappingURL=index.js.map"
},
{
"id": 15,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/tl_utils.ts",
"name": "./src/lib/tl_utils.ts",
"index": 30,
"index2": 27,
"size": 24172,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./tl_utils",
"loc": "59:17-38"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./tl_utils",
"loc": "16:17-38"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar utils_1 = require(\"./utils\");\nvar Config = __importStar(require(\"./config\"));\nvar TLSerialization = /** @class */ (function () {\n function TLSerialization(options) {\n if (options === void 0) { options = {}; }\n this.maxLength = 2048; // 2Kb\n this.offset = 0; // in bytes\n this.mtproto = false;\n this.debug = false; //Config.Modes.debug;\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n TLSerialization.prototype.createBuffer = function () {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n };\n TLSerialization.prototype.getArray = function () {\n var resultBuffer = new ArrayBuffer(this.offset);\n var resultArray = new Int32Array(resultBuffer);\n resultArray.set(this.intView.subarray(0, this.offset / 4));\n return resultArray;\n };\n TLSerialization.prototype.getBuffer = function () {\n return this.getArray().buffer;\n };\n TLSerialization.prototype.getBytes = function (typed) {\n if (typed) {\n var resultBuffer = new ArrayBuffer(this.offset);\n var resultArray = new Uint8Array(resultBuffer);\n resultArray.set(this.byteView.subarray(0, this.offset));\n return resultArray;\n }\n var bytes = [];\n for (var i = 0; i < this.offset; i++) {\n bytes.push(this.byteView[i]);\n }\n return bytes;\n };\n TLSerialization.prototype.checkLength = function (needBytes) {\n if (this.offset + needBytes < this.maxLength) {\n return;\n }\n console.trace('Increase buffer', this.offset, needBytes, this.maxLength);\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n var previousBuffer = this.buffer;\n var previousArray = new Int32Array(previousBuffer);\n this.createBuffer();\n new Int32Array(this.buffer).set(previousArray);\n };\n TLSerialization.prototype.writeInt = function (i, field) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n this.checkLength(4);\n this.intView[this.offset / 4] = i;\n this.offset += 4;\n };\n TLSerialization.prototype.storeInt = function (i, field) {\n this.writeInt(i, (field || '') + ':int');\n };\n TLSerialization.prototype.storeBool = function (i, field) {\n if (i) {\n this.writeInt(0x997275b5, (field || '') + ':bool');\n }\n else {\n this.writeInt(0xbc799737, (field || '') + ':bool');\n }\n };\n TLSerialization.prototype.storeLongP = function (iHigh, iLow, field) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n };\n TLSerialization.prototype.storeLong = function (sLong, field) {\n if (Array.isArray(sLong)) {\n if (sLong.length == 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n }\n else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n if (typeof sLong != 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n var divRem = bin_utils_1.bigStringInt(sLong).divideAndRemainder(bin_utils_1.bigint(0x100000000));\n this.writeInt(bin_utils_1.intToUint(divRem[1].intValue()), (field || '') + ':long[low]');\n this.writeInt(bin_utils_1.intToUint(divRem[0].intValue()), (field || '') + ':long[high]');\n };\n TLSerialization.prototype.storeDouble = function (f, field) {\n var buffer = new ArrayBuffer(8);\n var intView = new Int32Array(buffer);\n var doubleView = new Float64Array(buffer);\n doubleView[0] = f;\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n };\n TLSerialization.prototype.storeString = function (s, field) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n if (s === undefined) {\n s = '';\n }\n var sUTF8 = unescape(encodeURIComponent(s));\n this.checkLength(sUTF8.length + 8);\n var len = sUTF8.length;\n if (len <= 253) {\n this.byteView[this.offset++] = len;\n }\n else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for (var i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n // Padding\n while (this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n };\n TLSerialization.prototype.storeBytes = function (bytes, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n else if (bytes === undefined) {\n bytes = [];\n }\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || '') + ':bytes');\n var len = bytes.byteLength || bytes.length;\n this.checkLength(len + 8);\n if (len <= 253) {\n this.byteView[this.offset++] = len;\n }\n else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n // Padding\n while (this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n };\n TLSerialization.prototype.storeIntBytes = function (bytes, bits, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n if ((bits % 32) || (len * 8) != bits) {\n throw new Error('Invalid bits: ' + bits + ', ' + bytes.length);\n }\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || '') + ':int' + bits);\n this.checkLength(len);\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n };\n TLSerialization.prototype.storeRawBytes = function (bytes, field) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n this.debug && console.log('>>>', bin_utils_1.bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n };\n TLSerialization.prototype.storeMethod = function (methodName, params) {\n var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API;\n var methodData = false, i;\n for (i = 0; i < schema.methods.length; i++) {\n if (schema.methods[i].method == methodName) {\n methodData = schema.methods[i];\n break;\n }\n }\n if (!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n this.storeInt(bin_utils_1.intToUint(methodData.id), methodName + '[id]');\n var param, type;\n var i, condType;\n var fieldBit;\n var len = methodData.params.length;\n for (i = 0; i < len; i++) {\n param = methodData.params[i];\n type = param.type;\n if (type.indexOf('?') !== -1) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n if (!(params[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n }\n return methodData.type;\n };\n TLSerialization.prototype.storeObject = function (obj, type, field) {\n switch (type) {\n case '#':\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return;\n }\n // console.log('storeObject', obj, type, field);\n if (Array.isArray(obj)) {\n if (type.substr(0, 6) == 'Vector') {\n this.writeInt(0x1cb5c415, field + '[id]');\n }\n else if (type.substr(0, 6) != 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n this.writeInt(obj.length, field + '[count]');\n for (var i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n return true;\n }\n else if (type.substr(0, 6).toLowerCase() == 'vector') {\n throw new Error('Invalid vector object');\n }\n if (!utils_1.isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n var schema = this.mtproto ? Config.Schema.MTProto : Config.Schema.API;\n var predicate = obj['_'];\n var isBare = false;\n var constructorData = false;\n if (isBare = (type.charAt(0) == '%')) {\n type = type.substr(1);\n }\n for (i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].predicate == predicate) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n if (predicate == type) {\n isBare = true;\n }\n if (!isBare) {\n this.writeInt(bin_utils_1.intToUint(constructorData.id), field + '[' + predicate + '][id]');\n }\n var param, type;\n var condType;\n var fieldBit;\n var len = constructorData.params.length;\n for (i = 0; i < len; i++) {\n param = constructorData.params[i];\n type = param.type;\n if (type.indexOf('?') !== -1) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n // @ts-ignore\n if (!(obj[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n }\n return constructorData.type;\n };\n return TLSerialization;\n}());\nexports.TLSerialization = TLSerialization;\nvar TLDeserialization = /** @class */ (function () {\n function TLDeserialization(buffer, options) {\n if (options === void 0) { options = {}; }\n this.offset = 0; // in bytes\n // this.debug = \n this.mtproto = false;\n this.buffer = buffer;\n this.intView = new Uint32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n this.override = 'override' in options ? options.override : {};\n this.mtproto = 'mtproto' in options ? options.mtproto : false;\n this.debug = options.debug !== undefined ? options.debug : /* Config.Modes.debug */ false;\n }\n TLDeserialization.prototype.readInt = function (field) {\n if (this.offset >= this.intView.length * 4) {\n throw new Error('Nothing to fetch: ' + field);\n }\n var i = this.intView[this.offset / 4];\n this.debug && console.log('<<<', i.toString(16), i, field);\n this.offset += 4;\n return i;\n };\n TLDeserialization.prototype.fetchInt = function (field) {\n return this.readInt((field || '') + ':int');\n };\n TLDeserialization.prototype.fetchDouble = function (field) {\n var buffer = new ArrayBuffer(8);\n var intView = new Int32Array(buffer);\n var doubleView = new Float64Array(buffer);\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n return doubleView[0];\n };\n TLDeserialization.prototype.fetchLong = function (field) {\n var iLow = this.readInt((field || '') + ':long[low]');\n var iHigh = this.readInt((field || '') + ':long[high]');\n var longDec = bin_utils_1.bigint(iHigh).shiftLeft(32).add(bin_utils_1.bigint(iLow)).toString();\n return longDec;\n };\n TLDeserialization.prototype.fetchBool = function (field) {\n var i = this.readInt((field || '') + ':bool');\n if (i == 0x997275b5) {\n return true;\n }\n else if (i == 0xbc799737) {\n return false;\n }\n this.offset -= 4;\n return this.fetchObject('Object', field);\n };\n TLDeserialization.prototype.fetchString = function (field) {\n var len = this.byteView[this.offset++];\n if (len == 254) {\n var len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n var sUTF8 = '';\n for (var i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n // Padding\n while (this.offset % 4) {\n this.offset++;\n }\n try {\n var s = decodeURIComponent(escape(sUTF8));\n }\n catch (e) {\n var s = sUTF8;\n }\n this.debug && console.log('<<<', s, (field || '') + ':string');\n return s;\n };\n TLDeserialization.prototype.fetchBytes = function (field) {\n var len = this.byteView[this.offset++];\n if (len == 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n var bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n // Padding\n while (this.offset % 4) {\n this.offset++;\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || '') + ':bytes');\n return bytes;\n };\n TLDeserialization.prototype.fetchIntBytes = function (bits, typed, field) {\n if (bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n var len = bits / 8;\n if (typed) {\n var result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n var bytes = [];\n for (var i = 0; i < len; i++) {\n bytes.push(this.byteView[this.offset++]);\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || '') + ':int' + bits);\n return bytes;\n };\n TLDeserialization.prototype.fetchRawBytes = function (len, typed, field) {\n if (len === false) {\n len = this.readInt((field || '') + '_length');\n if (len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n if (typed) {\n var bytes_1 = new Uint8Array(len);\n bytes_1.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes_1;\n }\n var bytes = [];\n for (var i = 0; i < len; i++) {\n bytes.push(this.byteView[this.offset++]);\n }\n this.debug && console.log('<<<', bin_utils_1.bytesToHex(bytes), (field || ''));\n return bytes;\n };\n TLDeserialization.prototype.fetchObject = function (type, field) {\n switch (type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, false, field);\n case 'int256':\n return this.fetchIntBytes(256, false, field);\n case 'int512':\n return this.fetchIntBytes(512, false, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n field = field || type || 'Object';\n if (type.substr(0, 6) == 'Vector' || type.substr(0, 6) == 'vector') {\n if (type.charAt(0) == 'V') {\n var constructor = this.readInt(field + '[id]');\n var constructorCmp = bin_utils_1.uintToInt(constructor);\n if (constructorCmp == 0x3072cfa1) { // Gzip packed\n var compressed = this.fetchBytes(field + '[packed_string]');\n var uncompressed = bin_utils_1.gzipUncompress(compressed);\n var buffer = bin_utils_1.bytesToArrayBuffer(uncompressed);\n var newDeserializer = (new TLDeserialization(buffer));\n return newDeserializer.fetchObject(type, field);\n }\n if (constructorCmp != 0x1cb5c415) {\n throw new Error('Invalid vector constructor ' + constructor);\n }\n }\n var len = this.readInt(field + '[count]');\n var result = [];\n if (len > 0) {\n var itemType = type.substr(7, type.length - 8); // for \"Vector<itemType>\"\n for (var i = 0; i < len; i++) {\n result.push(this.fetchObject(itemType, field + '[' + i + ']'));\n }\n }\n return result;\n }\n var schema = (this.mtproto ? Config.Schema.MTProto : Config.Schema.API);\n var predicate = false;\n var constructorData = false;\n if (type.charAt(0) == '%') {\n var checkType = type.substr(1);\n for (var i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].type == checkType) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }\n else if (type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n for (var i = 0; i < schema.constructors.length; i++) {\n if (schema.constructors[i].predicate == type) {\n constructorData = schema.constructors[i];\n break;\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n }\n else {\n var constructor = this.readInt(field + '[id]');\n var constructorCmp = bin_utils_1.uintToInt(constructor);\n if (constructorCmp == 0x3072cfa1) { // Gzip packed\n var compressed = this.fetchBytes(field + '[packed_string]');\n var uncompressed = bin_utils_1.gzipUncompress(compressed);\n var buffer = bin_utils_1.bytesToArrayBuffer(uncompressed);\n var newDeserializer = (new TLDeserialization(buffer));\n return newDeserializer.fetchObject(type, field);\n }\n var index = schema.constructorsIndex;\n if (!index) {\n schema.constructorsIndex = index = {};\n for (var i = 0; i < schema.constructors.length; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n var i = index[constructorCmp];\n if (i) {\n constructorData = schema.constructors[i];\n }\n var fallback = false;\n if (!constructorData && this.mtproto) {\n var schemaFallback = Config.Schema.API;\n for (i = 0; i < schemaFallback.constructors.length; i++) {\n // @ts-ignore\n if (schemaFallback.constructors[i].id == constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n if (!constructorData) {\n throw new Error('Constructor not found: ' + constructor + ' ' + this.fetchInt() + ' ' + this.fetchInt());\n }\n }\n predicate = constructorData.predicate;\n var result = { '_': predicate };\n var overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n var self = this;\n if (this.override[overrideKey]) {\n this.override[overrideKey].apply(this, [result, field + '[' + predicate + ']']);\n }\n else {\n var i, param;\n var type, isCond;\n var condType, fieldBit;\n var value;\n var len = constructorData.params.length;\n for (i = 0; i < len; i++) {\n param = constructorData.params[i];\n type = param.type;\n if (type == '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n if (isCond = (type.indexOf('?') !== -1)) {\n condType = type.split('?');\n fieldBit = condType[0].split('.');\n if (!(result[fieldBit[0]] & (1 << fieldBit[1]))) {\n continue;\n }\n type = condType[1];\n }\n value = self.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n if (isCond && type === 'true') {\n result.pFlags[param.name] = value;\n }\n else {\n result[param.name] = value;\n }\n }\n }\n // @ts-ignore\n if (fallback) {\n this.mtproto = true;\n }\n return result;\n };\n TLDeserialization.prototype.getOffset = function () {\n return this.offset;\n };\n TLDeserialization.prototype.fetchEnd = function () {\n if (this.offset != this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n return true;\n };\n return TLDeserialization;\n}());\nexports.TLDeserialization = TLDeserialization;\n"
},
{
"id": 16,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"name": "./src/lib/cryptoworker.ts",
"index": 31,
"index2": 29,
"size": 7737,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./cryptoworker",
"loc": "60:37-62"
},
{
"moduleId": 39,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"module": "./src/lib/mtnetworker.ts",
"moduleName": "./src/lib/mtnetworker.ts",
"type": "cjs require",
"userRequest": "./cryptoworker",
"loc": "17:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\nvar bin_utils_1 = require(\"./bin_utils\");\n// @ts-ignore\nvar crypto_worker_js_1 = __importDefault(require(\"./crypto.worker.js\"));\nvar CryptoWorker = /** @class */ (function () {\n function CryptoWorker() {\n var _this = this;\n this.webWorker = false;\n this.naClEmbed = false;\n this.taskID = 0;\n this.awaiting = {};\n // @ts-ignore\n this.webCrypto = Config.Modes.webcrypto && window.crypto && (window.crypto.subtle || window.crypto.webkitSubtle); /* || window.msCrypto && window.msCrypto.subtle*/\n this.useSha1Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n this.useSha256Crypto = this.webCrypto && this.webCrypto.digest !== undefined;\n var finalizeTask = function (taskID, result) {\n var deferred = _this.awaiting[taskID];\n if (deferred !== undefined) {\n // console.log(dT(), 'CW done')\n deferred.resolve(result);\n delete _this.awaiting[taskID];\n }\n };\n if (Config.Modes.nacl &&\n navigator.mimeTypes &&\n 'application/x-pnacl' in navigator.mimeTypes) {\n //var listener = $('<div id=\"nacl_listener\"><embed id=\"mtproto_crypto\" width=\"0\" height=\"0\" src=\"nacl/mtproto_crypto.nmf\" type=\"application/x-pnacl\" /></div>').appendTo($('body'))[0]\n var listener = document.createElement('template');\n listener.innerHTML = '<div id=\"nacl_listener\"><embed id=\"mtproto_crypto\" width=\"0\" height=\"0\" src=\"nacl/mtproto_crypto.nmf\" type=\"application/x-pnacl\" /></div>';\n document.body.append(listener);\n listener.addEventListener('load', function (e) {\n _this.naClEmbed = listener.firstChild;\n console.log(utils_1.dT(), 'NaCl ready');\n }, true);\n listener.addEventListener('message', function (e) {\n // @ts-ignore\n finalizeTask(e.data.taskID, e.data.result);\n }, true);\n listener.addEventListener('error', function (e) {\n console.error('NaCl error', e);\n }, true);\n }\n // @ts-ignore\n if (window.Worker /* && 1 == 2 */) {\n var tmpWorker = new crypto_worker_js_1.default();\n tmpWorker.onmessage = function (e) {\n if (!_this.webWorker) {\n _this.webWorker = tmpWorker;\n }\n else {\n finalizeTask(e.data.taskID, e.data.result);\n }\n };\n tmpWorker.onerror = function (error) {\n console.error('CW error', error /* , error.stack */);\n _this.webWorker = false;\n };\n }\n }\n CryptoWorker.prototype.performTaskWorker = function (task, params, embed) {\n var _this = this;\n // console.log(dT(), 'CW start', task)\n return new Promise(function (resolve, reject) {\n _this.awaiting[_this.taskID] = { resolve: resolve, reject: reject };\n params.task = task;\n params.taskID = _this.taskID;\n (embed || _this.webWorker).postMessage(params);\n _this.taskID++;\n });\n };\n CryptoWorker.prototype.sha1Hash = function (bytes) {\n var _this = this;\n if (this.useSha1Crypto) {\n // We don't use buffer since typedArray.subarray(...).buffer gives the whole buffer and not sliced one. webCrypto.digest supports typed array\n return new Promise(function (resolve, reject) {\n var bytesTyped = Array.isArray(bytes) ? bin_utils_1.convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n // @ts-ignore\n _this.webCrypto.digest({ name: 'SHA-1' }, bytesTyped).then(function (digest) {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, function (e) {\n console.error('Crypto digest error', e);\n _this.useSha1Crypto = false;\n resolve(bin_utils_1.sha1HashSync(bytes));\n });\n });\n }\n return Promise.resolve(bin_utils_1.sha1HashSync(bytes));\n };\n CryptoWorker.prototype.sha256Hash = function (bytes) {\n var _this = this;\n if (this.useSha256Crypto) {\n return new Promise(function (resolve, reject) {\n var bytesTyped = Array.isArray(bytes) ? bin_utils_1.convertToUint8Array(bytes) : bytes;\n // console.log(dT(), 'Native sha1 start')\n // @ts-ignore\n _this.webCrypto.digest({ name: 'SHA-256' }, bytesTyped).then(function (digest) {\n // console.log(dT(), 'Native sha1 done')\n resolve(digest);\n }, function (e) {\n console.error('Crypto digest error', e);\n _this.useSha256Crypto = false;\n resolve(bin_utils_1.sha256HashSync(bytes));\n });\n });\n }\n return Promise.resolve(bin_utils_1.sha256HashSync(bytes));\n };\n CryptoWorker.prototype.pbkdf2 = function (/* hasher: 'string', */ buffer, salt, iterations) {\n return bin_utils_1.hash_pbkdf2(buffer, salt, iterations);\n return this.performTaskWorker('pbkdf2', {\n /* hasher, */\n buffer: buffer,\n salt: salt,\n iterations: iterations\n });\n };\n CryptoWorker.prototype.aesEncrypt = function (bytes, keyBytes, ivBytes) {\n if (this.naClEmbed) {\n return this.performTaskWorker('aes-encrypt', {\n bytes: bin_utils_1.addPadding(bin_utils_1.convertToArrayBuffer(bytes)),\n keyBytes: bin_utils_1.convertToArrayBuffer(keyBytes),\n ivBytes: bin_utils_1.convertToArrayBuffer(ivBytes)\n }, this.naClEmbed);\n }\n return Promise.resolve(bin_utils_1.convertToArrayBuffer(bin_utils_1.aesEncryptSync(bytes, keyBytes, ivBytes)));\n };\n CryptoWorker.prototype.aesDecrypt = function (encryptedBytes, keyBytes, ivBytes) {\n if (this.naClEmbed) {\n return this.performTaskWorker('aes-decrypt', {\n encryptedBytes: bin_utils_1.addPadding(bin_utils_1.convertToArrayBuffer(encryptedBytes)),\n keyBytes: bin_utils_1.convertToArrayBuffer(keyBytes),\n ivBytes: bin_utils_1.convertToArrayBuffer(ivBytes)\n }, this.naClEmbed);\n }\n return Promise.resolve(bin_utils_1.convertToArrayBuffer(bin_utils_1.aesDecryptSync(encryptedBytes, keyBytes, ivBytes)));\n };\n CryptoWorker.prototype.factorize = function (bytes) {\n bytes = bin_utils_1.convertToByteArray(bytes);\n if (this.naClEmbed && bytes.length <= 8) {\n return this.performTaskWorker('factorize', { bytes: bytes }, this.naClEmbed);\n }\n if (this.webWorker) {\n return this.performTaskWorker('factorize', { bytes: bytes });\n }\n return Promise.resolve(bin_utils_1.pqPrimeFactorization(bytes));\n };\n CryptoWorker.prototype.modPow = function (x, y, m) {\n if (this.webWorker) {\n return this.performTaskWorker('mod-pow', {\n x: x,\n y: y,\n m: m\n });\n }\n return Promise.resolve(bin_utils_1.bytesModPow(x, y, m));\n };\n return CryptoWorker;\n}());\nexports.default = new CryptoWorker();\n"
},
{
"id": 17,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/richtextprocessor.js",
"name": "./src/lib/richtextprocessor.js",
"index": 36,
"index2": 34,
"size": 26053,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"issuerId": 12,
"issuerName": "./src/lib/services.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 12,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"name": "./src/lib/services.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1102,
"building": 243,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 12,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/services.ts",
"module": "./src/lib/services.ts",
"moduleName": "./src/lib/services.ts",
"type": "cjs require",
"userRequest": "./richtextprocessor",
"loc": "40:26-56"
},
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../lib/richtextprocessor",
"loc": "15:26-61"
}
],
"usedExports": true,
"providedExports": [
"RichTextProcessor"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/components/pageSignIn.ts (referenced with cjs require), ./src/lib/services.ts (referenced with cjs require)"
],
"depth": 2,
"source": "import {encodeEntities, copy, emojiUnicode} from './utils';\r\n\r\nvar EmojiHelper = {\r\n emojiMap: (code) => { return code; },\r\n shortcuts: [],\r\n emojis: []\r\n};\r\n\r\nvar emojiData = Config.Emoji;\r\nvar emojiIconSize = emojiData.img_size;\r\nvar emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i) != -1,\r\n emojiCode;\r\n//var emojiRegExp = '\\\\u0023\\\\u20E3|\\\\u00a9|\\\\u00ae|\\\\u203c|\\\\u2049|\\\\u2139|[\\\\u2194-\\\\u2199]|\\\\u21a9|\\\\u21aa|\\\\u231a|\\\\u231b|\\\\u23e9|[\\\\u23ea-\\\\u23ec]|\\\\u23f0|\\\\u24c2|\\\\u25aa|\\\\u25ab|\\\\u25b6|\\\\u2611|\\\\u2614|\\\\u26fd|\\\\u2705|\\\\u2709|[\\\\u2795-\\\\u2797]|\\\\u27a1|\\\\u27b0|\\\\u27bf|\\\\u2934|\\\\u2935|[\\\\u2b05-\\\\u2b07]|\\\\u2b1b|\\\\u2b1c|\\\\u2b50|\\\\u2b55|\\\\u3030|\\\\u303d|\\\\u3297|\\\\u3299|[\\\\uE000-\\\\uF8FF\\\\u270A-\\\\u2764\\\\u2122\\\\u25C0\\\\u25FB-\\\\u25FE\\\\u2615\\\\u263a\\\\u2648-\\\\u2653\\\\u2660-\\\\u2668\\\\u267B\\\\u267F\\\\u2693\\\\u261d\\\\u26A0-\\\\u26FA\\\\u2708\\\\u2702\\\\u2601\\\\u260E]|[\\\\u2600\\\\u26C4\\\\u26BE\\\\u23F3\\\\u2764]|\\\\uD83D[\\\\uDC00-\\\\uDFFF]|\\\\uD83C[\\\\uDDE8-\\\\uDDFA\\uDDEC]\\\\uD83C[\\\\uDDEA-\\\\uDDFA\\uDDE7]|[0-9]\\\\u20e3|\\\\uD83C[\\\\uDC00-\\\\uDFFF]';\r\nvar emojiRegExp = '\\\\u00a9|\\\\u00ae|[\\\\u2000-\\\\u3300]|\\\\ud83c[\\\\ud000-\\\\udfff]|\\\\ud83d[\\\\ud000-\\\\udfff]|\\\\ud83e[\\\\ud000-\\\\udfff]';\r\nvar alphaCharsRegExp = 'a-z' +\r\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\r\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\r\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\r\n '\\\\u02bb' + // Hawaiian\r\n '\\\\u0300-\\\\u036f' + // Combining diacritics\r\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\r\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\r\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\r\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\r\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\r\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\r\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\r\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\r\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\r\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\r\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\r\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\r\n '\\\\u200c' + // Zero-Width Non-Joiner\r\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\r\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\r\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\r\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\r\n '\\\\uff66-\\\\uff9f' + // half width Katakana\r\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\r\nvar alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\r\nvar domainAddChars = '\\u00b7';\r\n// Based on Regular Expression for URL validation by Diego Perini\r\nvar urlRegExp = '((?:https?|ftp)://|mailto:)?' +\r\n // user:pass authentication\r\n '(?:\\\\S{1,64}(?::\\\\S{0,64})?@)?' +\r\n '(?:' +\r\n // sindresorhus/ip-regexp\r\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\r\n '|' +\r\n // host name\r\n '[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\r\n // domain name\r\n '(?:\\\\.[' + alphaCharsRegExp + '0-9][' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\r\n // TLD identifier\r\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\r\n ')' +\r\n // port number\r\n '(?::\\\\d{2,5})?' +\r\n // resource path\r\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?'\r\nvar usernameRegExp = '[a-zA-Z\\\\d_]{5,32}'\r\nvar botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)'\r\nvar fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i')\r\nvar emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\nvar youtubeRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?youtu(?:|\\.be|be\\.com|\\.b)(?:\\/v\\/|\\/watch\\\\?v=|e\\/|(?:\\/\\??#)?\\/watch(?:.+)v=)(.{11})(?:\\&[^\\s]*)?/\r\nvar vimeoRegExp = /^(?:https?:\\/\\/)?(?:www\\.)?vimeo\\.com\\/(\\d+)/\r\nvar instagramRegExp = /^https?:\\/\\/(?:instagr\\.am\\/p\\/|instagram\\.com\\/p\\/)([a-zA-Z0-9\\-\\_]+)/i\r\nvar vineRegExp = /^https?:\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9\\-\\_]+)/i\r\nvar twitterRegExp = /^https?:\\/\\/twitter\\.com\\/.+?\\/status\\/\\d+/i\r\nvar facebookRegExp = /^https?:\\/\\/(?:www\\.|m\\.)?facebook\\.com\\/(?:.+?\\/posts\\/\\d+|(?:story\\.php|permalink\\.php)\\?story_fbid=(\\d+)(?:&substory_index=\\d+)?&id=(\\d+))/i\r\nvar gplusRegExp = /^https?:\\/\\/plus\\.google\\.com\\/\\d+\\/posts\\/[a-zA-Z0-9\\-\\_]+/i\r\nvar soundcloudRegExp = /^https?:\\/\\/(?:soundcloud\\.com|snd\\.sc)\\/([a-zA-Z0-9%\\-\\_]+)\\/([a-zA-Z0-9%\\-\\_]+)/i\r\nvar spotifyRegExp = /(https?:\\/\\/(open\\.spotify\\.com|play\\.spotify\\.com|spoti\\.fi)\\/(.+)|spotify:(.+))/i\r\nvar markdownTestRegExp = /[`_*@]/\r\nvar markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s)(`|\\*\\*|__)([^\\n]+?)\\7([\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)/m\r\nvar siteHashtags = {\r\n Telegram: 'tg://search_hashtag?hashtag={1}',\r\n Twitter: 'https://twitter.com/hashtag/{1}',\r\n Instagram: 'https://instagram.com/explore/tags/{1}/',\r\n 'Google Plus': 'https://plus.google.com/explore/{1}'\r\n}\r\nvar siteMentions = {\r\n Telegram: '#/im?p=%40{1}',\r\n Twitter: 'https://twitter.com/{1}',\r\n Instagram: 'https://instagram.com/{1}/',\r\n GitHub: 'https://github.com/{1}'\r\n}\r\nvar markdownEntities = {\r\n '`': 'messageEntityCode',\r\n '**': 'messageEntityBold',\r\n '__': 'messageEntityItalic'\r\n}\r\nfunction getEmojiSpritesheetCoords(emojiCode) {\r\n /* var i\r\n var row, column\r\n var totalColumns\r\n for (var cat = 0; cat < Config.EmojiCategories.length; cat++) {\r\n totalColumns = Config.EmojiCategorySpritesheetDimens[cat][1]\r\n i = Config.EmojiCategories[cat].indexOf(emojiCode)\r\n if (i > -1) {\r\n row = Math.floor(i / totalColumns)\r\n column = (i % totalColumns)\r\n return { category: cat, row: row, column: column }\r\n }\r\n }\r\n console.error('emoji not found in spritesheet', emojiCode)\r\n return null */\r\n emojiCode = emojiUnicode(emojiCode);\r\n\r\n let emojiInfo = emojiData.emoji.find((e) => e.unified == emojiCode);\r\n if(!emojiInfo) {\r\n //console.error('no emoji by code:', emojiCode);\r\n return null;\r\n }\r\n\r\n let sheetNo = (emojiInfo.sheet_x / 6 | 0) + 1;\r\n\r\n /* let xPos = 100 * (((emojiInfo.sheet_x * (img_size + 2)) + 1) / (sheetSizeX - img_size));\r\n let yPos = 100 * (((emojiInfo.sheet_y * (img_size + 2)) + 1) / (sheetSizeY - img_size)); */\r\n let xPos = emojiInfo.sheet_x * emojiData.multiplyX;\r\n let yPos = 100 / 52 * emojiInfo.sheet_y;\r\n\r\n if(emojiInfo.sheet_x != 2 && emojiInfo.sheet_x != 3) {\r\n xPos += ((emojiInfo.sheet_x + 1) > (6 / 2) ? -1 : 1) * 100 / 204;\r\n }\r\n\r\n //console.log({row: yPos, column: xPos, sheetNo});\r\n\r\n return {row: yPos, column: xPos, sheetNo};\r\n}\r\nfunction parseEntities (text, options) {\r\n options = options || {}\r\n var match\r\n var raw = text,\r\n url\r\n var entities = [],\r\n emojiCode = '',\r\n emojiCoords,\r\n matchIndex\r\n var rawOffset = 0\r\n // var start = tsNow()\r\n while ((match = raw.match(fullRegExp))) {\r\n matchIndex = rawOffset + match.index;\r\n\r\n if(match[3]) { // mentions\r\n entities.push({\r\n _: 'messageEntityMention',\r\n offset: matchIndex + match[1].length,\r\n length: match[2].length + match[3].length\r\n });\r\n } else if(match[4]) {\r\n if(emailRegExp.test(match[4])) { // email\r\n entities.push({\r\n _: 'messageEntityEmail',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n } else {\r\n var url = false;\r\n var protocol = match[5];\r\n var tld = match[6];\r\n var excluded = '';\r\n if(tld) { // URL\r\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\r\n protocol = 'http://';\r\n }\r\n\r\n if(protocol) {\r\n var balanced = checkBrackets(match[4]);\r\n if (balanced.length !== match[4].length) {\r\n excluded = match[4].substring(balanced.length);\r\n match[4] = balanced;\r\n }\r\n\r\n url = (match[5] ? '' : protocol) + match[4];\r\n }\r\n } else { // IP address\r\n url = (match[5] ? '' : 'http://') + match[4];\r\n }\r\n\r\n if (url) {\r\n entities.push({\r\n _: 'messageEntityUrl',\r\n offset: matchIndex,\r\n length: match[4].length\r\n });\r\n }\r\n }\r\n } else if(match[7]) { // New line\r\n entities.push({\r\n _: 'messageEntityLinebreak',\r\n offset: matchIndex,\r\n length: 1\r\n });\r\n } else if(match[8]/* && !emojiSupported */) { // Emoji\r\n if(emojiCode) matchIndex -= match[8].length;\r\n emojiCode += match[8];\r\n console.log('hit', match[8], emojiCode.length);\r\n if((emojiCoords = getEmojiSpritesheetCoords(emojiCode))) {\r\n entities.push({\r\n _: 'messageEntityEmoji',\r\n offset: matchIndex,\r\n length: emojiCode.length,\r\n coords: emojiCoords/* ,\r\n title: emojiData[emojiCode][1][0] */\r\n });\r\n\r\n emojiCode = '';\r\n }\r\n } else if(match[10]) { // Hashtag\r\n entities.push({\r\n _: 'messageEntityHashtag',\r\n offset: matchIndex + match[9].length,\r\n length: match[10].length\r\n });\r\n } else if(match[12]) { // Bot command\r\n entities.push({\r\n _: 'messageEntityBotCommand',\r\n offset: matchIndex + match[11].length,\r\n length: 1 + match[12].length + (match[13] ? 1 + match[13].length : 0)\r\n });\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n rawOffset += match.index + match[0].length;\r\n }\r\n\r\n // if (entities.length) {\r\n // console.log('parse entities', text, entities.slice())\r\n // }\r\n return entities\r\n}\r\nfunction parseEmojis (text) {\r\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\r\n var emojiCode = EmojiHelper.shortcuts[shortcut]\r\n if (emojiCode !== undefined) {\r\n return EmojiHelper.emojis[emojiCode][0]\r\n }\r\n return all\r\n })\r\n}\r\nfunction parseMarkdown (text, entities, noTrim) {\r\n  if (!markdownTestRegExp.test(text)) {\r\n return noTrim ? text : text.trim()\r\n }\r\n var raw = text\r\n var match\r\n var newText = []\r\n var rawOffset = 0\r\n var matchIndex\r\n while (match = raw.match(markdownRegExp)) {\r\n matchIndex = rawOffset + match.index\r\n newText.push(raw.substr(0, match.index))\r\n var text = (match[3] || match[8] || match[11])\r\n rawOffset -= text.length\r\n text = text.replace(/^\\s+|\\s+$/g, '')\r\n rawOffset += text.length\r\n if (text.match(/^`*$/)) {\r\n newText.push(match[0])\r\n }\r\n else if (match[3]) { // pre\r\n if (match[5] == '\\n') {\r\n match[5] = ''\r\n rawOffset -= 1\r\n }\r\n newText.push(match[1] + text + match[5])\r\n entities.push({\r\n _: 'messageEntityPre',\r\n language: '',\r\n offset: matchIndex + match[1].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[2].length + match[4].length\r\n } else if (match[7]) { // code|italic|bold\r\n newText.push(match[6] + text + match[9])\r\n entities.push({\r\n _: markdownEntities[match[7]],\r\n offset: matchIndex + match[6].length,\r\n length: text.length\r\n })\r\n rawOffset -= match[7].length * 2\r\n } else if (match[11]) { // custom mention\r\n newText.push(text)\r\n entities.push({\r\n _: 'messageEntityMentionName',\r\n user_id: match[10],\r\n offset: matchIndex,\r\n length: text.length\r\n })\r\n rawOffset -= match[0].length - text.length\r\n }\r\n raw = raw.substr(match.index + match[0].length)\r\n rawOffset += match.index + match[0].length\r\n }\r\n newText.push(raw)\r\n newText = newText.join('')\r\n if (!newText.replace(/\\s+/g, '').length) {\r\n newText = text\r\n entities.splice(0, entities.length)\r\n }\r\n if (!entities.length && !noTrim) {\r\n newText = newText.trim()\r\n }\r\n return newText\r\n}\r\nfunction mergeEntities (currentEntities, newEntities, fromApi) {\r\n var totalEntities = newEntities.slice()\r\n var i\r\n var len = currentEntities.length\r\n var j\r\n var len2 = newEntities.length\r\n var startJ = 0\r\n var curEntity\r\n var newEntity\r\n var start, end\r\n var cStart, cEnd\r\n var bad\r\n for (i = 0; i < len; i++) {\r\n curEntity = currentEntities[i]\r\n if (fromApi &&\r\n curEntity._ != 'messageEntityLinebreak' &&\r\n curEntity._ != 'messageEntityEmoji') {\r\n continue\r\n }\r\n // console.log('s', curEntity, newEntities)\r\n start = curEntity.offset\r\n end = start + curEntity.length\r\n bad = false\r\n for (j = startJ; j < len2; j++) {\r\n newEntity = newEntities[j]\r\n cStart = newEntity.offset\r\n cEnd = cStart + newEntity.length\r\n if (cStart <= start) {\r\n startJ = j\r\n }\r\n if (start >= cStart && start < cEnd ||\r\n end > cStart && end <= cEnd) {\r\n // console.log('bad', curEntity, newEntity)\r\n if (fromApi &&\r\n start >= cStart && end <= cEnd) {\r\n if (newEntity.nested === undefined) {\r\n newEntity.nested = []\r\n }\r\n curEntity.offset -= cStart\r\n newEntity.nested.push(copy(curEntity))\r\n }\r\n bad = true\r\n break\r\n }\r\n if (cStart >= end) {\r\n break\r\n }\r\n }\r\n if (bad) {\r\n continue\r\n }\r\n totalEntities.push(curEntity)\r\n }\r\n totalEntities.sort(function (a, b) {\r\n return a.offset - b.offset\r\n })\r\n // console.log('merge', currentEntities, newEntities, totalEntities)\r\n return totalEntities\r\n}\r\nfunction wrapRichNestedText (text, nested, options) {\r\n if (nested === undefined) {\r\n return encodeEntities(text)\r\n }\r\n options.hasNested = true\r\n return wrapRichText(text, {entities: nested, nested: true})\r\n}\r\nfunction wrapRichText (text, options = {}) {\r\n if(!text || !text.length) {\r\n return ''\r\n }\r\n\r\n var entities = options.entities;\r\n var contextSite = options.contextSite || 'Telegram';\r\n var contextExternal = contextSite != 'Telegram';\r\n var emojiFound = false;\r\n if(entities === undefined) {\r\n entities = parseEntities(text, options);\r\n }\r\n\r\n console.log('wrapRichText got entities:', text, entities);\r\n var len = entities.length;\r\n var entity;\r\n var entityText;\r\n var skipEntity;\r\n var url;\r\n var html = [];\r\n var lastOffset = 0;\r\n var curEmojiSize = options.emojiIconSize || emojiIconSize;\r\n for(var i = 0; i < len; i++) {\r\n entity = entities[i];\r\n if(entity.offset > lastOffset) {\r\n html.push(\r\n encodeEntities(text.substr(lastOffset, entity.offset - lastOffset))\r\n );\r\n } else if(entity.offset < lastOffset) {\r\n continue;\r\n }\r\n\r\n skipEntity = false;\r\n entityText = text.substr(entity.offset, entity.length);\r\n switch(entity._) {\r\n case 'messageEntityMention':\r\n var contextUrl = !options.noLinks && siteMentions[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var username = entityText.substr(1)\r\n var attr = ''\r\n if (options.highlightUsername &&\r\n options.highlightUsername.toLowerCase() == username.toLowerCase()) {\r\n attr = 'class=\"im_message_mymention\"'\r\n }\r\n html.push(\r\n '<a ',\r\n attr,\r\n contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\r\n ' href=\"',\r\n contextUrl.replace('{1}', encodeURIComponent(username)),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '<a href=\"#/im?p=u',\r\n encodeURIComponent(entity.user_id),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityHashtag':\r\n var contextUrl = !options.noLinks && siteHashtags[contextSite]\r\n if (!contextUrl) {\r\n skipEntity = true\r\n break\r\n }\r\n var hashtag = entityText.substr(1)\r\n html.push(\r\n '<a ',\r\n contextExternal ? ' target=\"_blank\" rel=\"noopener noreferrer\" ' : '',\r\n 'href=\"',\r\n contextUrl.replace('{1}', encodeURIComponent(hashtag))\r\n ,\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityEmail':\r\n if (options.noLinks) {\r\n skipEntity = true\r\n break\r\n }\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities('mailto:' + entityText),\r\n '\" target=\"_blank\" rel=\"noopener noreferrer\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityUrl':\r\n case 'messageEntityTextUrl':\r\n var inner\r\n if (entity._ == 'messageEntityTextUrl') {\r\n url = entity.url\r\n url = wrapUrl(url, true)\r\n inner = wrapRichNestedText(entityText, entity.nested, options)\r\n } else {\r\n url = wrapUrl(entityText, false)\r\n inner = encodeEntities(replaceUrlEncodings(entityText))\r\n }\r\n if (options.noLinks) {\r\n html.push(inner);\r\n } else {\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities(url),\r\n '\" target=\"_blank\" rel=\"noopener noreferrer\">',\r\n inner,\r\n '</a>'\r\n )\r\n }\r\n break\r\n case 'messageEntityLinebreak':\r\n html.push(options.noLinebreaks ? ' ' : '<br/>')\r\n break\r\n case 'messageEntityEmoji':\r\n \r\n var inner = `<span class=\"emoji-inner\" style=\"background: url(${emojiData.sheetUrl}${entity.coords.sheetNo}.png);\r\n background-position:${entity.coords.column}% ${entity.coords.row}%;\r\n background-size:${emojiData.sizeX}% ${emojiData.sizeY}%\"></span>`;\r\n\r\n html.push(`<span class=\"emoji-outer emoji-sizer\">${emojiSupported ? encodeEntities(entityText) : inner}</span>`);\r\n /* html.push(\r\n '<span class=\"emoji emoji-',\r\n entity.coords.category,\r\n '-',\r\n (curEmojiSize * entity.coords.column),\r\n '-',\r\n (curEmojiSize * entity.coords.row),\r\n '\" ',\r\n 'title=\"', entity.title, '\">',\r\n ':', entity.title, ':</span>'\r\n ) */\r\n emojiFound = true;\r\n break\r\n case 'messageEntityBotCommand':\r\n if (options.noLinks || options.noCommands || contextExternal) {\r\n skipEntity = true\r\n break\r\n }\r\n var command = entityText.substr(1)\r\n var bot\r\n var atPos\r\n if ((atPos = command.indexOf('@')) != -1) {\r\n bot = command.substr(atPos + 1)\r\n command = command.substr(0, atPos)\r\n } else {\r\n bot = options.fromBot\r\n }\r\n html.push(\r\n '<a href=\"',\r\n encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : '')),\r\n '\">',\r\n encodeEntities(entityText),\r\n '</a>'\r\n )\r\n break\r\n case 'messageEntityBold':\r\n html.push(\r\n '<strong>',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n '</strong>'\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n html.push(\r\n '<em>',\r\n wrapRichNestedText(entityText, entity.nested, options),\r\n '</em>'\r\n )\r\n break\r\n case 'messageEntityCode':\r\n html.push(\r\n '<code>',\r\n encodeEntities(entityText),\r\n '</code>'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n html.push(\r\n '<pre><code', (entity.language ? ' class=\"language-' + encodeEntities(entity.language) + '\"' : ''), '>',\r\n encodeEntities(entityText),\r\n '</code></pre>'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n\r\n html.push(encodeEntities(text.substr(lastOffset)));\r\n console.log(html);\r\n text = html.join('')//$sanitize(html.join(''))\r\n /* if (!options.nested && (emojiFound || options.hasNested)) {\r\n text = text.replace(/\\ufe0f|&#65039;|&#65533;|&#8205;/g, '', text)\r\n var emojiSizeClass = curEmojiSize == 18 ? '' : (' emoji-w' + curEmojiSize)\r\n text = text.replace(/<span((?: [^>]*)?) class=\"emoji emoji-(\\d)-(\\d+)-(\\d+)\"(.+?)<\\/span>/g,\r\n '<span$1 class=\"emoji ' + emojiSizeClass + ' emoji-spritesheet-$2\" style=\"background-position: -$3px -$4px;\" $5</span>')\r\n } */\r\n return text;//$sce.trustAs('html', text)\r\n}\r\nfunction wrapDraftText (text, options) {\r\n if (!text || !text.length) {\r\n return ''\r\n }\r\n options = options || {}\r\n var entities = options.entities\r\n if (entities === undefined) {\r\n entities = parseEntities(text, options)\r\n }\r\n var i = 0\r\n var len = entities.length\r\n var entity\r\n var entityText\r\n var skipEntity\r\n var code = []\r\n var lastOffset = 0\r\n for (i = 0; i < len; i++) {\r\n entity = entities[i]\r\n if (entity.offset > lastOffset) {\r\n code.push(\r\n text.substr(lastOffset, entity.offset - lastOffset)\r\n )\r\n }\r\n else if (entity.offset < lastOffset) {\r\n continue\r\n }\r\n skipEntity = false\r\n entityText = text.substr(entity.offset, entity.length)\r\n switch (entity._) {\r\n case 'messageEntityEmoji':\r\n code.push(\r\n ':',\r\n entity.title,\r\n ':'\r\n )\r\n break\r\n case 'messageEntityCode':\r\n code.push(\r\n '`', entityText, '`'\r\n )\r\n break\r\n case 'messageEntityBold':\r\n code.push(\r\n '**', entityText, '**'\r\n )\r\n break\r\n case 'messageEntityItalic':\r\n code.push(\r\n '__', entityText, '__'\r\n )\r\n break\r\n case 'messageEntityPre':\r\n code.push(\r\n '```', entityText, '```'\r\n )\r\n break\r\n case 'messageEntityMentionName':\r\n code.push(\r\n '@', entity.user_id, ' (', entityText, ')'\r\n )\r\n break\r\n default:\r\n skipEntity = true\r\n }\r\n lastOffset = entity.offset + (skipEntity ? 0 : entity.length)\r\n }\r\n code.push(text.substr(lastOffset))\r\n return code.join('')\r\n}\r\nfunction checkBrackets (url) {\r\n var urlLength = url.length\r\n var urlOpenBrackets = url.split('(').length - 1\r\n var urlCloseBrackets = url.split(')').length - 1\r\n while (urlCloseBrackets > urlOpenBrackets &&\r\n url.charAt(urlLength - 1) === ')') {\r\n url = url.substr(0, urlLength - 1)\r\n urlCloseBrackets--\r\n urlLength--\r\n }\r\n if (urlOpenBrackets > urlCloseBrackets) {\r\n url = url.replace(/\\)+$/, '')\r\n }\r\n return url\r\n}\r\n\r\nfunction replaceUrlEncodings(urlWithEncoded) {\r\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, function (str) {\r\n try {\r\n return decodeURIComponent(str);\r\n } catch (e) {\r\n return str;\r\n }\r\n });\r\n}\r\n\r\nfunction wrapPlainText(text, options = {}) {\r\n if(emojiSupported) {\r\n return text;\r\n }\r\n\r\n if(!text || !text.length) {\r\n return '';\r\n }\r\n\r\n text = text.replace(/\\ufe0f/g, '', text);\r\n var match;\r\n var raw = text;\r\n var text = [],\r\n emojiTitle;\r\n while((match = raw.match(fullRegExp))) {\r\n text.push(raw.substr(0, match.index))\r\n if(match[8]) {\r\n if((emojiCode = EmojiHelper.emojiMap[match[8]]) &&\r\n (emojiTitle = emojiData[emojiCode][1][0])) {\r\n text.push(':' + emojiTitle + ':');\r\n } else {\r\n text.push(match[0]);\r\n }\r\n } else {\r\n text.push(match[0]);\r\n }\r\n\r\n raw = raw.substr(match.index + match[0].length);\r\n }\r\n text.push(raw);\r\n return text.join('');\r\n}\r\nfunction wrapUrl (url, unsafe) {\r\n if (!url.match(/^https?:\\/\\//i)) {\r\n url = 'http://' + url\r\n }\r\n var tgMeMatch\r\n var telescoPeMatch\r\n if (unsafe == 2) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n else if ((tgMeMatch = url.match(/^https?:\\/\\/t(?:elegram)?\\.me\\/(.+)/))) {\r\n var fullPath = tgMeMatch[1]\r\n var path = fullPath.split('/')\r\n switch (path[0]) {\r\n case 'joinchat':\r\n url = 'tg://join?invite=' + path[1]\r\n break\r\n case 'addstickers':\r\n url = 'tg://addstickers?set=' + path[1]\r\n break\r\n default:\r\n if (path[1] && path[1].match(/^\\d+$/)) {\r\n url = 'tg://resolve?domain=' + path[0] + '&post=' + path[1]\r\n }\r\n else if (path.length == 1) {\r\n var domainQuery = path[0].split('?')\r\n var domain = domainQuery[0]\r\n var query = domainQuery[1]\r\n if (domain == 'iv') {\r\n var match = (query || '').match(/url=([^&=]+)/)\r\n if (match) {\r\n url = match[1]\r\n try {\r\n url = decodeURIComponent(url)\r\n } catch (e) {}\r\n return wrapUrl(url, unsafe)\r\n }\r\n }\r\n url = 'tg://resolve?domain=' + domain + (query ? '&' + query : '')\r\n }\r\n }\r\n }\r\n else if ((telescoPeMatch = url.match(/^https?:\\/\\/telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\r\n url = 'tg://resolve?domain=' + telescoPeMatch[1] + '&post=' + telescoPeMatch[2]\r\n }\r\n else if (unsafe) {\r\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url)\r\n }\r\n return url\r\n}\r\n\r\nlet RichTextProcessor = {\r\n wrapRichText: wrapRichText,\r\n wrapPlainText: wrapPlainText,\r\n wrapDraftText: wrapDraftText,\r\n wrapUrl: wrapUrl,\r\n parseEntities: parseEntities,\r\n parseMarkdown: parseMarkdown,\r\n parseEmojis: parseEmojis,\r\n mergeEntities: mergeEntities\r\n};\r\n\r\nwindow.RichTextProcessor = RichTextProcessor;\r\n\r\nexport {RichTextProcessor};\r\n\r\n"
},
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"index": 0,
"index2": 46,
"size": 3218,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": null,
"issuerId": null,
"issuerName": null,
"issuerPath": null,
"profile": {
"factory": 17,
"building": 2295
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": null,
"moduleIdentifier": null,
"module": null,
"moduleName": null,
"type": "single entry",
"userRequest": "./src/index.ts",
"loc": "main"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 0,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nrequire(\"./materialize.scss\");\nrequire(\"overlayscrollbars/css/OverlayScrollbars.min.css\");\nrequire(\"./scss/style.scss\");\nrequire(\"./scss/tgico.scss\");\nvar services_1 = require(\"./lib/services\");\n/*\nimport {MTProto} from './lib/mtproto';\nimport * as Config from './lib/config';\n\nimport OverlayScrollbars from 'overlayscrollbars';\n\nimport {putPreloader} from './components/misc';\nimport pageAuthCode from './components/pageAuthCode';\nimport pageSignUp from './components/pageSignUp'; */\nvar pageIm_1 = __importDefault(require(\"./components/pageIm\"));\nvar mtproto_1 = require(\"./lib/mtproto\");\nvar pageSignIn_1 = __importDefault(require(\"./components/pageSignIn\"));\n//import '@lottiefiles/lottie-player';\n/* import registerServiceWorker from './registerServiceWorker';\n\nregisterServiceWorker(); */\n// @ts-ignore\nwindow.scrollbarOptions = {\n className: 'scroll',\n sizeAutoCapable: true,\n paddingAbsolute: true,\n autoUpdate: true,\n scrollbars: {\n autoHide: \"leave\",\n autoHideDelay: 200,\n clickScrolling: true\n },\n textarea: {\n dynHeight: true\n }\n};\ndocument.addEventListener('DOMContentLoaded', function () {\n /* pageAuthCode({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"98008787f0546e7419\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"+380509144504\"\n }); */\n //pagePassword();\n var user = services_1.appUsersManager.getSelf();\n if (!user.id) {\n pageSignIn_1.default();\n console.log('need auth');\n }\n else {\n pageIm_1.default();\n mtproto_1.MTProto.apiManager.invokeApi('help.getNearestDc', {}).then(function (nearestDcResult) {\n if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n mtproto_1.MTProto.apiManager.getNetworker(nearestDcResult.nearest_dc, { createNetworker: true });\n }\n });\n }\n /* pageSignUp({\n \"phone_number\": \"+380509144504\",\n \"phone_code_hash\": \"48491\"\n }); */\n //MTProto.apiFileManager.uploadFile(photo).then(function (inputFile) {\n //console.log('uploaded smthn', inputFile);\n /* MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile,\n caption: '',\n geo_point: {_: 'inputGeoPointEmpty'}\n }).then(function (updateResult) {\n AppUsersManager.saveApiUsers(updateResult.users)\n MtpApiManager.getUserID().then(function (id) {\n AppPhotosManager.savePhoto(updateResult.photo, {\n user_id: id\n })\n ApiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updateUserPhoto',\n user_id: id,\n date: tsNow(true),\n photo: AppUsersManager.getUser(id).photo,\n previous: true\n }\n })\n $scope.photo = {}\n })\n }) */\n //});\n});\n"
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"index": 1,
"index2": 3,
"size": 504,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./materialize.scss",
"loc": "6:0-29"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../node_modules/css-loader/dist/cjs.js!../node_modules/resolve-url-loader/index.js!../node_modules/sass-loader/dist/cjs.js??ref--4-3!./materialize.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 20,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/materialize.scss",
"index": 2,
"index2": 1,
"size": 57453,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"issuerId": 19,
"issuerName": "./src/materialize.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 19,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"name": "./src/materialize.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 187,
"building": 2741,
"dependencies": 0
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 19,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/materialize.scss",
"module": "./src/materialize.scss",
"moduleName": "./src/materialize.scss",
"type": "cjs require",
"userRequest": "!!../node_modules/css-loader/dist/cjs.js!../node_modules/resolve-url-loader/index.js!../node_modules/sass-loader/dist/cjs.js??ref--4-3!./materialize.scss",
"loc": "1:14-178"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \".materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=\\\"button\\\"],[type=\\\"reset\\\"],[type=\\\"submit\\\"]{-webkit-appearance:button}button::-moz-focus-inner,[type=\\\"button\\\"]::-moz-focus-inner,[type=\\\"reset\\\"]::-moz-focus-inner,[type=\\\"submit\\\"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=\\\"button\\\"]:-moz-focusring,[type=\\\"reset\\\"]:-moz-focusring,[type=\\\"submit\\\"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=\\\"checkbox\\\"],[type=\\\"radio\\\"]{box-sizing:border-box;padding:0}[type=\\\"number\\\"]::-webkit-inner-spin-button,[type=\\\"number\\\"]::-webkit-outer-spin-button{height:auto}[type=\\\"search\\\"]{-webkit-appearance:textfield;outline-offset:-2px}[type=\\\"search\\\"]::-webkit-search-cancel-button,[type=\\\"search\\\"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\\\"Helvetica Neue\\\",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:flex;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{transition:box-shadow .25s}.hoverable:hover{box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^=\\\"mdi-\\\"],.breadcrumb [class*=\\\"mdi-\\\"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\\\\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;transform:translate3d(0, 0, 0);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:flex;align-items:center;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\\\\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:\\\"\\\\00a0\\\"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation-delay:1.15s}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select{user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:\\\"\\\";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=\\\"push-\\\"],.row .col[class*=\\\"pull-\\\"]{position:relative}.row .col.s1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.33333%}.row .col.pull-s1{right:8.33333%}.row .col.push-s1{left:8.33333%}.row .col.offset-s2{margin-left:16.66667%}.row .col.pull-s2{right:16.66667%}.row .col.push-s2{left:16.66667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.33333%}.row .col.pull-s4{right:33.33333%}.row .col.push-s4{left:33.33333%}.row .col.offset-s5{margin-left:41.66667%}.row .col.pull-s5{right:41.66667%}.row .col.push-s5{left:41.66667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.33333%}.row .col.pull-s7{right:58.33333%}.row .col.push-s7{left:58.33333%}.row .col.offset-s8{margin-left:66.66667%}.row .col.pull-s8{right:66.66667%}.row .col.push-s8{left:66.66667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.33333%}.row .col.pull-s10{right:83.33333%}.row .col.push-s10{left:83.33333%}.row .col.offset-s11{margin-left:91.66667%}.row .col.pull-s11{right:91.66667%}.row .col.push-s11{left:91.66667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.33333%}.row .col.pull-m1{right:8.33333%}.row .col.push-m1{left:8.33333%}.row .col.offset-m2{margin-left:16.66667%}.row .col.pull-m2{right:16.66667%}.row .col.push-m2{left:16.66667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.33333%}.row .col.pull-m4{right:33.33333%}.row .col.push-m4{left:33.33333%}.row .col.offset-m5{margin-left:41.66667%}.row .col.pull-m5{right:41.66667%}.row .col.push-m5{left:41.66667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.33333%}.row .col.pull-m7{right:58.33333%}.row .col.push-m7{left:58.33333%}.row .col.offset-m8{margin-left:66.66667%}.row .col.pull-m8{right:66.66667%}.row .col.push-m8{left:66.66667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.33333%}.row .col.pull-m10{right:83.33333%}.row .col.push-m10{left:83.33333%}.row .col.offset-m11{margin-left:91.66667%}.row .col.pull-m11{right:91.66667%}.row .col.push-m11{left:91.66667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.33333%}.row .col.pull-l1{right:8.33333%}.row .col.push-l1{left:8.33333%}.row .col.offset-l2{margin-left:16.66667%}.row .col.pull-l2{right:16.66667%}.row .col.push-l2{left:16.66667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.33333%}.row .col.pull-l4{right:33.33333%}.row .col.push-l4{left:33.33333%}.row .col.offset-l5{margin-left:41.66667%}.row .col.pull-l5{right:41.66667%}.row .col.push-l5{left:41.66667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.33333%}.row .col.pull-l7{right:58.33333%}.row .col.push-l7{left:58.33333%}.row .col.offset-l8{margin-left:66.66667%}.row .col.pull-l8{right:66.66667%}.row .col.push-l8{left:66.66667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.33333%}.row .col.pull-l10{right:83.33333%}.row .col.push-l10{left:83.33333%}.row .col.offset-l11{margin-left:91.66667%}.row .col.pull-l11{right:91.66667%}.row .col.push-l11{left:91.66667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.33333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.66667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.33333%}.row .col.pull-xl1{right:8.33333%}.row .col.push-xl1{left:8.33333%}.row .col.offset-xl2{margin-left:16.66667%}.row .col.pull-xl2{right:16.66667%}.row .col.push-xl2{left:16.66667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.33333%}.row .col.pull-xl4{right:33.33333%}.row .col.push-xl4{left:33.33333%}.row .col.offset-xl5{margin-left:41.66667%}.row .col.pull-xl5{right:41.66667%}.row .col.push-xl5{left:41.66667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.33333%}.row .col.pull-xl7{right:58.33333%}.row .col.push-xl7{left:58.33333%}.row .col.offset-xl8{margin-left:66.66667%}.row .col.pull-xl8{right:66.66667%}.row .col.push-xl8{left:66.66667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.33333%}.row .col.pull-xl10{right:83.33333%}.row .col.push-xl10{left:83.33333%}.row .col.offset-xl11{margin-left:91.66667%}.row .col.pull-xl11{right:91.66667%}.row .col.push-xl11{left:91.66667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\\\"Helvetica Neue\\\",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.37333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.94667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.09333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.76667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}to{transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{transform:rotate(130deg)}50%{transform:rotate(-5deg)}to{transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{transform:rotate(-130deg)}50%{transform:rotate(5deg)}to{transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}\\n\", \"\"]);\n"
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"index": 5,
"index2": 5,
"size": 399,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "overlayscrollbars/css/OverlayScrollbars.min.css",
"loc": "7:0-58"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../css-loader/dist/cjs.js!./OverlayScrollbars.min.css\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 22,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"index": 6,
"index2": 4,
"size": 19610,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerId": 21,
"issuerName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 21,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"name": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 185,
"building": 23
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 21,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"module": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"moduleName": "./node_modules/overlayscrollbars/css/OverlayScrollbars.min.css",
"type": "cjs require",
"userRequest": "!!../../css-loader/dist/cjs.js!./OverlayScrollbars.min.css",
"loc": "1:14-83"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"/*!\\n * OverlayScrollbars\\n * https://github.com/KingSora/OverlayScrollbars\\n *\\n * Version: 1.10.0\\n *\\n * Copyright KingSora | Rene Haas.\\n * https://github.com/KingSora\\n *\\n * Released under the MIT license.\\n * Date: 11.10.2019\\n */\\nhtml.os-html,html.os-html>.os-host{display:block;overflow:hidden;box-sizing:border-box;height:100%!important;width:100%!important;min-width:100%!important;min-height:100%!important;margin:0!important;position:absolute!important}html.os-html>.os-host>.os-padding{position:absolute}body.os-dragging,body.os-dragging *{cursor:default}.os-host,.os-host-textarea{position:relative;overflow:visible!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;-ms-grid-row-align:flex-start;align-items:flex-start}.os-host-flexbox{overflow:hidden!important;display:-webkit-box;display:-ms-flexbox;display:flex}.os-host-flexbox>.os-size-auto-observer{height:inherit!important}.os-host-flexbox>.os-content-glue{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0}.os-host-flexbox>.os-size-auto-observer,.os-host-flexbox>.os-content-glue{min-height:0;min-width:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}#os-dummy-scrollbar-size{position:fixed;opacity:0;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';visibility:hidden;overflow:scroll;height:500px;width:500px}#os-dummy-scrollbar-size>div{width:200%;height:200%;margin:10px 0}#os-dummy-scrollbar-size,.os-viewport{-ms-overflow-style:scrollbar!important}.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size,.os-viewport-native-scrollbars-invisible.os-viewport{scrollbar-width:none!important}.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar,.os-viewport-native-scrollbars-invisible#os-dummy-scrollbar-size::-webkit-scrollbar-corner,.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner{display:none!important;width:0!important;height:0!important;visibility:hidden!important;background:0 0!important}.os-content-glue{box-sizing:inherit;max-height:100%;max-width:100%;width:100%;pointer-events:none}.os-padding{box-sizing:inherit;direction:inherit;position:absolute;overflow:visible;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:1}.os-host-overflow>.os-padding{overflow:hidden}.os-viewport{direction:inherit!important;box-sizing:inherit!important;resize:none!important;outline:0!important;position:absolute;overflow:hidden;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.os-content-arrange{position:absolute;z-index:-1;min-height:1px;min-width:1px;pointer-events:none}.os-content{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:100%;height:100%;width:100%;visibility:visible}.os-content:before,.os-content:after{content:'';display:table;width:0;height:0;line-height:0;font-size:0}.os-content>.os-textarea{box-sizing:border-box!important;direction:inherit!important;background:0 0!important;outline:0 transparent!important;overflow:hidden!important;position:absolute!important;display:block!important;top:0!important;left:0!important;margin:0!important;border-radius:0!important;float:none!important;-webkit-filter:none!important;filter:none!important;border:0!important;resize:none!important;-webkit-transform:none!important;transform:none!important;max-width:none!important;max-height:none!important;box-shadow:none!important;-webkit-perspective:none!important;perspective:none!important;opacity:1!important;z-index:1!important;clip:auto!important;vertical-align:baseline!important;padding:0}.os-host-rtl>.os-padding>.os-viewport>.os-content>.os-textarea{right:0!important}.os-content>.os-textarea-cover{z-index:-1;pointer-events:none}.os-content>.os-textarea[wrap=off]{white-space:pre!important;margin:0!important}.os-text-inherit{font-family:inherit;font-size:inherit;font-weight:inherit;font-style:inherit;font-variant:inherit;text-transform:inherit;text-decoration:inherit;text-indent:inherit;text-align:inherit;text-shadow:inherit;text-overflow:inherit;letter-spacing:inherit;word-spacing:inherit;line-height:inherit;unicode-bidi:inherit;direction:inherit;color:inherit;cursor:text}.os-resize-observer,.os-resize-observer-host{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.os-resize-observer-host{padding:inherit;border:inherit;border-color:transparent;border-style:solid;box-sizing:border-box}.os-resize-observer-host:after{content:''}.os-resize-observer-host>.os-resize-observer,.os-resize-observer-host:after{height:200%;width:200%;padding:inherit;border:inherit;margin:0;display:block;box-sizing:content-box}.os-resize-observer.observed,object.os-resize-observer{box-sizing:border-box!important}.os-size-auto-observer{box-sizing:inherit!important;height:100%;width:inherit;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;-webkit-box-flex:inherit;-ms-flex-positive:inherit;flex-grow:inherit;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:0;flex-basis:0}.os-size-auto-observer>.os-resize-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-resize-observer-item{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;opacity:0;direction:ltr!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer-item-final{position:absolute;left:0;top:0;-webkit-transition:none!important;transition:none!important;-webkit-box-flex:0!important;-ms-flex:none!important;flex:none!important}.os-resize-observer{-webkit-animation-duration:.001s;animation-duration:.001s;-webkit-animation-name:hs-resize-observer-dummy-animation;animation-name:hs-resize-observer-dummy-animation}.os-host-transition>.os-scrollbar,.os-host-transition>.os-scrollbar-corner{-webkit-transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s;transition:opacity .3s,visibility .3s,top .3s,right .3s,bottom .3s,left .3s}html.os-html>.os-host>.os-scrollbar{position:absolute;z-index:999999}.os-scrollbar,.os-scrollbar-corner{position:absolute;opacity:1;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';z-index:1}.os-scrollbar-corner{bottom:0;right:0}.os-scrollbar{pointer-events:none}.os-scrollbar-track{pointer-events:auto;position:relative;height:100%;width:100%;padding:0!important;border:0!important}.os-scrollbar-handle{pointer-events:auto;position:absolute;width:100%;height:100%}.os-scrollbar-handle-off,.os-scrollbar-track-off{pointer-events:none}.os-scrollbar.os-scrollbar-unusable,.os-scrollbar.os-scrollbar-unusable *{pointer-events:none!important}.os-scrollbar.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-host-rtl>.os-scrollbar-horizontal{right:0}.os-host-rtl>.os-scrollbar-vertical{right:auto;left:0}.os-host-rtl>.os-scrollbar-corner{right:auto;left:0}.os-scrollbar-auto-hidden,.os-padding+.os-scrollbar-corner,.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-corner,.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal,.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-corner,.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical+.os-scrollbar-corner,.os-scrollbar-horizontal+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner,.os-scrollbar-horizontal.os-scrollbar-auto-hidden+.os-scrollbar-vertical.os-scrollbar-auto-hidden+.os-scrollbar-corner{opacity:0;visibility:hidden;pointer-events:none}.os-scrollbar-corner-resize-both{cursor:nwse-resize}.os-host-rtl>.os-scrollbar-corner-resize-both{cursor:nesw-resize}.os-scrollbar-corner-resize-horizontal{cursor:ew-resize}.os-scrollbar-corner-resize-vertical{cursor:ns-resize}.os-dragging .os-scrollbar-corner.os-scrollbar-corner-resize{cursor:default}.os-host-resize-disabled.os-host-scrollbar-horizontal-hidden>.os-scrollbar-vertical{top:0;bottom:0}.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal,.os-host-rtl.os-host-resize-disabled.os-host-scrollbar-vertical-hidden>.os-scrollbar-horizontal{right:0;left:0}.os-scrollbar:hover,.os-scrollbar-corner.os-scrollbar-corner-resize{opacity:1!important;visibility:visible!important}.os-scrollbar-corner.os-scrollbar-corner-resize{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB3aWR0aD0iMTAiICAgaGVpZ2h0PSIxMCIgICB2ZXJzaW9uPSIxLjEiPiAgPGcgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwNDIuMzYyMikiICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjQ5NDExNzY1O2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDcuNDI0MjE4NywxMDQyLjM2MjIgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjYgLTEuMzEwMTU2MiwxLjMxMDIgMCwwLjI5OSAwLjEwNDM0MTksMC41NzEgMC4yNzI5NDkyLDAuNzkxNSAwLjIwOTEwMjQsMC4xNDEzIDAuNDY1NjIwNiwwLjIxODQgMC43MzY5NjI5LDAuMjE4NCAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NiAxLjMxMDE1NjMsLTEuMzEwMiAwLC0wLjI3MTMgLTAuMDc3MDkzLC0wLjUyNzggLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0MSwtMC4xNjg2IC0wLjQ5MjU0NDMsLTAuMjcyOSAtMC43OTE1NTI4LC0wLjI3MjkgeiBtIDAsMy4wODQzIGMgLTAuNzIzNTc5MiwwIC0xLjMxMDE1NjIsMC41ODY2IC0xLjMxMDE1NjIsMS4zMTAyIDAsMC4yOTkgMC4xMDQzNDE5LDAuNTcxIDAuMjcyOTQ5MiwwLjc5MTUgMC4yMDkxMDI0LDAuMTQxMyAwLjQ2NTYyMDYsMC4yMTg0IDAuNzM2OTYyOSwwLjIxODQgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjYgMS4zMTAxNTYzLC0xLjMxMDIgMCwtMC4yNzEzIC0wLjA3NzA5MywtMC41Mjc4IC0wLjIxODM1OTQsLTAuNzM2OSAtMC4yMjA0OTQxLC0wLjE2ODYgLTAuNDkyNTQ0MywtMC4yNzMgLTAuNzkxNTUyOCwtMC4yNzMgeiBtIC0zLjA4NDMyNjEsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NiAtMS4zMTAxNTYzLDEuMzEwMiAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MSAwLjI3Mjk0OTIsMC43OTE1IDAuMjA5MTAyNCwwLjE0MTMgMC40NjU2MjA3LDAuMjE4NCAwLjczNjk2MjksMC4yMTg0IDAuNzIzNTc5MywwIDEuMzEwMTU2MywtMC41ODY2IDEuMzEwMTU2MywtMS4zMTAyIDAsLTAuMjcxMyAtMC4wNzcwOTMsLTAuNTI3OCAtMC4yMTgzNTk0LC0wLjczNjkgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzMgLTAuNzkxNTUyNywtMC4yNzMgeiBtIC0zLjAyOTczNjQsMy4wMjk4IEMgMC41ODY1NzY5MywxMDQ4LjQ3NjMgMCwxMDQ5LjA2MjggMCwxMDQ5Ljc4NjQgYyAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyMiwwLjc5MTYgMC4yMDkxMDIyOSwwLjE0MTIgMC40NjU2MjA2NSwwLjIxODMgMC43MzY5NjI4OCwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHogbSAzLjAyOTczNjQsMCBjIC0wLjcyMzU3OTMsMCAtMS4zMTAxNTYzLDAuNTg2NSAtMS4zMTAxNTYzLDEuMzEwMSAwLDAuMjk5IDAuMTA0MzQxOSwwLjU3MTEgMC4yNzI5NDkyLDAuNzkxNiAwLjIwOTEwMjQsMC4xNDEyIDAuNDY1NjIwNywwLjIxODMgMC43MzY5NjI5LDAuMjE4MyAwLjcyMzU3OTMsMCAxLjMxMDE1NjMsLTAuNTg2NSAxLjMxMDE1NjMsLTEuMzEwMSAwLC0wLjI3MTQgLTAuMDc3MDkzLC0wLjUyNzkgLTAuMjE4MzU5NCwtMC43MzcgLTAuMjIwNDk0LC0wLjE2ODYgLTAuNDkyNTQ0MiwtMC4yNzI5IC0wLjc5MTU1MjcsLTAuMjcyOSB6IG0gMy4wODQzMjYxLDAgYyAtMC43MjM1NzkyLDAgLTEuMzEwMTU2MiwwLjU4NjUgLTEuMzEwMTU2MiwxLjMxMDEgMCwwLjI5OSAwLjEwNDM0MTksMC41NzExIDAuMjcyOTQ5MiwwLjc5MTYgMC4yMDkxMDI0LDAuMTQxMiAwLjQ2NTYyMDYsMC4yMTgzIDAuNzM2OTYyOSwwLjIxODMgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjUgMS4zMTAxNTYzLC0xLjMxMDEgMCwtMC4yNzE0IC0wLjA3NzA5MywtMC41Mjc5IC0wLjIxODM1OTQsLTAuNzM3IC0wLjIyMDQ5NDEsLTAuMTY4NiAtMC40OTI1NDQzLC0wLjI3MjkgLTAuNzkxNTUyOCwtMC4yNzI5IHoiLz4gIDwvZz4gIDxnICAgICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIiAgICAgICBkPSJtIDguMjE1NzcxNSwwLjI3Mjk0OTIyIGMgMC4xNDEyNjY3LDAuMjA5MTAyMjkgMC4yMTgzNTk0LDAuNDY1NjIwNjUgMC4yMTgzNTk0LDAuNzM2OTYyODggMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDc2IC0wLjIwNTUxNzYsLTAuNzk3Nzk2NTkgLTAuNTE4NjAzNSwtMS4wMzcyMDY5OCB6IG0gMCwzLjA4NDMyNjE4IGMgMC4xNDEyNjY3LDAuMjA5MTAyMyAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MiAtMS4zMTAxNTYzLDEuMzEwMTU2MiAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTkzIDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAtMy4wODQzMjYyLDAgYyAwLjE0MTI2NjcsMC4yMDkxMDIzIDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYyIC0xLjMxMDE1NjMsMS4zMTAxNTYyIC0wLjI3MTM0MjIsMCAtMC41Mjc4NjA1LC0wLjA3NzA5MyAtMC43MzY5NjI5LC0wLjIxODM1OTMgMC4yMzk0MTA0LDAuMzEzMDg1OSAwLjYxMjYzNjMsMC41MTg2MDM1IDEuMDM3MjA3MSwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYyLC0wLjU4NjU3NyAxLjMxMDE1NjIsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NSwtMC43OTc3OTY3IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogTSAyLjEwMTcwOSw2LjM4NzAxMTcgYyAwLjE0MTI2NjcsMC4yMDkxMDI0IDAuMjE4MzU5NCwwLjQ2NTYyMDYgMC4yMTgzNTk0LDAuNzM2OTYyOSAwLDAuNzIzNTc5MyAtMC41ODY1NzcsMS4zMTAxNTYzIC0xLjMxMDE1NjMsMS4zMTAxNTYzIC0wLjI3MTM0MjIzLDAgLTAuNTI3ODYwNTksLTAuMDc3MDkzIC0wLjczNjk2Mjg4LC0wLjIxODM1OTQgMC4yMzk0MTAzOSwwLjMxMzA4NTkgMC42MTI2MzYyMiwwLjUxODYwMzUgMS4wMzcyMDY5OCwwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHogbSAzLjAyOTczNjMsMCBjIDAuMTQxMjY2NywwLjIwOTEwMjQgMC4yMTgzNTk0LDAuNDY1NjIwNiAwLjIxODM1OTQsMC43MzY5NjI5IDAsMC43MjM1NzkzIC0wLjU4NjU3NywxLjMxMDE1NjMgLTEuMzEwMTU2MywxLjMxMDE1NjMgLTAuMjcxMzQyMiwwIC0wLjUyNzg2MDUsLTAuMDc3MDkzIC0wLjczNjk2MjksLTAuMjE4MzU5NCAwLjIzOTQxMDQsMC4zMTMwODU5IDAuNjEyNjM2MywwLjUxODYwMzUgMS4wMzcyMDcxLDAuNTE4NjAzNSAwLjcyMzU3OTMsMCAxLjMxMDE1NjIsLTAuNTg2NTc3IDEuMzEwMTU2MiwtMS4zMTAxNTYzIDAsLTAuNDI0NTcwOCAtMC4yMDU1MTc1LC0wLjc5Nzc5NjYgLTAuNTE4NjAzNSwtMS4wMzcyMDcgeiBtIDMuMDg0MzI2MiwwIGMgMC4xNDEyNjY3LDAuMjA5MTAyNCAwLjIxODM1OTQsMC40NjU2MjA2IDAuMjE4MzU5NCwwLjczNjk2MjkgMCwwLjcyMzU3OTMgLTAuNTg2NTc3LDEuMzEwMTU2MyAtMS4zMTAxNTYzLDEuMzEwMTU2MyAtMC4yNzEzNDIzLDAgLTAuNTI3ODYwNSwtMC4wNzcwOTMgLTAuNzM2OTYyOSwtMC4yMTgzNTk0IDAuMjM5NDEwNCwwLjMxMzA4NTkgMC42MTI2MzYyLDAuNTE4NjAzNSAxLjAzNzIwNywwLjUxODYwMzUgMC43MjM1NzkzLDAgMS4zMTAxNTYzLC0wLjU4NjU3NyAxLjMxMDE1NjMsLTEuMzEwMTU2MyAwLC0wLjQyNDU3MDggLTAuMjA1NTE3NiwtMC43OTc3OTY2IC0wLjUxODYwMzUsLTEuMDM3MjA3IHoiIC8+ICA8L2c+PC9zdmc+);background-repeat:no-repeat;background-position:100% 100%;pointer-events:auto!important}.os-host-rtl>.os-scrollbar-corner.os-scrollbar-corner-resize{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.os-host-overflow{overflow:hidden!important}@-webkit-keyframes hs-resize-observer-dummy-animation{0%{z-index:0}to{z-index:-1}}@keyframes hs-resize-observer-dummy-animation{0%{z-index:0}to{z-index:-1}}.os-theme-none>.os-scrollbar-horizontal,.os-theme-none>.os-scrollbar-vertical,.os-theme-none>.os-scrollbar-corner{display:none!important}.os-theme-none>.os-scrollbar-corner-resize{display:block!important;min-width:10px;min-height:10px}.os-theme-dark>.os-scrollbar-horizontal,.os-theme-light>.os-scrollbar-horizontal{right:10px;height:10px}.os-theme-dark>.os-scrollbar-vertical,.os-theme-light>.os-scrollbar-vertical{bottom:10px;width:10px}.os-theme-dark.os-host-rtl>.os-scrollbar-horizontal,.os-theme-light.os-host-rtl>.os-scrollbar-horizontal{left:10px;right:0}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{height:10px;width:10px}.os-theme-dark>.os-scrollbar-corner,.os-theme-light>.os-scrollbar-corner{background-color:transparent}.os-theme-dark>.os-scrollbar,.os-theme-light>.os-scrollbar{padding:2px;box-sizing:border-box;background:0 0}.os-theme-dark>.os-scrollbar.os-scrollbar-unusable,.os-theme-light>.os-scrollbar.os-scrollbar-unusable{background:0 0}.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{background:0 0}.os-theme-dark>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-horizontal>.os-scrollbar-track>.os-scrollbar-handle{min-width:30px}.os-theme-dark>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar-vertical>.os-scrollbar-track>.os-scrollbar-handle{min-height:30px}.os-theme-dark.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light.os-host-transition>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{-webkit-transition:background-color .3s;transition:background-color .3s}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle,.os-theme-dark>.os-scrollbar>.os-scrollbar-track,.os-theme-light>.os-scrollbar>.os-scrollbar-track{border-radius:10px}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.4)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.4)}.os-theme-dark>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-theme-light>.os-scrollbar:hover>.os-scrollbar-track>.os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-theme-dark>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(0,0,0,.7)}.os-theme-light>.os-scrollbar>.os-scrollbar-track>.os-scrollbar-handle.active{background:rgba(255,255,255,.7)}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-theme-dark.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-dark.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-horizontal-hidden>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light.os-host-scrollbar-vertical-hidden>.os-scrollbar-vertical .os-scrollbar-handle:before{display:none}.os-theme-dark>.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-host-rtl.os-theme-dark>.os-scrollbar-vertical .os-scrollbar-handle:before,.os-host-rtl.os-theme-light>.os-scrollbar-vertical .os-scrollbar-handle:before{right:-6px;left:-2px}\", \"\"]);\n"
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"index": 7,
"index2": 10,
"size": 510,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./scss/style.scss",
"loc": "8:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./style.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"index": 8,
"index2": 9,
"size": 23812,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 23,
"issuerName": "./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 23,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./src/scss/style.scss",
"moduleName": "./src/scss/style.scss",
"type": "cjs require",
"userRequest": "!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./style.scss",
"loc": "1:14-181"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Imports\nvar getUrl = require(\"../../node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL___0___ = getUrl(require(\"../assets/img/msg-tail-left.svg\"));\nvar ___CSS_LOADER_URL___1___ = getUrl(require(\"../assets/img/msg-tail-right.svg\"));\n// Module\nexports.push([module.id, \".chats-container{background-color:#fff;border-right:1px solid #DADCE0}.chats-container .toolbar{display:flex;align-items:center;justify-content:space-between;padding:.5rem 1.25rem}.chats-container .toolbar .open-menu{cursor:pointer;background:none;border:none}.chats-container .input-search{position:relative;width:100%;margin-left:1rem}.chats-container .input-search input{background-color:rgba(112,117,121,0.08);border:2px solid transparent;height:3rem;border-radius:22px;box-sizing:border-box;padding:0 1.5rem 0 3rem;-webkit-transition:all .15s ease-out;transition:all .15s ease-out;width:100%}.chats-container .input-search input:focus{background-color:rgba(112,117,121,0);border:2px solid #4EA4F6}.chats-container .input-search input:focus+.tgico{color:#4EA4F6;opacity:1}.chats-container .input-search .tgico{position:absolute;left:1rem;top:50%;transform:translateY(-50%);text-align:center;font-size:1.65rem;color:#707579;opacity:.6;-webkit-transition:all .15s ease-out;transition:all .15s ease-out}.chats-container ul{margin:0;padding:0 .5rem}.chats-container #dialogs-pinned{border-bottom:1px solid #DADCE0}.chats-container #dialogs-pinned:empty{display:none}.chats-container li{padding:0 .5rem;height:70px;max-height:70px;overflow:hidden;border-radius:8px;background-color:#fff;display:grid;align-items:center;grid-template-columns:60px calc(100% - 60px);position:relative;cursor:pointer}.chats-container li:hover{background:rgba(112,117,121,0.08)}.chats-container li.active{background:rgba(110,115,119,0.1)}.chats-container p{margin:0;display:flex;justify-content:space-between;height:1.7rem}.chats-container p span:not(.tgico-pinnedchat):last-child{font-size:.9rem}.chats-container span{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;margin:.1rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chats-container .user-caption{max-width:100%;max-height:100%;overflow:hidden;color:#9e9e9e}.chats-container .user-title{max-width:80%}.chats-container .user-last-message{display:block;max-width:80%}.chats-container .user-last-message i{font-style:normal;color:#1da1f1}.chats-container .message-status{margin-right:.25rem}.chats-container .message-status[class*=\\\" tgico-\\\"]{color:#4DCD5E;font-size:1.15rem}.chats-container .unread,.chats-container .unread-muted{border-radius:12px;min-width:24px;padding:0 8px;height:24px;text-align:center;line-height:24px;color:#fff;font-weight:500}.chats-container .tgico-pinnedchat{border-radius:50%;width:24px;height:24px;line-height:24px;font-size:1.5rem;color:#fff;text-align:center}.chats-container .unread:empty,.chats-container .unread-muted:empty{visibility:hidden}.chats-container .unread{background:#4DCD5E}.chats-container .unread-muted,.chats-container .tgico-pinnedchat{background:#cecece}.chat-container{display:flex;width:100%;align-items:center;height:100vh;overflow:hidden;flex-direction:column}.chat-container #topbar{width:100%;background-color:#fff;box-sizing:border-box;user-select:none;display:flex;align-items:center;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07);padding:.5rem 1rem;flex:0 0 auto}.chat-container #topbar>*{margin:0 2px}.chat-container #topbar .chat-info{flex-grow:1}.chat-container #topbar .content{padding-left:1rem}.chat-container #topbar .person{display:flex;align-items:center}.chat-container #topbar .person:hover{background-color:transparent}.chat-container #topbar .person .user-avatar{width:44px;height:44px;line-height:44px}.chat-container #topbar .person .bottom{font-size:14px;line-height:18px}.chat-container #topbar .person .bottom .online{color:#1da1f1}.chat-container #bubbles{width:100%;height:100%;max-height:100%;flex:1 1 auto}.chat-container #bubbles .preloader{width:100%;height:100%}.chat-container #bubbles .preloader svg{width:50px;height:50px}.chat-container #bubbles #bubbles-inner{max-width:700px;width:100%;display:flex;flex-direction:column;flex-shrink:1;padding:9px;margin:0 auto;box-sizing:border-box}.chat-container #bubbles #bubbles-inner>*{display:flex;padding:5px 0}.chat-container #bubbles .service{justify-content:center}.chat-container #bubbles .service .service-msg{color:#fff;background-color:rgba(0,0,0,0.22);font-weight:500;padding:0 8px;line-height:24px;font-size:15px;border-radius:12px;user-select:none}.chat-container #bubbles .bubble{max-width:85%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,0.15);position:relative;display:flex;flex-direction:column-reverse;font-size:0}.chat-container #bubbles .bubble.sticker{background:none !important;box-shadow:none;max-width:300px}.chat-container #bubbles .bubble.sticker .message.message-empty{display:none}.chat-container #bubbles .bubble.sticker:hover .message.message-empty{display:block}.chat-container #bubbles .bubble .message:not(.message-empty)+.attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.chat-container #bubbles .bubble .attachment{max-width:380px;border-radius:inherit;overflow:hidden;text-align:center;font-size:0}.chat-container #bubbles .bubble .attachment img{width:100%;max-width:100%;height:auto}.chat-container #bubbles .bubble .box{font-size:.95rem;margin:.25rem;padding:.25rem;margin-bottom:-5px;border-radius:4px;transition:anim(background-color)}.chat-container #bubbles .bubble .box.web{margin-top:-5px;margin-bottom:5px;max-width:320px}.chat-container #bubbles .bubble .box.web .preview{height:100px;border-radius:4px;margin-bottom:6px;overflow:hidden;user-select:none}.chat-container #bubbles .bubble .box.web .preview img{max-width:100%;height:100%}.chat-container #bubbles .bubble .box.web .title{line-height:1.4;font-weight:500}.chat-container #bubbles .bubble .box.web .name{display:block}.chat-container #bubbles .bubble .box.web .name:hover{text-decoration:underline}.chat-container #bubbles .bubble .box.web .text{line-height:1.2}.chat-container #bubbles .bubble .box .quote{padding-left:.5rem}.chat-container #bubbles .bubble .box .name{font-weight:500}.chat-container #bubbles .bubble .box:not(.web){margin-bottom:0;margin-top:0;cursor:pointer}.chat-container #bubbles .bubble .message{font-size:1rem;padding:.25rem .6rem;overflow:hidden;text-overflow:ellipsis}.chat-container #bubbles .bubble .message.message-empty{position:absolute;bottom:.1rem;right:.1rem;border-radius:12px;background-color:rgba(0,0,0,0.3);padding:.0rem .3rem}.chat-container #bubbles .bubble .message.message-empty .time{color:#fff}.chat-container #bubbles .bubble .time{font-size:.8rem;user-select:none;float:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:20px;line-height:20px}.chat-container #bubbles .bubble .time .inner{position:absolute;bottom:0;right:0;display:flex;align-items:center;font-size:.75rem}.chat-container #bubbles .bubble .user-avatar{position:absolute;left:-2.5rem;width:32px;height:32px;line-height:32px;bottom:0;font-size:.85rem}.chat-container #bubbles .bubble.forwarded .message{padding-top:0}.chat-container #bubbles .bubble .message:not(:empty)+.name{margin-bottom:-.25rem}.chat-container #bubbles .bubble.forwarded .name{cursor:pointer}.chat-container #bubbles .bubble.forwarded .attachment{border-top-left-radius:0;border-top-right-radius:0}.chat-container #bubbles .bubble>.name{padding:.25rem .6rem 0 .6rem;font-weight:500;color:#1da1f1;font-size:.9rem}.chat-container #bubbles .bubble:last-child:after{position:absolute;bottom:-4px;width:11px;height:20px;background-repeat:no-repeat;content:'';background-position:-2px -2px}.chat-container #bubbles .bubble+.bubble{margin-top:5px}.chat-container #bubbles .in,.chat-container #bubbles .out{flex-direction:column}.chat-container #bubbles .in{align-items:flex-start}.chat-container #bubbles .in a{color:#1da1f1}.chat-container #bubbles .in .box:hover{background-color:rgba(112,117,121,0.08)}.chat-container #bubbles .in .quote{border-left:2px #1da1f1 solid}.chat-container #bubbles .in .quote .name{color:#1da1f1}.chat-container #bubbles .in .time{color:rgba(112,117,121,0.6);width:2rem}.chat-container #bubbles .in .time .inner{padding:0 .4rem}.chat-container #bubbles .in .bubble{background-color:#ffffff;border-radius:6px 12px 12px 6px}.chat-container #bubbles .in .bubble:first-child{border-radius:12px 12px 12px 6px}.chat-container #bubbles .in .bubble:last-child{border-radius:6px 12px 12px 0px}.chat-container #bubbles .in .bubble:last-child:after{left:-6px;background-image:url(\" + ___CSS_LOADER_URL___0___ + \")}.chat-container #bubbles .in .bubble:first-child:last-child{border-radius:12px 12px 12px 0px}.chat-container #bubbles .out{align-items:flex-end}.chat-container #bubbles .out a{color:#50af4f}.chat-container #bubbles .out .box:hover{background-color:rgba(77,205,94,0.12)}.chat-container #bubbles .out .quote{border-left:2px #50af4f solid}.chat-container #bubbles .out .quote .name{color:#50af4f}.chat-container #bubbles .out .time{color:#50af4f;width:48px;display:inline-block}.chat-container #bubbles .out .time .inner{padding:0 .25rem}.chat-container #bubbles .out .bubble .time .tgico:after{font-size:1.1rem;vertical-align:middle;margin-left:.1rem}.chat-container #bubbles .out .bubble.forwarded .name{color:#50af4f}.chat-container #bubbles .out .bubble.read .time .tgico:after{content:\\\"\\\"}.chat-container #bubbles .out .bubble.sent .time .tgico:after{content:\\\"\\\"}.chat-container #bubbles .out .bubble{background-color:#eeffde;border-radius:12px 6px 6px 12px}.chat-container #bubbles .out .bubble:first-child{border-radius:12px 12px 6px 12px}.chat-container #bubbles .out .bubble:last-child{border-radius:12px 6px 0px 12px}.chat-container #bubbles .out .bubble:last-child:after{right:-11px;background-image:url(\" + ___CSS_LOADER_URL___1___ + \")}.chat-container #bubbles .out .bubble:first-child:last-child{border-radius:12px 12px 0px 12px}.chat-container #bubbles .out .user-avatar{left:auto;right:-2.5rem}.chat-container #chat-input{display:flex;align-items:center;width:100%;max-width:700px;padding-bottom:1rem;justify-content:space-between;flex:0 0 auto}.chat-container #chat-input .input-message{display:flex;align-items:center;width:calc(100% - 3.75rem);justify-content:space-between;background-color:#fff;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07);margin-right:.5rem;padding:0 .5rem;min-height:3.25rem;max-height:30rem;caret-color:#4EA4F6}.chat-container #chat-input .input-message .input-message-container{width:100%;max-height:inherit}.chat-container #chat-input .input-message .btn-icon{color:#9e9e9e;font-size:1.5rem}.chat-container #chat-input #input-message{background:none;border:none;width:100%;padding:.5rem .5rem;font-size:.95rem;max-height:inherit;overflow-y:auto;resize:none;border:none;outline:none;cursor:text}.chat-container #chat-input [contenteditable=true]:empty:before{content:attr(data-placeholder);color:#9e9e9e;display:block}.chat-container #chat-input .btn-circle{font-size:1.2rem;height:3.25rem;width:3.25rem}.chat-container #chat-input .os-scrollbar-handle{background:rgba(0,0,0,0.2)}.chat-container #chat-closed{position:absolute;left:0;top:0;width:100%;height:100%;background-color:inherit;z-index:3;display:flex;align-items:center;justify-content:center;flex-direction:column}.chat-container #chat-closed .tgico-chatsplaceholder{font-size:10rem;color:#ABB0B3}.chat-container #chat-closed h3{font-size:2rem;color:#707579;text-align:center}.chat-container #chat-closed .buttons{display:flex;justify-content:center;align-items:center;margin-top:1rem}.chat-container #chat-closed .buttons button{margin:0 2.5rem;width:4rem;height:4rem;background:#fff;border:none;position:relative;font-size:2rem;color:#707579;cursor:pointer;box-shadow:0 1px 2px 0 rgba(16,35,47,0.07)}.chat-container #chat-closed .buttons button:hover{background:#4EA4F6;color:#fff}.chat-container #chat-closed .buttons button:hover span{color:#4EA4F6}.chat-container #chat-closed .buttons button span{position:absolute;top:100%;left:50%;width:100%;padding-top:1rem;transform:translateX(-50%);font-size:.9rem;font-family:\\\"Roboto\\\"}button,input,optgroup,select,textarea,html{font-family:\\\"Roboto\\\", -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \\\"Helvetica Neue\\\", sans-serif}.whole{height:100vh;min-height:100vh;width:100%;min-width:100%}h1,h2,h3,h4,h5,h6{letter-spacing:-.66px;font-weight:500}input{caret-color:#4EA4F6}.subtitle{font-size:1rem;color:#9e9e9e;line-height:1.25}.page-sign .input-wrapper,.page-authCode .input-wrapper,.page-signUp .input-wrapper,.page-password .input-wrapper{margin-top:3rem}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center;margin:1.52rem 0 0.912rem 0}.page-authCode .phone-wrapper h4{margin:0}.page-authCode .phone-wrapper h4[contenteditable=\\\"true\\\"]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #4EA4F6}.page-authCode .phone-wrapper .phone.error{border-color:#E53935 !important}.btn-icon{text-align:center;font-size:1.65rem;border-radius:50%;-webkit-transition:background-color .15s ease-out;transition:background-color .15s ease-out;color:#707579;cursor:pointer;background:none;border:none;padding:.5rem;position:relative}.user-avatar{color:#fff;width:52px;height:52px;line-height:52px;border-radius:50%;background-color:#4EA4F6;text-align:center;font-size:1.25em;position:relative;user-select:none}.user-avatar img{width:100%;height:100%;border-radius:inherit;user-select:none}.user-avatar[class*=\\\" tgico-\\\"]{line-height:52px;font-size:1.5rem}.user-avatar path{fill:white}.user-avatar.is-online:after{position:absolute;content:\\\" \\\";display:block;border-radius:50%;border:2px solid white;background-color:#4DCD5E;left:70%;top:79%;width:12px;height:12px}.user-title,b{color:#000;font-weight:500}.ripple{background-color:rgba(112,117,121,0.08);width:1rem;height:1rem;position:absolute;border-radius:50%;transform:translateX(-100%) translateY(-100%);mix-blend-mode:screen;animation:ripple 750ms ease-out forwards}@keyframes ripple{0%{transform:translate(-100%, -100%)}80%{transform:translate(-100%, -100%) scale(50)}100%{transform:translate(-100%, -100%) scale(50)}}.page-signUp .auth-image{border-radius:50%;cursor:pointer;position:relative;overflow:hidden}.page-signUp .auth-image canvas{max-width:100%;max-height:100%;width:100%;height:100%;background-color:#4EA4F6}.page-signUp .auth-image svg{position:absolute;width:36px;height:36px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2}.input-wrapper{width:350px;margin:0 auto}.input-field{position:relative}.input-field .arrow-down{position:absolute;content:\\\" \\\";top:50%;bottom:0;right:15px;cursor:pointer;height:0;width:0;border:solid #bdbdbd;border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:4px;vertical-align:middle;z-index:2;margin-top:-7px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;left:12.5px;right:auto;z-index:2;top:50%;transform:translateY(-50%);background-color:#fff;font-size:0.85rem;transition:.2s all;display:inline-block;cursor:text}.input-field input{border:1px solid #DADCE0;border-radius:8px;padding:0 12.5px;box-sizing:border-box;font-size:0.85rem;width:100%;height:45px;transition:.2s border-color;position:relative;z-index:1}.input-field input:focus{border-color:#4EA4F6;border-width:1.5px;padding:0 12px}.input-field input:disabled{background-color:#fff;color:#000}.input-field input.error{border-color:#E53935;transition:.2s border-width}.input-field input.error+label{color:#E53935 !important}.input-field input:focus ~ .arrow-down{margin-top:-2px;transform:rotate(225deg);-webkit-transform:rotate(225deg);border-color:#4EA4F6}.input-field input:focus+label{color:#4EA4F6}.input-field input:focus+label,.input-field input:valid+label,.input-field input:disabled+label{top:-8.5px;transform:none;padding:0 5px;left:7.5px}.checkbox-field{margin:1rem 0;display:block;text-align:left;padding:0 1rem;font-weight:500;position:relative}[type=\\\"checkbox\\\"]{position:absolute;opacity:0;pointer-events:none;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=\\\"checkbox\\\"]+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=\\\"checkbox\\\"]+span:before,[type=\\\"checkbox\\\"]+span:after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s}[type=\\\"checkbox\\\"]+span:before{border-radius:2px;z-index:1}[type=\\\"checkbox\\\"]+span:after{height:18px;width:18px;z-index:0;border:2px solid #4EA4F6;border-radius:3px;top:50%;transform:translateY(-50%)}[type=\\\"checkbox\\\"]:not(:checked)+span:before{width:0;height:0;border:2px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=\\\"checkbox\\\"]:checked+span:before{top:4px;left:-1px;width:8px;height:14px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(45deg);transform:rotateZ(45deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=\\\"checkbox\\\"]:not(:checked)+span:after{background-color:transparent}[type=\\\"checkbox\\\"]:checked+span:after{background-color:#4EA4F6}.input-wrapper>* ~ *{margin-top:1.2rem}.select-wrapper{max-height:300px;height:auto;position:absolute;width:100%;top:calc(100% + 10px);left:0;overflow-y:auto;background-color:#fff;z-index:3;border-radius:8px}.select-wrapper ul{margin:10px 0}.select-wrapper li{align-items:center;padding:0 12.5px;justify-content:space-between;height:50px;cursor:pointer;font-weight:500;text-align:left;display:grid;grid-template-columns:15% 65% 20%}.select-wrapper li:hover{background-color:rgba(112,117,121,0.08)}.select-wrapper .emoji-outer{height:24px;width:24px;font-size:24px;line-height:1}.phone-code{color:#9e9e9e;text-align:right}.os-scrollbar{width:4px}.os-scrollbar-handle{background:rgba(0,0,0,0.4);border-radius:8px}.os-scrollbar-vertical{margin-right:2px}::placeholder{color:#9e9e9e;opacity:1}:-ms-input-placeholder{color:#9e9e9e}::-ms-input-placeholder{color:#9e9e9e}input:focus,button:focus{outline:none}.auth-image{width:133px;height:133px;margin-left:auto;margin-right:auto;margin-bottom:1rem}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s;cursor:pointer;font-size:1.5rem}.phone-edit:hover{opacity:1}.btn-primary{background:#4EA4F6;color:#fff;border-radius:8px;width:100%;text-align:center;font-size:0.85rem;height:45px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative}.btn-primary:hover{background:#2790f4}.btn-primary svg,.btn-primary use{height:calc(100% - 20px);right:12.5px;left:auto;margin:auto 0}.preloader-circular{animation:rotate 2s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:1, 200;stroke-dashoffset:0;animation:dash 1.5s ease-in-out infinite;stroke-linecap:round;stroke:white;stroke-width:3}@keyframes rotate{100%{transform:rotate(360deg)}}@keyframes dash{0%{stroke-dasharray:1, 200;stroke-dashoffset:0}50%{stroke-dasharray:89, 200;stroke-dashoffset:-35px}100%{stroke-dasharray:89, 200;stroke-dashoffset:-124px}}span.emoji-sizer{line-height:0.81em;font-size:1em;margin:-2px 0}span.emoji-outer{display:-moz-inline-box;display:inline-block;*display:inline}span.emoji-inner{display:-moz-inline-box;display:inline-block;text-indent:-9999px;width:100%;height:100%;vertical-align:baseline;*vertical-align:auto;*zoom:1}.popup{position:fixed;left:0;top:0;height:100%;max-width:none;width:100%;z-index:3;background-color:rgba(0,0,0,0.35);margin:0;padding:0;box-shadow:none;opacity:0;visibility:hidden;-webkit-transition:opacity 0.3s 0s, visibility 0s 0.3s;-moz-transition:opacity 0.3s 0s, visibility 0s 0.3s;transition:opacity 0.3s 0s, visibility 0s 0.3s;overflow:auto;display:flex;align-items:center;justify-content:center}.popup.is-visible{opacity:1;visibility:visible;-webkit-transition:opacity 0.3s 0s, visibility 0s 0s;-moz-transition:opacity 0.3s 0s, visibility 0s 0s;transition:opacity 0.3s 0s, visibility 0s 0s}.popup-container{position:relative;border-radius:8px;background-color:#fff;padding:1rem;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px);backface-visibility:hidden;-webkit-backface-visibility:hidden;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;transition-duration:0.3s}.popup-close{height:18px;cursor:pointer;z-index:3;text-align:center;justify-self:center;line-height:1}.popup-close svg{max-width:100%;max-height:100%}.popup-close path{fill:#707579;transition:.2s all}.popup-close:hover path{fill:#000}.popup.is-visible .popup-container{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}.btn-circle{border-radius:50%;width:44px;height:44px}.btn-circle path{fill:white}.popup-header{display:flex;margin-bottom:2rem}.popup-avatar .popup-container{max-width:600px;max-height:600px}.popup-avatar .popup-container>button{position:absolute;bottom:15px;right:15px}.popup-avatar h6{font-size:1.1rem;text-align:left;margin:0;margin-left:1.5rem}.popup-avatar .crop{max-width:200%;max-height:200%;padding:0 2.75rem 2.75rem;border-radius:8px}.popup-avatar .crop img{border-radius:8px}.overlay::selection{background:transparent}.crop-component::selection{background:transparent}.crop-image,.overlay>img{width:auto;height:auto;display:block;object-fit:contain;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:white;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-component .crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,0.7);border-radius:8px}.overlay{position:absolute;left:50%;top:50%;z-index:999;margin-left:-100px;margin-top:-100px;width:200px;height:200px;overflow:hidden;box-sizing:content-box;border-radius:50%}.overlay:hover,.overlay:active{cursor:move}.overlay>img{position:absolute;display:block}.page-chats{display:grid;grid-template-columns:25% 75%;max-height:100vh;min-height:100vh}.page-chats>div{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats .chat-container{background-color:#e6ebee}.page-chats .preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translateY(-50%) translateX(-50%)}.page-chats .preloader .preloader-path{stroke:#4EA4F6}.page-password #password{padding-right:2.5rem}.page-password #password[type=\\\"password\\\"]{font-size:2.25rem;padding-left:10px}.page-password .toggle-visible{position:absolute;right:.25rem;z-index:2;top:50%;transform:translateY(-50%);font-size:1.25rem;color:#9e9e9e;cursor:pointer;transition:.2s;padding:.5rem}.page-password .toggle-visible:hover{color:#000}\\n\", \"\"]);\n"
},
{
"id": 25,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/img/msg-tail-left.svg",
"name": "./src/assets/img/msg-tail-left.svg",
"index": 10,
"index2": 7,
"size": 48,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 24,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
}
}
],
"profile": {
"factory": 1363,
"building": 6
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/img/msg-tail-left.svg"
],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../assets/img/msg-tail-left.svg",
"loc": "4:38-80"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/img/msg-tail-left.svg\";"
},
{
"id": 26,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/img/msg-tail-right.svg",
"name": "./src/assets/img/msg-tail-right.svg",
"index": 11,
"index2": 8,
"size": 49,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"issuerId": 24,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 23,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./src/scss/style.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 24,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"profile": {
"factory": 186,
"building": 1150,
"dependencies": 2
}
}
],
"profile": {
"factory": 1363,
"building": 6
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/img/msg-tail-right.svg"
],
"reasons": [
{
"moduleId": 24,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/style.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/style.scss",
"type": "cjs require",
"userRequest": "../assets/img/msg-tail-right.svg",
"loc": "5:38-81"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/img/msg-tail-right.svg\";"
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"index": 12,
"index2": 16,
"size": 510,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./scss/tgico.scss",
"loc": "9:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "var content = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./tgico.scss\");\n\nif (typeof content === 'string') {\n content = [[module.id, content, '']];\n}\n\nvar options = {}\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\")(content, options);\n\nif (content.locals) {\n module.exports = content.locals;\n}\n"
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"index": 13,
"index2": 15,
"size": 4682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 27,
"issuerName": "./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 27,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./src/scss/tgico.scss",
"moduleName": "./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/resolve-url-loader/index.js!../../node_modules/sass-loader/dist/cjs.js??ref--4-3!./tgico.scss",
"loc": "1:14-181"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "exports = module.exports = require(\"../../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Imports\nvar getUrl = require(\"../../node_modules/css-loader/dist/runtime/getUrl.js\");\nvar ___CSS_LOADER_URL___0___ = getUrl(require(\"../assets/fonts/tgico.eot\"));\nvar ___CSS_LOADER_URL___1___ = getUrl(require(\"../assets/fonts/tgico.ttf\"));\nvar ___CSS_LOADER_URL___2___ = getUrl(require(\"../assets/fonts/tgico.woff\"));\nvar ___CSS_LOADER_URL___3___ = getUrl(require(\"../assets/fonts/tgico.svg\"));\n// Module\nexports.push([module.id, \"@font-face{font-family:\\\"tgico\\\";src:url(\" + ___CSS_LOADER_URL___0___ + \");src:url(\" + ___CSS_LOADER_URL___0___ + \") format(\\\"embedded-opentype\\\"),url(\" + ___CSS_LOADER_URL___1___ + \") format(\\\"truetype\\\"),url(\" + ___CSS_LOADER_URL___2___ + \") format(\\\"woff\\\"),url(\" + ___CSS_LOADER_URL___3___ + \") format(\\\"svg\\\");font-weight:normal;font-style:normal;font-display:block}[class^=\\\"tgico-\\\"],.tgico:before,.tgico:after,[class*=\\\" tgico-\\\"]{font-family:\\\"tgico\\\" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check-sent:before{content:\\\"\\\"}.tgico-check-read:before{content:\\\"\\\"}.tgico-activesessions:before{content:\\\"\\\"}.tgico-add:before{content:\\\"\\\"}.tgico-addmember:before{content:\\\"\\\"}.tgico-adduser:before{content:\\\"\\\"}.tgico-admin:before{content:\\\"\\\"}.tgico-animals:before{content:\\\"\\\"}.tgico-archive:before{content:\\\"\\\"}.tgico-attach:before{content:\\\"\\\"}.tgico-avatar_archivedchats:before{content:\\\"\\\"}.tgico-avatar_deletedaccount:before{content:\\\"\\\"}.tgico-avatar_savedmessages:before{content:\\\"\\\"}.tgico-back:before{content:\\\"\\\"}.tgico-camera:before{content:\\\"\\\"}.tgico-cameraadd:before{content:\\\"\\\"}.tgico-car:before{content:\\\"\\\"}.tgico-channel:before{content:\\\"\\\"}.tgico-channelviews:before{content:\\\"\\\"}.tgico-chatsplaceholder:before{content:\\\"\\\"}.tgico-check:before{content:\\\"\\\"}.tgico-checkbox:before{content:\\\"\\\"}.tgico-checkboxblock:before{content:\\\"\\\"}.tgico-checkboxempty:before{content:\\\"\\\"}.tgico-checkboxon:before{content:\\\"\\\"}.tgico-close:before{content:\\\"\\\"}.tgico-copy:before{content:\\\"\\\"}.tgico-data:before{content:\\\"\\\"}.tgico-delete_filled:before{content:\\\"\\\"}.tgico-delete:before{content:\\\"\\\"}.tgico-deleteuser:before{content:\\\"\\\"}.tgico-document:before{content:\\\"\\\"}.tgico-down:before{content:\\\"\\\"}.tgico-download:before{content:\\\"\\\"}.tgico-eats:before{content:\\\"\\\"}.tgico-edit:before{content:\\\"\\\"}.tgico-eye1:before{content:\\\"\\\"}.tgico-eye2:before{content:\\\"\\\"}.tgico-flag:before{content:\\\"\\\"}.tgico-forward:before{content:\\\"\\\"}.tgico-fullscreen:before{content:\\\"\\\"}.tgico-group:before{content:\\\"\\\"}.tgico-help:before{content:\\\"\\\"}.tgico-info:before{content:\\\"\\\"}.tgico-lamp:before{content:\\\"\\\"}.tgico-language:before{content:\\\"\\\"}.tgico-largepause:before{content:\\\"\\\"}.tgico-largeplay:before{content:\\\"\\\"}.tgico-location:before{content:\\\"\\\"}.tgico-lock:before{content:\\\"\\\"}.tgico-logout:before{content:\\\"\\\"}.tgico-menu:before{content:\\\"\\\"}.tgico-message:before{content:\\\"\\\"}.tgico-microphone:before{content:\\\"\\\"}.tgico-more:before{content:\\\"\\\"}.tgico-mute:before{content:\\\"\\\"}.tgico-newchannel:before{content:\\\"\\\"}.tgico-newchat_filled:before{content:\\\"\\\"}.tgico-newgroup:before{content:\\\"\\\"}.tgico-newprivate:before{content:\\\"\\\"}.tgico-next:before{content:\\\"\\\"}.tgico-pause:before{content:\\\"\\\"}.tgico-permissions:before{content:\\\"\\\"}.tgico-phone:before{content:\\\"\\\"}.tgico-photo:before{content:\\\"\\\"}.tgico-pin:before{content:\\\"\\\"}.tgico-pinnedchat:before{content:\\\"\\\"}.tgico-play:before{content:\\\"\\\"}.tgico-radiooff:before{content:\\\"\\\"}.tgico-radioon:before{content:\\\"\\\"}.tgico-recent:before{content:\\\"\\\"}.tgico-reply:before{content:\\\"\\\"}.tgico-savedmessages:before{content:\\\"\\\"}.tgico-search:before{content:\\\"\\\"}.tgico-send:before{content:\\\"\\\"}.tgico-send2:before{content:\\\"\\\"}.tgico-sending:before{content:\\\"\\\"}.tgico-sendingerror:before{content:\\\"\\\"}.tgico-settings:before{content:\\\"\\\"}.tgico-smallscreen:before{content:\\\"\\\"}.tgico-smile:before{content:\\\"\\\"}.tgico-sport:before{content:\\\"\\\"}.tgico-stop:before{content:\\\"\\\"}.tgico-unarchive:before{content:\\\"\\\"}.tgico-unlock:before{content:\\\"\\\"}.tgico-unmute:before{content:\\\"\\\"}.tgico-unpin:before{content:\\\"\\\"}.tgico-unreadg:before{content:\\\"\\\"}.tgico-up:before{content:\\\"\\\"}.tgico-user:before{content:\\\"\\\"}.tgico-username:before{content:\\\"\\\"}\\n\", \"\"]);\n"
},
{
"id": 29,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.eot",
"name": "./src/assets/fonts/tgico.eot",
"index": 14,
"index2": 11,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.eot"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.eot",
"loc": "4:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.eot\";"
},
{
"id": 30,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.ttf",
"name": "./src/assets/fonts/tgico.ttf",
"index": 15,
"index2": 12,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.ttf"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.ttf",
"loc": "5:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.ttf\";"
},
{
"id": 31,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.woff",
"name": "./src/assets/fonts/tgico.woff",
"index": 16,
"index2": 13,
"size": 43,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.woff"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.woff",
"loc": "6:38-75"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.woff\";"
},
{
"id": 32,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/file-loader/dist/cjs.js??ref--7!/Users/kuzmenko/Documents/projects/tweb/src/assets/fonts/tgico.svg",
"name": "./src/assets/fonts/tgico.svg",
"index": 17,
"index2": 14,
"size": 42,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"issuerId": 28,
"issuerName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 27,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/style-loader/dist/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./src/scss/tgico.scss",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 28,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"name": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"profile": {
"factory": 185,
"building": 923,
"dependencies": 1
}
}
],
"profile": {
"factory": 1590,
"building": 5
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [
"assets/fonts/tgico.svg"
],
"reasons": [
{
"moduleId": 28,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/css-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/resolve-url-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/node_modules/sass-loader/dist/cjs.js??ref--4-3!/Users/kuzmenko/Documents/projects/tweb/src/scss/tgico.scss",
"module": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"moduleName": "./node_modules/css-loader/dist/cjs.js!./node_modules/resolve-url-loader!./node_modules/sass-loader/dist/cjs.js??ref--4-3!./src/scss/tgico.scss",
"type": "cjs require",
"userRequest": "../assets/fonts/tgico.svg",
"loc": "7:38-74"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = \"assets/fonts/tgico.svg\";"
},
{
"id": 33,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/rusha/dist/rusha.min.js",
"name": "./node_modules/rusha/dist/rusha.min.js",
"index": 24,
"index2": 20,
"size": 12486,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "rusha/dist/rusha.min.js",
"loc": "58:25-59"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "/*! rusha 2018-02-19 */\n\n(function e(t,r){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=r();else if(typeof define===\"function\"&&define.amd)define([],r);else if(typeof exports===\"object\")exports[\"Rusha\"]=r();else t[\"Rusha\"]=r()})(typeof self!==\"undefined\"?self:this,function(){return function(e){var t={};function r(n){if(t[n]){return t[n].exports}var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"\";return r(r.s=3)}([function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(5);var i=r(1),o=i.toHex,s=i.ceilHeapSize;var f=r(6);var u=function(e){for(e+=9;e%64>0;e+=1){}return e};var c=function(e,t){var r=new Uint8Array(e.buffer);var n=t%4,a=t-n;switch(n){case 0:r[a+3]=0;case 1:r[a+2]=0;case 2:r[a+1]=0;case 3:r[a+0]=0}for(var i=(t>>2)+1;i<e.length;i++){e[i]=0}};var h=function(e,t,r){e[t>>2]|=128<<24-(t%4<<3);e[((t>>2)+2&~15)+14]=r/(1<<29)|0;e[((t>>2)+2&~15)+15]=r<<3};var p=function(e,t){var r=new Int32Array(e,t+320,5);var n=new Int32Array(5);var a=new DataView(n.buffer);a.setInt32(0,r[0],false);a.setInt32(4,r[1],false);a.setInt32(8,r[2],false);a.setInt32(12,r[3],false);a.setInt32(16,r[4],false);return n};var l=function(){function e(t){n(this,e);t=t||64*1024;if(t%64>0){throw new Error(\"Chunk size must be a multiple of 128 bit\")}this._offset=0;this._maxChunkLen=t;this._padMaxChunkLen=u(t);this._heap=new ArrayBuffer(s(this._padMaxChunkLen+320+20));this._h32=new Int32Array(this._heap);this._h8=new Int8Array(this._heap);this._core=new a({Int32Array:Int32Array},{},this._heap)}e.prototype._initState=function e(t,r){this._offset=0;var n=new Int32Array(t,r+320,5);n[0]=1732584193;n[1]=-271733879;n[2]=-1732584194;n[3]=271733878;n[4]=-1009589776};e.prototype._padChunk=function e(t,r){var n=u(t);var a=new Int32Array(this._heap,0,n>>2);c(a,t);h(a,t,r);return n};e.prototype._write=function e(t,r,n,a){f(t,this._h8,this._h32,r,n,a||0)};e.prototype._coreCall=function e(t,r,n,a,i){var o=n;this._write(t,r,n);if(i){o=this._padChunk(n,a)}this._core.hash(o,this._padMaxChunkLen)};e.prototype.rawDigest=function e(t){var r=t.byteLength||t.length||t.size||0;this._initState(this._heap,this._padMaxChunkLen);var n=0,a=this._maxChunkLen;for(n=0;r>n+a;n+=a){this._coreCall(t,n,a,r,false)}this._coreCall(t,n,r-n,r,true);return p(this._heap,this._padMaxChunkLen)};e.prototype.digest=function e(t){return o(this.rawDigest(t).buffer)};e.prototype.digestFromString=function e(t){return this.digest(t)};e.prototype.digestFromBuffer=function e(t){return this.digest(t)};e.prototype.digestFromArrayBuffer=function e(t){return this.digest(t)};e.prototype.resetState=function e(){this._initState(this._heap,this._padMaxChunkLen);return this};e.prototype.append=function e(t){var r=0;var n=t.byteLength||t.length||t.size||0;var a=this._offset%this._maxChunkLen;var i=void 0;this._offset+=n;while(r<n){i=Math.min(n-r,this._maxChunkLen-a);this._write(t,r,i,a);a+=i;r+=i;if(a===this._maxChunkLen){this._core.hash(this._maxChunkLen,this._padMaxChunkLen);a=0}}return this};e.prototype.getState=function e(){var t=this._offset%this._maxChunkLen;var r=void 0;if(!t){var n=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}else{r=this._heap.slice(0)}return{offset:this._offset,heap:r}};e.prototype.setState=function e(t){this._offset=t.offset;if(t.heap.byteLength===20){var r=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r.set(new Int32Array(t.heap))}else{this._h32.set(new Int32Array(t.heap))}return this};e.prototype.rawEnd=function e(){var t=this._offset;var r=t%this._maxChunkLen;var n=this._padChunk(r,t);this._core.hash(n,this._padMaxChunkLen);var a=p(this._heap,this._padMaxChunkLen);this._initState(this._heap,this._padMaxChunkLen);return a};e.prototype.end=function e(){return o(this.rawEnd().buffer)};return e}();e.exports=l;e.exports._core=a},function(e,t){var r=new Array(256);for(var n=0;n<256;n++){r[n]=(n<16?\"0\":\"\")+n.toString(16)}e.exports.toHex=function(e){var t=new Uint8Array(e);var n=new Array(e.byteLength);for(var a=0;a<n.length;a++){n[a]=r[t[a]]}return n.join(\"\")};e.exports.ceilHeapSize=function(e){var t=0;if(e<=65536)return 65536;if(e<16777216){for(t=1;t<e;t=t<<1){}}else{for(t=16777216;t<e;t+=16777216){}}return t};e.exports.isDedicatedWorkerScope=function(e){var t=\"WorkerGlobalScope\"in e&&e instanceof e.WorkerGlobalScope;var r=\"SharedWorkerGlobalScope\"in e&&e instanceof e.SharedWorkerGlobalScope;var n=\"ServiceWorkerGlobalScope\"in e&&e instanceof e.ServiceWorkerGlobalScope;return t&&!r&&!n}},function(e,t,r){e.exports=function(){var e=r(0);var t=function(e,t,r){try{return r(null,e.digest(t))}catch(e){return r(e)}};var n=function(e,t,r,a,i){var o=new self.FileReader;o.onloadend=function s(){if(o.error){return i(o.error)}var f=o.result;t+=o.result.byteLength;try{e.append(f)}catch(e){i(e);return}if(t<a.size){n(e,t,r,a,i)}else{i(null,e.end())}};o.readAsArrayBuffer(a.slice(t,t+r))};var a=true;self.onmessage=function(r){if(!a){return}var i=r.data.data,o=r.data.file,s=r.data.id;if(typeof s===\"undefined\")return;if(!o&&!i)return;var f=r.data.blockSize||4*1024*1024;var u=new e(f);u.resetState();var c=function(e,t){if(!e){self.postMessage({id:s,hash:t})}else{self.postMessage({id:s,error:e.name})}};if(i)t(u,i,c);if(o)n(u,0,f,o,c)};return function(){a=false}}},function(e,t,r){var n=r(4);var a=r(0);var i=r(7);var o=r(2);var s=r(1),f=s.isDedicatedWorkerScope;var u=typeof self!==\"undefined\"&&f(self);a.disableWorkerBehaviour=u?o():function(){};a.createWorker=function(){var e=n(2);var t=e.terminate;e.terminate=function(){URL.revokeObjectURL(e.objectURL);t.call(e)};return e};a.createHash=i;e.exports=a},function(e,t,r){function n(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.i=function(e){return e};r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.r=function(e){Object.defineProperty(e,\"__esModule\",{value:true})};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"/\";r.oe=function(e){console.error(e);throw e};var n=r(r.s=ENTRY_MODULE);return n.default||n}var a=\"[\\\\.|\\\\-|\\\\+|\\\\w|/|@]+\";var i=\"\\\\((/\\\\*.*?\\\\*/)?s?.*?(\"+a+\").*?\\\\)\";function o(e){return(e+\"\").replace(/[.?*+^$[\\]\\\\(){}|-]/g,\"\\\\$&\")}function s(e,t,n){var s={};s[n]=[];var f=t.toString();var u=f.match(/^function\\s?\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/);if(!u)return s;var c=u[1];var h=new RegExp(\"(\\\\\\\\n|\\\\W)\"+o(c)+i,\"g\");var p;while(p=h.exec(f)){if(p[3]===\"dll-reference\")continue;s[n].push(p[3])}h=new RegExp(\"\\\\(\"+o(c)+'\\\\(\"(dll-reference\\\\s('+a+'))\"\\\\)\\\\)'+i,\"g\");while(p=h.exec(f)){if(!e[p[2]]){s[n].push(p[1]);e[p[2]]=r(p[1]).m}s[p[2]]=s[p[2]]||[];s[p[2]].push(p[4])}return s}function f(e){var t=Object.keys(e);return t.reduce(function(t,r){return t||e[r].length>0},false)}function u(e,t){var r={main:[t]};var n={main:[]};var a={main:{}};while(f(r)){var i=Object.keys(r);for(var o=0;o<i.length;o++){var u=i[o];var c=r[u];var h=c.pop();a[u]=a[u]||{};if(a[u][h]||!e[u][h])continue;a[u][h]=true;n[u]=n[u]||[];n[u].push(h);var p=s(e,e[u][h],u);var l=Object.keys(p);for(var v=0;v<l.length;v++){r[l[v]]=r[l[v]]||[];r[l[v]]=r[l[v]].concat(p[l[v]])}}}return n}e.exports=function(e,t){t=t||{};var a={main:r.m};var i=t.all?{main:Object.keys(a)}:u(a,e);var o=\"\";Object.keys(i).filter(function(e){return e!==\"main\"}).forEach(function(e){var t=0;while(i[e][t]){t++}i[e].push(t);a[e][t]=\"(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })\";o=o+\"var \"+e+\" = (\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(t))+\")({\"+i[e].map(function(t){return\"\"+JSON.stringify(t)+\": \"+a[e][t].toString()}).join(\",\")+\"});\\n\"});o=o+\"(\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(e))+\")({\"+i.main.map(function(e){return\"\"+JSON.stringify(e)+\": \"+a.main[e].toString()}).join(\",\")+\"})(self);\";var s=new window.Blob([o],{type:\"text/javascript\"});if(t.bare){return s}var f=window.URL||window.webkitURL||window.mozURL||window.msURL;var c=f.createObjectURL(s);var h=new window.Worker(c);h.objectURL=c;return h}},function(e,t){e.exports=function e(t,r,n){\"use asm\";var a=new t.Int32Array(n);function i(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,o=0,s=0,f=0,u=0,c=0,h=0,p=0,l=0,v=0,d=0,y=0;i=a[t+320>>2]|0;s=a[t+324>>2]|0;u=a[t+328>>2]|0;h=a[t+332>>2]|0;l=a[t+336>>2]|0;for(r=0;(r|0)<(e|0);r=r+64|0){o=i;f=s;c=u;p=h;v=l;for(n=0;(n|0)<64;n=n+4|0){y=a[r+n>>2]|0;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[e+n>>2]=y}for(n=e+64|0;(n|0)<(e+80|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+80|0;(n|0)<(e+160|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)+1859775393|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+160|0;(n|0)<(e+240|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|s&h|u&h)|0)+((y+l|0)-1894007588|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+240|0;(n|0)<(e+320|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)-899497514|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}i=i+o|0;s=s+f|0;u=u+c|0;h=h+p|0;l=l+v|0}a[t+320>>2]=i;a[t+324>>2]=s;a[t+328>>2]=u;a[t+332>>2]=h;a[t+336>>2]=l}return{hash:i}}},function(e,t){var r=this;var n=void 0;if(typeof self!==\"undefined\"&&typeof self.FileReaderSync!==\"undefined\"){n=new self.FileReaderSync}var a=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e.charCodeAt(n+3);case 1:t[i+1-(s<<1)|0]=e.charCodeAt(n+2);case 2:t[i+2-(s<<1)|0]=e.charCodeAt(n+1);case 3:t[i+3-(s<<1)|0]=e.charCodeAt(n)}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2]=e.charCodeAt(n+o)<<24|e.charCodeAt(n+o+1)<<16|e.charCodeAt(n+o+2)<<8|e.charCodeAt(n+o+3)}switch(f){case 3:t[i+u+1|0]=e.charCodeAt(n+u+2);case 2:t[i+u+2|0]=e.charCodeAt(n+u+1);case 1:t[i+u+3|0]=e.charCodeAt(n+u)}};var i=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e[n+3];case 1:t[i+1-(s<<1)|0]=e[n+2];case 2:t[i+2-(s<<1)|0]=e[n+1];case 3:t[i+3-(s<<1)|0]=e[n]}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2|0]=e[n+o]<<24|e[n+o+1]<<16|e[n+o+2]<<8|e[n+o+3]}switch(f){case 3:t[i+u+1|0]=e[n+u+2];case 2:t[i+u+2|0]=e[n+u+1];case 1:t[i+u+3|0]=e[n+u]}};var o=function(e,t,r,a,i,o){var s=void 0,f=o%4,u=(i+f)%4,c=i-u;var h=new Uint8Array(n.readAsArrayBuffer(e.slice(a,a+i)));switch(f){case 0:t[o]=h[3];case 1:t[o+1-(f<<1)|0]=h[2];case 2:t[o+2-(f<<1)|0]=h[1];case 3:t[o+3-(f<<1)|0]=h[0]}if(i<u+(4-f)){return}for(s=4-f;s<c;s=s+4|0){r[o+s>>2|0]=h[s]<<24|h[s+1]<<16|h[s+2]<<8|h[s+3]}switch(u){case 3:t[o+c+1|0]=h[c+2];case 2:t[o+c+2|0]=h[c+1];case 1:t[o+c+3|0]=h[c]}};e.exports=function(e,t,n,s,f,u){if(typeof e===\"string\"){return a(e,t,n,s,f,u)}if(e instanceof Array){return i(e,t,n,s,f,u)}if(r&&r.Buffer&&r.Buffer.isBuffer(e)){return i(e,t,n,s,f,u)}if(e instanceof ArrayBuffer){return i(new Uint8Array(e),t,n,s,f,u)}if(e.buffer instanceof ArrayBuffer){return i(new Uint8Array(e.buffer,e.byteOffset,e.byteLength),t,n,s,f,u)}if(e instanceof Blob){return o(e,t,n,s,f,u)}throw new Error(\"Unsupported data type.\")}},function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(0);var i=r(1),o=i.toHex;var s=function(){function e(){n(this,e);this._rusha=new a;this._rusha.resetState()}e.prototype.update=function e(t){this._rusha.append(t);return this};e.prototype.digest=function e(t){var e=this._rusha.rawEnd().buffer;if(!t){return e}if(t===\"hex\"){return o(e)}throw new Error(\"unsupported digest encoding\")};return e}();e.exports=function(){return new s}}])});"
},
{
"id": 34,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/pako/dist/pako_inflate.min.js",
"name": "./node_modules/pako/dist/pako_inflate.min.js",
"index": 26,
"index2": 22,
"size": 22682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "pako/dist/pako_inflate.min.js",
"loc": "62:44-84"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).pako=e()}}(function(){return function r(o,s,f){function l(t,e){if(!s[t]){if(!o[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(d)return d(t,!0);var n=new Error(\"Cannot find module '\"+t+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var a=s[t]={exports:{}};o[t][0].call(a.exports,function(e){return l(o[t][1][e]||e)},a,a.exports,r,o,s,f)}return s[t].exports}for(var d=\"function\"==typeof require&&require,e=0;e<f.length;e++)l(f[e]);return l}({1:[function(e,t,i){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;i.assign=function(e){for(var t,i,n=Array.prototype.slice.call(arguments,1);n.length;){var a=n.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var r in a)t=a,i=r,Object.prototype.hasOwnProperty.call(t,i)&&(e[r]=a[r])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,i,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+n),a);else for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){var t,i,n,a,r,o;for(t=n=0,i=e.length;t<i;t++)n+=e[t].length;for(o=new Uint8Array(n),t=a=0,i=e.length;t<i;t++)r=e[t],o.set(r,a),a+=r.length;return o}},r={arraySet:function(e,t,i,n,a){for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,a)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,r))},i.setTyped(n)},{}],2:[function(e,t,i){\"use strict\";var f=e(\"./common\"),a=!0,r=!0;try{String.fromCharCode.apply(null,[0])}catch(e){a=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){r=!1}for(var l=new f.Buf8(256),n=0;n<256;n++)l[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function d(e,t){if(t<65534&&(e.subarray&&r||!e.subarray&&a))return String.fromCharCode.apply(null,f.shrinkBuf(e,t));for(var i=\"\",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}l[254]=l[254]=1,i.string2buf=function(e){var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new f.Buf8(s),a=r=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:(i<2048?t[r++]=192|i>>>6:(i<65536?t[r++]=224|i>>>12:(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63),t[r++]=128|i>>>6&63),t[r++]=128|63&i);return t},i.buf2binstring=function(e){return d(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i<n;i++)t[i]=e.charCodeAt(i);return t},i.buf2string=function(e,t){var i,n,a,r,o=t||e.length,s=new Array(2*o);for(i=n=0;i<o;)if((a=e[i++])<128)s[n++]=a;else if(4<(r=l[a]))s[n++]=65533,i+=r-1;else{for(a&=2===r?31:3===r?15:7;1<r&&i<o;)a=a<<6|63&e[i++],r--;1<r?s[n++]=65533:a<65536?s[n++]=a:(a-=65536,s[n++]=55296|a>>10&1023,s[n++]=56320|1023&a)}return d(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return i<0?t:0===i?t:i+l[e[i]]>t?i:t}},{\"./common\":1}],3:[function(e,t,i){\"use strict\";t.exports=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){for(i-=o=2e3<i?2e3:i;r=r+(a=a+t[n++]|0)|0,--o;);a%=65521,r%=65521}return a|r<<16|0}},{}],4:[function(e,t,i){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],5:[function(e,t,i){\"use strict\";var s=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var a=s,r=n+i;e^=-1;for(var o=n;o<r;o++)e=e>>>8^a[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){\"use strict\";t.exports=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z;i=e.state,n=e.next_in,E=e.input,a=n+(e.avail_in-5),r=e.next_out,Z=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),f=i.dmax,l=i.wsize,d=i.whave,c=i.wnext,u=i.window,h=i.hold,b=i.bits,m=i.lencode,w=i.distcode,k=(1<<i.lenbits)-1,_=(1<<i.distbits)-1;e:do{b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=m[h&k];t:for(;;){if(h>>>=v=g>>>24,b-=v,0===(v=g>>>16&255))Z[r++]=65535&g;else{if(!(16&v)){if(0==(64&v)){g=m[(65535&g)+(h&(1<<v)-1)];continue t}if(32&v){i.mode=12;break e}e.msg=\"invalid literal/length code\",i.mode=30;break e}p=65535&g,(v&=15)&&(b<v&&(h+=E[n++]<<b,b+=8),p+=h&(1<<v)-1,h>>>=v,b-=v),b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=w[h&_];i:for(;;){if(h>>>=v=g>>>24,b-=v,!(16&(v=g>>>16&255))){if(0==(64&v)){g=w[(65535&g)+(h&(1<<v)-1)];continue i}e.msg=\"invalid distance code\",i.mode=30;break e}if(x=65535&g,b<(v&=15)&&(h+=E[n++]<<b,(b+=8)<v&&(h+=E[n++]<<b,b+=8)),f<(x+=h&(1<<v)-1)){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(h>>>=v,b-=v,(v=r-o)<x){if(d<(v=x-v)&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(S=u,(y=0)===c){if(y+=l-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}}else if(c<v){if(y+=l+c-v,(v-=c)<p){for(p-=v;Z[r++]=u[y++],--v;);if(y=0,c<p){for(p-=v=c;Z[r++]=u[y++],--v;);y=r-x,S=Z}}}else if(y+=c-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}for(;2<p;)Z[r++]=S[y++],Z[r++]=S[y++],Z[r++]=S[y++],p-=3;p&&(Z[r++]=S[y++],1<p&&(Z[r++]=S[y++]))}else{for(y=r-x;Z[r++]=Z[y++],Z[r++]=Z[y++],Z[r++]=Z[y++],2<(p-=3););p&&(Z[r++]=Z[y++],1<p&&(Z[r++]=Z[y++]))}break}}break}}while(n<a&&r<s);n-=p=b>>3,h&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n<a?a-n+5:5-(n-a),e.avail_out=r<s?s-r+257:257-(r-s),i.hold=h,i.bits=b}},{}],8:[function(e,t,i){\"use strict\";var z=e(\"../utils/common\"),R=e(\"./adler32\"),N=e(\"./crc32\"),O=e(\"./inffast\"),C=e(\"./inftrees\"),I=1,D=2,T=0,U=-2,F=1,n=852,a=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new z.Buf16(320),this.work=new z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new z.Buf32(n),t.distcode=t.distdyn=new z.Buf32(a),t.sane=1,t.back=-1,T):U}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):U}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,s(e))):U}function l(e,t){var i,n;return e?(n=new r,(e.state=n).window=null,(i=f(e,t))!==T&&(e.state=null),i):U}var d,c,u=!0;function H(e){if(u){var t;for(d=new z.Buf32(512),c=new z.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(C(I,e.lens,0,288,d,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;C(D,e.lens,0,32,c,0,e.work,{bits:5}),u=!1}e.lencode=d,e.lenbits=9,e.distcode=c,e.distbits=5}function j(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new z.Buf8(r.wsize)),n>=r.wsize?(z.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(a=r.wsize-r.wnext)&&(a=n),z.arraySet(r.window,t,i-n,a,r.wnext),(n-=a)?(z.arraySet(r.window,t,i-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0}i.inflateReset=s,i.inflateReset2=f,i.inflateResetKeep=o,i.inflateInit=function(e){return l(e,15)},i.inflateInit2=l,i.inflate=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z=0,B=new z.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(i=e.state).mode&&(i.mode=13),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,c=s,u=f,y=T;e:for(;;)switch(i.mode){case F:if(0===i.wrap){i.mode=13;break}for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(2&i.wrap&&35615===l){B[i.check=0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0),d=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg=\"incorrect header check\",i.mode=30;break}if(8!=(15&l)){e.msg=\"unknown compression method\",i.mode=30;break}if(d-=4,x=8+(15&(l>>>=4)),0===i.wbits)i.wbits=x;else if(x>i.wbits){e.msg=\"invalid window size\",i.mode=30;break}i.dmax=1<<x,e.adler=i.check=1,i.mode=512&l?10:12,d=l=0;break;case 2:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.flags=l,8!=(255&i.flags)){e.msg=\"unknown compression method\",i.mode=30;break}if(57344&i.flags){e.msg=\"unknown header flags set\",i.mode=30;break}i.head&&(i.head.text=l>>8&1),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=3;case 3:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.time=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,B[2]=l>>>16&255,B[3]=l>>>24&255,i.check=N(i.check,B,4,0)),d=l=0,i.mode=4;case 4:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.xflags=255&l,i.head.os=l>>8),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=5;case 5:if(1024&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length=l,i.head&&(i.head.extra_len=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(s<(h=i.length)&&(h=s),h&&(i.head&&(x=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),z.arraySet(i.head.extra,n,r,h,x)),512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.name+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.comment+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(65535&i.check)){e.msg=\"header crc mismatch\",i.mode=30;break}d=l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}e.adler=i.check=L(l),d=l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,2;e.adler=i.check=1,i.mode=12;case 12:if(5===t||6===t)break e;case 13:if(i.last){l>>>=7&d,d-=7&d,i.mode=27;break}for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}switch(i.last=1&l,d-=1,3&(l>>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,d-=2;break e;case 2:i.mode=17;break;case 3:e.msg=\"invalid block type\",i.mode=30}l>>>=2,d-=2;break;case 14:for(l>>>=7&d,d-=7&d;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if((65535&l)!=(l>>>16^65535)){e.msg=\"invalid stored block lengths\",i.mode=30;break}if(i.length=65535&l,d=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(s<h&&(h=s),f<h&&(h=f),0===h)break e;z.arraySet(a,n,r,h,o),s-=h,r+=h,f-=h,o+=h,i.length-=h;break}i.mode=12;break;case 17:for(;d<14;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.nlen=257+(31&l),l>>>=5,d-=5,i.ndist=1+(31&l),l>>>=5,d-=5,i.ncode=4+(15&l),l>>>=4,d-=4,286<i.nlen||30<i.ndist){e.msg=\"too many length or distance symbols\",i.mode=30;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.lens[A[i.have++]]=7&l,l>>>=3,d-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,S={bits:i.lenbits},y=C(0,i.lens,0,19,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid code lengths set\",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(_<16)l>>>=w,d-=w,i.lens[i.have++]=_;else{if(16===_){for(E=w+2;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l>>>=w,d-=w,0===i.have){e.msg=\"invalid bit length repeat\",i.mode=30;break}x=i.lens[i.have-1],h=3+(3&l),l>>>=2,d-=2}else if(17===_){for(E=w+3;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=3+(7&(l>>>=w)),l>>>=3,d-=3}else{for(E=w+7;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=11+(127&(l>>>=w)),l>>>=7,d-=7}if(i.have+h>i.nlen+i.ndist){e.msg=\"invalid bit length repeat\",i.mode=30;break}for(;h--;)i.lens[i.have++]=x}}if(30===i.mode)break;if(0===i.lens[256]){e.msg=\"invalid code -- missing end-of-block\",i.mode=30;break}if(i.lenbits=9,S={bits:i.lenbits},y=C(I,i.lens,0,i.nlen,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid literal/lengths set\",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,S={bits:i.distbits},y=C(D,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,S),i.distbits=S.bits,y){e.msg=\"invalid distances set\",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,O(e,u),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(k&&0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.lencode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,i.length=_,0===k){i.mode=26;break}if(32&k){i.back=-1,i.mode=12;break}if(64&k){e.msg=\"invalid literal/length code\",i.mode=30;break}i.extra=15&k,i.mode=22;case 22:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;k=(Z=i.distcode[l&(1<<i.distbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.distcode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,64&k){e.msg=\"invalid distance code\",i.mode=30;break}i.offset=_,i.extra=15&k,i.mode=24;case 24:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.offset+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg=\"invalid distance too far back\",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(h=u-f,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break}h>i.wnext?(h-=i.wnext,b=i.wsize-h):b=i.wnext-h,h>i.length&&(h=i.length),m=i.window}else m=a,b=o-i.offset,h=i.length;for(f<h&&(h=f),f-=h,i.length-=h;a[o++]=m[b++],--h;);0===i.length&&(i.mode=21);break;case 26:if(0===f)break e;a[o++]=i.length,f--,i.mode=21;break;case 27:if(i.wrap){for(;d<32;){if(0===s)break e;s--,l|=n[r++]<<d,d+=8}if(u-=f,e.total_out+=u,i.total+=u,u&&(e.adler=i.check=i.flags?N(i.check,a,u,o-u):R(i.check,a,u,o-u)),u=f,(i.flags?l:L(l))!==i.check){e.msg=\"incorrect data check\",i.mode=30;break}d=l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(4294967295&i.total)){e.msg=\"incorrect length check\",i.mode=30;break}d=l=0}i.mode=29;case 29:y=1;break e;case 30:y=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,(i.wsize||u!==e.avail_out&&i.mode<30&&(i.mode<27||4!==t))&&j(e,e.output,e.next_out,u-e.avail_out)?(i.mode=31,-4):(c-=e.avail_in,u-=e.avail_out,e.total_in+=c,e.total_out+=u,i.total+=u,i.wrap&&u&&(e.adler=i.check=i.flags?N(i.check,a,u,e.next_out-u):R(i.check,a,u,e.next_out-u)),e.data_type=i.bits+(i.last?64:0)+(12===i.mode?128:0)+(20===i.mode||15===i.mode?256:0),(0===c&&0===u||4===t)&&y===T&&(y=-5),y)},i.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,T},i.inflateGetHeader=function(e,t){var i;return e&&e.state?0==(2&(i=e.state).wrap)?U:((i.head=t).done=!1,T):U},i.inflateSetDictionary=function(e,t){var i,n=t.length;return e&&e.state?0!==(i=e.state).wrap&&11!==i.mode?U:11===i.mode&&R(1,t,n,0)!==i.check?-3:j(e,t,n,n)?(i.mode=31,-4):(i.havedict=1,T):U},i.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":1,\"./adler32\":3,\"./crc32\":5,\"./inffast\":7,\"./inftrees\":9}],9:[function(e,t,i){\"use strict\";var I=e(\"../utils/common\"),D=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],T=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],F=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,i,n,a,r,o,s){var f,l,d,c,u,h,b,m,w,k=s.bits,_=0,g=0,v=0,p=0,x=0,y=0,S=0,E=0,Z=0,B=0,A=null,z=0,R=new I.Buf16(16),N=new I.Buf16(16),O=null,C=0;for(_=0;_<=15;_++)R[_]=0;for(g=0;g<n;g++)R[t[i+g]]++;for(x=k,p=15;1<=p&&0===R[p];p--);if(p<x&&(x=p),0===p)return a[r++]=20971520,a[r++]=20971520,s.bits=1,0;for(v=1;v<p&&0===R[v];v++);for(x<v&&(x=v),_=E=1;_<=15;_++)if(E<<=1,(E-=R[_])<0)return-1;if(0<E&&(0===e||1!==p))return-1;for(N[1]=0,_=1;_<15;_++)N[_+1]=N[_]+R[_];for(g=0;g<n;g++)0!==t[i+g]&&(o[N[t[i+g]]++]=g);if(0===e?(A=O=o,h=19):1===e?(A=D,z-=257,O=T,C-=257,h=256):(A=U,O=F,h=-1),_=v,u=r,S=g=B=0,d=-1,c=(Z=1<<(y=x))-1,1===e&&852<Z||2===e&&592<Z)return 1;for(;;){for(b=_-S,o[g]<h?(m=0,w=o[g]):o[g]>h?(m=O[C+o[g]],w=A[z+o[g]]):(m=96,w=0),f=1<<_-S,v=l=1<<y;a[u+(B>>S)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<_-1;B&f;)f>>=1;if(0!==f?(B&=f-1,B+=f):B=0,g++,0==--R[_]){if(_===p)break;_=t[i+o[g]]}if(x<_&&(B&c)!==d){for(0===S&&(S=x),u+=v,E=1<<(y=_-S);y+S<p&&!((E-=R[y+S])<=0);)y++,E<<=1;if(Z+=1<<y,1===e&&852<Z||2===e&&592<Z)return 1;a[d=B&c]=x<<24|y<<16|u-r|0}}return 0!==B&&(a[u+B]=_-S<<24|64<<16|0),s.bits=x,0}},{\"../utils/common\":1}],10:[function(e,t,i){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],11:[function(e,t,i){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],\"/lib/inflate.js\":[function(e,t,i){\"use strict\";var c=e(\"./zlib/inflate\"),u=e(\"./utils/common\"),h=e(\"./utils/strings\"),b=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),a=e(\"./zlib/zstream\"),r=e(\"./zlib/gzheader\"),m=Object.prototype.toString;function o(e){if(!(this instanceof o))return new o(e);this.options=u.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var i=c.inflateInit2(this.strm,t.windowBits);if(i!==b.Z_OK)throw new Error(n[i]);if(this.header=new r,c.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===m.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=c.inflateSetDictionary(this.strm,t.dictionary))!==b.Z_OK))throw new Error(n[i])}function s(e,t){var i=new o(t);if(i.push(e,!0),i.err)throw i.msg||n[i.err];return i.result}o.prototype.push=function(e,t){var i,n,a,r,o,s=this.strm,f=this.options.chunkSize,l=this.options.dictionary,d=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?b.Z_FINISH:b.Z_NO_FLUSH,\"string\"==typeof e?s.input=h.binstring2buf(e):\"[object ArrayBuffer]\"===m.call(e)?s.input=new Uint8Array(e):s.input=e,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new u.Buf8(f),s.next_out=0,s.avail_out=f),(i=c.inflate(s,b.Z_NO_FLUSH))===b.Z_NEED_DICT&&l&&(i=c.inflateSetDictionary(this.strm,l)),i===b.Z_BUF_ERROR&&!0===d&&(i=b.Z_OK,d=!1),i!==b.Z_STREAM_END&&i!==b.Z_OK)return this.onEnd(i),!(this.ended=!0);s.next_out&&(0!==s.avail_out&&i!==b.Z_STREAM_END&&(0!==s.avail_in||n!==b.Z_FINISH&&n!==b.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(a=h.utf8border(s.output,s.next_out),r=s.next_out-a,o=h.buf2string(s.output,a),s.next_out=r,s.avail_out=f-r,r&&u.arraySet(s.output,s.output,a,r,0),this.onData(o)):this.onData(u.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(d=!0)}while((0<s.avail_in||0===s.avail_out)&&i!==b.Z_STREAM_END);return i===b.Z_STREAM_END&&(n=b.Z_FINISH),n===b.Z_FINISH?(i=c.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===b.Z_OK):n!==b.Z_SYNC_FLUSH||(this.onEnd(b.Z_OK),!(s.avail_out=0))},o.prototype.onData=function(e){this.chunks.push(e)},o.prototype.onEnd=function(e){e===b.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=o,i.inflate=s,i.inflateRaw=function(e,t){return(t=t||{}).raw=!0,s(e,t)},i.ungzip=s},{\"./utils/common\":1,\"./utils/strings\":2,\"./zlib/constants\":4,\"./zlib/gzheader\":6,\"./zlib/inflate\":8,\"./zlib/messages\":10,\"./zlib/zstream\":11}]},{},[])(\"/lib/inflate.js\")});\n"
},
{
"id": 35,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.js",
"name": "./src/lib/crypto.js",
"index": 27,
"index2": 23,
"size": 97349,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./crypto.js",
"loc": "63:15-37"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * CryptoJS core components.\r\n */\r\n\r\nconsole.log('CryptoJS included!');\r\n\r\nvar CryptoJS = this.CryptoJS = globalThis.CryptoJS = CryptoJS || (function (Math, undefined) {\r\n /**\r\n * CryptoJS namespace.\r\n */\r\n var C = {};\r\n\r\n /**\r\n * Library namespace.\r\n */\r\n var C_lib = C.lib = {};\r\n\r\n /**\r\n * Base object for prototypal inheritance.\r\n */\r\n var Base = C_lib.Base = (function () {\r\n function F() {}\r\n\r\n return {\r\n /**\r\n * Creates a new object that inherits from this object.\r\n *\r\n * @param {Object} overrides Properties to copy into the new object.\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * field: 'value',\r\n *\r\n * method: function () {\r\n * }\r\n * });\r\n */\r\n extend: function (overrides) {\r\n // Spawn\r\n F.prototype = this;\r\n var subtype = new F();\r\n\r\n // Augment\r\n if (overrides) {\r\n subtype.mixIn(overrides);\r\n }\r\n\r\n // Create default initializer\r\n if (!subtype.hasOwnProperty('init')) {\r\n subtype.init = function () {\r\n subtype.$super.init.apply(this, arguments);\r\n };\r\n }\r\n\r\n // Initializer's prototype is the subtype object\r\n subtype.init.prototype = subtype;\r\n\r\n // Reference supertype\r\n subtype.$super = this;\r\n\r\n return subtype;\r\n },\r\n\r\n /**\r\n * Extends this object and runs the init method.\r\n * Arguments to create() will be passed to init().\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var instance = MyType.create();\r\n */\r\n create: function () {\r\n var instance = this.extend();\r\n instance.init.apply(instance, arguments);\r\n\r\n return instance;\r\n },\r\n\r\n /**\r\n * Initializes a newly created object.\r\n * Override this method to add some logic when your objects are created.\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * init: function () {\r\n * // ...\r\n * }\r\n * });\r\n */\r\n init: function () {\r\n },\r\n\r\n /**\r\n * Copies properties into this object.\r\n *\r\n * @param {Object} properties The properties to mix in.\r\n *\r\n * @example\r\n *\r\n * MyType.mixIn({\r\n * field: 'value'\r\n * });\r\n */\r\n mixIn: function (properties) {\r\n for (var propertyName in properties) {\r\n if (properties.hasOwnProperty(propertyName)) {\r\n this[propertyName] = properties[propertyName];\r\n }\r\n }\r\n\r\n // IE won't copy toString using the loop above\r\n if (properties.hasOwnProperty('toString')) {\r\n this.toString = properties.toString;\r\n }\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = instance.clone();\r\n */\r\n clone: function () {\r\n return this.init.prototype.extend(this);\r\n }\r\n };\r\n }());\r\n\r\n /**\r\n * An array of 32-bit words.\r\n *\r\n * @property {Array} words The array of 32-bit words.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var WordArray = C_lib.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of 32-bit words.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.create();\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 4;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this word array to a string.\r\n *\r\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\r\n *\r\n * @return {string} The stringified word array.\r\n *\r\n * @example\r\n *\r\n * var string = wordArray + '';\r\n * var string = wordArray.toString();\r\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\r\n */\r\n toString: function (encoder) {\r\n return (encoder || Hex).stringify(this);\r\n },\r\n\r\n /**\r\n * Concatenates a word array to this word array.\r\n *\r\n * @param {WordArray} wordArray The word array to append.\r\n *\r\n * @return {WordArray} This word array.\r\n *\r\n * @example\r\n *\r\n * wordArray1.concat(wordArray2);\r\n */\r\n concat: function (wordArray) {\r\n // Shortcuts\r\n var thisWords = this.words;\r\n var thatWords = wordArray.words;\r\n var thisSigBytes = this.sigBytes;\r\n var thatSigBytes = wordArray.sigBytes;\r\n\r\n // Clamp excess bits\r\n this.clamp();\r\n\r\n // Concat\r\n if (thisSigBytes % 4) {\r\n // Copy one byte at a time\r\n for (var i = 0; i < thatSigBytes; i++) {\r\n var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\r\n }\r\n } else if (thatWords.length > 0xffff) {\r\n // Copy one word at a time\r\n for (var i = 0; i < thatSigBytes; i += 4) {\r\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\r\n }\r\n } else {\r\n // Copy all words at once\r\n // thisWords.push.apply(thisWords, thatWords);\r\n\r\n // HOTFIX from: https://code.google.com/p/crypto-js/issues/detail?id=90\r\n for (var i = 0; i < thatWords.length; i++) {\r\n thisWords.push(thatWords[i]);\r\n }\r\n }\r\n this.sigBytes += thatSigBytes;\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Removes insignificant bits.\r\n *\r\n * @example\r\n *\r\n * wordArray.clamp();\r\n */\r\n clamp: function () {\r\n // Shortcuts\r\n var words = this.words;\r\n var sigBytes = this.sigBytes;\r\n\r\n // Clamp\r\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\r\n words.length = Math.ceil(sigBytes / 4);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = wordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone.words = this.words.slice(0);\r\n\r\n return clone;\r\n },\r\n\r\n /**\r\n * Creates a word array filled with random bytes.\r\n *\r\n * @param {number} nBytes The number of random bytes to generate.\r\n *\r\n * @return {WordArray} The random word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.random(16);\r\n */\r\n random: function (nBytes) {\r\n var words = [];\r\n for (var i = 0; i < nBytes; i += 4) {\r\n words.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n return new WordArray.init(words, nBytes);\r\n }\r\n });\r\n\r\n /**\r\n * Encoder namespace.\r\n */\r\n var C_enc = C.enc = {};\r\n\r\n /**\r\n * Hex encoding strategy.\r\n */\r\n var Hex = C_enc.Hex = {\r\n /**\r\n * Converts a word array to a hex string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The hex string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var hexChars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n hexChars.push((bite >>> 4).toString(16));\r\n hexChars.push((bite & 0x0f).toString(16));\r\n }\r\n\r\n return hexChars.join('');\r\n },\r\n\r\n /**\r\n * Converts a hex string to a word array.\r\n *\r\n * @param {string} hexStr The hex string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\r\n */\r\n parse: function (hexStr) {\r\n // Shortcut\r\n var hexStrLength = hexStr.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < hexStrLength; i += 2) {\r\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\r\n }\r\n\r\n return new WordArray.init(words, hexStrLength / 2);\r\n }\r\n };\r\n\r\n /**\r\n * Latin1 encoding strategy.\r\n */\r\n var Latin1 = C_enc.Latin1 = {\r\n /**\r\n * Converts a word array to a Latin1 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The Latin1 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var latin1Chars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n latin1Chars.push(String.fromCharCode(bite));\r\n }\r\n\r\n return latin1Chars.join('');\r\n },\r\n\r\n /**\r\n * Converts a Latin1 string to a word array.\r\n *\r\n * @param {string} latin1Str The Latin1 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\r\n */\r\n parse: function (latin1Str) {\r\n // Shortcut\r\n var latin1StrLength = latin1Str.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < latin1StrLength; i++) {\r\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new WordArray.init(words, latin1StrLength);\r\n }\r\n };\r\n\r\n /**\r\n * UTF-8 encoding strategy.\r\n */\r\n var Utf8 = C_enc.Utf8 = {\r\n /**\r\n * Converts a word array to a UTF-8 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The UTF-8 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n try {\r\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\r\n } catch (e) {\r\n throw new Error('Malformed UTF-8 data');\r\n }\r\n },\r\n\r\n /**\r\n * Converts a UTF-8 string to a word array.\r\n *\r\n * @param {string} utf8Str The UTF-8 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\r\n */\r\n parse: function (utf8Str) {\r\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\r\n }\r\n };\r\n\r\n /**\r\n * Abstract buffered block algorithm template.\r\n *\r\n * The property blockSize must be implemented in a concrete subtype.\r\n *\r\n * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\r\n */\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\r\n /**\r\n * Resets this block algorithm's data buffer to its initial state.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm.reset();\r\n */\r\n reset: function () {\r\n // Initial values\r\n this._data = new WordArray.init();\r\n this._nDataBytes = 0;\r\n },\r\n\r\n /**\r\n * Adds new data to this block algorithm's buffer.\r\n *\r\n * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm._append('data');\r\n * bufferedBlockAlgorithm._append(wordArray);\r\n */\r\n _append: function (data) {\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof data == 'string') {\r\n data = Utf8.parse(data);\r\n }\r\n\r\n // Append\r\n this._data.concat(data);\r\n this._nDataBytes += data.sigBytes;\r\n },\r\n\r\n /**\r\n * Processes available data blocks.\r\n *\r\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\r\n *\r\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\r\n *\r\n * @return {WordArray} The processed data.\r\n *\r\n * @example\r\n *\r\n * var processedData = bufferedBlockAlgorithm._process();\r\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\r\n */\r\n _process: function (doFlush) {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n var dataSigBytes = data.sigBytes;\r\n var blockSize = this.blockSize;\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count blocks ready\r\n var nBlocksReady = dataSigBytes / blockSizeBytes;\r\n if (doFlush) {\r\n // Round up to include partial blocks\r\n nBlocksReady = Math.ceil(nBlocksReady);\r\n } else {\r\n // Round down to include only full blocks,\r\n // less the number of blocks that must remain in the buffer\r\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\r\n }\r\n\r\n // Count words ready\r\n var nWordsReady = nBlocksReady * blockSize;\r\n\r\n // Count bytes ready\r\n var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\r\n\r\n // Process blocks\r\n if (nWordsReady) {\r\n for (var offset = 0; offset < nWordsReady; offset += blockSize) {\r\n // Perform concrete-algorithm logic\r\n this._doProcessBlock(dataWords, offset);\r\n }\r\n\r\n // Remove processed words\r\n var processedWords = dataWords.splice(0, nWordsReady);\r\n data.sigBytes -= nBytesReady;\r\n }\r\n\r\n // Return processed words\r\n return new WordArray.init(processedWords, nBytesReady);\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = bufferedBlockAlgorithm.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone._data = this._data.clone();\r\n\r\n return clone;\r\n },\r\n\r\n _minBufferSize: 0\r\n });\r\n\r\n /**\r\n * Abstract hasher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\r\n */\r\n var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Initializes a newly created hasher.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\r\n *\r\n * @example\r\n *\r\n * var hasher = CryptoJS.algo.SHA256.create();\r\n */\r\n init: function (cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this hasher to its initial state.\r\n *\r\n * @example\r\n *\r\n * hasher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-hasher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Updates this hasher with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {Hasher} This hasher.\r\n *\r\n * @example\r\n *\r\n * hasher.update('message');\r\n * hasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n // Append\r\n this._append(messageUpdate);\r\n\r\n // Update the hash\r\n this._process();\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the hash computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @example\r\n *\r\n * var hash = hasher.finalize();\r\n * var hash = hasher.finalize('message');\r\n * var hash = hasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Final message update\r\n if (messageUpdate) {\r\n this._append(messageUpdate);\r\n }\r\n\r\n // Perform concrete-hasher logic\r\n var hash = this._doFinalize();\r\n\r\n return hash;\r\n },\r\n\r\n blockSize: 512/32,\r\n\r\n /**\r\n * Creates a shortcut function to a hasher's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to create a helper for.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHelper: function (hasher) {\r\n return function (message, cfg) {\r\n return new hasher.init(cfg).finalize(message);\r\n };\r\n },\r\n\r\n /**\r\n * Creates a shortcut function to the HMAC's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to use in this HMAC helper.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHmacHelper: function (hasher) {\r\n return function (message, key) {\r\n return new C_algo.HMAC.init(hasher, key).finalize(message);\r\n };\r\n }\r\n });\r\n\r\n /**\r\n * Algorithm namespace.\r\n */\r\n var C_algo = C.algo = {};\r\n\r\n return C;\r\n}(Math));\r\n\r\nmodule.exports = CryptoJS;\r\n\r\n(function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var X32WordArray = C_lib.WordArray;\r\n\r\n /**\r\n * x64 namespace.\r\n */\r\n var C_x64 = C.x64 = {};\r\n\r\n /**\r\n * A 64-bit word.\r\n */\r\n var X64Word = C_x64.Word = Base.extend({\r\n /**\r\n * Initializes a newly created 64-bit word.\r\n *\r\n * @param {number} high The high 32 bits.\r\n * @param {number} low The low 32 bits.\r\n *\r\n * @example\r\n *\r\n * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\r\n */\r\n init: function (high, low) {\r\n this.high = high;\r\n this.low = low;\r\n }\r\n\r\n /**\r\n * Bitwise NOTs this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after negating.\r\n *\r\n * @example\r\n *\r\n * var negated = x64Word.not();\r\n */\r\n // not: function () {\r\n // var high = ~this.high;\r\n // var low = ~this.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ANDs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to AND with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ANDing.\r\n *\r\n * @example\r\n *\r\n * var anded = x64Word.and(anotherX64Word);\r\n */\r\n // and: function (word) {\r\n // var high = this.high & word.high;\r\n // var low = this.low & word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to OR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ORing.\r\n *\r\n * @example\r\n *\r\n * var ored = x64Word.or(anotherX64Word);\r\n */\r\n // or: function (word) {\r\n // var high = this.high | word.high;\r\n // var low = this.low | word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise XORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to XOR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after XORing.\r\n *\r\n * @example\r\n *\r\n * var xored = x64Word.xor(anotherX64Word);\r\n */\r\n // xor: function (word) {\r\n // var high = this.high ^ word.high;\r\n // var low = this.low ^ word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftL(25);\r\n */\r\n // shiftL: function (n) {\r\n // if (n < 32) {\r\n // var high = (this.high << n) | (this.low >>> (32 - n));\r\n // var low = this.low << n;\r\n // } else {\r\n // var high = this.low << (n - 32);\r\n // var low = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftR(7);\r\n */\r\n // shiftR: function (n) {\r\n // if (n < 32) {\r\n // var low = (this.low >>> n) | (this.high << (32 - n));\r\n // var high = this.high >>> n;\r\n // } else {\r\n // var low = this.high >>> (n - 32);\r\n // var high = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotL(25);\r\n */\r\n // rotL: function (n) {\r\n // return this.shiftL(n).or(this.shiftR(64 - n));\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotR(7);\r\n */\r\n // rotR: function (n) {\r\n // return this.shiftR(n).or(this.shiftL(64 - n));\r\n // },\r\n\r\n /**\r\n * Adds this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to add with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after adding.\r\n *\r\n * @example\r\n *\r\n * var added = x64Word.add(anotherX64Word);\r\n */\r\n // add: function (word) {\r\n // var low = (this.low + word.low) | 0;\r\n // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\r\n // var high = (this.high + word.high + carry) | 0;\r\n\r\n // return X64Word.create(high, low);\r\n // }\r\n });\r\n\r\n /**\r\n * An array of 64-bit words.\r\n *\r\n * @property {Array} words The array of CryptoJS.x64.Word objects.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var X64WordArray = C_x64.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create();\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ]);\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ], 10);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 8;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this 64-bit word array to a 32-bit word array.\r\n *\r\n * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\r\n *\r\n * @example\r\n *\r\n * var x32WordArray = x64WordArray.toX32();\r\n */\r\n toX32: function () {\r\n // Shortcuts\r\n var x64Words = this.words;\r\n var x64WordsLength = x64Words.length;\r\n\r\n // Convert\r\n var x32Words = [];\r\n for (var i = 0; i < x64WordsLength; i++) {\r\n var x64Word = x64Words[i];\r\n x32Words.push(x64Word.high);\r\n x32Words.push(x64Word.low);\r\n }\r\n\r\n return X32WordArray.create(x32Words, this.sigBytes);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {X64WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = x64WordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n\r\n // Clone \"words\" array\r\n var words = clone.words = this.words.slice(0);\r\n\r\n // Clone each X64Word object\r\n var wordsLength = words.length;\r\n for (var i = 0; i < wordsLength; i++) {\r\n words[i] = words[i].clone();\r\n }\r\n\r\n return clone;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Hasher = C_lib.Hasher;\r\n var C_x64 = C.x64;\r\n var X64Word = C_x64.Word;\r\n var X64WordArray = C_x64.WordArray;\r\n var C_algo = C.algo;\r\n\r\n function X64Word_create() {\r\n return X64Word.create.apply(X64Word, arguments);\r\n }\r\n\r\n // Constants\r\n var K = [\r\n X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\r\n X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\r\n X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\r\n X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\r\n X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\r\n X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\r\n X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\r\n X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\r\n X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\r\n X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\r\n X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\r\n X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\r\n X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\r\n X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\r\n X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\r\n X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\r\n X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\r\n X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\r\n X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\r\n X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\r\n X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\r\n X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\r\n X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\r\n X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\r\n X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\r\n X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\r\n X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\r\n X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\r\n X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\r\n X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\r\n X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\r\n X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\r\n X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\r\n X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\r\n X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\r\n X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\r\n X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\r\n X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\r\n X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\r\n X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\r\n ];\r\n\r\n // Reusable objects\r\n var W = [];\r\n (function () {\r\n for (var i = 0; i < 80; i++) {\r\n W[i] = X64Word_create();\r\n }\r\n }());\r\n\r\n /**\r\n * SHA-512 hash algorithm.\r\n */\r\n var SHA512 = C_algo.SHA512 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new X64WordArray.init([\r\n new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\r\n new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\r\n new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\r\n new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\r\n ]);\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcuts\r\n var H = this._hash.words;\r\n\r\n var H0 = H[0];\r\n var H1 = H[1];\r\n var H2 = H[2];\r\n var H3 = H[3];\r\n var H4 = H[4];\r\n var H5 = H[5];\r\n var H6 = H[6];\r\n var H7 = H[7];\r\n\r\n var H0h = H0.high;\r\n var H0l = H0.low;\r\n var H1h = H1.high;\r\n var H1l = H1.low;\r\n var H2h = H2.high;\r\n var H2l = H2.low;\r\n var H3h = H3.high;\r\n var H3l = H3.low;\r\n var H4h = H4.high;\r\n var H4l = H4.low;\r\n var H5h = H5.high;\r\n var H5l = H5.low;\r\n var H6h = H6.high;\r\n var H6l = H6.low;\r\n var H7h = H7.high;\r\n var H7l = H7.low;\r\n\r\n // Working variables\r\n var ah = H0h;\r\n var al = H0l;\r\n var bh = H1h;\r\n var bl = H1l;\r\n var ch = H2h;\r\n var cl = H2l;\r\n var dh = H3h;\r\n var dl = H3l;\r\n var eh = H4h;\r\n var el = H4l;\r\n var fh = H5h;\r\n var fl = H5l;\r\n var gh = H6h;\r\n var gl = H6l;\r\n var hh = H7h;\r\n var hl = H7l;\r\n\r\n // Rounds\r\n for (var i = 0; i < 80; i++) {\r\n var Wil;\r\n var Wih;\r\n\r\n // Shortcut\r\n var Wi = W[i];\r\n\r\n // Extend message\r\n if (i < 16) {\r\n Wih = Wi.high = M[offset + i * 2] | 0;\r\n Wil = Wi.low = M[offset + i * 2 + 1] | 0;\r\n } else {\r\n // Gamma0\r\n var gamma0x = W[i - 15];\r\n var gamma0xh = gamma0x.high;\r\n var gamma0xl = gamma0x.low;\r\n var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\r\n var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\r\n\r\n // Gamma1\r\n var gamma1x = W[i - 2];\r\n var gamma1xh = gamma1x.high;\r\n var gamma1xl = gamma1x.low;\r\n var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\r\n var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\r\n\r\n // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\r\n var Wi7 = W[i - 7];\r\n var Wi7h = Wi7.high;\r\n var Wi7l = Wi7.low;\r\n\r\n var Wi16 = W[i - 16];\r\n var Wi16h = Wi16.high;\r\n var Wi16l = Wi16.low;\r\n\r\n Wil = gamma0l + Wi7l;\r\n Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\r\n Wil = Wil + gamma1l;\r\n Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\r\n Wil = Wil + Wi16l;\r\n Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\r\n\r\n Wi.high = Wih;\r\n Wi.low = Wil;\r\n }\r\n\r\n var chh = (eh & fh) ^ (~eh & gh);\r\n var chl = (el & fl) ^ (~el & gl);\r\n var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\r\n var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\r\n\r\n var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\r\n var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\r\n var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\r\n var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\r\n\r\n // t1 = h + sigma1 + ch + K[i] + W[i]\r\n var Ki = K[i];\r\n var Kih = Ki.high;\r\n var Kil = Ki.low;\r\n\r\n var t1l = hl + sigma1l;\r\n var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\r\n var t1l = t1l + chl;\r\n var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\r\n var t1l = t1l + Kil;\r\n var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\r\n var t1l = t1l + Wil;\r\n var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\r\n\r\n // t2 = sigma0 + maj\r\n var t2l = sigma0l + majl;\r\n var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\r\n\r\n // Update working variables\r\n hh = gh;\r\n hl = gl;\r\n gh = fh;\r\n gl = fl;\r\n fh = eh;\r\n fl = el;\r\n el = (dl + t1l) | 0;\r\n eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\r\n dh = ch;\r\n dl = cl;\r\n ch = bh;\r\n cl = bl;\r\n bh = ah;\r\n bl = al;\r\n al = (t1l + t2l) | 0;\r\n ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H0l = H0.low = (H0l + al);\r\n H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\r\n H1l = H1.low = (H1l + bl);\r\n H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\r\n H2l = H2.low = (H2l + cl);\r\n H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\r\n H3l = H3.low = (H3l + dl);\r\n H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\r\n H4l = H4.low = (H4l + el);\r\n H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\r\n H5l = H5.low = (H5l + fl);\r\n H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\r\n H6l = H6.low = (H6l + gl);\r\n H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\r\n H7l = H7.low = (H7l + hl);\r\n H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Convert hash to 32-bit word array before returning\r\n var hash = this._hash.toX32();\r\n\r\n // Return final computed hash\r\n return hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n },\r\n\r\n blockSize: 1024/32\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA512('message');\r\n * var hash = CryptoJS.SHA512(wordArray);\r\n */\r\n C.SHA512 = Hasher._createHelper(SHA512);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA512(message, key);\r\n */\r\n C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\r\n}());\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * Cipher core components.\r\n */\r\nCryptoJS.lib.Cipher || (function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var Base64 = C_enc.Base64;\r\n var C_algo = C.algo;\r\n var EvpKDF = C_algo.EvpKDF;\r\n\r\n /**\r\n * Abstract base cipher template.\r\n *\r\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\r\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\r\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\r\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\r\n */\r\n var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {WordArray} iv The IV to use for this operation.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Creates this cipher in encryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createEncryptor: function (key, cfg) {\r\n return this.create(this._ENC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Creates this cipher in decryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createDecryptor: function (key, cfg) {\r\n return this.create(this._DEC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Initializes a newly created cipher.\r\n *\r\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\r\n */\r\n init: function (xformMode, key, cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Store transform mode and key\r\n this._xformMode = xformMode;\r\n this._key = key;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this cipher to its initial state.\r\n *\r\n * @example\r\n *\r\n * cipher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-cipher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Adds data to be encrypted or decrypted.\r\n *\r\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.process('data');\r\n * var encrypted = cipher.process(wordArray);\r\n */\r\n process: function (dataUpdate) {\r\n // Append\r\n this._append(dataUpdate);\r\n\r\n // Process available blocks\r\n return this._process();\r\n },\r\n\r\n /**\r\n * Finalizes the encryption or decryption process.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after final processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.finalize();\r\n * var encrypted = cipher.finalize('data');\r\n * var encrypted = cipher.finalize(wordArray);\r\n */\r\n finalize: function (dataUpdate) {\r\n // Final data update\r\n if (dataUpdate) {\r\n this._append(dataUpdate);\r\n }\r\n\r\n // Perform concrete-cipher logic\r\n var finalProcessedData = this._doFinalize();\r\n\r\n return finalProcessedData;\r\n },\r\n\r\n keySize: 128/32,\r\n\r\n ivSize: 128/32,\r\n\r\n _ENC_XFORM_MODE: 1,\r\n\r\n _DEC_XFORM_MODE: 2,\r\n\r\n /**\r\n * Creates shortcut functions to a cipher's object interface.\r\n *\r\n * @param {Cipher} cipher The cipher to create a helper for.\r\n *\r\n * @return {Object} An object with encrypt and decrypt shortcut functions.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\r\n */\r\n _createHelper: (function () {\r\n function selectCipherStrategy(key) {\r\n if (typeof key == 'string') {\r\n return PasswordBasedCipher;\r\n } else {\r\n return SerializableCipher;\r\n }\r\n }\r\n\r\n return function (cipher) {\r\n return {\r\n encrypt: function (message, key, cfg) {\r\n return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\r\n },\r\n\r\n decrypt: function (ciphertext, key, cfg) {\r\n return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\r\n }\r\n };\r\n };\r\n }())\r\n });\r\n\r\n /**\r\n * Abstract base stream cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\r\n */\r\n var StreamCipher = C_lib.StreamCipher = Cipher.extend({\r\n _doFinalize: function () {\r\n // Process partial blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 1\r\n });\r\n\r\n /**\r\n * Mode namespace.\r\n */\r\n var C_mode = C.mode = {};\r\n\r\n /**\r\n * Abstract base block cipher mode template.\r\n */\r\n var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\r\n /**\r\n * Creates this mode for encryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\r\n */\r\n createEncryptor: function (cipher, iv) {\r\n return this.Encryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Creates this mode for decryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\r\n */\r\n createDecryptor: function (cipher, iv) {\r\n return this.Decryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Initializes a newly created mode.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\r\n */\r\n init: function (cipher, iv) {\r\n this._cipher = cipher;\r\n this._iv = iv;\r\n }\r\n });\r\n\r\n /**\r\n * Cipher Block Chaining mode.\r\n */\r\n var CBC = C_mode.CBC = (function () {\r\n /**\r\n * Abstract base CBC mode.\r\n */\r\n var CBC = BlockCipherMode.extend();\r\n\r\n /**\r\n * CBC encryptor.\r\n */\r\n CBC.Encryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // XOR and encrypt\r\n xorBlock.call(this, words, offset, blockSize);\r\n cipher.encryptBlock(words, offset);\r\n\r\n // Remember this block to use with next block\r\n this._prevBlock = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n /**\r\n * CBC decryptor.\r\n */\r\n CBC.Decryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // Remember this block to use with next block\r\n var thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n // Decrypt and XOR\r\n cipher.decryptBlock(words, offset);\r\n xorBlock.call(this, words, offset, blockSize);\r\n\r\n // This block becomes the previous block\r\n this._prevBlock = thisBlock;\r\n }\r\n });\r\n\r\n function xorBlock(words, offset, blockSize) {\r\n // Shortcut\r\n var iv = this._iv;\r\n\r\n // Choose mixing block\r\n if (iv) {\r\n var block = iv;\r\n\r\n // Remove IV for subsequent blocks\r\n this._iv = undefined;\r\n } else {\r\n var block = this._prevBlock;\r\n }\r\n\r\n // XOR blocks\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return CBC;\r\n }());\r\n\r\n\r\n /**\r\n * Infinite Garble Extension mode.\r\n */\r\n var IGE = C_mode.IGE = (function () {\r\n /**\r\n * Abstract base IGE mode.\r\n */\r\n var IGE = BlockCipherMode.extend();\r\n\r\n /**\r\n * IGE encryptor.\r\n */\r\n IGE.Encryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, blockSize + blockSize);\r\n }\r\n\r\n\r\n // Remember this block to use with next block\r\n var nextIv2p = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.encryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n this._ivp = words.slice(offset, offset + blockSize);\r\n this._iv2p = nextIv2p;\r\n }\r\n });\r\n\r\n /**\r\n * IGE decryptor.\r\n */\r\n IGE.Decryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, 2 * blockSize);\r\n }\r\n\r\n // Remember this block to use with next block\r\n var nextIvp = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.decryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n this._ivp = nextIvp;\r\n this._iv2p = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n function xorBlock(words, block, offset, blockSize) {\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return IGE;\r\n }());\r\n\r\n /**\r\n * Padding namespace.\r\n */\r\n var C_pad = C.pad = {};\r\n\r\n /**\r\n * PKCS #5/7 padding strategy.\r\n */\r\n var Pkcs7 = C_pad.Pkcs7 = {\r\n /**\r\n * Pads data using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to pad.\r\n * @param {number} blockSize The multiple that the data should be padded to.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\r\n */\r\n pad: function (data, blockSize) {\r\n // Shortcut\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count padding bytes\r\n var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n // Create padding word\r\n var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\r\n\r\n // Create padding\r\n var paddingWords = [];\r\n for (var i = 0; i < nPaddingBytes; i += 4) {\r\n paddingWords.push(paddingWord);\r\n }\r\n var padding = WordArray.create(paddingWords, nPaddingBytes);\r\n\r\n // Add padding\r\n data.concat(padding);\r\n },\r\n\r\n /**\r\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to unpad.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\r\n */\r\n unpad: function (data) {\r\n // Get number of padding bytes from last byte\r\n var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n // Remove padding\r\n data.sigBytes -= nPaddingBytes;\r\n }\r\n };\r\n\r\n var NoPadding = C_pad.NoPadding = {\r\n pad: function () {\r\n },\r\n\r\n unpad: function () {\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Abstract base block cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\r\n */\r\n var BlockCipher = C_lib.BlockCipher = Cipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Mode} mode The block mode to use. Default: CBC\r\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\r\n */\r\n cfg: Cipher.cfg.extend({\r\n mode: CBC,\r\n padding: Pkcs7\r\n }),\r\n\r\n reset: function () {\r\n // Reset cipher\r\n Cipher.reset.call(this);\r\n\r\n // Shortcuts\r\n var cfg = this.cfg;\r\n var iv = cfg.iv;\r\n var mode = cfg.mode;\r\n\r\n // Reset block mode\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n var modeCreator = mode.createEncryptor;\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n var modeCreator = mode.createDecryptor;\r\n\r\n // Keep at least one block in the buffer for unpadding\r\n this._minBufferSize = 1;\r\n }\r\n this._mode = modeCreator.call(mode, this, iv && iv.words);\r\n },\r\n\r\n _doProcessBlock: function (words, offset) {\r\n this._mode.processBlock(words, offset);\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcut\r\n var padding = this.cfg.padding;\r\n\r\n // Finalize\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n // Pad data\r\n padding.pad(this._data, this.blockSize);\r\n\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n // Unpad data\r\n padding.unpad(finalProcessedBlocks);\r\n }\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 128/32\r\n });\r\n\r\n /**\r\n * A collection of cipher parameters.\r\n *\r\n * @property {WordArray} ciphertext The raw ciphertext.\r\n * @property {WordArray} key The key to this ciphertext.\r\n * @property {WordArray} iv The IV used in the ciphering operation.\r\n * @property {WordArray} salt The salt used with a key derivation function.\r\n * @property {Cipher} algorithm The cipher algorithm.\r\n * @property {Mode} mode The block mode used in the ciphering operation.\r\n * @property {Padding} padding The padding scheme used in the ciphering operation.\r\n * @property {number} blockSize The block size of the cipher.\r\n * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\r\n */\r\n var CipherParams = C_lib.CipherParams = Base.extend({\r\n /**\r\n * Initializes a newly created cipher params object.\r\n *\r\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.lib.CipherParams.create({\r\n * ciphertext: ciphertextWordArray,\r\n * key: keyWordArray,\r\n * iv: ivWordArray,\r\n * salt: saltWordArray,\r\n * algorithm: CryptoJS.algo.AES,\r\n * mode: CryptoJS.mode.CBC,\r\n * padding: CryptoJS.pad.PKCS7,\r\n * blockSize: 4,\r\n * formatter: CryptoJS.format.OpenSSL\r\n * });\r\n */\r\n init: function (cipherParams) {\r\n this.mixIn(cipherParams);\r\n },\r\n\r\n /**\r\n * Converts this cipher params object to a string.\r\n *\r\n * @param {Format} formatter (Optional) The formatting strategy to use.\r\n *\r\n * @return {string} The stringified cipher params.\r\n *\r\n * @throws Error If neither the formatter nor the default formatter is set.\r\n *\r\n * @example\r\n *\r\n * var string = cipherParams + '';\r\n * var string = cipherParams.toString();\r\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\r\n */\r\n toString: function (formatter) {\r\n return (formatter || this.formatter).stringify(this);\r\n }\r\n });\r\n\r\n /**\r\n * Format namespace.\r\n */\r\n var C_format = C.format = {};\r\n\r\n /**\r\n * OpenSSL formatting strategy.\r\n */\r\n var OpenSSLFormatter = C_format.OpenSSL = {\r\n /**\r\n * Converts a cipher params object to an OpenSSL-compatible string.\r\n *\r\n * @param {CipherParams} cipherParams The cipher params object.\r\n *\r\n * @return {string} The OpenSSL-compatible string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\r\n */\r\n stringify: function (cipherParams) {\r\n // Shortcuts\r\n var ciphertext = cipherParams.ciphertext;\r\n var salt = cipherParams.salt;\r\n\r\n // Format\r\n if (salt) {\r\n var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\r\n } else {\r\n var wordArray = ciphertext;\r\n }\r\n\r\n return wordArray.toString(Base64);\r\n },\r\n\r\n /**\r\n * Converts an OpenSSL-compatible string to a cipher params object.\r\n *\r\n * @param {string} openSSLStr The OpenSSL-compatible string.\r\n *\r\n * @return {CipherParams} The cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\r\n */\r\n parse: function (openSSLStr) {\r\n // Parse base64\r\n var ciphertext = Base64.parse(openSSLStr);\r\n\r\n // Shortcut\r\n var ciphertextWords = ciphertext.words;\r\n\r\n // Test for salt\r\n if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\r\n // Extract salt\r\n var salt = WordArray.create(ciphertextWords.slice(2, 4));\r\n\r\n // Remove salt from ciphertext\r\n ciphertextWords.splice(0, 4);\r\n ciphertext.sigBytes -= 16;\r\n }\r\n\r\n return CipherParams.create({ ciphertext: ciphertext, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\r\n */\r\n var SerializableCipher = C_lib.SerializableCipher = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\r\n */\r\n cfg: Base.extend({\r\n format: OpenSSLFormatter\r\n }),\r\n\r\n /**\r\n * Encrypts a message.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Encrypt\r\n var encryptor = cipher.createEncryptor(key, cfg);\r\n var ciphertext = encryptor.finalize(message);\r\n\r\n // Shortcut\r\n var cipherCfg = encryptor.cfg;\r\n\r\n // Create and return serializable cipher params\r\n return CipherParams.create({\r\n ciphertext: ciphertext,\r\n key: key,\r\n iv: cipherCfg.iv,\r\n algorithm: cipher,\r\n mode: cipherCfg.mode,\r\n padding: cipherCfg.padding,\r\n blockSize: cipher.blockSize,\r\n formatter: cfg.format\r\n });\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Decrypt\r\n var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\r\n\r\n return plaintext;\r\n },\r\n\r\n /**\r\n * Converts serialized ciphertext to CipherParams,\r\n * else assumed CipherParams already and returns ciphertext unchanged.\r\n *\r\n * @param {CipherParams|string} ciphertext The ciphertext.\r\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\r\n *\r\n * @return {CipherParams} The unserialized ciphertext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\r\n */\r\n _parse: function (ciphertext, format) {\r\n if (typeof ciphertext == 'string') {\r\n return format.parse(ciphertext, this);\r\n } else {\r\n return ciphertext;\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * Key derivation function namespace.\r\n */\r\n var C_kdf = C.kdf = {};\r\n\r\n /**\r\n * OpenSSL key derivation function.\r\n */\r\n var OpenSSLKdf = C_kdf.OpenSSL = {\r\n /**\r\n * Derives a key and IV from a password.\r\n *\r\n * @param {string} password The password to derive from.\r\n * @param {number} keySize The size in words of the key to generate.\r\n * @param {number} ivSize The size in words of the IV to generate.\r\n * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\r\n *\r\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\r\n */\r\n execute: function (password, keySize, ivSize, salt) {\r\n // Generate random salt\r\n if (!salt) {\r\n salt = WordArray.random(64/8);\r\n }\r\n\r\n // Derive key and IV\r\n var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\r\n\r\n // Separate key and IV\r\n var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\r\n key.sigBytes = keySize * 4;\r\n\r\n // Return params\r\n return CipherParams.create({ key: key, iv: iv, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A serializable cipher wrapper that derives the key from a password,\r\n * and returns ciphertext as a serializable cipher params object.\r\n */\r\n var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\r\n */\r\n cfg: SerializableCipher.cfg.extend({\r\n kdf: OpenSSLKdf\r\n }),\r\n\r\n /**\r\n * Encrypts a message using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Encrypt\r\n var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\r\n\r\n // Mix in derived params\r\n ciphertext.mixIn(derivedParams);\r\n\r\n return ciphertext;\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Decrypt\r\n var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\r\n\r\n return plaintext;\r\n }\r\n });\r\n}());\r\n\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var BlockCipher = C_lib.BlockCipher;\r\n var C_algo = C.algo;\r\n\r\n // Lookup tables\r\n var SBOX = [];\r\n var INV_SBOX = [];\r\n var SUB_MIX_0 = [];\r\n var SUB_MIX_1 = [];\r\n var SUB_MIX_2 = [];\r\n var SUB_MIX_3 = [];\r\n var INV_SUB_MIX_0 = [];\r\n var INV_SUB_MIX_1 = [];\r\n var INV_SUB_MIX_2 = [];\r\n var INV_SUB_MIX_3 = [];\r\n\r\n // Compute lookup tables\r\n (function () {\r\n // Compute double table\r\n var d = [];\r\n for (var i = 0; i < 256; i++) {\r\n if (i < 128) {\r\n d[i] = i << 1;\r\n } else {\r\n d[i] = (i << 1) ^ 0x11b;\r\n }\r\n }\r\n\r\n // Walk GF(2^8)\r\n var x = 0;\r\n var xi = 0;\r\n for (var i = 0; i < 256; i++) {\r\n // Compute sbox\r\n var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\r\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\r\n SBOX[x] = sx;\r\n INV_SBOX[sx] = x;\r\n\r\n // Compute multiplication\r\n var x2 = d[x];\r\n var x4 = d[x2];\r\n var x8 = d[x4];\r\n\r\n // Compute sub bytes, mix columns tables\r\n var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\r\n SUB_MIX_0[x] = (t << 24) | (t >>> 8);\r\n SUB_MIX_1[x] = (t << 16) | (t >>> 16);\r\n SUB_MIX_2[x] = (t << 8) | (t >>> 24);\r\n SUB_MIX_3[x] = t;\r\n\r\n // Compute inv sub bytes, inv mix columns tables\r\n var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\r\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\r\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\r\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\r\n INV_SUB_MIX_3[sx] = t;\r\n\r\n // Compute next counter\r\n if (!x) {\r\n x = xi = 1;\r\n } else {\r\n x = x2 ^ d[d[d[x8 ^ x2]]];\r\n xi ^= d[d[xi]];\r\n }\r\n }\r\n }());\r\n\r\n // Precomputed Rcon lookup\r\n var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n /**\r\n * AES block cipher algorithm.\r\n */\r\n var AES = C_algo.AES = BlockCipher.extend({\r\n _doReset: function () {\r\n // Shortcuts\r\n var key = this._key;\r\n var keyWords = key.words;\r\n var keySize = key.sigBytes / 4;\r\n\r\n // Compute number of rounds\r\n var nRounds = this._nRounds = keySize + 6\r\n\r\n // Compute number of key schedule rows\r\n var ksRows = (nRounds + 1) * 4;\r\n\r\n // Compute key schedule\r\n var keySchedule = this._keySchedule = [];\r\n for (var ksRow = 0; ksRow < ksRows; ksRow++) {\r\n if (ksRow < keySize) {\r\n keySchedule[ksRow] = keyWords[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 1];\r\n\r\n if (!(ksRow % keySize)) {\r\n // Rot word\r\n t = (t << 8) | (t >>> 24);\r\n\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\r\n // Mix Rcon\r\n t ^= RCON[(ksRow / keySize) | 0] << 24;\r\n } else if (keySize > 6 && ksRow % keySize == 4) {\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n }\r\n\r\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\r\n }\r\n }\r\n\r\n // Compute inv key schedule\r\n var invKeySchedule = this._invKeySchedule = [];\r\n for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\r\n var ksRow = ksRows - invKsRow;\r\n\r\n if (invKsRow % 4) {\r\n var t = keySchedule[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 4];\r\n }\r\n\r\n if (invKsRow < 4 || ksRow <= 4) {\r\n invKeySchedule[invKsRow] = t;\r\n } else {\r\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\r\n INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\r\n }\r\n }\r\n },\r\n\r\n encryptBlock: function (M, offset) {\r\n this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\r\n },\r\n\r\n decryptBlock: function (M, offset) {\r\n // Swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n\r\n this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\r\n\r\n // Inv swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n },\r\n\r\n _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\r\n // Shortcut\r\n var nRounds = this._nRounds;\r\n\r\n // Get input, add round key\r\n var s0 = M[offset] ^ keySchedule[0];\r\n var s1 = M[offset + 1] ^ keySchedule[1];\r\n var s2 = M[offset + 2] ^ keySchedule[2];\r\n var s3 = M[offset + 3] ^ keySchedule[3];\r\n\r\n // Key schedule row counter\r\n var ksRow = 4;\r\n\r\n // Rounds\r\n for (var round = 1; round < nRounds; round++) {\r\n // Shift rows, sub bytes, mix columns, add round key\r\n var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\r\n var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\r\n var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\r\n var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\r\n\r\n // Update state\r\n s0 = t0;\r\n s1 = t1;\r\n s2 = t2;\r\n s3 = t3;\r\n }\r\n\r\n // Shift rows, sub bytes, add round key\r\n var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\r\n var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\r\n var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\r\n var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\r\n\r\n // Set output\r\n M[offset] = t0;\r\n M[offset + 1] = t1;\r\n M[offset + 2] = t2;\r\n M[offset + 3] = t3;\r\n },\r\n\r\n keySize: 256/32\r\n });\r\n\r\n /**\r\n * Shortcut functions to the cipher's object interface.\r\n *\r\n * @example\r\n *\r\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\r\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\r\n */\r\n C.AES = BlockCipher._createHelper(AES);\r\n}());\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function (Math) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var WordArray = C_lib.WordArray;\r\n var Hasher = C_lib.Hasher;\r\n var C_algo = C.algo;\r\n\r\n // Initialization and round constants tables\r\n var H = [];\r\n var K = [];\r\n\r\n // Compute constants\r\n (function () {\r\n function isPrime(n) {\r\n var sqrtN = Math.sqrt(n);\r\n for (var factor = 2; factor <= sqrtN; factor++) {\r\n if (!(n % factor)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function getFractionalBits(n) {\r\n return ((n - (n | 0)) * 0x100000000) | 0;\r\n }\r\n\r\n var n = 2;\r\n var nPrime = 0;\r\n while (nPrime < 64) {\r\n if (isPrime(n)) {\r\n if (nPrime < 8) {\r\n H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\r\n }\r\n K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\r\n\r\n nPrime++;\r\n }\r\n\r\n n++;\r\n }\r\n }());\r\n\r\n // Reusable object\r\n var W = [];\r\n\r\n /**\r\n * SHA-256 hash algorithm.\r\n */\r\n var SHA256 = C_algo.SHA256 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new WordArray.init(H.slice(0));\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcut\r\n var H = this._hash.words;\r\n\r\n // Working variables\r\n var a = H[0];\r\n var b = H[1];\r\n var c = H[2];\r\n var d = H[3];\r\n var e = H[4];\r\n var f = H[5];\r\n var g = H[6];\r\n var h = H[7];\r\n\r\n // Computation\r\n for (var i = 0; i < 64; i++) {\r\n if (i < 16) {\r\n W[i] = M[offset + i] | 0;\r\n } else {\r\n var gamma0x = W[i - 15];\r\n var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\r\n ((gamma0x << 14) | (gamma0x >>> 18)) ^\r\n (gamma0x >>> 3);\r\n\r\n var gamma1x = W[i - 2];\r\n var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\r\n ((gamma1x << 13) | (gamma1x >>> 19)) ^\r\n (gamma1x >>> 10);\r\n\r\n W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\r\n }\r\n\r\n var ch = (e & f) ^ (~e & g);\r\n var maj = (a & b) ^ (a & c) ^ (b & c);\r\n\r\n var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\r\n var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\r\n\r\n var t1 = h + sigma1 + ch + K[i] + W[i];\r\n var t2 = sigma0 + maj;\r\n\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + t1) | 0;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (t1 + t2) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H[0] = (H[0] + a) | 0;\r\n H[1] = (H[1] + b) | 0;\r\n H[2] = (H[2] + c) | 0;\r\n H[3] = (H[3] + d) | 0;\r\n H[4] = (H[4] + e) | 0;\r\n H[5] = (H[5] + f) | 0;\r\n H[6] = (H[6] + g) | 0;\r\n H[7] = (H[7] + h) | 0;\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Return final computed hash\r\n return this._hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n }\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA256('message');\r\n * var hash = CryptoJS.SHA256(wordArray);\r\n */\r\n C.SHA256 = Hasher._createHelper(SHA256);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA256(message, key);\r\n */\r\n C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\r\n}(Math));\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var C_algo = C.algo;\r\n\r\n /**\r\n * HMAC algorithm.\r\n */\r\n var HMAC = C_algo.HMAC = Base.extend({\r\n /**\r\n * Initializes a newly created HMAC.\r\n *\r\n * @param {Hasher} hasher The hash algorithm to use.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @example\r\n *\r\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\r\n */\r\n init: function (hasher, key) {\r\n // Init hasher\r\n hasher = this._hasher = new hasher.init();\r\n\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof key == 'string') {\r\n key = Utf8.parse(key);\r\n }\r\n\r\n // Shortcuts\r\n var hasherBlockSize = hasher.blockSize;\r\n var hasherBlockSizeBytes = hasherBlockSize * 4;\r\n\r\n // Allow arbitrary length keys\r\n if (key.sigBytes > hasherBlockSizeBytes) {\r\n key = hasher.finalize(key);\r\n }\r\n\r\n // Clamp excess bits\r\n key.clamp();\r\n\r\n // Clone key for inner and outer pads\r\n var oKey = this._oKey = key.clone();\r\n var iKey = this._iKey = key.clone();\r\n\r\n // Shortcuts\r\n var oKeyWords = oKey.words;\r\n var iKeyWords = iKey.words;\r\n\r\n // XOR keys with pad constants\r\n for (var i = 0; i < hasherBlockSize; i++) {\r\n oKeyWords[i] ^= 0x5c5c5c5c;\r\n iKeyWords[i] ^= 0x36363636;\r\n }\r\n oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this HMAC to its initial state.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.reset();\r\n */\r\n reset: function () {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Reset\r\n hasher.reset();\r\n hasher.update(this._iKey);\r\n },\r\n\r\n /**\r\n * Updates this HMAC with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {HMAC} This HMAC instance.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.update('message');\r\n * hmacHasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n this._hasher.update(messageUpdate);\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the HMAC computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @example\r\n *\r\n * var hmac = hmacHasher.finalize();\r\n * var hmac = hmacHasher.finalize('message');\r\n * var hmac = hmacHasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Compute HMAC\r\n var innerHash = hasher.finalize(messageUpdate);\r\n hasher.reset();\r\n var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\r\n\r\n return hmac;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var C_algo = C.algo;\r\n var SHA1 = C_algo.SHA1;\r\n var HMAC = C_algo.HMAC;\r\n\r\n /**\r\n * Password-Based Key Derivation Function 2 algorithm.\r\n */\r\n var PBKDF2 = C_algo.PBKDF2 = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n * @property {Hasher} hasher The hasher to use. Default: SHA1\r\n * @property {number} iterations The number of iterations to perform. Default: 1\r\n */\r\n cfg: Base.extend({\r\n keySize: 128/32,\r\n hasher: SHA1,\r\n iterations: 1\r\n }),\r\n\r\n /**\r\n * Initializes a newly created key derivation function.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n *\r\n * @example\r\n *\r\n * var kdf = CryptoJS.algo.PBKDF2.create();\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\r\n */\r\n init: function (cfg) {\r\n this.cfg = this.cfg.extend(cfg);\r\n },\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @example\r\n *\r\n * var key = kdf.compute(password, salt);\r\n */\r\n compute: function (password, salt) {\r\n // Shortcut\r\n var cfg = this.cfg;\r\n\r\n // Init HMAC\r\n var hmac = HMAC.create(cfg.hasher, password);\r\n\r\n // Initial values\r\n var derivedKey = WordArray.create();\r\n var blockIndex = WordArray.create([0x00000001]);\r\n\r\n // Shortcuts\r\n var derivedKeyWords = derivedKey.words;\r\n var blockIndexWords = blockIndex.words;\r\n var keySize = cfg.keySize;\r\n var iterations = cfg.iterations;\r\n\r\n // Generate key\r\n while (derivedKeyWords.length < keySize) {\r\n var block = hmac.update(salt).finalize(blockIndex);\r\n hmac.reset();\r\n\r\n // Shortcuts\r\n var blockWords = block.words;\r\n var blockWordsLength = blockWords.length;\r\n\r\n // Iterations\r\n var intermediate = block;\r\n for (var i = 1; i < iterations; i++) {\r\n intermediate = hmac.finalize(intermediate);\r\n hmac.reset();\r\n\r\n // Shortcut\r\n var intermediateWords = intermediate.words;\r\n\r\n // XOR intermediate with block\r\n for (var j = 0; j < blockWordsLength; j++) {\r\n blockWords[j] ^= intermediateWords[j];\r\n }\r\n }\r\n\r\n derivedKey.concat(block);\r\n blockIndexWords[0]++;\r\n }\r\n derivedKey.sigBytes = keySize * 4;\r\n\r\n return derivedKey;\r\n }\r\n });\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var key = CryptoJS.PBKDF2(password, salt);\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\r\n */\r\n C.PBKDF2 = function (password, salt, cfg) {\r\n return PBKDF2.create(cfg).compute(password, salt);\r\n };\r\n}());\r\n"
},
{
"id": 36,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/closure_long.js",
"name": "./src/lib/closure_long.js",
"index": 28,
"index2": 24,
"size": 24517,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 1,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 730,
"building": 227
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./closure_long.js",
"loc": "64:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "// Copyright 2009 The Closure Library Authors. All Rights Reserved.\r\n//\r\n// Licensed under the Apache License, Version 2.0 (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.apache.org/licenses/LICENSE-2.0\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n\r\n/**\r\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\r\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\r\n * implementation is derived from LongLib in GWT.\r\n *\r\n */\r\n\r\n/**\r\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\r\n * See keyword `MODIFICATION` in source code.\r\n */\r\n\r\n/*! MODIFICATION\r\nThe following line was added by Igor Zhukov in order to make library compatibile with other app parts\r\n*/\r\nvar goog = {\r\n provide: function () {}, \r\n math: {\r\n Long: {\r\n ZERO: undefined,\r\n fromString: undefined,\r\n ONE: undefined,\r\n fromInt: undefined\r\n }\r\n }\r\n};\r\nthis.goog = goog;\r\n\r\n\r\ngoog.provide('goog.math.Long');\r\n\r\n\r\n\r\n/**\r\n * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\r\n * values as *signed* integers. See the from* functions below for more\r\n * convenient ways of constructing Longs.\r\n *\r\n * The internal representation of a long is the two given signed, 32-bit values.\r\n * We use 32-bit pieces because these are the size of integers on which\r\n * Javascript performs bit-operations. For operations like addition and\r\n * multiplication, we split each number into 16-bit pieces, which can easily be\r\n * multiplied within Javascript's floating-point representation without overflow\r\n * or change in sign.\r\n *\r\n * In the algorithms below, we frequently reduce the negative case to the\r\n * positive case by negating the input(s) and then post-processing the result.\r\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n * a positive number, it overflows back into a negative). Not handling this\r\n * case would often result in infinite recursion.\r\n *\r\n * @param {number} low The low (signed) 32 bits of the long.\r\n * @param {number} high The high (signed) 32 bits of the long.\r\n * @constructor\r\n */\r\ngoog.math.Long = function(low, high) {\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.low_ = low | 0; // force into 32 signed bits.\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.high_ = high | 0; // force into 32 signed bits.\r\n};\r\n\r\n\r\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\r\n// from* methods on which they depend.\r\n\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @private\r\n */\r\ngoog.math.Long.IntCache_ = {};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given (32-bit) integer value.\r\n * @param {number} value The 32-bit integer in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromInt = function(value) {\r\n if (-128 <= value && value < 128) {\r\n var cachedObj = goog.math.Long.IntCache_[value];\r\n if (cachedObj) {\r\n return cachedObj;\r\n }\r\n }\r\n\r\n var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\r\n if (-128 <= value && value < 128) {\r\n goog.math.Long.IntCache_[value] = obj;\r\n }\r\n return obj;\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite\r\n * number. Otherwise, zero is returned.\r\n * @param {number} value The number in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromNumber = function(value) {\r\n if (isNaN(value) || !isFinite(value)) {\r\n return goog.math.Long.ZERO;\r\n } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MAX_VALUE;\r\n } else if (value < 0) {\r\n return goog.math.Long.fromNumber(-value).negate();\r\n } else {\r\n return new goog.math.Long(\r\n (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\r\n (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the 64-bit integer that comes by concatenating\r\n * the given high and low bits. Each is assumed to use 32 bits.\r\n * @param {number} lowBits The low 32-bits.\r\n * @param {number} highBits The high 32-bits.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromBits = function(lowBits, highBits) {\r\n return new goog.math.Long(lowBits, highBits);\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the given\r\n * radix.\r\n * @param {string} str The textual representation of the Long.\r\n * @param {number=} opt_radix The radix in which the text is written.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromString = function(str, opt_radix) {\r\n if (str.length == 0) {\r\n throw Error('number format error: empty string');\r\n }\r\n\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (str.charAt(0) == '-') {\r\n return goog.math.Long.fromString(str.substring(1), radix).negate();\r\n } else if (str.indexOf('-') >= 0) {\r\n throw Error('number format error: interior \"-\" character: ' + str);\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\r\n\r\n var result = goog.math.Long.ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i);\r\n var value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = goog.math.Long.fromNumber(Math.pow(radix, size));\r\n result = result.multiply(power).add(goog.math.Long.fromNumber(value));\r\n } else {\r\n result = result.multiply(radixToPower);\r\n result = result.add(goog.math.Long.fromNumber(value));\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove\r\n// these variables, so there should be no runtime penalty for these.\r\n\r\n\r\n/**\r\n * Number used repeated below in calculations. This must appear before the\r\n * first call to any from* function below.\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_32_DBL_ =\r\n goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_31_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ / 2;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_48_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_64_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_63_DBL_ =\r\n goog.math.Long.TWO_PWR_64_DBL_ / 2;\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ZERO = goog.math.Long.fromInt(0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ONE = goog.math.Long.fromInt(1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MAX_VALUE =\r\n goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\r\n\r\n\r\n/**\r\n * @type {!goog.math.Long}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\r\n\r\n\r\n/** @return {number} The value, assuming it is a 32-bit integer. */\r\ngoog.math.Long.prototype.toInt = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The closest floating-point representation to this value. */\r\ngoog.math.Long.prototype.toNumber = function() {\r\n return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\r\n this.getLowBitsUnsigned();\r\n};\r\n\r\n\r\n/**\r\n * @param {number=} opt_radix The radix in which the text should be written.\r\n * @return {string} The textual representation of this value.\r\n * @override\r\n */\r\ngoog.math.Long.prototype.toString = function(opt_radix) {\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (this.isZero()) {\r\n return '0';\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = goog.math.Long.fromNumber(radix);\r\n var div = this.div(radixLong);\r\n var rem = div.multiply(radixLong).subtract(this);\r\n return div.toString(radix) + rem.toInt().toString(radix);\r\n } else {\r\n return '-' + this.negate().toString(radix);\r\n }\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\r\n\r\n var rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower);\r\n var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\r\n var digits = intval.toString(radix);\r\n\r\n rem = remDiv;\r\n if (rem.isZero()) {\r\n return digits + result;\r\n } else {\r\n while (digits.length < 6) {\r\n digits = '0' + digits;\r\n }\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n\r\n/** @return {number} The high 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getHighBits = function() {\r\n return this.high_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getLowBits = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as an unsigned value. */\r\ngoog.math.Long.prototype.getLowBitsUnsigned = function() {\r\n return (this.low_ >= 0) ?\r\n this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\r\n};\r\n\r\n\r\n/**\r\n * @return {number} Returns the number of bits needed to represent the absolute\r\n * value of this Long.\r\n */\r\ngoog.math.Long.prototype.getNumBitsAbs = function() {\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return 64;\r\n } else {\r\n return this.negate().getNumBitsAbs();\r\n }\r\n } else {\r\n var val = this.high_ != 0 ? this.high_ : this.low_;\r\n for (var bit = 31; bit > 0; bit--) {\r\n if ((val & (1 << bit)) != 0) {\r\n break;\r\n }\r\n }\r\n return this.high_ != 0 ? bit + 33 : bit + 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is zero. */\r\ngoog.math.Long.prototype.isZero = function() {\r\n return this.high_ == 0 && this.low_ == 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is negative. */\r\ngoog.math.Long.prototype.isNegative = function() {\r\n return this.high_ < 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is odd. */\r\ngoog.math.Long.prototype.isOdd = function() {\r\n return (this.low_ & 1) == 1;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long equals the other.\r\n */\r\ngoog.math.Long.prototype.equals = function(other) {\r\n return (this.high_ == other.high_) && (this.low_ == other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long does not equal the other.\r\n */\r\ngoog.math.Long.prototype.notEquals = function(other) {\r\n return (this.high_ != other.high_) || (this.low_ != other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than the other.\r\n */\r\ngoog.math.Long.prototype.lessThan = function(other) {\r\n return this.compare(other) < 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.lessThanOrEqual = function(other) {\r\n return this.compare(other) <= 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than the other.\r\n */\r\ngoog.math.Long.prototype.greaterThan = function(other) {\r\n return this.compare(other) > 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.greaterThanOrEqual = function(other) {\r\n return this.compare(other) >= 0;\r\n};\r\n\r\n\r\n/**\r\n * Compares this Long with the given one.\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\r\n * if the given one is greater.\r\n */\r\ngoog.math.Long.prototype.compare = function(other) {\r\n if (this.equals(other)) {\r\n return 0;\r\n }\r\n\r\n var thisNeg = this.isNegative();\r\n var otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg) {\r\n return -1;\r\n }\r\n if (!thisNeg && otherNeg) {\r\n return 1;\r\n }\r\n\r\n // at this point, the signs are the same, so subtraction will not overflow\r\n if (this.subtract(other).isNegative()) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The negation of this value. */\r\ngoog.math.Long.prototype.negate = function() {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else {\r\n return this.not().add(goog.math.Long.ONE);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns the sum of this and the given Long.\r\n * @param {goog.math.Long} other Long to add to this one.\r\n * @return {!goog.math.Long} The sum of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.add = function(other) {\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns the difference of this and the given Long.\r\n * @param {goog.math.Long} other Long to subtract from this.\r\n * @return {!goog.math.Long} The difference of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.subtract = function(other) {\r\n return this.add(other.negate());\r\n};\r\n\r\n\r\n/**\r\n * Returns the product of this and the given long.\r\n * @param {goog.math.Long} other Long to multiply with this.\r\n * @return {!goog.math.Long} The product of this and the other.\r\n */\r\ngoog.math.Long.prototype.multiply = function(other) {\r\n if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n } else if (other.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().multiply(other.negate());\r\n } else {\r\n return this.negate().multiply(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.multiply(other.negate()).negate();\r\n }\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\r\n other.lessThan(goog.math.Long.TWO_PWR_24_)) {\r\n return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\r\n }\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long divided by the given one.\r\n * @param {goog.math.Long} other Long by which to divide.\r\n * @return {!goog.math.Long} This Long divided by the given one.\r\n */\r\ngoog.math.Long.prototype.div = function(other) {\r\n if (other.isZero()) {\r\n throw Error('division by zero');\r\n } else if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n if (other.equals(goog.math.Long.ONE) ||\r\n other.equals(goog.math.Long.NEG_ONE)) {\r\n return goog.math.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ONE;\r\n } else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shiftRight(1);\r\n var approx = halfThis.div(other).shiftLeft(1);\r\n if (approx.equals(goog.math.Long.ZERO)) {\r\n return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\r\n } else {\r\n var rem = this.subtract(other.multiply(approx));\r\n var result = approx.add(rem.div(other));\r\n return result;\r\n }\r\n }\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().div(other.negate());\r\n } else {\r\n return this.negate().div(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.div(other.negate()).negate();\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n var res = goog.math.Long.ZERO;\r\n var rem = this;\r\n while (rem.greaterThanOrEqual(other)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2);\r\n var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n var approxRes = goog.math.Long.fromNumber(approx);\r\n var approxRem = approxRes.multiply(other);\r\n while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\r\n approx -= delta;\r\n approxRes = goog.math.Long.fromNumber(approx);\r\n approxRem = approxRes.multiply(other);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero()) {\r\n approxRes = goog.math.Long.ONE;\r\n }\r\n\r\n res = res.add(approxRes);\r\n rem = rem.subtract(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long modulo the given one.\r\n * @param {goog.math.Long} other Long by which to mod.\r\n * @return {!goog.math.Long} This Long modulo the given one.\r\n */\r\ngoog.math.Long.prototype.modulo = function(other) {\r\n return this.subtract(this.div(other).multiply(other));\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The bitwise-NOT of this value. */\r\ngoog.math.Long.prototype.not = function() {\r\n return goog.math.Long.fromBits(~this.low_, ~this.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-AND of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to AND.\r\n * @return {!goog.math.Long} The bitwise-AND of this and the other.\r\n */\r\ngoog.math.Long.prototype.and = function(other) {\r\n return goog.math.Long.fromBits(this.low_ & other.low_,\r\n this.high_ & other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-OR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to OR.\r\n * @return {!goog.math.Long} The bitwise-OR of this and the other.\r\n */\r\ngoog.math.Long.prototype.or = function(other) {\r\n return goog.math.Long.fromBits(this.low_ | other.low_,\r\n this.high_ | other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-XOR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to XOR.\r\n * @return {!goog.math.Long} The bitwise-XOR of this and the other.\r\n */\r\ngoog.math.Long.prototype.xor = function(other) {\r\n return goog.math.Long.fromBits(this.low_ ^ other.low_,\r\n this.high_ ^ other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the left by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftLeft = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var low = this.low_;\r\n if (numBits < 32) {\r\n var high = this.high_;\r\n return goog.math.Long.fromBits(\r\n low << numBits,\r\n (high << numBits) | (low >>> (32 - numBits)));\r\n } else {\r\n return goog.math.Long.fromBits(0, low << (numBits - 32));\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftRight = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >> numBits);\r\n } else {\r\n return goog.math.Long.fromBits(\r\n high >> (numBits - 32),\r\n high >= 0 ? 0 : -1);\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount, with\r\n * the new top bits matching the current sign bit.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount, with\r\n * zeros placed into the new leading bits.\r\n */\r\ngoog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >>> numBits);\r\n } else if (numBits == 32) {\r\n return goog.math.Long.fromBits(high, 0);\r\n } else {\r\n return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\r\n }\r\n }\r\n};"
},
{
"id": 37,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/worker-loader/dist/cjs.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"index": 32,
"index2": 28,
"size": 113,
"cacheable": false,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"issuerId": 16,
"issuerName": "./src/lib/cryptoworker.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 16,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"name": "./src/lib/cryptoworker.ts",
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
}
}
],
"profile": {
"factory": 703,
"building": 1361
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 16,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cryptoworker.ts",
"module": "./src/lib/cryptoworker.ts",
"moduleName": "./src/lib/cryptoworker.ts",
"type": "cjs require",
"userRequest": "./crypto.worker.js",
"loc": "9:41-70"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "module.exports = function() {\n return new Worker(__webpack_public_path__ + \"c05c8d5242c7b2494d71.worker.js\");\n};"
},
{
"id": 38,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/idb.ts",
"name": "./src/lib/idb.ts",
"index": 34,
"index2": 31,
"size": 8481,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./idb",
"loc": "62:28-44"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"./bin_utils\");\nvar filemanager_1 = __importDefault(require(\"./filemanager\"));\nvar IdbFileStorage = /** @class */ (function () {\n function IdbFileStorage() {\n this.dbName = 'cachedFiles';\n this.dbStoreName = 'files';\n this.dbVersion = 2;\n this.name = 'IndexedDB';\n // @ts-ignore\n //window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;\n // @ts-ignore\n window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.OIDBTransaction || window.msIDBTransaction;\n this.storageIsAvailable = window.indexedDB !== undefined && window.IDBTransaction !== undefined;\n // IndexedDB is REALLY slow without blob support in Safari 8, no point in it\n if (this.storageIsAvailable &&\n navigator.userAgent.indexOf('Safari') != -1 &&\n navigator.userAgent.indexOf('Chrome') == -1 &&\n navigator.userAgent.match(/Version\\/[678]/)) {\n this.storageIsAvailable = false;\n }\n this.storeBlobsAvailable = this.storageIsAvailable || false;\n this.openDatabase();\n }\n IdbFileStorage.prototype.isAvailable = function () {\n return this.storageIsAvailable;\n };\n IdbFileStorage.prototype.openDatabase = function () {\n var _this = this;\n if (this.openDbPromise) {\n return this.openDbPromise;\n }\n var createObjectStore;\n try {\n var request = indexedDB.open(this.dbName, this.dbVersion);\n createObjectStore = function (db) {\n db.createObjectStore(_this.dbStoreName);\n };\n if (!request) {\n throw new Error();\n }\n }\n catch (error) {\n console.error('error opening db', error.message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n var finished = false;\n setTimeout(function () {\n if (!finished) {\n request.onerror({ type: 'IDB_CREATE_TIMEOUT' });\n }\n }, 3000);\n return this.openDbPromise = new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n finished = true;\n var db = request.result;\n db.onerror = function (error) {\n _this.storageIsAvailable = false;\n console.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n resolve(db);\n };\n request.onerror = function (event) {\n finished = true;\n _this.storageIsAvailable = false;\n console.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n request.onupgradeneeded = function (event) {\n finished = true;\n console.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n // @ts-ignore\n var db = event.target.result;\n if (event.oldVersion == 1) {\n db.deleteObjectStore(_this.dbStoreName);\n }\n createObjectStore(db);\n };\n });\n };\n IdbFileStorage.prototype.saveFile = function (fileName, blob) {\n var _this = this;\n return this.openDatabase().then(function (db) {\n if (!_this.storeBlobsAvailable) {\n return _this.saveFileBase64(db, fileName, blob);\n }\n if (!(blob instanceof Blob)) {\n blob = bin_utils_1.blobConstruct([blob]);\n }\n try {\n // @ts-ignore\n var objectStore = db.transaction([_this.dbStoreName], IDBTransaction.READ_WRITE || 'readwrite')\n .objectStore(_this.dbStoreName);\n var request = objectStore.put(blob, fileName);\n }\n catch (error) {\n if (_this.storeBlobsAvailable) {\n _this.storeBlobsAvailable = false;\n return _this.saveFileBase64(db, fileName, blob);\n }\n _this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n resolve(blob);\n };\n request.onerror = function (error) {\n reject(error);\n };\n });\n });\n };\n IdbFileStorage.prototype.saveFileBase64 = function (db, fileName, blob) {\n var _this = this;\n if (this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n if (!(blob instanceof Blob)) {\n var safeMimeType = bin_utils_1.blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bin_utils_1.bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(function () {\n return blob;\n });\n }\n try {\n var reader = new FileReader();\n }\n catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n var promise = new Promise(function (resolve, reject) {\n reader.onloadend = function () {\n _this.storagePutB64String(db, fileName, reader.result).then(function () {\n resolve(blob);\n }, reject);\n };\n reader.onerror = reject;\n });\n try {\n reader.readAsDataURL(blob);\n }\n catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n return promise;\n };\n IdbFileStorage.prototype.storagePutB64String = function (db, fileName, b64string) {\n try {\n // @ts-ignore\n var objectStore = db.transaction([this.dbStoreName], IDBTransaction.READ_WRITE || 'readwrite')\n .objectStore(this.dbStoreName);\n var request = objectStore.put(b64string, fileName);\n }\n catch (error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n resolve();\n };\n request.onerror = reject;\n });\n };\n IdbFileStorage.prototype.getBlobSize = function (blob) {\n return blob.size || blob.byteLength || blob.length;\n };\n IdbFileStorage.prototype.getFile = function (fileName, size) {\n var _this = this;\n return this.openDatabase().then(function (db) {\n // @ts-ignore\n var objectStore = db.transaction([_this.dbStoreName], IDBTransaction.READ || 'readonly')\n .objectStore(_this.dbStoreName);\n var request = objectStore.get(fileName);\n return new Promise(function (resolve, reject) {\n request.onsuccess = function (event) {\n // @ts-ignore\n var result = event.target.result;\n if (result === undefined) {\n reject();\n }\n else if (typeof result === 'string' &&\n result.substr(0, 5) === 'data:') {\n resolve(bin_utils_1.dataUrlToBlob(result));\n }\n else {\n resolve(result);\n }\n };\n request.onerror = reject;\n });\n });\n };\n IdbFileStorage.prototype.getFileWriter = function (fileName, mimeType) {\n var _this = this;\n var fakeWriter = filemanager_1.default.getFakeFileWriter(mimeType, function (blob) {\n _this.saveFile(fileName, blob);\n });\n return Promise.resolve(fakeWriter);\n };\n return IdbFileStorage;\n}());\nexports.default = new IdbFileStorage();\n"
},
{
"id": 39,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtnetworker.ts",
"name": "./src/lib/mtnetworker.ts",
"index": 35,
"index2": 32,
"size": 45460,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"issuerId": 2,
"issuerName": "./src/lib/mtproto.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"name": "./src/lib/mtproto.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1950,
"building": 50,
"dependencies": 703
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 2,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/mtproto.ts",
"module": "./src/lib/mtproto.ts",
"moduleName": "./src/lib/mtproto.ts",
"type": "cjs require",
"userRequest": "./mtnetworker",
"loc": "63:20-44"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\nvar bin_utils_1 = require(\"./bin_utils\");\nvar mtproto_1 = require(\"./mtproto\");\nvar tl_utils_1 = require(\"./tl_utils\");\nvar cryptoworker_1 = __importDefault(require(\"./cryptoworker\"));\nvar storage_1 = __importDefault(require(\"./storage\"));\nvar Config = __importStar(require(\"./config\"));\nvar chromeMatches = navigator.userAgent.match(/Chrome\\/(\\d+(\\.\\d+)?)/);\nvar chromeVersion = chromeMatches && parseFloat(chromeMatches[1]) || false;\nvar xhrSendBuffer = !('ArrayBufferView' in window) && (chromeVersion > 0 && chromeVersion < 30);\nvar MTPNetworker = /** @class */ (function () {\n function MTPNetworker(NetworkerFactory, dcID, authKey, serverSalt, options) {\n if (options === void 0) { options = {}; }\n this.NetworkerFactory = NetworkerFactory;\n this.dcID = dcID;\n this.authKey = authKey;\n this.serverSalt = serverSalt;\n this.options = options;\n this.lastServerMessages = [];\n this.sentMessages = {};\n this.pendingMessages = {};\n this.pendingAcks = [];\n this.pendingResends = [];\n this.connectionInited = false;\n this.longPollPending = 0;\n this.seqNo = 0;\n this.prevSessionID = [];\n this.sessionID = [];\n this.sleepAfter = 0;\n this.offline = false;\n this.checkConnectionPeriod = 0;\n this.nextReq = 0;\n this.onOnlineCb = this.checkConnection.bind(this);\n this.lastResendReq = null;\n this.authKeyUint8 = bin_utils_1.convertToUint8Array(this.authKey);\n this.authKeyID = bin_utils_1.sha1BytesSync(this.authKey).slice(-8);\n this.upload = this.options.fileUpload || this.options.fileDownload || false;\n this.updateSession();\n this.longPollInt = window.setInterval(this.checkLongPoll.bind(this), 10000);\n this.checkLongPoll();\n if (!this.NetworkerFactory.offlineInited) {\n this.NetworkerFactory.offlineInited = true;\n /* $rootScope.offline = true\n $rootScope.offlineConnecting = true */\n }\n if (Config.Navigator.mobile) {\n this.setupMobileSleep();\n }\n }\n MTPNetworker.prototype.updateSession = function () {\n this.seqNo = 0;\n this.prevSessionID = this.sessionID;\n this.sessionID = new Array(8);\n mtproto_1.MTProto.secureRandom.nextBytes(this.sessionID);\n };\n MTPNetworker.prototype.setupMobileSleep = function () {\n /* $rootScope.$watch('idle.isIDLE', (isIDLE) => {\n if(isIDLE) {\n this.sleepAfter = tsNow() + 30000;\n } else {\n delete this.sleepAfter;\n this.checkLongPoll();\n }\n })\n \n $rootScope.$on('push_received', function() {\n // console.log(dT(), 'push recieved', self.sleepAfter)\n if(this.sleepAfter) {\n this.sleepAfter = tsNow() + 30000;\n this.checkLongPoll();\n }\n }) */\n };\n MTPNetworker.prototype.updateSentMessage = function (sentMessageID) {\n var sentMessage = this.sentMessages[sentMessageID];\n if (!sentMessage) {\n return false;\n }\n var self = this;\n if (sentMessage.container) {\n var newInner = [];\n sentMessage.inner.forEach(function (innerSentMessageID) {\n var innerSentMessage = self.updateSentMessage(innerSentMessageID);\n if (innerSentMessage) {\n newInner.push(innerSentMessage.msg_id);\n }\n });\n sentMessage.inner = newInner;\n }\n sentMessage.msg_id = mtproto_1.MTProto.timeManager.generateID();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated ||\n sentMessage.container);\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete self.sentMessages[sentMessageID];\n return sentMessage;\n };\n MTPNetworker.prototype.generateSeqNo = function (notContentRelated) {\n var seqNo = this.seqNo * 2;\n if (!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n return seqNo;\n };\n MTPNetworker.prototype.wrapMtpCall = function (method, params, options) {\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeMethod(method, params);\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo();\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes()\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'MT call', method, params, messageID, seqNo);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.wrapMtpMessage = function (object, options) {\n if (object === void 0) { object = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeObject(object, 'Object');\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo(options.notContentRelated);\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes()\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'MT message', object, messageID, seqNo);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.wrapApiCall = function (method, params, options) {\n if (params === void 0) { params = {}; }\n if (options === void 0) { options = {}; }\n var serializer = new tl_utils_1.TLSerialization(options);\n if (!this.connectionInited) { // this will call once for each new session\n console.log(utils_1.dT(), 'Wrap api call !this.connectionInited');\n //serializer.storeInt(0xda9b0d0d, 'invokeWithLayer'); // -627372787 >>> 0 == 0xda9b0d0d\n var invokeWithLayer = Config.Schema.API.methods.find(function (m) { return m.method == 'invokeWithLayer'; });\n if (!invokeWithLayer)\n throw new Error('no invokeWithLayer!');\n // @ts-ignore\n serializer.storeInt(invokeWithLayer.id >>> 0, 'invokeWithLayer');\n // @ts-ignore\n serializer.storeInt(Config.Schema.API.layer, 'layer');\n var initConnection = Config.Schema.API.methods.find(function (m) { return m.method == 'initConnection'; });\n if (!initConnection)\n throw new Error('no invokeWithLayer!');\n // @ts-ignore\n serializer.storeInt(initConnection.id >>> 0, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(Config.App.id, 'api_id');\n serializer.storeString(navigator.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(Config.App.version, 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString('', 'lang_pack');\n serializer.storeString(navigator.language || 'en', 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0x0,\n 'api_id': Config.App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': Config.App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en',\n 'proxy': null\n }); */\n }\n if (options.afterMessageID) {\n console.log(utils_1.dT(), 'Api call options.afterMessageID!');\n serializer.storeInt(0xcb9f372d, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageID, 'msg_id');\n }\n options.resultType = serializer.storeMethod(method, params);\n var messageID = mtproto_1.MTProto.timeManager.generateID();\n var seqNo = this.generateSeqNo();\n var message = {\n msg_id: messageID,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Api call', method, params, messageID, seqNo, options);\n }\n else {\n console.log(utils_1.dT(), 'Api call', method);\n }\n return this.pushMessage(message, options);\n };\n MTPNetworker.prototype.checkLongPoll = function () {\n var isClean = this.cleanupSent();\n //console.log('Check lp', this.longPollPending, tsNow(), this.dcID, isClean, this);\n if ((this.longPollPending && utils_1.tsNow() < this.longPollPending) ||\n this.offline ||\n this.NetworkerFactory.akStopped) {\n //console.log('No lp this time');\n return false;\n }\n var self = this;\n storage_1.default.get('dc').then(function (baseDcID) {\n if (isClean && (baseDcID != self.dcID ||\n self.upload ||\n (self.sleepAfter && utils_1.tsNow() > self.sleepAfter))) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', self.dcID, self.sleepAfter);\n return;\n }\n self.sendLongPoll();\n });\n };\n MTPNetworker.prototype.sendLongPoll = function () {\n var _this = this;\n var maxWait = 25000;\n var self = this;\n this.longPollPending = utils_1.tsNow() + maxWait;\n //console.log('Set lp', this.longPollPending, tsNow())\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(function () {\n _this.longPollPending = 0;\n setTimeout(self.checkLongPoll.bind(self), 0);\n }, function (error) {\n console.log('Long-poll failed', error);\n });\n };\n MTPNetworker.prototype.pushMessage = function (message, options) {\n var _this = this;\n if (options === void 0) { options = {}; }\n return new Promise(function (resolve, reject) {\n _this.sentMessages[message.msg_id] = Object.assign(message, options, {\n deferred: { resolve: resolve, reject: reject }\n });\n // console.log(dT(), 'Networker pushMessage:', this.sentMessages[message.msg_id]);\n _this.pendingMessages[message.msg_id] = 0;\n if (!options || !options.noSchedule) {\n _this.scheduleRequest();\n }\n if (utils_1.isObject(options)) {\n options.messageID = message.msg_id;\n }\n });\n };\n MTPNetworker.prototype.pushResend = function (messageID, delay) {\n if (delay === void 0) { delay = 0; }\n var value = delay ? utils_1.tsNow() + delay : 0;\n var sentMessage = this.sentMessages[messageID];\n if (sentMessage.container) {\n for (var i = 0; i < sentMessage.inner.length; i++) {\n this.pendingMessages[sentMessage.inner[i]] = value;\n }\n }\n else {\n this.pendingMessages[messageID] = value;\n }\n // console.log('Resend due', messageID, this.pendingMessages)\n this.scheduleRequest(delay);\n };\n MTPNetworker.prototype.getMsgKey = function (dataWithPadding, isOut) {\n var authKey = this.authKeyUint8;\n var x = isOut ? 0 : 8;\n var msgKeyLargePlain = bin_utils_1.bufferConcat(authKey.subarray(88 + x, 88 + x + 32), dataWithPadding);\n return cryptoworker_1.default.sha256Hash(msgKeyLargePlain).then(function (msgKeyLarge) {\n var msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n });\n };\n ;\n MTPNetworker.prototype.getAesKeyIv = function (msgKey, isOut) {\n var authKey = this.authKeyUint8;\n var x = isOut ? 0 : 8;\n var sha2aText = new Uint8Array(52);\n var sha2bText = new Uint8Array(52);\n //var promises: any = {};\n var promises = [];\n sha2aText.set(msgKey, 0);\n sha2aText.set(authKey.subarray(x, x + 36), 16);\n /* promises.sha2a = */ promises.push(cryptoworker_1.default.sha256Hash(sha2aText));\n sha2bText.set(authKey.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n /* promises.sha2b = */ promises.push(cryptoworker_1.default.sha256Hash(sha2bText));\n return Promise.all(promises).then(function (results) {\n var aesKey = new Uint8Array(32);\n var aesIv = new Uint8Array(32);\n var sha2a = new Uint8Array(results[0]);\n var sha2b = new Uint8Array(results[1]);\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n return [aesKey, aesIv];\n });\n };\n MTPNetworker.prototype.checkConnection = function (event) {\n /* $rootScope.offlineConnecting = true */\n console.log(utils_1.dT(), 'Check connection', event);\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = 0;\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n var pingID = [bin_utils_1.nextRandomInt(0xFFFFFFFF), bin_utils_1.nextRandomInt(0xFFFFFFFF)];\n serializer.storeMethod('ping', {\n ping_id: pingID\n });\n var pingMessage = {\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes()\n };\n var self = this;\n this.sendEncryptedRequest(pingMessage, {\n timeout: 15000\n }).then(function (result) {\n /* delete $rootScope.offlineConnecting */\n self.toggleOffline(false);\n }, function () {\n console.log(utils_1.dT(), 'Delay ', self.checkConnectionPeriod * 1000);\n self.checkConnectionTimeout = setTimeout(self.checkConnection.bind(self), self.checkConnectionPeriod * 1000 | 0);\n self.checkConnectionPeriod = Math.min(60, self.checkConnectionPeriod * 1.5);\n /* setTimeout(function() {\n delete $rootScope.offlineConnecting\n }, 1000); */\n });\n };\n MTPNetworker.prototype.toggleOffline = function (enabled) {\n // console.log('toggle ', enabled, this.dcID, this.iii)\n if (this.offline !== undefined && this.offline == enabled) {\n return false;\n }\n this.offline = enabled;\n /* $rootScope.offline = enabled;\n $rootScope.offlineConnecting = false; */\n if (this.offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n if (this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n this.checkConnectionTimeout = setTimeout(this.checkConnection.bind(this), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n document.body.addEventListener('online', this.onOnlineCb, false);\n document.body.addEventListener('focus', this.onOnlineCb, false);\n }\n else {\n this.checkLongPoll();\n this.scheduleRequest();\n document.body.removeEventListener('online', this.onOnlineCb);\n document.body.removeEventListener('focus', this.onOnlineCb);\n //$(document.body).off('online focus', this.onOnlineCb);\n /* if(this.onOnlineCb) {\n $(document.body).off('online focus', this.onOnlineCb);\n } */\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = 0;\n }\n };\n MTPNetworker.prototype.performScheduledRequest = function () {\n var _this = this;\n // console.log(dT(), 'scheduled', this.dcID, this.iii)\n if (this.offline || this.NetworkerFactory.akStopped) {\n console.log(utils_1.dT(), 'Cancel scheduled');\n return false;\n }\n this.nextReq = 0;\n if (this.pendingAcks.length) {\n var ackMsgIDs = [];\n for (var i = 0; i < this.pendingAcks.length; i++) {\n ackMsgIDs.push(this.pendingAcks[i]);\n }\n // console.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIDs\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n if (this.pendingResends.length) {\n var resendMsgIDs = [];\n var resendOpts = {\n noSchedule: true,\n notContentRelated: true,\n messageID: '' // will set in wrapMtpMessage->pushMessage\n };\n for (var i = 0; i < this.pendingResends.length; i++) {\n resendMsgIDs.push(this.pendingResends[i]);\n }\n // console.log('resendReq messages', resendMsgIDs)\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIDs\n }, resendOpts);\n this.lastResendReq = {\n req_msg_id: resendOpts.messageID,\n resend_msg_ids: resendMsgIDs\n };\n }\n var messages = [], message;\n var messagesByteLen = 0;\n var currentTime = utils_1.tsNow();\n var hasApiCall = false;\n var hasHttpWait = false;\n var lengthOverflow = false;\n var singlesCount = 0;\n var self = this;\n for (var messageID in this.pendingMessages) {\n var value = this.pendingMessages[messageID];\n if (!value || value >= currentTime) {\n if (message = this.sentMessages[messageID]) {\n //console.log(dT(), 'performScheduledRequest message:', message);\n var messageByteLength = (message.body.byteLength || message.body.length) + 32;\n if (!message.notContentRelated &&\n lengthOverflow) {\n continue; // maybe break here\n }\n if (!message.notContentRelated &&\n messagesByteLen &&\n messagesByteLen + messageByteLength > 655360) { // 640 Kb\n lengthOverflow = true;\n continue; // maybe break here\n }\n if (message.singleInRequest) {\n singlesCount++;\n if (singlesCount > 1) {\n continue; // maybe break here\n }\n }\n messages.push(message);\n messagesByteLen += messageByteLength;\n if (message.isAPI) {\n hasApiCall = true;\n }\n else if (message.longPoll) {\n hasHttpWait = true;\n }\n }\n else {\n // console.log(message, messageID)\n }\n delete self.pendingMessages[messageID];\n }\n }\n if (hasApiCall && !hasHttpWait) {\n var serializer = new tl_utils_1.TLSerialization({ mtproto: true });\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n messages.push({\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes()\n });\n }\n if (!messages.length) {\n // console.log('no scheduled messages')\n return;\n }\n var noResponseMsgs = [];\n if (messages.length > 1) {\n var container = new tl_utils_1.TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n var innerMessages = [];\n for (var i = 0; i < messages.length; i++) {\n container.storeLong(messages[i].msg_id, 'CONTAINER[' + i + '][msg_id]');\n innerMessages.push(messages[i].msg_id);\n container.storeInt(messages[i].seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(messages[i].body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(messages[i].body, 'CONTAINER[' + i + '][body]');\n if (messages[i].noResponse) {\n noResponseMsgs.push(messages[i].msg_id);\n }\n }\n var containerSentMessage = {\n msg_id: mtproto_1.MTProto.timeManager.generateID(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n message = Object.assign({\n body: container.getBytes(true)\n }, containerSentMessage);\n this.sentMessages[message.msg_id] = containerSentMessage;\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Container', innerMessages, message.msg_id, message.seq_no);\n }\n }\n else {\n if (message.noResponse) {\n noResponseMsgs.push(message.msg_id);\n }\n this.sentMessages[message.msg_id] = message;\n }\n this.pendingAcks = [];\n this.sendEncryptedRequest(message).then(function (result) {\n self.toggleOffline(false);\n // console.log('parse for', message)\n self.parseResponse(result).then(function (response) {\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Server response', self.dcID, response);\n }\n self.processMessage(response.response, response.messageID, response.sessionID);\n noResponseMsgs.forEach(function (msgID) {\n if (self.sentMessages[msgID]) {\n var deferred = self.sentMessages[msgID].deferred;\n delete self.sentMessages[msgID];\n deferred.resolve();\n }\n });\n self.checkLongPoll();\n _this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(_this.checkConnectionPeriod));\n });\n }, function (error) {\n console.error('Encrypted request failed', error);\n if (message.container) {\n message.inner.forEach(function (msgID) {\n self.pendingMessages[msgID] = 0;\n });\n delete self.sentMessages[message.msg_id];\n }\n else {\n self.pendingMessages[message.msg_id] = 0;\n }\n noResponseMsgs.forEach(function (msgID) {\n if (self.sentMessages[msgID]) {\n var deferred = self.sentMessages[msgID].deferred;\n delete self.sentMessages[msgID];\n delete self.pendingMessages[msgID];\n deferred.reject();\n }\n });\n self.toggleOffline(true);\n });\n if (lengthOverflow || singlesCount > 1) {\n this.scheduleRequest();\n }\n };\n MTPNetworker.prototype.getEncryptedMessage = function (dataWithPadding) {\n var self = this;\n return self.getMsgKey(dataWithPadding, true).then(function (msgKey) {\n return self.getAesKeyIv(msgKey, true).then(function (keyIv) {\n // console.log(dT(), 'after msg key iv')\n return cryptoworker_1.default.aesEncrypt(dataWithPadding, keyIv[0], keyIv[1])\n .then(function (encryptedBytes) {\n // console.log(dT(), 'Finish encrypt')\n return {\n bytes: encryptedBytes,\n msgKey: msgKey\n };\n });\n });\n });\n };\n MTPNetworker.prototype.getDecryptedMessage = function (msgKey, encryptedData) {\n // console.log(dT(), 'get decrypted start')\n return this.getAesKeyIv(msgKey, false).then(function (keyIv) {\n // console.log(dT(), 'after msg key iv')\n return cryptoworker_1.default.aesDecrypt(encryptedData, keyIv[0], keyIv[1]);\n });\n };\n MTPNetworker.prototype.sendEncryptedRequest = function (message, options) {\n if (options === void 0) { options = {}; }\n var self = this;\n // console.log(dT(), 'Send encrypted'/*, message*/)\n // console.trace()\n var data = new tl_utils_1.TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionID, 64, 'session_id');\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n var dataBuffer = data.getBuffer();\n var paddingLength = (16 - (data.offset % 16)) + 16 * (1 + bin_utils_1.nextRandomInt(5));\n var padding = new Array(paddingLength);\n mtproto_1.MTProto.secureRandom.nextBytes(padding);\n var dataWithPadding = bin_utils_1.bufferConcat(dataBuffer, padding);\n // console.log(dT(), 'Adding padding', dataBuffer, padding, dataWithPadding)\n // console.log(dT(), 'auth_key_id', bytesToHex(self.authKeyID))\n return this.getEncryptedMessage(dataWithPadding).then(function (encryptedResult) {\n // console.log(dT(), 'Got encrypted out message'/*, encryptedResult*/)\n var request = new tl_utils_1.TLSerialization({\n startMaxLength: encryptedResult.bytes.byteLength + 256\n });\n request.storeIntBytes(self.authKeyID, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n var requestData = xhrSendBuffer ? request.getBuffer() : request.getArray();\n var requestPromise;\n var url = mtproto_1.MTProto.dcConfigurator.chooseServer(self.dcID, self.upload);\n var baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n url: url\n };\n requestPromise = fetch(url, Object.assign({ method: 'POST', body: requestData }, options))\n .then(function (response) {\n //console.log('sendEncryptedRequest response', response);\n if (response.status != 200)\n throw response;\n return response.arrayBuffer();\n });\n // WARNING ТУТ НУЖЕН .CATCH\n return requestPromise.then(function (result) {\n if (!result || !result.byteLength) {\n return Promise.reject(baseError);\n }\n return result;\n }, function (error) {\n if (!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n return Promise.reject(error);\n });\n });\n };\n MTPNetworker.prototype.parseResponse = function (responseBuffer) {\n // console.log(dT(), 'Start parsing response');\n var self = this;\n var deserializer = new tl_utils_1.TLDeserialization(responseBuffer);\n var authKeyID = deserializer.fetchIntBytes(64, false, 'auth_key_id');\n if (!bin_utils_1.bytesCmp(authKeyID, this.authKeyID)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bin_utils_1.bytesToHex(authKeyID));\n }\n var msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n var encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n return self.getDecryptedMessage(msgKey, encryptedData).then(function (dataWithPadding) {\n // console.log(dT(), 'after decrypt')\n return self.getMsgKey(dataWithPadding, false).then(function (calcMsgKey) {\n if (!bin_utils_1.bytesCmp(msgKey, calcMsgKey)) {\n console.warn('[MT] msg_keys', msgKey, bin_utils_1.bytesFromArrayBuffer(calcMsgKey));\n throw new Error('[MT] server msgKey mismatch');\n }\n // console.log(dT(), 'after msgKey check')\n var deserializer = new tl_utils_1.TLDeserialization(dataWithPadding, {\n mtproto: true\n });\n var salt = deserializer.fetchIntBytes(64, false, 'salt');\n var sessionID = deserializer.fetchIntBytes(64, false, 'session_id');\n var messageID = deserializer.fetchLong('message_id');\n if (!bin_utils_1.bytesCmp(sessionID, self.sessionID) &&\n (!self.prevSessionID || !bin_utils_1.bytesCmp(sessionID, self.prevSessionID))) {\n console.warn('Sessions', sessionID, self.sessionID, self.prevSessionID);\n throw new Error('[MT] Invalid server session_id: ' + bin_utils_1.bytesToHex(sessionID));\n }\n var seqNo = deserializer.fetchInt('seq_no');\n var totalLength = dataWithPadding.byteLength;\n var messageBodyLength = deserializer.fetchInt('message_data[length]');\n var offset = deserializer.getOffset();\n if ((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n var messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n var offset = deserializer.getOffset();\n var paddingLength = totalLength - offset;\n if (paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n var buffer = bin_utils_1.bytesToArrayBuffer(messageBody);\n var deserializer = new tl_utils_1.TLDeserialization(buffer, { mtproto: true });\n // костыль\n deserializer.override = {\n mt_message: (function (result, field) {\n result.msg_id = this.fetchLong(field + '[msg_id]');\n result.seqno = this.fetchInt(field + '[seqno]');\n result.bytes = this.fetchInt(field + '[bytes]');\n var offset = this.getOffset();\n //console.log('mt_message!!!!!', result, field);\n try {\n result.body = this.fetchObject('Object', field + '[body]');\n }\n catch (e) {\n console.error(utils_1.dT(), 'parse error', e.message, e.stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n if (this.offset != offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // console.log(dT(), result)\n this.offset = offset + result.bytes;\n }\n // console.log(dT(), 'override message', result)\n }).bind(deserializer),\n mt_rpc_result: (function (result, field) {\n result.req_msg_id = this.fetchLong(field + '[req_msg_id]');\n var sentMessage = self.sentMessages[result.req_msg_id];\n var type = sentMessage && sentMessage.resultType || 'Object';\n if (result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n result.result = this.fetchObject(type, field + '[result]');\n // console.log(dT(), 'override rpc_result', sentMessage, type, result);\n }).bind(deserializer)\n };\n var response = deserializer.fetchObject('', 'INPUT');\n return {\n response: response,\n messageID: messageID,\n sessionID: sessionID,\n seqNo: seqNo\n };\n });\n });\n };\n MTPNetworker.prototype.applyServerSalt = function (newServerSalt) {\n var _a;\n var serverSalt = bin_utils_1.longToBytes(newServerSalt);\n storage_1.default.set((_a = {},\n _a['dc' + this.dcID + '_server_salt'] = bin_utils_1.bytesToHex(serverSalt),\n _a));\n this.serverSalt = serverSalt;\n return true;\n };\n MTPNetworker.prototype.scheduleRequest = function (delay) {\n if (delay === void 0) { delay = 0; }\n if (this.offline) {\n this.checkConnection('forced schedule');\n }\n var nextReq = utils_1.tsNow() + delay;\n if (delay && this.nextReq && this.nextReq <= nextReq) {\n return false;\n }\n // console.log(dT(), 'schedule req', delay)\n // console.trace()\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n if (delay > 0) {\n this.nextReqTimeout = window.setTimeout(this.performScheduledRequest.bind(this), delay || 0);\n }\n else {\n setTimeout(this.performScheduledRequest.bind(this), 0);\n }\n this.nextReq = nextReq;\n };\n MTPNetworker.prototype.ackMessage = function (msgID) {\n // console.log('ack message', msgID)\n this.pendingAcks.push(msgID);\n this.scheduleRequest(30000);\n };\n MTPNetworker.prototype.reqResendMessage = function (msgID) {\n console.log(utils_1.dT(), 'Req resend', msgID);\n this.pendingResends.push(msgID);\n this.scheduleRequest(100);\n };\n MTPNetworker.prototype.cleanupSent = function () {\n var _this = this;\n var self = this;\n var notEmpty = false;\n // console.log('clean start', this.dcID/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach(function (msgID) {\n var message = _this.sentMessages[msgID];\n // console.log('clean iter', msgID, message)\n if (message.notContentRelated && self.pendingMessages[msgID] === undefined) {\n // console.log('clean notContentRelated', msgID)\n delete self.sentMessages[msgID];\n }\n else if (message.container) {\n for (var i = 0; i < message.inner.length; i++) {\n if (self.sentMessages[message.inner[i]] !== undefined) {\n // console.log('clean failed, found', msgID, message.inner[i], self.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // console.log('clean container', msgID)\n delete self.sentMessages[msgID];\n }\n else {\n notEmpty = true;\n }\n });\n return !notEmpty;\n };\n MTPNetworker.prototype.processMessageAck = function (messageID) {\n var sentMessage = this.sentMessages[messageID];\n if (sentMessage && !sentMessage.acked) {\n delete sentMessage.body;\n sentMessage.acked = true;\n return true;\n }\n return false;\n };\n MTPNetworker.prototype.processError = function (rawError) {\n var matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = bin_utils_1.uintToInt(rawError.error_code);\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n };\n MTPNetworker.prototype.processMessage = function (message, messageID, sessionID) {\n var _this = this;\n var msgidInt = parseInt(messageID /* .toString(10) */.substr(0, -10), 10);\n if (msgidInt % 2) {\n console.warn('[MT] Server even message id: ', messageID, message);\n return;\n }\n // console.log('process message', message, messageID, sessionID)\n switch (message._) {\n case 'msg_container':\n var len = message.messages.length;\n for (var i = 0; i < len; i++) {\n this.processMessage(message.messages[i], message.messages[i].msg_id, sessionID);\n }\n break;\n case 'bad_server_salt':\n console.log(utils_1.dT(), 'Bad server salt', message);\n var sentMessage = this.sentMessages[message.bad_msg_id];\n if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n console.log(message.bad_msg_id, message.bad_msg_seqno);\n throw new Error('[MT] Bad server salt for invalid message');\n }\n this.applyServerSalt(message.new_server_salt);\n this.pushResend(message.bad_msg_id);\n this.ackMessage(messageID);\n break;\n case 'bad_msg_notification':\n console.log(utils_1.dT(), 'Bad msg notification', message);\n var sentMessage = this.sentMessages[message.bad_msg_id];\n if (!sentMessage || sentMessage.seq_no != message.bad_msg_seqno) {\n console.log(message.bad_msg_id, message.bad_msg_seqno);\n throw new Error('[MT] Bad msg notification for invalid message');\n }\n if (message.error_code == 16 || message.error_code == 17) {\n if (mtproto_1.MTProto.timeManager.applyServerTime(bin_utils_1.bigStringInt(messageID).shiftRight(32).toString(10))) {\n console.log(utils_1.dT(), 'Update session');\n this.updateSession();\n }\n var badMessage = this.updateSentMessage(message.bad_msg_id);\n this.pushResend(badMessage.msg_id);\n this.ackMessage(messageID);\n }\n break;\n case 'message':\n if (this.lastServerMessages.indexOf(messageID) != -1) {\n // console.warn('[MT] Server same messageID: ', messageID)\n this.ackMessage(messageID);\n return;\n }\n this.lastServerMessages.push(messageID);\n if (this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n this.processMessage(message.body, message.msg_id, sessionID);\n break;\n case 'new_session_created':\n this.ackMessage(messageID);\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n storage_1.default.get('dc').then(function (baseDcID) {\n if (baseDcID == _this.dcID && !_this.upload && _this.NetworkerFactory.updatesProcessor) {\n // @ts-ignore\n _this.NetworkerFactory.updatesProcessor(message, true);\n }\n });\n break;\n case 'msgs_ack':\n for (var i = 0; i < message.msg_ids.length; i++) {\n this.processMessageAck(message.msg_ids[i]);\n }\n break;\n case 'msg_detailed_info':\n if (!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if (this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n case 'msgs_state_info':\n this.ackMessage(message.answer_msg_id);\n if (this.lastResendReq &&\n this.lastResendReq.req_msg_id == message.req_msg_id &&\n this.pendingResends.length) {\n var badMsgID, pos;\n for (var i_1 = 0; i_1 < this.lastResendReq.resend_msg_ids.length; i_1++) {\n badMsgID = this.lastResendReq.resend_msg_ids[i_1];\n pos = this.pendingResends.indexOf(badMsgID);\n if (pos != -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n break;\n case 'rpc_result':\n this.ackMessage(messageID);\n var sentMessageID = message.req_msg_id;\n var sentMessage = this.sentMessages[sentMessageID];\n this.processMessageAck(sentMessageID);\n if (sentMessage) {\n var deferred = sentMessage.deferred;\n if (message.result._ == 'rpc_error') {\n var error = this.processError(message.result);\n console.log(utils_1.dT(), 'Rpc error', error);\n if (deferred) {\n deferred.reject(error);\n }\n }\n else {\n if (deferred) {\n if (Config.Modes.debug) {\n console.log(utils_1.dT(), 'Rpc response', message.result);\n }\n else {\n var dRes = message.result._;\n if (!dRes) {\n if (message.result.length > 5) {\n dRes = '[..' + message.result.length + '..]';\n }\n else {\n dRes = message.result;\n }\n }\n console.log(utils_1.dT(), 'Rpc response', dRes, sentMessage);\n }\n sentMessage.deferred.resolve(message.result);\n }\n if (sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n console.log(utils_1.dT(), 'Rpc set connectionInited to:', this.connectionInited, this);\n }\n }\n delete this.sentMessages[sentMessageID];\n }\n break;\n default:\n this.ackMessage(messageID);\n console.log(utils_1.dT(), 'Update', message);\n if (this.NetworkerFactory.updatesProcessor !== null) {\n // @ts-ignore\n this.NetworkerFactory.updatesProcessor(message, true);\n }\n break;\n }\n };\n return MTPNetworker;\n}());\nexports.MTPNetworker = MTPNetworker;\n"
},
{
"id": 40,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/overlayscrollbars/js/OverlayScrollbars.js",
"name": "./node_modules/overlayscrollbars/js/OverlayScrollbars.js",
"index": 40,
"index2": 38,
"size": 363010,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"issuerId": 7,
"issuerName": "./src/components/pageIm.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"name": "./src/components/pageIm.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 1600,
"building": 228
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 7,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageIm.ts",
"module": "./src/components/pageIm.ts",
"moduleName": "./src/components/pageIm.ts",
"type": "cjs require",
"userRequest": "overlayscrollbars",
"loc": "8:42-70"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*!\n * OverlayScrollbars\n * https://github.com/KingSora/OverlayScrollbars\n *\n * Version: 1.10.0\n *\n * Copyright KingSora | Rene Haas.\n * https://github.com/KingSora\n *\n * Released under the MIT license.\n * Date: 11.10.2019\n */\n\n(function (global, factory) {\n if (typeof define === 'function' && define.amd)\n define(function() { return factory(global, global.document, undefined); });\n else if (typeof module === 'object' && typeof module.exports === 'object')\n module.exports = factory(global, global.document, undefined);\n else\n factory(global, global.document, undefined);\n}(typeof window !== 'undefined' ? window : this,\n function(window, document, undefined) {\n 'use strict';\n var PLUGINNAME = 'OverlayScrollbars';\n var TYPES = {\n o : 'object',\n f : 'function',\n a : 'array',\n s : 'string',\n b : 'boolean',\n n : 'number',\n u : 'undefined',\n z : 'null'\n //d : 'date',\n //e : 'error',\n //r : 'regexp',\n //y : 'symbol'\n };\n var LEXICON = {\n c : 'class',\n s : 'style',\n i : 'id',\n l : 'length',\n p : 'prototype',\n oH : 'offsetHeight',\n cH : 'clientHeight',\n sH : 'scrollHeight',\n oW : 'offsetWidth',\n cW : 'clientWidth',\n sW : 'scrollWidth',\n hOP : 'hasOwnProperty',\n bCR : 'getBoundingClientRect'\n };\n var VENDORS = (function() {\n //https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\n var jsCache = { };\n var cssCache = { };\n var cssPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];\n var jsPrefixes = ['WebKit', 'Moz', 'O', 'MS'];\n function firstLetterToUpper(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n \n return {\n _cssPrefixes: cssPrefixes,\n _jsPrefixes: jsPrefixes,\n _cssProperty : function(name) {\n var result = cssCache[name];\n \n if(cssCache[LEXICON.hOP](name))\n return result;\n\n var uppercasedName = firstLetterToUpper(name);\n var elmStyle = document.createElement('div')[LEXICON.s];\n var resultPossibilities;\n var i = 0;\n var v;\n var currVendorWithoutDashes;\n\n for (; i < cssPrefixes.length; i++) {\n currVendorWithoutDashes = cssPrefixes[i].replace(/-/g, '');\n resultPossibilities = [\n name, //transition\n cssPrefixes[i] + name, //-webkit-transition\n currVendorWithoutDashes + uppercasedName, //webkitTransition\n firstLetterToUpper(currVendorWithoutDashes) + uppercasedName //WebkitTransition\n ];\n for(v = 0; v < resultPossibilities[LEXICON.l]; v++) {\n if(elmStyle[resultPossibilities[v]] !== undefined) {\n result = resultPossibilities[v];\n break;\n }\n }\n }\n \n cssCache[name] = result;\n return result;\n },\n _jsAPI : function(name, isInterface, fallback) {\n var i = 0;\n var result = jsCache[name];\n \n if(!jsCache[LEXICON.hOP](name)) {\n result = window[name];\n for(; i < jsPrefixes[LEXICON.l]; i++)\n result = result || window[(isInterface ? jsPrefixes[i] : jsPrefixes[i].toLowerCase()) + firstLetterToUpper(name)];\n jsCache[name] = result;\n }\n return result || fallback;\n }\n \n }\n })();\n var COMPATIBILITY = (function() {\n function windowSize(x) {\n return x ? window.innerWidth || document.documentElement[LEXICON.cW] || document.body[LEXICON.cW] : window.innerHeight || document.documentElement[LEXICON.cH] || document.body[LEXICON.cH];\n }\n function bind(func, thisObj) {\n if (typeof func != TYPES.f) {\n throw \"Can't bind function!\";\n // closest thing possible to the ECMAScript 5\n // internal IsCallable function\n //throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');\n }\n var proto = LEXICON.p;\n var aArgs = Array[proto].slice.call(arguments, 2);\n var fNOP = function() {};\n var fBound = function() { return func.apply(this instanceof fNOP ? this : thisObj, aArgs.concat(Array[proto].slice.call(arguments))); };\n\n if (func[proto])\n fNOP[proto] = func[proto]; // Function.prototype doesn't have a prototype property\n fBound[proto] = new fNOP();\n\n return fBound;\n }\n \n return {\n /**\n * Gets the current window width.\n * @returns {Number|number} The current window width in pixel.\n */\n wW: bind(windowSize, 0, true),\n\n /**\n * Gets the current window height.\n * @returns {Number|number} The current window height in pixel.\n */\n wH: bind(windowSize, 0),\n\n /**\n * Gets the MutationObserver Object or undefined if not supported.\n * @returns {MutationObserver|*|undefined} The MutationsObserver Object or undefined.\n */\n mO: bind(VENDORS._jsAPI, 0, 'MutationObserver', true),\n\n /**\n * Gets the ResizeObserver Object or undefined if not supported.\n * @returns {MutationObserver|*|undefined} The ResizeObserver Object or undefined.\n */\n rO: bind(VENDORS._jsAPI, 0, 'ResizeObserver', true),\n\n /**\n * Gets the RequestAnimationFrame method or it's corresponding polyfill.\n * @returns {*|Function} The RequestAnimationFrame method or it's corresponding polyfill.\n */\n rAF: bind(VENDORS._jsAPI, 0, 'requestAnimationFrame', false, function (func) { return window.setTimeout(func, 1000 / 60); }),\n\n /**\n * Gets the CancelAnimationFrame method or it's corresponding polyfill.\n * @returns {*|Function} The CancelAnimationFrame method or it's corresponding polyfill.\n */\n cAF: bind(VENDORS._jsAPI, 0, 'cancelAnimationFrame', false, function (id) { return window.clearTimeout(id); }),\n\n /**\n * Gets the current time.\n * @returns {number} The current time.\n */\n now: function() {\n return Date.now && Date.now() || new Date().getTime();\n },\n\n /**\n * Stops the propagation of the given event.\n * @param event The event of which the propagation shall be stoped.\n */\n stpP: function(event) {\n if(event.stopPropagation)\n event.stopPropagation();\n else\n event.cancelBubble = true;\n },\n\n /**\n * Prevents the default action of the given event.\n * @param event The event of which the default action shall be prevented.\n */\n prvD: function(event) {\n if(event.preventDefault && event.cancelable)\n event.preventDefault();\n else\n event.returnValue = false;\n },\n\n /**\n * Gets the pageX and pageY values of the given mouse event.\n * @param event The mouse event of which the pageX and pageX shall be got.\n * @returns {{x: number, y: number}} x = pageX value, y = pageY value.\n */\n page: function(event) {\n event = event.originalEvent || event;\n\n var strPage = 'page';\n var strClient = 'client';\n var strX = 'X';\n var strY = 'Y';\n var target = event.target || event.srcElement || document;\n var eventDoc = target.ownerDocument || document;\n var doc = eventDoc.documentElement;\n var body = eventDoc.body;\n\n //if touch event return return pageX/Y of it\n if(event.touches !== undefined) {\n var touch = event.touches[0];\n return {\n x : touch[strPage + strX],\n y : touch[strPage + strY]\n }\n }\n\n // Calculate pageX/Y if not native supported\n if (!event[strPage + strX] && event[strClient + strX] && event[strClient + strX] != null) {\n\n return {\n x : event[strClient + strX] +\n (doc && doc.scrollLeft || body && body.scrollLeft || 0) -\n (doc && doc.clientLeft || body && body.clientLeft || 0),\n y : event[strClient + strY] +\n (doc && doc.scrollTop || body && body.scrollTop || 0) -\n (doc && doc.clientTop || body && body.clientTop || 0)\n }\n }\n return {\n x : event[strPage + strX],\n y : event[strPage + strY]\n };\n },\n\n /**\n * Gets the clicked mouse button of the given mouse event.\n * @param event The mouse event of which the clicked button shal be got.\n * @returns {number} The number of the clicked mouse button. (0 : none | 1 : leftButton | 2 : middleButton | 3 : rightButton)\n */\n mBtn: function(event) {\n var button = event.button;\n if (!event.which && button !== undefined)\n return (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));\n else\n return event.which;\n },\n\n /**\n * Checks whether a item is in the given array and returns its index.\n * @param item The item of which the position in the array shall be determined.\n * @param arr The array.\n * @returns {number} The zero based index of the item or -1 if the item isn't in the array.\n */\n inA : function(item, arr) {\n for (var i = 0; i < arr[LEXICON.l]; i++)\n //Sometiems in IE a \"SCRIPT70\" Permission denied error occurs if HTML elements in a iFrame are compared\n try {\n if (arr[i] === item)\n return i;\n }\n catch(e) { }\n return -1;\n },\n\n /**\n * Returns true if the given value is a array.\n * @param arr The potential array.\n * @returns {boolean} True if the given value is a array, false otherwise.\n */\n isA: function(arr) {\n var def = Array.isArray;\n return def ? def(arr) : this.type(arr) == TYPES.a;\n },\n\n /**\n * Determine the internal JavaScript [[Class]] of the given object.\n * @param obj The object of which the type shall be determined.\n * @returns {string} The type of the given object.\n */\n type: function(obj) {\n if (obj === undefined)\n return obj + '';\n if (obj === null)\n return obj + '';\n return Object[LEXICON.p].toString.call(obj).replace(/^\\[object (.+)\\]$/, '$1').toLowerCase();\n },\n\n\n bind: bind\n\n /**\n * Gets the vendor-prefixed CSS property by the given name.\n * For example the given name is \"transform\" and you're using a old Firefox browser then the returned value would be \"-moz-transform\".\n * If the browser doesn't need a vendor-prefix, then the returned string is the given name.\n * If the browser doesn't support the given property name at all (not even with a vendor-prefix) the returned value is null.\n * @param propName The unprefixed CSS property name.\n * @returns {string|null} The vendor-prefixed CSS property or null if the browser doesn't support the given CSS property.\n\n cssProp: function(propName) {\n return VENDORS._cssProperty(propName);\n }\n */\n }\n })();\n\n var MATH = Math;\n var JQUERY = window.jQuery;\n var EASING = (function() {\n var _easingsMath = {\n p : MATH.PI,\n c : MATH.cos,\n s : MATH.sin,\n w : MATH.pow,\n t : MATH.sqrt,\n n : MATH.asin,\n a : MATH.abs,\n o : 1.70158\n };\n \n /*\n x : current percent (0 - 1),\n t : current time (duration * percent),\n b : start value (from),\n c : end value (to),\n d : duration\n\n easingName : function(x, t, b, c, d) { return easedValue; }\n */\n\n return {\n swing: function (x, t, b, c, d) {\n return 0.5 - _easingsMath.c(x * _easingsMath.p) / 2;\n },\n linear: function(x, t, b, c, d) {\n return x;\n },\n easeInQuad: function (x, t, b, c, d) {\n return c*(t/=d)*t + b;\n },\n easeOutQuad: function (x, t, b, c, d) {\n return -c *(t/=d)*(t-2) + b;\n },\n easeInOutQuad: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t + b : -c/2 * ((--t)*(t-2) - 1) + b;\n },\n easeInCubic: function (x, t, b, c, d) {\n return c*(t/=d)*t*t + b;\n },\n easeOutCubic: function (x, t, b, c, d) {\n return c*((t=t/d-1)*t*t + 1) + b;\n },\n easeInOutCubic: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t + b : c/2*((t-=2)*t*t + 2) + b;\n },\n easeInQuart: function (x, t, b, c, d) {\n return c*(t/=d)*t*t*t + b;\n },\n easeOutQuart: function (x, t, b, c, d) {\n return -c * ((t=t/d-1)*t*t*t - 1) + b;\n },\n easeInOutQuart: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t*t + b : -c/2 * ((t-=2)*t*t*t - 2) + b;\n },\n easeInQuint: function (x, t, b, c, d) {\n return c*(t/=d)*t*t*t*t + b;\n },\n easeOutQuint: function (x, t, b, c, d) {\n return c*((t=t/d-1)*t*t*t*t + 1) + b;\n },\n easeInOutQuint: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? c/2*t*t*t*t*t + b : c/2*((t-=2)*t*t*t*t + 2) + b;\n },\n easeInSine: function (x, t, b, c, d) {\n return -c * _easingsMath.c(t/d * (_easingsMath.p/2)) + c + b;\n },\n easeOutSine: function (x, t, b, c, d) {\n return c * _easingsMath.s(t/d * (_easingsMath.p/2)) + b;\n },\n easeInOutSine: function (x, t, b, c, d) {\n return -c/2 * (_easingsMath.c(_easingsMath.p*t/d) - 1) + b;\n },\n easeInExpo: function (x, t, b, c, d) {\n return (t==0) ? b : c * _easingsMath.w(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function (x, t, b, c, d) {\n return (t==d) ? b+c : c * (-_easingsMath.w(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function (x, t, b, c, d) {\n if (t==0) return b;\n if (t==d) return b+c;\n if ((t/=d/2) < 1) return c/2 * _easingsMath.w(2, 10 * (t - 1)) + b;\n return c/2 * (-_easingsMath.w(2, -10 * --t) + 2) + b;\n },\n easeInCirc: function (x, t, b, c, d) {\n return -c * (_easingsMath.t(1 - (t/=d)*t) - 1) + b;\n },\n easeOutCirc: function (x, t, b, c, d) {\n return c * _easingsMath.t(1 - (t=t/d-1)*t) + b;\n },\n easeInOutCirc: function (x, t, b, c, d) {\n return ((t/=d/2) < 1) ? -c/2 * (_easingsMath.t(1 - t*t) - 1) + b : c/2 * (_easingsMath.t(1 - (t-=2)*t) + 1) + b;\n },\n easeInElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n return -(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b;\n },\n easeOutElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; \n if ((t/=d)==1) return b+c; \n if (!p) p=d*.3;\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n return a*_easingsMath.w(2,-10*t) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p ) + c + b;\n },\n easeInOutElastic: function (x, t, b, c, d) {\n var s=_easingsMath.o;var p=0;var a=c;\n if (t==0) return b; \n if ((t/=d/2)==2) return b+c; \n if (!p) p=d*(.3*1.5);\n if (a < _easingsMath.a(c)) { a=c; s=p/4; }\n else s = p/(2*_easingsMath.p) * _easingsMath.n (c/a);\n if (t < 1) return -.5*(a*_easingsMath.w(2,10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )) + b;\n return a*_easingsMath.w(2,-10*(t-=1)) * _easingsMath.s( (t*d-s)*(2*_easingsMath.p)/p )*.5 + c + b;\n },\n easeInBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return c*(t/=d)*t*((s+1)*t - s) + b;\n },\n easeOutBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n },\n easeInOutBack: function (x, t, b, c, d, s) {\n s = s || _easingsMath.o;\n return ((t/=d/2) < 1) ? c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b : c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n },\n easeInBounce: function (x, t, b, c, d) {\n return c - this.easeOutBounce (x, d-t, 0, c, d) + b;\n },\n easeOutBounce: function (x, t, b, c, d) {\n var o = 7.5625;\n if ((t/=d) < (1/2.75)) {\n return c*(o*t*t) + b;\n } else if (t < (2/2.75)) {\n return c*(o*(t-=(1.5/2.75))*t + .75) + b;\n } else if (t < (2.5/2.75)) {\n return c*(o*(t-=(2.25/2.75))*t + .9375) + b;\n } else {\n return c*(o*(t-=(2.625/2.75))*t + .984375) + b;\n }\n },\n easeInOutBounce: function (x, t, b, c, d) {\n return (t < d/2) ? this.easeInBounce (x, t*2, 0, c, d) * .5 + b : this.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\n }\n };\n /*\n *\n * TERMS OF USE - EASING EQUATIONS\n * \n * Open source under the BSD License. \n * \n * Copyright © 2001 Robert Penner\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n * \n * Redistributions of source code must retain the above copyright notice, this list of \n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list \n * of conditions and the following disclaimer in the documentation and/or other materials \n * provided with the distribution.\n * \n * Neither the name of the author nor the names of contributors may be used to endorse \n * or promote products derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n * OF THE POSSIBILITY OF SUCH DAMAGE. \n *\n */\n })();\n var FRAMEWORK = (function() {\n var _rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n var _strSpace = ' ';\n var _strEmpty = '';\n var _strScrollLeft = 'scrollLeft';\n var _strScrollTop = 'scrollTop';\n var _animations = [ ];\n var _type = COMPATIBILITY.type;\n var _cssNumber = {\n animationIterationCount: true,\n columnCount: true,\n fillOpacity: true,\n flexGrow: true,\n flexShrink: true,\n fontWeight: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n widows: true,\n zIndex: true,\n zoom: true\n };\n\n function extend() {\n var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {},\n i = 1,\n length = arguments[LEXICON.l],\n deep = false;\n\n // Handle a deep copy situation\n if (_type(target) == TYPES.b) {\n deep = target;\n target = arguments[1] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if (_type(target) != TYPES.o && !_type(target) == TYPES.f) {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if (length === i) {\n target = FakejQuery;\n --i;\n }\n\n for (; i < length; i++) {\n // Only deal with non-null/undefined values\n if ((options = arguments[i]) != null) {\n // Extend the base object\n for (name in options) {\n src = target[name];\n copy = options[name];\n\n // Prevent never-ending loop\n if (target === copy) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if (deep && copy && (isPlainObject(copy) || (copyIsArray = COMPATIBILITY.isA(copy)))) {\n if (copyIsArray) {\n copyIsArray = false;\n clone = src && COMPATIBILITY.isA(src) ? src : [];\n\n } else {\n clone = src && isPlainObject(src) ? src : {};\n }\n\n // Never move original objects, clone them\n target[name] = extend(deep, clone, copy);\n\n // Don't bring in undefined values\n } else if (copy !== undefined) {\n target[name] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n function inArray(item, arr, fromIndex) {\n for (var i = fromIndex || 0; i < arr[LEXICON.l]; i++)\n if (arr[i] === item)\n return i;\n return -1;\n }\n \n function isFunction(obj) {\n return _type(obj) == TYPES.f;\n };\n\n function isEmptyObject(obj) {\n for (var name in obj )\n return false;\n return true;\n };\n\n function isPlainObject(obj) {\n if (!obj || _type(obj) != TYPES.o)\n return false;\n\n var key;\n var proto = LEXICON.p;\n var hasOwnProperty = Object[proto].hasOwnProperty;\n var hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\n var hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\n\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n return false;\n }\n\n\n for (key in obj) { /**/ }\n\n return _type(key) == TYPES.u || hasOwnProperty.call(obj, key);\n };\n\n function each(obj, callback) {\n var i = 0;\n\n if (isArrayLike(obj)) {\n for (; i < obj[LEXICON.l]; i++) {\n if (callback.call(obj[i], i, obj[i]) === false)\n break;\n }\n }\n else {\n for (i in obj) {\n if (callback.call(obj[i], i, obj[i]) === false)\n break;\n }\n }\n\n return obj;\n };\n\n function isArrayLike(obj) {\n var length = !!obj && [LEXICON.l] in obj && obj[LEXICON.l];\n var t = _type(obj);\n return isFunction(t) ? false : (t == TYPES.a || length === 0 || _type(length) == TYPES.n && length > 0 && (length - 1) in obj);\n }\n\n function stripAndCollapse(value) {\n var tokens = value.match(_rnothtmlwhite) || [];\n return tokens.join(_strSpace);\n }\n\n function matches(elem, selector) {\n var nodeList = (elem.parentNode || document).querySelectorAll(selector) || [];\n var i = nodeList[LEXICON.l];\n\n while (i--)\n if (nodeList[i] == elem)\n return true;\n\n return false;\n }\n\n function insertAdjacentElement(el, strategy, child) {\n if(_type(child) == TYPES.a) {\n for(var i = 0; i < child[LEXICON.l]; i++)\n insertAdjacentElement(el, strategy, child[i]);\n }\n else if(_type(child) == TYPES.s)\n el.insertAdjacentHTML(strategy, child);\n else\n el.insertAdjacentElement(strategy, child.nodeType ? child : child[0]);\n }\n\n function setCSSVal(el, prop, val) {\n try {\n if(el[LEXICON.s][prop] !== undefined)\n el[LEXICON.s][prop] = parseCSSVal(prop, val);\n } catch(e) { }\n }\n\n function parseCSSVal(prop, val) {\n if(!_cssNumber[prop.toLowerCase()] && _type(val) == TYPES.n)\n val += 'px';\n return val;\n }\n\n function startNextAnimationInQ(animObj, removeFromQ) {\n var index;\n var nextAnim;\n if(removeFromQ !== false)\n animObj.q.splice(0, 1);\n if(animObj.q[LEXICON.l] > 0) {\n nextAnim = animObj.q[0];\n animate(animObj.el, nextAnim.props, nextAnim.duration, nextAnim.easing, nextAnim.complete, true);\n }\n else {\n index = inArray(animObj, _animations);\n if(index > -1)\n _animations.splice(index, 1);\n }\n }\n\n function setAnimationValue(el, prop, value) {\n if(prop === _strScrollLeft || prop === _strScrollTop)\n el[prop] = value;\n else\n setCSSVal(el, prop, value);\n }\n\n function animate(el, props, options, easing, complete, guaranteedNext) {\n var hasOptions = isPlainObject(options);\n var from = { };\n var to = { };\n var i = 0;\n var key;\n var animObj;\n var start;\n var progress;\n var step;\n var specialEasing;\n var duration;\n if(hasOptions) {\n easing = options.easing;\n start = options.start;\n progress = options.progress;\n step = options.step;\n specialEasing = options.specialEasing;\n complete = options.complete;\n duration = options.duration;\n }\n else\n duration = options;\n specialEasing = specialEasing || { };\n duration = duration || 400;\n easing = easing || 'swing';\n guaranteedNext = guaranteedNext || false;\n\n for(; i < _animations[LEXICON.l]; i++) {\n if(_animations[i].el === el) {\n animObj = _animations[i];\n break;\n }\n }\n\n if(!animObj) {\n animObj = {\n el : el,\n q : []\n };\n _animations.push(animObj);\n }\n\n for (key in props) {\n if(key === _strScrollLeft || key === _strScrollTop)\n from[key] = el[key];\n else\n from[key] = FakejQuery(el).css(key);\n }\n\n for (key in from) {\n if(from[key] !== props[key] && props[key] !== undefined)\n to[key] = props[key];\n }\n\n if(!isEmptyObject(to)) {\n var timeNow;\n var end;\n var percent;\n var fromVal;\n var toVal;\n var easedVal;\n var timeStart;\n var frame;\n var elapsed;\n var qPos = guaranteedNext ? 0 : inArray(qObj, animObj.q);\n var qObj = {\n props : to,\n duration : hasOptions ? options : duration,\n easing : easing,\n complete : complete\n };\n if (qPos === -1) {\n qPos = animObj.q[LEXICON.l];\n animObj.q.push(qObj);\n }\n\n if(qPos === 0) {\n if(duration > 0) {\n timeStart = COMPATIBILITY.now();\n frame = function() {\n timeNow = COMPATIBILITY.now();\n elapsed = (timeNow - timeStart);\n end = qObj.stop || elapsed >= duration;\n percent = 1 - ((MATH.max(0, timeStart + duration - timeNow) / duration) || 0);\n\n for(key in to) {\n fromVal = parseFloat(from[key]);\n toVal = parseFloat(to[key]);\n easedVal = (toVal - fromVal) * EASING[specialEasing[key] || easing](percent, percent * duration, 0, 1, duration) + fromVal;\n setAnimationValue(el, key, easedVal);\n if(isFunction(step)) {\n step(easedVal, {\n elem : el,\n prop : key,\n start : fromVal,\n now : easedVal,\n end : toVal,\n pos : percent,\n options : {\n easing : easing,\n speacialEasing : specialEasing,\n duration : duration,\n complete : complete,\n step : step\n },\n startTime : timeStart\n });\n }\n }\n\n if(isFunction(progress))\n progress({ }, percent, MATH.max(0, duration - elapsed));\n\n if (end) {\n startNextAnimationInQ(animObj);\n if(isFunction(complete))\n complete();\n }\n else\n qObj.frame = COMPATIBILITY.rAF()(frame);\n };\n qObj.frame = COMPATIBILITY.rAF()(frame);\n }\n else {\n for(key in to)\n setAnimationValue(el, key, to[key]);\n startNextAnimationInQ(animObj);\n }\n }\n }\n else if(guaranteedNext)\n startNextAnimationInQ(animObj);\n }\n\n function stop(el, clearQ, jumpToEnd) {\n var animObj;\n var qObj;\n var key;\n var i = 0;\n for(; i < _animations[LEXICON.l]; i++) {\n animObj = _animations[i];\n if(animObj.el === el) {\n if(animObj.q[LEXICON.l] > 0) {\n qObj = animObj.q[0];\n qObj.stop = true;\n COMPATIBILITY.cAF()(qObj.frame);\n animObj.q.splice(0, 1);\n\n if(jumpToEnd)\n for(key in qObj.props)\n setAnimationValue(el, key, qObj.props[key]);\n\n if(clearQ)\n animObj.q = [ ];\n else\n startNextAnimationInQ(animObj, false);\n }\n break;\n }\n }\n }\n \n function elementIsVisible(el) {\n return !!(el[LEXICON.oW] || el[LEXICON.oH] || el.getClientRects()[LEXICON.l]);\n }\n\n function FakejQuery(selector) {\n if(arguments[LEXICON.l] === 0)\n return this;\n\n var base = new FakejQuery();\n var elements = selector;\n var i = 0;\n var elms;\n var el;\n\n if(_type(selector) == TYPES.s) {\n elements = [ ];\n if(selector.charAt(0) === '<') {\n el = document.createElement('div');\n el.innerHTML = selector;\n elms = el.children;\n }\n else {\n elms = document.querySelectorAll(selector);\n }\n\n for(; i < elms[LEXICON.l]; i++)\n elements.push(elms[i]);\n }\n\n if(elements) {\n if(_type(elements) != TYPES.s && (!isArrayLike(elements) || elements === window || elements === elements.self))\n elements = [ elements ];\n\n for(i = 0; i < elements[LEXICON.l]; i++)\n base[i] = elements[i];\n\n base[LEXICON.l] = elements[LEXICON.l];\n }\n\n return base;\n };\n\n FakejQuery[LEXICON.p] = {\n\n //EVENTS:\n\n on : function(eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n\n var eventNameLength = eventName[LEXICON.l];\n var i = 0;\n var el;\n return this.each(function() {\n el = this;\n try {\n if (el.addEventListener) {\n for (; i < eventNameLength; i++)\n el.addEventListener(eventName[i], handler);\n }\n else if(el.detachEvent) {\n for (; i < eventNameLength; i++)\n el.attachEvent('on' + eventName[i], handler);\n }\n } catch (e) { }\n });\n },\n\n off : function(eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n\n var eventNameLength = eventName[LEXICON.l];\n var i = 0;\n var el;\n return this.each(function() {\n el = this;\n try {\n if (el.removeEventListener) {\n for (; i < eventNameLength; i++)\n el.removeEventListener(eventName[i], handler);\n }\n else if(el.detachEvent) {\n for (; i < eventNameLength; i++)\n el.detachEvent('on' + eventName[i], handler);\n }\n } catch (e) { }\n });\n },\n\n one : function (eventName, handler) {\n eventName = (eventName || _strEmpty).match(_rnothtmlwhite) || [_strEmpty];\n return this.each(function() {\n var el = FakejQuery(this);\n FakejQuery.each(eventName, function(i, oneEventName) {\n var oneHandler = function(e) {\n handler.call(this, e);\n el.off(oneEventName, oneHandler);\n };\n el.on(oneEventName, oneHandler);\n });\n });\n },\n\n trigger : function(eventName) {\n var el;\n var event;\n return this.each(function() {\n el = this;\n if (document.createEvent) {\n event = document.createEvent('HTMLEvents');\n event.initEvent(eventName, true, false);\n el.dispatchEvent(event);\n }\n else {\n el.fireEvent('on' + eventName);\n }\n });\n },\n\n //DOM NODE INSERTING / REMOVING:\n\n append : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'beforeend', child); });\n },\n\n prepend : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'afterbegin', child); });\n },\n\n before : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'beforebegin', child); });\n },\n\n after : function(child) {\n return this.each(function() { insertAdjacentElement(this, 'afterend', child); });\n },\n\n remove : function() {\n return this.each(function() {\n var el = this;\n var parentNode = el.parentNode;\n if(parentNode != null)\n parentNode.removeChild(el);\n });\n },\n\n unwrap : function() {\n var parents = [ ];\n var i;\n var el;\n var parent;\n\n this.each(function() {\n parent = this.parentNode;\n if(inArray(parent, parents) === - 1)\n parents.push(parent);\n });\n\n for(i = 0; i < parents[LEXICON.l]; i++) {\n el = parents[i];\n parent = el.parentNode;\n while (el.firstChild)\n parent.insertBefore(el.firstChild, el);\n parent.removeChild(el);\n }\n\n return this;\n },\n\n wrapAll : function(wrapperHTML) {\n var i;\n var nodes = this;\n var wrapper = FakejQuery(wrapperHTML)[0];\n var deepest = wrapper;\n var parent = nodes[0].parentNode;\n var previousSibling = nodes[0].previousSibling;\n while(deepest.childNodes[LEXICON.l] > 0)\n deepest = deepest.childNodes[0];\n\n for (i = 0; nodes[LEXICON.l] - i; deepest.firstChild === nodes[0] && i++)\n deepest.appendChild(nodes[i]);\n\n var nextSibling = previousSibling ? previousSibling.nextSibling : parent.firstChild;\n parent.insertBefore(wrapper, nextSibling);\n\n return this;\n },\n\n wrapInner : function(wrapperHTML) {\n return this.each(function() {\n var el = FakejQuery(this);\n var contents = el.contents();\n\n if (contents[LEXICON.l])\n contents.wrapAll(wrapperHTML);\n else\n el.append(wrapperHTML);\n });\n },\n\n wrap : function(wrapperHTML) {\n return this.each(function() { FakejQuery(this).wrapAll(wrapperHTML); });\n },\n\n\n //DOM NODE MANIPULATION / INFORMATION:\n\n css : function(styles, val) {\n var el;\n var key;\n var cptStyle;\n var getCptStyle = window.getComputedStyle;\n if(_type(styles) == TYPES.s) {\n if(val === undefined) {\n el = this[0];\n cptStyle = getCptStyle ? getCptStyle(el, null) : el.currentStyle[styles];\n\n //https://bugzilla.mozilla.org/show_bug.cgi?id=548397 can be null sometimes if iframe with display: none (firefox only!)\n return getCptStyle ? cptStyle != null ? cptStyle.getPropertyValue(styles) : el[LEXICON.s][styles] : cptStyle;\n }\n else {\n return this.each(function() {\n setCSSVal(this, styles, val);\n });\n }\n }\n else {\n return this.each(function() {\n for(key in styles)\n setCSSVal(this, key, styles[key]);\n });\n }\n },\n\n hasClass : function(className) {\n var elem, i = 0;\n var classNamePrepared = _strSpace + className + _strSpace;\n var classList;\n\n while ((elem = this[ i++ ])) {\n classList = elem.classList;\n if(classList && classList.contains(className))\n return true;\n else if (elem.nodeType === 1 && (_strSpace + stripAndCollapse(elem.className + _strEmpty) + _strSpace).indexOf(classNamePrepared) > -1)\n return true;\n }\n\n return false;\n },\n\n addClass : function(className) {\n var classes;\n var elem;\n var cur;\n var curValue;\n var clazz;\n var finalValue;\n var supportClassList;\n var elmClassList;\n var i = 0;\n var v = 0;\n\n if (className) {\n classes = className.match( _rnothtmlwhite ) || [];\n\n while ((elem = this[i++])) {\n elmClassList = elem.classList;\n if(supportClassList === undefined)\n supportClassList = elmClassList !== undefined;\n\n if(supportClassList) {\n while ((clazz = classes[v++]))\n elmClassList.add(clazz);\n }\n else {\n curValue = elem.className + _strEmpty;\n cur = elem.nodeType === 1 && (_strSpace + stripAndCollapse(curValue) + _strSpace);\n\n if (cur) {\n while ((clazz = classes[v++]))\n if (cur.indexOf(_strSpace + clazz + _strSpace) < 0)\n cur += clazz + _strSpace;\n\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue)\n elem.className = finalValue;\n }\n }\n }\n }\n\n return this;\n },\n\n removeClass : function(className) {\n var classes;\n var elem;\n var cur;\n var curValue;\n var clazz;\n var finalValue;\n var supportClassList;\n var elmClassList;\n var i = 0;\n var v = 0;\n\n if (className) {\n classes = className.match(_rnothtmlwhite) || [];\n\n while ((elem = this[i++])) {\n elmClassList = elem.classList;\n if(supportClassList === undefined)\n supportClassList = elmClassList !== undefined;\n\n if(supportClassList) {\n while ((clazz = classes[v++]))\n elmClassList.remove(clazz);\n }\n else {\n curValue = elem.className + _strEmpty;\n cur = elem.nodeType === 1 && (_strSpace + stripAndCollapse(curValue) + _strSpace);\n\n if (cur) {\n while ((clazz = classes[v++]))\n while (cur.indexOf(_strSpace + clazz + _strSpace) > -1)\n cur = cur.replace(_strSpace + clazz + _strSpace, _strSpace);\n\n finalValue = stripAndCollapse(cur);\n if (curValue !== finalValue)\n elem.className = finalValue;\n }\n }\n }\n }\n\n return this;\n },\n\n hide : function() {\n return this.each(function() { this[LEXICON.s].display = 'none'; });\n },\n\n show : function() {\n return this.each(function() { this[LEXICON.s].display = 'block'; });\n },\n\n attr : function(attrName, value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el.getAttribute(attrName);\n el.setAttribute(attrName, value);\n }\n return this;\n },\n\n removeAttr : function(attrName) {\n return this.each(function() { this.removeAttribute(attrName); });\n },\n\n offset : function() {\n var el = this[0];\n var rect = el[LEXICON.bCR]();\n var scrollLeft = window.pageXOffset || document.documentElement[_strScrollLeft];\n var scrollTop = window.pageYOffset || document.documentElement[_strScrollTop];\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft\n };\n },\n\n position : function() {\n var el = this[0];\n return {\n top: el.offsetTop,\n left: el.offsetLeft\n };\n },\n\n scrollLeft : function(value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el[_strScrollLeft];\n el[_strScrollLeft] = value;\n }\n return this;\n },\n\n scrollTop : function(value) {\n var i = 0;\n var el;\n while (el = this[i++]) {\n if(value === undefined)\n return el[_strScrollTop];\n el[_strScrollTop] = value;\n }\n return this;\n },\n\n val : function(value) {\n var el = this[0];\n if(!value)\n return el.value;\n el.value = value;\n return this;\n },\n\n\n //DOM TRAVERSAL / FILTERING:\n\n first : function() {\n return this.eq(0);\n },\n\n last : function() {\n return this.eq(-1);\n },\n\n eq : function(index) {\n return FakejQuery(this[index >= 0 ? index : this[LEXICON.l] + index]);\n },\n\n find : function(selector) {\n var children = [ ];\n var i;\n this.each(function() {\n var el = this;\n var ch = el.querySelectorAll(selector);\n for(i = 0; i < ch[LEXICON.l]; i++)\n children.push(ch[i]);\n });\n return FakejQuery(children);\n },\n\n children : function(selector) {\n var children = [ ];\n var el;\n var ch;\n var i;\n\n this.each(function() {\n ch = this.children;\n for(i = 0; i < ch[LEXICON.l]; i++) {\n el = ch[i];\n if(selector) {\n if((el.matches && el.matches(selector)) || matches(el, selector))\n children.push(el);\n }\n else\n children.push(el);\n }\n });\n return FakejQuery(children);\n },\n\n parent : function(selector) {\n var parents = [ ];\n var parent;\n this.each(function() {\n parent = this.parentNode;\n if(selector ? FakejQuery(parent).is(selector) : true)\n parents.push(parent);\n });\n return FakejQuery(parents);\n },\n\n is : function(selector) {\n \n var el;\n var i;\n for(i = 0; i < this[LEXICON.l]; i++) {\n el = this[i];\n if(selector === ':visible')\n return elementIsVisible(el);\n if(selector === ':hidden')\n return !elementIsVisible(el);\n if((el.matches && el.matches(selector)) || matches(el, selector))\n return true;\n }\n return false;\n },\n\n contents : function() {\n var contents = [ ];\n var childs;\n var i;\n\n this.each(function() {\n childs = this.childNodes;\n for(i = 0; i < childs[LEXICON.l]; i++)\n contents.push(childs[i]);\n });\n\n return FakejQuery(contents);\n },\n\n each : function(callback) {\n return each(this, callback);\n },\n\n\n //ANIMATION:\n\n animate : function(props, duration, easing, complete) {\n return this.each(function() { animate(this, props, duration, easing, complete); });\n },\n\n stop : function(clearQ, jump) {\n return this.each(function() { stop(this, clearQ, jump); });\n }\n };\n\n extend(FakejQuery, {\n extend : extend,\n inArray : inArray,\n isEmptyObject : isEmptyObject,\n isPlainObject : isPlainObject,\n each : each\n });\n\n return FakejQuery;\n })();\n var INSTANCES = (function() {\n var _targets = [ ];\n var _instancePropertyString = '__overlayScrollbars__';\n\n /**\n * Register, unregister or get a certain (or all) instances.\n * Register: Pass the target and the instance.\n * Unregister: Pass the target and null.\n * Get Instance: Pass the target from which the instance shall be got.\n * Get Targets: Pass no arguments.\n * @param target The target to which the instance shall be registered / from which the instance shall be unregistered / the instance shall be got\n * @param instance The instance.\n * @returns {*|void} Returns the instance from the given target.\n */\n return function (target, instance) {\n var argLen = arguments[LEXICON.l];\n if(argLen < 1) {\n //return all targets\n return _targets;\n }\n else {\n if(instance) {\n //register instance\n target[_instancePropertyString] = instance;\n _targets.push(target);\n }\n else {\n var index = COMPATIBILITY.inA(target, _targets);\n if (index > -1) {\n if(argLen > 1) {\n //unregister instance\n delete target[_instancePropertyString];\n _targets.splice(index, 1);\n }\n else {\n //get instance from target\n return _targets[index][_instancePropertyString];\n }\n }\n }\n }\n }\n })();\n var PLUGIN = (function() {\n var _plugin;\n var _pluginsGlobals;\n var _pluginsAutoUpdateLoop;\n var _pluginsExtensions = [ ];\n var _pluginsOptions = (function() {\n var type = COMPATIBILITY.type;\n var possibleTemplateTypes = [\n TYPES.b, //boolean\n TYPES.n, //number\n TYPES.s, //string\n TYPES.a, //array\n TYPES.o, //object\n TYPES.f, //function\n TYPES.z //null\n ];\n var restrictedStringsSplit = ' ';\n var restrictedStringsPossibilitiesSplit = ':';\n var classNameAllowedValues = [TYPES.z, TYPES.s];\n var numberAllowedValues = TYPES.n;\n var booleanNullAllowedValues = [TYPES.z, TYPES.b];\n var booleanTrueTemplate = [true, TYPES.b];\n var booleanFalseTemplate = [false, TYPES.b];\n var callbackTemplate = [null, [TYPES.z, TYPES.f]];\n var inheritedAttrsTemplate = [['style', 'class'], [TYPES.s, TYPES.a, TYPES.z]];\n var resizeAllowedValues = 'n:none b:both h:horizontal v:vertical';\n var overflowBehaviorAllowedValues = 'v-h:visible-hidden v-s:visible-scroll s:scroll h:hidden';\n var scrollbarsVisibilityAllowedValues = 'v:visible h:hidden a:auto';\n var scrollbarsAutoHideAllowedValues = 'n:never s:scroll l:leave m:move';\n var optionsDefaultsAndTemplate = {\n className: ['os-theme-dark', classNameAllowedValues], //null || string\n resize: ['none', resizeAllowedValues], //none || both || horizontal || vertical || n || b || h || v\n sizeAutoCapable: booleanTrueTemplate, //true || false\n clipAlways: booleanTrueTemplate, //true || false\n normalizeRTL: booleanTrueTemplate, //true || false\n paddingAbsolute: booleanFalseTemplate, //true || false\n autoUpdate: [null, booleanNullAllowedValues], //true || false || null\n autoUpdateInterval: [33, numberAllowedValues], //number\n nativeScrollbarsOverlaid: {\n showNativeScrollbars: booleanFalseTemplate, //true || false\n initialize: booleanTrueTemplate //true || false\n },\n overflowBehavior: {\n x: ['scroll', overflowBehaviorAllowedValues], //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s\n y: ['scroll', overflowBehaviorAllowedValues] //visible-hidden || visible-scroll || hidden || scroll || v-h || v-s || h || s\n },\n scrollbars: {\n visibility: ['auto', scrollbarsVisibilityAllowedValues], //visible || hidden || auto || v || h || a\n autoHide: ['never', scrollbarsAutoHideAllowedValues], //never || scroll || leave || move || n || s || l || m\n autoHideDelay: [800, numberAllowedValues], //number\n dragScrolling: booleanTrueTemplate, //true || false\n clickScrolling: booleanFalseTemplate, //true || false\n touchSupport: booleanTrueTemplate, //true || false\n snapHandle: booleanFalseTemplate //true || false\n },\n textarea: {\n dynWidth: booleanFalseTemplate, //true || false\n dynHeight: booleanFalseTemplate, //true || false\n inheritedAttrs : inheritedAttrsTemplate //string || array || null\n },\n callbacks: {\n onInitialized: callbackTemplate, //null || function\n onInitializationWithdrawn: callbackTemplate, //null || function\n onDestroyed: callbackTemplate, //null || function\n onScrollStart: callbackTemplate, //null || function\n onScroll: callbackTemplate, //null || function\n onScrollStop: callbackTemplate, //null || function\n onOverflowChanged: callbackTemplate, //null || function\n onOverflowAmountChanged: callbackTemplate, //null || function\n onDirectionChanged: callbackTemplate, //null || function\n onContentSizeChanged: callbackTemplate, //null || function\n onHostSizeChanged: callbackTemplate, //null || function\n onUpdated: callbackTemplate //null || function\n }\n };\n var convert = function(template) {\n var recursive = function(obj) {\n var key;\n var val;\n var valType;\n for(key in obj) {\n if(!obj[LEXICON.hOP](key))\n continue;\n val = obj[key];\n valType = type(val);\n if(valType == TYPES.a)\n obj[key] = val[template ? 1 : 0];\n else if(valType == TYPES.o)\n obj[key] = recursive(val);\n }\n return obj;\n };\n return recursive(FRAMEWORK.extend(true, { }, optionsDefaultsAndTemplate));\n };\n\n return {\n _defaults : convert(),\n\n _template : convert(true),\n\n /**\n * Validates the passed object by the passed template.\n * @param obj The object which shall be validated.\n * @param template The template which defines the allowed values and types.\n * @param writeErrors True if errors shall be logged to the console.\n * @param diffObj If a object is passed then only valid differences to this object will be returned.\n * @returns {{}} A object which contains two objects called \"default\" and \"prepared\" which contains only the valid properties of the passed original object and discards not different values compared to the passed diffObj.\n */\n _validate : function (obj, template, writeErrors, diffObj) {\n var validatedOptions = { };\n var validatedOptionsPrepared = { };\n var objectCopy = FRAMEWORK.extend(true, { }, obj);\n var inArray = FRAMEWORK.inArray;\n var isEmptyObj = FRAMEWORK.isEmptyObject;\n var checkObjectProps = function(data, template, diffData, validatedOptions, validatedOptionsPrepared, prevPropName) {\n for (var prop in template) {\n if (template[LEXICON.hOP](prop) && data[LEXICON.hOP](prop)) {\n var isValid = false;\n var isDiff = false;\n var templateValue = template[prop];\n var templateValueType = type(templateValue);\n var templateIsComplex = templateValueType == TYPES.o;\n var templateTypes = type(templateValue) != TYPES.a ? [ templateValue ] : templateValue;\n var dataDiffValue = diffData[prop];\n var dataValue = data[prop];\n var dataValueType = type(dataValue);\n var propPrefix = prevPropName ? prevPropName + '.' : '';\n var error = \"The option \\\"\" + propPrefix + prop + \"\\\" wasn't set, because\";\n var errorPossibleTypes = [ ];\n var errorRestrictedStrings = [ ];\n var restrictedStringValuesSplit;\n var restrictedStringValuesPossibilitiesSplit;\n var isRestrictedValue;\n var mainPossibility;\n var currType;\n var i;\n var v;\n var j;\n\n dataDiffValue = dataDiffValue === undefined ? { } : dataDiffValue;\n \n //if the template has a object as value, it means that the options are complex (verschachtelt)\n if(templateIsComplex && dataValueType == TYPES.o) {\n validatedOptions[prop] = { };\n validatedOptionsPrepared[prop] = { };\n checkObjectProps(dataValue, templateValue, dataDiffValue, validatedOptions[prop], validatedOptionsPrepared[prop], propPrefix + prop);\n FRAMEWORK.each([ data, validatedOptions, validatedOptionsPrepared ], function(index, value) {\n if(isEmptyObj(value[prop])) {\n delete value[prop];\n }\n });\n }\n else if(!templateIsComplex) {\n for(i = 0; i < templateTypes[LEXICON.l]; i++) {\n currType = templateTypes[i];\n templateValueType = type(currType);\n //if currtype is string and starts with restrictedStringPrefix and end with restrictedStringSuffix\n isRestrictedValue = templateValueType == TYPES.s && inArray(currType, possibleTemplateTypes) === -1;\n if(isRestrictedValue) {\n errorPossibleTypes.push(TYPES.s);\n\n //split it into a array which contains all possible values for example: [\"y:yes\", \"n:no\", \"m:maybe\"]\n restrictedStringValuesSplit = currType.split(restrictedStringsSplit);\n errorRestrictedStrings = errorRestrictedStrings.concat(restrictedStringValuesSplit);\n for(v = 0; v < restrictedStringValuesSplit[LEXICON.l]; v++) {\n //split the possible values into their possibiliteis for example: [\"y\", \"yes\"] -> the first is always the mainPossibility\n restrictedStringValuesPossibilitiesSplit = restrictedStringValuesSplit[v].split(restrictedStringsPossibilitiesSplit);\n mainPossibility = restrictedStringValuesPossibilitiesSplit[0];\n for(j = 0; j < restrictedStringValuesPossibilitiesSplit[LEXICON.l]; j++) {\n //if any possibility matches with the dataValue, its valid\n if(dataValue === restrictedStringValuesPossibilitiesSplit[j]) {\n isValid = true;\n break;\n }\n }\n if(isValid)\n break;\n }\n }\n else {\n errorPossibleTypes.push(currType);\n\n if(dataValueType === currType) {\n isValid = true;\n break;\n }\n }\n }\n\n if(isValid) {\n isDiff = dataValue !== dataDiffValue;\n \n if(isDiff)\n validatedOptions[prop] = dataValue;\n \n if(isRestrictedValue ? inArray(dataDiffValue, restrictedStringValuesPossibilitiesSplit) < 0 : isDiff)\n validatedOptionsPrepared[prop] = isRestrictedValue ? mainPossibility : dataValue;\n }\n else if(writeErrors) {\n console.warn(error + \" it doesn't accept the type [ \" + dataValueType.toUpperCase() + \" ] with the value of \\\"\" + dataValue + \"\\\".\\r\\n\" +\n \"Accepted types are: [ \" + errorPossibleTypes.join(', ').toUpperCase() + \" ].\" +\n (errorRestrictedStrings[length] > 0 ? \"\\r\\nValid strings are: [ \" + errorRestrictedStrings.join(', ').split(restrictedStringsPossibilitiesSplit).join(', ') + \" ].\" : ''));\n }\n delete data[prop];\n }\n }\n }\n };\n checkObjectProps(objectCopy, template, diffObj || { }, validatedOptions, validatedOptionsPrepared);\n\n //add values which aren't specified in the template to the finished validated object to prevent them from being discarded\n /*\n if(keepForeignProps) {\n FRAMEWORK.extend(true, validatedOptions, objectCopy);\n FRAMEWORK.extend(true, validatedOptionsPrepared, objectCopy);\n }\n */\n \n if(!isEmptyObj(objectCopy) && writeErrors)\n console.warn('The following options are discarded due to invalidity:\\r\\n' + window.JSON.stringify(objectCopy, null, 2));\n\n return {\n _default : validatedOptions,\n _prepared : validatedOptionsPrepared\n };\n }\n }\n }());\n\n /**\n * Initializes the object which contains global information about the plugin and each instance of it.\n */\n function initOverlayScrollbarsStatics() {\n if(!_pluginsGlobals)\n _pluginsGlobals = new OverlayScrollbarsGlobals(_pluginsOptions._defaults);\n if(!_pluginsAutoUpdateLoop)\n _pluginsAutoUpdateLoop = new OverlayScrollbarsAutoUpdateLoop(_pluginsGlobals);\n }\n\n /**\n * The global object for the OverlayScrollbars objects. It contains resources which every OverlayScrollbars object needs. This object is initialized only once: if the first OverlayScrollbars object gets initialized.\n * @param defaultOptions\n * @constructor\n */\n function OverlayScrollbarsGlobals(defaultOptions) {\n var _base = this;\n var strOverflow = 'overflow';\n var strHidden = 'hidden';\n var strScroll = 'scroll';\n var bodyElement = FRAMEWORK('body');\n var scrollbarDummyElement = FRAMEWORK('<div id=\"os-dummy-scrollbar-size\"><div></div></div>');\n var scrollbarDummyElement0 = scrollbarDummyElement[0];\n var dummyContainerChild = FRAMEWORK(scrollbarDummyElement.children('div').eq(0));\n\n bodyElement.append(scrollbarDummyElement);\n scrollbarDummyElement.hide().show(); //fix IE8 bug (incorrect measuring)\n\n var nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement0);\n var nativeScrollbarIsOverlaid = {\n x: nativeScrollbarSize.x === 0,\n y: nativeScrollbarSize.y === 0\n };\n var msie = (function() {\n var ua = window.navigator.userAgent;\n var strIndexOf = 'indexOf';\n var strSubString = 'substring';\n var msie = ua[strIndexOf]('MSIE ');\n var trident = ua[strIndexOf]('Trident/');\n var edge = ua[strIndexOf]('Edge/');\n var rv = ua[strIndexOf]('rv:');\n var result;\n var parseIntFunc = parseInt;\n\n // IE 10 or older => return version number\n if (msie > 0)\n result = parseIntFunc(ua[strSubString](msie + 5, ua[strIndexOf]('.', msie)), 10);\n\n // IE 11 => return version number\n else if (trident > 0)\n result = parseIntFunc(ua[strSubString](rv + 3, ua[strIndexOf]('.', rv)), 10);\n\n // Edge (IE 12+) => return version number\n else if (edge > 0)\n result = parseIntFunc(ua[strSubString](edge + 5, ua[strIndexOf]('.', edge)), 10);\n\n // other browser\n return result;\n })();\n\n FRAMEWORK.extend(_base, {\n defaultOptions : defaultOptions,\n msie : msie,\n autoUpdateLoop : false,\n autoUpdateRecommended : !COMPATIBILITY.mO(),\n nativeScrollbarSize : nativeScrollbarSize,\n nativeScrollbarIsOverlaid : nativeScrollbarIsOverlaid,\n nativeScrollbarStyling : (function() {\n var result = false;\n scrollbarDummyElement.addClass('os-viewport-native-scrollbars-invisible');\n try {\n result = (scrollbarDummyElement.css('scrollbar-width') === 'none' && (msie > 9 || !msie)) || window.getComputedStyle(scrollbarDummyElement0, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\n } catch (ex) { }\n \n //fix opera bug: scrollbar styles will only appear if overflow value is scroll or auto during the activation of the style.\n //and set overflow to scroll\n //scrollbarDummyElement.css(strOverflow, strHidden).hide().css(strOverflow, strScroll).show();\n //return (scrollbarDummyElement0[LEXICON.oH] - scrollbarDummyElement0[LEXICON.cH]) === 0 && (scrollbarDummyElement0[LEXICON.oW] - scrollbarDummyElement0[LEXICON.cW]) === 0;\n \n return result;\n })(),\n overlayScrollbarDummySize : { x: 30, y: 30 },\n cssCalc : (function() {\n var dummyStyle = document.createElement('div')[LEXICON.s];\n var strCalc = 'calc';\n var i = -1;\n var prop;\n\n for(; i < VENDORS._cssPrefixes[LEXICON.l]; i++) {\n prop = i < 0 ? strCalc : VENDORS._cssPrefixes[i] + strCalc;\n dummyStyle.cssText = 'width:' + prop + '(1px);';\n if (dummyStyle[LEXICON.l])\n return prop;\n }\n return null;\n })(),\n restrictedMeasuring : (function() {\n //https://bugzilla.mozilla.org/show_bug.cgi?id=1439305\n scrollbarDummyElement.css(strOverflow, strHidden);\n var scrollSize = {\n w : scrollbarDummyElement0[LEXICON.sW],\n h : scrollbarDummyElement0[LEXICON.sH]\n };\n scrollbarDummyElement.css(strOverflow, 'visible');\n var scrollSize2 = {\n w : scrollbarDummyElement0[LEXICON.sW],\n h : scrollbarDummyElement0[LEXICON.sH]\n };\n return (scrollSize.w - scrollSize2.w) !== 0 || (scrollSize.h - scrollSize2.h) !== 0;\n })(),\n rtlScrollBehavior : (function() {\n scrollbarDummyElement.css({ 'overflow-y' : strHidden, 'overflow-x' : strScroll, 'direction' : 'rtl' }).scrollLeft(0);\n var dummyContainerOffset = scrollbarDummyElement.offset();\n var dummyContainerChildOffset = dummyContainerChild.offset();\n scrollbarDummyElement.scrollLeft(999);\n var dummyContainerScrollOffsetAfterScroll = dummyContainerChild.offset();\n return {\n //origin direction = determines if the zero scroll position is on the left or right side\n //'i' means 'invert' (i === true means that the axis must be inverted to be correct)\n //true = on the left side\n //false = on the right side\n i : dummyContainerOffset.left === dummyContainerChildOffset.left,\n //negative = determines if the maximum scroll is positive or negative\n //'n' means 'negate' (n === true means that the axis must be negated to be correct)\n //true = negative\n //false = positive\n n : dummyContainerChildOffset.left - dummyContainerScrollOffsetAfterScroll.left === 0\n };\n })(),\n supportTransform : VENDORS._cssProperty('transform') !== undefined,\n supportTransition : VENDORS._cssProperty('transition') !== undefined,\n supportPassiveEvents : (function() {\n var supportsPassive = false;\n try {\n window.addEventListener('test', null, Object.defineProperty({ }, 'passive', {\n get: function() {\n supportsPassive = true;\n }\n }));\n } catch (e) { }\n return supportsPassive;\n })(),\n supportResizeObserver : !!COMPATIBILITY.rO(),\n supportMutationObserver : !!COMPATIBILITY.mO()\n });\n\n scrollbarDummyElement.removeAttr(LEXICON.s).remove();\n\n //Catch zoom event:\n (function () {\n if(nativeScrollbarIsOverlaid.x && nativeScrollbarIsOverlaid.y)\n return;\n\n var abs = MATH.abs;\n var windowWidth = COMPATIBILITY.wW();\n var windowHeight = COMPATIBILITY.wH();\n var windowDpr = getWindowDPR();\n var onResize = function() {\n if(INSTANCES().length > 0) {\n var newW = COMPATIBILITY.wW();\n var newH = COMPATIBILITY.wH();\n var deltaW = newW - windowWidth;\n var deltaH = newH - windowHeight;\n\n if (deltaW === 0 && deltaH === 0)\n return;\n\n var deltaWRatio = MATH.round(newW / (windowWidth / 100.0));\n var deltaHRatio = MATH.round(newH / (windowHeight / 100.0));\n var absDeltaW = abs(deltaW);\n var absDeltaH = abs(deltaH);\n var absDeltaWRatio = abs(deltaWRatio);\n var absDeltaHRatio = abs(deltaHRatio);\n var newDPR = getWindowDPR();\n\n var deltaIsBigger = absDeltaW > 2 && absDeltaH > 2;\n var difference = !differenceIsBiggerThanOne(absDeltaWRatio, absDeltaHRatio);\n var dprChanged = newDPR !== windowDpr && windowDpr > 0;\n var isZoom = deltaIsBigger && difference && dprChanged;\n var oldScrollbarSize = _base.nativeScrollbarSize;\n var newScrollbarSize;\n\n if (isZoom) {\n bodyElement.append(scrollbarDummyElement);\n newScrollbarSize = _base.nativeScrollbarSize = calcNativeScrollbarSize(scrollbarDummyElement[0]);\n scrollbarDummyElement.remove();\n if(oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\n FRAMEWORK.each(INSTANCES(), function () {\n if(INSTANCES(this))\n INSTANCES(this).update('zoom');\n });\n }\n }\n\n windowWidth = newW;\n windowHeight = newH;\n windowDpr = newDPR;\n }\n };\n\n function differenceIsBiggerThanOne(valOne, valTwo) {\n var absValOne = abs(valOne);\n var absValTwo = abs(valTwo);\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\n }\n\n function getWindowDPR() {\n var dDPI = window.screen.deviceXDPI || 0;\n var sDPI = window.screen.logicalXDPI || 1;\n return window.devicePixelRatio || (dDPI / sDPI);\n }\n\n FRAMEWORK(window).on('resize', onResize);\n })();\n\n function calcNativeScrollbarSize(measureElement) {\n return {\n x: measureElement[LEXICON.oH] - measureElement[LEXICON.cH],\n y: measureElement[LEXICON.oW] - measureElement[LEXICON.cW]\n };\n }\n }\n\n /**\n * The object which manages the auto update loop for all OverlayScrollbars objects. This object is initialized only once: if the first OverlayScrollbars object gets initialized.\n * @constructor\n */\n function OverlayScrollbarsAutoUpdateLoop(globals) {\n var _base = this;\n var _inArray = FRAMEWORK.inArray;\n var _getNow = COMPATIBILITY.now;\n var _strAutoUpdate = 'autoUpdate';\n var _strAutoUpdateInterval = _strAutoUpdate + 'Interval';\n var _strLength = LEXICON.l;\n var _loopingInstances = [ ];\n var _loopingInstancesIntervalCache = [ ];\n var _loopIsActive = false;\n var _loopIntervalDefault = 33;\n var _loopInterval = _loopIntervalDefault;\n var _loopTimeOld = _getNow();\n var _loopID;\n \n\n /**\n * The auto update loop which will run every 50 milliseconds or less if the update interval of a instance is lower than 50 milliseconds.\n */\n var loop = function() {\n if(_loopingInstances[_strLength] > 0 && _loopIsActive) {\n _loopID = COMPATIBILITY.rAF()(function () {\n loop();\n });\n var timeNew = _getNow();\n var timeDelta = timeNew - _loopTimeOld;\n var lowestInterval;\n var instance;\n var instanceOptions;\n var instanceAutoUpdateAllowed;\n var instanceAutoUpdateInterval;\n var now;\n\n if (timeDelta > _loopInterval) {\n _loopTimeOld = timeNew - (timeDelta % _loopInterval);\n lowestInterval = _loopIntervalDefault;\n for(var i = 0; i < _loopingInstances[_strLength]; i++) {\n instance = _loopingInstances[i];\n if (instance !== undefined) {\n instanceOptions = instance.options();\n instanceAutoUpdateAllowed = instanceOptions[_strAutoUpdate];\n instanceAutoUpdateInterval = MATH.max(1, instanceOptions[_strAutoUpdateInterval]);\n now = _getNow();\n\n if ((instanceAutoUpdateAllowed === true || instanceAutoUpdateAllowed === null) && (now - _loopingInstancesIntervalCache[i]) > instanceAutoUpdateInterval) {\n instance.update('auto');\n _loopingInstancesIntervalCache[i] = new Date(now += instanceAutoUpdateInterval);\n }\n\n lowestInterval = MATH.max(1, MATH.min(lowestInterval, instanceAutoUpdateInterval));\n }\n }\n _loopInterval = lowestInterval;\n }\n } else {\n _loopInterval = _loopIntervalDefault;\n }\n };\n\n /**\n * Add OverlayScrollbars instance to the auto update loop. Only successful if the instance isn't already added.\n * @param instance The instance which shall be updated in a loop automatically.\n */\n _base.add = function(instance) {\n if(_inArray(instance, _loopingInstances) === -1) {\n _loopingInstances.push(instance);\n _loopingInstancesIntervalCache.push(_getNow());\n if (_loopingInstances[_strLength] > 0 && !_loopIsActive) {\n _loopIsActive = true;\n globals.autoUpdateLoop = _loopIsActive;\n loop();\n }\n }\n };\n\n /**\n * Remove OverlayScrollbars instance from the auto update loop. Only successful if the instance was added before.\n * @param instance The instance which shall be updated in a loop automatically.\n */\n _base.remove = function(instance) {\n var index = _inArray(instance, _loopingInstances);\n if(index > -1) {\n //remove from loopingInstances list\n _loopingInstancesIntervalCache.splice(index, 1);\n _loopingInstances.splice(index, 1);\n\n //correct update loop behavior\n if (_loopingInstances[_strLength] === 0 && _loopIsActive) {\n _loopIsActive = false;\n globals.autoUpdateLoop = _loopIsActive;\n if(_loopID !== undefined) {\n COMPATIBILITY.cAF()(_loopID);\n _loopID = -1;\n }\n }\n }\n };\n }\n\n /**\n * A object which manages the scrollbars visibility of the target element.\n * @param pluginTargetElement The element from which the scrollbars shall be hidden.\n * @param options The custom options.\n * @param extensions The custom extensions.\n * @param globals\n * @param autoUpdateLoop\n * @returns {*}\n * @constructor\n */\n function OverlayScrollbarsInstance(pluginTargetElement, options, extensions, globals, autoUpdateLoop) {\n //shortcuts\n var type = COMPATIBILITY.type;\n var inArray = FRAMEWORK.inArray;\n var each = FRAMEWORK.each;\n \n //make correct instanceof\n var _base = new _plugin();\n var _frameworkProto = FRAMEWORK[LEXICON.p];\n \n //if passed element is no HTML element: skip and return\n if(!isHTMLElement(pluginTargetElement))\n return;\n \n //if passed element is already initialized: set passed options if there are any and return its instance\n if(INSTANCES(pluginTargetElement)) {\n var inst = INSTANCES(pluginTargetElement);\n inst.options(options);\n return inst;\n }\n\n //globals:\n var _nativeScrollbarIsOverlaid;\n var _overlayScrollbarDummySize;\n var _rtlScrollBehavior;\n var _autoUpdateRecommended;\n var _msieVersion;\n var _nativeScrollbarStyling;\n var _cssCalc;\n var _nativeScrollbarSize;\n var _supportTransition;\n var _supportTransform;\n var _supportPassiveEvents;\n var _supportResizeObserver;\n var _supportMutationObserver;\n var _restrictedMeasuring;\n\n //general readonly:\n var _initialized;\n var _destroyed;\n var _isTextarea;\n var _isBody;\n var _documentMixed;\n var _domExists;\n\n //general:\n var _isBorderBox;\n var _sizeAutoObserverAdded;\n var _paddingX;\n var _paddingY;\n var _borderX;\n var _borderY;\n var _marginX;\n var _marginY;\n var _isRTL;\n var _sleeping;\n var _contentBorderSize = { };\n var _scrollHorizontalInfo = { };\n var _scrollVerticalInfo = { };\n var _viewportSize = { };\n var _nativeScrollbarMinSize = { };\n\n //naming:\n var _strMinusHidden = '-hidden';\n var _strMarginMinus = 'margin-';\n var _strPaddingMinus = 'padding-';\n var _strBorderMinus = 'border-';\n var _strTop = 'top';\n var _strRight = 'right';\n var _strBottom = 'bottom';\n var _strLeft = 'left';\n var _strMinMinus = 'min-';\n var _strMaxMinus = 'max-';\n var _strWidth = 'width';\n var _strHeight = 'height';\n var _strFloat = 'float';\n var _strEmpty = '';\n var _strAuto = 'auto';\n var _strSync = 'sync';\n var _strScroll = 'scroll';\n var _strHundredPercent = '100%';\n var _strX = 'x';\n var _strY = 'y';\n var _strDot = '.';\n var _strSpace = ' ';\n var _strScrollbar = 'scrollbar';\n var _strMinusHorizontal = '-horizontal';\n var _strMinusVertical = '-vertical';\n var _strScrollLeft = _strScroll + 'Left';\n var _strScrollTop = _strScroll + 'Top';\n var _strMouseTouchDownEvent = 'mousedown touchstart';\n var _strMouseTouchUpEvent = 'mouseup touchend touchcancel';\n var _strMouseTouchMoveEvent = 'mousemove touchmove';\n var _strMouseTouchEnter = 'mouseenter';\n var _strMouseTouchLeave = 'mouseleave';\n var _strKeyDownEvent = 'keydown';\n var _strKeyUpEvent = 'keyup';\n var _strSelectStartEvent = 'selectstart';\n var _strTransitionEndEvent = 'transitionend webkitTransitionEnd oTransitionEnd';\n var _strResizeObserverProperty = '__overlayScrollbarsRO__';\n\n //class names:\n var _cassNamesPrefix = 'os-';\n var _classNameHTMLElement = _cassNamesPrefix + 'html';\n var _classNameHostElement = _cassNamesPrefix + 'host';\n var _classNameHostTextareaElement = _classNameHostElement + '-textarea';\n var _classNameHostScrollbarHorizontalHidden = _classNameHostElement + '-' + _strScrollbar + _strMinusHorizontal + _strMinusHidden;\n var _classNameHostScrollbarVerticalHidden = _classNameHostElement + '-' + _strScrollbar + _strMinusVertical + _strMinusHidden;\n var _classNameHostTransition = _classNameHostElement + '-transition';\n var _classNameHostRTL = _classNameHostElement + '-rtl';\n var _classNameHostResizeDisabled = _classNameHostElement + '-resize-disabled';\n var _classNameHostScrolling = _classNameHostElement + '-scrolling';\n var _classNameHostOverflow = _classNameHostElement + '-overflow';\n var _classNameHostOverflowX = _classNameHostOverflow + '-x';\n var _classNameHostOverflowY = _classNameHostOverflow + '-y';\n var _classNameTextareaElement = _cassNamesPrefix + 'textarea';\n var _classNameTextareaCoverElement = _classNameTextareaElement + '-cover';\n var _classNamePaddingElement = _cassNamesPrefix + 'padding';\n var _classNameViewportElement = _cassNamesPrefix + 'viewport';\n var _classNameViewportNativeScrollbarsInvisible = _classNameViewportElement + '-native-scrollbars-invisible';\n var _classNameViewportNativeScrollbarsOverlaid = _classNameViewportElement + '-native-scrollbars-overlaid';\n var _classNameContentElement = _cassNamesPrefix + 'content';\n var _classNameContentArrangeElement = _cassNamesPrefix + 'content-arrange';\n var _classNameContentGlueElement = _cassNamesPrefix + 'content-glue';\n var _classNameSizeAutoObserverElement = _cassNamesPrefix + 'size-auto-observer';\n var _classNameResizeObserverElement = _cassNamesPrefix + 'resize-observer';\n var _classNameResizeObserverItemElement = _cassNamesPrefix + 'resize-observer-item';\n var _classNameResizeObserverItemFinalElement = _classNameResizeObserverItemElement + '-final';\n var _classNameTextInherit = _cassNamesPrefix + 'text-inherit';\n var _classNameScrollbar = _cassNamesPrefix + _strScrollbar;\n var _classNameScrollbarTrack = _classNameScrollbar + '-track';\n var _classNameScrollbarTrackOff = _classNameScrollbarTrack + '-off';\n var _classNameScrollbarHandle = _classNameScrollbar + '-handle';\n var _classNameScrollbarHandleOff = _classNameScrollbarHandle + '-off';\n var _classNameScrollbarUnusable = _classNameScrollbar + '-unusable';\n var _classNameScrollbarAutoHidden = _classNameScrollbar + '-' + _strAuto + _strMinusHidden;\n var _classNameScrollbarCorner = _classNameScrollbar + '-corner';\n var _classNameScrollbarCornerResize = _classNameScrollbarCorner + '-resize';\n var _classNameScrollbarCornerResizeB = _classNameScrollbarCornerResize + '-both';\n var _classNameScrollbarCornerResizeH = _classNameScrollbarCornerResize + _strMinusHorizontal;\n var _classNameScrollbarCornerResizeV = _classNameScrollbarCornerResize + _strMinusVertical;\n var _classNameScrollbarHorizontal = _classNameScrollbar + _strMinusHorizontal;\n var _classNameScrollbarVertical = _classNameScrollbar + _strMinusVertical;\n var _classNameDragging = _cassNamesPrefix + 'dragging';\n var _classNameThemeNone = _cassNamesPrefix + 'theme-none';\n var _classNamesDynamicDestroy = [\n _classNameViewportNativeScrollbarsInvisible,\n _classNameViewportNativeScrollbarsOverlaid,\n _classNameScrollbarTrackOff,\n _classNameScrollbarHandleOff,\n _classNameScrollbarUnusable,\n _classNameScrollbarAutoHidden,\n _classNameScrollbarCornerResize,\n _classNameScrollbarCornerResizeB,\n _classNameScrollbarCornerResizeH,\n _classNameScrollbarCornerResizeV,\n _classNameDragging].join(_strSpace);\n \n //callbacks:\n var _callbacksInitQeueue = [ ];\n\n //options:\n var _defaultOptions;\n var _currentOptions;\n var _currentPreparedOptions;\n\n //extensions:\n var _extensions = { };\n var _extensionsPrivateMethods = 'added removed on contract';\n\n //update\n var _lastUpdateTime;\n var _swallowedUpdateHints = { };\n var _swallowedUpdateTimeout;\n var _swallowUpdateLag = 42;\n var _imgs = [ ];\n\n //DOM elements:\n var _windowElement;\n var _documentElement;\n var _htmlElement;\n var _bodyElement;\n var _targetElement; //the target element of this OverlayScrollbars object\n var _hostElement; //the host element of this OverlayScrollbars object -> may be the same as targetElement\n var _sizeAutoObserverElement; //observes size auto changes\n var _sizeObserverElement; //observes size and padding changes\n var _paddingElement; //manages the padding\n var _viewportElement; //is the viewport of our scrollbar model\n var _contentElement; //the element which holds the content\n var _contentArrangeElement; //is needed for correct sizing of the content element (only if native scrollbars are overlays)\n var _contentGlueElement; //has always the size of the content element\n var _textareaCoverElement; //only applied if target is a textarea element. Used for correct size calculation and for prevention of uncontrolled scrolling\n var _scrollbarCornerElement;\n var _scrollbarHorizontalElement;\n var _scrollbarHorizontalTrackElement;\n var _scrollbarHorizontalHandleElement;\n var _scrollbarVerticalElement;\n var _scrollbarVerticalTrackElement;\n var _scrollbarVerticalHandleElement;\n var _windowElementNative;\n var _documentElementNative;\n var _targetElementNative;\n var _hostElementNative;\n var _sizeAutoObserverElementNative;\n var _sizeObserverElementNative;\n var _paddingElementNative;\n var _viewportElementNative;\n var _contentElementNative;\n\n //Cache:\n var _hostSizeCache;\n var _contentScrollSizeCache;\n var _arrangeContentSizeCache;\n var _hasOverflowCache;\n var _hideOverflowCache;\n var _widthAutoCache;\n var _heightAutoCache;\n var _cssMaxValueCache;\n var _cssBoxSizingCache;\n var _cssPaddingCache;\n var _cssBorderCache;\n var _cssMarginCache;\n var _cssDirectionCache;\n var _cssDirectionDetectedCache;\n var _paddingAbsoluteCache;\n var _clipAlwaysCache;\n var _contentGlueSizeCache;\n var _overflowBehaviorCache;\n var _overflowAmountCache;\n var _ignoreOverlayScrollbarHidingCache;\n var _autoUpdateCache;\n var _sizeAutoCapableCache;\n var _contentElementScrollSizeChangeDetectedCache;\n var _hostElementSizeChangeDetectedCache;\n var _scrollbarsVisibilityCache;\n var _scrollbarsAutoHideCache;\n var _scrollbarsClickScrollingCache;\n var _scrollbarsDragScrollingCache;\n var _resizeCache;\n var _normalizeRTLCache;\n var _classNameCache;\n var _oldClassName;\n var _textareaAutoWrappingCache;\n var _textareaInfoCache;\n var _textareaSizeCache;\n var _textareaDynHeightCache;\n var _textareaDynWidthCache;\n var _bodyMinSizeCache;\n var _viewportScrollSizeCache;\n var _displayIsHiddenCache;\n var _updateAutoCache = { };\n\n //MutationObserver:\n var _mutationObserverHost;\n var _mutationObserverContent;\n var _mutationObserverHostCallback;\n var _mutationObserverContentCallback;\n var _mutationObserversConnected;\n var _mutationObserverAttrsTextarea = ['wrap', 'cols', 'rows'];\n var _mutationObserverAttrsHost = [LEXICON.i, LEXICON.c, LEXICON.s, 'open'];\n\n //events:\n var _destroyEvents = [ ];\n\n //textarea:\n var _textareaHasFocus;\n\n //scrollbars:\n var _scrollbarsAutoHideTimeoutId;\n var _scrollbarsAutoHideMoveTimeoutId;\n var _scrollbarsAutoHideDelay;\n var _scrollbarsAutoHideNever;\n var _scrollbarsAutoHideScroll;\n var _scrollbarsAutoHideMove;\n var _scrollbarsAutoHideLeave;\n var _scrollbarsHandleHovered;\n var _scrollbarsHandlesDefineScrollPos;\n \n //resize\n var _resizeNone;\n var _resizeBoth;\n var _resizeHorizontal;\n var _resizeVertical;\n \n \n //==== Event Listener ====//\n\n /**\n * Adds or removes a event listener from the given element. \n * @param element The element to which the event listener shall be applied or removed.\n * @param eventNames The name(s) of the events.\n * @param listener The method which shall be called.\n * @param remove True if the handler shall be removed, false or undefined if the handler shall be added.\n */\n function setupResponsiveEventListener(element, eventNames, listener, remove, passive) {\n var collected = type(eventNames) == TYPES.a && type(listener) == TYPES.a;\n var method = remove ? 'removeEventListener' : 'addEventListener';\n var onOff = remove ? 'off' : 'on';\n var events = collected ? false : eventNames.split(_strSpace)\n var i = 0;\n\n if(collected) {\n for (; i < eventNames[LEXICON.l]; i++)\n setupResponsiveEventListener(element, eventNames[i], listener[i], remove);\n }\n else {\n for (; i < events[LEXICON.l]; i++) {\n if(_supportPassiveEvents)\n element[0][method](events[i], listener, { passive: passive || false });\n else\n element[onOff](events[i], listener);\n }\n }\n }\n\n\n function addDestroyEventListener(element, eventNames, listener, passive) {\n setupResponsiveEventListener(element, eventNames, listener, false, passive);\n _destroyEvents.push(COMPATIBILITY.bind(setupResponsiveEventListener, 0, element, eventNames, listener, true, passive));\n }\n\n //==== Resize Observer ====//\n\n /**\n * Adds or removes a resize observer from the given element.\n * @param targetElement The element to which the resize observer shall be added or removed.\n * @param onElementResizedCallback The callback which is fired every time the resize observer registers a size change or false / undefined if the resizeObserver shall be removed.\n */\n function setupResizeObserver(targetElement, onElementResizedCallback) {\n if(targetElement) {\n var resizeObserver = COMPATIBILITY.rO();\n var strAnimationStartEvent = 'animationstart mozAnimationStart webkitAnimationStart MSAnimationStart';\n var strChildNodes = 'childNodes';\n var constScroll = 3333333;\n var callback = function () {\n targetElement[_strScrollTop](constScroll)[_strScrollLeft](_isRTL ? _rtlScrollBehavior.n ? -constScroll : _rtlScrollBehavior.i ? 0 : constScroll : constScroll);\n onElementResizedCallback();\n };\n //add resize observer:\n if(onElementResizedCallback) {\n if (_supportResizeObserver) {\n var element = targetElement.append(generateDiv(_classNameResizeObserverElement + ' observed')).contents()[0];\n var observer = element[_strResizeObserverProperty] = new resizeObserver(callback);\n observer.observe(element);\n }\n else {\n if (_msieVersion > 9 || !_autoUpdateRecommended) {\n targetElement.prepend(\n generateDiv(_classNameResizeObserverElement,\n generateDiv({ c : _classNameResizeObserverItemElement, dir : 'ltr' },\n generateDiv(_classNameResizeObserverItemElement,\n generateDiv(_classNameResizeObserverItemFinalElement)\n ) +\n generateDiv(_classNameResizeObserverItemElement,\n generateDiv({ c : _classNameResizeObserverItemFinalElement, style : 'width: 200%; height: 200%' })\n )\n )\n )\n );\n\n var observerElement = targetElement[0][strChildNodes][0][strChildNodes][0];\n var shrinkElement = FRAMEWORK(observerElement[strChildNodes][1]);\n var expandElement = FRAMEWORK(observerElement[strChildNodes][0]);\n var expandElementChild = FRAMEWORK(expandElement[0][strChildNodes][0]);\n var widthCache = observerElement[LEXICON.oW];\n var heightCache = observerElement[LEXICON.oH];\n var isDirty;\n var rAFId;\n var currWidth;\n var currHeight;\n var factor = 2;\n var nativeScrollbarSize = globals.nativeScrollbarSize; //care don't make changes to this object!!!\n var reset = function () {\n /*\n var sizeResetWidth = observerElement[LEXICON.oW] + nativeScrollbarSize.x * factor + nativeScrollbarSize.y * factor + _overlayScrollbarDummySize.x + _overlayScrollbarDummySize.y;\n var sizeResetHeight = observerElement[LEXICON.oH] + nativeScrollbarSize.x * factor + nativeScrollbarSize.y * factor + _overlayScrollbarDummySize.x + _overlayScrollbarDummySize.y;\n var expandChildCSS = {};\n expandChildCSS[_strWidth] = sizeResetWidth;\n expandChildCSS[_strHeight] = sizeResetHeight;\n expandElementChild.css(expandChildCSS);\n\n\n expandElement[_strScrollLeft](sizeResetWidth)[_strScrollTop](sizeResetHeight);\n shrinkElement[_strScrollLeft](sizeResetWidth)[_strScrollTop](sizeResetHeight);\n */\n expandElement[_strScrollLeft](constScroll)[_strScrollTop](constScroll);\n shrinkElement[_strScrollLeft](constScroll)[_strScrollTop](constScroll);\n };\n var onResized = function () {\n rAFId = 0;\n if (!isDirty)\n return;\n\n widthCache = currWidth;\n heightCache = currHeight;\n callback();\n };\n var onScroll = function (event) {\n currWidth = observerElement[LEXICON.oW];\n currHeight = observerElement[LEXICON.oH];\n isDirty = currWidth != widthCache || currHeight != heightCache;\n\n if (event && isDirty && !rAFId) {\n COMPATIBILITY.cAF()(rAFId);\n rAFId = COMPATIBILITY.rAF()(onResized);\n }\n else if(!event)\n onResized();\n\n reset();\n if (event) {\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n return false;\n };\n var expandChildCSS = {};\n var observerElementCSS = {};\n\n setTopRightBottomLeft(observerElementCSS, _strEmpty, [\n -((nativeScrollbarSize.y + 1) * factor),\n nativeScrollbarSize.x * -factor,\n nativeScrollbarSize.y * -factor,\n -((nativeScrollbarSize.x + 1) * factor)\n ]);\n\n FRAMEWORK(observerElement).css(observerElementCSS);\n expandElement.on(_strScroll, onScroll);\n shrinkElement.on(_strScroll, onScroll);\n targetElement.on(strAnimationStartEvent, function () {\n onScroll(false);\n });\n //lets assume that the divs will never be that large and a constant value is enough\n expandChildCSS[_strWidth] = constScroll;\n expandChildCSS[_strHeight] = constScroll;\n expandElementChild.css(expandChildCSS);\n\n reset();\n }\n else {\n var attachEvent = _documentElementNative.attachEvent;\n var isIE = _msieVersion !== undefined;\n if (attachEvent) {\n targetElement.prepend(generateDiv(_classNameResizeObserverElement));\n findFirst(targetElement, _strDot + _classNameResizeObserverElement)[0].attachEvent('onresize', callback);\n }\n else {\n var obj = _documentElementNative.createElement(TYPES.o);\n obj.setAttribute('tabindex', '-1');\n obj.setAttribute(LEXICON.c, _classNameResizeObserverElement);\n obj.onload = function () {\n var wnd = this.contentDocument.defaultView;\n wnd.addEventListener('resize', callback);\n wnd.document.documentElement.style.display = 'none';\n };\n obj.type = 'text/html';\n if (isIE)\n targetElement.prepend(obj);\n obj.data = 'about:blank';\n if (!isIE)\n targetElement.prepend(obj);\n targetElement.on(strAnimationStartEvent, callback);\n }\n }\n }\n\n if (targetElement[0] === _sizeObserverElementNative) {\n var directionChanged = function() {\n var dir = _hostElement.css('direction');\n var css = {};\n var scrollLeftValue = 0;\n var result = false;\n if (dir !== _cssDirectionDetectedCache) {\n if (dir === 'ltr') {\n css[_strLeft] = 0;\n css[_strRight] = _strAuto;\n scrollLeftValue = constScroll;\n }\n else {\n css[_strLeft] = _strAuto;\n css[_strRight] = 0;\n scrollLeftValue = _rtlScrollBehavior.n ? -constScroll : _rtlScrollBehavior.i ? 0 : constScroll;\n }\n //execution order is important for IE!!!\n _sizeObserverElement.children().eq(0).css(css);\n _sizeObserverElement[_strScrollLeft](scrollLeftValue)[_strScrollTop](constScroll);\n _cssDirectionDetectedCache = dir;\n result = true;\n }\n return result;\n };\n directionChanged();\n addDestroyEventListener(targetElement, _strScroll, function(event) {\n if (directionChanged())\n update();\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n return false; \n });\n }\n }\n //remove resize observer:\n else {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n var resizeObserverObj = element[_strResizeObserverProperty];\n if(resizeObserverObj) {\n resizeObserverObj.disconnect();\n delete element[_strResizeObserverProperty];\n }\n }\n else {\n remove(targetElement.children(_strDot + _classNameResizeObserverElement).eq(0));\n }\n }\n }\n }\n\n /**\n * Freezes or unfreezes the given resize observer.\n * @param targetElement The element to which the target resize observer is applied.\n * @param freeze True if the resize observer shall be frozen, false otherwise.\n \n function freezeResizeObserver(targetElement, freeze) {\n if (targetElement !== undefined) {\n if(freeze) {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n element[_strResizeObserverProperty].unobserve(element);\n }\n else {\n targetElement = targetElement.children(_strDot + _classNameResizeObserverElement).eq(0);\n var w = targetElement.css(_strWidth);\n var h = targetElement.css(_strHeight);\n var css = {};\n css[_strWidth] = w;\n css[_strHeight] = h;\n targetElement.css(css);\n }\n }\n else {\n if (_supportResizeObserver) {\n var element = targetElement.contents()[0];\n element[_strResizeObserverProperty].observe(element);\n }\n else {\n var css = { };\n css[_strHeight] = _strEmpty;\n css[_strWidth] = _strEmpty;\n targetElement.children(_strDot + _classNameResizeObserverElement).eq(0).css(css);\n }\n }\n }\n }\n */\n\n\n //==== Mutation Observers ====//\n\n /**\n * Creates MutationObservers for the host and content Element if they are supported.\n */\n function createMutationObservers() {\n if (_supportMutationObserver) {\n var mutationObserverContentLag = 11;\n var mutationObserver = COMPATIBILITY.mO();\n var contentLastUpdate = COMPATIBILITY.now();\n var mutationTarget;\n var mutationAttrName;\n var contentTimeout;\n var now;\n var sizeAuto;\n var action;\n\n _mutationObserverHostCallback = function(mutations) {\n var doUpdate = false;\n var mutation;\n \n if (_initialized && !_sleeping) {\n each(mutations, function () {\n mutation = this;\n mutationTarget = mutation.target;\n mutationAttrName = mutation.attributeName;\n\n if (mutationAttrName === LEXICON.c)\n doUpdate = hostClassNamesChanged(mutation.oldValue, mutationTarget.className);\n else if (mutationAttrName === LEXICON.s)\n doUpdate = mutation.oldValue !== mutationTarget[LEXICON.s].cssText;\n else\n doUpdate = true;\n\n if (doUpdate)\n return false;\n });\n\n if (doUpdate)\n _base.update(_strAuto);\n }\n return doUpdate;\n };\n _mutationObserverContentCallback = function (mutations) {\n var doUpdate = false;\n var mutation;\n \n if (_initialized && !_sleeping) {\n each(mutations, function () {\n mutation = this;\n doUpdate = isUnknownMutation(mutation);\n return !doUpdate;\n });\n\n if (doUpdate) {\n now = COMPATIBILITY.now();\n sizeAuto = (_heightAutoCache || _widthAutoCache);\n action = function () {\n if(!_destroyed) {\n contentLastUpdate = now;\n\n //if cols, rows or wrap attr was changed\n if (_isTextarea)\n textareaUpdate();\n\n if (sizeAuto)\n update();\n else\n _base.update(_strAuto);\n }\n };\n clearTimeout(contentTimeout);\n if (mutationObserverContentLag <= 0 || now - contentLastUpdate > mutationObserverContentLag || !sizeAuto)\n action();\n else\n contentTimeout = setTimeout(action, mutationObserverContentLag);\n }\n }\n return doUpdate;\n }\n\n _mutationObserverHost = new mutationObserver(_mutationObserverHostCallback);\n _mutationObserverContent = new mutationObserver(_mutationObserverContentCallback);\n }\n }\n\n /**\n * Connects the MutationObservers if they are supported.\n */\n function connectMutationObservers() {\n if (_supportMutationObserver && !_mutationObserversConnected) {\n _mutationObserverHost.observe(_hostElementNative, {\n attributes: true,\n attributeOldValue: true,\n attributeFilter: _mutationObserverAttrsHost\n });\n\n _mutationObserverContent.observe(_isTextarea ? _targetElementNative : _contentElementNative, {\n attributes: true,\n attributeOldValue: true,\n subtree: !_isTextarea,\n childList: !_isTextarea,\n characterData: !_isTextarea,\n attributeFilter: _isTextarea ? _mutationObserverAttrsTextarea : _mutationObserverAttrsHost\n });\n\n _mutationObserversConnected = true;\n }\n }\n\n /**\n * Disconnects the MutationObservers if they are supported.\n */\n function disconnectMutationObservers() {\n if (_supportMutationObserver && _mutationObserversConnected) {\n _mutationObserverHost.disconnect();\n _mutationObserverContent.disconnect();\n\n _mutationObserversConnected = false;\n }\n }\n\n \n //==== Events of elements ====//\n\n /**\n * This method gets called every time the host element gets resized. IMPORTANT: Padding changes are detected too!!\n * It refreshes the hostResizedEventArgs and the hostSizeResizeCache.\n * If there are any size changes, the update method gets called.\n */\n function hostOnResized() {\n if (!_sleeping) {\n var changed;\n var hostSize = {\n w: _sizeObserverElementNative[LEXICON.sW],\n h: _sizeObserverElementNative[LEXICON.sH]\n };\n \n changed = checkCache(hostSize, _hostElementSizeChangeDetectedCache);\n _hostElementSizeChangeDetectedCache = hostSize;\n if (changed)\n update({ _hostSizeChanged : true });\n }\n }\n\n /**\n * The mouse enter event of the host element. This event is only needed for the autoHide feature.\n */\n function hostOnMouseEnter() {\n if (_scrollbarsAutoHideLeave)\n refreshScrollbarsAutoHide(true);\n }\n\n /**\n * The mouse leave event of the host element. This event is only needed for the autoHide feature.\n */\n function hostOnMouseLeave() {\n if (_scrollbarsAutoHideLeave && !_bodyElement.hasClass(_classNameDragging))\n refreshScrollbarsAutoHide(false);\n }\n\n /**\n * The mouse move event of the host element. This event is only needed for the autoHide \"move\" feature.\n */\n function hostOnMouseMove() {\n if (_scrollbarsAutoHideMove) {\n refreshScrollbarsAutoHide(true);\n clearTimeout(_scrollbarsAutoHideMoveTimeoutId);\n _scrollbarsAutoHideMoveTimeoutId = setTimeout(function () {\n if (_scrollbarsAutoHideMove && !_destroyed)\n refreshScrollbarsAutoHide(false);\n }, 100);\n }\n }\n\n /**\n * Prevents text from deselection if attached to the document element on the mousedown event of a DOM element.\n * @param event The select start event.\n */\n function documentOnSelectStart(event) {\n COMPATIBILITY.prvD(event);\n return false;\n }\n\n /**\n * A callback which will be called after a img element has downloaded its src asynchronous.\n */\n function imgOnLoad() {\n update({ _contentSizeChanged : true });\n }\n\n /**\n * Adds or removes mouse & touch events of the host element. (for handling auto-hiding of the scrollbars)\n * @param destroy Indicates whether the events shall be added or removed.\n */\n function setupHostMouseTouchEvents(destroy) {\n setupResponsiveEventListener(_hostElement, \n _strMouseTouchMoveEvent, \n hostOnMouseMove, \n (_scrollbarsAutoHideMove ? destroy : true), true);\n setupResponsiveEventListener(_hostElement, \n [ _strMouseTouchEnter, _strMouseTouchLeave ],\n [ hostOnMouseEnter, hostOnMouseLeave ], \n (_scrollbarsAutoHideMove ? true : destroy), true);\n\n //if the plugin is initialized and the mouse is over the host element, make the scrollbars visible\n if(!_initialized && !destroy)\n _hostElement.one('mouseover', hostOnMouseEnter);\n }\n\n\n //==== Update Detection ====//\n\n /**\n * Measures the min width and min height of the body element and refreshes the related cache.\n * @returns {boolean} True if the min width or min height has changed, false otherwise.\n */\n function bodyMinSizeChanged() {\n var bodyMinSize = {};\n if (_isBody && _contentArrangeElement) {\n bodyMinSize.w = parseToZeroOrNumber(_contentArrangeElement.css(_strMinMinus + _strWidth));\n bodyMinSize.h = parseToZeroOrNumber(_contentArrangeElement.css(_strMinMinus + _strHeight));\n bodyMinSize.c = checkCache(bodyMinSize, _bodyMinSizeCache);\n bodyMinSize.f = true; //flag for \"measured at least once\"\n }\n _bodyMinSizeCache = bodyMinSize;\n return !!bodyMinSize.c;\n }\n\n /**\n * Returns true if the class names really changed (new class without plugin host prefix)\n * @param oldCassNames The old ClassName string.\n * @param newClassNames The new ClassName string.\n * @returns {boolean} True if the class names has really changed, false otherwise.\n */\n function hostClassNamesChanged(oldCassNames, newClassNames) {\n var currClasses = (newClassNames !== undefined && newClassNames !== null) ? newClassNames.split(_strSpace) : _strEmpty;\n var oldClasses = (oldCassNames !== undefined && oldCassNames !== null) ? oldCassNames.split(_strSpace) : _strEmpty;\n if (currClasses === _strEmpty && oldClasses === _strEmpty)\n return false;\n var diff = getArrayDifferences(oldClasses, currClasses);\n var changed = false;\n var oldClassNames = _oldClassName !== undefined && _oldClassName !== null ? _oldClassName.split(_strSpace) : [_strEmpty];\n var currClassNames = _classNameCache !== undefined && _classNameCache !== null ? _classNameCache.split(_strSpace) : [_strEmpty];\n\n //remove none theme from diff list to prevent update\n var idx = inArray(_classNameThemeNone, diff);\n var curr;\n var i;\n var v;\n var o;\n var c;\n\n if (idx > -1)\n diff.splice(idx, 1);\n\n for (i = 0; i < diff.length; i++) {\n curr = diff[i];\n if (curr.indexOf(_classNameHostElement) !== 0) {\n o = true;\n c = true;\n for (v = 0; v < oldClassNames.length; v++) {\n if (curr === oldClassNames[v]) {\n o = false;\n break;\n }\n }\n for (v = 0; v < currClassNames.length; v++) {\n if (curr === currClassNames[v]) {\n c = false;\n break;\n }\n }\n if (o && c) {\n changed = true;\n break;\n }\n }\n\n }\n return changed;\n }\n\n /**\n * Returns true if the given mutation is not from a from the plugin generated element. If the target element is a textarea the mutation is always unknown.\n * @param mutation The mutation which shall be checked.\n * @returns {boolean} True if the mutation is from a unknown element, false otherwise.\n */\n function isUnknownMutation(mutation) {\n var attributeName = mutation.attributeName;\n var mutationTarget = mutation.target;\n var mutationType = mutation.type;\n var strClosest = 'closest';\n\n if (mutationTarget === _contentElementNative)\n return attributeName === null;\n if (mutationType === 'attributes' && (attributeName === LEXICON.c || attributeName === LEXICON.s) && !_isTextarea) {\n //ignore className changes by the plugin\n if (attributeName === LEXICON.c && FRAMEWORK(mutationTarget).hasClass(_classNameHostElement))\n return hostClassNamesChanged(mutation.oldValue, mutationTarget.getAttribute(LEXICON.c));\n\n //only do it of browser support it natively\n if (typeof mutationTarget[strClosest] != TYPES.f)\n return true;\n if (mutationTarget[strClosest](_strDot + _classNameResizeObserverElement) !== null ||\n mutationTarget[strClosest](_strDot + _classNameScrollbar) !== null ||\n mutationTarget[strClosest](_strDot + _classNameScrollbarCorner) !== null)\n return false;\n }\n return true;\n }\n\n /**\n * Returns true if the content size was changed since the last time this method was called.\n * @returns {boolean} True if the content size was changed, false otherwise.\n */\n function updateAutoContentSizeChanged() {\n if (_sleeping)\n return false;\n \n var contentMeasureElement = getContentMeasureElement();\n var textareaValueLength = _isTextarea && _widthAutoCache && !_textareaAutoWrappingCache ? _targetElement.val().length : 0;\n var setCSS = !_mutationObserversConnected && _widthAutoCache && !_isTextarea;\n var viewportScrollSize = { };\n var css = { };\n var float;\n var bodyMinSizeC;\n var changed;\n var viewportScrollSizeChanged;\n var contentElementScrollSize;\n\n //fix for https://bugzilla.mozilla.org/show_bug.cgi?id=1439305, it only works with \"clipAlways : true\"\n //it can work with \"clipAlways : false\" too, but I had to set the overflow of the viewportElement to hidden every time before measuring\n if(_restrictedMeasuring) {\n viewportScrollSize = {\n x : _viewportElementNative[LEXICON.sW],\n y : _viewportElementNative[LEXICON.sH]\n }\n }\n if (setCSS) {\n float = _contentElement.css(_strFloat);\n css[_strFloat] = _isRTL ? _strRight : _strLeft;\n css[_strWidth] = _strAuto;\n _contentElement.css(css);\n }\n contentElementScrollSize = {\n w: contentMeasureElement[LEXICON.sW] + textareaValueLength,\n h: contentMeasureElement[LEXICON.sH] + textareaValueLength\n };\n if (setCSS) {\n css[_strFloat] = float;\n css[_strWidth] = _strHundredPercent;\n _contentElement.css(css);\n }\n\n bodyMinSizeC = bodyMinSizeChanged();\n changed = checkCache(contentElementScrollSize, _contentElementScrollSizeChangeDetectedCache);\n viewportScrollSizeChanged = checkCache(viewportScrollSize, _viewportScrollSizeCache);\n\n _contentElementScrollSizeChangeDetectedCache = contentElementScrollSize;\n _viewportScrollSizeCache = viewportScrollSize;\n\n return changed || bodyMinSizeC || viewportScrollSizeChanged;\n }\n\n /**\n * Returns true when a attribute which the MutationObserver would observe has changed. \n * @returns {boolean} True if one of the attributes which a MutationObserver would observe has changed, false or undefined otherwise.\n */\n function meaningfulAttrsChanged() {\n if (_sleeping || _mutationObserversConnected)\n return;\n \n var changed;\n var elem;\n var curr;\n var cache;\n var checks = [\n {\n _elem: _hostElement, \n _props : _mutationObserverAttrsHost.concat(':visible')\n },\n {\n _elem: _isTextarea ? _targetElement : undefined, \n _props : _mutationObserverAttrsTextarea\n }\n ];\n \n each(checks, function(index, check) { \n elem = check._elem;\n if(elem) {\n each(check._props, function(index, prop) { \n curr = prop.charAt(0) === ':' ? elem.is(prop) : elem.attr(prop);\n cache = _updateAutoCache[prop];\n \n changed = changed || checkCache(curr, cache);\n \n _updateAutoCache[prop] = curr;\n });\n }\n });\n \n return changed;\n }\n\n /**\n * Checks is a CSS Property of a child element is affecting the scroll size of the content.\n * @param propertyName The CSS property name.\n * @returns {boolean} True if the property is affecting the content scroll size, false otherwise.\n */\n function isSizeAffectingCSSProperty(propertyName) {\n if (!_initialized)\n return true;\n var flexGrow = 'flex-grow';\n var flexShrink = 'flex-shrink';\n var flexBasis = 'flex-basis';\n var affectingPropsX = [\n _strWidth,\n _strMinMinus + _strWidth,\n _strMaxMinus + _strWidth,\n _strMarginMinus + _strLeft,\n _strMarginMinus + _strRight,\n _strLeft,\n _strRight,\n 'font-weight',\n 'word-spacing',\n flexGrow,\n flexShrink,\n flexBasis\n ];\n var affectingPropsXContentBox = [\n _strPaddingMinus + _strLeft,\n _strPaddingMinus + _strRight,\n _strBorderMinus + _strLeft + _strWidth,\n _strBorderMinus + _strRight + _strWidth\n ];\n var affectingPropsY = [\n _strHeight,\n _strMinMinus + _strHeight,\n _strMaxMinus + _strHeight,\n _strMarginMinus + _strTop,\n _strMarginMinus + _strBottom,\n _strTop,\n _strBottom,\n 'line-height',\n flexGrow,\n flexShrink,\n flexBasis\n ];\n var affectingPropsYContentBox = [\n _strPaddingMinus + _strTop,\n _strPaddingMinus + _strBottom,\n _strBorderMinus + _strTop + _strWidth,\n _strBorderMinus + _strBottom + _strWidth\n ];\n var _strS = 's';\n var _strVS = 'v-s';\n var checkX = _overflowBehaviorCache.x === _strS || _overflowBehaviorCache.x === _strVS;\n var checkY = _overflowBehaviorCache.y === _strS || _overflowBehaviorCache.y === _strVS;\n var sizeIsAffected = false;\n var checkPropertyName = function (arr, name) {\n for (var i = 0; i < arr[LEXICON.l]; i++) {\n if (arr[i] === name)\n return true;\n }\n return false;\n };\n\n if (checkY) {\n sizeIsAffected = checkPropertyName(affectingPropsY, propertyName);\n if (!sizeIsAffected && !_isBorderBox)\n sizeIsAffected = checkPropertyName(affectingPropsYContentBox, propertyName);\n }\n if (checkX && !sizeIsAffected) {\n sizeIsAffected = checkPropertyName(affectingPropsX, propertyName);\n if (!sizeIsAffected && !_isBorderBox)\n sizeIsAffected = checkPropertyName(affectingPropsXContentBox, propertyName);\n }\n return sizeIsAffected;\n }\n\n \n //==== Update ====//\n\n /**\n * Updates the variables and size of the textarea element, and manages the scroll on new line or new character.\n */\n function textareaUpdate() {\n if (!_sleeping) {\n var wrapAttrOff = !_textareaAutoWrappingCache;\n var minWidth = _viewportSize.w;\n var minHeight = _viewportSize.h;\n var css = { };\n var doMeasure = _widthAutoCache || wrapAttrOff;\n var origWidth;\n var width;\n var origHeight;\n var height;\n\n //reset min size\n css[_strMinMinus + _strWidth] = _strEmpty;\n css[_strMinMinus + _strHeight] = _strEmpty;\n\n //set width auto\n css[_strWidth] = _strAuto;\n _targetElement.css(css);\n\n //measure width\n origWidth = _targetElementNative[LEXICON.oW];\n width = doMeasure ? MATH.max(origWidth, _targetElementNative[LEXICON.sW] - 1) : 1;\n /*width += (_widthAutoCache ? _marginX + (!_isBorderBox ? wrapAttrOff ? 0 : _paddingX + _borderX : 0) : 0);*/\n\n //set measured width\n css[_strWidth] = _widthAutoCache ? _strAuto /*width*/ : _strHundredPercent;\n css[_strMinMinus + _strWidth] = _strHundredPercent;\n\n //set height auto\n css[_strHeight] = _strAuto;\n _targetElement.css(css);\n\n //measure height\n origHeight = _targetElementNative[LEXICON.oH];\n height = MATH.max(origHeight, _targetElementNative[LEXICON.sH] - 1);\n\n //append correct size values\n css[_strWidth] = width;\n css[_strHeight] = height;\n _textareaCoverElement.css(css);\n\n //apply min width / min height to prevent textarea collapsing\n css[_strMinMinus + _strWidth] = minWidth /*+ (!_isBorderBox && _widthAutoCache ? _paddingX + _borderX : 0)*/;\n css[_strMinMinus + _strHeight] = minHeight /*+ (!_isBorderBox && _heightAutoCache ? _paddingY + _borderY : 0)*/;\n _targetElement.css(css);\n\n return {\n _originalWidth: origWidth,\n _originalHeight: origHeight,\n _dynamicWidth: width,\n _dynamicHeight: height\n };\n }\n }\n\n /**\n * Updates the plugin and DOM to the current options.\n * This method should only be called if a update is 100% required.\n * @param updateHints A objects which contains hints for this update:\n * {\n * _hostSizeChanged : boolean,\n * _contentSizeChanged : boolean,\n * _force : boolean, == preventSwallowing\n * _changedOptions : { }, == preventSwallowing && preventSleep\n * }\n */\n function update(updateHints) {\n clearTimeout(_swallowedUpdateTimeout);\n updateHints = updateHints || { };\n _swallowedUpdateHints._hostSizeChanged |= updateHints._hostSizeChanged;\n _swallowedUpdateHints._contentSizeChanged |= updateHints._contentSizeChanged;\n _swallowedUpdateHints._force |= updateHints._force;\n \n var now = COMPATIBILITY.now();\n var hostSizeChanged = !!_swallowedUpdateHints._hostSizeChanged;\n var contentSizeChanged = !!_swallowedUpdateHints._contentSizeChanged;\n var force = !!_swallowedUpdateHints._force;\n var changedOptions = updateHints._changedOptions; \n var swallow = _swallowUpdateLag > 0 && _initialized && !_destroyed && !force && !changedOptions && (now - _lastUpdateTime) < _swallowUpdateLag && (!_heightAutoCache && !_widthAutoCache); \n var displayIsHidden;\n\n if(swallow)\n _swallowedUpdateTimeout = setTimeout(update, _swallowUpdateLag);\n\n //abort update due to:\n //destroyed\n //swallowing\n //sleeping\n //host is hidden or has false display\n if (_destroyed || swallow || (_sleeping && !changedOptions) || (_initialized && !force && (displayIsHidden = _hostElement.is(':hidden'))) || _hostElement.css('display') === 'inline')\n return;\n\n _lastUpdateTime = now;\n _swallowedUpdateHints = { };\n \n //if scrollbar styling is possible and native scrollbars aren't overlaid the scrollbar styling will be applied which hides the native scrollbars completely.\n if (_nativeScrollbarStyling && !(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)) {\n //native scrollbars are hidden, so change the values to zero\n _nativeScrollbarSize.x = 0;\n _nativeScrollbarSize.y = 0;\n }\n else {\n //refresh native scrollbar size (in case of zoom)\n _nativeScrollbarSize = extendDeep({}, globals.nativeScrollbarSize);\n }\n\n // Scrollbar padding is needed for firefox, because firefox hides scrollbar automatically if the size of the div is too small.\n // The calculation: [scrollbar size +3 *3]\n // (+3 because of possible decoration e.g. borders, margins etc., but only if native scrollbar is NOT a overlaid scrollbar)\n // (*3 because (1)increase / (2)decrease -button and (3)resize handle)\n _nativeScrollbarMinSize = {\n x: (_nativeScrollbarSize.x + (_nativeScrollbarIsOverlaid.x ? 0 : 3)) * 3,\n y: (_nativeScrollbarSize.y + (_nativeScrollbarIsOverlaid.y ? 0 : 3)) * 3\n };\n \n //changedOptions = changedOptions || { };\n //freezeResizeObserver(_sizeObserverElement, true);\n //freezeResizeObserver(_sizeAutoObserverElement, true);\n \n var checkCacheAutoForce = function () {\n return checkCache.apply(this, [].slice.call(arguments).concat([ force ]));\n };\n \n //save current scroll offset\n var currScroll = {\n x: _viewportElement[_strScrollLeft](),\n y: _viewportElement[_strScrollTop]()\n };\n\n var currentPreparedOptionsScrollbars = _currentPreparedOptions.scrollbars;\n var currentPreparedOptionsTextarea = _currentPreparedOptions.textarea;\n\n //scrollbars visibility:\n var scrollbarsVisibility = currentPreparedOptionsScrollbars.visibility;\n var scrollbarsVisibilityChanged = checkCacheAutoForce(scrollbarsVisibility, _scrollbarsVisibilityCache);\n\n //scrollbars autoHide:\n var scrollbarsAutoHide = currentPreparedOptionsScrollbars.autoHide;\n var scrollbarsAutoHideChanged = checkCacheAutoForce(scrollbarsAutoHide, _scrollbarsAutoHideCache);\n\n //scrollbars click scrolling\n var scrollbarsClickScrolling = currentPreparedOptionsScrollbars.clickScrolling;\n var scrollbarsClickScrollingChanged = checkCacheAutoForce(scrollbarsClickScrolling, _scrollbarsClickScrollingCache);\n\n //scrollbars drag scrolling\n var scrollbarsDragScrolling = currentPreparedOptionsScrollbars.dragScrolling;\n var scrollbarsDragScrollingChanged = checkCacheAutoForce(scrollbarsDragScrolling, _scrollbarsDragScrollingCache);\n\n //className\n var className = _currentPreparedOptions.className;\n var classNameChanged = checkCacheAutoForce(className, _classNameCache);\n\n //resize\n var resize = _currentPreparedOptions.resize;\n var resizeChanged = checkCacheAutoForce(resize, _resizeCache) && !_isBody; //body can't be resized since the window itself acts as resize possibility.\n\n //paddingAbsolute\n var paddingAbsolute = _currentPreparedOptions.paddingAbsolute;\n var paddingAbsoluteChanged = checkCacheAutoForce(paddingAbsolute, _paddingAbsoluteCache);\n\n //clipAlways\n var clipAlways = _currentPreparedOptions.clipAlways;\n var clipAlwaysChanged = checkCacheAutoForce(clipAlways, _clipAlwaysCache);\n\n //sizeAutoCapable\n var sizeAutoCapable = _currentPreparedOptions.sizeAutoCapable && !_isBody; //body can never be size auto, because it shall be always as big as the viewport.\n var sizeAutoCapableChanged = checkCacheAutoForce(sizeAutoCapable, _sizeAutoCapableCache);\n\n //showNativeScrollbars\n var ignoreOverlayScrollbarHiding = _currentPreparedOptions.nativeScrollbarsOverlaid.showNativeScrollbars;\n var ignoreOverlayScrollbarHidingChanged = checkCacheAutoForce(ignoreOverlayScrollbarHiding, _ignoreOverlayScrollbarHidingCache);\n\n //autoUpdate\n var autoUpdate = _currentPreparedOptions.autoUpdate;\n var autoUpdateChanged = checkCacheAutoForce(autoUpdate, _autoUpdateCache);\n\n //overflowBehavior\n var overflowBehavior = _currentPreparedOptions.overflowBehavior;\n var overflowBehaviorChanged = checkCacheAutoForce(overflowBehavior, _overflowBehaviorCache, force);\n\n //dynWidth:\n var textareaDynWidth = currentPreparedOptionsTextarea.dynWidth;\n var textareaDynWidthChanged = checkCacheAutoForce(_textareaDynWidthCache, textareaDynWidth);\n\n //dynHeight:\n var textareaDynHeight = currentPreparedOptionsTextarea.dynHeight;\n var textareaDynHeightChanged = checkCacheAutoForce(_textareaDynHeightCache, textareaDynHeight);\n\n //scrollbars visibility\n _scrollbarsAutoHideNever = scrollbarsAutoHide === 'n';\n _scrollbarsAutoHideScroll = scrollbarsAutoHide === 's';\n _scrollbarsAutoHideMove = scrollbarsAutoHide === 'm';\n _scrollbarsAutoHideLeave = scrollbarsAutoHide === 'l';\n\n //scrollbars autoHideDelay\n _scrollbarsAutoHideDelay = currentPreparedOptionsScrollbars.autoHideDelay;\n\n //old className\n _oldClassName = _classNameCache;\n\n //resize\n _resizeNone = resize === 'n';\n _resizeBoth = resize === 'b';\n _resizeHorizontal = resize === 'h';\n _resizeVertical = resize === 'v';\n\n //normalizeRTL\n _normalizeRTLCache = _currentPreparedOptions.normalizeRTL;\n\n //ignore overlay scrollbar hiding\n ignoreOverlayScrollbarHiding = ignoreOverlayScrollbarHiding && (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y);\n\n //refresh options cache\n _scrollbarsVisibilityCache = scrollbarsVisibility;\n _scrollbarsAutoHideCache = scrollbarsAutoHide;\n _scrollbarsClickScrollingCache = scrollbarsClickScrolling;\n _scrollbarsDragScrollingCache = scrollbarsDragScrolling;\n _classNameCache = className;\n _resizeCache = resize;\n _paddingAbsoluteCache = paddingAbsolute;\n _clipAlwaysCache = clipAlways;\n _sizeAutoCapableCache = sizeAutoCapable;\n _ignoreOverlayScrollbarHidingCache = ignoreOverlayScrollbarHiding;\n _autoUpdateCache = autoUpdate;\n _overflowBehaviorCache = extendDeep({}, overflowBehavior);\n _textareaDynWidthCache = textareaDynWidth;\n _textareaDynHeightCache = textareaDynHeight;\n _hasOverflowCache = _hasOverflowCache || { x: false, y: false };\n\n //set correct class name to the host element\n if (classNameChanged) {\n removeClass(_hostElement, _oldClassName + _strSpace + _classNameThemeNone);\n addClass(_hostElement, className !== undefined && className !== null && className.length > 0 ? className : _classNameThemeNone);\n }\n\n //set correct auto Update\n if (autoUpdateChanged) {\n if (autoUpdate === true) {\n disconnectMutationObservers();\n autoUpdateLoop.add(_base);\n }\n else if (autoUpdate === null) {\n if (_autoUpdateRecommended) {\n disconnectMutationObservers();\n autoUpdateLoop.add(_base);\n }\n else {\n autoUpdateLoop.remove(_base);\n connectMutationObservers();\n }\n }\n else {\n autoUpdateLoop.remove(_base);\n connectMutationObservers();\n }\n }\n\n //activate or deactivate size auto capability\n if (sizeAutoCapableChanged) {\n if (sizeAutoCapable) {\n if (!_contentGlueElement) {\n _contentGlueElement = FRAMEWORK(generateDiv(_classNameContentGlueElement));\n _paddingElement.before(_contentGlueElement);\n }\n else {\n _contentGlueElement.show();\n }\n if (_sizeAutoObserverAdded) {\n _sizeAutoObserverElement.show();\n }\n else {\n _sizeAutoObserverElement = FRAMEWORK(generateDiv(_classNameSizeAutoObserverElement));\n _sizeAutoObserverElementNative = _sizeAutoObserverElement[0];\n\n _contentGlueElement.before(_sizeAutoObserverElement);\n var oldSize = {w: -1, h: -1};\n setupResizeObserver(_sizeAutoObserverElement, function () {\n var newSize = {\n w: _sizeAutoObserverElementNative[LEXICON.oW],\n h: _sizeAutoObserverElementNative[LEXICON.oH]\n };\n if (checkCache(newSize, oldSize)) {\n if (_initialized && (_heightAutoCache && newSize.h > 0) || (_widthAutoCache && newSize.w > 0)) {\n update();\n }\n else if (_initialized && (!_heightAutoCache && newSize.h === 0) || (!_widthAutoCache && newSize.w === 0)) {\n update();\n }\n }\n oldSize = newSize;\n });\n _sizeAutoObserverAdded = true;\n //fix heightAuto detector bug if height is fixed but contentHeight is 0.\n //the probability this bug will ever happen is very very low, thats why its ok if we use calc which isn't supported in IE8.\n if (_cssCalc !== null)\n _sizeAutoObserverElement.css(_strHeight, _cssCalc + '(100% + 1px)');\n }\n }\n else {\n if (_sizeAutoObserverAdded)\n _sizeAutoObserverElement.hide();\n if (_contentGlueElement)\n _contentGlueElement.hide();\n }\n }\n\n //if force, update all resizeObservers too\n if (force) {\n _sizeObserverElement.find('*').trigger(_strScroll);\n if (_sizeAutoObserverAdded)\n _sizeAutoObserverElement.find('*').trigger(_strScroll);\n }\n\n //display hidden:\n displayIsHidden = displayIsHidden === undefined ? _hostElement.is(':hidden') : displayIsHidden;\n var displayIsHiddenChanged = checkCacheAutoForce(displayIsHidden, _displayIsHiddenCache);\n\n //textarea AutoWrapping:\n var textareaAutoWrapping = _isTextarea ? _targetElement.attr('wrap') !== 'off' : false;\n var textareaAutoWrappingChanged = checkCacheAutoForce(textareaAutoWrapping, _textareaAutoWrappingCache);\n\n //detect direction:\n var cssDirection = _hostElement.css('direction');\n var cssDirectionChanged = checkCacheAutoForce(cssDirection, _cssDirectionCache);\n\n //detect box-sizing:\n var boxSizing = _hostElement.css('box-sizing');\n var boxSizingChanged = checkCacheAutoForce(boxSizing, _cssBoxSizingCache);\n\n //detect padding:\n var padding = {\n c: force,\n t: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strTop)),\n r: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strRight)),\n b: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strBottom)),\n l: parseToZeroOrNumber(_hostElement.css(_strPaddingMinus + _strLeft))\n };\n \n //width + height auto detecting var:\n var sizeAutoObserverElementBCRect;\n //exception occurs in IE8 sometimes (unknown exception)\n try {\n sizeAutoObserverElementBCRect = _sizeAutoObserverAdded ? _sizeAutoObserverElementNative[LEXICON.bCR]() : null;\n } catch (ex) {\n return;\n }\n\n _isRTL = cssDirection === 'rtl';\n _isBorderBox = (boxSizing === 'border-box');\n var isRTLLeft = _isRTL ? _strLeft : _strRight;\n var isRTLRight = _isRTL ? _strRight : _strLeft;\n\n //detect width auto:\n var widthAutoResizeDetection = false;\n var widthAutoObserverDetection = (_sizeAutoObserverAdded && (_hostElement.css(_strFloat) !== 'none' /*|| _isTextarea */)) ? (MATH.round(sizeAutoObserverElementBCRect.right - sizeAutoObserverElementBCRect.left) === 0) && (!paddingAbsolute ? (_hostElementNative[LEXICON.cW] - _paddingX) > 0 : true) : false;\n if (sizeAutoCapable && !widthAutoObserverDetection) {\n var tmpCurrHostWidth = _hostElementNative[LEXICON.oW];\n var tmpCurrContentGlueWidth = _contentGlueElement.css(_strWidth);\n _contentGlueElement.css(_strWidth, _strAuto);\n\n var tmpNewHostWidth = _hostElementNative[LEXICON.oW];\n _contentGlueElement.css(_strWidth, tmpCurrContentGlueWidth);\n widthAutoResizeDetection = tmpCurrHostWidth !== tmpNewHostWidth;\n if (!widthAutoResizeDetection) {\n _contentGlueElement.css(_strWidth, tmpCurrHostWidth + 1);\n tmpNewHostWidth = _hostElementNative[LEXICON.oW];\n _contentGlueElement.css(_strWidth, tmpCurrContentGlueWidth);\n widthAutoResizeDetection = tmpCurrHostWidth !== tmpNewHostWidth;\n }\n }\n var widthAuto = (widthAutoObserverDetection || widthAutoResizeDetection) && sizeAutoCapable && !displayIsHidden;\n var widthAutoChanged = checkCacheAutoForce(widthAuto, _widthAutoCache);\n var wasWidthAuto = !widthAuto && _widthAutoCache;\n\n //detect height auto:\n var heightAuto = _sizeAutoObserverAdded && sizeAutoCapable && !displayIsHidden ? (MATH.round(sizeAutoObserverElementBCRect.bottom - sizeAutoObserverElementBCRect.top) === 0) /* && (!paddingAbsolute && (_msieVersion > 9 || !_msieVersion) ? true : true) */ : false;\n var heightAutoChanged = checkCacheAutoForce(heightAuto, _heightAutoCache);\n var wasHeightAuto = !heightAuto && _heightAutoCache;\n\n //detect border:\n //we need the border only if border box and auto size\n var strMinusWidth = '-' + _strWidth;\n var updateBorderX = (widthAuto && _isBorderBox) || !_isBorderBox;\n var updateBorderY = (heightAuto && _isBorderBox) || !_isBorderBox;\n var border = {\n c: force,\n t: updateBorderY ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strTop + strMinusWidth), true) : 0,\n r: updateBorderX ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strRight + strMinusWidth), true) : 0,\n b: updateBorderY ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strBottom + strMinusWidth), true) : 0,\n l: updateBorderX ? parseToZeroOrNumber(_hostElement.css(_strBorderMinus + _strLeft + strMinusWidth), true) : 0\n };\n\n //detect margin:\n var margin = {\n c: force,\n t: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strTop)),\n r: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strRight)),\n b: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strBottom)),\n l: parseToZeroOrNumber(_hostElement.css(_strMarginMinus + _strLeft))\n };\n\n //detect css max width & height:\n var cssMaxValue = {\n h: String(_hostElement.css(_strMaxMinus + _strHeight)),\n w: String(_hostElement.css(_strMaxMinus + _strWidth))\n };\n\n //vars to apply correct css\n var contentElementCSS = { };\n var contentGlueElementCSS = { };\n\n //funcs\n var getHostSize = function() {\n //has to be clientSize because offsetSize respect borders\n return {\n w: _hostElementNative[LEXICON.cW],\n h: _hostElementNative[LEXICON.cH]\n };\n };\n var getViewportSize = function() {\n //viewport size is padding container because it never has padding, margin and a border\n //determine zoom rounding error -> sometimes scrollWidth/Height is smaller than clientWidth/Height\n //if this happens add the difference to the viewportSize to compensate the rounding error\n return {\n w: _paddingElementNative[LEXICON.oW] + MATH.max(0, _contentElementNative[LEXICON.cW] - _contentElementNative[LEXICON.sW]),\n h: _paddingElementNative[LEXICON.oH] + MATH.max(0, _contentElementNative[LEXICON.cH] - _contentElementNative[LEXICON.sH])\n };\n };\n\n //set info for padding\n var paddingAbsoluteX = _paddingX = padding.l + padding.r;\n var paddingAbsoluteY = _paddingY = padding.t + padding.b;\n paddingAbsoluteX *= paddingAbsolute ? 1 : 0;\n paddingAbsoluteY *= paddingAbsolute ? 1 : 0;\n padding.c = checkCacheAutoForce(padding, _cssPaddingCache);\n\n //set info for border\n _borderX = border.l + border.r;\n _borderY = border.t + border.b;\n border.c = checkCacheAutoForce(border, _cssBorderCache);\n\n //set info for margin\n _marginX = margin.l + margin.r;\n _marginY = margin.t + margin.b;\n margin.c = checkCacheAutoForce(margin, _cssMarginCache);\n\n //set info for css max value\n cssMaxValue.ih = parseToZeroOrNumber(cssMaxValue.h); //ih = integer height\n cssMaxValue.iw = parseToZeroOrNumber(cssMaxValue.w); //iw = integer width\n cssMaxValue.ch = cssMaxValue.h.indexOf('px') > -1; //ch = correct height\n cssMaxValue.cw = cssMaxValue.w.indexOf('px') > -1; //cw = correct width\n cssMaxValue.c = checkCacheAutoForce(cssMaxValue, _cssMaxValueCache);\n\n //refresh cache\n _displayIsHiddenCache = displayIsHidden;\n _textareaAutoWrappingCache = textareaAutoWrapping;\n _cssDirectionCache = cssDirection;\n _cssBoxSizingCache = boxSizing;\n _widthAutoCache = widthAuto;\n _heightAutoCache = heightAuto;\n _cssPaddingCache = padding;\n _cssBorderCache = border;\n _cssMarginCache = margin;\n _cssMaxValueCache = cssMaxValue;\n \n //IEFix direction changed\n if (cssDirectionChanged && _sizeAutoObserverAdded)\n _sizeAutoObserverElement.css(_strFloat, isRTLRight);\n\n //apply padding:\n if (padding.c || cssDirectionChanged || paddingAbsoluteChanged || widthAutoChanged || heightAutoChanged || boxSizingChanged || sizeAutoCapableChanged) {\n var paddingElementCSS = {};\n var textareaCSS = {};\n setTopRightBottomLeft(contentGlueElementCSS, _strMarginMinus, [-padding.t, -padding.r, -padding.b, -padding.l]);\n if (paddingAbsolute) {\n setTopRightBottomLeft(paddingElementCSS, _strEmpty, [padding.t, padding.r, padding.b, padding.l]);\n if (_isTextarea)\n setTopRightBottomLeft(textareaCSS, _strPaddingMinus);\n else\n setTopRightBottomLeft(contentElementCSS, _strPaddingMinus);\n }\n else {\n setTopRightBottomLeft(paddingElementCSS, _strEmpty);\n if (_isTextarea)\n setTopRightBottomLeft(textareaCSS, _strPaddingMinus, [padding.t, padding.r, padding.b, padding.l]);\n else\n setTopRightBottomLeft(contentElementCSS, _strPaddingMinus, [padding.t, padding.r, padding.b, padding.l]);\n }\n _paddingElement.css(paddingElementCSS);\n _targetElement.css(textareaCSS);\n }\n\n //viewport size is padding container because it never has padding, margin and a border.\n _viewportSize = getViewportSize();\n\n //update Textarea\n var textareaSize = _isTextarea ? textareaUpdate() : false;\n var textareaSizeChanged = _isTextarea && checkCacheAutoForce(textareaSize, _textareaSizeCache);\n var textareaDynOrigSize = _isTextarea && textareaSize ? {\n w : textareaDynWidth ? textareaSize._dynamicWidth : textareaSize._originalWidth,\n h : textareaDynHeight ? textareaSize._dynamicHeight : textareaSize._originalHeight\n } : { };\n _textareaSizeCache = textareaSize;\n\n //fix height auto / width auto in cooperation with current padding & boxSizing behavior:\n if (heightAuto && (heightAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c)) {\n /*\n if (cssMaxValue.ch)\n contentElementCSS[_strMaxMinus + _strHeight] =\n (cssMaxValue.ch ? (cssMaxValue.ih - paddingAbsoluteY + (_isBorderBox ? -_borderY : _paddingY))\n : _strEmpty);\n */\n contentElementCSS[_strHeight] = _strAuto;\n }\n else if (heightAutoChanged || paddingAbsoluteChanged) {\n contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;\n contentElementCSS[_strHeight] = _strHundredPercent;\n }\n if (widthAuto && (widthAutoChanged || paddingAbsoluteChanged || boxSizingChanged || cssMaxValue.c || padding.c || border.c || cssDirectionChanged)) {\n /*\n if (cssMaxValue.cw)\n contentElementCSS[_strMaxMinus + _strWidth] =\n (cssMaxValue.cw ? (cssMaxValue.iw - paddingAbsoluteX + (_isBorderBox ? -_borderX : _paddingX)) +\n (_nativeScrollbarIsOverlaid.y ? _overlayScrollbarDummySize.y : 0)\n : _strEmpty);\n */\n contentElementCSS[_strWidth] = _strAuto;\n contentGlueElementCSS[_strMaxMinus + _strWidth] = _strHundredPercent; //IE Fix\n }\n else if (widthAutoChanged || paddingAbsoluteChanged) {\n contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;\n contentElementCSS[_strWidth] = _strHundredPercent;\n contentElementCSS[_strFloat] = _strEmpty;\n contentGlueElementCSS[_strMaxMinus + _strWidth] = _strEmpty; //IE Fix\n }\n if (widthAuto) {\n if (!cssMaxValue.cw)\n contentElementCSS[_strMaxMinus + _strWidth] = _strEmpty;\n //textareaDynOrigSize.w || _strAuto :: doesnt works because applied margin will shift width\n contentGlueElementCSS[_strWidth] = _strAuto;\n\n contentElementCSS[_strWidth] = _strAuto;\n contentElementCSS[_strFloat] = isRTLRight;\n }\n else {\n contentGlueElementCSS[_strWidth] = _strEmpty;\n }\n if (heightAuto) {\n if (!cssMaxValue.ch)\n contentElementCSS[_strMaxMinus + _strHeight] = _strEmpty;\n //textareaDynOrigSize.h || _contentElementNative[LEXICON.cH] :: use for anti scroll jumping\n contentGlueElementCSS[_strHeight] = textareaDynOrigSize.h || _contentElementNative[LEXICON.cH];\n }\n else {\n contentGlueElementCSS[_strHeight] = _strEmpty;\n }\n if (sizeAutoCapable)\n _contentGlueElement.css(contentGlueElementCSS);\n _contentElement.css(contentElementCSS);\n\n //CHECKPOINT HERE ~\n contentElementCSS = {};\n contentGlueElementCSS = {};\n\n //if [content(host) client / scroll size, or target element direction, or content(host) max-sizes] changed, or force is true\n if (hostSizeChanged || contentSizeChanged || textareaSizeChanged || cssDirectionChanged || boxSizingChanged || paddingAbsoluteChanged || widthAutoChanged || widthAuto || heightAutoChanged || heightAuto || cssMaxValue.c || ignoreOverlayScrollbarHidingChanged || overflowBehaviorChanged || clipAlwaysChanged || resizeChanged || scrollbarsVisibilityChanged || scrollbarsAutoHideChanged || scrollbarsDragScrollingChanged || scrollbarsClickScrollingChanged || textareaDynWidthChanged || textareaDynHeightChanged || textareaAutoWrappingChanged) {\n var strOverflow = 'overflow';\n var strOverflowX = strOverflow + '-x';\n var strOverflowY = strOverflow + '-y';\n var strHidden = 'hidden';\n var strVisible = 'visible';\n //decide whether the content overflow must get hidden for correct overflow measuring, it !MUST! be always hidden if the height is auto\n var hideOverflow4CorrectMeasuring = _restrictedMeasuring ?\n (_nativeScrollbarIsOverlaid.x || _nativeScrollbarIsOverlaid.y) || //it must be hidden if native scrollbars are overlaid\n (_viewportSize.w < _nativeScrollbarMinSize.y || _viewportSize.h < _nativeScrollbarMinSize.x) || //it must be hidden if host-element is too small\n heightAuto || displayIsHiddenChanged //it must be hidden if height is auto or display was changed\n : heightAuto; //if there is not the restricted Measuring bug, it must be hidden if the height is auto\n\n //Reset the viewport (very important for natively overlaid scrollbars and zoom change\n //don't change the overflow prop as it is very expensive and affects performance !A LOT!\n var viewportElementResetCSS = { };\n var resetXTmp = _hasOverflowCache.y && _hideOverflowCache.ys && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.y ? _viewportElement.css(isRTLLeft) : -_nativeScrollbarSize.y) : 0;\n var resetBottomTmp = _hasOverflowCache.x && _hideOverflowCache.xs && !ignoreOverlayScrollbarHiding && !_nativeScrollbarStyling ? (_nativeScrollbarIsOverlaid.x ? _viewportElement.css(_strBottom) : -_nativeScrollbarSize.x) : 0;\n setTopRightBottomLeft(viewportElementResetCSS, _strEmpty);\n _viewportElement.css(viewportElementResetCSS);\n if(hideOverflow4CorrectMeasuring)\n _contentElement.css(strOverflow, strHidden);\n\n //measure several sizes:\n var contentMeasureElement = getContentMeasureElement();\n //in Firefox content element has to have overflow hidden, else element margins aren't calculated properly, this element prevents this bug, but only if scrollbars aren't overlaid\n var contentMeasureElementGuaranty = _restrictedMeasuring && !hideOverflow4CorrectMeasuring ? _viewportElementNative : contentMeasureElement;\n var contentSize = {\n //use clientSize because natively overlaidScrollbars add borders\n w: textareaDynOrigSize.w || contentMeasureElement[LEXICON.cW],\n h: textareaDynOrigSize.h || contentMeasureElement[LEXICON.cH]\n };\n var scrollSize = {\n w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]),\n h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH])\n };\n\n //apply the correct viewport style and measure viewport size\n viewportElementResetCSS[_strBottom] = wasHeightAuto ? _strEmpty : resetBottomTmp;\n viewportElementResetCSS[isRTLLeft] = wasWidthAuto ? _strEmpty : resetXTmp;\n _viewportElement.css(viewportElementResetCSS);\n _viewportSize = getViewportSize();\n\n //measure and correct several sizes\n var hostSize = getHostSize();\n var contentGlueSize = {\n //client/scrollSize + AbsolutePadding -> because padding is only applied to the paddingElement if its absolute, so you have to add it manually\n //hostSize is clientSize -> so padding should be added manually, right? FALSE! Because content glue is inside hostElement, so we don't have to worry about padding\n w: MATH.max((widthAuto ? contentSize.w : scrollSize.w) + paddingAbsoluteX, hostSize.w),\n h: MATH.max((heightAuto ? contentSize.h : scrollSize.h) + paddingAbsoluteY, hostSize.h)\n };\n contentGlueSize.c = checkCacheAutoForce(contentGlueSize, _contentGlueSizeCache);\n _contentGlueSizeCache = contentGlueSize;\n\n //apply correct contentGlue size\n if (sizeAutoCapable) {\n //size contentGlue correctly to make sure the element has correct size if the sizing switches to auto\n if (contentGlueSize.c || (heightAuto || widthAuto)) {\n contentGlueElementCSS[_strWidth] = contentGlueSize.w;\n contentGlueElementCSS[_strHeight] = contentGlueSize.h;\n\n //textarea-sizes are already calculated correctly at this point\n if(!_isTextarea) {\n contentSize = {\n //use clientSize because natively overlaidScrollbars add borders\n w: contentMeasureElement[LEXICON.cW],\n h: contentMeasureElement[LEXICON.cH]\n };\n }\n }\n var textareaCoverCSS = {};\n var setContentGlueElementCSSfunction = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var wh = scrollbarVars._w_h;\n var strWH = scrollbarVars._width_height;\n var autoSize = horizontal ? widthAuto : heightAuto;\n var borderSize = horizontal ? _borderX : _borderY;\n var paddingSize = horizontal ? _paddingX : _paddingY;\n var marginSize = horizontal ? _marginX : _marginY;\n var maxSize = contentGlueElementCSS[strWH] + (_isBorderBox ? borderSize : -paddingSize);\n\n //make contentGlue size -1 if element is not auto sized, to make sure that a resize event happens when the element shrinks\n if (!autoSize || (!autoSize && border.c))\n contentGlueElementCSS[strWH] = hostSize[wh] - (_isBorderBox ? 0 : paddingSize + borderSize) - 1 - marginSize;\n\n //if size is auto and host is same size as max size, make content glue size +1 to make sure size changes will be detected\n if (autoSize && cssMaxValue['c' + wh] && cssMaxValue['i' + wh] === maxSize)\n contentGlueElementCSS[strWH] = maxSize + (_isBorderBox ? 0 : paddingSize) + 1;\n\n //if size is auto and host is smaller than size as min size, make content glue size -1 to make sure size changes will be detected (this is only needed if padding is 0)\n if (autoSize && (contentSize[wh] < _viewportSize[wh]) && (horizontal && _isTextarea ? !textareaAutoWrapping : true)) {\n if (_isTextarea)\n textareaCoverCSS[strWH] = parseToZeroOrNumber(_textareaCoverElement.css(strWH)) - 1;\n contentGlueElementCSS[strWH] -= 1;\n }\n\n //make sure content glue size is at least 1\n if (contentSize[wh] > 0)\n contentGlueElementCSS[strWH] = MATH.max(1, contentGlueElementCSS[strWH]);\n };\n setContentGlueElementCSSfunction(true);\n setContentGlueElementCSSfunction(false);\n\n if (_isTextarea)\n _textareaCoverElement.css(textareaCoverCSS);\n _contentGlueElement.css(contentGlueElementCSS);\n }\n if (widthAuto)\n contentElementCSS[_strWidth] = _strHundredPercent;\n if (widthAuto && !_isBorderBox && !_mutationObserversConnected)\n contentElementCSS[_strFloat] = 'none';\n\n //apply and reset content style\n _contentElement.css(contentElementCSS);\n contentElementCSS = {};\n\n //measure again, but this time all correct sizes:\n var contentScrollSize = {\n w: MATH.max(contentMeasureElement[LEXICON.sW], contentMeasureElementGuaranty[LEXICON.sW]),\n h: MATH.max(contentMeasureElement[LEXICON.sH], contentMeasureElementGuaranty[LEXICON.sH])\n };\n contentScrollSize.c = contentSizeChanged = checkCacheAutoForce(contentScrollSize, _contentScrollSizeCache);\n _contentScrollSizeCache = contentScrollSize;\n\n //remove overflow hidden to restore overflow\n if(hideOverflow4CorrectMeasuring)\n _contentElement.css(strOverflow, _strEmpty);\n \n //refresh viewport size after correct measuring\n _viewportSize = getViewportSize();\n\n hostSize = getHostSize();\n hostSizeChanged = checkCacheAutoForce(hostSize, _hostSizeCache);\n _hostSizeCache = hostSize;\n\n var hideOverflowForceTextarea = _isTextarea && (_viewportSize.w === 0 || _viewportSize.h === 0);\n var previousOverflow = _overflowAmountCache;\n var overflowBehaviorIsVS = { };\n var overflowBehaviorIsVH = { };\n var overflowBehaviorIsS = { };\n var overflowAmount = { };\n var hasOverflow = { };\n var hideOverflow = { };\n var canScroll = { };\n var viewportRect = _paddingElementNative[LEXICON.bCR]();\n var setOverflowVariables = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xyI = scrollbarVarsInverted._x_y;\n var xy = scrollbarVars._x_y;\n var wh = scrollbarVars._w_h;\n var widthHeight = scrollbarVars._width_height;\n var scrollMax = _strScroll + scrollbarVars._Left_Top + 'Max';\n var fractionalOverflowAmount = viewportRect[widthHeight] ? MATH.abs(viewportRect[widthHeight] - _viewportSize[wh]) : 0;\n overflowBehaviorIsVS[xy] = overflowBehavior[xy] === 'v-s';\n overflowBehaviorIsVH[xy] = overflowBehavior[xy] === 'v-h';\n overflowBehaviorIsS[xy] = overflowBehavior[xy] === 's';\n overflowAmount[xy] = MATH.max(0, MATH.round((contentScrollSize[wh] - _viewportSize[wh]) * 100) / 100);\n overflowAmount[xy] *= (hideOverflowForceTextarea || (_viewportElementNative[scrollMax] === 0 && fractionalOverflowAmount > 0 && fractionalOverflowAmount < 1)) ? 0 : 1;\n hasOverflow[xy] = overflowAmount[xy] > 0;\n\n //hideOverflow:\n //x || y : true === overflow is hidden by \"overflow: scroll\" OR \"overflow: hidden\"\n //xs || ys : true === overflow is hidden by \"overflow: scroll\"\n hideOverflow[xy] = overflowBehaviorIsVS[xy] || overflowBehaviorIsVH[xy] ? (hasOverflow[xyI] && !overflowBehaviorIsVS[xyI] && !overflowBehaviorIsVH[xyI]) : hasOverflow[xy];\n hideOverflow[xy + 's'] = hideOverflow[xy] ? (overflowBehaviorIsS[xy] || overflowBehaviorIsVS[xy]) : false;\n\n canScroll[xy] = hasOverflow[xy] && hideOverflow[xy + 's'];\n };\n setOverflowVariables(true);\n setOverflowVariables(false);\n\n overflowAmount.c = checkCacheAutoForce(overflowAmount, _overflowAmountCache);\n _overflowAmountCache = overflowAmount;\n hasOverflow.c = checkCacheAutoForce(hasOverflow, _hasOverflowCache);\n _hasOverflowCache = hasOverflow;\n hideOverflow.c = checkCacheAutoForce(hideOverflow, _hideOverflowCache);\n _hideOverflowCache = hideOverflow;\n\n //if native scrollbar is overlay at x OR y axis, prepare DOM\n if (_nativeScrollbarIsOverlaid.x || _nativeScrollbarIsOverlaid.y) {\n var borderDesign = 'px solid transparent';\n var contentArrangeElementCSS = { };\n var arrangeContent = { };\n var arrangeChanged = force;\n var setContentElementCSS;\n\n if (hasOverflow.x || hasOverflow.y) {\n arrangeContent.w = _nativeScrollbarIsOverlaid.y && hasOverflow.y ? contentScrollSize.w + _overlayScrollbarDummySize.y : _strEmpty;\n arrangeContent.h = _nativeScrollbarIsOverlaid.x && hasOverflow.x ? contentScrollSize.h + _overlayScrollbarDummySize.x : _strEmpty;\n arrangeChanged = checkCacheAutoForce(arrangeContent, _arrangeContentSizeCache);\n _arrangeContentSizeCache = arrangeContent;\n }\n\n if (hasOverflow.c || hideOverflow.c || contentScrollSize.c || cssDirectionChanged || widthAutoChanged || heightAutoChanged || widthAuto || heightAuto || ignoreOverlayScrollbarHidingChanged) {\n contentElementCSS[_strMarginMinus + isRTLRight] = contentElementCSS[_strBorderMinus + isRTLRight] = _strEmpty;\n setContentElementCSS = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xy = scrollbarVars._x_y;\n var strDirection = horizontal ? _strBottom : isRTLLeft;\n var invertedAutoSize = horizontal ? heightAuto : widthAuto;\n\n if (_nativeScrollbarIsOverlaid[xy] && hasOverflow[xy] && hideOverflow[xy + 's']) {\n contentElementCSS[_strMarginMinus + strDirection] = invertedAutoSize ? (ignoreOverlayScrollbarHiding ? _strEmpty : _overlayScrollbarDummySize[xy]) : _strEmpty;\n contentElementCSS[_strBorderMinus + strDirection] = ((horizontal ? !invertedAutoSize : true) && !ignoreOverlayScrollbarHiding) ? (_overlayScrollbarDummySize[xy] + borderDesign) : _strEmpty;\n }\n else {\n arrangeContent[scrollbarVarsInverted._w_h] =\n contentElementCSS[_strMarginMinus + strDirection] =\n contentElementCSS[_strBorderMinus + strDirection] = _strEmpty;\n arrangeChanged = true;\n }\n };\n\n if (_nativeScrollbarStyling) {\n if (ignoreOverlayScrollbarHiding) \n removeClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n else\n addClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n }\n else {\n setContentElementCSS(true);\n setContentElementCSS(false);\n }\n }\n if (ignoreOverlayScrollbarHiding) {\n arrangeContent.w = arrangeContent.h = _strEmpty;\n arrangeChanged = true;\n }\n if (arrangeChanged && !_nativeScrollbarStyling) {\n contentArrangeElementCSS[_strWidth] = hideOverflow.y ? arrangeContent.w : _strEmpty;\n contentArrangeElementCSS[_strHeight] = hideOverflow.x ? arrangeContent.h : _strEmpty;\n\n if (!_contentArrangeElement) {\n _contentArrangeElement = FRAMEWORK(generateDiv(_classNameContentArrangeElement));\n _viewportElement.prepend(_contentArrangeElement);\n }\n _contentArrangeElement.css(contentArrangeElementCSS);\n }\n _contentElement.css(contentElementCSS);\n }\n\n var viewportElementCSS = {};\n var paddingElementCSS = {};\n var setViewportCSS;\n if (hostSizeChanged || hasOverflow.c || hideOverflow.c || contentScrollSize.c || overflowBehaviorChanged || boxSizingChanged || ignoreOverlayScrollbarHidingChanged || cssDirectionChanged || clipAlwaysChanged || heightAutoChanged) {\n viewportElementCSS[isRTLRight] = _strEmpty;\n setViewportCSS = function(horizontal) {\n var scrollbarVars = getScrollbarVars(horizontal);\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\n var xy = scrollbarVars._x_y;\n var XY = scrollbarVars._X_Y;\n var strDirection = horizontal ? _strBottom : isRTLLeft;\n\n var reset = function () {\n viewportElementCSS[strDirection] = _strEmpty;\n _contentBorderSize[scrollbarVarsInverted._w_h] = 0;\n };\n if (hasOverflow[xy] && hideOverflow[xy + 's']) {\n viewportElementCSS[strOverflow + XY] = _strScroll;\n if (ignoreOverlayScrollbarHiding || _nativeScrollbarStyling) {\n reset();\n }\n else {\n viewportElementCSS[strDirection] = -(_nativeScrollbarIsOverlaid[xy] ? _overlayScrollbarDummySize[xy] : _nativeScrollbarSize[xy]);\n _contentBorderSize[scrollbarVarsInverted._w_h] = _nativeScrollbarIsOverlaid[xy] ? _overlayScrollbarDummySize[scrollbarVarsInverted._x_y] : 0;\n }\n } else {\n viewportElementCSS[strOverflow + XY] = _strEmpty;\n reset();\n }\n };\n setViewportCSS(true);\n setViewportCSS(false);\n \n // if the scroll container is too small and if there is any overflow with no overlay scrollbar (and scrollbar styling isn't possible), \n // make viewport element greater in size (Firefox hide Scrollbars fix)\n // because firefox starts hiding scrollbars on too small elements\n // with this behavior the overflow calculation may be incorrect or the scrollbars would appear suddenly\n // https://bugzilla.mozilla.org/show_bug.cgi?id=292284\n if (!_nativeScrollbarStyling \n && (_viewportSize.h < _nativeScrollbarMinSize.x || _viewportSize.w < _nativeScrollbarMinSize.y)\n && ((hasOverflow.x && hideOverflow.x && !_nativeScrollbarIsOverlaid.x) || (hasOverflow.y && hideOverflow.y && !_nativeScrollbarIsOverlaid.y))) {\n viewportElementCSS[_strPaddingMinus + _strTop] = _nativeScrollbarMinSize.x;\n viewportElementCSS[_strMarginMinus + _strTop] = -_nativeScrollbarMinSize.x;\n\n viewportElementCSS[_strPaddingMinus + isRTLRight] = _nativeScrollbarMinSize.y;\n viewportElementCSS[_strMarginMinus + isRTLRight] = -_nativeScrollbarMinSize.y;\n }\n else {\n viewportElementCSS[_strPaddingMinus + _strTop] =\n viewportElementCSS[_strMarginMinus + _strTop] =\n viewportElementCSS[_strPaddingMinus + isRTLRight] =\n viewportElementCSS[_strMarginMinus + isRTLRight] = _strEmpty;\n }\n viewportElementCSS[_strPaddingMinus + isRTLLeft] =\n viewportElementCSS[_strMarginMinus + isRTLLeft] = _strEmpty;\n\n //if there is any overflow (x OR y axis) and this overflow shall be hidden, make overflow hidden, else overflow visible\n if ((hasOverflow.x && hideOverflow.x) || (hasOverflow.y && hideOverflow.y) || hideOverflowForceTextarea) {\n //only hide if is Textarea\n if (_isTextarea && hideOverflowForceTextarea) {\n paddingElementCSS[strOverflowX] =\n paddingElementCSS[strOverflowY] = strHidden;\n }\n }\n else {\n if (!clipAlways || (overflowBehaviorIsVH.x || overflowBehaviorIsVS.x || overflowBehaviorIsVH.y || overflowBehaviorIsVS.y)) {\n //only un-hide if Textarea\n if (_isTextarea) {\n paddingElementCSS[strOverflowX] =\n paddingElementCSS[strOverflowY] = _strEmpty;\n }\n viewportElementCSS[strOverflowX] =\n viewportElementCSS[strOverflowY] = strVisible;\n }\n }\n\n _paddingElement.css(paddingElementCSS);\n _viewportElement.css(viewportElementCSS);\n viewportElementCSS = { };\n\n //force soft redraw in webkit because without the scrollbars will may appear because DOM wont be redrawn under special conditions\n if ((hasOverflow.c || boxSizingChanged || widthAutoChanged || heightAutoChanged) && !(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)) {\n var elementStyle = _contentElementNative[LEXICON.s];\n var dump;\n elementStyle.webkitTransform = 'scale(1)';\n elementStyle.display = 'run-in';\n dump = _contentElementNative[LEXICON.oH];\n elementStyle.display = _strEmpty; //|| dump; //use dump to prevent it from deletion if minify\n elementStyle.webkitTransform = _strEmpty;\n }\n /*\n //force hard redraw in webkit if native overlaid scrollbars shall appear\n if (ignoreOverlayScrollbarHidingChanged && ignoreOverlayScrollbarHiding) {\n _hostElement.hide();\n var dump = _hostElementNative[LEXICON.oH];\n _hostElement.show();\n }\n */\n }\n\n //change to direction RTL and width auto Bugfix in Webkit\n //without this fix, the DOM still thinks the scrollbar is LTR and thus the content is shifted to the left\n contentElementCSS = {};\n if (cssDirectionChanged || widthAutoChanged || heightAutoChanged) {\n if (_isRTL && widthAuto) {\n var floatTmp = _contentElement.css(_strFloat);\n var posLeftWithoutFloat = MATH.round(_contentElement.css(_strFloat, _strEmpty).css(_strLeft, _strEmpty).position().left);\n _contentElement.css(_strFloat, floatTmp);\n var posLeftWithFloat = MATH.round(_contentElement.position().left);\n\n if (posLeftWithoutFloat !== posLeftWithFloat)\n contentElementCSS[_strLeft] = posLeftWithoutFloat;\n }\n else {\n contentElementCSS[_strLeft] = _strEmpty;\n }\n }\n _contentElement.css(contentElementCSS);\n\n //handle scroll position\n if (_isTextarea && contentSizeChanged) {\n var textareaInfo = getTextareaInfo();\n if (textareaInfo) {\n var textareaRowsChanged = _textareaInfoCache === undefined ? true : textareaInfo._rows !== _textareaInfoCache._rows;\n var cursorRow = textareaInfo._cursorRow;\n var cursorCol = textareaInfo._cursorColumn;\n var widestRow = textareaInfo._widestRow;\n var lastRow = textareaInfo._rows;\n var lastCol = textareaInfo._columns;\n var cursorPos = textareaInfo._cursorPosition;\n var cursorMax = textareaInfo._cursorMax;\n var cursorIsLastPosition = (cursorPos >= cursorMax && _textareaHasFocus);\n var textareaScrollAmount = {\n x: (!textareaAutoWrapping && (cursorCol === lastCol && cursorRow === widestRow)) ? _overflowAmountCache.x : -1,\n y: (textareaAutoWrapping ? cursorIsLastPosition || textareaRowsChanged && (previousOverflow !== undefined ? (currScroll.y === previousOverflow.y) : false) : (cursorIsLastPosition || textareaRowsChanged) && cursorRow === lastRow) ? _overflowAmountCache.y : -1\n };\n currScroll.x = textareaScrollAmount.x > -1 ? (_isRTL && _normalizeRTLCache && _rtlScrollBehavior.i ? 0 : textareaScrollAmount.x) : currScroll.x; //if inverted, scroll to 0 -> normalized this means to max scroll offset.\n currScroll.y = textareaScrollAmount.y > -1 ? textareaScrollAmount.y : currScroll.y;\n }\n _textareaInfoCache = textareaInfo;\n }\n if (_isRTL && _rtlScrollBehavior.i && _nativeScrollbarIsOverlaid.y && hasOverflow.x && _normalizeRTLCache)\n currScroll.x += _contentBorderSize.w || 0;\n if(widthAuto)\n _hostElement[_strScrollLeft](0);\n if(heightAuto)\n _hostElement[_strScrollTop](0);\n _viewportElement[_strScrollLeft](currScroll.x)[_strScrollTop](currScroll.y);\n\n //scrollbars management:\n var scrollbarsVisibilityVisible = scrollbarsVisibility === 'v';\n var scrollbarsVisibilityHidden = scrollbarsVisibility === 'h';\n var scrollbarsVisibilityAuto = scrollbarsVisibility === 'a';\n\n var showScrollbarH = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, true, true, canScroll.x);\n var showScrollbarV = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, false, true, canScroll.y);\n var hideScrollbarH = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, true, false, canScroll.x);\n var hideScrollbarV = COMPATIBILITY.bind(refreshScrollbarAppearance, 0, false, false, canScroll.y);\n\n //manage class name which indicates scrollable overflow\n if (hideOverflow.x || hideOverflow.y)\n addClass(_hostElement, _classNameHostOverflow);\n else\n removeClass(_hostElement, _classNameHostOverflow);\n if (hideOverflow.x)\n addClass(_hostElement, _classNameHostOverflowX);\n else\n removeClass(_hostElement, _classNameHostOverflowX);\n if (hideOverflow.y)\n addClass(_hostElement, _classNameHostOverflowY);\n else\n removeClass(_hostElement, _classNameHostOverflowY);\n\n //add or remove rtl class name for styling purposes\n if (cssDirectionChanged) {\n if (_isRTL)\n addClass(_hostElement, _classNameHostRTL);\n else\n removeClass(_hostElement, _classNameHostRTL);\n }\n\n //manage the resize feature (CSS3 resize \"polyfill\" for this plugin)\n if (_isBody)\n addClass(_hostElement, _classNameHostResizeDisabled);\n if (resizeChanged) {\n removeClass(_scrollbarCornerElement, [ \n _classNameScrollbarCornerResize,\n _classNameScrollbarCornerResizeB,\n _classNameScrollbarCornerResizeH,\n _classNameScrollbarCornerResizeV].join(_strSpace));\n if (_resizeNone) {\n addClass(_hostElement, _classNameHostResizeDisabled);\n }\n else {\n removeClass(_hostElement, _classNameHostResizeDisabled);\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResize);\n if (_resizeBoth)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeB);\n else if (_resizeHorizontal)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeH);\n else if (_resizeVertical)\n addClass(_scrollbarCornerElement, _classNameScrollbarCornerResizeV);\n }\n }\n\n //manage the scrollbars general visibility + the scrollbar interactivity (unusable class name)\n if (scrollbarsVisibilityChanged || overflowBehaviorChanged || hideOverflow.c || hasOverflow.c || ignoreOverlayScrollbarHidingChanged) {\n if (ignoreOverlayScrollbarHiding) {\n if (ignoreOverlayScrollbarHidingChanged) {\n removeClass(_hostElement, _classNameHostScrolling);\n if (ignoreOverlayScrollbarHiding) {\n hideScrollbarH();\n hideScrollbarV();\n }\n }\n }\n else if (scrollbarsVisibilityAuto) {\n if (canScroll.x)\n showScrollbarH();\n else\n hideScrollbarH();\n\n if (canScroll.y)\n showScrollbarV();\n else\n hideScrollbarV();\n }\n else if (scrollbarsVisibilityVisible) {\n showScrollbarH();\n showScrollbarV();\n }\n else if (scrollbarsVisibilityHidden) {\n hideScrollbarH();\n hideScrollbarV();\n }\n }\n\n //manage the scrollbars auto hide feature (auto hide them after specific actions)\n if (scrollbarsAutoHideChanged || ignoreOverlayScrollbarHidingChanged) {\n if (_scrollbarsAutoHideLeave || _scrollbarsAutoHideMove) {\n setupHostMouseTouchEvents(true);\n setupHostMouseTouchEvents();\n }\n else {\n setupHostMouseTouchEvents(true);\n }\n\n if (_scrollbarsAutoHideNever)\n refreshScrollbarsAutoHide(true);\n else\n refreshScrollbarsAutoHide(false, true);\n }\n\n //manage scrollbars handle length & offset - don't remove!\n if (hostSizeChanged || overflowAmount.c || heightAutoChanged || widthAutoChanged || resizeChanged || boxSizingChanged || paddingAbsoluteChanged || ignoreOverlayScrollbarHidingChanged || cssDirectionChanged) {\n refreshScrollbarHandleLength(true);\n refreshScrollbarHandleOffset(true);\n refreshScrollbarHandleLength(false);\n refreshScrollbarHandleOffset(false);\n }\n\n //manage interactivity\n if (scrollbarsClickScrollingChanged)\n refreshScrollbarsInteractive(true, scrollbarsClickScrolling);\n if (scrollbarsDragScrollingChanged)\n refreshScrollbarsInteractive(false, scrollbarsDragScrolling);\n\n //callbacks:\n if (cssDirectionChanged) {\n dispatchCallback('onDirectionChanged', {\n isRTL: _isRTL,\n dir: cssDirection\n });\n }\n if (hostSizeChanged) {\n dispatchCallback('onHostSizeChanged', {\n width: _hostSizeCache.w,\n height: _hostSizeCache.h\n });\n }\n if (contentSizeChanged) {\n dispatchCallback('onContentSizeChanged', {\n width: _contentScrollSizeCache.w,\n height: _contentScrollSizeCache.h\n });\n }\n if (hasOverflow.c || hideOverflow.c) {\n dispatchCallback('onOverflowChanged', {\n x: hasOverflow.x,\n y: hasOverflow.y,\n xScrollable: hideOverflow.xs,\n yScrollable: hideOverflow.ys,\n clipped: hideOverflow.x || hideOverflow.y\n });\n }\n if (overflowAmount.c) {\n dispatchCallback('onOverflowAmountChanged', {\n x: overflowAmount.x,\n y: overflowAmount.y\n });\n }\n }\n\n //fix body min size\n if (_isBody && _bodyMinSizeCache && (_hasOverflowCache.c || _bodyMinSizeCache.c)) {\n //its possible that no min size was measured until now, because the content arrange element was just added now, in this case, measure now the min size.\n if (!_bodyMinSizeCache.f)\n bodyMinSizeChanged();\n if (_nativeScrollbarIsOverlaid.y && _hasOverflowCache.x)\n _contentElement.css(_strMinMinus + _strWidth, _bodyMinSizeCache.w + _overlayScrollbarDummySize.y);\n if (_nativeScrollbarIsOverlaid.x && _hasOverflowCache.y)\n _contentElement.css(_strMinMinus + _strHeight, _bodyMinSizeCache.h + _overlayScrollbarDummySize.x);\n _bodyMinSizeCache.c = false;\n }\n\n //freezeResizeObserver(_sizeObserverElement, false);\n //freezeResizeObserver(_sizeAutoObserverElement, false);\n\n dispatchCallback('onUpdated', { forced: force });\n }\n\n \n //==== Options ====//\n\n /**\n * Sets new options but doesn't call the update method.\n * @param newOptions The object which contains the new options.\n * @returns {*} A object which contains the changed options.\n */\n function setOptions(newOptions) {\n var validatedOpts = _pluginsOptions._validate(newOptions, _pluginsOptions._template, true, _currentOptions)\n\n _currentOptions = extendDeep({}, _currentOptions, validatedOpts._default);\n _currentPreparedOptions = extendDeep({}, _currentPreparedOptions, validatedOpts._prepared);\n \n return validatedOpts._prepared;\n }\n\n\n //==== Structure ====//\n\n /**\n * Builds or destroys the wrapper and helper DOM elements.\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupStructureDOM(destroy) {\n var strParent = 'parent';\n var classNameResizeObserverHost = 'os-resize-observer-host';\n var classNameTextareaElementFull = _classNameTextareaElement + _strSpace + _classNameTextInherit;\n var textareaClass = _isTextarea ? _strSpace + _classNameTextInherit : _strEmpty;\n var adoptAttrs = _currentPreparedOptions.textarea.inheritedAttrs;\n var adoptAttrsMap = { };\n var applyAdoptedAttrs = function() {\n var applyAdoptedAttrsElm = destroy ? _targetElement : _hostElement;\n each(adoptAttrsMap, function(key, value) {\n if(type(value) == TYPES.s) {\n if(key == LEXICON.c)\n applyAdoptedAttrsElm.addClass(value);\n else\n applyAdoptedAttrsElm.attr(key, value);\n }\n });\n };\n var hostElementClassNames = [\n _classNameHostElement,\n _classNameHostTextareaElement,\n _classNameHostResizeDisabled,\n _classNameHostRTL,\n _classNameHostScrollbarHorizontalHidden,\n _classNameHostScrollbarVerticalHidden,\n _classNameHostTransition,\n _classNameHostScrolling,\n _classNameHostOverflow,\n _classNameHostOverflowX,\n _classNameHostOverflowY,\n _classNameThemeNone,\n _classNameTextareaElement,\n _classNameTextInherit,\n _classNameCache].join(_strSpace);\n var hostElementCSS = { };\n \n //get host element as first element, because that's the most upper element and required for the other elements\n _hostElement = _hostElement || (_isTextarea ? (_domExists ? _targetElement[strParent]()[strParent]()[strParent]()[strParent]() : FRAMEWORK(generateDiv(_classNameHostTextareaElement))) : _targetElement);\n _contentElement = _contentElement || selectOrGenerateDivByClass(_classNameContentElement + textareaClass);\n _viewportElement = _viewportElement || selectOrGenerateDivByClass(_classNameViewportElement + textareaClass);\n _paddingElement = _paddingElement || selectOrGenerateDivByClass(_classNamePaddingElement + textareaClass);\n _sizeObserverElement = _sizeObserverElement || selectOrGenerateDivByClass(classNameResizeObserverHost);\n _textareaCoverElement = _textareaCoverElement || (_isTextarea ? selectOrGenerateDivByClass(_classNameTextareaCoverElement) : undefined);\n \n //on destroy, remove all generated class names from the host element before collecting the adopted attributes \n //to prevent adopting generated class names\n if(destroy)\n removeClass(_hostElement, hostElementClassNames);\n \n //collect all adopted attributes\n adoptAttrs = type(adoptAttrs) == TYPES.s ? adoptAttrs.split(_strSpace) : adoptAttrs;\n if(type(adoptAttrs) == TYPES.a && _isTextarea) {\n each(adoptAttrs, function(i, v) {\n if(type(v) == TYPES.s) {\n adoptAttrsMap[v] = destroy ? _hostElement.attr(v) : _targetElement.attr(v);\n }\n });\n }\n\n if(!destroy) {\n if(_isTextarea) {\n if(!_currentPreparedOptions.sizeAutoCapable) {\n hostElementCSS[_strWidth] = _targetElement.css(_strWidth);\n hostElementCSS[_strHeight] = _targetElement.css(_strHeight);\n }\n \n if(!_domExists)\n _targetElement.addClass(_classNameTextInherit).wrap(_hostElement);\n \n //jQuery clones elements in wrap functions, so we have to select them again\n _hostElement = _targetElement[strParent]().css(hostElementCSS);\n }\n \n if(!_domExists) {\n //add the correct class to the target element\n addClass(_targetElement, _isTextarea ? classNameTextareaElementFull : _classNameHostElement);\n\n //wrap the content into the generated elements to create the required DOM\n _hostElement.wrapInner(_contentElement)\n .wrapInner(_viewportElement)\n .wrapInner(_paddingElement)\n .prepend(_sizeObserverElement);\n \n //jQuery clones elements in wrap functions, so we have to select them again\n _contentElement = findFirst(_hostElement, _strDot + _classNameContentElement);\n _viewportElement = findFirst(_hostElement, _strDot + _classNameViewportElement);\n _paddingElement = findFirst(_hostElement, _strDot + _classNamePaddingElement);\n \n if(_isTextarea) {\n _contentElement.prepend(_textareaCoverElement);\n applyAdoptedAttrs();\n }\n }\n \n if (_nativeScrollbarStyling)\n addClass(_viewportElement, _classNameViewportNativeScrollbarsInvisible);\n if(_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y)\n addClass(_viewportElement, _classNameViewportNativeScrollbarsOverlaid);\n if (_isBody)\n addClass(_htmlElement, _classNameHTMLElement);\n\n _sizeObserverElementNative = _sizeObserverElement[0];\n _hostElementNative = _hostElement[0];\n _paddingElementNative = _paddingElement[0];\n _viewportElementNative = _viewportElement[0];\n _contentElementNative = _contentElement[0];\n }\n else {\n if(_domExists && _initialized) {\n //clear size observer\n _sizeObserverElement.children().remove();\n \n //remove the style property and classes from already generated elements\n each([ _paddingElement, _viewportElement, _contentElement, _textareaCoverElement ], function(i, elm) { \n if(elm) {\n removeClass(elm.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n }\n });\n \n //add classes to the host element which was removed previously to match the expected DOM\n addClass(_hostElement, _isTextarea ? _classNameHostTextareaElement : _classNameHostElement);\n }\n else {\n //remove size observer\n remove(_sizeObserverElement);\n \n //unwrap the content to restore DOM\n _contentElement.contents()\n .unwrap()\n .unwrap()\n .unwrap();\n \n if(_isTextarea) {\n _targetElement.unwrap();\n remove(_hostElement);\n remove(_textareaCoverElement);\n applyAdoptedAttrs();\n }\n }\n \n if (_isTextarea)\n _targetElement.removeAttr(LEXICON.s);\n \n if (_isBody)\n removeClass(_htmlElement, _classNameHTMLElement);\n }\n }\n\n /**\n * Adds or removes all wrapper elements interactivity events.\n * @param destroy Indicates whether the Events shall be added or removed.\n */\n function setupStructureEvents() {\n var textareaKeyDownRestrictedKeyCodes = [\n 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, //F1 to F12\n 33, 34, //page up, page down\n 37, 38, 39, 40, //left, up, right, down arrows\n 16, 17, 18, 19, 20, 144 //Shift, Ctrl, Alt, Pause, CapsLock, NumLock\n ];\n var textareaKeyDownKeyCodesList = [ ];\n var textareaUpdateIntervalID;\n var scrollStopTimeoutId;\n var scrollStopDelay = 175;\n var strFocus = 'focus';\n\n function updateTextarea(doClearInterval) {\n textareaUpdate();\n _base.update(_strAuto);\n if(doClearInterval && _autoUpdateRecommended)\n clearInterval(textareaUpdateIntervalID);\n }\n function textareaOnScroll(event) {\n _targetElement[_strScrollLeft](_rtlScrollBehavior.i && _normalizeRTLCache ? 9999999 : 0);\n _targetElement[_strScrollTop](0);\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n return false;\n }\n function textareaOnDrop(event) {\n setTimeout(function () {\n if(!_destroyed)\n updateTextarea();\n }, 50);\n }\n function textareaOnFocus() {\n _textareaHasFocus = true;\n addClass(_hostElement, strFocus);\n }\n function textareaOnFocusout() {\n _textareaHasFocus = false;\n textareaKeyDownKeyCodesList = [ ];\n removeClass(_hostElement, strFocus);\n updateTextarea(true);\n } \n function textareaOnKeyDown(event) {\n var keyCode = event.keyCode;\n \n if (inArray(keyCode, textareaKeyDownRestrictedKeyCodes) < 0) {\n if (!textareaKeyDownKeyCodesList[LEXICON.l]) {\n updateTextarea();\n textareaUpdateIntervalID = setInterval(updateTextarea, 1000 / 60);\n }\n if (inArray(keyCode, textareaKeyDownKeyCodesList) < 0)\n textareaKeyDownKeyCodesList.push(keyCode);\n }\n }\n function textareaOnKeyUp(event) {\n var keyCode = event.keyCode;\n var index = inArray(keyCode, textareaKeyDownKeyCodesList);\n\n if (inArray(keyCode, textareaKeyDownRestrictedKeyCodes) < 0) {\n if (index > -1)\n textareaKeyDownKeyCodesList.splice(index, 1);\n if (!textareaKeyDownKeyCodesList[LEXICON.l])\n updateTextarea(true);\n }\n } \n function contentOnTransitionEnd(event) {\n if (_autoUpdateCache === true)\n return;\n event = event.originalEvent || event;\n if (isSizeAffectingCSSProperty(event.propertyName))\n _base.update(_strAuto);\n }\n function viewportOnScroll(event) {\n if (!_sleeping) {\n if (scrollStopTimeoutId !== undefined)\n clearTimeout(scrollStopTimeoutId);\n else {\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(true);\n\n if (!nativeOverlayScrollbarsAreActive())\n addClass(_hostElement, _classNameHostScrolling);\n\n dispatchCallback('onScrollStart', event);\n }\n\n //if a scrollbars handle gets dragged, the mousemove event is responsible for refreshing the handle offset\n //because if CSS scroll-snap is used, the handle offset gets only refreshed on every snap point\n //this looks laggy & clunky, it looks much better if the offset refreshes with the mousemove\n if(!_scrollbarsHandlesDefineScrollPos) {\n refreshScrollbarHandleOffset(true);\n refreshScrollbarHandleOffset(false);\n }\n dispatchCallback('onScroll', event);\n\n scrollStopTimeoutId = setTimeout(function () {\n if(!_destroyed) {\n //OnScrollStop:\n clearTimeout(scrollStopTimeoutId);\n scrollStopTimeoutId = undefined;\n\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n\n if (!nativeOverlayScrollbarsAreActive())\n removeClass(_hostElement, _classNameHostScrolling);\n\n dispatchCallback('onScrollStop', event);\n }\n }, scrollStopDelay);\n }\n }\n\n\n if (_isTextarea) { \n if (_msieVersion > 9 || !_autoUpdateRecommended) {\n addDestroyEventListener(_targetElement, 'input', updateTextarea);\n }\n else {\n addDestroyEventListener(_targetElement, \n [ _strKeyDownEvent, _strKeyUpEvent ],\n [ textareaOnKeyDown, textareaOnKeyUp ]);\n }\n \n addDestroyEventListener(_targetElement, \n [ _strScroll, 'drop', strFocus, strFocus + 'out' ],\n [ textareaOnScroll, textareaOnDrop, textareaOnFocus, textareaOnFocusout ]);\n }\n else {\n addDestroyEventListener(_contentElement, _strTransitionEndEvent, contentOnTransitionEnd);\n }\n addDestroyEventListener(_viewportElement, _strScroll, viewportOnScroll, true);\n }\n\n\n //==== Scrollbars ====//\n\n /**\n * Builds or destroys all scrollbar DOM elements (scrollbar, track, handle)\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupScrollbarsDOM(destroy) {\n var selectOrGenerateScrollbarDOM = function(isHorizontal) {\n var scrollbarClassName = isHorizontal ? _classNameScrollbarHorizontal : _classNameScrollbarVertical;\n var scrollbar = selectOrGenerateDivByClass(_classNameScrollbar + _strSpace + scrollbarClassName, true);\n var track = selectOrGenerateDivByClass(_classNameScrollbarTrack, scrollbar);\n var handle = selectOrGenerateDivByClass(_classNameScrollbarHandle, scrollbar);\n\n if(!_domExists && !destroy) {\n scrollbar.append(track);\n track.append(handle);\n }\n \n return {\n _scrollbar: scrollbar,\n _track: track,\n _handle: handle\n };\n };\n function resetScrollbarDOM(isHorizontal) {\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbar = scrollbarVars._scrollbar;\n var track = scrollbarVars._track;\n var handle = scrollbarVars._handle;\n \n if(_domExists && _initialized) {\n each([ scrollbar, track, handle ], function(i, elm) { \n removeClass(elm.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n });\n }\n else {\n remove(scrollbar || selectOrGenerateScrollbarDOM(isHorizontal)._scrollbar);\n }\n }\n var horizontalElements;\n var verticalElements;\n \n if(!destroy) {\n horizontalElements = selectOrGenerateScrollbarDOM(true);\n verticalElements = selectOrGenerateScrollbarDOM();\n \n _scrollbarHorizontalElement = horizontalElements._scrollbar;\n _scrollbarHorizontalTrackElement = horizontalElements._track;\n _scrollbarHorizontalHandleElement = horizontalElements._handle;\n _scrollbarVerticalElement = verticalElements._scrollbar;\n _scrollbarVerticalTrackElement = verticalElements._track;\n _scrollbarVerticalHandleElement = verticalElements._handle;\n\n if(!_domExists) {\n _paddingElement.after(_scrollbarVerticalElement);\n _paddingElement.after(_scrollbarHorizontalElement);\n }\n }\n else {\n resetScrollbarDOM(true);\n resetScrollbarDOM();\n }\n }\n\n /**\n * Initializes all scrollbar interactivity events. (track and handle dragging, clicking, scrolling)\n * @param isHorizontal True if the target scrollbar is the horizontal scrollbar, false if the target scrollbar is the vertical scrollbar.\n */\n function setupScrollbarEvents(isHorizontal) {\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var insideIFrame = _windowElementNative.top !== _windowElementNative;\n var xy = scrollbarVars._x_y;\n var XY = scrollbarVars._X_Y;\n var scroll = _strScroll + scrollbarVars._Left_Top;\n var strActive = 'active';\n var strSnapHandle = 'snapHandle';\n var scrollDurationFactor = 1;\n var increaseDecreaseScrollAmountKeyCodes = [ 16, 17 ]; //shift, ctrl\n var trackTimeout;\n var mouseDownScroll;\n var mouseDownOffset;\n var mouseDownInvertedScale;\n \n function getPointerPosition(event) {\n return _msieVersion && insideIFrame ? event['screen' + XY] : COMPATIBILITY.page(event)[xy]; //use screen coordinates in EDGE & IE because the page values are incorrect in frames.\n }\n function getPreparedScrollbarsOption(name) {\n return _currentPreparedOptions.scrollbars[name];\n }\n function increaseTrackScrollAmount() {\n scrollDurationFactor = 0.5;\n }\n function decreaseTrackScrollAmount() {\n scrollDurationFactor = 1;\n }\n function documentKeyDown(event) {\n if (inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)\n increaseTrackScrollAmount();\n }\n function documentKeyUp(event) {\n if (inArray(event.keyCode, increaseDecreaseScrollAmountKeyCodes) > -1)\n decreaseTrackScrollAmount();\n }\n function onMouseTouchDownContinue(event) {\n var originalEvent = event.originalEvent || event;\n var isTouchEvent = originalEvent.touches !== undefined;\n return _sleeping || _destroyed || nativeOverlayScrollbarsAreActive() || !_scrollbarsDragScrollingCache || (isTouchEvent && !getPreparedScrollbarsOption('touchSupport')) ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent;\n }\n function documentDragMove(event) {\n if(onMouseTouchDownContinue(event)) {\n var trackLength = scrollbarVarsInfo._trackLength;\n var handleLength = scrollbarVarsInfo._handleLength;\n var scrollRange = scrollbarVarsInfo._maxScroll;\n var scrollRaw = (getPointerPosition(event) - mouseDownOffset) * mouseDownInvertedScale;\n var scrollDeltaPercent = scrollRaw / (trackLength - handleLength);\n var scrollDelta = (scrollRange * scrollDeltaPercent);\n scrollDelta = isFinite(scrollDelta) ? scrollDelta : 0;\n if (_isRTL && isHorizontal && !_rtlScrollBehavior.i)\n scrollDelta *= -1;\n\n _viewportElement[scroll](MATH.round(mouseDownScroll + scrollDelta));\n\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, mouseDownScroll + scrollDelta);\n\n if (!_supportPassiveEvents)\n COMPATIBILITY.prvD(event);\n }\n else\n documentMouseTouchUp(event);\n }\n function documentMouseTouchUp(event) {\n event = event || event.originalEvent;\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchMoveEvent, _strMouseTouchUpEvent, _strKeyDownEvent, _strKeyUpEvent, _strSelectStartEvent ],\n [ documentDragMove, documentMouseTouchUp, documentKeyDown, documentKeyUp, documentOnSelectStart ],\n true);\n\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, true);\n\n _scrollbarsHandlesDefineScrollPos = false;\n removeClass(_bodyElement, _classNameDragging);\n removeClass(scrollbarVars._handle, strActive);\n removeClass(scrollbarVars._track, strActive);\n removeClass(scrollbarVars._scrollbar, strActive);\n\n mouseDownScroll = undefined;\n mouseDownOffset = undefined;\n mouseDownInvertedScale = 1;\n\n decreaseTrackScrollAmount();\n\n if (trackTimeout !== undefined) {\n _base.scrollStop();\n clearTimeout(trackTimeout);\n trackTimeout = undefined;\n }\n\n if(event) {\n var rect = _hostElementNative[LEXICON.bCR]();\n var mouseInsideHost = event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom;\n\n //if mouse is outside host element\n if (!mouseInsideHost)\n hostOnMouseLeave();\n\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n }\n }\n function onHandleMouseTouchDown(event) {\n if (onMouseTouchDownContinue(event))\n onHandleMouseTouchDownAction(event);\n }\n function onHandleMouseTouchDownAction(event) {\n mouseDownScroll = _viewportElement[scroll]();\n mouseDownScroll = isNaN(mouseDownScroll) ? 0 : mouseDownScroll;\n if (_isRTL && isHorizontal && !_rtlScrollBehavior.n || !_isRTL)\n mouseDownScroll = mouseDownScroll < 0 ? 0 : mouseDownScroll;\n\n mouseDownInvertedScale = getHostElementInvertedScale()[xy];\n mouseDownOffset = getPointerPosition(event);\n\n _scrollbarsHandlesDefineScrollPos = !getPreparedScrollbarsOption(strSnapHandle);\n addClass(_bodyElement, _classNameDragging);\n addClass(scrollbarVars._handle, strActive);\n addClass(scrollbarVars._scrollbar, strActive);\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchMoveEvent, _strMouseTouchUpEvent, _strSelectStartEvent ],\n [ documentDragMove, documentMouseTouchUp, documentOnSelectStart ]);\n\n if(_msieVersion || !_documentMixed)\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n function onTrackMouseTouchDown(event) {\n if (onMouseTouchDownContinue(event)) {\n var scrollDistance = MATH.round(_viewportSize[scrollbarVars._w_h]);\n var trackOffset = scrollbarVars._track.offset()[scrollbarVars._left_top];\n var ctrlKey = event.ctrlKey;\n var instantScroll = event.shiftKey;\n var instantScrollTransition = instantScroll && ctrlKey;\n var isFirstIteration = true;\n var easing = 'linear';\n var decreaseScroll;\n var finishedCondition;\n var scrollActionFinsished = function(transition) {\n if(_scrollbarsHandlesDefineScrollPos)\n refreshScrollbarHandleOffset(isHorizontal, transition);\n };\n var scrollActionInstantFinished = function() {\n scrollActionFinsished();\n onHandleMouseTouchDownAction(event);\n };\n var scrollAction = function () {\n if(!_destroyed) {\n var mouseOffset = (mouseDownOffset - trackOffset) * mouseDownInvertedScale;\n var handleOffset = scrollbarVarsInfo._handleOffset;\n var trackLength = scrollbarVarsInfo._trackLength;\n var handleLength = scrollbarVarsInfo._handleLength;\n var scrollRange = scrollbarVarsInfo._maxScroll;\n var currScroll = scrollbarVarsInfo._currentScroll;\n var scrollDuration = 270 * scrollDurationFactor;\n var timeoutDelay = isFirstIteration ? MATH.max(400, scrollDuration) : scrollDuration;\n var instantScrollPosition = scrollRange * ((mouseOffset - (handleLength / 2)) / (trackLength - handleLength)); // 100% * positionPercent\n var rtlIsNormal = _isRTL && isHorizontal && ((!_rtlScrollBehavior.i && !_rtlScrollBehavior.n) || _normalizeRTLCache);\n var decreaseScrollCondition = rtlIsNormal ? handleOffset < mouseOffset : handleOffset > mouseOffset;\n var scrollObj = { };\n var animationObj = {\n easing : easing,\n step : function(now) {\n if(_scrollbarsHandlesDefineScrollPos) {\n _viewportElement[scroll](now); //https://github.com/jquery/jquery/issues/4340\n refreshScrollbarHandleOffset(isHorizontal, now);\n }\n }\n };\n instantScrollPosition = isFinite(instantScrollPosition) ? instantScrollPosition : 0;\n instantScrollPosition = _isRTL && isHorizontal && !_rtlScrollBehavior.i ? (scrollRange - instantScrollPosition) : instantScrollPosition;\n\n //_base.scrollStop();\n\n if(instantScroll) {\n _viewportElement[scroll](instantScrollPosition); //scroll instantly to new position\n if(instantScrollTransition) {\n //get the scroll position after instant scroll (in case CSS Snap Points are used) to get the correct snapped scroll position\n //and the animation stops at the correct point\n instantScrollPosition = _viewportElement[scroll]();\n //scroll back to the position before instant scrolling so animation can be performed\n _viewportElement[scroll](currScroll);\n\n instantScrollPosition = rtlIsNormal && _rtlScrollBehavior.i ? (scrollRange - instantScrollPosition) : instantScrollPosition;\n instantScrollPosition = rtlIsNormal && _rtlScrollBehavior.n ? -instantScrollPosition : instantScrollPosition;\n\n scrollObj[xy] = instantScrollPosition;\n _base.scroll(scrollObj, extendDeep(animationObj, {\n duration : 130,\n complete : scrollActionInstantFinished\n }));\n }\n else\n scrollActionInstantFinished();\n }\n else {\n decreaseScroll = isFirstIteration ? decreaseScrollCondition : decreaseScroll;\n finishedCondition = rtlIsNormal\n ? (decreaseScroll ? handleOffset + handleLength >= mouseOffset : handleOffset <= mouseOffset)\n : (decreaseScroll ? handleOffset <= mouseOffset : handleOffset + handleLength >= mouseOffset);\n\n if (finishedCondition) {\n clearTimeout(trackTimeout);\n _base.scrollStop();\n trackTimeout = undefined;\n scrollActionFinsished(true);\n }\n else {\n trackTimeout = setTimeout(scrollAction, timeoutDelay);\n\n scrollObj[xy] = (decreaseScroll ? '-=' : '+=') + scrollDistance;\n _base.scroll(scrollObj, extendDeep(animationObj, {\n duration: scrollDuration\n }));\n }\n isFirstIteration = false;\n }\n }\n };\n if (ctrlKey)\n increaseTrackScrollAmount();\n\n mouseDownInvertedScale = getHostElementInvertedScale()[xy];\n mouseDownOffset = COMPATIBILITY.page(event)[xy];\n\n _scrollbarsHandlesDefineScrollPos = !getPreparedScrollbarsOption(strSnapHandle);\n addClass(_bodyElement, _classNameDragging);\n addClass(scrollbarVars._track, strActive);\n addClass(scrollbarVars._scrollbar, strActive);\n\n setupResponsiveEventListener(_documentElement,\n [ _strMouseTouchUpEvent, _strKeyDownEvent, _strKeyUpEvent, _strSelectStartEvent ],\n [ documentMouseTouchUp, documentKeyDown, documentKeyUp, documentOnSelectStart ]);\n\n scrollAction();\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n }\n function onTrackMouseTouchEnter(event) {\n //make sure both scrollbars will stay visible if one scrollbar is hovered if autoHide is \"scroll\" or \"move\".\n _scrollbarsHandleHovered = true;\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(true);\n }\n function onTrackMouseTouchLeave(event) {\n _scrollbarsHandleHovered = false;\n if (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove)\n refreshScrollbarsAutoHide(false);\n }\n function onScrollbarMouseTouchDown(event) {\n COMPATIBILITY.stpP(event);\n }\n \n addDestroyEventListener(scrollbarVars._handle, \n _strMouseTouchDownEvent, \n onHandleMouseTouchDown);\n addDestroyEventListener(scrollbarVars._track,\n [_strMouseTouchDownEvent, _strMouseTouchEnter, _strMouseTouchLeave], \n [onTrackMouseTouchDown, onTrackMouseTouchEnter, onTrackMouseTouchLeave]);\n addDestroyEventListener(scrollbarVars._scrollbar, \n _strMouseTouchDownEvent, \n onScrollbarMouseTouchDown);\n\n if (_supportTransition) {\n addDestroyEventListener(scrollbarVars._scrollbar, _strTransitionEndEvent, function(event) {\n if (event.target !== scrollbarVars._scrollbar[0])\n return;\n refreshScrollbarHandleLength(isHorizontal);\n refreshScrollbarHandleOffset(isHorizontal);\n });\n }\n }\n\n /**\n * Shows or hides the given scrollbar and applied a class name which indicates if the scrollbar is scrollable or not.\n * @param isHorizontal True if the horizontal scrollbar is the target, false if the vertical scrollbar is the target.\n * @param shallBeVisible True if the scrollbar shall be shown, false if hidden.\n * @param canScroll True if the scrollbar is scrollable, false otherwise.\n */\n function refreshScrollbarAppearance(isHorizontal, shallBeVisible, canScroll) {\n var scrollbarClassName = isHorizontal ? _classNameHostScrollbarHorizontalHidden : _classNameHostScrollbarVerticalHidden;\n var scrollbarElement = isHorizontal ? _scrollbarHorizontalElement : _scrollbarVerticalElement;\n\n if (shallBeVisible)\n removeClass(_hostElement, scrollbarClassName);\n else\n addClass(_hostElement, scrollbarClassName);\n\n if (canScroll)\n removeClass(scrollbarElement, _classNameScrollbarUnusable);\n else\n addClass(scrollbarElement, _classNameScrollbarUnusable);\n }\n\n /**\n * Autoshows / autohides both scrollbars with.\n * @param shallBeVisible True if the scrollbars shall be autoshown (only the case if they are hidden by a autohide), false if the shall be auto hidden.\n * @param delayfree True if the scrollbars shall be hidden without a delay, false or undefined otherwise.\n */\n function refreshScrollbarsAutoHide(shallBeVisible, delayfree) {\n clearTimeout(_scrollbarsAutoHideTimeoutId);\n if (shallBeVisible) {\n //if(_hasOverflowCache.x && _hideOverflowCache.xs)\n removeClass(_scrollbarHorizontalElement, _classNameScrollbarAutoHidden);\n //if(_hasOverflowCache.y && _hideOverflowCache.ys)\n removeClass(_scrollbarVerticalElement, _classNameScrollbarAutoHidden);\n }\n else {\n var anyActive;\n var strActive = 'active';\n var hide = function () {\n if (!_scrollbarsHandleHovered && !_destroyed) {\n anyActive = _scrollbarHorizontalHandleElement.hasClass(strActive) || _scrollbarVerticalHandleElement.hasClass(strActive);\n if (!anyActive && (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove || _scrollbarsAutoHideLeave))\n addClass(_scrollbarHorizontalElement, _classNameScrollbarAutoHidden);\n if (!anyActive && (_scrollbarsAutoHideScroll || _scrollbarsAutoHideMove || _scrollbarsAutoHideLeave))\n addClass(_scrollbarVerticalElement, _classNameScrollbarAutoHidden);\n }\n };\n if (_scrollbarsAutoHideDelay > 0 && delayfree !== true)\n _scrollbarsAutoHideTimeoutId = setTimeout(hide, _scrollbarsAutoHideDelay);\n else\n hide();\n }\n }\n\n /**\n * Refreshes the handle length of the given scrollbar.\n * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed.\n */\n function refreshScrollbarHandleLength(isHorizontal) {\n var handleCSS = {};\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var digit = 1000000;\n //get and apply intended handle length\n var handleRatio = MATH.min(1, (_hostSizeCache[scrollbarVars._w_h] - (_paddingAbsoluteCache ? (isHorizontal ? _paddingX : _paddingY) : 0)) / _contentScrollSizeCache[scrollbarVars._w_h]);\n handleCSS[scrollbarVars._width_height] = (MATH.floor(handleRatio * 100 * digit) / digit) + '%'; //the last * digit / digit is for flooring to the 4th digit\n\n if (!nativeOverlayScrollbarsAreActive())\n scrollbarVars._handle.css(handleCSS);\n\n //measure the handle length to respect min & max length\n scrollbarVarsInfo._handleLength = scrollbarVars._handle[0]['offset' + scrollbarVars._Width_Height];\n scrollbarVarsInfo._handleLengthRatio = handleRatio;\n }\n\n /**\n * Refreshes the handle offset of the given scrollbar.\n * @param isHorizontal True if the horizontal scrollbar handle shall be refreshed, false if the vertical one shall be refreshed.\n * @param scrollOrTransition The scroll position of the given scrollbar axis to which the handle shall be moved or a boolean which indicates whether a transition shall be applied. If undefined or boolean if the current scroll-offset is taken. (if isHorizontal ? scrollLeft : scrollTop)\n */\n function refreshScrollbarHandleOffset(isHorizontal, scrollOrTransition) {\n var transition = type(scrollOrTransition) == TYPES.b;\n var transitionDuration = 250;\n var isRTLisHorizontal = _isRTL && isHorizontal;\n var scrollbarVars = getScrollbarVars(isHorizontal);\n var scrollbarVarsInfo = scrollbarVars._info;\n var strTranslateBrace = 'translate(';\n var strTransform = VENDORS._cssProperty('transform');\n var strTransition = VENDORS._cssProperty('transition');\n var nativeScroll = isHorizontal ? _viewportElement[_strScrollLeft]() : _viewportElement[_strScrollTop]();\n var currentScroll = scrollOrTransition === undefined || transition ? nativeScroll : scrollOrTransition;\n\n //measure the handle length to respect min & max length\n var handleLength = scrollbarVarsInfo._handleLength;\n var trackLength = scrollbarVars._track[0]['offset' + scrollbarVars._Width_Height];\n var handleTrackDiff = trackLength - handleLength;\n var handleCSS = {};\n var transformOffset;\n var translateValue;\n\n //DONT use the variable '_contentScrollSizeCache[scrollbarVars._w_h]' instead of '_viewportElement[0]['scroll' + scrollbarVars._Width_Height]'\n // because its a bit behind during the small delay when content size updates\n //(delay = mutationObserverContentLag, if its 0 then this var could be used)\n var maxScroll = (_viewportElementNative[_strScroll + scrollbarVars._Width_Height] - _viewportElementNative['client' + scrollbarVars._Width_Height]) * (_rtlScrollBehavior.n && isRTLisHorizontal ? -1 : 1); //* -1 if rtl scroll max is negative\n var getScrollRatio = function(base) {\n return isNaN(base / maxScroll) ? 0 : MATH.max(0, MATH.min(1, base / maxScroll));\n };\n var getHandleOffset = function(scrollRatio) {\n var offset = handleTrackDiff * scrollRatio;\n offset = isNaN(offset) ? 0 : offset;\n offset = (isRTLisHorizontal && !_rtlScrollBehavior.i) ? (trackLength - handleLength - offset) : offset;\n offset = MATH.max(0, offset);\n return offset;\n };\n var scrollRatio = getScrollRatio(nativeScroll);\n var unsnappedScrollRatio = getScrollRatio(currentScroll);\n var handleOffset = getHandleOffset(unsnappedScrollRatio);\n var snappedHandleOffset = getHandleOffset(scrollRatio);\n\n scrollbarVarsInfo._maxScroll = maxScroll;\n scrollbarVarsInfo._currentScroll = nativeScroll;\n scrollbarVarsInfo._currentScrollRatio = scrollRatio;\n\n if (_supportTransform) {\n transformOffset = isRTLisHorizontal ? -(trackLength - handleLength - handleOffset) : handleOffset; //in px\n //transformOffset = (transformOffset / trackLength * 100) * (trackLength / handleLength); //in %\n translateValue = isHorizontal ? strTranslateBrace + transformOffset + 'px, 0)' : strTranslateBrace + '0, ' + transformOffset + 'px)';\n\n handleCSS[strTransform] = translateValue;\n\n //apply or clear up transition\n if(_supportTransition)\n handleCSS[strTransition] = transition && MATH.abs(handleOffset - scrollbarVarsInfo._handleOffset) > 1 ? getCSSTransitionString(scrollbarVars._handle) + ', ' + (strTransform + _strSpace + transitionDuration + 'ms') : _strEmpty;\n }\n else\n handleCSS[scrollbarVars._left_top] = handleOffset;\n\n\n //only apply css if offset has changed and overflow exists.\n if (!nativeOverlayScrollbarsAreActive()) {\n scrollbarVars._handle.css(handleCSS);\n\n //clear up transition\n if(_supportTransform && _supportTransition && transition) {\n scrollbarVars._handle.one(_strTransitionEndEvent, function() {\n if(!_destroyed)\n scrollbarVars._handle.css(strTransition, _strEmpty);\n });\n }\n }\n\n scrollbarVarsInfo._handleOffset = handleOffset;\n scrollbarVarsInfo._snappedHandleOffset = snappedHandleOffset;\n scrollbarVarsInfo._trackLength = trackLength;\n }\n\n /**\n * Refreshes the interactivity of the given scrollbar element.\n * @param isTrack True if the track element is the target, false if the handle element is the target.\n * @param value True for interactivity false for no interactivity.\n */\n function refreshScrollbarsInteractive(isTrack, value) {\n var action = value ? 'removeClass' : 'addClass';\n var element1 = isTrack ? _scrollbarHorizontalTrackElement : _scrollbarHorizontalHandleElement;\n var element2 = isTrack ? _scrollbarVerticalTrackElement : _scrollbarVerticalHandleElement;\n var className = isTrack ? _classNameScrollbarTrackOff : _classNameScrollbarHandleOff;\n\n element1[action](className);\n element2[action](className);\n }\n\n /**\n * Returns a object which is used for fast access for specific variables.\n * @param isHorizontal True if the horizontal scrollbar vars shall be accessed, false if the vertical scrollbar vars shall be accessed.\n * @returns {{wh: string, WH: string, lt: string, _wh: string, _lt: string, t: *, h: *, c: {}, s: *}}\n */\n function getScrollbarVars(isHorizontal) {\n return {\n _width_height: isHorizontal ? _strWidth : _strHeight,\n _Width_Height: isHorizontal ? 'Width' : 'Height',\n _left_top: isHorizontal ? _strLeft : _strTop,\n _Left_Top: isHorizontal ? 'Left' : 'Top',\n _x_y: isHorizontal ? _strX : _strY,\n _X_Y: isHorizontal ? 'X' : 'Y',\n _w_h: isHorizontal ? 'w' : 'h',\n _l_t: isHorizontal ? 'l' : 't',\n _track: isHorizontal ? _scrollbarHorizontalTrackElement : _scrollbarVerticalTrackElement,\n _handle: isHorizontal ? _scrollbarHorizontalHandleElement : _scrollbarVerticalHandleElement,\n _scrollbar: isHorizontal ? _scrollbarHorizontalElement : _scrollbarVerticalElement,\n _info: isHorizontal ? _scrollHorizontalInfo : _scrollVerticalInfo\n };\n }\n\n\n //==== Scrollbar Corner ====//\n\n /**\n * Builds or destroys the scrollbar corner DOM element.\n * @param destroy Indicates whether the DOM shall be build or destroyed.\n */\n function setupScrollbarCornerDOM(destroy) {\n _scrollbarCornerElement = _scrollbarCornerElement || selectOrGenerateDivByClass(_classNameScrollbarCorner, true);\n \n if(!destroy) {\n if(!_domExists) {\n _hostElement.append(_scrollbarCornerElement);\n }\n }\n else {\n if(_domExists && _initialized) {\n removeClass(_scrollbarCornerElement.removeAttr(LEXICON.s), _classNamesDynamicDestroy);\n }\n else {\n remove(_scrollbarCornerElement);\n }\n }\n }\n\n /**\n * Initializes all scrollbar corner interactivity events.\n */\n function setupScrollbarCornerEvents() {\n var insideIFrame = _windowElementNative.top !== _windowElementNative;\n var mouseDownPosition = { };\n var mouseDownSize = { };\n var mouseDownInvertedScale = { };\n var reconnectMutationObserver;\n \n function documentDragMove(event) {\n if (onMouseTouchDownContinue(event)) {\n var pageOffset = getCoordinates(event);\n var hostElementCSS = { };\n if (_resizeHorizontal || _resizeBoth)\n hostElementCSS[_strWidth] = (mouseDownSize.w + (pageOffset.x - mouseDownPosition.x) * mouseDownInvertedScale.x);\n if (_resizeVertical || _resizeBoth)\n hostElementCSS[_strHeight] = (mouseDownSize.h + (pageOffset.y - mouseDownPosition.y) * mouseDownInvertedScale.y);\n _hostElement.css(hostElementCSS);\n COMPATIBILITY.stpP(event);\n }\n else {\n documentMouseTouchUp(event);\n }\n }\n function documentMouseTouchUp(event) {\n var eventIsTrusted = event !== undefined;\n\n setupResponsiveEventListener(_documentElement,\n [ _strSelectStartEvent, _strMouseTouchMoveEvent, _strMouseTouchUpEvent ],\n [ documentOnSelectStart, documentDragMove, documentMouseTouchUp ],\n true);\n\n removeClass(_bodyElement, _classNameDragging);\n if (_scrollbarCornerElement.releaseCapture)\n _scrollbarCornerElement.releaseCapture();\n\n if (eventIsTrusted) {\n if (reconnectMutationObserver)\n connectMutationObservers();\n _base.update(_strAuto);\n }\n reconnectMutationObserver = false;\n }\n function onMouseTouchDownContinue(event) {\n var originalEvent = event.originalEvent || event;\n var isTouchEvent = originalEvent.touches !== undefined;\n return _sleeping || _destroyed ? false : COMPATIBILITY.mBtn(event) === 1 || isTouchEvent;\n }\n function getCoordinates(event) {\n return _msieVersion && insideIFrame ? { x : event.screenX , y : event.screenY } : COMPATIBILITY.page(event);\n }\n \n addDestroyEventListener(_scrollbarCornerElement, _strMouseTouchDownEvent, function(event) {\n if (onMouseTouchDownContinue(event) && !_resizeNone) {\n if (_mutationObserversConnected) {\n reconnectMutationObserver = true;\n disconnectMutationObservers();\n }\n\n mouseDownPosition = getCoordinates(event);\n\n mouseDownSize.w = _hostElementNative[LEXICON.oW] - (!_isBorderBox ? _paddingX : 0);\n mouseDownSize.h = _hostElementNative[LEXICON.oH] - (!_isBorderBox ? _paddingY : 0);\n mouseDownInvertedScale = getHostElementInvertedScale();\n\n setupResponsiveEventListener(_documentElement,\n [ _strSelectStartEvent, _strMouseTouchMoveEvent, _strMouseTouchUpEvent ],\n [ documentOnSelectStart, documentDragMove, documentMouseTouchUp ]);\n\n addClass(_bodyElement, _classNameDragging);\n if (_scrollbarCornerElement.setCapture)\n _scrollbarCornerElement.setCapture();\n\n COMPATIBILITY.prvD(event);\n COMPATIBILITY.stpP(event);\n }\n });\n }\n\n\n //==== Utils ====//\n\n /**\n * Calls the callback with the given name. The Context of this callback is always _base (this).\n * @param name The name of the target which shall be called.\n * @param args The args with which the callback shall be called.\n */\n function dispatchCallback(name, args) {\n if(_initialized) {\n var callback = _currentPreparedOptions.callbacks[name];\n var extensionOnName = name;\n var ext;\n\n if(extensionOnName.substr(0, 2) === 'on')\n extensionOnName = extensionOnName.substr(2, 1).toLowerCase() + extensionOnName.substr(3);\n\n if(type(callback) == TYPES.f)\n callback.call(_base, args);\n\n each(_extensions, function() {\n ext = this;\n if(type(ext.on) == TYPES.f)\n ext.on(extensionOnName, args);\n });\n }\n else if(!_destroyed)\n _callbacksInitQeueue.push({ n : name, a : args });\n }\n\n /**\n * Sets the \"top, right, bottom, left\" properties, with a given prefix, of the given css object.\n * @param targetCSSObject The css object to which the values shall be applied.\n * @param prefix The prefix of the \"top, right, bottom, left\" css properties. (example: 'padding-' is a valid prefix)\n * @param values A array of values which shall be applied to the \"top, right, bottom, left\" -properties. The array order is [top, right, bottom, left].\n * If this argument is undefined the value '' (empty string) will be applied to all properties.\n */\n function setTopRightBottomLeft(targetCSSObject, prefix, values) {\n if (values === undefined)\n values = [_strEmpty, _strEmpty, _strEmpty, _strEmpty];\n\n targetCSSObject[prefix + _strTop] = values[0];\n targetCSSObject[prefix + _strRight] = values[1];\n targetCSSObject[prefix + _strBottom] = values[2];\n targetCSSObject[prefix + _strLeft] = values[3];\n }\n\n /**\n * Returns the computed CSS transition string from the given element.\n * @param element The element from which the transition string shall be returned.\n * @returns {string} The CSS transition string from the given element.\n */\n function getCSSTransitionString(element) {\n var transitionStr = VENDORS._cssProperty('transition');\n var assembledValue = element.css(transitionStr);\n if(assembledValue)\n return assembledValue;\n var regExpString = '\\\\s*(' + '([^,(]+(\\\\(.+?\\\\))?)+' + ')[\\\\s,]*';\n var regExpMain = new RegExp(regExpString);\n var regExpValidate = new RegExp('^(' + regExpString + ')+$');\n var properties = 'property duration timing-function delay'.split(' ');\n var result = [ ];\n var strResult;\n var valueArray;\n var i = 0;\n var j;\n var splitCssStyleByComma = function(str) {\n strResult = [ ];\n if (!str.match(regExpValidate))\n return str;\n while (str.match(regExpMain)) {\n strResult.push(RegExp.$1);\n str = str.replace(regExpMain, _strEmpty);\n }\n\n return strResult;\n };\n for (; i < properties[LEXICON.l]; i++) {\n valueArray = splitCssStyleByComma(element.css(transitionStr + '-' + properties[i]));\n for (j = 0; j < valueArray[LEXICON.l]; j++)\n result[j] = (result[j] ? result[j] + _strSpace : _strEmpty) + valueArray[j];\n }\n return result.join(', ');\n }\n\n /**\n * Calculates the host-elements inverted scale. (invertedScale = 1 / scale)\n * @returns {{x: number, y: number}} The scale of the host-element.\n */\n function getHostElementInvertedScale() {\n var rect = _paddingElementNative[LEXICON.bCR]();\n return {\n x : _supportTransform ? 1 / (MATH.round(rect.width) / _paddingElementNative[LEXICON.oW]) || 1 : 1,\n y : _supportTransform ? 1 / (MATH.round(rect.height) / _paddingElementNative[LEXICON.oH]) || 1 : 1\n };\n }\n\n /**\n * Checks whether the given object is a HTMLElement.\n * @param o The object which shall be checked.\n * @returns {boolean} True the given object is a HTMLElement, false otherwise.\n */\n function isHTMLElement(o) {\n var strOwnerDocument = 'ownerDocument';\n var strHTMLElement = 'HTMLElement';\n var wnd = o && o[strOwnerDocument] ? (o[strOwnerDocument].parentWindow || window) : window;\n return (\n typeof wnd[strHTMLElement] == TYPES.o ? o instanceof wnd[strHTMLElement] : //DOM2\n o && typeof o == TYPES.o && o !== null && o.nodeType === 1 && typeof o.nodeName == TYPES.s\n );\n }\n\n /**\n * Compares 2 arrays and returns the differences between them as a array.\n * @param a1 The first array which shall be compared.\n * @param a2 The second array which shall be compared.\n * @returns {Array} The differences between the two arrays.\n */\n function getArrayDifferences(a1, a2) {\n var a = [ ];\n var diff = [ ];\n var i;\n var k;\n for (i = 0; i < a1.length; i++)\n a[a1[i]] = true;\n for (i = 0; i < a2.length; i++) {\n if (a[a2[i]])\n delete a[a2[i]];\n else\n a[a2[i]] = true;\n }\n for (k in a)\n diff.push(k);\n return diff;\n }\n\n /**\n * Returns Zero or the number to which the value can be parsed.\n * @param value The value which shall be parsed.\n * @param toFloat Indicates whether the number shall be parsed to a float.\n */\n function parseToZeroOrNumber(value, toFloat) {\n var num = toFloat ? parseFloat(value) : parseInt(value, 10);\n return isNaN(num) ? 0 : num;\n }\n\n /**\n * Gets several information of the textarea and returns them as a object or undefined if the browser doesn't support it.\n * @returns {{cursorRow: Number, cursorCol, rows: Number, cols: number, wRow: number, pos: number, max : number}} or undefined if not supported.\n */\n function getTextareaInfo() {\n //read needed values\n var textareaCursorPosition = _targetElementNative.selectionStart;\n if (textareaCursorPosition === undefined)\n return;\n\n var textareaValue = _targetElement.val();\n var textareaLength = textareaValue[LEXICON.l];\n var textareaRowSplit = textareaValue.split('\\n');\n var textareaLastRow = textareaRowSplit[LEXICON.l];\n var textareaCurrentCursorRowSplit = textareaValue.substr(0, textareaCursorPosition).split('\\n');\n var widestRow = 0;\n var textareaLastCol = 0;\n var cursorRow = textareaCurrentCursorRowSplit[LEXICON.l];\n var cursorCol = textareaCurrentCursorRowSplit[textareaCurrentCursorRowSplit[LEXICON.l] - 1][LEXICON.l];\n var rowCols;\n var i;\n\n //get widest Row and the last column of the textarea\n for (i = 0; i < textareaRowSplit[LEXICON.l]; i++) {\n rowCols = textareaRowSplit[i][LEXICON.l];\n if (rowCols > textareaLastCol) {\n widestRow = i + 1;\n textareaLastCol = rowCols;\n }\n }\n\n return {\n _cursorRow: cursorRow, //cursorRow\n _cursorColumn: cursorCol, //cursorCol\n _rows: textareaLastRow, //rows\n _columns: textareaLastCol, //cols\n _widestRow: widestRow, //wRow\n _cursorPosition: textareaCursorPosition, //pos\n _cursorMax: textareaLength //max\n };\n }\n\n /**\n * Determines whether native overlay scrollbars are active.\n * @returns {boolean} True if native overlay scrollbars are active, false otherwise.\n */\n function nativeOverlayScrollbarsAreActive() {\n return (_ignoreOverlayScrollbarHidingCache && (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y));\n }\n\n /**\n * Gets the element which is used to measure the content size.\n * @returns {*} TextareaCover if target element is textarea else the ContentElement.\n */\n function getContentMeasureElement() {\n return _isTextarea ? _textareaCoverElement[0] : _contentElementNative;\n }\n\n /**\n * Generates a string which represents a HTML div with the given classes or attributes.\n * @param classesOrAttrs The class of the div as string or a object which represents the attributes of the div. (The class attribute can also be written as \"className\".)\n * @param content The content of the div as string.\n * @returns {string} The concated string which represents a HTML div and its content.\n */\n function generateDiv(classesOrAttrs, content) {\n return '<div ' + (classesOrAttrs ? type(classesOrAttrs) == TYPES.s ?\n 'class=\"' + classesOrAttrs + '\"' :\n (function() {\n var key;\n var attrs = _strEmpty;\n if(FRAMEWORK.isPlainObject(classesOrAttrs)) {\n for (key in classesOrAttrs)\n attrs += (key === 'c' ? 'class' : key) + '=\"' + classesOrAttrs[key] + '\" ';\n }\n return attrs;\n })() :\n _strEmpty) +\n '>' +\n (content || _strEmpty) +\n '</div>';\n }\n \n /**\n * Selects or generates a div with the given class attribute.\n * @param className The class names (divided by spaces) of the div which shall be selected or generated.\n * @param selectParentOrOnlyChildren The parent element from which of the element shall be selected. (if undefined or boolean its hostElement)\n * If its a boolean it decides whether only the children of the host element shall be selected.\n * @returns {*} The generated or selected element.\n */\n function selectOrGenerateDivByClass(className, selectParentOrOnlyChildren) {\n var onlyChildren = type(selectParentOrOnlyChildren) == TYPES.b;\n var selectParent = onlyChildren ? _hostElement : (selectParentOrOnlyChildren || _hostElement);\n \n return (_domExists && !selectParent[LEXICON.l]) \n ? null\n : _domExists \n ? selectParent[onlyChildren ? 'children' : 'find'](_strDot + className.replace(/\\s/g, _strDot)).eq(0)\n : FRAMEWORK(generateDiv(className))\n }\n \n /**\n * Gets the value of the given property from the given object.\n * @param obj The object from which the property value shall be got.\n * @param path The property of which the value shall be got.\n * @returns {*} Returns the value of the searched property or undefined of the property wasn't found.\n */\n function getObjectPropVal(obj, path) {\n var splits = path.split(_strDot);\n var i = 0;\n var val;\n for(; i < splits.length; i++) {\n if(!obj[LEXICON.hOP](splits[i]))\n return;\n val = obj[splits[i]];\n if(i < splits.length && type(val) == TYPES.o)\n obj = val;\n }\n return val;\n }\n\n /**\n * Sets the value of the given property from the given object.\n * @param obj The object from which the property value shall be set.\n * @param path The property of which the value shall be set.\n * @param val The value of the property which shall be set.\n */\n function setObjectPropVal(obj, path, val) {\n var splits = path.split(_strDot);\n var splitsLength = splits.length;\n var i = 0;\n var extendObj = { };\n var extendObjRoot = extendObj;\n for(; i < splitsLength; i++)\n extendObj = extendObj[splits[i]] = i + 1 < splitsLength ? { } : val;\n FRAMEWORK.extend(obj, extendObjRoot, true);\n }\n\n\n //==== Utils Cache ====//\n\n /**\n * Compares two values or objects and returns true if they aren't equal.\n * @param current The first value or object which shall be compared.\n * @param cache The second value or object which shall be compared.\n * @param force If true the returned value is always true.\n * @returns {boolean} True if both values or objects aren't equal or force is true, false otherwise.\n */\n function checkCache(current, cache, force) {\n if (force)\n return force;\n if(type(current) == TYPES.o && type(cache) == TYPES.o) {\n for (var prop in current) {\n if(prop !== 'c') {\n if (current[LEXICON.hOP](prop) && cache[LEXICON.hOP](prop)) {\n if(checkCache(current[prop], cache[prop]))\n return true;\n }\n else {\n return true;\n }\n }\n }\n }\n else {\n return current !== cache;\n }\n return false;\n }\n\n\n //==== Shortcuts ====//\n\n /**\n * jQuery extend method shortcut with a appended \"true\" as first argument.\n */\n function extendDeep() {\n return FRAMEWORK.extend.apply(this, [ true ].concat([].slice.call(arguments)));\n }\n\n /**\n * jQuery addClass method shortcut.\n */\n function addClass(el, classes) {\n return _frameworkProto.addClass.call(el, classes);\n }\n\n /**\n * jQuery removeClass method shortcut.\n */\n function removeClass(el, classes) {\n return _frameworkProto.removeClass.call(el, classes);\n }\n\n /**\n * jQuery remove method shortcut.\n */\n function remove(el) {\n return _frameworkProto.remove.call(el);\n }\n\n /**\n * Finds the first child element with the given selector of the given element.\n * @param el The root element from which the selector shall be valid.\n * @param selector The selector of the searched element.\n * @returns {*} The first element which is a child of the given element and matches the givens selector.\n */\n function findFirst(el, selector) {\n return _frameworkProto.find.call(el, selector).eq(0);\n }\n\n\n //==== API ====//\n\n /**\n * Puts the instance to sleep. It wont respond to any changes in the DOM and won't update. Scrollbar Interactivity is also disabled as well as the resize handle.\n * This behavior can be reset by calling the update method.\n */\n _base.sleep = function () {\n _sleeping = true;\n };\n\n /**\n * Updates the plugin and DOM to the current options.\n * This method should only be called if a update is 100% required.\n * @param force True if every property shall be updated and the cache shall be ignored.\n * !INTERNAL USAGE! : force can be a string \"auto\", \"sync\" or \"zoom\" too\n * if \"auto\" then before a real update the content size and host element attributes gets checked, and if they changed only then the update method will be called.\n * if \"sync\" then the async update process (MutationObserver or UpdateLoop) gets synchronized and a corresponding update takes place if one was needed due to pending changes.\n * if \"zoom\" then a update takes place where it's assumed that content and host size changed\n * @returns {boolean|undefined} \n * If force is \"sync\" then a boolean is returned which indicates whether a update was needed due to pending changes.\n * If force is \"auto\" then a boolean is returned whether a update was needed due to attribute or size changes.\n * undefined otherwise.\n */\n _base.update = function (force) {\n if(_destroyed)\n return;\n \n var attrsChanged;\n var contentSizeC;\n var isString = type(force) == TYPES.s;\n var imgElementSelector = 'img';\n var imgElementLoadEvent = 'load';\n var doUpdateAuto;\n var mutHost;\n var mutContent;\n \n if(isString) {\n if (force === _strAuto) {\n attrsChanged = meaningfulAttrsChanged();\n contentSizeC = updateAutoContentSizeChanged();\n doUpdateAuto = attrsChanged || contentSizeC;\n if (doUpdateAuto) {\n update({\n _contentSizeChanged : contentSizeC,\n _changedOptions : _initialized ? undefined : _currentPreparedOptions\n });\n }\n }\n else if (force === _strSync) {\n if(_mutationObserversConnected) {\n mutHost = _mutationObserverHostCallback(_mutationObserverHost.takeRecords());\n mutContent = _mutationObserverContentCallback(_mutationObserverContent.takeRecords());\n }\n else {\n mutHost = _base.update(_strAuto);\n }\n }\n else if (force === 'zoom') {\n update({\n _hostSizeChanged : true,\n _contentSizeChanged : true\n });\n }\n }\n else {\n force = _sleeping || force;\n _sleeping = false;\n if(!_base.update(_strSync) || force)\n update({ _force : force });\n }\n if(!_isTextarea) {\n _contentElement.find(imgElementSelector).each(function(i, el) {\n var index = COMPATIBILITY.inA(el, _imgs);\n if (index === -1)\n FRAMEWORK(el).off(imgElementLoadEvent, imgOnLoad).on(imgElementLoadEvent, imgOnLoad);\n });\n }\n return doUpdateAuto || mutHost || mutContent;\n };\n\n /**\n Gets or sets the current options. The update method will be called automatically if new options were set.\n * @param newOptions If new options are given, then the new options will be set, if new options aren't given (undefined or a not a plain object) then the current options will be returned.\n * @param value If new options is a property path string, then this value will be used to set the option to which the property path string leads.\n * @returns {*}\n */\n _base.options = function (newOptions, value) {\n var option = { };\n var changedOps;\n \n //return current options if newOptions are undefined or empty\n if (FRAMEWORK.isEmptyObject(newOptions) || !FRAMEWORK.isPlainObject(newOptions)) {\n if (type(newOptions) == TYPES.s) {\n if (arguments.length > 1) {\n setObjectPropVal(option, newOptions, value);\n changedOps = setOptions(option);\n }\n else\n return getObjectPropVal(_currentOptions, newOptions);\n }\n else\n return _currentOptions;\n }\n else {\n changedOps = setOptions(newOptions);\n }\n \n if(!FRAMEWORK.isEmptyObject(changedOps)) {\n update({ _changedOptions : changedOps });\n } \n };\n\n /**\n * Restore the DOM, disconnects all observers, remove all resize observers and put the instance to sleep.\n */\n _base.destroy = function () {\n if(_destroyed)\n return;\n \n //remove this instance from auto update loop\n autoUpdateLoop.remove(_base);\n\n //disconnect all mutation observers\n disconnectMutationObservers();\n\n //remove all resize observers\n setupResizeObserver(_sizeObserverElement);\n setupResizeObserver(_sizeAutoObserverElement);\n\n //remove all extensions\n for(var extName in _extensions)\n _base.removeExt(extName);\n\n //remove all 'destroy' events\n while(_destroyEvents[LEXICON.l] > 0)\n _destroyEvents.pop()();\n\n //remove all events from host element\n setupHostMouseTouchEvents(true);\n\n //remove all helper / detection elements\n if (_contentGlueElement)\n remove(_contentGlueElement);\n if (_contentArrangeElement)\n remove(_contentArrangeElement);\n if (_sizeAutoObserverAdded)\n remove(_sizeAutoObserverElement);\n\n //remove all generated DOM\n setupScrollbarsDOM(true);\n setupScrollbarCornerDOM(true);\n setupStructureDOM(true);\n\n //remove all generated image load events\n for(var i = 0; i < _imgs[LEXICON.l]; i++)\n FRAMEWORK(_imgs[i]).off('load', imgOnLoad);\n _imgs = undefined;\n\n _destroyed = true;\n _sleeping = true;\n\n //remove this instance from the instances list\n INSTANCES(pluginTargetElement, 0);\n dispatchCallback('onDestroyed');\n\n //remove all properties and methods\n //for (var property in _base)\n // delete _base[property];\n //_base = undefined;\n };\n\n /**\n * Scrolls to a given position or element.\n * @param coordinates\n * 1. Can be \"coordinates\" which looks like:\n * { x : ?, y : ? } OR Object with x and y properties\n * { left : ?, top : ? } OR Object with left and top properties\n * { l : ?, t : ? } OR Object with l and t properties\n * [ ?, ? ] OR Array where the first two element are the coordinates (first is x, second is y)\n * ? A single value which stays for both axis\n * A value can be a number, a string or a calculation.\n *\n * Operators:\n * [NONE] The current scroll will be overwritten by the value.\n * '+=' The value will be added to the current scroll offset\n * '-=' The value will be subtracted from the current scroll offset\n * '*=' The current scroll wil be multiplicated by the value.\n * '/=' The current scroll wil be divided by the value.\n *\n * Units:\n * [NONE] The value is the final scroll amount. final = (value * 1)\n * 'px' Same as none\n * '%' The value is dependent on the current scroll value. final = ((currentScrollValue / 100) * value)\n * 'vw' The value is multiplicated by the viewport width. final = (value * viewportWidth)\n * 'vh' The value is multiplicated by the viewport height. final = (value * viewportHeight)\n *\n * example final values:\n * 200, '200px', '50%', '1vw', '1vh', '+=200', '/=1vw', '*=2px', '-=5vh', '+=33%', '+= 50% - 2px', '-= 1vw - 50%'\n *\n * 2. Can be a HTML or jQuery element:\n * The final scroll offset is the offset (without margin) of the given HTML / jQuery element.\n *\n * 3. Can be a object with a HTML or jQuery element with additional settings:\n * {\n * el : [HTMLElement, jQuery element], MUST be specified, else this object isn't valid.\n * scroll : [string, array, object], Default value is 'always'.\n * block : [string, array, object], Default value is 'begin'.\n * margin : [number, boolean, array, object] Default value is false.\n * }\n *\n * Possible scroll settings are:\n * 'always' Scrolls always.\n * 'ifneeded' Scrolls only if the element isnt fully in view.\n * 'never' Scrolls never.\n *\n * Possible block settings are:\n * 'begin' Both axis shall be docked to the \"begin\" edge. - The element will be docked to the top and left edge of the viewport.\n * 'end' Both axis shall be docked to the \"end\" edge. - The element will be docked to the bottom and right edge of the viewport. (If direction is RTL to the bottom and left edge.)\n * 'center' Both axis shall be docked to \"center\". - The element will be centered in the viewport.\n * 'nearest' The element will be docked to the nearest edge(s).\n *\n * Possible margin settings are: -- The actual margin of the element wont be affect, this option affects only the final scroll offset.\n * [BOOLEAN] If true the css margin of the element will be used, if false no margin will be used.\n * [NUMBER] The margin will be used for all edges.\n *\n * @param duration The duration of the scroll animation, OR a jQuery animation configuration object.\n * @param easing The animation easing.\n * @param complete The animation complete callback.\n * @returns {{\n * position: {x: number, y: number},\n * ratio: {x: number, y: number},\n * max: {x: number, y: number},\n * handleOffset: {x: number, y: number},\n * handleLength: {x: number, y: number},\n * handleLengthRatio: {x: number, y: number}, t\n * rackLength: {x: number, y: number},\n * isRTL: boolean,\n * isRTLNormalized: boolean\n * }}\n */\n _base.scroll = function (coordinates, duration, easing, complete) {\n if (arguments.length === 0 || coordinates === undefined) {\n var infoX = _scrollHorizontalInfo;\n var infoY = _scrollVerticalInfo;\n var normalizeInvert = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.i;\n var normalizeNegate = _normalizeRTLCache && _isRTL && _rtlScrollBehavior.n;\n var scrollX = infoX._currentScroll;\n var scrollXRatio = infoX._currentScrollRatio;\n var maxScrollX = infoX._maxScroll;\n scrollXRatio = normalizeInvert ? 1 - scrollXRatio : scrollXRatio;\n scrollX = normalizeInvert ? maxScrollX - scrollX : scrollX;\n scrollX *= normalizeNegate ? -1 : 1;\n maxScrollX *= normalizeNegate ? -1 : 1;\n\n return {\n position : {\n x : scrollX,\n y : infoY._currentScroll\n },\n ratio : {\n x : scrollXRatio,\n y : infoY._currentScrollRatio\n },\n max : {\n x : maxScrollX,\n y : infoY._maxScroll\n },\n handleOffset : {\n x : infoX._handleOffset,\n y : infoY._handleOffset\n },\n handleLength : {\n x : infoX._handleLength,\n y : infoY._handleLength\n },\n handleLengthRatio : {\n x : infoX._handleLengthRatio,\n y : infoY._handleLengthRatio\n },\n trackLength : {\n x : infoX._trackLength,\n y : infoY._trackLength\n },\n snappedHandleOffset : {\n x : infoX._snappedHandleOffset,\n y : infoY._snappedHandleOffset\n },\n isRTL: _isRTL,\n isRTLNormalized: _normalizeRTLCache\n };\n }\n \n _base.update(_strSync);\n \n var normalizeRTL = _normalizeRTLCache;\n var coordinatesXAxisProps = [_strX, _strLeft, 'l'];\n var coordinatesYAxisProps = [_strY, _strTop, 't'];\n var coordinatesOperators = ['+=', '-=', '*=', '/='];\n var durationIsObject = type(duration) == TYPES.o;\n var completeCallback = durationIsObject ? duration.complete : complete;\n var i;\n var finalScroll = { };\n var specialEasing = {};\n var doScrollLeft;\n var doScrollTop;\n var animationOptions;\n var strEnd = 'end';\n var strBegin = 'begin';\n var strCenter = 'center';\n var strNearest = 'nearest';\n var strAlways = 'always';\n var strNever = 'never';\n var strIfNeeded = 'ifneeded';\n var strLength = LEXICON.l;\n var settingsAxis;\n var settingsScroll;\n var settingsBlock;\n var settingsMargin;\n var finalElement;\n var elementObjSettingsAxisValues = [_strX, _strY, 'xy', 'yx'];\n var elementObjSettingsBlockValues = [strBegin, strEnd, strCenter, strNearest];\n var elementObjSettingsScrollValues = [strAlways, strNever, strIfNeeded];\n var coordinatesIsElementObj = coordinates[LEXICON.hOP]('el');\n var possibleElement = coordinatesIsElementObj ? coordinates.el : coordinates;\n var possibleElementIsJQuery = possibleElement instanceof FRAMEWORK || JQUERY ? possibleElement instanceof JQUERY : false;\n var possibleElementIsHTMLElement = possibleElementIsJQuery ? false : isHTMLElement(possibleElement);\n var proxyCompleteCallback = type(completeCallback) != TYPES.f ? undefined : function() {\n if(doScrollLeft)\n refreshScrollbarHandleOffset(true);\n if(doScrollTop)\n refreshScrollbarHandleOffset(false);\n completeCallback();\n };\n function checkSettingsStringValue(currValue, allowedValues) {\n for (i = 0; i < allowedValues[strLength]; i++) {\n if (currValue === allowedValues[i])\n return true;\n }\n return false;\n }\n function getRawScroll(isX, coordinates) {\n var coordinateProps = isX ? coordinatesXAxisProps : coordinatesYAxisProps;\n coordinates = type(coordinates) == TYPES.s || type(coordinates) == TYPES.n ? [ coordinates, coordinates ] : coordinates;\n\n if (type(coordinates) == TYPES.a)\n return isX ? coordinates[0] : coordinates[1];\n else if (type(coordinates) == TYPES.o) {\n //decides RTL normalization \"hack\" with .n\n //normalizeRTL = type(coordinates.n) == TYPES.b ? coordinates.n : normalizeRTL; \n for (i = 0; i < coordinateProps[strLength]; i++)\n if (coordinateProps[i] in coordinates)\n return coordinates[coordinateProps[i]];\n }\n }\n function getFinalScroll(isX, rawScroll) {\n var isString = type(rawScroll) == TYPES.s;\n var operator;\n var amount;\n var scrollInfo = isX ? _scrollHorizontalInfo : _scrollVerticalInfo;\n var currScroll = scrollInfo._currentScroll;\n var maxScroll = scrollInfo._maxScroll;\n var mult = ' * ';\n var finalValue;\n var isRTLisX = _isRTL && isX;\n var normalizeShortcuts = isRTLisX && _rtlScrollBehavior.n && !normalizeRTL;\n var strReplace = 'replace';\n var evalFunc = eval;\n var possibleOperator;\n if (isString) {\n //check operator\n if (rawScroll[strLength] > 2) {\n possibleOperator = rawScroll.substr(0, 2);\n if(inArray(possibleOperator, coordinatesOperators) > -1)\n operator = possibleOperator;\n }\n\n //calculate units and shortcuts\n rawScroll = operator ? rawScroll.substr(2) : rawScroll;\n rawScroll = rawScroll\n [strReplace](/min/g, 0) //'min' = 0%\n [strReplace](/</g, 0) //'<' = 0%\n [strReplace](/max/g, (normalizeShortcuts ? '-' : _strEmpty) + _strHundredPercent) //'max' = 100%\n [strReplace](/>/g, (normalizeShortcuts ? '-' : _strEmpty) + _strHundredPercent) //'>' = 100%\n [strReplace](/px/g, _strEmpty)\n [strReplace](/%/g, mult + (maxScroll * (isRTLisX && _rtlScrollBehavior.n ? -1 : 1) / 100.0))\n [strReplace](/vw/g, mult + _viewportSize.w)\n [strReplace](/vh/g, mult + _viewportSize.h);\n amount = parseToZeroOrNumber(isNaN(rawScroll) ? parseToZeroOrNumber(evalFunc(rawScroll), true).toFixed() : rawScroll);\n }\n else {\n amount = rawScroll;\n }\n\n if (amount !== undefined && !isNaN(amount) && type(amount) == TYPES.n) {\n var normalizeIsRTLisX = normalizeRTL && isRTLisX;\n var operatorCurrScroll = currScroll * (normalizeIsRTLisX && _rtlScrollBehavior.n ? -1 : 1);\n var invert = normalizeIsRTLisX && _rtlScrollBehavior.i;\n var negate = normalizeIsRTLisX && _rtlScrollBehavior.n;\n operatorCurrScroll = invert ? (maxScroll - operatorCurrScroll) : operatorCurrScroll;\n switch (operator) {\n case '+=':\n finalValue = operatorCurrScroll + amount;\n break;\n case '-=':\n finalValue = operatorCurrScroll - amount;\n break;\n case '*=':\n finalValue = operatorCurrScroll * amount;\n break;\n case '/=':\n finalValue = operatorCurrScroll / amount;\n break;\n default:\n finalValue = amount;\n break;\n }\n finalValue = invert ? maxScroll - finalValue : finalValue;\n finalValue *= negate ? -1 : 1;\n finalValue = isRTLisX && _rtlScrollBehavior.n ? MATH.min(0, MATH.max(maxScroll, finalValue)) : MATH.max(0, MATH.min(maxScroll, finalValue));\n }\n return finalValue === currScroll ? undefined : finalValue;\n }\n function getPerAxisValue(value, valueInternalType, defaultValue, allowedValues) {\n var resultDefault = [ defaultValue, defaultValue ];\n var valueType = type(value);\n var valueArrLength;\n var valueArrItem;\n\n //value can be [ string, or array of two strings ]\n if (valueType == valueInternalType) {\n value = [value, value];\n }\n else if (valueType == TYPES.a) {\n valueArrLength = value[strLength];\n if (valueArrLength > 2 || valueArrLength < 1)\n value = resultDefault;\n else {\n if (valueArrLength === 1)\n value[1] = defaultValue;\n for (i = 0; i < valueArrLength; i++) {\n valueArrItem = value[i];\n if (type(valueArrItem) != valueInternalType || !checkSettingsStringValue(valueArrItem, allowedValues)) {\n value = resultDefault;\n break;\n }\n }\n }\n }\n else if (valueType == TYPES.o)\n value = [ value[_strX]|| defaultValue, value[_strY] || defaultValue];\n else\n value = resultDefault;\n return { x : value[0], y : value[1] };\n }\n function generateMargin(marginTopRightBottomLeftArray) {\n var result = [ ];\n var currValue;\n var currValueType;\n var valueDirections = [ _strTop, _strRight, _strBottom, _strLeft ];\n for(i = 0; i < marginTopRightBottomLeftArray[strLength]; i++) {\n if(i === valueDirections[strLength])\n break;\n currValue = marginTopRightBottomLeftArray[i];\n currValueType = type(currValue);\n if(currValueType == TYPES.b)\n result.push(currValue ? parseToZeroOrNumber(finalElement.css(_strMarginMinus + valueDirections[i])) : 0);\n else\n result.push(currValueType == TYPES.n ? currValue : 0);\n }\n return result;\n }\n\n if (possibleElementIsJQuery || possibleElementIsHTMLElement) {\n //get settings\n var margin = coordinatesIsElementObj ? coordinates.margin : 0;\n var axis = coordinatesIsElementObj ? coordinates.axis : 0;\n var scroll = coordinatesIsElementObj ? coordinates.scroll : 0;\n var block = coordinatesIsElementObj ? coordinates.block : 0;\n var marginDefault = [ 0, 0, 0, 0 ];\n var marginType = type(margin);\n var marginLength;\n finalElement = possibleElementIsJQuery ? possibleElement : FRAMEWORK(possibleElement);\n \n if (finalElement[strLength] > 0) {\n //margin can be [ boolean, number, array of 2, array of 4, object ]\n if (marginType == TYPES.n || marginType == TYPES.b)\n margin = generateMargin([margin, margin, margin, margin]);\n else if (marginType == TYPES.a) {\n marginLength = margin[strLength];\n if(marginLength === 2)\n margin = generateMargin([margin[0], margin[1], margin[0], margin[1]]);\n else if(marginLength >= 4)\n margin = generateMargin(margin);\n else\n margin = marginDefault;\n }\n else if (marginType == TYPES.o)\n margin = generateMargin([margin[_strTop], margin[_strRight], margin[_strBottom], margin[_strLeft]]);\n else\n margin = marginDefault;\n\n //block = type(block) === TYPES.b ? block ? [ strNearest, strBegin ] : [ strNearest, strEnd ] : block;\n settingsAxis = checkSettingsStringValue(axis, elementObjSettingsAxisValues) ? axis : 'xy';\n settingsScroll = getPerAxisValue(scroll, TYPES.s, strAlways, elementObjSettingsScrollValues);\n settingsBlock = getPerAxisValue(block, TYPES.s, strBegin, elementObjSettingsBlockValues);\n settingsMargin = margin;\n\n var viewportScroll = {\n l: _scrollHorizontalInfo._currentScroll,\n t: _scrollVerticalInfo._currentScroll\n };\n // use padding element instead of viewport element because padding element has never padding, margin or position applied.\n var viewportOffset = _paddingElement.offset();\n\n //get coordinates\n var elementOffset = finalElement.offset();\n var doNotScroll = {\n x : settingsScroll.x == strNever || settingsAxis == _strY,\n y : settingsScroll.y == strNever || settingsAxis == _strX\n };\n elementOffset[_strTop] -= settingsMargin[0];\n elementOffset[_strLeft] -= settingsMargin[3];\n var elementScrollCoordinates = {\n x: MATH.round(elementOffset[_strLeft] - viewportOffset[_strLeft] + viewportScroll.l),\n y: MATH.round(elementOffset[_strTop] - viewportOffset[_strTop] + viewportScroll.t)\n };\n if (_isRTL) {\n if (!_rtlScrollBehavior.n && !_rtlScrollBehavior.i)\n elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + viewportScroll.l);\n if (_rtlScrollBehavior.n && normalizeRTL)\n elementScrollCoordinates.x *= -1;\n if (_rtlScrollBehavior.i && normalizeRTL)\n elementScrollCoordinates.x = MATH.round(viewportOffset[_strLeft] - elementOffset[_strLeft] + (_scrollHorizontalInfo._maxScroll - viewportScroll.l));\n }\n\n //measuring is required\n if (settingsBlock.x != strBegin || settingsBlock.y != strBegin || settingsScroll.x == strIfNeeded || settingsScroll.y == strIfNeeded || _isRTL) {\n var measuringElm = finalElement[0];\n var rawElementSize = _supportTransform ? measuringElm[LEXICON.bCR]() : {\n width : measuringElm[LEXICON.oW],\n height : measuringElm[LEXICON.oH]\n };\n var elementSize = {\n w: rawElementSize[_strWidth] + settingsMargin[3] + settingsMargin[1],\n h: rawElementSize[_strHeight] + settingsMargin[0] + settingsMargin[2]\n };\n var finalizeBlock = function(isX) {\n var vars = getScrollbarVars(isX);\n var wh = vars._w_h;\n var lt = vars._left_top;\n var xy = vars._x_y;\n var blockIsEnd = settingsBlock[xy] == (isX ? _isRTL ? strBegin : strEnd : strEnd);\n var blockIsCenter = settingsBlock[xy] == strCenter;\n var blockIsNearest = settingsBlock[xy] == strNearest;\n var scrollNever = settingsScroll[xy] == strNever;\n var scrollIfNeeded = settingsScroll[xy] == strIfNeeded;\n var vpSize = _viewportSize[wh];\n var vpOffset = viewportOffset[lt];\n var elSize = elementSize[wh];\n var elOffset = elementOffset[lt];\n var divide = blockIsCenter ? 2 : 1;\n var elementCenterOffset = elOffset + (elSize / 2);\n var viewportCenterOffset = vpOffset + (vpSize / 2);\n var isInView =\n elSize <= vpSize\n && elOffset >= vpOffset\n && elOffset + elSize <= vpOffset + vpSize;\n\n if(scrollNever)\n doNotScroll[xy] = true;\n else if(!doNotScroll[xy]) {\n if (blockIsNearest || scrollIfNeeded) {\n doNotScroll[xy] = scrollIfNeeded ? isInView : false;\n blockIsEnd = elSize < vpSize ? elementCenterOffset > viewportCenterOffset : elementCenterOffset < viewportCenterOffset;\n }\n elementScrollCoordinates[xy] -= blockIsEnd || blockIsCenter ? ((vpSize / divide) - (elSize / divide)) * (isX && _isRTL && normalizeRTL ? -1 : 1) : 0;\n }\n };\n finalizeBlock(true);\n finalizeBlock(false);\n }\n\n if (doNotScroll.y)\n delete elementScrollCoordinates.y;\n if (doNotScroll.x)\n delete elementScrollCoordinates.x;\n\n coordinates = elementScrollCoordinates;\n }\n }\n\n finalScroll[_strScrollLeft] = getFinalScroll(true, getRawScroll(true, coordinates));\n finalScroll[_strScrollTop] = getFinalScroll(false, getRawScroll(false, coordinates));\n doScrollLeft = finalScroll[_strScrollLeft] !== undefined;\n doScrollTop = finalScroll[_strScrollTop] !== undefined;\n\n if ((doScrollLeft || doScrollTop) && (duration > 0 || durationIsObject)) {\n if (durationIsObject) {\n duration.complete = proxyCompleteCallback;\n _viewportElement.animate(finalScroll, duration);\n }\n else {\n animationOptions = {\n duration: duration,\n complete: proxyCompleteCallback\n };\n if (type(easing) == TYPES.a || FRAMEWORK.isPlainObject(easing)) {\n specialEasing[_strScrollLeft] = easing[0] || easing.x;\n specialEasing[_strScrollTop] = easing[1] || easing.y;\n animationOptions.specialEasing = specialEasing;\n }\n else {\n animationOptions.easing = easing;\n }\n _viewportElement.animate(finalScroll, animationOptions);\n }\n }\n else {\n if (doScrollLeft)\n _viewportElement[_strScrollLeft](finalScroll[_strScrollLeft]);\n if (doScrollTop)\n _viewportElement[_strScrollTop](finalScroll[_strScrollTop]);\n }\n };\n\n /**\n * Stops all scroll animations.\n * @returns {*} The current OverlayScrollbars instance (for chaining).\n */\n _base.scrollStop = function (param1, param2, param3) {\n _viewportElement.stop(param1, param2, param3);\n return _base;\n };\n\n /**\n * Returns all relevant elements.\n * @param elementName The name of the element which shall be returned.\n * @returns {{target: *, host: *, padding: *, viewport: *, content: *, scrollbarHorizontal: {scrollbar: *, track: *, handle: *}, scrollbarVertical: {scrollbar: *, track: *, handle: *}, scrollbarCorner: *} | *}\n */\n _base.getElements = function (elementName) {\n var obj = {\n target: _targetElementNative,\n host: _hostElementNative,\n padding: _paddingElementNative,\n viewport: _viewportElementNative,\n content: _contentElementNative,\n scrollbarHorizontal: {\n scrollbar: _scrollbarHorizontalElement[0],\n track: _scrollbarHorizontalTrackElement[0],\n handle: _scrollbarHorizontalHandleElement[0]\n },\n scrollbarVertical: {\n scrollbar: _scrollbarVerticalElement[0],\n track: _scrollbarVerticalTrackElement[0],\n handle: _scrollbarVerticalHandleElement[0]\n },\n scrollbarCorner: _scrollbarCornerElement[0]\n };\n return type(elementName) == TYPES.s ? getObjectPropVal(obj, elementName) : obj;\n };\n\n /**\n * Returns a object which describes the current state of this instance.\n * @param stateProperty A specific property from the state object which shall be returned.\n * @returns {{widthAuto, heightAuto, overflowAmount, hideOverflow, hasOverflow, contentScrollSize, viewportSize, hostSize, autoUpdate} | *}\n */\n _base.getState = function (stateProperty) {\n function prepare(obj) {\n if (!FRAMEWORK.isPlainObject(obj))\n return obj;\n var extended = extendDeep({}, obj);\n var changePropertyName = function (from, to) {\n if (extended[LEXICON.hOP](from)) {\n extended[to] = extended[from];\n delete extended[from];\n }\n };\n changePropertyName('w', _strWidth); //change w to width\n changePropertyName('h', _strHeight); //change h to height\n delete extended.c; //delete c (the 'changed' prop)\n return extended;\n };\n var obj = {\n destroyed: !!prepare(_destroyed),\n sleeping: !!prepare(_sleeping),\n autoUpdate: prepare(!_mutationObserversConnected),\n widthAuto: prepare(_widthAutoCache),\n heightAuto: prepare(_heightAutoCache),\n padding: prepare(_cssPaddingCache),\n overflowAmount: prepare(_overflowAmountCache),\n hideOverflow: prepare(_hideOverflowCache),\n hasOverflow: prepare(_hasOverflowCache),\n contentScrollSize: prepare(_contentScrollSizeCache),\n viewportSize: prepare(_viewportSize),\n hostSize: prepare(_hostSizeCache),\n documentMixed : prepare(_documentMixed)\n };\n return type(stateProperty) == TYPES.s ? getObjectPropVal(obj, stateProperty) : obj;\n };\n\n /**\n * Gets all or specific extension instance.\n * @param extName The name of the extension from which the instance shall be got.\n * @returns {{}} The instance of the extension with the given name or undefined if the instance couldn't be found.\n */\n _base.ext = function(extName) {\n var result;\n var privateMethods = _extensionsPrivateMethods.split(' ');\n var i = 0;\n if(type(extName) == TYPES.s) {\n if(_extensions[LEXICON.hOP](extName)) {\n result = extendDeep({}, _extensions[extName]);\n for (; i < privateMethods.length; i++)\n delete result[privateMethods[i]];\n }\n }\n else {\n result = { };\n for(i in _extensions)\n result[i] = extendDeep({ }, _base.ext(i));\n }\n return result;\n };\n\n /**\n * Adds a extension to this instance.\n * @param extName The name of the extension which shall be added.\n * @param extensionOptions The extension options which shall be used.\n * @returns {{}} The instance of the added extension or undefined if the extension couldn't be added properly.\n */\n _base.addExt = function(extName, extensionOptions) {\n var registeredExtensionObj = _plugin.extension(extName);\n var instance;\n var instanceAdded;\n var instanceContract;\n var contractResult;\n var contractFulfilled = true;\n if(registeredExtensionObj) {\n if(!_extensions[LEXICON.hOP](extName)) {\n instance = registeredExtensionObj.extensionFactory.call(_base,\n extendDeep({ }, registeredExtensionObj.defaultOptions),\n FRAMEWORK,\n COMPATIBILITY);\n\n if (instance) {\n instanceContract = instance.contract;\n if (type(instanceContract) == TYPES.f) {\n contractResult = instanceContract(window);\n contractFulfilled = type(contractResult) == TYPES.b ? contractResult : contractFulfilled;\n }\n if(contractFulfilled) {\n _extensions[extName] = instance;\n instanceAdded = instance.added;\n if(type(instanceAdded) == TYPES.f)\n instanceAdded(extensionOptions);\n\n return _base.ext(extName);\n }\n }\n }\n else\n return _base.ext(extName);\n }\n else\n console.warn(\"A extension with the name \\\"\" + extName + \"\\\" isn't registered.\");\n };\n\n /**\n * Removes a extension from this instance.\n * @param extName The name of the extension which shall be removed.\n * @returns {boolean} True if the extension was removed, false otherwise e.g. if the extension wasn't added before.\n */\n _base.removeExt = function(extName) {\n var instance = _extensions[extName];\n var instanceRemoved;\n if(instance) {\n delete _extensions[extName];\n\n instanceRemoved = instance.removed;\n if(type(instanceRemoved) == TYPES.f)\n instanceRemoved();\n\n return true;\n }\n return false;\n };\n\n /**\n * Constructs the plugin.\n * @param targetElement The element to which the plugin shall be applied.\n * @param options The initial options of the plugin.\n * @param extensions The extension(s) which shall be added right after the initialization.\n * @returns {boolean} True if the plugin was successfully initialized, false otherwise.\n */\n function construct(targetElement, options, extensions) {\n _defaultOptions = globals.defaultOptions;\n _nativeScrollbarStyling = globals.nativeScrollbarStyling;\n _nativeScrollbarSize = extendDeep({}, globals.nativeScrollbarSize);\n _nativeScrollbarIsOverlaid = extendDeep({}, globals.nativeScrollbarIsOverlaid);\n _overlayScrollbarDummySize = extendDeep({}, globals.overlayScrollbarDummySize);\n _rtlScrollBehavior = extendDeep({}, globals.rtlScrollBehavior);\n\n //parse & set options but don't update\n setOptions(extendDeep({ }, _defaultOptions, options));\n\n _cssCalc = globals.cssCalc;\n _msieVersion = globals.msie;\n _autoUpdateRecommended = globals.autoUpdateRecommended;\n _supportTransition = globals.supportTransition;\n _supportTransform = globals.supportTransform;\n _supportPassiveEvents = globals.supportPassiveEvents;\n _supportResizeObserver = globals.supportResizeObserver;\n _supportMutationObserver = globals.supportMutationObserver;\n _restrictedMeasuring = globals.restrictedMeasuring;\n _documentElement = FRAMEWORK(targetElement.ownerDocument);\n _documentElementNative = _documentElement[0];\n _windowElement = FRAMEWORK(_documentElementNative.defaultView || _documentElementNative.parentWindow);\n _windowElementNative = _windowElement[0];\n _htmlElement = findFirst(_documentElement, 'html');\n _bodyElement = findFirst(_htmlElement, 'body');\n _targetElement = FRAMEWORK(targetElement);\n _targetElementNative = _targetElement[0];\n _isTextarea = _targetElement.is('textarea');\n _isBody = _targetElement.is('body');\n _documentMixed = _documentElementNative !== document;\n\n /* On a div Element The if checks only whether:\n * - the targetElement has the class \"os-host\"\n * - the targetElement has a a child with the class \"os-padding\"\n * \n * If that's the case, its assumed the DOM has already the following structure:\n * (The \".os-host\" element is the targetElement)\n *\n * <div class=\"os-host\">\n * <div class=\"os-resize-observer-host\"></div>\n * <div class=\"os-padding\">\n * <div class=\"os-viewport\">\n * <div class=\"os-content\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-horizontal \">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-vertical\">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar-corner\"></div>\n * </div>\n *\n * =====================================================================================\n * \n * On a Textarea Element The if checks only whether:\n * - the targetElement has the class \"os-textarea\" \n * - the targetElement is inside a element with the class \"os-content\" \n * \n * If that's the case, its assumed the DOM has already the following structure:\n * (The \".os-textarea\" (textarea) element is the targetElement)\n *\n * <div class=\"os-host-textarea\">\n * <div class=\"os-resize-observer-host\"></div>\n * <div class=\"os-padding os-text-inherit\">\n * <div class=\"os-viewport os-text-inherit\">\n * <div class=\"os-content os-text-inherit\">\n * <div class=\"os-textarea-cover\"></div>\n * <textarea class=\"os-textarea os-text-inherit\"></textarea>\n * </div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-horizontal \">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar os-scrollbar-vertical\">\n * <div class=\"os-scrollbar-track\">\n * <div class=\"os-scrollbar-handle\"></div>\n * </div>\n * </div>\n * <div class=\"os-scrollbar-corner\"></div>\n * </div>\n */\n _domExists = _isTextarea \n ? _targetElement.hasClass(_classNameTextareaElement) && _targetElement.parent().hasClass(_classNameContentElement)\n : _targetElement.hasClass(_classNameHostElement) && _targetElement.children(_strDot + _classNamePaddingElement)[LEXICON.l];\n\n var initBodyScroll;\n var bodyMouseTouchDownListener;\n\n //check if the plugin hasn't to be initialized\n if (_nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y && !_currentPreparedOptions.nativeScrollbarsOverlaid.initialize) {\n dispatchCallback('onInitializationWithdrawn');\n if(_domExists) {\n setupStructureDOM(true);\n setupScrollbarsDOM(true);\n setupScrollbarCornerDOM(true);\n }\n \n _destroyed = true;\n _sleeping = true;\n \n return _base;\n }\n\n if (_isBody) {\n initBodyScroll = {};\n initBodyScroll.l = MATH.max(_targetElement[_strScrollLeft](), _htmlElement[_strScrollLeft](), _windowElement[_strScrollLeft]());\n initBodyScroll.t = MATH.max(_targetElement[_strScrollTop](), _htmlElement[_strScrollTop](), _windowElement[_strScrollTop]());\n \n bodyMouseTouchDownListener = function() {\n _viewportElement.removeAttr('tabindex');\n setupResponsiveEventListener(_viewportElement, _strMouseTouchDownEvent, bodyMouseTouchDownListener, true, true);\n }\n }\n\n //build OverlayScrollbars DOM\n setupStructureDOM();\n setupScrollbarsDOM();\n setupScrollbarCornerDOM();\n \n //create OverlayScrollbars events\n setupStructureEvents();\n setupScrollbarEvents(true);\n setupScrollbarEvents(false);\n setupScrollbarCornerEvents();\n\n //create mutation observers\n createMutationObservers();\n\n //build resize observer for the host element\n setupResizeObserver(_sizeObserverElement, hostOnResized);\n\n if(_isBody) {\n //apply the body scroll to handle it right in the update method\n _viewportElement[_strScrollLeft](initBodyScroll.l)[_strScrollTop](initBodyScroll.t);\n\n //set the focus on the viewport element so you dont have to click on the page to use keyboard keys (up / down / space) for scrolling\n if(document.activeElement == targetElement && _viewportElementNative.focus) {\n //set a tabindex to make the viewportElement focusable\n _viewportElement.attr('tabindex', '-1');\n _viewportElementNative.focus();\n \n /* the tabindex has to be removed due to;\n * If you set the tabindex attribute on an <div>, then its child content cannot be scrolled with the arrow keys unless you set tabindex on the content, too\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\n */\n setupResponsiveEventListener(_viewportElement, _strMouseTouchDownEvent, bodyMouseTouchDownListener, false, true);\n }\n }\n\n //update for the first time & initialize cache\n _base.update(_strAuto);\n\n //the plugin is initialized now!\n _initialized = true;\n dispatchCallback('onInitialized');\n\n //call all callbacks which would fire before the initialized was complete\n each(_callbacksInitQeueue, function(index, value) { dispatchCallback(value.n, value.a); });\n _callbacksInitQeueue = [ ];\n\n //add extensions\n if(type(extensions) == TYPES.s)\n extensions = [ extensions ];\n if(COMPATIBILITY.isA(extensions))\n each(extensions, function (index, value) {_base.addExt(value); });\n else if(FRAMEWORK.isPlainObject(extensions))\n each(extensions, function (key, value) { _base.addExt(key, value); });\n\n //add the transition class for transitions AFTER the first update & AFTER the applied extensions (for preventing unwanted transitions)\n setTimeout(function () {\n if (_supportTransition && !_destroyed)\n addClass(_hostElement, _classNameHostTransition);\n }, 333);\n\n return _base;\n }\n\n if(_plugin.valid(construct(pluginTargetElement, options, extensions))) {\n INSTANCES(pluginTargetElement, _base);\n }\n \n return _base;\n }\n\n /**\n * Initializes a new OverlayScrollbarsInstance object or changes options if already initialized or returns the current instance.\n * @param pluginTargetElements The elements to which the Plugin shall be initialized.\n * @param options The custom options with which the plugin shall be initialized.\n * @param extensions The extension(s) which shall be added right after initialization.\n * @returns {*}\n */\n _plugin = window[PLUGINNAME] = function(pluginTargetElements, options, extensions) {\n if(arguments[LEXICON.l] === 0)\n return this;\n\n var arr = [ ];\n var optsIsPlainObj = FRAMEWORK.isPlainObject(options);\n var inst;\n var result;\n\n //pluginTargetElements is null or undefined\n if(!pluginTargetElements)\n return optsIsPlainObj || !options ? result : arr;\n\n /*\n pluginTargetElements will be converted to:\n 1. A jQueryElement Array\n 2. A HTMLElement Array\n 3. A Array with a single HTML Element\n so pluginTargetElements is always a array.\n */\n pluginTargetElements = pluginTargetElements[LEXICON.l] != undefined ? pluginTargetElements : [ pluginTargetElements[0] || pluginTargetElements ];\n initOverlayScrollbarsStatics();\n\n if(pluginTargetElements[LEXICON.l] > 0) {\n if(optsIsPlainObj) {\n FRAMEWORK.each(pluginTargetElements, function (i, v) {\n inst = v;\n if(inst !== undefined)\n arr.push(OverlayScrollbarsInstance(inst, options, extensions, _pluginsGlobals, _pluginsAutoUpdateLoop));\n });\n }\n else {\n FRAMEWORK.each(pluginTargetElements, function(i, v) {\n inst = INSTANCES(v);\n if((options === '!' && _plugin.valid(inst)) || (COMPATIBILITY.type(options) == TYPES.f && options(v, inst)))\n arr.push(inst);\n else if(options === undefined)\n arr.push(inst);\n });\n }\n result = arr[LEXICON.l] === 1 ? arr[0] : arr;\n }\n return result;\n };\n\n /**\n * Returns a object which contains global information about the plugin and each instance of it.\n * The returned object is just a copy, that means that changes to the returned object won't have any effect to the original object.\n */\n _plugin.globals = function () {\n initOverlayScrollbarsStatics();\n var globals = FRAMEWORK.extend(true, { }, _pluginsGlobals);\n delete globals['msie'];\n return globals;\n };\n\n /**\n * Gets or Sets the default options for each new plugin initialization.\n * @param newDefaultOptions The object with which the default options shall be extended.\n */\n _plugin.defaultOptions = function(newDefaultOptions) {\n initOverlayScrollbarsStatics();\n var currDefaultOptions = _pluginsGlobals.defaultOptions;\n if(newDefaultOptions === undefined)\n return FRAMEWORK.extend(true, { }, currDefaultOptions);\n\n //set the new default options\n _pluginsGlobals.defaultOptions = FRAMEWORK.extend(true, { }, currDefaultOptions , _pluginsOptions._validate(newDefaultOptions, _pluginsOptions._template, true, currDefaultOptions)._default);\n };\n\n /**\n * Checks whether the passed instance is a non-destroyed OverlayScrollbars instance.\n * @param osInstance The potential OverlayScrollbars instance which shall be checked.\n * @returns {boolean} True if the passed value is a non-destroyed OverlayScrollbars instance, false otherwise.\n */\n _plugin.valid = function (osInstance) {\n return osInstance instanceof _plugin && !osInstance.getState().destroyed;\n };\n\n /**\n * Registers, Unregisters or returns a extension.\n * Register: Pass the name and the extension. (defaultOptions is optional)\n * Unregister: Pass the name and anything except a function as extension parameter.\n * Get extension: Pass the name of the extension which shall be got.\n * Get all extensions: Pass no arguments.\n * @param extensionName The name of the extension which shall be registered, unregistered or returned.\n * @param extension A function which generates the instance of the extension or anything other to remove a already registered extension.\n * @param defaultOptions The default options which shall be used for the registered extension.\n */\n _plugin.extension = function(extensionName, extension, defaultOptions) {\n var extNameTypeString = COMPATIBILITY.type(extensionName) == TYPES.s;\n var argLen = arguments[LEXICON.l];\n var i = 0;\n if(argLen < 1 || !extNameTypeString) {\n //return a copy of all extension objects\n return FRAMEWORK.extend(true, { length : _pluginsExtensions[LEXICON.l] }, _pluginsExtensions);\n }\n else if(extNameTypeString) {\n if(COMPATIBILITY.type(extension) == TYPES.f) {\n //register extension\n _pluginsExtensions.push({\n name : extensionName,\n extensionFactory : extension,\n defaultOptions : defaultOptions\n });\n }\n else {\n for(; i < _pluginsExtensions[LEXICON.l]; i++) {\n if (_pluginsExtensions[i].name === extensionName) {\n if(argLen > 1)\n _pluginsExtensions.splice(i, 1); //remove extension\n else\n return FRAMEWORK.extend(true, { }, _pluginsExtensions[i]); //return extension with the given name\n }\n }\n }\n }\n };\n\n return _plugin;\n })();\n\n if(JQUERY && JQUERY.fn) {\n /**\n * The jQuery initialization interface.\n * @param options The initial options for the construction of the plugin. To initialize the plugin, this option has to be a object! If it isn't a object, the instance(s) are returned and the plugin wont be initialized.\n * @param extensions The extension(s) which shall be added right after initialization.\n * @returns {*} After initialization it returns the jQuery element array, else it returns the instance(s) of the elements which are selected.\n */\n JQUERY.fn.overlayScrollbars = function (options, extensions) {\n var _elements = this;\n if(JQUERY.isPlainObject(options)) {\n JQUERY.each(_elements, function() { PLUGIN(this, options, extensions); });\n return _elements;\n }\n else\n return PLUGIN(_elements, options);\n };\n }\n return PLUGIN;\n }\n));"
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"index": 41,
"index2": 45,
"size": 10212,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"issuerId": 18,
"issuerName": "./src/index.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
}
],
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 18,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"module": "./src/index.ts",
"moduleName": "./src/index.ts",
"type": "cjs require",
"userRequest": "./components/pageSignIn",
"loc": "22:35-69"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"../lib/mtproto\");\nvar misc_1 = require(\"./misc\");\nvar richtextprocessor_1 = require(\"../lib/richtextprocessor\");\n// @ts-ignore\n//import countries from './countries.json';\nvar utils_1 = require(\"../lib/utils\");\nvar pageAuthCode_1 = __importDefault(require(\"./pageAuthCode\"));\nexports.default = (function () { return Promise.all([\n Promise.resolve().then(function () { return __importStar(require('../countries.json')); })\n]).then(function (results) {\n var countries = results[0].default;\n var options = { dcID: Config.App.baseDcID, createNetworker: true };\n var lastCountrySelected = '';\n var selectCountryCode = document.querySelector('input[name=\"countryCode\"]');\n var parent = selectCountryCode.parentElement;\n var wrapper = document.createElement('div');\n wrapper.classList.add('select-wrapper', 'z-depth-4');\n /* OverlayScrollbars(document.querySelectorAll('body'), {\n className : 'scroll',\n sizeAutoCapable : true,\n paddingAbsolute : true,\n scrollbars : {\n clickScrolling : true\n }\n }); */\n var list = document.createElement('ul');\n wrapper.appendChild(list);\n // @ts-ignore\n var wrapperScroll = OverlayScrollbars(wrapper, window.scrollbarOptions);\n var pageEl = document.body.getElementsByClassName('page-sign')[0];\n pageEl.style.display = '';\n var initedSelect = false;\n selectCountryCode.addEventListener('focus', function (e) {\n /* this.removeAttribute('readonly'); */\n if (!initedSelect) {\n countries.forEach(function (c) {\n initedSelect = true;\n var unified = utils_1.unifiedCountryCodeEmoji(c.code);\n var emoji = unified.split('-').reduce(function (prev, curr) { return prev + String.fromCodePoint(parseInt(curr, 16)); }, '');\n var liArr = [];\n c.phoneCode.split(' and ').forEach(function (phoneCode) {\n var li = document.createElement('li');\n var spanEmoji = document.createElement('span');\n /* spanEmoji.innerHTML = countryCodeEmoji(c.code); */\n spanEmoji.classList.add('emoji-outer', 'emoji-sizer');\n //spanEmoji.innerHTML = `<span class=\"emoji-inner\" style=\"background: url(${sheetUrl}${sheetNo}.png);background-position:${xPos}% ${yPos}%;background-size:${sizeX}% ${sizeY}%\" data-codepoints=\"${unified}\"></span>`;\n var kek = richtextprocessor_1.RichTextProcessor.wrapRichText(emoji);\n console.log(c.name, emoji, kek, spanEmoji.innerHTML);\n li.appendChild(spanEmoji);\n spanEmoji.outerHTML = kek;\n li.append(c.name);\n var span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + phoneCode;\n li.appendChild(span);\n liArr.push(li);\n list.append(li);\n });\n // @ts-ignore\n c.li = liArr;\n });\n var findUpTag_1 = function (el, tag) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.tagName === tag)\n return el;\n }\n return null;\n };\n list.addEventListener('mousedown', function (e) {\n var target = e.target;\n if (target.tagName != 'LI')\n target = findUpTag_1(target, 'LI');\n var countryName = target.childNodes[1].textContent; //target.innerText.split('\\n').shift();\n var phoneCode = target.querySelector('.phone-code').innerText;\n selectCountryCode.value = countryName;\n lastCountrySelected = countryName;\n telEl.value = phoneCode;\n setTimeout(function () { return telEl.focus(); }, 0);\n console.log('clicked', e, countryName, phoneCode);\n });\n }\n wrapperScroll.update(true);\n parent.appendChild(wrapper);\n } /* , {once: true} */);\n selectCountryCode.addEventListener('blur', function (e) {\n parent.removeChild(wrapper);\n e.cancelBubble = true;\n }, { capture: true });\n selectCountryCode.addEventListener('keyup', function (e) {\n console.log(e);\n if (e.ctrlKey || e.key == 'Control')\n return false;\n //let i = new RegExp('^' + this.value, 'i');\n var _value = this.value.toLowerCase();\n var matches = [];\n countries.forEach(function (c) {\n var good = c.name.toLowerCase().indexOf(_value) == 0; //i.test(c.name);\n // @ts-ignore\n c.li.forEach(function (li) { return li.style.display = good ? '' : 'none'; });\n if (good)\n matches.push(c);\n });\n if (matches.length == 1 && matches[0].li.length == 1) {\n if (matches[0].name == lastCountrySelected)\n return false;\n console.log('clicking', matches[0]);\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n }\n else if (matches.length == 0) {\n countries.forEach(function (c) {\n // @ts-ignore\n c.li.forEach(function (li) { return li.style.display = ''; });\n });\n }\n });\n var arrowDown = pageEl.querySelector('.arrow-down');\n arrowDown.addEventListener('mousedown', function (e) {\n e.cancelBubble = true;\n e.preventDefault();\n if (selectCountryCode.matches(':focus'))\n selectCountryCode.blur();\n else\n selectCountryCode.focus();\n });\n var btnNext = document.querySelector('.page-sign button');\n var telEl = document.querySelector('input[name=\"phone\"]');\n telEl.addEventListener('keypress', function (e) {\n if (/\\D/.test(e.key)) {\n e.preventDefault();\n return false;\n }\n this.classList.remove('error');\n this.value = '+' + this.value\n .replace(/[^0-9\\s]/g, '');\n var sorted = countries.slice().sort(function (a, b) { return b.phoneCode.length - a.phoneCode.length; });\n var phoneCode = this.value.slice(1, 7).replace(/\\D/g, '');\n var country = sorted.find(function (c) {\n return c.phoneCode.split(' and ').find(function (c) { return phoneCode.indexOf(c) == 0; });\n });\n console.log(phoneCode, country);\n var countryName = country ? country.name : 'Unknown';\n if (countryName != selectCountryCode.value) {\n selectCountryCode.value = countryName;\n lastCountrySelected = countryName;\n }\n if (this.value.length >= 9) {\n btnNext.style.display = '';\n }\n });\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n }) */ ;\n console.log('exec startAll();');\n /* MTProto.authorizer.auth(2);\n MTProto.networkerFactory.startAll(); */\n btnNext.addEventListener('click', function (e) {\n var _this = this;\n this.setAttribute('disabled', 'true');\n // @ts-ignore\n console.log('asd', e.target.innerText);\n this.textContent = 'PLEASE WAIT...';\n misc_1.putPreloader(this);\n //this.innerHTML = 'PLEASE WAIT...';\n var phone_number = telEl.value;\n mtproto_1.MTProto.apiManager.invokeApi('auth.sendCode', {\n /* flags: 0, */\n phone_number: phone_number,\n api_id: Config.App.id,\n api_hash: Config.App.hash,\n settings: {\n _: 'codeSettings',\n flags: 0\n }\n /* lang_code: navigator.language || 'en' */\n }, options).then(function (code) {\n console.log('yep', code);\n pageEl.style.display = 'none';\n pageAuthCode_1.default(Object.assign(code, { phone_number: phone_number }));\n }).catch(function (err) {\n _this.removeAttribute('disabled');\n _this.innerText = 'NEXT';\n switch (err.type) {\n case 'PHONE_NUMBER_INVALID':\n telEl.classList.add('error');\n break;\n default:\n _this.innerText = err.type;\n break;\n }\n });\n });\n var tryAgain = function () {\n mtproto_1.MTProto.apiManager.invokeApi('help.getNearestDc', {}, options).then(function (nearestDcResult) {\n /* if (wasCountry == $scope.credentials.phone_country) {\n selectPhoneCountryByIso2(nearestDcResult.country)\n } */\n if (nearestDcResult.nearest_dc != nearestDcResult.this_dc) {\n mtproto_1.MTProto.apiManager.getNetworker(nearestDcResult.nearest_dc, { createNetworker: true });\n }\n var country = countries.find(function (c) { return c.code == nearestDcResult.country; });\n if (country) {\n if (!selectCountryCode.value.length && !telEl.value.length) {\n selectCountryCode.value = country.name;\n lastCountrySelected = country.name;\n telEl.value = '+' + country.phoneCode.split(' and ').shift();\n }\n }\n return console.log('woohoo', nearestDcResult, country);\n }).catch(tryAgain);\n };\n tryAgain();\n}); });\n"
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"index": 42,
"index2": 43,
"size": 8844,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"issuerId": 41,
"issuerName": "./src/components/pageSignIn.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "./pageAuthCode",
"loc": "19:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"../lib/bin_utils\");\n//import { AnimationItem } from 'lottie-web';\nvar mtproto_1 = require(\"../lib/mtproto\");\n//import Lottie from 'lottie-web';\nvar pageSignUp_1 = __importDefault(require(\"./pageSignUp\"));\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nvar pagePassword_1 = __importDefault(require(\"./pagePassword\"));\nvar installed = false;\nvar authCode = null;\nexports.default = (function (_authCode) { return Promise.resolve().then(function () { return __importStar(require('lottie-web')); }).then(function (Lottie) {\n authCode = _authCode;\n if (installed)\n return;\n installed = true;\n var options = { dcID: Config.App.baseDcID, createNetworker: true };\n var lottie = Lottie;\n //let lottie = Lottie.default;\n var needFrame = 0, lastLength = 0;\n var animation = /* AnimationItem */ undefined;\n var pageElement = document.body.getElementsByClassName('page-authCode')[0];\n pageElement.style.display = '';\n var headerElement = pageElement.getElementsByClassName('phone')[0];\n headerElement.innerText = authCode.phone_number;\n var CODELENGTH = authCode.type.length;\n fetch('assets/img/TwoFactorSetupMonkeyTracking.tgs')\n .then(function (res) { return res.arrayBuffer(); })\n .then(function (data) {\n var str = bin_utils_1.gzipUncompress(data, true);\n // @ts-ignore\n animation = lottie.loadAnimation({\n container: document.body.querySelector('.page-authCode .auth-image'),\n renderer: 'svg',\n loop: false,\n autoplay: false,\n animationData: JSON.parse(str)\n });\n animation.setSpeed(1);\n //console.log(animation.getDuration(), animation.getDuration(true));\n animation.addEventListener('enterFrame', function (e) {\n //console.log('enterFrame', e, needFrame);\n var currentFrame = Math.round(e.currentTime);\n if ((e.direction == 1 && currentFrame >= needFrame) ||\n (e.direction == -1 && currentFrame <= needFrame)) {\n animation.setSpeed(1);\n animation.pause();\n }\n });\n });\n var codeInput = document.getElementById('code');\n var codeInputLabel = codeInput.nextElementSibling;\n var editButton = document.querySelector('.phone-edit');\n var editable = false;\n var changePhonePromise;\n var changePhone = function () {\n if (changePhonePromise)\n return;\n var phone_number = '+' + headerElement.innerText.replace(/\\D/g, '');\n if (authCode.phone_number == phone_number)\n return;\n codeInput.setAttribute('disabled', 'true');\n changePhonePromise = mtproto_1.MTProto.apiManager.invokeApi('auth.sendCode', {\n /* flags: 0, */\n phone_number: phone_number,\n api_id: Config.App.id,\n api_hash: Config.App.hash,\n settings: {\n _: 'codeSettings',\n flags: 0\n }\n /* lang_code: navigator.language || 'en' */\n }, options).then(function (code) {\n console.log('yep2', code);\n authCode = Object.assign(code, { phone_number: phone_number });\n changePhonePromise = undefined;\n codeInput.removeAttribute('disabled');\n codeInput.focus();\n }).catch(function (err) {\n switch (err.type) {\n case 'PHONE_NUMBER_INVALID':\n headerElement.classList.add('error');\n editable = true;\n headerElement.setAttribute('contenteditable', '' + editable);\n headerElement.focus();\n break;\n default:\n codeInputLabel.innerText = err.type;\n break;\n }\n changePhonePromise = undefined;\n codeInput.removeAttribute('disabled');\n });\n };\n headerElement.addEventListener('keypress', function (e) {\n if (e.key == 'Enter') {\n editable = false;\n headerElement.setAttribute('contenteditable', '' + editable);\n changePhone();\n }\n if (/\\D/.test(e.key)) {\n e.preventDefault();\n return false;\n }\n this.classList.remove('error');\n });\n editButton.addEventListener('click', function () {\n if (changePhonePromise)\n return;\n editable = !editable;\n headerElement.setAttribute('contenteditable', '' + editable);\n if (!editable)\n changePhone();\n });\n var submitCode = function (code) {\n codeInput.setAttribute('disabled', 'true');\n var params = {\n phone_number: authCode.phone_number,\n phone_code_hash: authCode.phone_code_hash,\n phone_code: code\n };\n console.log('invoking auth.signIn with params:', params);\n mtproto_1.MTProto.apiManager.invokeApi('auth.signIn', params, options)\n .then(function (response) {\n console.log('auth.signIn response:', response);\n switch (response._) {\n case 'auth.authorization':\n mtproto_1.MTProto.apiManager.setUserAuth(options.dcID, {\n id: response.user.id\n });\n pageElement.style.display = 'none';\n pageIm_1.default();\n if (animation)\n animation.destroy();\n break;\n case 'auth.authorizationSignUpRequired':\n console.log('Registration needed!');\n pageElement.style.display = 'none';\n pageSignUp_1.default({\n 'phone_number': authCode.phone_number,\n 'phone_code_hash': authCode.phone_code_hash\n });\n if (animation)\n animation.destroy();\n break;\n default:\n codeInput.innerText = response._;\n break;\n }\n }).catch(function (err) {\n codeInput.removeAttribute('disabled');\n switch (err.type) {\n case 'SESSION_PASSWORD_NEEDED':\n console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\n err.handled = true;\n pageElement.style.display = 'none';\n if (animation)\n animation.destroy();\n pagePassword_1.default();\n break;\n case 'PHONE_CODE_EMPTY':\n case 'PHONE_CODE_INVALID':\n codeInput.classList.add('error');\n codeInputLabel.innerText = 'Invalid Code';\n break;\n default:\n codeInputLabel.innerText = err.type;\n break;\n }\n });\n };\n var max = 45;\n // 1st symbol = frame 15\n // end symbol = frame 165\n codeInput.addEventListener('input', function (e) {\n this.classList.remove('error');\n this.value = this.value.replace(/\\D/g, '');\n if (this.value.length > CODELENGTH) {\n this.value = this.value.slice(0, CODELENGTH);\n }\n var length = this.value.length;\n if (length == CODELENGTH) { // submit code\n submitCode(this.value);\n }\n else if (length == lastLength) {\n return;\n }\n lastLength = length;\n if (!animation)\n return;\n var frame;\n if (length)\n frame = Math.round((length > max ? max : length) * (165 / max) + 11.33);\n else\n frame = 0;\n //animation.playSegments([1, 2]);\n var direction = needFrame > frame ? -1 : 1;\n //console.log('keydown', length, frame, direction);\n // @ts-ignore\n animation.setDirection(direction);\n if (needFrame != 0 && frame == 0) {\n animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n needFrame = frame;\n animation.play();\n /* animation.goToAndStop(15, true); */\n //animation.goToAndStop(length / max * );\n });\n}); });\n"
},
{
"id": 43,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"name": "./src/components/pageSignUp.ts",
"index": 43,
"index2": 41,
"size": 7676,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"issuerId": 42,
"issuerName": "./src/components/pageAuthCode.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
}
],
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pageSignUp",
"loc": "17:35-58"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar mtproto_1 = require(\"../lib/mtproto\");\nvar misc_1 = require(\"./misc\");\nvar installed = false;\nvar authCode = null;\nvar cropper_1 = __importDefault(require(\"../lib/cropper\"));\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nexports.default = (function (_authCode) {\n authCode = _authCode;\n if (installed)\n return;\n installed = true;\n var pageElement = document.body.getElementsByClassName('page-signUp')[0];\n pageElement.style.display = '';\n var findUpClassName = function (el, className) {\n while (el.parentNode) {\n // @ts-ignore\n el = el.parentNode;\n if (el.classList.contains(className))\n return el;\n }\n return null;\n };\n Array.from(document.body.getElementsByClassName('popup-close')).forEach(function (el) {\n var popup = findUpClassName(el, 'popup');\n el.addEventListener('click', function () {\n popup.classList.remove('is-visible');\n });\n });\n var avatarInput = document.getElementById('avatar-input');\n var avatarPopup = pageElement.getElementsByClassName('popup-avatar')[0];\n var avatarPreview = pageElement.querySelector('#canvas-avatar');\n var cropContainer = avatarPopup.getElementsByClassName('crop')[0];\n var avatarImage = new Image();\n cropContainer.append(avatarImage);\n var avatarBlob;\n avatarPopup.getElementsByClassName('popup-close')[0]\n .addEventListener('click', function (e) {\n /* let popup = findUpClassName(this, 'popup');\n popup.classList.remove('is-visible'); */\n setTimeout(function () {\n cropper.removeHandlers();\n if (avatarImage) {\n avatarImage.remove();\n }\n }, 200);\n /* e.cancelBubble = true;\n return false; */\n });\n var cropper = {\n crop: function () { },\n removeHandlers: function () { }\n };\n // apply\n avatarPopup.getElementsByClassName('btn-crop')[0].addEventListener('click', function () {\n cropper.crop();\n avatarPopup.classList.remove('is-visible');\n cropper.removeHandlers();\n avatarPreview.toBlob(function (blob) {\n avatarBlob = blob; // save blob to send after reg\n // darken\n var ctx = avatarPreview.getContext('2d');\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\n ctx.fillRect(0, 0, avatarPreview.width, avatarPreview.height);\n });\n avatarImage.remove();\n });\n avatarInput.addEventListener('change', function (e) {\n var file = e.target.files[0];\n if (!file) {\n return;\n }\n /* console.log(file, typeof(file)); */\n // @ts-ignore\n /* MTProto.apiFileManager.uploadFile(file).then(function(inputFile) {\n console.log('uploaded smthn', inputFile);\n \n MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then(function (updateResult) {\n console.log('updated photo!');\n });\n }); */\n var reader = new FileReader();\n reader.onload = function (e) {\n var contents = e.target.result;\n avatarImage = new Image();\n cropContainer.append(avatarImage);\n avatarImage.src = contents;\n avatarImage.onload = function () {\n /* avatarPreviewCtx.drawImage(avatarImage,\n 70, 20, // Start at 70/20 pixels from the left and the top of the image (crop),\n 50, 50, // \"Get\" a `50 * 50` (w * h) area from the source image (crop),\n 0, 0, // Place the result at 0, 0 in the canvas,\n 100, 100); // With as width / height: 100 * 100 (scale) */\n cropper = cropper_1.default(avatarImage, avatarPreview);\n avatarInput.value = '';\n };\n avatarPopup.classList.add('is-visible');\n //console.log(contents);\n };\n reader.readAsDataURL(file);\n }, false);\n document.body.querySelector('.page-signUp .auth-image').addEventListener('click', function () {\n avatarInput.click();\n });\n var headerName = pageElement.getElementsByClassName('fullName')[0];\n var handleInput = function (e) {\n var name = fieldName.value || '';\n var lastName = fieldLastName.value || '';\n var fullName = name || lastName\n ? (name + ' ' + lastName).trim()\n : 'Your Name';\n if (headerName.innerText != fullName)\n headerName.innerText = fullName;\n this.classList.remove('error');\n };\n var sendAvatar = function () { return new Promise(function (resolve, reject) {\n if (!avatarBlob) {\n console.log('User has not selected avatar');\n return resolve();\n }\n console.log('invoking uploadFile...');\n // @ts-ignore\n mtproto_1.MTProto.apiFileManager.uploadFile(avatarBlob).then(function (inputFile) {\n console.log('uploaded smthn', inputFile);\n mtproto_1.MTProto.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then(function (updateResult) {\n console.log('updated photo!');\n resolve();\n }, reject);\n }, reject);\n }); };\n var fieldName = document.getElementById('name');\n fieldName.addEventListener('input', handleInput);\n var fieldLastName = document.getElementById('lastName');\n fieldLastName.addEventListener('input', handleInput);\n var signUpButton = document.getElementById('signUp');\n signUpButton.addEventListener('click', function (e) {\n var _this = this;\n this.setAttribute('disabled', 'true');\n if (!fieldName.value.length) {\n fieldName.classList.add('error');\n return false;\n }\n var name = fieldName.value;\n var lastName = fieldLastName.value;\n var params = {\n 'phone_number': authCode.phone_number,\n 'phone_code_hash': authCode.phone_code_hash,\n 'first_name': name,\n 'last_name': lastName\n };\n console.log('invoking auth.signUp with params:', params);\n this.textContent = 'PLEASE WAIT...';\n misc_1.putPreloader(this);\n mtproto_1.MTProto.apiManager.invokeApi('auth.signUp', params)\n .then(function (response) {\n console.log('auth.signUp response:', response);\n switch (response._) {\n case 'auth.authorization': // success\n mtproto_1.MTProto.apiManager.setUserAuth(Config.App.baseDcID, {\n id: response.user.id\n });\n sendAvatar().then(function () {\n pageElement.style.display = 'none';\n pageIm_1.default();\n });\n break;\n default:\n _this.innerText = response._;\n break;\n }\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\n pageAuthCode(Object.assign(code, {phoneNumber})); */\n }).catch(function (err) {\n _this.removeAttribute('disabled');\n switch (err.type) {\n default:\n _this.innerText = err.type;\n break;\n }\n });\n });\n});\n"
},
{
"id": 44,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/cropper.ts",
"name": "./src/lib/cropper.ts",
"index": 44,
"index2": 40,
"size": 7697,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"issuerId": 43,
"issuerName": "./src/components/pageSignUp.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
},
{
"id": 43,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"name": "./src/components/pageSignUp.ts",
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
}
}
],
"profile": {
"factory": 224,
"building": 1316
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 43,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignUp.ts",
"module": "./src/components/pageSignUp.ts",
"moduleName": "./src/components/pageSignUp.ts",
"type": "cjs require",
"userRequest": "../lib/cropper",
"loc": "10:32-57"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 4,
"source": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction resizeableImage(image_target, resize_canvas) {\n var cropComponent, container, crop_img, event_state = {}, ratio = 1.0, keyZoomValue = 4.0, MINWIDTH = 50, MINHEIGHT = 50, CROPWIDTH = 200, CROPHEIGHT = 200, cropLeft = 0, cropTop = 0, cropWidth = 0, cropHeight = 0;\n if (image_target.complete) {\n init();\n }\n else {\n image_target.onload = init;\n }\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n cropComponent.remove();\n container.remove();\n crop_img.remove();\n }\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n document.addEventListener('keypress', keyHandler, false);\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n function init() {\n var wraper, left, top;\n if (image_target.dataset.isCrop) {\n throw 'image is already crop';\n }\n image_target.dataset.isCrop = 'true';\n image_target.classList.add('crop-blur');\n image_target.draggable = false;\n crop_img = new Image();\n crop_img.crossOrigin = image_target.crossOrigin;\n crop_img.src = image_target.src;\n crop_img.draggable = false;\n if (!resize_canvas) {\n resize_canvas = document.createElement('canvas');\n }\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n container = document.createElement('div');\n container.classList.add('overlay');\n var overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n cropComponent.appendChild(container);\n wraper = image_target.parentNode;\n wraper.appendChild(cropComponent);\n cropComponent.appendChild(crop_img);\n cropComponent.appendChild(image_target);\n cropComponent.appendChild(overlayColor);\n container.appendChild(crop_img);\n crop_img.style.maxWidth = image_target.width + 'px';\n left = image_target.offsetWidth / 2 - CROPWIDTH / 2;\n top = image_target.offsetHeight / 2 - CROPHEIGHT / 2;\n updateCropImage(left, top);\n addHandlers();\n }\n function updateCropSize(width, height) {\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n function updateCropImage(left, top) {\n cropLeft = -left * ratio;\n cropTop = -top * ratio;\n crop_img.style.top = -top + 'px';\n crop_img.style.left = -left + 'px';\n }\n function updateContainer(left, top) {\n var _top = top + (CROPWIDTH / 2) + 'px';\n var _left = left + (CROPHEIGHT / 2) + 'px';\n container.style.top = _top;\n container.style.left = _left;\n }\n // Save the initial event details and container state\n function saveEventState(e) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n function imgZoom(zoom) {\n zoom = zoom * Math.PI * 2;\n var newWidth = Math.floor(container.clientWidth + zoom), newHeight = Math.floor(container.clientHeight + zoom), w = crop_img.clientWidth, h = crop_img.clientHeight, left, top, right, bottom;\n if (newWidth < MINWIDTH) {\n return;\n }\n else if (newWidth > w) {\n return;\n }\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n if (left < 0) {\n left = 0;\n }\n if (top < 0) {\n top = 0;\n }\n if (right > w) {\n return;\n }\n if (bottom > h) {\n return;\n }\n ratio = CROPWIDTH / newWidth;\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n //crop();\n }\n function keyHandler(e) {\n e.preventDefault();\n switch (String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n function resizing(e) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n function startMoving(e) {\n e.preventDefault();\n e.stopPropagation();\n saveEventState(e);\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n function endMoving(e) {\n e.preventDefault();\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n function moving(e) {\n var curuntTouch = { x: 0, y: 0 }, left, top, w, h;\n e.preventDefault();\n e.stopPropagation();\n curuntTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n curuntTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n left = curuntTouch.x - (event_state.mouse_x - event_state.container_left);\n top = curuntTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n if (left < 0) {\n left = 0;\n }\n else if (left > crop_img.offsetWidth - w) {\n left = crop_img.offsetWidth - w;\n }\n if (top < 0) {\n top = 0;\n }\n else if (top > crop_img.offsetHeight - h) {\n top = crop_img.offsetHeight - h;\n }\n updateCropImage(left, top);\n updateContainer(left, top);\n }\n function crop() {\n cropWidth = crop_img.width * ratio;\n cropHeight = crop_img.height * ratio;\n resize_canvas.width = CROPWIDTH;\n resize_canvas.height = CROPHEIGHT;\n var ctx = resize_canvas.getContext('2d');\n ctx.drawImage(crop_img, cropLeft, cropTop, cropWidth, cropHeight);\n }\n return { crop: crop, removeHandlers: removeHandlers };\n /* function openCropCanvasImg() {\n crop();\n \n try {\n var base64Img = resize_canvas.toDataURL('image/png', 1.0);\n window.open(base64Img);\n } catch(e) {\n alert(e);\n } finally {\n // removeHandlers();\n }\n \n } */\n}\n//resizeableImage(document.querySelector('.crop-image'));\nexports.default = resizeableImage;\n"
},
{
"id": 45,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pagePassword.ts",
"name": "./src/components/pagePassword.ts",
"index": 45,
"index2": 42,
"size": 4787,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"issuerId": 42,
"issuerName": "./src/components/pageAuthCode.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
},
{
"id": 42,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"name": "./src/components/pageAuthCode.ts",
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
}
}
],
"profile": {
"factory": 232,
"building": 83,
"dependencies": 1
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 42,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageAuthCode.ts",
"module": "./src/components/pageAuthCode.ts",
"moduleName": "./src/components/pageAuthCode.ts",
"type": "cjs require",
"userRequest": "./pagePassword",
"loc": "19:37-62"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 3,
"source": "\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar bin_utils_1 = require(\"../lib/bin_utils\");\n//import { AnimationItem } from 'lottie-web';\nvar mtproto_1 = require(\"../lib/mtproto\");\n//import Lottie from 'lottie-web';\nvar pageIm_1 = __importDefault(require(\"./pageIm\"));\nvar installed = false;\nvar authCode = null;\nexports.default = (function () { return Promise.resolve().then(function () { return __importStar(require('lottie-web')); }).then(function (Lottie) {\n if (installed)\n return;\n installed = true;\n var lottie = Lottie;\n //let lottie = Lottie.default;\n var needFrame = 0, lastLength = 0;\n var animation = /* AnimationItem */ undefined;\n var passwordVisible = false;\n var pageElement = document.body.getElementsByClassName('page-password')[0];\n pageElement.style.display = '';\n fetch('assets/img/TwoFactorSetupMonkeyClose.tgs')\n .then(function (res) { return res.arrayBuffer(); })\n .then(function (data) {\n var str = bin_utils_1.gzipUncompress(data, true);\n // @ts-ignore\n animation = lottie.loadAnimation({\n container: pageElement.querySelector('.auth-image'),\n renderer: 'svg',\n loop: false,\n autoplay: false,\n animationData: JSON.parse(str)\n });\n console.log(animation.getDuration(true));\n //animation.goToAndStop(822);\n animation.addEventListener('enterFrame', function (e) {\n //console.log('enterFrame', e, needFrame);\n var currentFrame = Math.round(e.currentTime);\n if ((e.direction == 1 && currentFrame >= needFrame) ||\n (e.direction == -1 && currentFrame <= needFrame)) {\n animation.setSpeed(1);\n animation.pause();\n }\n });\n needFrame = 49;\n animation.play();\n });\n var btnNext = pageElement.querySelector('button');\n var passwordInput = document.getElementById('password');\n var passwordInputLabel = passwordInput.nextElementSibling;\n var toggleVisible = pageElement.querySelector('.toggle-visible');\n var handleError = function (err) {\n btnNext.removeAttribute('disabled');\n switch (err.type) {\n default:\n btnNext.innerText = err.type;\n break;\n }\n };\n toggleVisible.addEventListener('click', function (e) {\n if (!passwordVisible) {\n this.classList.add('tgico-eye2');\n passwordInput.setAttribute('type', 'text');\n animation.setDirection(-1);\n needFrame = 0;\n animation.play();\n }\n else {\n this.classList.remove('tgico-eye2');\n passwordInput.setAttribute('type', 'password');\n animation.setDirection(1);\n needFrame = 49;\n animation.play();\n }\n passwordVisible = !passwordVisible;\n });\n btnNext.addEventListener('click', function (e) {\n if (!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n this.setAttribute('disabled', 'true');\n var value = passwordInput.value;\n mtproto_1.MTProto.passwordManager.getState()\n .then(function (state) {\n console.log(state);\n mtproto_1.MTProto.passwordManager.check(state, value, { dcID: Config.App.baseDcID }).then(function (response) {\n console.log('passwordManager response:', response);\n switch (response._) {\n case 'auth.authorization':\n mtproto_1.MTProto.apiManager.setUserAuth(Config.App.baseDcID, {\n id: response.user.id\n });\n pageElement.style.display = 'none';\n pageIm_1.default();\n if (animation)\n animation.destroy();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNext.innerText = response._;\n break;\n }\n }).catch(handleError);\n }).catch(handleError);\n });\n passwordInput.addEventListener('input', function (e) {\n this.classList.remove('error');\n });\n}); });\n"
},
{
"id": 46,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/countries.json",
"name": "./src/countries.json",
"index": 46,
"index2": 44,
"size": 12648,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"issuerId": 41,
"issuerName": "./src/components/pageSignIn.ts",
"issuerPath": [
{
"id": 18,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/index.ts",
"name": "./src/index.ts",
"profile": {
"factory": 17,
"building": 2295
}
},
{
"id": 41,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"name": "./src/components/pageSignIn.ts",
"profile": {
"factory": 1354,
"building": 0,
"dependencies": 287
}
}
],
"profile": {
"factory": 242,
"building": 646,
"dependencies": 207
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 41,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/components/pageSignIn.ts",
"module": "./src/components/pageSignIn.ts",
"moduleName": "./src/components/pageSignIn.ts",
"type": "cjs require",
"userRequest": "../countries.json",
"loc": "21:61-89"
}
],
"usedExports": true,
"providedExports": [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
"38",
"39",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"50",
"51",
"52",
"53",
"54",
"55",
"56",
"57",
"58",
"59",
"60",
"61",
"62",
"63",
"64",
"65",
"66",
"67",
"68",
"69",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"80",
"81",
"82",
"83",
"84",
"85",
"86",
"87",
"88",
"89",
"90",
"91",
"92",
"93",
"94",
"95",
"96",
"97",
"98",
"99",
"100",
"101",
"102",
"103",
"104",
"105",
"106",
"107",
"108",
"109",
"110",
"111",
"112",
"113",
"114",
"115",
"116",
"117",
"118",
"119",
"120",
"121",
"122",
"123",
"124",
"125",
"126",
"127",
"128",
"129",
"130",
"131",
"132",
"133",
"134",
"135",
"136",
"137",
"138",
"139",
"140",
"141",
"142",
"143",
"144",
"145",
"146",
"147",
"148",
"149",
"150",
"151",
"152",
"153",
"154",
"155",
"156",
"157",
"158",
"159",
"160",
"161",
"162",
"163",
"164",
"165",
"166",
"167",
"168",
"169",
"170",
"171",
"172",
"173",
"174",
"175",
"176",
"177",
"178",
"179",
"180",
"181",
"182",
"183",
"184",
"185",
"186",
"187",
"188",
"189",
"190",
"191",
"192",
"193",
"194",
"195",
"196",
"197",
"198",
"199",
"200",
"201",
"202",
"203",
"204",
"205",
"206",
"207",
"208",
"209",
"210",
"211",
"212",
"213",
"214",
"215",
"216",
"217",
"218",
"219",
"220",
"221",
"222",
"223",
"224",
"225",
"226",
"227",
"228",
"229",
"230",
"231",
"232",
"233",
"234",
"235",
"236",
"237",
"238",
"239",
"240",
"241",
"242",
"243",
"244",
"default"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "[{\"name\":\"Afghanistan\",\"code\":\"AF\",\"phoneCode\":\"93\"},{\"name\":\"Aland Islands\",\"code\":\"AX\",\"phoneCode\":\"35818\"},{\"name\":\"Albania\",\"code\":\"AL\",\"phoneCode\":\"355\"},{\"name\":\"Algeria\",\"code\":\"DZ\",\"phoneCode\":\"213\"},{\"name\":\"American Samoa\",\"code\":\"AS\",\"phoneCode\":\"1684\"},{\"name\":\"Andorra\",\"code\":\"AD\",\"phoneCode\":\"376\"},{\"name\":\"Angola\",\"code\":\"AO\",\"phoneCode\":\"244\"},{\"name\":\"Anguilla\",\"code\":\"AI\",\"phoneCode\":\"1264\"},{\"name\":\"Antigua and Barbuda\",\"code\":\"AG\",\"phoneCode\":\"1268\"},{\"name\":\"Argentina\",\"code\":\"AR\",\"phoneCode\":\"54\"},{\"name\":\"Armenia\",\"code\":\"AM\",\"phoneCode\":\"374\"},{\"name\":\"Aruba\",\"code\":\"AW\",\"phoneCode\":\"297\"},{\"name\":\"Australia\",\"code\":\"AU\",\"phoneCode\":\"61\"},{\"name\":\"Austria\",\"code\":\"AT\",\"phoneCode\":\"43\"},{\"name\":\"Azerbaijan\",\"code\":\"AZ\",\"phoneCode\":\"994\"},{\"name\":\"Bahamas\",\"code\":\"BS\",\"phoneCode\":\"1242\"},{\"name\":\"Bahrain\",\"code\":\"BH\",\"phoneCode\":\"973\"},{\"name\":\"Bangladesh\",\"code\":\"BD\",\"phoneCode\":\"880\"},{\"name\":\"Barbados\",\"code\":\"BB\",\"phoneCode\":\"1246\"},{\"name\":\"Belarus\",\"code\":\"BY\",\"phoneCode\":\"375\"},{\"name\":\"Belgium\",\"code\":\"BE\",\"phoneCode\":\"32\"},{\"name\":\"Belize\",\"code\":\"BZ\",\"phoneCode\":\"501\"},{\"name\":\"Benin\",\"code\":\"BJ\",\"phoneCode\":\"229\"},{\"name\":\"Bermuda\",\"code\":\"BM\",\"phoneCode\":\"1441\"},{\"name\":\"Bhutan\",\"code\":\"BT\",\"phoneCode\":\"975\"},{\"name\":\"Bolivia\",\"code\":\"BO\",\"phoneCode\":\"591\"},{\"name\":\"Bonaire, Saint Eustatius and Saba \",\"code\":\"BQ\",\"phoneCode\":\"599\"},{\"name\":\"Bosnia and Herzegovina\",\"code\":\"BA\",\"phoneCode\":\"387\"},{\"name\":\"Botswana\",\"code\":\"BW\",\"phoneCode\":\"267\"},{\"name\":\"Brazil\",\"code\":\"BR\",\"phoneCode\":\"55\"},{\"name\":\"British Indian Ocean Territory\",\"code\":\"IO\",\"phoneCode\":\"246\"},{\"name\":\"British Virgin Islands\",\"code\":\"VG\",\"phoneCode\":\"1284\"},{\"name\":\"Brunei\",\"code\":\"BN\",\"phoneCode\":\"673\"},{\"name\":\"Bulgaria\",\"code\":\"BG\",\"phoneCode\":\"359\"},{\"name\":\"Burkina Faso\",\"code\":\"BF\",\"phoneCode\":\"226\"},{\"name\":\"Burundi\",\"code\":\"BI\",\"phoneCode\":\"257\"},{\"name\":\"Cambodia\",\"code\":\"KH\",\"phoneCode\":\"855\"},{\"name\":\"Cameroon\",\"code\":\"CM\",\"phoneCode\":\"237\"},{\"name\":\"Canada\",\"code\":\"CA\",\"phoneCode\":\"1\"},{\"name\":\"Cape Verde\",\"code\":\"CV\",\"phoneCode\":\"238\"},{\"name\":\"Cayman Islands\",\"code\":\"KY\",\"phoneCode\":\"1345\"},{\"name\":\"Central African Republic\",\"code\":\"CF\",\"phoneCode\":\"236\"},{\"name\":\"Chad\",\"code\":\"TD\",\"phoneCode\":\"235\"},{\"name\":\"Chile\",\"code\":\"CL\",\"phoneCode\":\"56\"},{\"name\":\"China\",\"code\":\"CN\",\"phoneCode\":\"86\"},{\"name\":\"Christmas Island\",\"code\":\"CX\",\"phoneCode\":\"61\"},{\"name\":\"Cocos Islands\",\"code\":\"CC\",\"phoneCode\":\"61\"},{\"name\":\"Colombia\",\"code\":\"CO\",\"phoneCode\":\"57\"},{\"name\":\"Comoros\",\"code\":\"KM\",\"phoneCode\":\"269\"},{\"name\":\"Cook Islands\",\"code\":\"CK\",\"phoneCode\":\"682\"},{\"name\":\"Costa Rica\",\"code\":\"CR\",\"phoneCode\":\"506\"},{\"name\":\"Croatia\",\"code\":\"HR\",\"phoneCode\":\"385\"},{\"name\":\"Cuba\",\"code\":\"CU\",\"phoneCode\":\"53\"},{\"name\":\"Curacao\",\"code\":\"CW\",\"phoneCode\":\"599\"},{\"name\":\"Cyprus\",\"code\":\"CY\",\"phoneCode\":\"357\"},{\"name\":\"Czech Republic\",\"code\":\"CZ\",\"phoneCode\":\"420\"},{\"name\":\"Democratic Republic of the Congo\",\"code\":\"CD\",\"phoneCode\":\"243\"},{\"name\":\"Denmark\",\"code\":\"DK\",\"phoneCode\":\"45\"},{\"name\":\"Djibouti\",\"code\":\"DJ\",\"phoneCode\":\"253\"},{\"name\":\"Dominica\",\"code\":\"DM\",\"phoneCode\":\"1767\"},{\"name\":\"Dominican Republic\",\"code\":\"DO\",\"phoneCode\":\"1809 and 1829\"},{\"name\":\"East Timor\",\"code\":\"TL\",\"phoneCode\":\"670\"},{\"name\":\"Ecuador\",\"code\":\"EC\",\"phoneCode\":\"593\"},{\"name\":\"Egypt\",\"code\":\"EG\",\"phoneCode\":\"20\"},{\"name\":\"El Salvador\",\"code\":\"SV\",\"phoneCode\":\"503\"},{\"name\":\"Equatorial Guinea\",\"code\":\"GQ\",\"phoneCode\":\"240\"},{\"name\":\"Eritrea\",\"code\":\"ER\",\"phoneCode\":\"291\"},{\"name\":\"Estonia\",\"code\":\"EE\",\"phoneCode\":\"372\"},{\"name\":\"Ethiopia\",\"code\":\"ET\",\"phoneCode\":\"251\"},{\"name\":\"Falkland Islands\",\"code\":\"FK\",\"phoneCode\":\"500\"},{\"name\":\"Faroe Islands\",\"code\":\"FO\",\"phoneCode\":\"298\"},{\"name\":\"Fiji\",\"code\":\"FJ\",\"phoneCode\":\"679\"},{\"name\":\"Finland\",\"code\":\"FI\",\"phoneCode\":\"358\"},{\"name\":\"France\",\"code\":\"FR\",\"phoneCode\":\"33\"},{\"name\":\"French Guiana\",\"code\":\"GF\",\"phoneCode\":\"594\"},{\"name\":\"French Polynesia\",\"code\":\"PF\",\"phoneCode\":\"689\"},{\"name\":\"Gabon\",\"code\":\"GA\",\"phoneCode\":\"241\"},{\"name\":\"Gambia\",\"code\":\"GM\",\"phoneCode\":\"220\"},{\"name\":\"Georgia\",\"code\":\"GE\",\"phoneCode\":\"995\"},{\"name\":\"Germany\",\"code\":\"DE\",\"phoneCode\":\"49\"},{\"name\":\"Ghana\",\"code\":\"GH\",\"phoneCode\":\"233\"},{\"name\":\"Gibraltar\",\"code\":\"GI\",\"phoneCode\":\"350\"},{\"name\":\"Greece\",\"code\":\"GR\",\"phoneCode\":\"30\"},{\"name\":\"Greenland\",\"code\":\"GL\",\"phoneCode\":\"299\"},{\"name\":\"Grenada\",\"code\":\"GD\",\"phoneCode\":\"1473\"},{\"name\":\"Guadeloupe\",\"code\":\"GP\",\"phoneCode\":\"590\"},{\"name\":\"Guam\",\"code\":\"GU\",\"phoneCode\":\"1671\"},{\"name\":\"Guatemala\",\"code\":\"GT\",\"phoneCode\":\"502\"},{\"name\":\"Guernsey\",\"code\":\"GG\",\"phoneCode\":\"441481\"},{\"name\":\"Guinea\",\"code\":\"GN\",\"phoneCode\":\"224\"},{\"name\":\"Guinea-Bissau\",\"code\":\"GW\",\"phoneCode\":\"245\"},{\"name\":\"Guyana\",\"code\":\"GY\",\"phoneCode\":\"592\"},{\"name\":\"Haiti\",\"code\":\"HT\",\"phoneCode\":\"509\"},{\"name\":\"Heard Island and McDonald Islands\",\"code\":\"HM\",\"phoneCode\":\" \"},{\"name\":\"Honduras\",\"code\":\"HN\",\"phoneCode\":\"504\"},{\"name\":\"Hong Kong\",\"code\":\"HK\",\"phoneCode\":\"852\"},{\"name\":\"Hungary\",\"code\":\"HU\",\"phoneCode\":\"36\"},{\"name\":\"Iceland\",\"code\":\"IS\",\"phoneCode\":\"354\"},{\"name\":\"India\",\"code\":\"IN\",\"phoneCode\":\"91\"},{\"name\":\"Indonesia\",\"code\":\"ID\",\"phoneCode\":\"62\"},{\"name\":\"Iran\",\"code\":\"IR\",\"phoneCode\":\"98\"},{\"name\":\"Iraq\",\"code\":\"IQ\",\"phoneCode\":\"964\"},{\"name\":\"Ireland\",\"code\":\"IE\",\"phoneCode\":\"353\"},{\"name\":\"Isle of Man\",\"code\":\"IM\",\"phoneCode\":\"441624\"},{\"name\":\"Israel\",\"code\":\"IL\",\"phoneCode\":\"972\"},{\"name\":\"Italy\",\"code\":\"IT\",\"phoneCode\":\"39\"},{\"name\":\"Ivory Coast\",\"code\":\"CI\",\"phoneCode\":\"225\"},{\"name\":\"Jamaica\",\"code\":\"JM\",\"phoneCode\":\"1876\"},{\"name\":\"Japan\",\"code\":\"JP\",\"phoneCode\":\"81\"},{\"name\":\"Jersey\",\"code\":\"JE\",\"phoneCode\":\"441534\"},{\"name\":\"Jordan\",\"code\":\"JO\",\"phoneCode\":\"962\"},{\"name\":\"Kazakhstan\",\"code\":\"KZ\",\"phoneCode\":\"7\"},{\"name\":\"Kenya\",\"code\":\"KE\",\"phoneCode\":\"254\"},{\"name\":\"Kiribati\",\"code\":\"KI\",\"phoneCode\":\"686\"},{\"name\":\"Kuwait\",\"code\":\"KW\",\"phoneCode\":\"965\"},{\"name\":\"Kyrgyzstan\",\"code\":\"KG\",\"phoneCode\":\"996\"},{\"name\":\"Laos\",\"code\":\"LA\",\"phoneCode\":\"856\"},{\"name\":\"Latvia\",\"code\":\"LV\",\"phoneCode\":\"371\"},{\"name\":\"Lebanon\",\"code\":\"LB\",\"phoneCode\":\"961\"},{\"name\":\"Lesotho\",\"code\":\"LS\",\"phoneCode\":\"266\"},{\"name\":\"Liberia\",\"code\":\"LR\",\"phoneCode\":\"231\"},{\"name\":\"Libya\",\"code\":\"LY\",\"phoneCode\":\"218\"},{\"name\":\"Liechtenstein\",\"code\":\"LI\",\"phoneCode\":\"423\"},{\"name\":\"Lithuania\",\"code\":\"LT\",\"phoneCode\":\"370\"},{\"name\":\"Luxembourg\",\"code\":\"LU\",\"phoneCode\":\"352\"},{\"name\":\"Macao\",\"code\":\"MO\",\"phoneCode\":\"853\"},{\"name\":\"Macedonia\",\"code\":\"MK\",\"phoneCode\":\"389\"},{\"name\":\"Madagascar\",\"code\":\"MG\",\"phoneCode\":\"261\"},{\"name\":\"Malawi\",\"code\":\"MW\",\"phoneCode\":\"265\"},{\"name\":\"Malaysia\",\"code\":\"MY\",\"phoneCode\":\"60\"},{\"name\":\"Maldives\",\"code\":\"MV\",\"phoneCode\":\"960\"},{\"name\":\"Mali\",\"code\":\"ML\",\"phoneCode\":\"223\"},{\"name\":\"Malta\",\"code\":\"MT\",\"phoneCode\":\"356\"},{\"name\":\"Marshall Islands\",\"code\":\"MH\",\"phoneCode\":\"692\"},{\"name\":\"Martinique\",\"code\":\"MQ\",\"phoneCode\":\"596\"},{\"name\":\"Mauritania\",\"code\":\"MR\",\"phoneCode\":\"222\"},{\"name\":\"Mauritius\",\"code\":\"MU\",\"phoneCode\":\"230\"},{\"name\":\"Mayotte\",\"code\":\"YT\",\"phoneCode\":\"262\"},{\"name\":\"Mexico\",\"code\":\"MX\",\"phoneCode\":\"52\"},{\"name\":\"Micronesia\",\"code\":\"FM\",\"phoneCode\":\"691\"},{\"name\":\"Moldova\",\"code\":\"MD\",\"phoneCode\":\"373\"},{\"name\":\"Monaco\",\"code\":\"MC\",\"phoneCode\":\"377\"},{\"name\":\"Mongolia\",\"code\":\"MN\",\"phoneCode\":\"976\"},{\"name\":\"Montenegro\",\"code\":\"ME\",\"phoneCode\":\"382\"},{\"name\":\"Montserrat\",\"code\":\"MS\",\"phoneCode\":\"1664\"},{\"name\":\"Morocco\",\"code\":\"MA\",\"phoneCode\":\"212\"},{\"name\":\"Mozambique\",\"code\":\"MZ\",\"phoneCode\":\"258\"},{\"name\":\"Myanmar\",\"code\":\"MM\",\"phoneCode\":\"95\"},{\"name\":\"Namibia\",\"code\":\"NA\",\"phoneCode\":\"264\"},{\"name\":\"Nauru\",\"code\":\"NR\",\"phoneCode\":\"674\"},{\"name\":\"Nepal\",\"code\":\"NP\",\"phoneCode\":\"977\"},{\"name\":\"Netherlands\",\"code\":\"NL\",\"phoneCode\":\"31\"},{\"name\":\"New Caledonia\",\"code\":\"NC\",\"phoneCode\":\"687\"},{\"name\":\"New Zealand\",\"code\":\"NZ\",\"phoneCode\":\"64\"},{\"name\":\"Nicaragua\",\"code\":\"NI\",\"phoneCode\":\"505\"},{\"name\":\"Niger\",\"code\":\"NE\",\"phoneCode\":\"227\"},{\"name\":\"Nigeria\",\"code\":\"NG\",\"phoneCode\":\"234\"},{\"name\":\"Niue\",\"code\":\"NU\",\"phoneCode\":\"683\"},{\"name\":\"Norfolk Island\",\"code\":\"NF\",\"phoneCode\":\"672\"},{\"name\":\"North Korea\",\"code\":\"KP\",\"phoneCode\":\"850\"},{\"name\":\"Northern Mariana Islands\",\"code\":\"MP\",\"phoneCode\":\"1670\"},{\"name\":\"Norway\",\"code\":\"NO\",\"phoneCode\":\"47\"},{\"name\":\"Oman\",\"code\":\"OM\",\"phoneCode\":\"968\"},{\"name\":\"Pakistan\",\"code\":\"PK\",\"phoneCode\":\"92\"},{\"name\":\"Palau\",\"code\":\"PW\",\"phoneCode\":\"680\"},{\"name\":\"Palestinian Territory\",\"code\":\"PS\",\"phoneCode\":\"970\"},{\"name\":\"Panama\",\"code\":\"PA\",\"phoneCode\":\"507\"},{\"name\":\"Papua New Guinea\",\"code\":\"PG\",\"phoneCode\":\"675\"},{\"name\":\"Paraguay\",\"code\":\"PY\",\"phoneCode\":\"595\"},{\"name\":\"Peru\",\"code\":\"PE\",\"phoneCode\":\"51\"},{\"name\":\"Philippines\",\"code\":\"PH\",\"phoneCode\":\"63\"},{\"name\":\"Pitcairn\",\"code\":\"PN\",\"phoneCode\":\"870\"},{\"name\":\"Poland\",\"code\":\"PL\",\"phoneCode\":\"48\"},{\"name\":\"Portugal\",\"code\":\"PT\",\"phoneCode\":\"351\"},{\"name\":\"Puerto Rico\",\"code\":\"PR\",\"phoneCode\":\"1787 and 1939\"},{\"name\":\"Qatar\",\"code\":\"QA\",\"phoneCode\":\"974\"},{\"name\":\"Republic of the Congo\",\"code\":\"CG\",\"phoneCode\":\"242\"},{\"name\":\"Reunion\",\"code\":\"RE\",\"phoneCode\":\"262\"},{\"name\":\"Romania\",\"code\":\"RO\",\"phoneCode\":\"40\"},{\"name\":\"Russia\",\"code\":\"RU\",\"phoneCode\":\"7\"},{\"name\":\"Rwanda\",\"code\":\"RW\",\"phoneCode\":\"250\"},{\"name\":\"Saint Barthelemy\",\"code\":\"BL\",\"phoneCode\":\"590\"},{\"name\":\"Saint Helena\",\"code\":\"SH\",\"phoneCode\":\"290\"},{\"name\":\"Saint Kitts and Nevis\",\"code\":\"KN\",\"phoneCode\":\"1869\"},{\"name\":\"Saint Lucia\",\"code\":\"LC\",\"phoneCode\":\"1758\"},{\"name\":\"Saint Martin\",\"code\":\"MF\",\"phoneCode\":\"590\"},{\"name\":\"Saint Pierre and Miquelon\",\"code\":\"PM\",\"phoneCode\":\"508\"},{\"name\":\"Saint Vincent and the Grenadines\",\"code\":\"VC\",\"phoneCode\":\"1784\"},{\"name\":\"Samoa\",\"code\":\"WS\",\"phoneCode\":\"685\"},{\"name\":\"San Marino\",\"code\":\"SM\",\"phoneCode\":\"378\"},{\"name\":\"Sao Tome and Principe\",\"code\":\"ST\",\"phoneCode\":\"239\"},{\"name\":\"Saudi Arabia\",\"code\":\"SA\",\"phoneCode\":\"966\"},{\"name\":\"Senegal\",\"code\":\"SN\",\"phoneCode\":\"221\"},{\"name\":\"Serbia\",\"code\":\"RS\",\"phoneCode\":\"381\"},{\"name\":\"Seychelles\",\"code\":\"SC\",\"phoneCode\":\"248\"},{\"name\":\"Sierra Leone\",\"code\":\"SL\",\"phoneCode\":\"232\"},{\"name\":\"Singapore\",\"code\":\"SG\",\"phoneCode\":\"65\"},{\"name\":\"Sint Maarten\",\"code\":\"SX\",\"phoneCode\":\"599\"},{\"name\":\"Slovakia\",\"code\":\"SK\",\"phoneCode\":\"421\"},{\"name\":\"Slovenia\",\"code\":\"SI\",\"phoneCode\":\"386\"},{\"name\":\"Solomon Islands\",\"code\":\"SB\",\"phoneCode\":\"677\"},{\"name\":\"Somalia\",\"code\":\"SO\",\"phoneCode\":\"252\"},{\"name\":\"South Africa\",\"code\":\"ZA\",\"phoneCode\":\"27\"},{\"name\":\"South Korea\",\"code\":\"KR\",\"phoneCode\":\"82\"},{\"name\":\"South Sudan\",\"code\":\"SS\",\"phoneCode\":\"211\"},{\"name\":\"Spain\",\"code\":\"ES\",\"phoneCode\":\"34\"},{\"name\":\"Sri Lanka\",\"code\":\"LK\",\"phoneCode\":\"94\"},{\"name\":\"Sudan\",\"code\":\"SD\",\"phoneCode\":\"249\"},{\"name\":\"Suriname\",\"code\":\"SR\",\"phoneCode\":\"597\"},{\"name\":\"Svalbard and Jan Mayen\",\"code\":\"SJ\",\"phoneCode\":\"47\"},{\"name\":\"Swaziland\",\"code\":\"SZ\",\"phoneCode\":\"268\"},{\"name\":\"Sweden\",\"code\":\"SE\",\"phoneCode\":\"46\"},{\"name\":\"Switzerland\",\"code\":\"CH\",\"phoneCode\":\"41\"},{\"name\":\"Syria\",\"code\":\"SY\",\"phoneCode\":\"963\"},{\"name\":\"Taiwan\",\"code\":\"TW\",\"phoneCode\":\"886\"},{\"name\":\"Tajikistan\",\"code\":\"TJ\",\"phoneCode\":\"992\"},{\"name\":\"Tanzania\",\"code\":\"TZ\",\"phoneCode\":\"255\"},{\"name\":\"Thailand\",\"code\":\"TH\",\"phoneCode\":\"66\"},{\"name\":\"Togo\",\"code\":\"TG\",\"phoneCode\":\"228\"},{\"name\":\"Tokelau\",\"code\":\"TK\",\"phoneCode\":\"690\"},{\"name\":\"Tonga\",\"code\":\"TO\",\"phoneCode\":\"676\"},{\"name\":\"Trinidad and Tobago\",\"code\":\"TT\",\"phoneCode\":\"1868\"},{\"name\":\"Tunisia\",\"code\":\"TN\",\"phoneCode\":\"216\"},{\"name\":\"Turkey\",\"code\":\"TR\",\"phoneCode\":\"90\"},{\"name\":\"Turkmenistan\",\"code\":\"TM\",\"phoneCode\":\"993\"},{\"name\":\"Turks and Caicos Islands\",\"code\":\"TC\",\"phoneCode\":\"1649\"},{\"name\":\"Tuvalu\",\"code\":\"TV\",\"phoneCode\":\"688\"},{\"name\":\"U.S. Virgin Islands\",\"code\":\"VI\",\"phoneCode\":\"1340\"},{\"name\":\"Uganda\",\"code\":\"UG\",\"phoneCode\":\"256\"},{\"name\":\"Ukraine\",\"code\":\"UA\",\"phoneCode\":\"380\"},{\"name\":\"United Arab Emirates\",\"code\":\"AE\",\"phoneCode\":\"971\"},{\"name\":\"United Kingdom\",\"code\":\"GB\",\"phoneCode\":\"44\"},{\"name\":\"United States\",\"code\":\"US\",\"phoneCode\":\"1\"},{\"name\":\"United States Minor Outlying Islands\",\"code\":\"UM\",\"phoneCode\":\"1\"},{\"name\":\"Uruguay\",\"code\":\"UY\",\"phoneCode\":\"598\"},{\"name\":\"Uzbekistan\",\"code\":\"UZ\",\"phoneCode\":\"998\"},{\"name\":\"Vanuatu\",\"code\":\"VU\",\"phoneCode\":\"678\"},{\"name\":\"Vatican\",\"code\":\"VA\",\"phoneCode\":\"379\"},{\"name\":\"Venezuela\",\"code\":\"VE\",\"phoneCode\":\"58\"},{\"name\":\"Vietnam\",\"code\":\"VN\",\"phoneCode\":\"84\"},{\"name\":\"Wallis and Futuna\",\"code\":\"WF\",\"phoneCode\":\"681\"},{\"name\":\"Western Sahara\",\"code\":\"EH\",\"phoneCode\":\"212\"},{\"name\":\"Yemen\",\"code\":\"YE\",\"phoneCode\":\"967\"},{\"name\":\"Zambia\",\"code\":\"ZM\",\"phoneCode\":\"260\"},{\"name\":\"Zimbabwe\",\"code\":\"ZW\",\"phoneCode\":\"263\"}]"
}
],
"filteredModules": 0,
"logging": {
"webpack.buildChunkGraph.visitModules": {
"entries": [],
"filteredEntries": 2,
"debug": false
}
},
"children": [
{
"errors": [],
"warnings": [],
"publicPath": "",
"outputPath": "/Users/kuzmenko/Documents/projects/tweb/public",
"assetsByChunkName": {
"main": "c05c8d5242c7b2494d71.worker.js"
},
"assets": [
{
"name": "c05c8d5242c7b2494d71.worker.js",
"size": 105265,
"chunks": [
0
],
"chunkNames": [
"main"
],
"info": {
"immutable": true
},
"emitted": true
}
],
"filteredAssets": 0,
"entrypoints": {
"main": {
"chunks": [
0
],
"assets": [
"c05c8d5242c7b2494d71.worker.js"
],
"children": {},
"childAssets": {}
}
},
"namedChunkGroups": {
"main": {
"chunks": [
0
],
"assets": [
"c05c8d5242c7b2494d71.worker.js"
],
"children": {},
"childAssets": {}
}
},
"chunks": [
{
"id": 0,
"rendered": true,
"initial": true,
"entry": true,
"size": 286596,
"names": [
"main"
],
"files": [
"c05c8d5242c7b2494d71.worker.js"
],
"hash": "22b0f9e2f0d2c12a6943",
"siblings": [],
"parents": [],
"children": [],
"childrenByOrder": {},
"modules": [
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"index": 1,
"index2": 6,
"size": 28692,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"issuerId": 1,
"issuerName": "./src/lib/crypto.worker.js",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
}
],
"profile": {
"factory": 0,
"building": 1220
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony side effect evaluation",
"userRequest": "./bin_utils",
"loc": "18:0-19:66"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "27:15-35"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "31:15-26"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "35:15-27"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "39:15-29"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "43:15-29"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "47:15-26"
}
],
"usedExports": [
"aesDecryptSync",
"aesEncryptSync",
"bytesModPow",
"hash_pbkdf2",
"pqPrimeFactorization",
"sha1HashSync"
],
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar jsbn_1 = require(\"jsbn\");\n// @ts-ignore\nvar Rusha = __importStar(require(\"rusha/dist/rusha.min.js\"));\nvar leemon_1 = require(\"leemon\");\n//import CryptoJS from 'crypto-js';\n// @ts-ignore\nvar pako_inflate_min_js_1 = __importDefault(require(\"pako/dist/pako_inflate.min.js\"));\nvar CryptoJS = require(\"./crypto.js\");\nrequire(\"./closure_long.js\");\nvar goog = this.goog;\nfunction bigint(num) {\n return new jsbn_1.BigInteger(num.toString(16), 16);\n}\nexports.bigint = bigint;\nfunction bigStringInt(strNum) {\n return new jsbn_1.BigInteger(strNum, 10);\n}\nexports.bigStringInt = bigStringInt;\n/* export function dHexDump (bytes) {\n var arr = []\n for (var i = 0; i < bytes.length; i++) {\n if (i && !(i % 2)) {\n if (!(i % 16)) {\n arr.push('\\n')\n } else if (!(i % 4)) {\n arr.push(' ')\n } else {\n arr.push(' ')\n }\n }\n arr.push((bytes[i] < 16 ? '0' : '') + bytes[i].toString(16))\n }\n\n console.log(arr.join(''))\n} */\nfunction bytesToHex(bytes) {\n bytes = bytes || [];\n var arr = [];\n for (var i = 0; i < bytes.length; i++) {\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\n }\n return arr.join('');\n}\nexports.bytesToHex = bytesToHex;\nfunction bytesFromHex(hexString) {\n var len = hexString.length, i;\n var start = 0;\n var bytes = [];\n if (hexString.length % 2) {\n bytes.push(parseInt(hexString.charAt(0), 16));\n start++;\n }\n for (i = start; i < len; i += 2) {\n bytes.push(parseInt(hexString.substr(i, 2), 16));\n }\n return bytes;\n}\nexports.bytesFromHex = bytesFromHex;\nfunction bytesToBase64(bytes) {\n var mod3;\n var result = '';\n for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if (mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(uint6ToBase64(nUint24 >>> 18 & 63), uint6ToBase64(nUint24 >>> 12 & 63), uint6ToBase64(nUint24 >>> 6 & 63), uint6ToBase64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n return result.replace(/A(?=A$|$)/g, '=');\n}\nexports.bytesToBase64 = bytesToBase64;\nfunction uint6ToBase64(nUint6) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\nexports.uint6ToBase64 = uint6ToBase64;\nfunction base64ToBlob(base64str, mimeType) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return blobConstruct(byteArrays, mimeType);\n}\nexports.base64ToBlob = base64ToBlob;\nfunction dataUrlToBlob(url) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n}\nexports.dataUrlToBlob = dataUrlToBlob;\nfunction blobConstruct(blobParts, mimeType) {\n if (mimeType === void 0) { mimeType = ''; }\n var blob;\n var safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, { type: safeMimeType });\n }\n catch (e) {\n // @ts-ignore\n var bb = new BlobBuilder;\n blobParts.forEach(function (blobPart) {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\nexports.blobConstruct = blobConstruct;\nfunction blobSafeMimeType(mimeType) {\n if ([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n ].indexOf(mimeType) == -1) {\n return 'application/octet-stream';\n }\n return mimeType;\n}\nexports.blobSafeMimeType = blobSafeMimeType;\nfunction bytesCmp(bytes1, bytes2) {\n var len = bytes1.length;\n if (len != bytes2.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (bytes1[i] != bytes2[i]) {\n return false;\n }\n }\n return true;\n}\nexports.bytesCmp = bytesCmp;\nfunction bytesXor(bytes1, bytes2) {\n var len = bytes1.length;\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n return bytes;\n}\nexports.bytesXor = bytesXor;\nfunction bytesToWords(bytes) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n var words = [];\n var i;\n for (i = 0; i < len; i++) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n return new CryptoJS.lib.WordArray.init(words, len);\n}\nfunction bytesFromWords(wordArray) {\n var words = wordArray.words;\n var sigBytes = wordArray.sigBytes;\n var bytes = [];\n for (var i = 0; i < sigBytes; i++) {\n bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return bytes;\n}\nfunction bytesFromBigInt(bigInt, len) {\n var bytes = bigInt.toByteArray();\n if (len && bytes.length < len) {\n var padding = [];\n for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n }\n else {\n bytes = padding.concat(bytes);\n }\n }\n else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n return bytes;\n}\nexports.bytesFromBigInt = bytesFromBigInt;\nfunction bytesFromLeemonBigInt(bigInt) {\n var str = leemon_1.bigInt2str(bigInt, 16);\n return bytesFromHex(str);\n}\nexports.bytesFromLeemonBigInt = bytesFromLeemonBigInt;\nfunction bytesToArrayBuffer(b) {\n return (new Uint8Array(b)).buffer;\n}\nexports.bytesToArrayBuffer = bytesToArrayBuffer;\nfunction convertToArrayBuffer(bytes) {\n // Be careful with converting subarrays!!\n if (bytes instanceof ArrayBuffer) {\n return bytes;\n }\n if (bytes.buffer !== undefined &&\n bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n return bytes.buffer;\n }\n return bytesToArrayBuffer(bytes);\n}\nexports.convertToArrayBuffer = convertToArrayBuffer;\nfunction convertToUint8Array(bytes) {\n if (bytes.buffer !== undefined) {\n return bytes;\n }\n return new Uint8Array(bytes);\n}\nexports.convertToUint8Array = convertToUint8Array;\nfunction convertToByteArray(bytes) {\n if (Array.isArray(bytes)) {\n return bytes;\n }\n bytes = convertToUint8Array(bytes);\n var newBytes = [];\n for (var i = 0, len = bytes.length; i < len; i++) {\n newBytes.push(bytes[i]);\n }\n return newBytes;\n}\nexports.convertToByteArray = convertToByteArray;\nfunction bytesFromArrayBuffer(buffer) {\n var len = buffer.byteLength;\n var byteView = new Uint8Array(buffer);\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = byteView[i];\n }\n return bytes;\n}\nexports.bytesFromArrayBuffer = bytesFromArrayBuffer;\nfunction bufferConcat(buffer1, buffer2) {\n var l1 = buffer1.byteLength || buffer1.length;\n var l2 = buffer2.byteLength || buffer2.length;\n var tmp = new Uint8Array(l1 + l2);\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\n return tmp.buffer;\n}\nexports.bufferConcat = bufferConcat;\nfunction bufferConcats() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var length = 0;\n args.forEach(function (b) { return length += b.byteLength || b.length; });\n var tmp = new Uint8Array(length);\n var lastLength = 0;\n args.forEach(function (b) {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += b.byteLength || b.length;\n });\n return tmp /* .buffer */;\n}\nexports.bufferConcats = bufferConcats;\nfunction longToInts(sLong) {\n var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000));\n return [divRem[0].intValue(), divRem[1].intValue()];\n}\nexports.longToInts = longToInts;\nfunction longToBytes(sLong) {\n return bytesFromWords({ words: longToInts(sLong), sigBytes: 8 }).reverse();\n}\nexports.longToBytes = longToBytes;\nfunction longFromInts(high, low) {\n return bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n}\nexports.longFromInts = longFromInts;\nfunction intToUint(val) {\n if (typeof (val) === 'string')\n val = parseInt(val);\n if (val < 0) {\n val = val + 4294967296;\n }\n return val;\n}\nexports.intToUint = intToUint;\nfunction uintToInt(val) {\n if (val > 2147483647) {\n val = val - 4294967296;\n }\n return val;\n}\nexports.uintToInt = uintToInt;\nfunction sha1HashSync(bytes) {\n var hash = Rusha.createHash();\n hash.update(bytes);\n var hashBytes = hash.digest();\n //console.log('sha1HashSync', bytes, hashBytes);\n //rushaInstance = rushaInstance || new Rusha(1024 * 1024);\n // console.log(dT(), 'SHA-1 hash start', bytes.byteLength || bytes.length)\n /* var hashBytes = rushaInstance.rawDigest(bytes).buffer; */\n // console.log(dT(), 'SHA-1 hash finish')\n return hashBytes;\n}\nexports.sha1HashSync = sha1HashSync;\nfunction sha1BytesSync(bytes) {\n return bytesFromArrayBuffer(sha1HashSync(bytes));\n}\nexports.sha1BytesSync = sha1BytesSync;\nfunction sha256HashSync(bytes) {\n // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length)\n var hashWords = CryptoJS.SHA256(bytesToWords(bytes));\n // console.log(dT(), 'SHA-2 hash finish')\n var hashBytes = bytesFromWords(hashWords);\n return hashBytes;\n}\nexports.sha256HashSync = sha256HashSync;\nfunction rsaEncrypt(publicKey, bytes) {\n bytes = addPadding(bytes, 255);\n // console.log('RSA encrypt start')\n var N = new jsbn_1.BigInteger(publicKey.modulus, 16);\n var E = new jsbn_1.BigInteger(publicKey.exponent, 16);\n var X = new jsbn_1.BigInteger(bytes);\n var encryptedBigInt = X.modPowInt(E, N), encryptedBytes = bytesFromBigInt(encryptedBigInt, 256);\n // console.log('RSA encrypt finish')\n return encryptedBytes;\n}\nexports.rsaEncrypt = rsaEncrypt;\nfunction addPadding(bytes, blockSize, zeroes, full) {\n if (full === void 0) { full = false; }\n blockSize = blockSize || 16;\n var len = bytes.byteLength || bytes.length;\n var needPadding = blockSize - (len % blockSize);\n if (needPadding > 0 && (needPadding < blockSize || full)) {\n var padding = new Array(needPadding);\n if (zeroes) {\n for (var i = 0; i < needPadding; i++) {\n padding[i] = 0;\n }\n }\n else {\n (new jsbn_1.SecureRandom()).nextBytes(padding);\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(bytes, padding);\n }\n else {\n bytes = bytes.concat(padding);\n }\n }\n return bytes;\n}\nexports.addPadding = addPadding;\nfunction aesEncryptSync(bytes, keyBytes, ivBytes) {\n var len = bytes.byteLength || bytes.length;\n // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/)\n bytes = addPadding(bytes);\n var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n }).ciphertext;\n var encryptedBytes = bytesFromWords(encryptedWords);\n // console.log(dT(), 'AES encrypt finish')\n return encryptedBytes;\n}\nexports.aesEncryptSync = aesEncryptSync;\nfunction aesDecryptSync(encryptedBytes, keyBytes, ivBytes) {\n // console.log(dT(), 'AES decrypt start', encryptedBytes.length)\n var decryptedWords = CryptoJS.AES.decrypt({ ciphertext: bytesToWords(encryptedBytes) }, bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n });\n var bytes = bytesFromWords(decryptedWords);\n // console.log(dT(), 'AES decrypt finish')\n return bytes;\n}\nexports.aesDecryptSync = aesDecryptSync;\nfunction getDerivation(hash, salt, password, iterations, keyLength) {\n if (hash === void 0) { hash = 'SHA-512'; }\n return __awaiter(this, void 0, void 0, function () {\n var passwordBuffer, importedKey, saltBuffer, params, derivation;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n passwordBuffer = password;\n return [4 /*yield*/, crypto.subtle.importKey(\"raw\", passwordBuffer, \"PBKDF2\", false, [\"deriveBits\", 'deriveKey'])];\n case 1:\n importedKey = _a.sent();\n saltBuffer = salt /* textEncoder.encode(salt); */;\n params = { name: \"PBKDF2\", hash: hash, salt: saltBuffer, iterations: iterations };\n return [4 /*yield*/, crypto.subtle.deriveBits(params, importedKey, keyLength * 8)];\n case 2:\n derivation = _a.sent();\n return [2 /*return*/, derivation];\n }\n });\n });\n}\nfunction getKey(derivation) {\n return __awaiter(this, void 0, void 0, function () {\n var ivlen, keylen, derivedKey, iv, importedEncryptionKey;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n ivlen = 16;\n keylen = 32;\n derivedKey = derivation.slice(0, keylen);\n iv = derivation.slice(-ivlen);\n return [4 /*yield*/, crypto.subtle.importKey('raw', derivedKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt'])];\n case 1:\n importedEncryptionKey = _a.sent();\n return [2 /*return*/, {\n key: importedEncryptionKey,\n iv: iv\n }];\n }\n });\n });\n}\nfunction encrypt(text, keyObject) {\n return __awaiter(this, void 0, void 0, function () {\n var textBuffer, encryptedText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n textBuffer = text;\n return [4 /*yield*/, crypto.subtle.encrypt({ name: 'AES-CBC', iv: keyObject.iv }, keyObject.key, textBuffer)];\n case 1:\n encryptedText = _a.sent();\n return [2 /*return*/, encryptedText];\n }\n });\n });\n}\n/* import * as crypto from 'crypto'; */\nfunction hash_pbkdf2(/* hasher: 'string', */ buffer, salt, iterations) {\n return __awaiter(this, void 0, void 0, function () {\n var importKey, deriveKey, bits;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, window.crypto.subtle.importKey(\"raw\", //only \"raw\" is allowed\n buffer, //your password\n {\n name: \"PBKDF2\",\n }, false, //whether the key is extractable (i.e. can be used in exportKey)\n [\"deriveKey\", \"deriveBits\"] //can be any combination of \"deriveKey\" and \"deriveBits\"\n )];\n case 1:\n importKey = _a.sent();\n return [4 /*yield*/, window.crypto.subtle.deriveKey({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n {\n name: \"AES-CTR\",\n //the generateKey parameters for that type of algorithm\n length: 256,\n }, false, //whether the derived key is extractable (i.e. can be used in exportKey)\n [\"encrypt\", \"decrypt\"] //limited to the options in that algorithm's importKey\n )];\n case 2:\n deriveKey = _a.sent();\n bits = window.crypto.subtle.deriveBits({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n 512 //the number of bits you want to derive\n );\n return [2 /*return*/, bits];\n }\n });\n });\n}\nexports.hash_pbkdf2 = hash_pbkdf2;\nfunction gzipUncompress(bytes, toString) {\n // console.log('Gzip uncompress start')\n // @ts-ignore\n //var result = (new Zlib.Gunzip(bytes)).decompress();\n var result = pako_inflate_min_js_1.default.inflate(bytes, toString ? { to: 'string' } : undefined);\n // console.log('Gzip uncompress finish')\n return result;\n}\nexports.gzipUncompress = gzipUncompress;\nfunction nextRandomInt(maxValue) {\n return Math.floor(Math.random() * maxValue);\n}\nexports.nextRandomInt = nextRandomInt;\nfunction pqPrimeFactorization(pqBytes) {\n var what = new jsbn_1.BigInteger(pqBytes);\n var result = false;\n // console.log(dT(), 'PQ start', pqBytes, what.toString(16), what.bitLength())\n try {\n result = pqPrimeLeemon(leemon_1.str2bigInt(what.toString(16), 16, Math.ceil(64 / leemon_1.bpe) + 1));\n }\n catch (e) {\n console.error('Pq leemon Exception', e);\n }\n if (result === false && what.bitLength() <= 64) {\n // console.time('PQ long')\n try {\n result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16));\n }\n catch (e) {\n console.error('Pq long Exception', e);\n }\n // console.timeEnd('PQ long')\n }\n // console.log(result)\n if (result === false) {\n // console.time('pq BigInt')\n result = pqPrimeBigInteger(what);\n // console.timeEnd('pq BigInt')\n }\n // console.log(dT(), 'PQ finish')\n return result;\n}\nexports.pqPrimeFactorization = pqPrimeFactorization;\nfunction pqPrimeBigInteger(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = (nextRandomInt(128) & 15) + 17;\n var x = bigint(nextRandomInt(1000000000) + 1);\n var y = x.clone();\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x.clone();\n var b = x.clone();\n var c = bigint(q);\n while (!b.equals(jsbn_1.BigInteger.ZERO)) {\n if (!b.and(jsbn_1.BigInteger.ONE).equals(jsbn_1.BigInteger.ZERO)) {\n c = c.add(a);\n if (c.compareTo(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compareTo(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c.clone();\n var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = z.gcd(what);\n if (!g.equals(jsbn_1.BigInteger.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x.clone();\n }\n }\n if (g.compareTo(jsbn_1.BigInteger.ONE) > 0) {\n break;\n }\n }\n var f = what.divide(g), P, Q;\n if (g.compareTo(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromBigInt(P), bytesFromBigInt(Q), it];\n}\nexports.pqPrimeBigInteger = pqPrimeBigInteger;\nfunction gcdLong(a, b) {\n while (a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) {\n while (b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n b = b.shiftRight(1);\n }\n while (a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n a = a.shiftRight(1);\n }\n if (a.compare(b) > 0) {\n a = a.subtract(b);\n }\n else {\n b = b.subtract(a);\n }\n }\n return b.equals(goog.math.Long.ZERO) ? a : b;\n}\nexports.gcdLong = gcdLong;\nfunction pqPrimeLong(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17);\n var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1);\n var y = x;\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x;\n var b = x;\n var c = q;\n while (b.notEquals(goog.math.Long.ZERO)) {\n if (b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) {\n c = c.add(a);\n if (c.compare(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compare(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c;\n var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = gcdLong(z, what);\n if (g.notEquals(goog.math.Long.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x;\n }\n }\n if (g.compare(goog.math.Long.ONE) > 0) {\n break;\n }\n }\n var f = what.div(g), P, Q;\n if (g.compare(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it];\n}\nexports.pqPrimeLong = pqPrimeLong;\nfunction pqPrimeLeemon(what) {\n var minBits = 64;\n var minLen = Math.ceil(minBits / leemon_1.bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n for (i = 0; i < 3; i++) {\n q = (nextRandomInt(128) & 15) + 17;\n leemon_1.copyInt_(x, nextRandomInt(1000000000) + 1);\n leemon_1.copy_(y, x);\n lim = 1 << (i + 18);\n for (j = 1; j < lim; j++) {\n ++it;\n leemon_1.copy_(a, x);\n leemon_1.copy_(b, x);\n leemon_1.copyInt_(c, q);\n while (!leemon_1.isZero(b)) {\n if (b[0] & 1) {\n leemon_1.add_(c, a);\n if (leemon_1.greater(c, what)) {\n leemon_1.sub_(c, what);\n }\n }\n leemon_1.add_(a, a);\n if (leemon_1.greater(a, what)) {\n leemon_1.sub_(a, what);\n }\n leemon_1.rightShift_(b, 1);\n }\n leemon_1.copy_(x, c);\n if (leemon_1.greater(x, y)) {\n leemon_1.copy_(z, x);\n leemon_1.sub_(z, y);\n }\n else {\n leemon_1.copy_(z, y);\n leemon_1.sub_(z, x);\n }\n leemon_1.eGCD_(z, what, g, a, b);\n if (!leemon_1.equalsInt(g, 1)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n leemon_1.copy_(y, x);\n }\n }\n if (leemon_1.greater(g, leemon_1.one)) {\n break;\n }\n }\n leemon_1.divide_(what, g, x, y);\n if (leemon_1.greater(g, x)) {\n P = x;\n Q = g;\n }\n else {\n P = g;\n Q = x;\n }\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];\n}\nexports.pqPrimeLeemon = pqPrimeLeemon;\nfunction bytesModPow(x, y, m) {\n try {\n var xBigInt = leemon_1.str2bigInt(bytesToHex(x), 16);\n var yBigInt = leemon_1.str2bigInt(bytesToHex(y), 16);\n var mBigInt = leemon_1.str2bigInt(bytesToHex(m), 16);\n var resBigInt = leemon_1.powMod(xBigInt, yBigInt, mBigInt);\n return bytesFromHex(leemon_1.bigInt2str(resBigInt, 16));\n }\n catch (e) {\n console.error('mod pow error', e);\n }\n return bytesFromBigInt(new jsbn_1.BigInteger(x).modPow(new jsbn_1.BigInteger(y), new jsbn_1.BigInteger(m)), 256);\n}\nexports.bytesModPow = bytesModPow;\n"
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"index": 0,
"index2": 7,
"size": 1495,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": null,
"issuerId": null,
"issuerName": null,
"issuerPath": null,
"profile": {
"factory": 1,
"building": 3
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": null,
"moduleIdentifier": null,
"module": null,
"moduleName": null,
"type": "single entry",
"userRequest": "!!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"loc": "main"
}
],
"usedExports": true,
"providedExports": [],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is an entry point"
],
"depth": 0,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* importScripts(\r\n 'polyfill.js',\r\n 'bin_utils.js',\r\n '../../vendor/jsbn/jsbn_combined.js',\r\n '../../vendor/leemon_bigint/bigint.js',\r\n '../../vendor/closure/long.js',\r\n '../../vendor/cryptoJS/crypto.js',\r\n '../../vendor/rusha/rusha.js'\r\n) */\r\n\r\nimport {pqPrimeFactorization, bytesModPow, sha1HashSync,\r\n aesEncryptSync, aesDecryptSync, hash_pbkdf2} from './bin_utils';\r\n\r\nonmessage = function(e) {\r\n var taskID = e.data.taskID,\r\n result;\r\n\r\n switch(e.data.task) {\r\n case 'factorize':\r\n result = pqPrimeFactorization(e.data.bytes);\r\n break;\r\n\r\n case 'mod-pow':\r\n result = bytesModPow(e.data.x, e.data.y, e.data.m);\r\n break;\r\n\r\n case 'sha1-hash':\r\n result = sha1HashSync(e.data.bytes);\r\n break;\r\n\r\n case 'aes-encrypt':\r\n result = aesEncryptSync(e.data.bytes, e.data.keyBytes, e.data.ivBytes);\r\n break;\r\n\r\n case 'aes-decrypt':\r\n result = aesDecryptSync(e.data.encryptedBytes, e.data.keyBytes, e.data.ivBytes);\r\n break;\r\n\r\n case 'pbkdf2':\r\n result = hash_pbkdf2(e.data.buffer, e.data.salt, e.data.iterations);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown task: ' + e.data.task);\r\n }\r\n\r\n postMessage({taskID: taskID, result: result});\r\n}\r\n\r\npostMessage('ready');\r\n"
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/jsbn/index.js",
"name": "./node_modules/jsbn/index.js",
"index": 2,
"index2": 0,
"size": 42308,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "56:13-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(function(){\n\n // Copyright (c) 2005 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Basic JavaScript BN library - subset useful for RSA encryption.\n\n // Bits per digit\n var dbits;\n\n // JavaScript engine analysis\n var canary = 0xdeadbeefcafe;\n var j_lm = ((canary&0xffffff)==0xefcafe);\n\n // (public) Constructor\n function BigInteger(a,b,c) {\n if(a != null)\n if(\"number\" == typeof a) this.fromNumber(a,b,c);\n else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n else this.fromString(a,b);\n }\n\n // return new, unset BigInteger\n function nbi() { return new BigInteger(null); }\n\n // am: Compute w_j += (x*this_i), propagate carries,\n // c is initial carry, returns final carry.\n // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n // We need to select the fastest one that works in this environment.\n\n // am1: use a single mult and divide to get the high bits,\n // max digit bits should be 26 because\n // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n function am1(i,x,w,j,c,n) {\n while(--n >= 0) {\n var v = x*this[i++]+w[j]+c;\n c = Math.floor(v/0x4000000);\n w[j++] = v&0x3ffffff;\n }\n return c;\n }\n // am2 avoids a big mult-and-extract completely.\n // Max digit bits should be <= 30 because we do bitwise ops\n // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n function am2(i,x,w,j,c,n) {\n var xl = x&0x7fff, xh = x>>15;\n while(--n >= 0) {\n var l = this[i]&0x7fff;\n var h = this[i++]>>15;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n w[j++] = l&0x3fffffff;\n }\n return c;\n }\n // Alternately, set max digit bits to 28 since some\n // browsers slow down when dealing with 32-bit numbers.\n function am3(i,x,w,j,c,n) {\n var xl = x&0x3fff, xh = x>>14;\n while(--n >= 0) {\n var l = this[i]&0x3fff;\n var h = this[i++]>>14;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n c = (l>>28)+(m>>14)+xh*h;\n w[j++] = l&0xfffffff;\n }\n return c;\n }\n var inBrowser = typeof navigator !== \"undefined\";\n if(inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n BigInteger.prototype.am = am2;\n dbits = 30;\n }\n else if(inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n BigInteger.prototype.am = am1;\n dbits = 26;\n }\n else { // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n }\n\n BigInteger.prototype.DB = dbits;\n BigInteger.prototype.DM = ((1<<dbits)-1);\n BigInteger.prototype.DV = (1<<dbits);\n\n var BI_FP = 52;\n BigInteger.prototype.FV = Math.pow(2,BI_FP);\n BigInteger.prototype.F1 = BI_FP-dbits;\n BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n // Digit conversions\n var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n var BI_RC = new Array();\n var rr,vv;\n rr = \"0\".charCodeAt(0);\n for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n rr = \"a\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n rr = \"A\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n function int2char(n) { return BI_RM.charAt(n); }\n function intAt(s,i) {\n var c = BI_RC[s.charCodeAt(i)];\n return (c==null)?-1:c;\n }\n\n // (protected) copy this to r\n function bnpCopyTo(r) {\n for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n }\n\n // (protected) set from integer value x, -DV <= x < DV\n function bnpFromInt(x) {\n this.t = 1;\n this.s = (x<0)?-1:0;\n if(x > 0) this[0] = x;\n else if(x < -1) this[0] = x+this.DV;\n else this.t = 0;\n }\n\n // return bigint initialized to value\n function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n // (protected) set from string and radix\n function bnpFromString(s,b) {\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 256) k = 8; // byte array\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else { this.fromRadix(s,b); return; }\n this.t = 0;\n this.s = 0;\n var i = s.length, mi = false, sh = 0;\n while(--i >= 0) {\n var x = (k==8)?s[i]&0xff:intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if(sh == 0)\n this[this.t++] = x;\n else if(sh+k > this.DB) {\n this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n this[this.t++] = (x>>(this.DB-sh));\n }\n else\n this[this.t-1] |= x<<sh;\n sh += k;\n if(sh >= this.DB) sh -= this.DB;\n }\n if(k == 8 && (s[0]&0x80) != 0) {\n this.s = -1;\n if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n }\n this.clamp();\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) clamp off excess high words\n function bnpClamp() {\n var c = this.s&this.DM;\n while(this.t > 0 && this[this.t-1] == c) --this.t;\n }\n\n // (public) return string representation in given radix\n function bnToString(b) {\n if(this.s < 0) return \"-\"+this.negate().toString(b);\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n var p = this.DB-(i*this.DB)%k;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n while(i >= 0) {\n if(p < k) {\n d = (this[i]&((1<<p)-1))<<(k-p);\n d |= this[--i]>>(p+=this.DB-k);\n }\n else {\n d = (this[i]>>(p-=k))&km;\n if(p <= 0) { p += this.DB; --i; }\n }\n if(d > 0) m = true;\n if(m) r += int2char(d);\n }\n }\n return m?r:\"0\";\n }\n\n // (public) -this\n function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n // (public) |this|\n function bnAbs() { return (this.s<0)?this.negate():this; }\n\n // (public) return + if this > a, - if this < a, 0 if equal\n function bnCompareTo(a) {\n var r = this.s-a.s;\n if(r != 0) return r;\n var i = this.t;\n r = i-a.t;\n if(r != 0) return (this.s<0)?-r:r;\n while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n return 0;\n }\n\n // returns bit length of the integer x\n function nbits(x) {\n var r = 1, t;\n if((t=x>>>16) != 0) { x = t; r += 16; }\n if((t=x>>8) != 0) { x = t; r += 8; }\n if((t=x>>4) != 0) { x = t; r += 4; }\n if((t=x>>2) != 0) { x = t; r += 2; }\n if((t=x>>1) != 0) { x = t; r += 1; }\n return r;\n }\n\n // (public) return the number of bits in \"this\"\n function bnBitLength() {\n if(this.t <= 0) return 0;\n return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n }\n\n // (protected) r = this << n*DB\n function bnpDLShiftTo(n,r) {\n var i;\n for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n for(i = n-1; i >= 0; --i) r[i] = 0;\n r.t = this.t+n;\n r.s = this.s;\n }\n\n // (protected) r = this >> n*DB\n function bnpDRShiftTo(n,r) {\n for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n r.t = Math.max(this.t-n,0);\n r.s = this.s;\n }\n\n // (protected) r = this << n\n function bnpLShiftTo(n,r) {\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<cbs)-1;\n var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n for(i = this.t-1; i >= 0; --i) {\n r[i+ds+1] = (this[i]>>cbs)|c;\n c = (this[i]&bm)<<bs;\n }\n for(i = ds-1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t+ds+1;\n r.s = this.s;\n r.clamp();\n }\n\n // (protected) r = this >> n\n function bnpRShiftTo(n,r) {\n r.s = this.s;\n var ds = Math.floor(n/this.DB);\n if(ds >= this.t) { r.t = 0; return; }\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<bs)-1;\n r[0] = this[ds]>>bs;\n for(var i = ds+1; i < this.t; ++i) {\n r[i-ds-1] |= (this[i]&bm)<<cbs;\n r[i-ds] = this[i]>>bs;\n }\n if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n r.t = this.t-ds;\n r.clamp();\n }\n\n // (protected) r = this - a\n function bnpSubTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]-a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c -= a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c -= a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c<0)?-1:0;\n if(c < -1) r[i++] = this.DV+c;\n else if(c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n }\n\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyTo(a,r) {\n var x = this.abs(), y = a.abs();\n var i = x.t;\n r.t = i+y.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n r.s = 0;\n r.clamp();\n if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n }\n\n // (protected) r = this^2, r != this (HAC 14.16)\n function bnpSquareTo(r) {\n var x = this.abs();\n var i = r.t = 2*x.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < x.t-1; ++i) {\n var c = x.am(i,x[i],r,2*i,0,1);\n if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n r[i+x.t] -= x.DV;\n r[i+x.t+1] = 1;\n }\n }\n if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n r.s = 0;\n r.clamp();\n }\n\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n function bnpDivRemTo(m,q,r) {\n var pm = m.abs();\n if(pm.t <= 0) return;\n var pt = this.abs();\n if(pt.t < pm.t) {\n if(q != null) q.fromInt(0);\n if(r != null) this.copyTo(r);\n return;\n }\n if(r == null) r = nbi();\n var y = nbi(), ts = this.s, ms = m.s;\n var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus\n if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n else { pm.copyTo(y); pt.copyTo(r); }\n var ys = y.t;\n var y0 = y[ys-1];\n if(y0 == 0) return;\n var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n y.dlShiftTo(j,t);\n if(r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t,r);\n }\n BigInteger.ONE.dlShiftTo(ys,t);\n t.subTo(y,y); // \"negative\" y so we can replace sub with am later\n while(y.t < ys) y[y.t++] = 0;\n while(--j >= 0) {\n // Estimate quotient digit\n var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out\n y.dlShiftTo(j,t);\n r.subTo(t,r);\n while(r[i] < --qd) r.subTo(t,r);\n }\n }\n if(q != null) {\n r.drShiftTo(ys,q);\n if(ts != ms) BigInteger.ZERO.subTo(q,q);\n }\n r.t = ys;\n r.clamp();\n if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder\n if(ts < 0) BigInteger.ZERO.subTo(r,r);\n }\n\n // (public) this mod a\n function bnMod(a) {\n var r = nbi();\n this.abs().divRemTo(a,null,r);\n if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n return r;\n }\n\n // Modular reduction using \"classic\" algorithm\n function Classic(m) { this.m = m; }\n function cConvert(x) {\n if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n }\n function cRevert(x) { return x; }\n function cReduce(x) { x.divRemTo(this.m,null,x); }\n function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n Classic.prototype.convert = cConvert;\n Classic.prototype.revert = cRevert;\n Classic.prototype.reduce = cReduce;\n Classic.prototype.mulTo = cMulTo;\n Classic.prototype.sqrTo = cSqrTo;\n\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n // justification:\n // xy == 1 (mod m)\n // xy = 1+km\n // xy(2-xy) = (1+km)(1-km)\n // x[y(2-xy)] = 1-k^2m^2\n // x[y(2-xy)] == 1 (mod m^2)\n // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n function bnpInvDigit() {\n if(this.t < 1) return 0;\n var x = this[0];\n if((x&1) == 0) return 0;\n var y = x&3; // y == 1/x mod 2^2\n y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4\n y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8\n y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y>0)?this.DV-y:-y;\n }\n\n // Montgomery reduction\n function Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp&0x7fff;\n this.mph = this.mp>>15;\n this.um = (1<<(m.DB-15))-1;\n this.mt2 = 2*m.t;\n }\n\n // xR mod m\n function montConvert(x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t,r);\n r.divRemTo(this.m,null,r);\n if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n return r;\n }\n\n // x/R mod m\n function montRevert(x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n\n // x = x/R mod m (HAC 14.32)\n function montReduce(x) {\n while(x.t <= this.mt2) // pad x so am has enough room later\n x[x.t++] = 0;\n for(var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i]&0x7fff;\n var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i+this.m.t;\n x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n // propagate carry\n while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n }\n x.clamp();\n x.drShiftTo(this.m.t,x);\n if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = \"x^2/R mod m\"; x != r\n function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = \"xy/R mod m\"; x,y != r\n function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Montgomery.prototype.convert = montConvert;\n Montgomery.prototype.revert = montRevert;\n Montgomery.prototype.reduce = montReduce;\n Montgomery.prototype.mulTo = montMulTo;\n Montgomery.prototype.sqrTo = montSqrTo;\n\n // (protected) true iff this is even\n function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n function bnpExp(e,z) {\n if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n g.copyTo(r);\n while(--i >= 0) {\n z.sqrTo(r,r2);\n if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n else { var t = r; r = r2; r2 = t; }\n }\n return z.revert(r);\n }\n\n // (public) this^e % m, 0 <= e < 2^32\n function bnModPowInt(e,m) {\n var z;\n if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n return this.exp(e,z);\n }\n\n // protected\n BigInteger.prototype.copyTo = bnpCopyTo;\n BigInteger.prototype.fromInt = bnpFromInt;\n BigInteger.prototype.fromString = bnpFromString;\n BigInteger.prototype.clamp = bnpClamp;\n BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n BigInteger.prototype.lShiftTo = bnpLShiftTo;\n BigInteger.prototype.rShiftTo = bnpRShiftTo;\n BigInteger.prototype.subTo = bnpSubTo;\n BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n BigInteger.prototype.squareTo = bnpSquareTo;\n BigInteger.prototype.divRemTo = bnpDivRemTo;\n BigInteger.prototype.invDigit = bnpInvDigit;\n BigInteger.prototype.isEven = bnpIsEven;\n BigInteger.prototype.exp = bnpExp;\n\n // public\n BigInteger.prototype.toString = bnToString;\n BigInteger.prototype.negate = bnNegate;\n BigInteger.prototype.abs = bnAbs;\n BigInteger.prototype.compareTo = bnCompareTo;\n BigInteger.prototype.bitLength = bnBitLength;\n BigInteger.prototype.mod = bnMod;\n BigInteger.prototype.modPowInt = bnModPowInt;\n\n // \"constants\"\n BigInteger.ZERO = nbv(0);\n BigInteger.ONE = nbv(1);\n\n // Copyright (c) 2005-2009 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Extended JavaScript BN functions, required for RSA private ops.\n\n // Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n // Version 1.2: square() API, isProbablePrime fix\n\n // (public)\n function bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n // (public) return value as integer\n function bnIntValue() {\n if(this.s < 0) {\n if(this.t == 1) return this[0]-this.DV;\n else if(this.t == 0) return -1;\n }\n else if(this.t == 1) return this[0];\n else if(this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n }\n\n // (public) return value as byte\n function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n // (public) return value as short (assumes DB>=16)\n function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n // (protected) return x s.t. r^x < DV\n function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n // (public) 0 if this == 0, 1 if this > 0\n function bnSigNum() {\n if(this.s < 0) return -1;\n else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n }\n\n // (protected) convert to radix string\n function bnpToRadix(b) {\n if(b == null) b = 10;\n if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b,cs);\n var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n this.divRemTo(d,y,z);\n while(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n }\n return z.intValue().toString(b) + r;\n }\n\n // (protected) convert from radix string\n function bnpFromRadix(s,b) {\n this.fromInt(0);\n if(b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n for(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w,0);\n j = 0;\n w = 0;\n }\n }\n if(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n }\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) alternate constructor\n function bnpFromNumber(a,b,c) {\n if(\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n this.fromNumber(a,c);\n if(!this.testBit(a-1)) // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n if(this.isEven()) this.dAddOffset(1,0); // force odd\n while(!this.isProbablePrime(b)) {\n this.dAddOffset(2,0);\n if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n }\n }\n }\n else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n }\n }\n\n // (public) convert to bigendian byte array\n function bnToByteArray() {\n var i = this.t, r = new Array();\n r[0] = this.s;\n var p = this.DB-(i*this.DB)%8, d, k = 0;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n if(p < 8) {\n d = (this[i]&((1<<p)-1))<<(8-p);\n d |= this[--i]>>(p+=this.DB-8);\n }\n else {\n d = (this[i]>>(p-=8))&0xff;\n if(p <= 0) { p += this.DB; --i; }\n }\n if((d&0x80) != 0) d |= -256;\n if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n if(k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n }\n\n function bnEquals(a) { return(this.compareTo(a)==0); }\n function bnMin(a) { return(this.compareTo(a)<0)?this:a; }\n function bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n // (protected) r = this op a (bitwise)\n function bnpBitwiseTo(a,op,r) {\n var i, f, m = Math.min(a.t,this.t);\n for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n if(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n r.t = this.t;\n }\n else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n r.t = a.t;\n }\n r.s = op(this.s,a.s);\n r.clamp();\n }\n\n // (public) this & a\n function op_and(x,y) { return x&y; }\n function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n // (public) this | a\n function op_or(x,y) { return x|y; }\n function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n // (public) this ^ a\n function op_xor(x,y) { return x^y; }\n function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n // (public) this & ~a\n function op_andnot(x,y) { return x&~y; }\n function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n // (public) ~this\n function bnNot() {\n var r = nbi();\n for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n }\n\n // (public) this << n\n function bnShiftLeft(n) {\n var r = nbi();\n if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n return r;\n }\n\n // (public) this >> n\n function bnShiftRight(n) {\n var r = nbi();\n if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n return r;\n }\n\n // return index of lowest 1-bit in x, x < 2^31\n function lbit(x) {\n if(x == 0) return -1;\n var r = 0;\n if((x&0xffff) == 0) { x >>= 16; r += 16; }\n if((x&0xff) == 0) { x >>= 8; r += 8; }\n if((x&0xf) == 0) { x >>= 4; r += 4; }\n if((x&3) == 0) { x >>= 2; r += 2; }\n if((x&1) == 0) ++r;\n return r;\n }\n\n // (public) returns index of lowest 1-bit (or -1 if none)\n function bnGetLowestSetBit() {\n for(var i = 0; i < this.t; ++i)\n if(this[i] != 0) return i*this.DB+lbit(this[i]);\n if(this.s < 0) return this.t*this.DB;\n return -1;\n }\n\n // return number of 1 bits in x\n function cbit(x) {\n var r = 0;\n while(x != 0) { x &= x-1; ++r; }\n return r;\n }\n\n // (public) return number of set bits\n function bnBitCount() {\n var r = 0, x = this.s&this.DM;\n for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n return r;\n }\n\n // (public) true iff nth bit is set\n function bnTestBit(n) {\n var j = Math.floor(n/this.DB);\n if(j >= this.t) return(this.s!=0);\n return((this[j]&(1<<(n%this.DB)))!=0);\n }\n\n // (protected) this op (1<<n)\n function bnpChangeBit(n,op) {\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r,op,r);\n return r;\n }\n\n // (public) this | (1<<n)\n function bnSetBit(n) { return this.changeBit(n,op_or); }\n\n // (public) this & ~(1<<n)\n function bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n // (public) this ^ (1<<n)\n function bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n // (protected) r = this + a\n function bnpAddTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]+a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c += a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c<0)?-1:0;\n if(c > 0) r[i++] = c;\n else if(c < -1) r[i++] = this.DV+c;\n r.t = i;\n r.clamp();\n }\n\n // (public) this + a\n function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n // (public) this - a\n function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n // (public) this * a\n function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n // (public) this^2\n function bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n // (public) this / a\n function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n // (public) this % a\n function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n // (public) [this/a,this%a]\n function bnDivideAndRemainder(a) {\n var q = nbi(), r = nbi();\n this.divRemTo(a,q,r);\n return new Array(q,r);\n }\n\n // (protected) this *= n, this >= 0, 1 < n < DV\n function bnpDMultiply(n) {\n this[this.t] = this.am(0,n-1,this,0,0,this.t);\n ++this.t;\n this.clamp();\n }\n\n // (protected) this += n << w words, this >= 0\n function bnpDAddOffset(n,w) {\n if(n == 0) return;\n while(this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while(this[w] >= this.DV) {\n this[w] -= this.DV;\n if(++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n }\n\n // A \"null\" reducer\n function NullExp() {}\n function nNop(x) { return x; }\n function nMulTo(x,y,r) { x.multiplyTo(y,r); }\n function nSqrTo(x,r) { x.squareTo(r); }\n\n NullExp.prototype.convert = nNop;\n NullExp.prototype.revert = nNop;\n NullExp.prototype.mulTo = nMulTo;\n NullExp.prototype.sqrTo = nSqrTo;\n\n // (public) this^e\n function bnPow(e) { return this.exp(e,new NullExp()); }\n\n // (protected) r = lower n words of \"this * a\", a.t <= n\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyLowerTo(a,n,r) {\n var i = Math.min(this.t+a.t,n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while(i > 0) r[--i] = 0;\n var j;\n for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n r.clamp();\n }\n\n // (protected) r = \"this * a\" without lower n words, n > 0\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyUpperTo(a,n,r) {\n --n;\n var i = r.t = this.t+a.t-n;\n r.s = 0; // assumes a,this >= 0\n while(--i >= 0) r[i] = 0;\n for(i = Math.max(n-this.t,0); i < a.t; ++i)\n r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n r.clamp();\n r.drShiftTo(1,r);\n }\n\n // Barrett modular reduction\n function Barrett(m) {\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n }\n\n function barrettConvert(x) {\n if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n else if(x.compareTo(this.m) < 0) return x;\n else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n }\n\n function barrettRevert(x) { return x; }\n\n // x = x mod m (HAC 14.42)\n function barrettReduce(x) {\n x.drShiftTo(this.m.t-1,this.r2);\n if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n x.subTo(this.r2,x);\n while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = x^2 mod m; x != r\n function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = x*y mod m; x,y != r\n function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Barrett.prototype.convert = barrettConvert;\n Barrett.prototype.revert = barrettRevert;\n Barrett.prototype.reduce = barrettReduce;\n Barrett.prototype.mulTo = barrettMulTo;\n Barrett.prototype.sqrTo = barrettSqrTo;\n\n // (public) this^e % m (HAC 14.85)\n function bnModPow(e,m) {\n var i = e.bitLength(), k, r = nbv(1), z;\n if(i <= 0) return r;\n else if(i < 18) k = 1;\n else if(i < 48) k = 3;\n else if(i < 144) k = 4;\n else if(i < 768) k = 5;\n else k = 6;\n if(i < 8)\n z = new Classic(m);\n else if(m.isEven())\n z = new Barrett(m);\n else\n z = new Montgomery(m);\n\n // precomputation\n var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n g[1] = z.convert(this);\n if(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n g[n] = nbi();\n z.mulTo(g2,g[n-2],g[n]);\n n += 2;\n }\n }\n\n var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n i = nbits(e[j])-1;\n while(j >= 0) {\n if(i >= k1) w = (e[j]>>(i-k1))&km;\n else {\n w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else {\n while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e[j]&(1<<i)) == 0) {\n z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n if(--i < 0) { i = this.DB-1; --j; }\n }\n }\n return z.revert(r);\n }\n\n // (public) gcd(this,a) (HAC 14.54)\n function bnGCD(a) {\n var x = (this.s<0)?this.negate():this.clone();\n var y = (a.s<0)?a.negate():a.clone();\n if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n if(g < 0) return x;\n if(i < g) g = i;\n if(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n }\n while(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n x.subTo(y,x);\n x.rShiftTo(1,x);\n }\n else {\n y.subTo(x,y);\n y.rShiftTo(1,y);\n }\n }\n if(g > 0) y.lShiftTo(g,y);\n return y;\n }\n\n // (protected) this % n, n < 2^26\n function bnpModInt(n) {\n if(n <= 0) return 0;\n var d = this.DV%n, r = (this.s<0)?n-1:0;\n if(this.t > 0)\n if(d == 0) r = this[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n return r;\n }\n\n // (public) 1/this % m (HAC 14.61)\n function bnModInverse(m) {\n var ac = m.isEven();\n if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(), v = this.clone();\n var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n while(u.signum() != 0) {\n while(u.isEven()) {\n u.rShiftTo(1,u);\n if(ac) {\n if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n a.rShiftTo(1,a);\n }\n else if(!b.isEven()) b.subTo(m,b);\n b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n v.rShiftTo(1,v);\n if(ac) {\n if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n c.rShiftTo(1,c);\n }\n else if(!d.isEven()) d.subTo(m,d);\n d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n u.subTo(v,u);\n if(ac) a.subTo(c,a);\n b.subTo(d,b);\n }\n else {\n v.subTo(u,v);\n if(ac) c.subTo(a,c);\n d.subTo(b,d);\n }\n }\n if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if(d.compareTo(m) >= 0) return d.subtract(m);\n if(d.signum() < 0) d.addTo(m,d); else return d;\n if(d.signum() < 0) return d.add(m); else return d;\n }\n\n var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\n var lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n // (public) test primality with certainty >= 1-.5^t\n function bnIsProbablePrime(t) {\n var i, x = this.abs();\n if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n if(x[0] == lowprimes[i]) return true;\n return false;\n }\n if(x.isEven()) return false;\n i = 1;\n while(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n }\n\n // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n function bnpMillerRabin(t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if(k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t+1)>>1;\n if(t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for(var i = 0; i < t; ++i) {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while(j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2,this);\n if(y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if(y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n }\n\n // protected\n BigInteger.prototype.chunkSize = bnpChunkSize;\n BigInteger.prototype.toRadix = bnpToRadix;\n BigInteger.prototype.fromRadix = bnpFromRadix;\n BigInteger.prototype.fromNumber = bnpFromNumber;\n BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n BigInteger.prototype.changeBit = bnpChangeBit;\n BigInteger.prototype.addTo = bnpAddTo;\n BigInteger.prototype.dMultiply = bnpDMultiply;\n BigInteger.prototype.dAddOffset = bnpDAddOffset;\n BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n BigInteger.prototype.modInt = bnpModInt;\n BigInteger.prototype.millerRabin = bnpMillerRabin;\n\n // public\n BigInteger.prototype.clone = bnClone;\n BigInteger.prototype.intValue = bnIntValue;\n BigInteger.prototype.byteValue = bnByteValue;\n BigInteger.prototype.shortValue = bnShortValue;\n BigInteger.prototype.signum = bnSigNum;\n BigInteger.prototype.toByteArray = bnToByteArray;\n BigInteger.prototype.equals = bnEquals;\n BigInteger.prototype.min = bnMin;\n BigInteger.prototype.max = bnMax;\n BigInteger.prototype.and = bnAnd;\n BigInteger.prototype.or = bnOr;\n BigInteger.prototype.xor = bnXor;\n BigInteger.prototype.andNot = bnAndNot;\n BigInteger.prototype.not = bnNot;\n BigInteger.prototype.shiftLeft = bnShiftLeft;\n BigInteger.prototype.shiftRight = bnShiftRight;\n BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n BigInteger.prototype.bitCount = bnBitCount;\n BigInteger.prototype.testBit = bnTestBit;\n BigInteger.prototype.setBit = bnSetBit;\n BigInteger.prototype.clearBit = bnClearBit;\n BigInteger.prototype.flipBit = bnFlipBit;\n BigInteger.prototype.add = bnAdd;\n BigInteger.prototype.subtract = bnSubtract;\n BigInteger.prototype.multiply = bnMultiply;\n BigInteger.prototype.divide = bnDivide;\n BigInteger.prototype.remainder = bnRemainder;\n BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n BigInteger.prototype.modPow = bnModPow;\n BigInteger.prototype.modInverse = bnModInverse;\n BigInteger.prototype.pow = bnPow;\n BigInteger.prototype.gcd = bnGCD;\n BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n // JSBN-specific extension\n BigInteger.prototype.square = bnSquare;\n\n // Expose the Barrett function\n BigInteger.prototype.Barrett = Barrett\n\n // BigInteger interfaces not implemented in jsbn:\n\n // BigInteger(int signum, byte[] magnitude)\n // double doubleValue()\n // float floatValue()\n // int hashCode()\n // long longValue()\n // static BigInteger valueOf(long val)\n\n // Random number generator - requires a PRNG backend, e.g. prng4.js\n\n // For best results, put code like\n // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n // in your main HTML document.\n\n var rng_state;\n var rng_pool;\n var rng_pptr;\n\n // Mix in a 32-bit integer into the pool\n function rng_seed_int(x) {\n rng_pool[rng_pptr++] ^= x & 255;\n rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n }\n\n // Mix in the current time (w/milliseconds) into the pool\n function rng_seed_time() {\n rng_seed_int(new Date().getTime());\n }\n\n // Initialize the pool with junk if needed.\n if(rng_pool == null) {\n rng_pool = new Array();\n rng_pptr = 0;\n var t;\n if(typeof window !== \"undefined\" && window.crypto) {\n if (window.crypto.getRandomValues) {\n // Use webcrypto if available\n var ua = new Uint8Array(32);\n window.crypto.getRandomValues(ua);\n for(t = 0; t < 32; ++t)\n rng_pool[rng_pptr++] = ua[t];\n }\n else if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n // Extract entropy (256 bits) from NS4 RNG if available\n var z = window.crypto.random(32);\n for(t = 0; t < z.length; ++t)\n rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n }\n }\n while(rng_pptr < rng_psize) { // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = t >>> 8;\n rng_pool[rng_pptr++] = t & 255;\n }\n rng_pptr = 0;\n rng_seed_time();\n //rng_seed_int(window.screenX);\n //rng_seed_int(window.screenY);\n }\n\n function rng_get_byte() {\n if(rng_state == null) {\n rng_seed_time();\n rng_state = prng_newstate();\n rng_state.init(rng_pool);\n for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n rng_pool[rng_pptr] = 0;\n rng_pptr = 0;\n //rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n }\n\n function rng_get_bytes(ba) {\n var i;\n for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n }\n\n function SecureRandom() {}\n\n SecureRandom.prototype.nextBytes = rng_get_bytes;\n\n // prng4.js - uses Arcfour as a PRNG\n\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = new Array();\n }\n\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n function ARC4init(key) {\n var i, j, t;\n for(i = 0; i < 256; ++i)\n this.S[i] = i;\n j = 0;\n for(i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n }\n\n function ARC4next() {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n }\n\n Arcfour.prototype.init = ARC4init;\n Arcfour.prototype.next = ARC4next;\n\n // Plug in your RNG constructor here\n function prng_newstate() {\n return new Arcfour();\n }\n\n // Pool size must be a multiple of 4 and greater than 32.\n // An array of bytes the size of the pool will be passed to init()\n var rng_psize = 256;\n\n if (typeof exports !== 'undefined') {\n exports = module.exports = {\n default: BigInteger,\n BigInteger: BigInteger,\n SecureRandom: SecureRandom,\n };\n } else {\n this.jsbn = {\n BigInteger: BigInteger,\n SecureRandom: SecureRandom\n };\n }\n\n}).call(this);\n"
},
{
"id": 3,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/rusha/dist/rusha.min.js",
"name": "./node_modules/rusha/dist/rusha.min.js",
"index": 3,
"index2": 1,
"size": 12486,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "rusha/dist/rusha.min.js",
"loc": "58:25-59"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*! rusha 2018-02-19 */\n\n(function e(t,r){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=r();else if(typeof define===\"function\"&&define.amd)define([],r);else if(typeof exports===\"object\")exports[\"Rusha\"]=r();else t[\"Rusha\"]=r()})(typeof self!==\"undefined\"?self:this,function(){return function(e){var t={};function r(n){if(t[n]){return t[n].exports}var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"\";return r(r.s=3)}([function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(5);var i=r(1),o=i.toHex,s=i.ceilHeapSize;var f=r(6);var u=function(e){for(e+=9;e%64>0;e+=1){}return e};var c=function(e,t){var r=new Uint8Array(e.buffer);var n=t%4,a=t-n;switch(n){case 0:r[a+3]=0;case 1:r[a+2]=0;case 2:r[a+1]=0;case 3:r[a+0]=0}for(var i=(t>>2)+1;i<e.length;i++){e[i]=0}};var h=function(e,t,r){e[t>>2]|=128<<24-(t%4<<3);e[((t>>2)+2&~15)+14]=r/(1<<29)|0;e[((t>>2)+2&~15)+15]=r<<3};var p=function(e,t){var r=new Int32Array(e,t+320,5);var n=new Int32Array(5);var a=new DataView(n.buffer);a.setInt32(0,r[0],false);a.setInt32(4,r[1],false);a.setInt32(8,r[2],false);a.setInt32(12,r[3],false);a.setInt32(16,r[4],false);return n};var l=function(){function e(t){n(this,e);t=t||64*1024;if(t%64>0){throw new Error(\"Chunk size must be a multiple of 128 bit\")}this._offset=0;this._maxChunkLen=t;this._padMaxChunkLen=u(t);this._heap=new ArrayBuffer(s(this._padMaxChunkLen+320+20));this._h32=new Int32Array(this._heap);this._h8=new Int8Array(this._heap);this._core=new a({Int32Array:Int32Array},{},this._heap)}e.prototype._initState=function e(t,r){this._offset=0;var n=new Int32Array(t,r+320,5);n[0]=1732584193;n[1]=-271733879;n[2]=-1732584194;n[3]=271733878;n[4]=-1009589776};e.prototype._padChunk=function e(t,r){var n=u(t);var a=new Int32Array(this._heap,0,n>>2);c(a,t);h(a,t,r);return n};e.prototype._write=function e(t,r,n,a){f(t,this._h8,this._h32,r,n,a||0)};e.prototype._coreCall=function e(t,r,n,a,i){var o=n;this._write(t,r,n);if(i){o=this._padChunk(n,a)}this._core.hash(o,this._padMaxChunkLen)};e.prototype.rawDigest=function e(t){var r=t.byteLength||t.length||t.size||0;this._initState(this._heap,this._padMaxChunkLen);var n=0,a=this._maxChunkLen;for(n=0;r>n+a;n+=a){this._coreCall(t,n,a,r,false)}this._coreCall(t,n,r-n,r,true);return p(this._heap,this._padMaxChunkLen)};e.prototype.digest=function e(t){return o(this.rawDigest(t).buffer)};e.prototype.digestFromString=function e(t){return this.digest(t)};e.prototype.digestFromBuffer=function e(t){return this.digest(t)};e.prototype.digestFromArrayBuffer=function e(t){return this.digest(t)};e.prototype.resetState=function e(){this._initState(this._heap,this._padMaxChunkLen);return this};e.prototype.append=function e(t){var r=0;var n=t.byteLength||t.length||t.size||0;var a=this._offset%this._maxChunkLen;var i=void 0;this._offset+=n;while(r<n){i=Math.min(n-r,this._maxChunkLen-a);this._write(t,r,i,a);a+=i;r+=i;if(a===this._maxChunkLen){this._core.hash(this._maxChunkLen,this._padMaxChunkLen);a=0}}return this};e.prototype.getState=function e(){var t=this._offset%this._maxChunkLen;var r=void 0;if(!t){var n=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}else{r=this._heap.slice(0)}return{offset:this._offset,heap:r}};e.prototype.setState=function e(t){this._offset=t.offset;if(t.heap.byteLength===20){var r=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r.set(new Int32Array(t.heap))}else{this._h32.set(new Int32Array(t.heap))}return this};e.prototype.rawEnd=function e(){var t=this._offset;var r=t%this._maxChunkLen;var n=this._padChunk(r,t);this._core.hash(n,this._padMaxChunkLen);var a=p(this._heap,this._padMaxChunkLen);this._initState(this._heap,this._padMaxChunkLen);return a};e.prototype.end=function e(){return o(this.rawEnd().buffer)};return e}();e.exports=l;e.exports._core=a},function(e,t){var r=new Array(256);for(var n=0;n<256;n++){r[n]=(n<16?\"0\":\"\")+n.toString(16)}e.exports.toHex=function(e){var t=new Uint8Array(e);var n=new Array(e.byteLength);for(var a=0;a<n.length;a++){n[a]=r[t[a]]}return n.join(\"\")};e.exports.ceilHeapSize=function(e){var t=0;if(e<=65536)return 65536;if(e<16777216){for(t=1;t<e;t=t<<1){}}else{for(t=16777216;t<e;t+=16777216){}}return t};e.exports.isDedicatedWorkerScope=function(e){var t=\"WorkerGlobalScope\"in e&&e instanceof e.WorkerGlobalScope;var r=\"SharedWorkerGlobalScope\"in e&&e instanceof e.SharedWorkerGlobalScope;var n=\"ServiceWorkerGlobalScope\"in e&&e instanceof e.ServiceWorkerGlobalScope;return t&&!r&&!n}},function(e,t,r){e.exports=function(){var e=r(0);var t=function(e,t,r){try{return r(null,e.digest(t))}catch(e){return r(e)}};var n=function(e,t,r,a,i){var o=new self.FileReader;o.onloadend=function s(){if(o.error){return i(o.error)}var f=o.result;t+=o.result.byteLength;try{e.append(f)}catch(e){i(e);return}if(t<a.size){n(e,t,r,a,i)}else{i(null,e.end())}};o.readAsArrayBuffer(a.slice(t,t+r))};var a=true;self.onmessage=function(r){if(!a){return}var i=r.data.data,o=r.data.file,s=r.data.id;if(typeof s===\"undefined\")return;if(!o&&!i)return;var f=r.data.blockSize||4*1024*1024;var u=new e(f);u.resetState();var c=function(e,t){if(!e){self.postMessage({id:s,hash:t})}else{self.postMessage({id:s,error:e.name})}};if(i)t(u,i,c);if(o)n(u,0,f,o,c)};return function(){a=false}}},function(e,t,r){var n=r(4);var a=r(0);var i=r(7);var o=r(2);var s=r(1),f=s.isDedicatedWorkerScope;var u=typeof self!==\"undefined\"&&f(self);a.disableWorkerBehaviour=u?o():function(){};a.createWorker=function(){var e=n(2);var t=e.terminate;e.terminate=function(){URL.revokeObjectURL(e.objectURL);t.call(e)};return e};a.createHash=i;e.exports=a},function(e,t,r){function n(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.i=function(e){return e};r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.r=function(e){Object.defineProperty(e,\"__esModule\",{value:true})};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"/\";r.oe=function(e){console.error(e);throw e};var n=r(r.s=ENTRY_MODULE);return n.default||n}var a=\"[\\\\.|\\\\-|\\\\+|\\\\w|/|@]+\";var i=\"\\\\((/\\\\*.*?\\\\*/)?s?.*?(\"+a+\").*?\\\\)\";function o(e){return(e+\"\").replace(/[.?*+^$[\\]\\\\(){}|-]/g,\"\\\\$&\")}function s(e,t,n){var s={};s[n]=[];var f=t.toString();var u=f.match(/^function\\s?\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/);if(!u)return s;var c=u[1];var h=new RegExp(\"(\\\\\\\\n|\\\\W)\"+o(c)+i,\"g\");var p;while(p=h.exec(f)){if(p[3]===\"dll-reference\")continue;s[n].push(p[3])}h=new RegExp(\"\\\\(\"+o(c)+'\\\\(\"(dll-reference\\\\s('+a+'))\"\\\\)\\\\)'+i,\"g\");while(p=h.exec(f)){if(!e[p[2]]){s[n].push(p[1]);e[p[2]]=r(p[1]).m}s[p[2]]=s[p[2]]||[];s[p[2]].push(p[4])}return s}function f(e){var t=Object.keys(e);return t.reduce(function(t,r){return t||e[r].length>0},false)}function u(e,t){var r={main:[t]};var n={main:[]};var a={main:{}};while(f(r)){var i=Object.keys(r);for(var o=0;o<i.length;o++){var u=i[o];var c=r[u];var h=c.pop();a[u]=a[u]||{};if(a[u][h]||!e[u][h])continue;a[u][h]=true;n[u]=n[u]||[];n[u].push(h);var p=s(e,e[u][h],u);var l=Object.keys(p);for(var v=0;v<l.length;v++){r[l[v]]=r[l[v]]||[];r[l[v]]=r[l[v]].concat(p[l[v]])}}}return n}e.exports=function(e,t){t=t||{};var a={main:r.m};var i=t.all?{main:Object.keys(a)}:u(a,e);var o=\"\";Object.keys(i).filter(function(e){return e!==\"main\"}).forEach(function(e){var t=0;while(i[e][t]){t++}i[e].push(t);a[e][t]=\"(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })\";o=o+\"var \"+e+\" = (\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(t))+\")({\"+i[e].map(function(t){return\"\"+JSON.stringify(t)+\": \"+a[e][t].toString()}).join(\",\")+\"});\\n\"});o=o+\"(\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(e))+\")({\"+i.main.map(function(e){return\"\"+JSON.stringify(e)+\": \"+a.main[e].toString()}).join(\",\")+\"})(self);\";var s=new window.Blob([o],{type:\"text/javascript\"});if(t.bare){return s}var f=window.URL||window.webkitURL||window.mozURL||window.msURL;var c=f.createObjectURL(s);var h=new window.Worker(c);h.objectURL=c;return h}},function(e,t){e.exports=function e(t,r,n){\"use asm\";var a=new t.Int32Array(n);function i(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,o=0,s=0,f=0,u=0,c=0,h=0,p=0,l=0,v=0,d=0,y=0;i=a[t+320>>2]|0;s=a[t+324>>2]|0;u=a[t+328>>2]|0;h=a[t+332>>2]|0;l=a[t+336>>2]|0;for(r=0;(r|0)<(e|0);r=r+64|0){o=i;f=s;c=u;p=h;v=l;for(n=0;(n|0)<64;n=n+4|0){y=a[r+n>>2]|0;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[e+n>>2]=y}for(n=e+64|0;(n|0)<(e+80|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+80|0;(n|0)<(e+160|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)+1859775393|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+160|0;(n|0)<(e+240|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|s&h|u&h)|0)+((y+l|0)-1894007588|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+240|0;(n|0)<(e+320|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)-899497514|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}i=i+o|0;s=s+f|0;u=u+c|0;h=h+p|0;l=l+v|0}a[t+320>>2]=i;a[t+324>>2]=s;a[t+328>>2]=u;a[t+332>>2]=h;a[t+336>>2]=l}return{hash:i}}},function(e,t){var r=this;var n=void 0;if(typeof self!==\"undefined\"&&typeof self.FileReaderSync!==\"undefined\"){n=new self.FileReaderSync}var a=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e.charCodeAt(n+3);case 1:t[i+1-(s<<1)|0]=e.charCodeAt(n+2);case 2:t[i+2-(s<<1)|0]=e.charCodeAt(n+1);case 3:t[i+3-(s<<1)|0]=e.charCodeAt(n)}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2]=e.charCodeAt(n+o)<<24|e.charCodeAt(n+o+1)<<16|e.charCodeAt(n+o+2)<<8|e.charCodeAt(n+o+3)}switch(f){case 3:t[i+u+1|0]=e.charCodeAt(n+u+2);case 2:t[i+u+2|0]=e.charCodeAt(n+u+1);case 1:t[i+u+3|0]=e.charCodeAt(n+u)}};var i=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e[n+3];case 1:t[i+1-(s<<1)|0]=e[n+2];case 2:t[i+2-(s<<1)|0]=e[n+1];case 3:t[i+3-(s<<1)|0]=e[n]}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2|0]=e[n+o]<<24|e[n+o+1]<<16|e[n+o+2]<<8|e[n+o+3]}switch(f){case 3:t[i+u+1|0]=e[n+u+2];case 2:t[i+u+2|0]=e[n+u+1];case 1:t[i+u+3|0]=e[n+u]}};var o=function(e,t,r,a,i,o){var s=void 0,f=o%4,u=(i+f)%4,c=i-u;var h=new Uint8Array(n.readAsArrayBuffer(e.slice(a,a+i)));switch(f){case 0:t[o]=h[3];case 1:t[o+1-(f<<1)|0]=h[2];case 2:t[o+2-(f<<1)|0]=h[1];case 3:t[o+3-(f<<1)|0]=h[0]}if(i<u+(4-f)){return}for(s=4-f;s<c;s=s+4|0){r[o+s>>2|0]=h[s]<<24|h[s+1]<<16|h[s+2]<<8|h[s+3]}switch(u){case 3:t[o+c+1|0]=h[c+2];case 2:t[o+c+2|0]=h[c+1];case 1:t[o+c+3|0]=h[c]}};e.exports=function(e,t,n,s,f,u){if(typeof e===\"string\"){return a(e,t,n,s,f,u)}if(e instanceof Array){return i(e,t,n,s,f,u)}if(r&&r.Buffer&&r.Buffer.isBuffer(e)){return i(e,t,n,s,f,u)}if(e instanceof ArrayBuffer){return i(new Uint8Array(e),t,n,s,f,u)}if(e.buffer instanceof ArrayBuffer){return i(new Uint8Array(e.buffer,e.byteOffset,e.byteLength),t,n,s,f,u)}if(e instanceof Blob){return o(e,t,n,s,f,u)}throw new Error(\"Unsupported data type.\")}},function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(0);var i=r(1),o=i.toHex;var s=function(){function e(){n(this,e);this._rusha=new a;this._rusha.resetState()}e.prototype.update=function e(t){this._rusha.append(t);return this};e.prototype.digest=function e(t){var e=this._rusha.rawEnd().buffer;if(!t){return e}if(t===\"hex\"){return o(e)}throw new Error(\"unsupported digest encoding\")};return e}();e.exports=function(){return new s}}])});"
},
{
"id": 4,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/leemon/es/index.js",
"name": "./node_modules/leemon/es/index.js",
"index": 4,
"index2": 2,
"size": 57067,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "59:15-32"
}
],
"usedExports": true,
"providedExports": [
"bpe",
"one",
"zero",
"findPrimes",
"millerRabinInt",
"millerRabin",
"bitSize",
"expand",
"randTruePrime",
"randProbPrime",
"randProbPrimeRounds",
"mod",
"addInt",
"mult",
"powMod",
"sub",
"add",
"inverseMod",
"multMod",
"randTruePrime_",
"randBigInt",
"randBigInt_",
"GCD",
"GCD_",
"inverseMod_",
"inverseModInt",
"eGCD_",
"negative",
"greaterShift",
"greater",
"divide_",
"carry_",
"modInt",
"int2bigInt",
"str2bigInt",
"equalsInt",
"equals",
"isZero",
"bigInt2str",
"dup",
"copy_",
"copyInt_",
"addInt_",
"rightShift_",
"halve_",
"leftShift_",
"multInt_",
"divInt_",
"linComb_",
"linCombShift_",
"addShift_",
"subShift_",
"sub_",
"add_",
"mult_",
"mod_",
"multMod_",
"squareMod_",
"trim",
"powMod_",
"mont_"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/lib/bin_utils.ts (referenced with cjs require)"
],
"depth": 2,
"source": "'use strict';\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int, 1<b<x)\n// bigInt mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int modInt(x,n) //return x mod n for bigInt x and integer n.\n// bigInt mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.\n// boolean negative(x) //is bigInt x negative?\n// bigInt powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.\n// bigInt randBigInt(n,s) //return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.\n// void linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n) //do x=x*x mod n for bigInts x,n\n// void subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n// powMod_() = algorithm 14.94, Montgomery exponentiation\n// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n// GCD_() = algorothm 14.57, Lehmer's algorithm\n// mont_() = algorithm 14.36, Montgomery multiplication\n// divide_() = algorithm 14.20 Multiple-precision division\n// squareMod_() = algorithm 14.16 Multiple-precision squaring\n// randTruePrime_() = algorithm 4.62, Maurer's algorithm\n// millerRabin() = algorithm 4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n// randTruePrime_() spends:\n// 10% of its time in calls to powMod_()\n// 85% of its time in calls to millerRabin()\n// millerRabin() spends:\n// 99% of its time in calls to powMod_() (always with a base of 2)\n// powMod_() spends:\n// 94% of its time in calls to mont_() (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n// -- this should especially focus on being fast when raising 2 to a power mod n\n// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n// - tune the parameters in randTruePrime_(), including c, m, and recLimit\n// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n// within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\n//globals\nexport var bpe = 0; //bits stored per array element\n\nvar mask = 0; //AND this with an array element to chop it down to bpe bits\n\nvar radix = mask + 1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n//the digits for converting to different bases\n\nvar digitsStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'; //initialize the global variables\n//bpe=number of bits in the mantissa on this platform\n\nfor (bpe = 0; 1 << bpe + 1 > 1 << bpe; bpe++) {\n ;\n}\n\nbpe >>= 1; //bpe=number of bits in one element of the array representing the bigInt\n\nmask = (1 << bpe) - 1; //AND the mask with an integer to get its bpe least significant bits\n\nradix = mask + 1; //2^bpe. a single 1 bit to the left of the first bit of mask\n\nexport var one = int2bigInt(1, 1, 1); //constant used in powMod_()\n\nexport var zero = int2bigInt(0, 1, 1); //the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\n\nvar t = new Array(0);\nvar ss = t; //used in mult_()\n\nvar s0 = t; //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\n\nvar s3 = t; //used in powMod_()\n\nvar s4 = t,\n s5 = t; //used in mod_()\n\nvar s6 = t; //used in bigInt2str()\n\nvar s7 = t; //used in powMod_()\n\nvar T = t; //used in GCD_()\n\nvar sa = t; //used in mont_()\n\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t,\n //used in millerRabin()\neg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t,\n //used in eGCD_(), inverseMod_()\n//, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\nprimes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t,\n //used in randTruePrime_()\nrpprb = t; //used in randProbPrimeRounds() (which also uses \"primes\")\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff;\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function findPrimes(n) {\n var i, s, p, ans;\n s = new Array(n);\n\n for (i = 0; i < n; i++) {\n s[i] = 0;\n }\n\n s[0] = 2;\n p = 0; //first p elements of s are primes, the rest are a sieve\n\n for (; s[p] < n;) {\n //s[p] is the pth prime\n for (i = s[p] * s[p]; i < n; i += s[p] //mark multiples of s[p]\n ) {\n s[i] = 1;\n }\n\n p++;\n s[p] = s[p - 1] + 1;\n\n for (; s[p] < n && s[s[p]]; s[p]++) {\n ;\n } //find next prime (where s[p]==0)\n\n }\n\n ans = new Array(p);\n\n for (i = 0; i < p; i++) {\n ans[i] = s[i];\n }\n\n return ans;\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabinInt(x, b) {\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copyInt_(mr_a, b);\n return millerRabin(x, mr_a);\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x and b are bigInts with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number[]} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabin(x, b) {\n var i, j, k, s;\n\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copy_(mr_a, b);\n copy_(mr_r, x);\n copy_(mr_x1, x);\n addInt_(mr_r, -1);\n addInt_(mr_x1, -1); //s=the highest power of two that divides mr_r\n\n k = 0;\n\n for (i = 0; i < mr_r.length; i++) {\n for (j = 1; j < mask; j <<= 1) {\n if (x[i] & j) {\n s = k < mr_r.length + bpe ? k : 0;\n i = mr_r.length;\n j = mask;\n } else k++;\n }\n }\n\n if (s) rightShift_(mr_r, s);\n powMod_(mr_a, mr_r, x);\n\n if (!equalsInt(mr_a, 1) && !equals(mr_a, mr_x1)) {\n j = 1; //$off\n\n while (j <= s - 1 && !equals(mr_a, mr_x1)) {\n squareMod_(mr_a, x);\n\n if (equalsInt(mr_a, 1)) {\n return 0;\n }\n\n j++;\n }\n\n if (!equals(mr_a, mr_x1)) {\n return 0;\n }\n }\n\n return 1;\n}\n/**\n * returns how many bits long the bigInt is, not counting leading zeros.\n *\n * @param {number[]} x\n * @returns {number}\n */\n\nexport function bitSize(x) {\n var j, z, w;\n\n for (j = x.length - 1; x[j] == 0 && j > 0; j--) {\n ;\n }\n\n for (z = 0, w = x[j]; w; w >>= 1, z++) {\n ;\n }\n\n z += bpe * j;\n return z;\n}\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function expand(x, n) {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0);\n copy_(ans, x);\n return ans;\n}\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randTruePrime(k) {\n var ans = int2bigInt(0, k, 0);\n randTruePrime_(ans, k);\n return trim(ans, 1);\n}\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randProbPrime(k) {\n if (k >= 600) return randProbPrimeRounds(k, 2); //numbers from HAC table 4.3\n\n if (k >= 550) return randProbPrimeRounds(k, 4);\n if (k >= 500) return randProbPrimeRounds(k, 5);\n if (k >= 400) return randProbPrimeRounds(k, 6);\n if (k >= 350) return randProbPrimeRounds(k, 7);\n if (k >= 300) return randProbPrimeRounds(k, 9);\n if (k >= 250) return randProbPrimeRounds(k, 12); //numbers from HAC table 4.4\n\n if (k >= 200) return randProbPrimeRounds(k, 15);\n if (k >= 150) return randProbPrimeRounds(k, 18);\n if (k >= 100) return randProbPrimeRounds(k, 27);\n return randProbPrimeRounds(k, 40); //number from HAC remark 4.26 (only an estimate)\n}\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function randProbPrimeRounds(k, n) {\n var ans, i, divisible, B;\n B = 30000; //B is largest prime to use in trial division\n\n ans = int2bigInt(0, k, 0); //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans);\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n randBigInt_(ans, k, 0); //ans = a random odd number to check\n\n ans[0] |= 1;\n divisible = 0; //check ans for divisibility by small primes up to B\n\n for (i = 0; i < primes.length && primes[i] <= B; i++) {\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1;\n break;\n }\n } //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n //do n rounds of Miller Rabin, with random bases less than ans\n\n\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0);\n\n while (!greater(ans, rpprb) //pick a random rpprb that's < ans\n ) {\n randBigInt_(rpprb, k, 0);\n }\n\n if (!millerRabin(ans, rpprb)) divisible = 1;\n }\n\n if (!divisible) return ans;\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function mod(x, n) {\n var ans = dup(x);\n mod_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function addInt(x, n) {\n var ans = expand(x, x.length + 1);\n addInt_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return x*y for bigInts x and y. This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function mult(x, y) {\n var ans = expand(x, x.length + y.length);\n mult_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.\n *\n * 0**0=1.\n *\n * Faster for odd n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function powMod(x, y, n) {\n var ans = expand(x, n.length);\n powMod_( //this should work without the trim, but doesn't\n ans, trim(y, 2), trim(n, 2));\n return trim(ans, 1);\n}\n/**\n * return (x-y) for bigInts x and y\n *\n * Negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function sub(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n sub_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function add(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n add_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n\nexport function inverseMod(x, n) {\n var ans = expand(x, n.length);\n var s = inverseMod_(ans, n);\n return s ? trim(ans, 1) : null;\n}\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function multMod(x, y, n) {\n var ans = expand(x, n.length);\n multMod_(ans, y, n);\n return trim(ans, 1);\n}\n/**\n * generate a k-bit true random prime using Maurer's algorithm, and put it into ans.\n *\n * The bigInt ans must be large enough to hold it.\n *\n * @export\n * @param {number[]} ans\n * @param {number} k\n * @return {void}\n */\n\nexport function randTruePrime_(ans, k) {\n var c, m, pm, dd, j, r, B, divisible, z, zz, recSize;\n var w;\n if (primes.length == 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (pows.length == 0) {\n pows = new Array(512);\n\n for (j = 0; j < 512; j++) {\n pows[j] = Math.pow(2, j / 511 - 1);\n }\n } //c and m should be tuned for a particular machine and value of k, to maximize speed\n\n\n c = 0.1; //c=0.1 in HAC\n\n m = 20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n\n var recLimit = 20; //stop recursion when k <=recLimit. Must have recLimit >= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans);\n s_R = dup(ans);\n s_n1 = dup(ans);\n s_r2 = dup(ans);\n s_d = dup(ans);\n s_x1 = dup(ans); //TODO Seems like a bug in eslint, reports as unused\n\n s_x2 = dup(ans);\n s_b = dup(ans);\n s_n = dup(ans);\n s_i = dup(ans);\n s_rm = dup(ans);\n s_q = dup(ans);\n s_a = dup(ans);\n s_aa = dup(ans);\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << (k + 2 >> 1)) - 1; //pm is binary number with all ones, just over sqrt(2^k)\n\n copyInt_(ans, 0);\n\n for (dd = 1; dd;) {\n dd = 0;\n ans[0] = 1 | 1 << k - 1 | Math.floor(Math.random() * (1 << k)); //random, k-bit, odd integer, with msb 1\n\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1;\n break;\n }\n }\n }\n\n carry_(ans);\n return;\n }\n\n B = c * k * k; //try small primes up to B (or all the primes[] array if the largest is less than B).\n\n if (k > 2 * m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m;) {\n r = pows[Math.floor(Math.random() * 512)];\n } //r=Math.pow(2,Math.random()-1);\n else r = 0.5; //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1;\n randTruePrime_(s_q, recSize);\n copyInt_(s_i2, 0);\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << (k - 2) % bpe; //s_i2=2^(k-2)\n\n divide_(s_i2, s_q, s_i, s_rm); //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i);\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0);\n if (greater(s_i, s_R)) break;\n } //now s_R is in the range [0,s_i-1]\n\n\n addInt_(s_R, 1); //now s_R is in the range [1,s_i]\n\n add_(s_R, s_i); //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q);\n mult_(s_n, s_R);\n multInt_(s_n, 2);\n addInt_(s_n, 1); //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R);\n multInt_(s_r2, 2); //s_r2=2*s_R\n //check s_n for divisibility by small primes up to B\n\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++) {\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1;\n break;\n }\n }\n\n if (!divisible) if (!millerRabinInt(s_n, 2)) //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1;\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3);\n\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--) {\n ;\n } //strip leading zeros\n\n\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++) {\n ;\n }\n\n zz += bpe * j; //zz=number of bits in s_n, ignoring leading zeros\n\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0);\n if (greater(s_n, s_a)) break;\n } //now s_a is in the range [0,s_n-1]\n\n\n addInt_(s_n, 3); //now s_a is in the range [0,s_n-4]\n\n addInt_(s_a, 2); //now s_a is in the range [2,s_n-2]\n\n copy_(s_b, s_a);\n copy_(s_n1, s_n);\n addInt_(s_n1, -1);\n powMod_(s_b, s_n1, s_n); //s_b=s_a^(s_n-1) modulo s_n\n\n addInt_(s_b, -1);\n\n if (isZero(s_b)) {\n copy_(s_b, s_a);\n powMod_(s_b, s_r2, s_n);\n addInt_(s_b, -1);\n copy_(s_aa, s_n);\n copy_(s_d, s_b);\n GCD_(s_d, s_n); //if s_b and s_n are relatively prime, then s_n is a prime\n\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa);\n return; //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n}\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n\nexport function randBigInt(n, s) {\n var a, b;\n a = Math.floor((n - 1) / bpe) + 2; //# array elements to hold the BigInt with a leading 0 element\n\n b = int2bigInt(0, 0, a);\n randBigInt_(b, n, s);\n return b;\n}\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n\nexport function randBigInt_(b, n, s) {\n var i, a;\n\n for (i = 0; i < b.length; i++) {\n b[i] = 0;\n }\n\n a = Math.floor((n - 1) / bpe) + 1; //# array elements to hold the BigInt\n\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << bpe - 1));\n }\n\n b[a - 1] &= (2 << (n - 1) % bpe) - 1;\n if (s == 1) b[a - 1] |= 1 << (n - 1) % bpe;\n}\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function GCD(x, y) {\n var xc, yc;\n xc = dup(x);\n yc = dup(y);\n GCD_(xc, yc);\n return xc;\n}\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\n\nexport function GCD_(x, y) {\n var i, xp, yp, A, B, C, D, q, sing;\n var qp;\n if (T.length !== x.length) T = dup(x);\n sing = 1;\n\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0;\n\n for (i = 1; i < y.length; i++ //check if y has nonzero elements other than 0\n ) {\n if (y[i]) {\n sing = 1;\n break;\n }\n }\n\n if (!sing) break; //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--) {\n ;\n } //find most significant element of x\n\n\n xp = x[i];\n yp = y[i];\n A = 1;\n B = 0;\n C = 0;\n D = 1;\n\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C));\n qp = Math.floor((xp + B) / (yp + D));\n if (q != qp) break;\n t = A - q * C;\n A = C;\n C = t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n\n t = B - q * D;\n B = D;\n D = t;\n t = xp - q * yp;\n xp = yp;\n yp = t;\n }\n\n if (B) {\n copy_(T, x);\n linComb_(x, y, A, B); //x=A*x+B*y\n\n linComb_(y, T, D, C); //y=D*y+C*T\n } else {\n mod_(x, y);\n copy_(T, x);\n copy_(x, y);\n copy_(y, T);\n }\n }\n\n if (y[0] === 0) return;\n t = modInt(x, y[0]);\n copyInt_(x, y[0]);\n y[0] = t;\n\n while (y[0]) {\n x[0] %= y[0];\n t = x[0];\n x[0] = y[0];\n y[0] = t;\n }\n}\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n\nexport function inverseMod_(x, n) {\n var k = 1 + 2 * Math.max(x.length, n.length);\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0);\n return 0;\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_v = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n copy_(eg_u, x);\n copy_(eg_v, n);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, n);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, n);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C) //make sure answer is nonnegative\n ) {\n add_(eg_C, n);\n }\n\n copy_(x, eg_C);\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0);\n return 0;\n }\n\n return 1;\n }\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function inverseModInt(x, n) {\n var a = 1,\n b = 0,\n t;\n\n for (;;) {\n if (x === 1) return a;\n if (x === 0) return 0;\n b -= a * Math.floor(n / x); //$off\n\n n %= x;\n if (n === 1) return b; //to avoid negatives, change this b to n-b, and each -= to +=\n\n if (n === 0) return 0;\n a -= b * Math.floor(x / n); //$off\n\n x %= n;\n }\n /*::\n declare var never: empty\n return never\n */\n\n} //this deprecated function is for backward compatibility only.\n\nfunction inverseModInt_(x, n) {\n return inverseModInt(x, n);\n}\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\n\n\nexport function eGCD_(x, y, v, a, b) {\n var g = 0;\n var k = Math.max(x.length, y.length);\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x);\n halve_(y);\n g++;\n }\n\n copy_(eg_u, x);\n copy_(v, y);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, y);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, y);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //v>u\n sub_(v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y);\n sub_(eg_D, x);\n }\n\n multInt_(eg_D, -1); ///make sure b (D) is nonnegative\n\n copy_(a, eg_C);\n copy_(b, eg_D);\n leftShift_(v, g);\n return;\n }\n }\n}\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function negative(x) {\n //TODO Flow Bool type inference\n return x[x.length - 1] >> bpe - 1 & 1;\n}\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\n\nexport function greaterShift(x, y, shift) {\n var i,\n kx = x.length,\n ky = y.length;\n k = kx + shift < ky ? kx + shift : ky;\n\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) {\n if (x[i] > 0) return 1;\n } //if there are nonzeros in x to the left of the first column of y, then x is bigger\n\n\n for (i = kx - 1 + shift; i < ky; i++) {\n if (y[i] > 0) return 0;\n } //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n\n\n for (i = k - 1; i >= shift; i--) {\n if (x[i - shift] > y[i]) return 1;else if (x[i - shift] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function greater(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = x.length; i < y.length; i++) {\n if (y[i]) return 0;\n } //y has more digits\n\n\n for (i = y.length; i < x.length; i++) {\n if (x[i]) return 1;\n } //x has more digits\n\n\n for (i = k - 1; i >= 0; i--) {\n if (x[i] > y[i]) return 1;else if (x[i] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\n\nexport function divide_(x, y, q, r) {\n var kx, ky;\n var i, j, y1, y2, c, a, b;\n copy_(r, x);\n\n for (ky = y.length; y[ky - 1] === 0; ky--) {\n ;\n } //ky is number of elements in y, not including leading zeros\n //normalize: ensure the most significant element of y has its highest bit set\n\n\n b = y[ky - 1];\n\n for (a = 0; b; a++) {\n b >>= 1;\n }\n\n a = bpe - a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n\n leftShift_(y, a); //multiply both by 1<<a now, then divide both by that at the end\n\n leftShift_(r, a); //Rob Visser discovered a bug: the following line was originally just before the normalization.\n\n for (kx = r.length; r[kx - 1] === 0 && kx > ky; kx--) {\n ;\n } //kx is number of elements in normalized x, not including leading zeros\n\n\n copyInt_(q, 0); // q=0\n\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky); // r=r-leftShift_(y,kx-ky)\n\n q[kx - ky]++; // q[kx-ky]++;\n } // }\n\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask;else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1]); //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky];\n c = y2 >> bpe;\n y2 = y2 & mask;\n y1 = c + q[i - ky] * y[ky - 1];\n c = y1 >> bpe;\n y1 = y1 & mask;\n if (c == r[i] ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1] : c > r[i]) q[i - ky]--;else break;\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky); //r=r-q[i-ky]*leftShift_(y,i-ky)\n\n if (negative(r)) {\n addShift_(r, y, i - ky); //r=r+leftShift_(y,i-ky)\n\n q[i - ky]--;\n }\n }\n\n rightShift_(y, a); //undo the normalization step\n\n rightShift_(r, a); //undo the normalization step\n}\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\n\nexport function carry_(x) {\n var i, k, c, b;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function modInt(x, n) {\n var i,\n c = 0;\n\n for (i = x.length - 1; i >= 0; i--) {\n c = (c * radix + x[i]) % n;\n }\n\n return c;\n}\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\n\nexport function int2bigInt(t, bits, minSize) {\n var i, k;\n k = Math.ceil(bits / bpe) + 1;\n k = minSize > k ? minSize : k;\n var buff = new Array(k);\n copyInt_(buff, t);\n return buff;\n}\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\n\nexport function str2bigInt(s, base, minSize) {\n var d, i, x, y, kk;\n var k = s.length;\n\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0);\n\n for (;;) {\n y = new Array(x.length + 1);\n\n for (i = 0; i < x.length; i++) {\n y[i + 1] = x[i];\n }\n\n y[0] = parseInt(s, 10); //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n\n x = y;\n d = s.indexOf(',', 0);\n if (d < 1) break; //$off\n\n s = s.substring(d + 1);\n if (s.length == 0) break;\n } //$off\n\n\n if (x.length < minSize) {\n //$off\n y = new Array(minSize);\n copy_(y, x);\n return y;\n }\n\n return x;\n }\n\n x = int2bigInt(0, base * k, 0);\n\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0);\n if (base <= 36 && d >= 36) //convert lowercase to uppercase if base<=36\n d -= 26;\n\n if (d >= base || d < 0) {\n //stop at first illegal character\n break;\n }\n\n multInt_(x, base);\n addInt_(x, d);\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--) {\n ;\n } //strip off leading zeros\n //$off\n\n\n k = minSize > k + 1 ? minSize : k + 1; //$off\n\n y = new Array(k); //$off\n\n kk = k < x.length ? k : x.length; //$off\n\n for (i = 0; i < kk; i++) {\n y[i] = x[i];\n } //$off\n\n\n for (; i < k; i++) {\n y[i] = 0;\n }\n\n return y;\n} //return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i<x.length;i++)\n// y[i+1]=x[i];\n// y[0]=parseInt(s,10);\n// x=y;\n// d=s.indexOf(',',0);\n// if (d<1)\n// break;\n// s=s.substring(d+1);\n// if (s.length==0)\n// break;\n// }\n// if (x.length<minSize) {\n// y=new Array(minSize);\n// copy_(y,x);\n// return y;\n// }\n// return x;\n// }\n// x=int2bigInt(0,base*k,0);\n// for (i=0;i<k;i++) {\n// d=str.indexOf(s.substring(i,i+1),0);\n// if (base<=36 && d>=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k<x.length ? k : x.length;\n// for (i=0;i<kk;i++)\n// y[i]=x[i];\n// for (;i<k;i++)\n// y[i]=0;\n// return y;\n// }\n\n/**\n * is bigint x equal to integer y?\n *\n * y must have less than bpe bits\n *\n * @export\n * @param {number[]} x\n * @param {number} y\n * @returns {(1 | 0)}\n */\n\nexport function equalsInt(x, y) {\n var i;\n if (x[0] != y) return 0;\n\n for (i = 1; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * are bigints x and y equal?\n *\n * this works even if x and y are different lengths and have arbitrarily many leading zeros\n *\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function equals(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n if (x[i] !== y[i]) return 0;\n }\n\n if (x.length > y.length) {\n for (; i < x.length; i++) {\n if (x[i]) return 0;\n }\n } else {\n for (; i < y.length; i++) {\n if (y[i]) return 0;\n }\n }\n\n return 1;\n}\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function isZero(x) {\n var i;\n\n for (i = 0; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\n\nexport function bigInt2str(x, base) {\n var i,\n t,\n s = '';\n if (s6.length !== x.length) s6 = dup(x);else copy_(s6, x);\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) {\n s += x[i] + ',';\n }\n\n s += x[0];\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base); //t=s6 % base; s6=floor(s6/base);\n\n s = digitsStr.substring(t, t + 1) + s;\n }\n }\n\n if (s.length === 0) s = '0';\n return s;\n}\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\n\nexport function dup(x) {\n var i;\n buff = Array(x.length);\n copy_(buff, x);\n return buff;\n}\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\n\nexport function copy_(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n x[i] = y[i];\n }\n\n for (i = k; i < x.length; i++) {\n x[i] = 0;\n }\n}\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function copyInt_(x, n) {\n var i, c;\n var len = x.length; //TODO .length in for loop have perfomance costs. Bench this\n\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function addInt_(x, n) {\n var i, k, c, b;\n x[0] += n;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n if (!c) return; //stop carrying as soon as the carry is zero\n }\n}\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\n\nexport function rightShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = 0; i < x.length - k; i++ //right shift x by k elements\n ) {\n x[i] = x[i + k];\n }\n\n for (; i < x.length; i++) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - n | x[i] >> n);\n }\n\n x[i] >>= n;\n}\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\n\nexport function halve_(x) {\n var i;\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - 1 | x[i] >> 1);\n }\n\n x[i] = x[i] >> 1 | x[i] & radix >> 1; //most significant bit stays the same\n}\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function leftShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = x.length; i >= k; i-- //left shift x by k elements\n ) {\n x[i] = x[i - k];\n }\n\n for (; i >= 0; i--) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n if (!n) return;\n\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & (x[i] << n | x[i - 1] >> bpe - n);\n }\n\n x[i] = mask & x[i] << n;\n}\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function multInt_(x, n) {\n var i, k, c, b;\n if (!n) return;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i] * n;\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\n\nexport function divInt_(x, n) {\n var i,\n r = 0,\n s;\n\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i];\n x[i] = Math.floor(s / n);\n r = s % n;\n }\n\n return r;\n}\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\n\nexport function linComb_(x, y, a, b) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n kk = x.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; i < kk; i++) {\n c += a * x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\n\nexport function linCombShift_(x, y, b, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function addShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function subShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function sub_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function add_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function mult_(x, y) {\n var i;\n if (ss.length != 2 * x.length) ss = new Array(2 * x.length);\n copyInt_(ss, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(ss, x, y[i], i);\n } //ss=1*ss+y[i]*(x<<(i*bpe))\n\n\n copy_(x, ss);\n}\n/**\n * do x=x mod n for bigInts x and n\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function mod_(x, n) {\n if (s4.length !== x.length) s4 = dup(x);else copy_(s4, x);\n if (s5.length !== x.length) s5 = dup(x);\n divide_(s4, n, s5, x); //x = remainder of s4 / n\n}\n/**\n * do x=x*y mod n for bigInts x,y,n.\n *\n * for greater speed, let y<x.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function multMod_(x, y, n) {\n var i;\n if (s0.length != 2 * x.length) s0 = new Array(2 * x.length);\n copyInt_(s0, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(s0, x, y[i], i);\n } //s0=1*s0+y[i]*(x<<(i*bpe))\n\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * do x=x*x mod n for bigInts x,n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function squareMod_(x, n) {\n var i, j, d, c, kx, kn, k;\n\n for (kx = x.length; kx > 0 && !x[kx - 1]; kx--) {\n ;\n } //ignore leading zeros in x\n\n\n k = kx > n.length ? 2 * kx : 2 * n.length; //k=# elements in the product, which is twice the elements in the larger of x and n\n\n if (s0.length != k) s0 = new Array(k);\n copyInt_(s0, 0);\n\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i];\n s0[2 * i] = c & mask;\n c >>= bpe;\n\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c;\n s0[i + j] = c & mask;\n c >>= bpe;\n }\n\n s0[i + kx] = c;\n }\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function trim(x, k) {\n var i, y;\n\n for (i = x.length; i > 0 && !x[i - 1]; i--) {\n ;\n }\n\n y = new Array(i + k);\n copy_(y, x);\n return y;\n}\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function powMod_(x, y, n) {\n var k1, k2, kn, np;\n if (s7.length != n.length) s7 = dup(n); //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n\n if ((n[0] & 1) == 0) {\n copy_(s7, x);\n copyInt_(x, 1);\n\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n);\n divInt_(y, 2);\n squareMod_(s7, n);\n }\n\n return;\n } //calculate np from n for the Montgomery multiplications\n\n\n copyInt_(s7, 0);\n\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--) {\n ;\n }\n\n np = radix - inverseModInt(modInt(n, radix), radix);\n s7[kn] = 1;\n multMod_(x, s7, n); // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x);else copy_(s3, x); //$off\n\n for (k1 = y.length - 1; k1 > 0 & !y[k1]; k1--) {\n ;\n } //k1=first nonzero element of y\n\n\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1);\n return;\n }\n\n for (k2 = 1 << bpe - 1; k2 && !(y[k1] & k2); k2 >>= 1) {\n ;\n } //k2=position of first 1 bit in y[k1]\n\n\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--;\n\n if (k1 < 0) {\n mont_(x, one, n, np);\n return;\n }\n\n k2 = 1 << bpe - 1;\n }\n\n mont_(x, x, n, np);\n if (k2 & y[k1]) //if next bit is a 1\n mont_(x, s3, n, np);\n }\n}\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\n\nexport function mont_(x, y, n, np) {\n var i, j, c, ui, t, ks;\n var kn = n.length;\n var ky = y.length;\n if (sa.length != kn) sa = new Array(kn);\n copyInt_(sa, 0);\n\n for (; kn > 0 && n[kn - 1] == 0; kn--) {\n ;\n } //ignore leading zeros of n\n\n\n for (; ky > 0 && y[ky - 1] == 0; ky--) {\n ;\n } //ignore leading zeros of y\n\n\n ks = sa.length - 1; //sa will never have more than this many nonzero elements.\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0];\n ui = (t & mask) * np & mask; //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n\n c = t + ui * n[0] >> bpe;\n t = x[i]; //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n\n j = 1;\n\n for (; j < ky - 4;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ky;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn - 4;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ks;) {\n c += sa[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n sa[j - 1] = c & mask;\n }\n\n if (!greater(n, sa)) sub_(sa, n);\n copy_(x, sa);\n}\n//# sourceMappingURL=index.js.map"
},
{
"id": 5,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/pako/dist/pako_inflate.min.js",
"name": "./node_modules/pako/dist/pako_inflate.min.js",
"index": 5,
"index2": 3,
"size": 22682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "pako/dist/pako_inflate.min.js",
"loc": "62:44-84"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).pako=e()}}(function(){return function r(o,s,f){function l(t,e){if(!s[t]){if(!o[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(d)return d(t,!0);var n=new Error(\"Cannot find module '\"+t+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var a=s[t]={exports:{}};o[t][0].call(a.exports,function(e){return l(o[t][1][e]||e)},a,a.exports,r,o,s,f)}return s[t].exports}for(var d=\"function\"==typeof require&&require,e=0;e<f.length;e++)l(f[e]);return l}({1:[function(e,t,i){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;i.assign=function(e){for(var t,i,n=Array.prototype.slice.call(arguments,1);n.length;){var a=n.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var r in a)t=a,i=r,Object.prototype.hasOwnProperty.call(t,i)&&(e[r]=a[r])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,i,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+n),a);else for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){var t,i,n,a,r,o;for(t=n=0,i=e.length;t<i;t++)n+=e[t].length;for(o=new Uint8Array(n),t=a=0,i=e.length;t<i;t++)r=e[t],o.set(r,a),a+=r.length;return o}},r={arraySet:function(e,t,i,n,a){for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,a)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,r))},i.setTyped(n)},{}],2:[function(e,t,i){\"use strict\";var f=e(\"./common\"),a=!0,r=!0;try{String.fromCharCode.apply(null,[0])}catch(e){a=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){r=!1}for(var l=new f.Buf8(256),n=0;n<256;n++)l[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function d(e,t){if(t<65534&&(e.subarray&&r||!e.subarray&&a))return String.fromCharCode.apply(null,f.shrinkBuf(e,t));for(var i=\"\",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}l[254]=l[254]=1,i.string2buf=function(e){var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new f.Buf8(s),a=r=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:(i<2048?t[r++]=192|i>>>6:(i<65536?t[r++]=224|i>>>12:(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63),t[r++]=128|i>>>6&63),t[r++]=128|63&i);return t},i.buf2binstring=function(e){return d(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i<n;i++)t[i]=e.charCodeAt(i);return t},i.buf2string=function(e,t){var i,n,a,r,o=t||e.length,s=new Array(2*o);for(i=n=0;i<o;)if((a=e[i++])<128)s[n++]=a;else if(4<(r=l[a]))s[n++]=65533,i+=r-1;else{for(a&=2===r?31:3===r?15:7;1<r&&i<o;)a=a<<6|63&e[i++],r--;1<r?s[n++]=65533:a<65536?s[n++]=a:(a-=65536,s[n++]=55296|a>>10&1023,s[n++]=56320|1023&a)}return d(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return i<0?t:0===i?t:i+l[e[i]]>t?i:t}},{\"./common\":1}],3:[function(e,t,i){\"use strict\";t.exports=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){for(i-=o=2e3<i?2e3:i;r=r+(a=a+t[n++]|0)|0,--o;);a%=65521,r%=65521}return a|r<<16|0}},{}],4:[function(e,t,i){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],5:[function(e,t,i){\"use strict\";var s=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var a=s,r=n+i;e^=-1;for(var o=n;o<r;o++)e=e>>>8^a[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){\"use strict\";t.exports=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z;i=e.state,n=e.next_in,E=e.input,a=n+(e.avail_in-5),r=e.next_out,Z=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),f=i.dmax,l=i.wsize,d=i.whave,c=i.wnext,u=i.window,h=i.hold,b=i.bits,m=i.lencode,w=i.distcode,k=(1<<i.lenbits)-1,_=(1<<i.distbits)-1;e:do{b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=m[h&k];t:for(;;){if(h>>>=v=g>>>24,b-=v,0===(v=g>>>16&255))Z[r++]=65535&g;else{if(!(16&v)){if(0==(64&v)){g=m[(65535&g)+(h&(1<<v)-1)];continue t}if(32&v){i.mode=12;break e}e.msg=\"invalid literal/length code\",i.mode=30;break e}p=65535&g,(v&=15)&&(b<v&&(h+=E[n++]<<b,b+=8),p+=h&(1<<v)-1,h>>>=v,b-=v),b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=w[h&_];i:for(;;){if(h>>>=v=g>>>24,b-=v,!(16&(v=g>>>16&255))){if(0==(64&v)){g=w[(65535&g)+(h&(1<<v)-1)];continue i}e.msg=\"invalid distance code\",i.mode=30;break e}if(x=65535&g,b<(v&=15)&&(h+=E[n++]<<b,(b+=8)<v&&(h+=E[n++]<<b,b+=8)),f<(x+=h&(1<<v)-1)){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(h>>>=v,b-=v,(v=r-o)<x){if(d<(v=x-v)&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(S=u,(y=0)===c){if(y+=l-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}}else if(c<v){if(y+=l+c-v,(v-=c)<p){for(p-=v;Z[r++]=u[y++],--v;);if(y=0,c<p){for(p-=v=c;Z[r++]=u[y++],--v;);y=r-x,S=Z}}}else if(y+=c-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}for(;2<p;)Z[r++]=S[y++],Z[r++]=S[y++],Z[r++]=S[y++],p-=3;p&&(Z[r++]=S[y++],1<p&&(Z[r++]=S[y++]))}else{for(y=r-x;Z[r++]=Z[y++],Z[r++]=Z[y++],Z[r++]=Z[y++],2<(p-=3););p&&(Z[r++]=Z[y++],1<p&&(Z[r++]=Z[y++]))}break}}break}}while(n<a&&r<s);n-=p=b>>3,h&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n<a?a-n+5:5-(n-a),e.avail_out=r<s?s-r+257:257-(r-s),i.hold=h,i.bits=b}},{}],8:[function(e,t,i){\"use strict\";var z=e(\"../utils/common\"),R=e(\"./adler32\"),N=e(\"./crc32\"),O=e(\"./inffast\"),C=e(\"./inftrees\"),I=1,D=2,T=0,U=-2,F=1,n=852,a=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new z.Buf16(320),this.work=new z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new z.Buf32(n),t.distcode=t.distdyn=new z.Buf32(a),t.sane=1,t.back=-1,T):U}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):U}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,s(e))):U}function l(e,t){var i,n;return e?(n=new r,(e.state=n).window=null,(i=f(e,t))!==T&&(e.state=null),i):U}var d,c,u=!0;function H(e){if(u){var t;for(d=new z.Buf32(512),c=new z.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(C(I,e.lens,0,288,d,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;C(D,e.lens,0,32,c,0,e.work,{bits:5}),u=!1}e.lencode=d,e.lenbits=9,e.distcode=c,e.distbits=5}function j(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new z.Buf8(r.wsize)),n>=r.wsize?(z.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(a=r.wsize-r.wnext)&&(a=n),z.arraySet(r.window,t,i-n,a,r.wnext),(n-=a)?(z.arraySet(r.window,t,i-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0}i.inflateReset=s,i.inflateReset2=f,i.inflateResetKeep=o,i.inflateInit=function(e){return l(e,15)},i.inflateInit2=l,i.inflate=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z=0,B=new z.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(i=e.state).mode&&(i.mode=13),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,c=s,u=f,y=T;e:for(;;)switch(i.mode){case F:if(0===i.wrap){i.mode=13;break}for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(2&i.wrap&&35615===l){B[i.check=0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0),d=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg=\"incorrect header check\",i.mode=30;break}if(8!=(15&l)){e.msg=\"unknown compression method\",i.mode=30;break}if(d-=4,x=8+(15&(l>>>=4)),0===i.wbits)i.wbits=x;else if(x>i.wbits){e.msg=\"invalid window size\",i.mode=30;break}i.dmax=1<<x,e.adler=i.check=1,i.mode=512&l?10:12,d=l=0;break;case 2:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.flags=l,8!=(255&i.flags)){e.msg=\"unknown compression method\",i.mode=30;break}if(57344&i.flags){e.msg=\"unknown header flags set\",i.mode=30;break}i.head&&(i.head.text=l>>8&1),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=3;case 3:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.time=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,B[2]=l>>>16&255,B[3]=l>>>24&255,i.check=N(i.check,B,4,0)),d=l=0,i.mode=4;case 4:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.xflags=255&l,i.head.os=l>>8),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=5;case 5:if(1024&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length=l,i.head&&(i.head.extra_len=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(s<(h=i.length)&&(h=s),h&&(i.head&&(x=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),z.arraySet(i.head.extra,n,r,h,x)),512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.name+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.comment+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(65535&i.check)){e.msg=\"header crc mismatch\",i.mode=30;break}d=l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}e.adler=i.check=L(l),d=l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,2;e.adler=i.check=1,i.mode=12;case 12:if(5===t||6===t)break e;case 13:if(i.last){l>>>=7&d,d-=7&d,i.mode=27;break}for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}switch(i.last=1&l,d-=1,3&(l>>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,d-=2;break e;case 2:i.mode=17;break;case 3:e.msg=\"invalid block type\",i.mode=30}l>>>=2,d-=2;break;case 14:for(l>>>=7&d,d-=7&d;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if((65535&l)!=(l>>>16^65535)){e.msg=\"invalid stored block lengths\",i.mode=30;break}if(i.length=65535&l,d=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(s<h&&(h=s),f<h&&(h=f),0===h)break e;z.arraySet(a,n,r,h,o),s-=h,r+=h,f-=h,o+=h,i.length-=h;break}i.mode=12;break;case 17:for(;d<14;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.nlen=257+(31&l),l>>>=5,d-=5,i.ndist=1+(31&l),l>>>=5,d-=5,i.ncode=4+(15&l),l>>>=4,d-=4,286<i.nlen||30<i.ndist){e.msg=\"too many length or distance symbols\",i.mode=30;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.lens[A[i.have++]]=7&l,l>>>=3,d-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,S={bits:i.lenbits},y=C(0,i.lens,0,19,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid code lengths set\",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(_<16)l>>>=w,d-=w,i.lens[i.have++]=_;else{if(16===_){for(E=w+2;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l>>>=w,d-=w,0===i.have){e.msg=\"invalid bit length repeat\",i.mode=30;break}x=i.lens[i.have-1],h=3+(3&l),l>>>=2,d-=2}else if(17===_){for(E=w+3;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=3+(7&(l>>>=w)),l>>>=3,d-=3}else{for(E=w+7;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=11+(127&(l>>>=w)),l>>>=7,d-=7}if(i.have+h>i.nlen+i.ndist){e.msg=\"invalid bit length repeat\",i.mode=30;break}for(;h--;)i.lens[i.have++]=x}}if(30===i.mode)break;if(0===i.lens[256]){e.msg=\"invalid code -- missing end-of-block\",i.mode=30;break}if(i.lenbits=9,S={bits:i.lenbits},y=C(I,i.lens,0,i.nlen,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid literal/lengths set\",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,S={bits:i.distbits},y=C(D,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,S),i.distbits=S.bits,y){e.msg=\"invalid distances set\",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,O(e,u),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(k&&0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.lencode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,i.length=_,0===k){i.mode=26;break}if(32&k){i.back=-1,i.mode=12;break}if(64&k){e.msg=\"invalid literal/length code\",i.mode=30;break}i.extra=15&k,i.mode=22;case 22:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;k=(Z=i.distcode[l&(1<<i.distbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.distcode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,64&k){e.msg=\"invalid distance code\",i.mode=30;break}i.offset=_,i.extra=15&k,i.mode=24;case 24:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.offset+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg=\"invalid distance too far back\",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(h=u-f,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break}h>i.wnext?(h-=i.wnext,b=i.wsize-h):b=i.wnext-h,h>i.length&&(h=i.length),m=i.window}else m=a,b=o-i.offset,h=i.length;for(f<h&&(h=f),f-=h,i.length-=h;a[o++]=m[b++],--h;);0===i.length&&(i.mode=21);break;case 26:if(0===f)break e;a[o++]=i.length,f--,i.mode=21;break;case 27:if(i.wrap){for(;d<32;){if(0===s)break e;s--,l|=n[r++]<<d,d+=8}if(u-=f,e.total_out+=u,i.total+=u,u&&(e.adler=i.check=i.flags?N(i.check,a,u,o-u):R(i.check,a,u,o-u)),u=f,(i.flags?l:L(l))!==i.check){e.msg=\"incorrect data check\",i.mode=30;break}d=l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(4294967295&i.total)){e.msg=\"incorrect length check\",i.mode=30;break}d=l=0}i.mode=29;case 29:y=1;break e;case 30:y=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,(i.wsize||u!==e.avail_out&&i.mode<30&&(i.mode<27||4!==t))&&j(e,e.output,e.next_out,u-e.avail_out)?(i.mode=31,-4):(c-=e.avail_in,u-=e.avail_out,e.total_in+=c,e.total_out+=u,i.total+=u,i.wrap&&u&&(e.adler=i.check=i.flags?N(i.check,a,u,e.next_out-u):R(i.check,a,u,e.next_out-u)),e.data_type=i.bits+(i.last?64:0)+(12===i.mode?128:0)+(20===i.mode||15===i.mode?256:0),(0===c&&0===u||4===t)&&y===T&&(y=-5),y)},i.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,T},i.inflateGetHeader=function(e,t){var i;return e&&e.state?0==(2&(i=e.state).wrap)?U:((i.head=t).done=!1,T):U},i.inflateSetDictionary=function(e,t){var i,n=t.length;return e&&e.state?0!==(i=e.state).wrap&&11!==i.mode?U:11===i.mode&&R(1,t,n,0)!==i.check?-3:j(e,t,n,n)?(i.mode=31,-4):(i.havedict=1,T):U},i.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":1,\"./adler32\":3,\"./crc32\":5,\"./inffast\":7,\"./inftrees\":9}],9:[function(e,t,i){\"use strict\";var I=e(\"../utils/common\"),D=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],T=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],F=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,i,n,a,r,o,s){var f,l,d,c,u,h,b,m,w,k=s.bits,_=0,g=0,v=0,p=0,x=0,y=0,S=0,E=0,Z=0,B=0,A=null,z=0,R=new I.Buf16(16),N=new I.Buf16(16),O=null,C=0;for(_=0;_<=15;_++)R[_]=0;for(g=0;g<n;g++)R[t[i+g]]++;for(x=k,p=15;1<=p&&0===R[p];p--);if(p<x&&(x=p),0===p)return a[r++]=20971520,a[r++]=20971520,s.bits=1,0;for(v=1;v<p&&0===R[v];v++);for(x<v&&(x=v),_=E=1;_<=15;_++)if(E<<=1,(E-=R[_])<0)return-1;if(0<E&&(0===e||1!==p))return-1;for(N[1]=0,_=1;_<15;_++)N[_+1]=N[_]+R[_];for(g=0;g<n;g++)0!==t[i+g]&&(o[N[t[i+g]]++]=g);if(0===e?(A=O=o,h=19):1===e?(A=D,z-=257,O=T,C-=257,h=256):(A=U,O=F,h=-1),_=v,u=r,S=g=B=0,d=-1,c=(Z=1<<(y=x))-1,1===e&&852<Z||2===e&&592<Z)return 1;for(;;){for(b=_-S,o[g]<h?(m=0,w=o[g]):o[g]>h?(m=O[C+o[g]],w=A[z+o[g]]):(m=96,w=0),f=1<<_-S,v=l=1<<y;a[u+(B>>S)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<_-1;B&f;)f>>=1;if(0!==f?(B&=f-1,B+=f):B=0,g++,0==--R[_]){if(_===p)break;_=t[i+o[g]]}if(x<_&&(B&c)!==d){for(0===S&&(S=x),u+=v,E=1<<(y=_-S);y+S<p&&!((E-=R[y+S])<=0);)y++,E<<=1;if(Z+=1<<y,1===e&&852<Z||2===e&&592<Z)return 1;a[d=B&c]=x<<24|y<<16|u-r|0}}return 0!==B&&(a[u+B]=_-S<<24|64<<16|0),s.bits=x,0}},{\"../utils/common\":1}],10:[function(e,t,i){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],11:[function(e,t,i){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],\"/lib/inflate.js\":[function(e,t,i){\"use strict\";var c=e(\"./zlib/inflate\"),u=e(\"./utils/common\"),h=e(\"./utils/strings\"),b=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),a=e(\"./zlib/zstream\"),r=e(\"./zlib/gzheader\"),m=Object.prototype.toString;function o(e){if(!(this instanceof o))return new o(e);this.options=u.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var i=c.inflateInit2(this.strm,t.windowBits);if(i!==b.Z_OK)throw new Error(n[i]);if(this.header=new r,c.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===m.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=c.inflateSetDictionary(this.strm,t.dictionary))!==b.Z_OK))throw new Error(n[i])}function s(e,t){var i=new o(t);if(i.push(e,!0),i.err)throw i.msg||n[i.err];return i.result}o.prototype.push=function(e,t){var i,n,a,r,o,s=this.strm,f=this.options.chunkSize,l=this.options.dictionary,d=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?b.Z_FINISH:b.Z_NO_FLUSH,\"string\"==typeof e?s.input=h.binstring2buf(e):\"[object ArrayBuffer]\"===m.call(e)?s.input=new Uint8Array(e):s.input=e,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new u.Buf8(f),s.next_out=0,s.avail_out=f),(i=c.inflate(s,b.Z_NO_FLUSH))===b.Z_NEED_DICT&&l&&(i=c.inflateSetDictionary(this.strm,l)),i===b.Z_BUF_ERROR&&!0===d&&(i=b.Z_OK,d=!1),i!==b.Z_STREAM_END&&i!==b.Z_OK)return this.onEnd(i),!(this.ended=!0);s.next_out&&(0!==s.avail_out&&i!==b.Z_STREAM_END&&(0!==s.avail_in||n!==b.Z_FINISH&&n!==b.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(a=h.utf8border(s.output,s.next_out),r=s.next_out-a,o=h.buf2string(s.output,a),s.next_out=r,s.avail_out=f-r,r&&u.arraySet(s.output,s.output,a,r,0),this.onData(o)):this.onData(u.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(d=!0)}while((0<s.avail_in||0===s.avail_out)&&i!==b.Z_STREAM_END);return i===b.Z_STREAM_END&&(n=b.Z_FINISH),n===b.Z_FINISH?(i=c.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===b.Z_OK):n!==b.Z_SYNC_FLUSH||(this.onEnd(b.Z_OK),!(s.avail_out=0))},o.prototype.onData=function(e){this.chunks.push(e)},o.prototype.onEnd=function(e){e===b.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=o,i.inflate=s,i.inflateRaw=function(e,t){return(t=t||{}).raw=!0,s(e,t)},i.ungzip=s},{\"./utils/common\":1,\"./utils/strings\":2,\"./zlib/constants\":4,\"./zlib/gzheader\":6,\"./zlib/inflate\":8,\"./zlib/messages\":10,\"./zlib/zstream\":11}]},{},[])(\"/lib/inflate.js\")});\n"
},
{
"id": 6,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.js",
"name": "./src/lib/crypto.js",
"index": 6,
"index2": 4,
"size": 97349,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./crypto.js",
"loc": "63:15-37"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * CryptoJS core components.\r\n */\r\n\r\nconsole.log('CryptoJS included!');\r\n\r\nvar CryptoJS = this.CryptoJS = globalThis.CryptoJS = CryptoJS || (function (Math, undefined) {\r\n /**\r\n * CryptoJS namespace.\r\n */\r\n var C = {};\r\n\r\n /**\r\n * Library namespace.\r\n */\r\n var C_lib = C.lib = {};\r\n\r\n /**\r\n * Base object for prototypal inheritance.\r\n */\r\n var Base = C_lib.Base = (function () {\r\n function F() {}\r\n\r\n return {\r\n /**\r\n * Creates a new object that inherits from this object.\r\n *\r\n * @param {Object} overrides Properties to copy into the new object.\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * field: 'value',\r\n *\r\n * method: function () {\r\n * }\r\n * });\r\n */\r\n extend: function (overrides) {\r\n // Spawn\r\n F.prototype = this;\r\n var subtype = new F();\r\n\r\n // Augment\r\n if (overrides) {\r\n subtype.mixIn(overrides);\r\n }\r\n\r\n // Create default initializer\r\n if (!subtype.hasOwnProperty('init')) {\r\n subtype.init = function () {\r\n subtype.$super.init.apply(this, arguments);\r\n };\r\n }\r\n\r\n // Initializer's prototype is the subtype object\r\n subtype.init.prototype = subtype;\r\n\r\n // Reference supertype\r\n subtype.$super = this;\r\n\r\n return subtype;\r\n },\r\n\r\n /**\r\n * Extends this object and runs the init method.\r\n * Arguments to create() will be passed to init().\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var instance = MyType.create();\r\n */\r\n create: function () {\r\n var instance = this.extend();\r\n instance.init.apply(instance, arguments);\r\n\r\n return instance;\r\n },\r\n\r\n /**\r\n * Initializes a newly created object.\r\n * Override this method to add some logic when your objects are created.\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * init: function () {\r\n * // ...\r\n * }\r\n * });\r\n */\r\n init: function () {\r\n },\r\n\r\n /**\r\n * Copies properties into this object.\r\n *\r\n * @param {Object} properties The properties to mix in.\r\n *\r\n * @example\r\n *\r\n * MyType.mixIn({\r\n * field: 'value'\r\n * });\r\n */\r\n mixIn: function (properties) {\r\n for (var propertyName in properties) {\r\n if (properties.hasOwnProperty(propertyName)) {\r\n this[propertyName] = properties[propertyName];\r\n }\r\n }\r\n\r\n // IE won't copy toString using the loop above\r\n if (properties.hasOwnProperty('toString')) {\r\n this.toString = properties.toString;\r\n }\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = instance.clone();\r\n */\r\n clone: function () {\r\n return this.init.prototype.extend(this);\r\n }\r\n };\r\n }());\r\n\r\n /**\r\n * An array of 32-bit words.\r\n *\r\n * @property {Array} words The array of 32-bit words.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var WordArray = C_lib.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of 32-bit words.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.create();\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 4;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this word array to a string.\r\n *\r\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\r\n *\r\n * @return {string} The stringified word array.\r\n *\r\n * @example\r\n *\r\n * var string = wordArray + '';\r\n * var string = wordArray.toString();\r\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\r\n */\r\n toString: function (encoder) {\r\n return (encoder || Hex).stringify(this);\r\n },\r\n\r\n /**\r\n * Concatenates a word array to this word array.\r\n *\r\n * @param {WordArray} wordArray The word array to append.\r\n *\r\n * @return {WordArray} This word array.\r\n *\r\n * @example\r\n *\r\n * wordArray1.concat(wordArray2);\r\n */\r\n concat: function (wordArray) {\r\n // Shortcuts\r\n var thisWords = this.words;\r\n var thatWords = wordArray.words;\r\n var thisSigBytes = this.sigBytes;\r\n var thatSigBytes = wordArray.sigBytes;\r\n\r\n // Clamp excess bits\r\n this.clamp();\r\n\r\n // Concat\r\n if (thisSigBytes % 4) {\r\n // Copy one byte at a time\r\n for (var i = 0; i < thatSigBytes; i++) {\r\n var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\r\n }\r\n } else if (thatWords.length > 0xffff) {\r\n // Copy one word at a time\r\n for (var i = 0; i < thatSigBytes; i += 4) {\r\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\r\n }\r\n } else {\r\n // Copy all words at once\r\n // thisWords.push.apply(thisWords, thatWords);\r\n\r\n // HOTFIX from: https://code.google.com/p/crypto-js/issues/detail?id=90\r\n for (var i = 0; i < thatWords.length; i++) {\r\n thisWords.push(thatWords[i]);\r\n }\r\n }\r\n this.sigBytes += thatSigBytes;\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Removes insignificant bits.\r\n *\r\n * @example\r\n *\r\n * wordArray.clamp();\r\n */\r\n clamp: function () {\r\n // Shortcuts\r\n var words = this.words;\r\n var sigBytes = this.sigBytes;\r\n\r\n // Clamp\r\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\r\n words.length = Math.ceil(sigBytes / 4);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = wordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone.words = this.words.slice(0);\r\n\r\n return clone;\r\n },\r\n\r\n /**\r\n * Creates a word array filled with random bytes.\r\n *\r\n * @param {number} nBytes The number of random bytes to generate.\r\n *\r\n * @return {WordArray} The random word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.random(16);\r\n */\r\n random: function (nBytes) {\r\n var words = [];\r\n for (var i = 0; i < nBytes; i += 4) {\r\n words.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n return new WordArray.init(words, nBytes);\r\n }\r\n });\r\n\r\n /**\r\n * Encoder namespace.\r\n */\r\n var C_enc = C.enc = {};\r\n\r\n /**\r\n * Hex encoding strategy.\r\n */\r\n var Hex = C_enc.Hex = {\r\n /**\r\n * Converts a word array to a hex string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The hex string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var hexChars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n hexChars.push((bite >>> 4).toString(16));\r\n hexChars.push((bite & 0x0f).toString(16));\r\n }\r\n\r\n return hexChars.join('');\r\n },\r\n\r\n /**\r\n * Converts a hex string to a word array.\r\n *\r\n * @param {string} hexStr The hex string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\r\n */\r\n parse: function (hexStr) {\r\n // Shortcut\r\n var hexStrLength = hexStr.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < hexStrLength; i += 2) {\r\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\r\n }\r\n\r\n return new WordArray.init(words, hexStrLength / 2);\r\n }\r\n };\r\n\r\n /**\r\n * Latin1 encoding strategy.\r\n */\r\n var Latin1 = C_enc.Latin1 = {\r\n /**\r\n * Converts a word array to a Latin1 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The Latin1 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var latin1Chars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n latin1Chars.push(String.fromCharCode(bite));\r\n }\r\n\r\n return latin1Chars.join('');\r\n },\r\n\r\n /**\r\n * Converts a Latin1 string to a word array.\r\n *\r\n * @param {string} latin1Str The Latin1 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\r\n */\r\n parse: function (latin1Str) {\r\n // Shortcut\r\n var latin1StrLength = latin1Str.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < latin1StrLength; i++) {\r\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new WordArray.init(words, latin1StrLength);\r\n }\r\n };\r\n\r\n /**\r\n * UTF-8 encoding strategy.\r\n */\r\n var Utf8 = C_enc.Utf8 = {\r\n /**\r\n * Converts a word array to a UTF-8 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The UTF-8 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n try {\r\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\r\n } catch (e) {\r\n throw new Error('Malformed UTF-8 data');\r\n }\r\n },\r\n\r\n /**\r\n * Converts a UTF-8 string to a word array.\r\n *\r\n * @param {string} utf8Str The UTF-8 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\r\n */\r\n parse: function (utf8Str) {\r\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\r\n }\r\n };\r\n\r\n /**\r\n * Abstract buffered block algorithm template.\r\n *\r\n * The property blockSize must be implemented in a concrete subtype.\r\n *\r\n * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\r\n */\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\r\n /**\r\n * Resets this block algorithm's data buffer to its initial state.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm.reset();\r\n */\r\n reset: function () {\r\n // Initial values\r\n this._data = new WordArray.init();\r\n this._nDataBytes = 0;\r\n },\r\n\r\n /**\r\n * Adds new data to this block algorithm's buffer.\r\n *\r\n * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm._append('data');\r\n * bufferedBlockAlgorithm._append(wordArray);\r\n */\r\n _append: function (data) {\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof data == 'string') {\r\n data = Utf8.parse(data);\r\n }\r\n\r\n // Append\r\n this._data.concat(data);\r\n this._nDataBytes += data.sigBytes;\r\n },\r\n\r\n /**\r\n * Processes available data blocks.\r\n *\r\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\r\n *\r\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\r\n *\r\n * @return {WordArray} The processed data.\r\n *\r\n * @example\r\n *\r\n * var processedData = bufferedBlockAlgorithm._process();\r\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\r\n */\r\n _process: function (doFlush) {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n var dataSigBytes = data.sigBytes;\r\n var blockSize = this.blockSize;\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count blocks ready\r\n var nBlocksReady = dataSigBytes / blockSizeBytes;\r\n if (doFlush) {\r\n // Round up to include partial blocks\r\n nBlocksReady = Math.ceil(nBlocksReady);\r\n } else {\r\n // Round down to include only full blocks,\r\n // less the number of blocks that must remain in the buffer\r\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\r\n }\r\n\r\n // Count words ready\r\n var nWordsReady = nBlocksReady * blockSize;\r\n\r\n // Count bytes ready\r\n var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\r\n\r\n // Process blocks\r\n if (nWordsReady) {\r\n for (var offset = 0; offset < nWordsReady; offset += blockSize) {\r\n // Perform concrete-algorithm logic\r\n this._doProcessBlock(dataWords, offset);\r\n }\r\n\r\n // Remove processed words\r\n var processedWords = dataWords.splice(0, nWordsReady);\r\n data.sigBytes -= nBytesReady;\r\n }\r\n\r\n // Return processed words\r\n return new WordArray.init(processedWords, nBytesReady);\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = bufferedBlockAlgorithm.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone._data = this._data.clone();\r\n\r\n return clone;\r\n },\r\n\r\n _minBufferSize: 0\r\n });\r\n\r\n /**\r\n * Abstract hasher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\r\n */\r\n var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Initializes a newly created hasher.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\r\n *\r\n * @example\r\n *\r\n * var hasher = CryptoJS.algo.SHA256.create();\r\n */\r\n init: function (cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this hasher to its initial state.\r\n *\r\n * @example\r\n *\r\n * hasher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-hasher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Updates this hasher with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {Hasher} This hasher.\r\n *\r\n * @example\r\n *\r\n * hasher.update('message');\r\n * hasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n // Append\r\n this._append(messageUpdate);\r\n\r\n // Update the hash\r\n this._process();\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the hash computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @example\r\n *\r\n * var hash = hasher.finalize();\r\n * var hash = hasher.finalize('message');\r\n * var hash = hasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Final message update\r\n if (messageUpdate) {\r\n this._append(messageUpdate);\r\n }\r\n\r\n // Perform concrete-hasher logic\r\n var hash = this._doFinalize();\r\n\r\n return hash;\r\n },\r\n\r\n blockSize: 512/32,\r\n\r\n /**\r\n * Creates a shortcut function to a hasher's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to create a helper for.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHelper: function (hasher) {\r\n return function (message, cfg) {\r\n return new hasher.init(cfg).finalize(message);\r\n };\r\n },\r\n\r\n /**\r\n * Creates a shortcut function to the HMAC's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to use in this HMAC helper.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHmacHelper: function (hasher) {\r\n return function (message, key) {\r\n return new C_algo.HMAC.init(hasher, key).finalize(message);\r\n };\r\n }\r\n });\r\n\r\n /**\r\n * Algorithm namespace.\r\n */\r\n var C_algo = C.algo = {};\r\n\r\n return C;\r\n}(Math));\r\n\r\nmodule.exports = CryptoJS;\r\n\r\n(function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var X32WordArray = C_lib.WordArray;\r\n\r\n /**\r\n * x64 namespace.\r\n */\r\n var C_x64 = C.x64 = {};\r\n\r\n /**\r\n * A 64-bit word.\r\n */\r\n var X64Word = C_x64.Word = Base.extend({\r\n /**\r\n * Initializes a newly created 64-bit word.\r\n *\r\n * @param {number} high The high 32 bits.\r\n * @param {number} low The low 32 bits.\r\n *\r\n * @example\r\n *\r\n * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\r\n */\r\n init: function (high, low) {\r\n this.high = high;\r\n this.low = low;\r\n }\r\n\r\n /**\r\n * Bitwise NOTs this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after negating.\r\n *\r\n * @example\r\n *\r\n * var negated = x64Word.not();\r\n */\r\n // not: function () {\r\n // var high = ~this.high;\r\n // var low = ~this.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ANDs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to AND with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ANDing.\r\n *\r\n * @example\r\n *\r\n * var anded = x64Word.and(anotherX64Word);\r\n */\r\n // and: function (word) {\r\n // var high = this.high & word.high;\r\n // var low = this.low & word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to OR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ORing.\r\n *\r\n * @example\r\n *\r\n * var ored = x64Word.or(anotherX64Word);\r\n */\r\n // or: function (word) {\r\n // var high = this.high | word.high;\r\n // var low = this.low | word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise XORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to XOR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after XORing.\r\n *\r\n * @example\r\n *\r\n * var xored = x64Word.xor(anotherX64Word);\r\n */\r\n // xor: function (word) {\r\n // var high = this.high ^ word.high;\r\n // var low = this.low ^ word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftL(25);\r\n */\r\n // shiftL: function (n) {\r\n // if (n < 32) {\r\n // var high = (this.high << n) | (this.low >>> (32 - n));\r\n // var low = this.low << n;\r\n // } else {\r\n // var high = this.low << (n - 32);\r\n // var low = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftR(7);\r\n */\r\n // shiftR: function (n) {\r\n // if (n < 32) {\r\n // var low = (this.low >>> n) | (this.high << (32 - n));\r\n // var high = this.high >>> n;\r\n // } else {\r\n // var low = this.high >>> (n - 32);\r\n // var high = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotL(25);\r\n */\r\n // rotL: function (n) {\r\n // return this.shiftL(n).or(this.shiftR(64 - n));\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotR(7);\r\n */\r\n // rotR: function (n) {\r\n // return this.shiftR(n).or(this.shiftL(64 - n));\r\n // },\r\n\r\n /**\r\n * Adds this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to add with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after adding.\r\n *\r\n * @example\r\n *\r\n * var added = x64Word.add(anotherX64Word);\r\n */\r\n // add: function (word) {\r\n // var low = (this.low + word.low) | 0;\r\n // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\r\n // var high = (this.high + word.high + carry) | 0;\r\n\r\n // return X64Word.create(high, low);\r\n // }\r\n });\r\n\r\n /**\r\n * An array of 64-bit words.\r\n *\r\n * @property {Array} words The array of CryptoJS.x64.Word objects.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var X64WordArray = C_x64.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create();\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ]);\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ], 10);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 8;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this 64-bit word array to a 32-bit word array.\r\n *\r\n * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\r\n *\r\n * @example\r\n *\r\n * var x32WordArray = x64WordArray.toX32();\r\n */\r\n toX32: function () {\r\n // Shortcuts\r\n var x64Words = this.words;\r\n var x64WordsLength = x64Words.length;\r\n\r\n // Convert\r\n var x32Words = [];\r\n for (var i = 0; i < x64WordsLength; i++) {\r\n var x64Word = x64Words[i];\r\n x32Words.push(x64Word.high);\r\n x32Words.push(x64Word.low);\r\n }\r\n\r\n return X32WordArray.create(x32Words, this.sigBytes);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {X64WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = x64WordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n\r\n // Clone \"words\" array\r\n var words = clone.words = this.words.slice(0);\r\n\r\n // Clone each X64Word object\r\n var wordsLength = words.length;\r\n for (var i = 0; i < wordsLength; i++) {\r\n words[i] = words[i].clone();\r\n }\r\n\r\n return clone;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Hasher = C_lib.Hasher;\r\n var C_x64 = C.x64;\r\n var X64Word = C_x64.Word;\r\n var X64WordArray = C_x64.WordArray;\r\n var C_algo = C.algo;\r\n\r\n function X64Word_create() {\r\n return X64Word.create.apply(X64Word, arguments);\r\n }\r\n\r\n // Constants\r\n var K = [\r\n X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\r\n X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\r\n X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\r\n X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\r\n X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\r\n X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\r\n X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\r\n X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\r\n X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\r\n X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\r\n X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\r\n X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\r\n X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\r\n X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\r\n X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\r\n X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\r\n X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\r\n X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\r\n X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\r\n X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\r\n X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\r\n X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\r\n X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\r\n X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\r\n X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\r\n X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\r\n X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\r\n X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\r\n X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\r\n X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\r\n X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\r\n X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\r\n X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\r\n X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\r\n X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\r\n X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\r\n X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\r\n X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\r\n X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\r\n X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\r\n ];\r\n\r\n // Reusable objects\r\n var W = [];\r\n (function () {\r\n for (var i = 0; i < 80; i++) {\r\n W[i] = X64Word_create();\r\n }\r\n }());\r\n\r\n /**\r\n * SHA-512 hash algorithm.\r\n */\r\n var SHA512 = C_algo.SHA512 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new X64WordArray.init([\r\n new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\r\n new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\r\n new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\r\n new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\r\n ]);\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcuts\r\n var H = this._hash.words;\r\n\r\n var H0 = H[0];\r\n var H1 = H[1];\r\n var H2 = H[2];\r\n var H3 = H[3];\r\n var H4 = H[4];\r\n var H5 = H[5];\r\n var H6 = H[6];\r\n var H7 = H[7];\r\n\r\n var H0h = H0.high;\r\n var H0l = H0.low;\r\n var H1h = H1.high;\r\n var H1l = H1.low;\r\n var H2h = H2.high;\r\n var H2l = H2.low;\r\n var H3h = H3.high;\r\n var H3l = H3.low;\r\n var H4h = H4.high;\r\n var H4l = H4.low;\r\n var H5h = H5.high;\r\n var H5l = H5.low;\r\n var H6h = H6.high;\r\n var H6l = H6.low;\r\n var H7h = H7.high;\r\n var H7l = H7.low;\r\n\r\n // Working variables\r\n var ah = H0h;\r\n var al = H0l;\r\n var bh = H1h;\r\n var bl = H1l;\r\n var ch = H2h;\r\n var cl = H2l;\r\n var dh = H3h;\r\n var dl = H3l;\r\n var eh = H4h;\r\n var el = H4l;\r\n var fh = H5h;\r\n var fl = H5l;\r\n var gh = H6h;\r\n var gl = H6l;\r\n var hh = H7h;\r\n var hl = H7l;\r\n\r\n // Rounds\r\n for (var i = 0; i < 80; i++) {\r\n var Wil;\r\n var Wih;\r\n\r\n // Shortcut\r\n var Wi = W[i];\r\n\r\n // Extend message\r\n if (i < 16) {\r\n Wih = Wi.high = M[offset + i * 2] | 0;\r\n Wil = Wi.low = M[offset + i * 2 + 1] | 0;\r\n } else {\r\n // Gamma0\r\n var gamma0x = W[i - 15];\r\n var gamma0xh = gamma0x.high;\r\n var gamma0xl = gamma0x.low;\r\n var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\r\n var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\r\n\r\n // Gamma1\r\n var gamma1x = W[i - 2];\r\n var gamma1xh = gamma1x.high;\r\n var gamma1xl = gamma1x.low;\r\n var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\r\n var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\r\n\r\n // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\r\n var Wi7 = W[i - 7];\r\n var Wi7h = Wi7.high;\r\n var Wi7l = Wi7.low;\r\n\r\n var Wi16 = W[i - 16];\r\n var Wi16h = Wi16.high;\r\n var Wi16l = Wi16.low;\r\n\r\n Wil = gamma0l + Wi7l;\r\n Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\r\n Wil = Wil + gamma1l;\r\n Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\r\n Wil = Wil + Wi16l;\r\n Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\r\n\r\n Wi.high = Wih;\r\n Wi.low = Wil;\r\n }\r\n\r\n var chh = (eh & fh) ^ (~eh & gh);\r\n var chl = (el & fl) ^ (~el & gl);\r\n var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\r\n var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\r\n\r\n var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\r\n var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\r\n var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\r\n var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\r\n\r\n // t1 = h + sigma1 + ch + K[i] + W[i]\r\n var Ki = K[i];\r\n var Kih = Ki.high;\r\n var Kil = Ki.low;\r\n\r\n var t1l = hl + sigma1l;\r\n var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\r\n var t1l = t1l + chl;\r\n var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\r\n var t1l = t1l + Kil;\r\n var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\r\n var t1l = t1l + Wil;\r\n var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\r\n\r\n // t2 = sigma0 + maj\r\n var t2l = sigma0l + majl;\r\n var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\r\n\r\n // Update working variables\r\n hh = gh;\r\n hl = gl;\r\n gh = fh;\r\n gl = fl;\r\n fh = eh;\r\n fl = el;\r\n el = (dl + t1l) | 0;\r\n eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\r\n dh = ch;\r\n dl = cl;\r\n ch = bh;\r\n cl = bl;\r\n bh = ah;\r\n bl = al;\r\n al = (t1l + t2l) | 0;\r\n ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H0l = H0.low = (H0l + al);\r\n H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\r\n H1l = H1.low = (H1l + bl);\r\n H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\r\n H2l = H2.low = (H2l + cl);\r\n H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\r\n H3l = H3.low = (H3l + dl);\r\n H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\r\n H4l = H4.low = (H4l + el);\r\n H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\r\n H5l = H5.low = (H5l + fl);\r\n H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\r\n H6l = H6.low = (H6l + gl);\r\n H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\r\n H7l = H7.low = (H7l + hl);\r\n H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Convert hash to 32-bit word array before returning\r\n var hash = this._hash.toX32();\r\n\r\n // Return final computed hash\r\n return hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n },\r\n\r\n blockSize: 1024/32\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA512('message');\r\n * var hash = CryptoJS.SHA512(wordArray);\r\n */\r\n C.SHA512 = Hasher._createHelper(SHA512);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA512(message, key);\r\n */\r\n C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\r\n}());\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * Cipher core components.\r\n */\r\nCryptoJS.lib.Cipher || (function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var Base64 = C_enc.Base64;\r\n var C_algo = C.algo;\r\n var EvpKDF = C_algo.EvpKDF;\r\n\r\n /**\r\n * Abstract base cipher template.\r\n *\r\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\r\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\r\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\r\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\r\n */\r\n var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {WordArray} iv The IV to use for this operation.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Creates this cipher in encryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createEncryptor: function (key, cfg) {\r\n return this.create(this._ENC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Creates this cipher in decryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createDecryptor: function (key, cfg) {\r\n return this.create(this._DEC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Initializes a newly created cipher.\r\n *\r\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\r\n */\r\n init: function (xformMode, key, cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Store transform mode and key\r\n this._xformMode = xformMode;\r\n this._key = key;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this cipher to its initial state.\r\n *\r\n * @example\r\n *\r\n * cipher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-cipher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Adds data to be encrypted or decrypted.\r\n *\r\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.process('data');\r\n * var encrypted = cipher.process(wordArray);\r\n */\r\n process: function (dataUpdate) {\r\n // Append\r\n this._append(dataUpdate);\r\n\r\n // Process available blocks\r\n return this._process();\r\n },\r\n\r\n /**\r\n * Finalizes the encryption or decryption process.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after final processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.finalize();\r\n * var encrypted = cipher.finalize('data');\r\n * var encrypted = cipher.finalize(wordArray);\r\n */\r\n finalize: function (dataUpdate) {\r\n // Final data update\r\n if (dataUpdate) {\r\n this._append(dataUpdate);\r\n }\r\n\r\n // Perform concrete-cipher logic\r\n var finalProcessedData = this._doFinalize();\r\n\r\n return finalProcessedData;\r\n },\r\n\r\n keySize: 128/32,\r\n\r\n ivSize: 128/32,\r\n\r\n _ENC_XFORM_MODE: 1,\r\n\r\n _DEC_XFORM_MODE: 2,\r\n\r\n /**\r\n * Creates shortcut functions to a cipher's object interface.\r\n *\r\n * @param {Cipher} cipher The cipher to create a helper for.\r\n *\r\n * @return {Object} An object with encrypt and decrypt shortcut functions.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\r\n */\r\n _createHelper: (function () {\r\n function selectCipherStrategy(key) {\r\n if (typeof key == 'string') {\r\n return PasswordBasedCipher;\r\n } else {\r\n return SerializableCipher;\r\n }\r\n }\r\n\r\n return function (cipher) {\r\n return {\r\n encrypt: function (message, key, cfg) {\r\n return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\r\n },\r\n\r\n decrypt: function (ciphertext, key, cfg) {\r\n return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\r\n }\r\n };\r\n };\r\n }())\r\n });\r\n\r\n /**\r\n * Abstract base stream cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\r\n */\r\n var StreamCipher = C_lib.StreamCipher = Cipher.extend({\r\n _doFinalize: function () {\r\n // Process partial blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 1\r\n });\r\n\r\n /**\r\n * Mode namespace.\r\n */\r\n var C_mode = C.mode = {};\r\n\r\n /**\r\n * Abstract base block cipher mode template.\r\n */\r\n var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\r\n /**\r\n * Creates this mode for encryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\r\n */\r\n createEncryptor: function (cipher, iv) {\r\n return this.Encryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Creates this mode for decryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\r\n */\r\n createDecryptor: function (cipher, iv) {\r\n return this.Decryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Initializes a newly created mode.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\r\n */\r\n init: function (cipher, iv) {\r\n this._cipher = cipher;\r\n this._iv = iv;\r\n }\r\n });\r\n\r\n /**\r\n * Cipher Block Chaining mode.\r\n */\r\n var CBC = C_mode.CBC = (function () {\r\n /**\r\n * Abstract base CBC mode.\r\n */\r\n var CBC = BlockCipherMode.extend();\r\n\r\n /**\r\n * CBC encryptor.\r\n */\r\n CBC.Encryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // XOR and encrypt\r\n xorBlock.call(this, words, offset, blockSize);\r\n cipher.encryptBlock(words, offset);\r\n\r\n // Remember this block to use with next block\r\n this._prevBlock = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n /**\r\n * CBC decryptor.\r\n */\r\n CBC.Decryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // Remember this block to use with next block\r\n var thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n // Decrypt and XOR\r\n cipher.decryptBlock(words, offset);\r\n xorBlock.call(this, words, offset, blockSize);\r\n\r\n // This block becomes the previous block\r\n this._prevBlock = thisBlock;\r\n }\r\n });\r\n\r\n function xorBlock(words, offset, blockSize) {\r\n // Shortcut\r\n var iv = this._iv;\r\n\r\n // Choose mixing block\r\n if (iv) {\r\n var block = iv;\r\n\r\n // Remove IV for subsequent blocks\r\n this._iv = undefined;\r\n } else {\r\n var block = this._prevBlock;\r\n }\r\n\r\n // XOR blocks\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return CBC;\r\n }());\r\n\r\n\r\n /**\r\n * Infinite Garble Extension mode.\r\n */\r\n var IGE = C_mode.IGE = (function () {\r\n /**\r\n * Abstract base IGE mode.\r\n */\r\n var IGE = BlockCipherMode.extend();\r\n\r\n /**\r\n * IGE encryptor.\r\n */\r\n IGE.Encryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, blockSize + blockSize);\r\n }\r\n\r\n\r\n // Remember this block to use with next block\r\n var nextIv2p = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.encryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n this._ivp = words.slice(offset, offset + blockSize);\r\n this._iv2p = nextIv2p;\r\n }\r\n });\r\n\r\n /**\r\n * IGE decryptor.\r\n */\r\n IGE.Decryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, 2 * blockSize);\r\n }\r\n\r\n // Remember this block to use with next block\r\n var nextIvp = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.decryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n this._ivp = nextIvp;\r\n this._iv2p = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n function xorBlock(words, block, offset, blockSize) {\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return IGE;\r\n }());\r\n\r\n /**\r\n * Padding namespace.\r\n */\r\n var C_pad = C.pad = {};\r\n\r\n /**\r\n * PKCS #5/7 padding strategy.\r\n */\r\n var Pkcs7 = C_pad.Pkcs7 = {\r\n /**\r\n * Pads data using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to pad.\r\n * @param {number} blockSize The multiple that the data should be padded to.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\r\n */\r\n pad: function (data, blockSize) {\r\n // Shortcut\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count padding bytes\r\n var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n // Create padding word\r\n var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\r\n\r\n // Create padding\r\n var paddingWords = [];\r\n for (var i = 0; i < nPaddingBytes; i += 4) {\r\n paddingWords.push(paddingWord);\r\n }\r\n var padding = WordArray.create(paddingWords, nPaddingBytes);\r\n\r\n // Add padding\r\n data.concat(padding);\r\n },\r\n\r\n /**\r\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to unpad.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\r\n */\r\n unpad: function (data) {\r\n // Get number of padding bytes from last byte\r\n var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n // Remove padding\r\n data.sigBytes -= nPaddingBytes;\r\n }\r\n };\r\n\r\n var NoPadding = C_pad.NoPadding = {\r\n pad: function () {\r\n },\r\n\r\n unpad: function () {\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Abstract base block cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\r\n */\r\n var BlockCipher = C_lib.BlockCipher = Cipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Mode} mode The block mode to use. Default: CBC\r\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\r\n */\r\n cfg: Cipher.cfg.extend({\r\n mode: CBC,\r\n padding: Pkcs7\r\n }),\r\n\r\n reset: function () {\r\n // Reset cipher\r\n Cipher.reset.call(this);\r\n\r\n // Shortcuts\r\n var cfg = this.cfg;\r\n var iv = cfg.iv;\r\n var mode = cfg.mode;\r\n\r\n // Reset block mode\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n var modeCreator = mode.createEncryptor;\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n var modeCreator = mode.createDecryptor;\r\n\r\n // Keep at least one block in the buffer for unpadding\r\n this._minBufferSize = 1;\r\n }\r\n this._mode = modeCreator.call(mode, this, iv && iv.words);\r\n },\r\n\r\n _doProcessBlock: function (words, offset) {\r\n this._mode.processBlock(words, offset);\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcut\r\n var padding = this.cfg.padding;\r\n\r\n // Finalize\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n // Pad data\r\n padding.pad(this._data, this.blockSize);\r\n\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n // Unpad data\r\n padding.unpad(finalProcessedBlocks);\r\n }\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 128/32\r\n });\r\n\r\n /**\r\n * A collection of cipher parameters.\r\n *\r\n * @property {WordArray} ciphertext The raw ciphertext.\r\n * @property {WordArray} key The key to this ciphertext.\r\n * @property {WordArray} iv The IV used in the ciphering operation.\r\n * @property {WordArray} salt The salt used with a key derivation function.\r\n * @property {Cipher} algorithm The cipher algorithm.\r\n * @property {Mode} mode The block mode used in the ciphering operation.\r\n * @property {Padding} padding The padding scheme used in the ciphering operation.\r\n * @property {number} blockSize The block size of the cipher.\r\n * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\r\n */\r\n var CipherParams = C_lib.CipherParams = Base.extend({\r\n /**\r\n * Initializes a newly created cipher params object.\r\n *\r\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.lib.CipherParams.create({\r\n * ciphertext: ciphertextWordArray,\r\n * key: keyWordArray,\r\n * iv: ivWordArray,\r\n * salt: saltWordArray,\r\n * algorithm: CryptoJS.algo.AES,\r\n * mode: CryptoJS.mode.CBC,\r\n * padding: CryptoJS.pad.PKCS7,\r\n * blockSize: 4,\r\n * formatter: CryptoJS.format.OpenSSL\r\n * });\r\n */\r\n init: function (cipherParams) {\r\n this.mixIn(cipherParams);\r\n },\r\n\r\n /**\r\n * Converts this cipher params object to a string.\r\n *\r\n * @param {Format} formatter (Optional) The formatting strategy to use.\r\n *\r\n * @return {string} The stringified cipher params.\r\n *\r\n * @throws Error If neither the formatter nor the default formatter is set.\r\n *\r\n * @example\r\n *\r\n * var string = cipherParams + '';\r\n * var string = cipherParams.toString();\r\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\r\n */\r\n toString: function (formatter) {\r\n return (formatter || this.formatter).stringify(this);\r\n }\r\n });\r\n\r\n /**\r\n * Format namespace.\r\n */\r\n var C_format = C.format = {};\r\n\r\n /**\r\n * OpenSSL formatting strategy.\r\n */\r\n var OpenSSLFormatter = C_format.OpenSSL = {\r\n /**\r\n * Converts a cipher params object to an OpenSSL-compatible string.\r\n *\r\n * @param {CipherParams} cipherParams The cipher params object.\r\n *\r\n * @return {string} The OpenSSL-compatible string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\r\n */\r\n stringify: function (cipherParams) {\r\n // Shortcuts\r\n var ciphertext = cipherParams.ciphertext;\r\n var salt = cipherParams.salt;\r\n\r\n // Format\r\n if (salt) {\r\n var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\r\n } else {\r\n var wordArray = ciphertext;\r\n }\r\n\r\n return wordArray.toString(Base64);\r\n },\r\n\r\n /**\r\n * Converts an OpenSSL-compatible string to a cipher params object.\r\n *\r\n * @param {string} openSSLStr The OpenSSL-compatible string.\r\n *\r\n * @return {CipherParams} The cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\r\n */\r\n parse: function (openSSLStr) {\r\n // Parse base64\r\n var ciphertext = Base64.parse(openSSLStr);\r\n\r\n // Shortcut\r\n var ciphertextWords = ciphertext.words;\r\n\r\n // Test for salt\r\n if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\r\n // Extract salt\r\n var salt = WordArray.create(ciphertextWords.slice(2, 4));\r\n\r\n // Remove salt from ciphertext\r\n ciphertextWords.splice(0, 4);\r\n ciphertext.sigBytes -= 16;\r\n }\r\n\r\n return CipherParams.create({ ciphertext: ciphertext, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\r\n */\r\n var SerializableCipher = C_lib.SerializableCipher = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\r\n */\r\n cfg: Base.extend({\r\n format: OpenSSLFormatter\r\n }),\r\n\r\n /**\r\n * Encrypts a message.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Encrypt\r\n var encryptor = cipher.createEncryptor(key, cfg);\r\n var ciphertext = encryptor.finalize(message);\r\n\r\n // Shortcut\r\n var cipherCfg = encryptor.cfg;\r\n\r\n // Create and return serializable cipher params\r\n return CipherParams.create({\r\n ciphertext: ciphertext,\r\n key: key,\r\n iv: cipherCfg.iv,\r\n algorithm: cipher,\r\n mode: cipherCfg.mode,\r\n padding: cipherCfg.padding,\r\n blockSize: cipher.blockSize,\r\n formatter: cfg.format\r\n });\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Decrypt\r\n var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\r\n\r\n return plaintext;\r\n },\r\n\r\n /**\r\n * Converts serialized ciphertext to CipherParams,\r\n * else assumed CipherParams already and returns ciphertext unchanged.\r\n *\r\n * @param {CipherParams|string} ciphertext The ciphertext.\r\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\r\n *\r\n * @return {CipherParams} The unserialized ciphertext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\r\n */\r\n _parse: function (ciphertext, format) {\r\n if (typeof ciphertext == 'string') {\r\n return format.parse(ciphertext, this);\r\n } else {\r\n return ciphertext;\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * Key derivation function namespace.\r\n */\r\n var C_kdf = C.kdf = {};\r\n\r\n /**\r\n * OpenSSL key derivation function.\r\n */\r\n var OpenSSLKdf = C_kdf.OpenSSL = {\r\n /**\r\n * Derives a key and IV from a password.\r\n *\r\n * @param {string} password The password to derive from.\r\n * @param {number} keySize The size in words of the key to generate.\r\n * @param {number} ivSize The size in words of the IV to generate.\r\n * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\r\n *\r\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\r\n */\r\n execute: function (password, keySize, ivSize, salt) {\r\n // Generate random salt\r\n if (!salt) {\r\n salt = WordArray.random(64/8);\r\n }\r\n\r\n // Derive key and IV\r\n var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\r\n\r\n // Separate key and IV\r\n var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\r\n key.sigBytes = keySize * 4;\r\n\r\n // Return params\r\n return CipherParams.create({ key: key, iv: iv, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A serializable cipher wrapper that derives the key from a password,\r\n * and returns ciphertext as a serializable cipher params object.\r\n */\r\n var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\r\n */\r\n cfg: SerializableCipher.cfg.extend({\r\n kdf: OpenSSLKdf\r\n }),\r\n\r\n /**\r\n * Encrypts a message using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Encrypt\r\n var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\r\n\r\n // Mix in derived params\r\n ciphertext.mixIn(derivedParams);\r\n\r\n return ciphertext;\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Decrypt\r\n var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\r\n\r\n return plaintext;\r\n }\r\n });\r\n}());\r\n\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var BlockCipher = C_lib.BlockCipher;\r\n var C_algo = C.algo;\r\n\r\n // Lookup tables\r\n var SBOX = [];\r\n var INV_SBOX = [];\r\n var SUB_MIX_0 = [];\r\n var SUB_MIX_1 = [];\r\n var SUB_MIX_2 = [];\r\n var SUB_MIX_3 = [];\r\n var INV_SUB_MIX_0 = [];\r\n var INV_SUB_MIX_1 = [];\r\n var INV_SUB_MIX_2 = [];\r\n var INV_SUB_MIX_3 = [];\r\n\r\n // Compute lookup tables\r\n (function () {\r\n // Compute double table\r\n var d = [];\r\n for (var i = 0; i < 256; i++) {\r\n if (i < 128) {\r\n d[i] = i << 1;\r\n } else {\r\n d[i] = (i << 1) ^ 0x11b;\r\n }\r\n }\r\n\r\n // Walk GF(2^8)\r\n var x = 0;\r\n var xi = 0;\r\n for (var i = 0; i < 256; i++) {\r\n // Compute sbox\r\n var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\r\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\r\n SBOX[x] = sx;\r\n INV_SBOX[sx] = x;\r\n\r\n // Compute multiplication\r\n var x2 = d[x];\r\n var x4 = d[x2];\r\n var x8 = d[x4];\r\n\r\n // Compute sub bytes, mix columns tables\r\n var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\r\n SUB_MIX_0[x] = (t << 24) | (t >>> 8);\r\n SUB_MIX_1[x] = (t << 16) | (t >>> 16);\r\n SUB_MIX_2[x] = (t << 8) | (t >>> 24);\r\n SUB_MIX_3[x] = t;\r\n\r\n // Compute inv sub bytes, inv mix columns tables\r\n var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\r\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\r\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\r\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\r\n INV_SUB_MIX_3[sx] = t;\r\n\r\n // Compute next counter\r\n if (!x) {\r\n x = xi = 1;\r\n } else {\r\n x = x2 ^ d[d[d[x8 ^ x2]]];\r\n xi ^= d[d[xi]];\r\n }\r\n }\r\n }());\r\n\r\n // Precomputed Rcon lookup\r\n var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n /**\r\n * AES block cipher algorithm.\r\n */\r\n var AES = C_algo.AES = BlockCipher.extend({\r\n _doReset: function () {\r\n // Shortcuts\r\n var key = this._key;\r\n var keyWords = key.words;\r\n var keySize = key.sigBytes / 4;\r\n\r\n // Compute number of rounds\r\n var nRounds = this._nRounds = keySize + 6\r\n\r\n // Compute number of key schedule rows\r\n var ksRows = (nRounds + 1) * 4;\r\n\r\n // Compute key schedule\r\n var keySchedule = this._keySchedule = [];\r\n for (var ksRow = 0; ksRow < ksRows; ksRow++) {\r\n if (ksRow < keySize) {\r\n keySchedule[ksRow] = keyWords[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 1];\r\n\r\n if (!(ksRow % keySize)) {\r\n // Rot word\r\n t = (t << 8) | (t >>> 24);\r\n\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\r\n // Mix Rcon\r\n t ^= RCON[(ksRow / keySize) | 0] << 24;\r\n } else if (keySize > 6 && ksRow % keySize == 4) {\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n }\r\n\r\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\r\n }\r\n }\r\n\r\n // Compute inv key schedule\r\n var invKeySchedule = this._invKeySchedule = [];\r\n for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\r\n var ksRow = ksRows - invKsRow;\r\n\r\n if (invKsRow % 4) {\r\n var t = keySchedule[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 4];\r\n }\r\n\r\n if (invKsRow < 4 || ksRow <= 4) {\r\n invKeySchedule[invKsRow] = t;\r\n } else {\r\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\r\n INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\r\n }\r\n }\r\n },\r\n\r\n encryptBlock: function (M, offset) {\r\n this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\r\n },\r\n\r\n decryptBlock: function (M, offset) {\r\n // Swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n\r\n this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\r\n\r\n // Inv swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n },\r\n\r\n _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\r\n // Shortcut\r\n var nRounds = this._nRounds;\r\n\r\n // Get input, add round key\r\n var s0 = M[offset] ^ keySchedule[0];\r\n var s1 = M[offset + 1] ^ keySchedule[1];\r\n var s2 = M[offset + 2] ^ keySchedule[2];\r\n var s3 = M[offset + 3] ^ keySchedule[3];\r\n\r\n // Key schedule row counter\r\n var ksRow = 4;\r\n\r\n // Rounds\r\n for (var round = 1; round < nRounds; round++) {\r\n // Shift rows, sub bytes, mix columns, add round key\r\n var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\r\n var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\r\n var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\r\n var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\r\n\r\n // Update state\r\n s0 = t0;\r\n s1 = t1;\r\n s2 = t2;\r\n s3 = t3;\r\n }\r\n\r\n // Shift rows, sub bytes, add round key\r\n var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\r\n var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\r\n var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\r\n var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\r\n\r\n // Set output\r\n M[offset] = t0;\r\n M[offset + 1] = t1;\r\n M[offset + 2] = t2;\r\n M[offset + 3] = t3;\r\n },\r\n\r\n keySize: 256/32\r\n });\r\n\r\n /**\r\n * Shortcut functions to the cipher's object interface.\r\n *\r\n * @example\r\n *\r\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\r\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\r\n */\r\n C.AES = BlockCipher._createHelper(AES);\r\n}());\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function (Math) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var WordArray = C_lib.WordArray;\r\n var Hasher = C_lib.Hasher;\r\n var C_algo = C.algo;\r\n\r\n // Initialization and round constants tables\r\n var H = [];\r\n var K = [];\r\n\r\n // Compute constants\r\n (function () {\r\n function isPrime(n) {\r\n var sqrtN = Math.sqrt(n);\r\n for (var factor = 2; factor <= sqrtN; factor++) {\r\n if (!(n % factor)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function getFractionalBits(n) {\r\n return ((n - (n | 0)) * 0x100000000) | 0;\r\n }\r\n\r\n var n = 2;\r\n var nPrime = 0;\r\n while (nPrime < 64) {\r\n if (isPrime(n)) {\r\n if (nPrime < 8) {\r\n H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\r\n }\r\n K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\r\n\r\n nPrime++;\r\n }\r\n\r\n n++;\r\n }\r\n }());\r\n\r\n // Reusable object\r\n var W = [];\r\n\r\n /**\r\n * SHA-256 hash algorithm.\r\n */\r\n var SHA256 = C_algo.SHA256 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new WordArray.init(H.slice(0));\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcut\r\n var H = this._hash.words;\r\n\r\n // Working variables\r\n var a = H[0];\r\n var b = H[1];\r\n var c = H[2];\r\n var d = H[3];\r\n var e = H[4];\r\n var f = H[5];\r\n var g = H[6];\r\n var h = H[7];\r\n\r\n // Computation\r\n for (var i = 0; i < 64; i++) {\r\n if (i < 16) {\r\n W[i] = M[offset + i] | 0;\r\n } else {\r\n var gamma0x = W[i - 15];\r\n var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\r\n ((gamma0x << 14) | (gamma0x >>> 18)) ^\r\n (gamma0x >>> 3);\r\n\r\n var gamma1x = W[i - 2];\r\n var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\r\n ((gamma1x << 13) | (gamma1x >>> 19)) ^\r\n (gamma1x >>> 10);\r\n\r\n W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\r\n }\r\n\r\n var ch = (e & f) ^ (~e & g);\r\n var maj = (a & b) ^ (a & c) ^ (b & c);\r\n\r\n var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\r\n var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\r\n\r\n var t1 = h + sigma1 + ch + K[i] + W[i];\r\n var t2 = sigma0 + maj;\r\n\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + t1) | 0;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (t1 + t2) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H[0] = (H[0] + a) | 0;\r\n H[1] = (H[1] + b) | 0;\r\n H[2] = (H[2] + c) | 0;\r\n H[3] = (H[3] + d) | 0;\r\n H[4] = (H[4] + e) | 0;\r\n H[5] = (H[5] + f) | 0;\r\n H[6] = (H[6] + g) | 0;\r\n H[7] = (H[7] + h) | 0;\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Return final computed hash\r\n return this._hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n }\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA256('message');\r\n * var hash = CryptoJS.SHA256(wordArray);\r\n */\r\n C.SHA256 = Hasher._createHelper(SHA256);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA256(message, key);\r\n */\r\n C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\r\n}(Math));\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var C_algo = C.algo;\r\n\r\n /**\r\n * HMAC algorithm.\r\n */\r\n var HMAC = C_algo.HMAC = Base.extend({\r\n /**\r\n * Initializes a newly created HMAC.\r\n *\r\n * @param {Hasher} hasher The hash algorithm to use.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @example\r\n *\r\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\r\n */\r\n init: function (hasher, key) {\r\n // Init hasher\r\n hasher = this._hasher = new hasher.init();\r\n\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof key == 'string') {\r\n key = Utf8.parse(key);\r\n }\r\n\r\n // Shortcuts\r\n var hasherBlockSize = hasher.blockSize;\r\n var hasherBlockSizeBytes = hasherBlockSize * 4;\r\n\r\n // Allow arbitrary length keys\r\n if (key.sigBytes > hasherBlockSizeBytes) {\r\n key = hasher.finalize(key);\r\n }\r\n\r\n // Clamp excess bits\r\n key.clamp();\r\n\r\n // Clone key for inner and outer pads\r\n var oKey = this._oKey = key.clone();\r\n var iKey = this._iKey = key.clone();\r\n\r\n // Shortcuts\r\n var oKeyWords = oKey.words;\r\n var iKeyWords = iKey.words;\r\n\r\n // XOR keys with pad constants\r\n for (var i = 0; i < hasherBlockSize; i++) {\r\n oKeyWords[i] ^= 0x5c5c5c5c;\r\n iKeyWords[i] ^= 0x36363636;\r\n }\r\n oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this HMAC to its initial state.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.reset();\r\n */\r\n reset: function () {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Reset\r\n hasher.reset();\r\n hasher.update(this._iKey);\r\n },\r\n\r\n /**\r\n * Updates this HMAC with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {HMAC} This HMAC instance.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.update('message');\r\n * hmacHasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n this._hasher.update(messageUpdate);\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the HMAC computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @example\r\n *\r\n * var hmac = hmacHasher.finalize();\r\n * var hmac = hmacHasher.finalize('message');\r\n * var hmac = hmacHasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Compute HMAC\r\n var innerHash = hasher.finalize(messageUpdate);\r\n hasher.reset();\r\n var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\r\n\r\n return hmac;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var C_algo = C.algo;\r\n var SHA1 = C_algo.SHA1;\r\n var HMAC = C_algo.HMAC;\r\n\r\n /**\r\n * Password-Based Key Derivation Function 2 algorithm.\r\n */\r\n var PBKDF2 = C_algo.PBKDF2 = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n * @property {Hasher} hasher The hasher to use. Default: SHA1\r\n * @property {number} iterations The number of iterations to perform. Default: 1\r\n */\r\n cfg: Base.extend({\r\n keySize: 128/32,\r\n hasher: SHA1,\r\n iterations: 1\r\n }),\r\n\r\n /**\r\n * Initializes a newly created key derivation function.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n *\r\n * @example\r\n *\r\n * var kdf = CryptoJS.algo.PBKDF2.create();\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\r\n */\r\n init: function (cfg) {\r\n this.cfg = this.cfg.extend(cfg);\r\n },\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @example\r\n *\r\n * var key = kdf.compute(password, salt);\r\n */\r\n compute: function (password, salt) {\r\n // Shortcut\r\n var cfg = this.cfg;\r\n\r\n // Init HMAC\r\n var hmac = HMAC.create(cfg.hasher, password);\r\n\r\n // Initial values\r\n var derivedKey = WordArray.create();\r\n var blockIndex = WordArray.create([0x00000001]);\r\n\r\n // Shortcuts\r\n var derivedKeyWords = derivedKey.words;\r\n var blockIndexWords = blockIndex.words;\r\n var keySize = cfg.keySize;\r\n var iterations = cfg.iterations;\r\n\r\n // Generate key\r\n while (derivedKeyWords.length < keySize) {\r\n var block = hmac.update(salt).finalize(blockIndex);\r\n hmac.reset();\r\n\r\n // Shortcuts\r\n var blockWords = block.words;\r\n var blockWordsLength = blockWords.length;\r\n\r\n // Iterations\r\n var intermediate = block;\r\n for (var i = 1; i < iterations; i++) {\r\n intermediate = hmac.finalize(intermediate);\r\n hmac.reset();\r\n\r\n // Shortcut\r\n var intermediateWords = intermediate.words;\r\n\r\n // XOR intermediate with block\r\n for (var j = 0; j < blockWordsLength; j++) {\r\n blockWords[j] ^= intermediateWords[j];\r\n }\r\n }\r\n\r\n derivedKey.concat(block);\r\n blockIndexWords[0]++;\r\n }\r\n derivedKey.sigBytes = keySize * 4;\r\n\r\n return derivedKey;\r\n }\r\n });\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var key = CryptoJS.PBKDF2(password, salt);\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\r\n */\r\n C.PBKDF2 = function (password, salt, cfg) {\r\n return PBKDF2.create(cfg).compute(password, salt);\r\n };\r\n}());\r\n"
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/closure_long.js",
"name": "./src/lib/closure_long.js",
"index": 7,
"index2": 5,
"size": 24517,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./closure_long.js",
"loc": "64:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "// Copyright 2009 The Closure Library Authors. All Rights Reserved.\r\n//\r\n// Licensed under the Apache License, Version 2.0 (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.apache.org/licenses/LICENSE-2.0\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n\r\n/**\r\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\r\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\r\n * implementation is derived from LongLib in GWT.\r\n *\r\n */\r\n\r\n/**\r\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\r\n * See keyword `MODIFICATION` in source code.\r\n */\r\n\r\n/*! MODIFICATION\r\nThe following line was added by Igor Zhukov in order to make library compatibile with other app parts\r\n*/\r\nvar goog = {\r\n provide: function () {}, \r\n math: {\r\n Long: {\r\n ZERO: undefined,\r\n fromString: undefined,\r\n ONE: undefined,\r\n fromInt: undefined\r\n }\r\n }\r\n};\r\nthis.goog = goog;\r\n\r\n\r\ngoog.provide('goog.math.Long');\r\n\r\n\r\n\r\n/**\r\n * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\r\n * values as *signed* integers. See the from* functions below for more\r\n * convenient ways of constructing Longs.\r\n *\r\n * The internal representation of a long is the two given signed, 32-bit values.\r\n * We use 32-bit pieces because these are the size of integers on which\r\n * Javascript performs bit-operations. For operations like addition and\r\n * multiplication, we split each number into 16-bit pieces, which can easily be\r\n * multiplied within Javascript's floating-point representation without overflow\r\n * or change in sign.\r\n *\r\n * In the algorithms below, we frequently reduce the negative case to the\r\n * positive case by negating the input(s) and then post-processing the result.\r\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n * a positive number, it overflows back into a negative). Not handling this\r\n * case would often result in infinite recursion.\r\n *\r\n * @param {number} low The low (signed) 32 bits of the long.\r\n * @param {number} high The high (signed) 32 bits of the long.\r\n * @constructor\r\n */\r\ngoog.math.Long = function(low, high) {\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.low_ = low | 0; // force into 32 signed bits.\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.high_ = high | 0; // force into 32 signed bits.\r\n};\r\n\r\n\r\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\r\n// from* methods on which they depend.\r\n\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @private\r\n */\r\ngoog.math.Long.IntCache_ = {};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given (32-bit) integer value.\r\n * @param {number} value The 32-bit integer in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromInt = function(value) {\r\n if (-128 <= value && value < 128) {\r\n var cachedObj = goog.math.Long.IntCache_[value];\r\n if (cachedObj) {\r\n return cachedObj;\r\n }\r\n }\r\n\r\n var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\r\n if (-128 <= value && value < 128) {\r\n goog.math.Long.IntCache_[value] = obj;\r\n }\r\n return obj;\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite\r\n * number. Otherwise, zero is returned.\r\n * @param {number} value The number in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromNumber = function(value) {\r\n if (isNaN(value) || !isFinite(value)) {\r\n return goog.math.Long.ZERO;\r\n } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MAX_VALUE;\r\n } else if (value < 0) {\r\n return goog.math.Long.fromNumber(-value).negate();\r\n } else {\r\n return new goog.math.Long(\r\n (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\r\n (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the 64-bit integer that comes by concatenating\r\n * the given high and low bits. Each is assumed to use 32 bits.\r\n * @param {number} lowBits The low 32-bits.\r\n * @param {number} highBits The high 32-bits.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromBits = function(lowBits, highBits) {\r\n return new goog.math.Long(lowBits, highBits);\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the given\r\n * radix.\r\n * @param {string} str The textual representation of the Long.\r\n * @param {number=} opt_radix The radix in which the text is written.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromString = function(str, opt_radix) {\r\n if (str.length == 0) {\r\n throw Error('number format error: empty string');\r\n }\r\n\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (str.charAt(0) == '-') {\r\n return goog.math.Long.fromString(str.substring(1), radix).negate();\r\n } else if (str.indexOf('-') >= 0) {\r\n throw Error('number format error: interior \"-\" character: ' + str);\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\r\n\r\n var result = goog.math.Long.ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i);\r\n var value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = goog.math.Long.fromNumber(Math.pow(radix, size));\r\n result = result.multiply(power).add(goog.math.Long.fromNumber(value));\r\n } else {\r\n result = result.multiply(radixToPower);\r\n result = result.add(goog.math.Long.fromNumber(value));\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove\r\n// these variables, so there should be no runtime penalty for these.\r\n\r\n\r\n/**\r\n * Number used repeated below in calculations. This must appear before the\r\n * first call to any from* function below.\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_32_DBL_ =\r\n goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_31_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ / 2;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_48_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_64_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_63_DBL_ =\r\n goog.math.Long.TWO_PWR_64_DBL_ / 2;\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ZERO = goog.math.Long.fromInt(0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ONE = goog.math.Long.fromInt(1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MAX_VALUE =\r\n goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\r\n\r\n\r\n/**\r\n * @type {!goog.math.Long}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\r\n\r\n\r\n/** @return {number} The value, assuming it is a 32-bit integer. */\r\ngoog.math.Long.prototype.toInt = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The closest floating-point representation to this value. */\r\ngoog.math.Long.prototype.toNumber = function() {\r\n return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\r\n this.getLowBitsUnsigned();\r\n};\r\n\r\n\r\n/**\r\n * @param {number=} opt_radix The radix in which the text should be written.\r\n * @return {string} The textual representation of this value.\r\n * @override\r\n */\r\ngoog.math.Long.prototype.toString = function(opt_radix) {\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (this.isZero()) {\r\n return '0';\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = goog.math.Long.fromNumber(radix);\r\n var div = this.div(radixLong);\r\n var rem = div.multiply(radixLong).subtract(this);\r\n return div.toString(radix) + rem.toInt().toString(radix);\r\n } else {\r\n return '-' + this.negate().toString(radix);\r\n }\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\r\n\r\n var rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower);\r\n var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\r\n var digits = intval.toString(radix);\r\n\r\n rem = remDiv;\r\n if (rem.isZero()) {\r\n return digits + result;\r\n } else {\r\n while (digits.length < 6) {\r\n digits = '0' + digits;\r\n }\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n\r\n/** @return {number} The high 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getHighBits = function() {\r\n return this.high_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getLowBits = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as an unsigned value. */\r\ngoog.math.Long.prototype.getLowBitsUnsigned = function() {\r\n return (this.low_ >= 0) ?\r\n this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\r\n};\r\n\r\n\r\n/**\r\n * @return {number} Returns the number of bits needed to represent the absolute\r\n * value of this Long.\r\n */\r\ngoog.math.Long.prototype.getNumBitsAbs = function() {\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return 64;\r\n } else {\r\n return this.negate().getNumBitsAbs();\r\n }\r\n } else {\r\n var val = this.high_ != 0 ? this.high_ : this.low_;\r\n for (var bit = 31; bit > 0; bit--) {\r\n if ((val & (1 << bit)) != 0) {\r\n break;\r\n }\r\n }\r\n return this.high_ != 0 ? bit + 33 : bit + 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is zero. */\r\ngoog.math.Long.prototype.isZero = function() {\r\n return this.high_ == 0 && this.low_ == 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is negative. */\r\ngoog.math.Long.prototype.isNegative = function() {\r\n return this.high_ < 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is odd. */\r\ngoog.math.Long.prototype.isOdd = function() {\r\n return (this.low_ & 1) == 1;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long equals the other.\r\n */\r\ngoog.math.Long.prototype.equals = function(other) {\r\n return (this.high_ == other.high_) && (this.low_ == other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long does not equal the other.\r\n */\r\ngoog.math.Long.prototype.notEquals = function(other) {\r\n return (this.high_ != other.high_) || (this.low_ != other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than the other.\r\n */\r\ngoog.math.Long.prototype.lessThan = function(other) {\r\n return this.compare(other) < 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.lessThanOrEqual = function(other) {\r\n return this.compare(other) <= 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than the other.\r\n */\r\ngoog.math.Long.prototype.greaterThan = function(other) {\r\n return this.compare(other) > 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.greaterThanOrEqual = function(other) {\r\n return this.compare(other) >= 0;\r\n};\r\n\r\n\r\n/**\r\n * Compares this Long with the given one.\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\r\n * if the given one is greater.\r\n */\r\ngoog.math.Long.prototype.compare = function(other) {\r\n if (this.equals(other)) {\r\n return 0;\r\n }\r\n\r\n var thisNeg = this.isNegative();\r\n var otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg) {\r\n return -1;\r\n }\r\n if (!thisNeg && otherNeg) {\r\n return 1;\r\n }\r\n\r\n // at this point, the signs are the same, so subtraction will not overflow\r\n if (this.subtract(other).isNegative()) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The negation of this value. */\r\ngoog.math.Long.prototype.negate = function() {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else {\r\n return this.not().add(goog.math.Long.ONE);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns the sum of this and the given Long.\r\n * @param {goog.math.Long} other Long to add to this one.\r\n * @return {!goog.math.Long} The sum of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.add = function(other) {\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns the difference of this and the given Long.\r\n * @param {goog.math.Long} other Long to subtract from this.\r\n * @return {!goog.math.Long} The difference of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.subtract = function(other) {\r\n return this.add(other.negate());\r\n};\r\n\r\n\r\n/**\r\n * Returns the product of this and the given long.\r\n * @param {goog.math.Long} other Long to multiply with this.\r\n * @return {!goog.math.Long} The product of this and the other.\r\n */\r\ngoog.math.Long.prototype.multiply = function(other) {\r\n if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n } else if (other.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().multiply(other.negate());\r\n } else {\r\n return this.negate().multiply(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.multiply(other.negate()).negate();\r\n }\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\r\n other.lessThan(goog.math.Long.TWO_PWR_24_)) {\r\n return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\r\n }\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long divided by the given one.\r\n * @param {goog.math.Long} other Long by which to divide.\r\n * @return {!goog.math.Long} This Long divided by the given one.\r\n */\r\ngoog.math.Long.prototype.div = function(other) {\r\n if (other.isZero()) {\r\n throw Error('division by zero');\r\n } else if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n if (other.equals(goog.math.Long.ONE) ||\r\n other.equals(goog.math.Long.NEG_ONE)) {\r\n return goog.math.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ONE;\r\n } else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shiftRight(1);\r\n var approx = halfThis.div(other).shiftLeft(1);\r\n if (approx.equals(goog.math.Long.ZERO)) {\r\n return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\r\n } else {\r\n var rem = this.subtract(other.multiply(approx));\r\n var result = approx.add(rem.div(other));\r\n return result;\r\n }\r\n }\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().div(other.negate());\r\n } else {\r\n return this.negate().div(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.div(other.negate()).negate();\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n var res = goog.math.Long.ZERO;\r\n var rem = this;\r\n while (rem.greaterThanOrEqual(other)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2);\r\n var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n var approxRes = goog.math.Long.fromNumber(approx);\r\n var approxRem = approxRes.multiply(other);\r\n while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\r\n approx -= delta;\r\n approxRes = goog.math.Long.fromNumber(approx);\r\n approxRem = approxRes.multiply(other);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero()) {\r\n approxRes = goog.math.Long.ONE;\r\n }\r\n\r\n res = res.add(approxRes);\r\n rem = rem.subtract(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long modulo the given one.\r\n * @param {goog.math.Long} other Long by which to mod.\r\n * @return {!goog.math.Long} This Long modulo the given one.\r\n */\r\ngoog.math.Long.prototype.modulo = function(other) {\r\n return this.subtract(this.div(other).multiply(other));\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The bitwise-NOT of this value. */\r\ngoog.math.Long.prototype.not = function() {\r\n return goog.math.Long.fromBits(~this.low_, ~this.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-AND of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to AND.\r\n * @return {!goog.math.Long} The bitwise-AND of this and the other.\r\n */\r\ngoog.math.Long.prototype.and = function(other) {\r\n return goog.math.Long.fromBits(this.low_ & other.low_,\r\n this.high_ & other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-OR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to OR.\r\n * @return {!goog.math.Long} The bitwise-OR of this and the other.\r\n */\r\ngoog.math.Long.prototype.or = function(other) {\r\n return goog.math.Long.fromBits(this.low_ | other.low_,\r\n this.high_ | other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-XOR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to XOR.\r\n * @return {!goog.math.Long} The bitwise-XOR of this and the other.\r\n */\r\ngoog.math.Long.prototype.xor = function(other) {\r\n return goog.math.Long.fromBits(this.low_ ^ other.low_,\r\n this.high_ ^ other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the left by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftLeft = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var low = this.low_;\r\n if (numBits < 32) {\r\n var high = this.high_;\r\n return goog.math.Long.fromBits(\r\n low << numBits,\r\n (high << numBits) | (low >>> (32 - numBits)));\r\n } else {\r\n return goog.math.Long.fromBits(0, low << (numBits - 32));\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftRight = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >> numBits);\r\n } else {\r\n return goog.math.Long.fromBits(\r\n high >> (numBits - 32),\r\n high >= 0 ? 0 : -1);\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount, with\r\n * the new top bits matching the current sign bit.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount, with\r\n * zeros placed into the new leading bits.\r\n */\r\ngoog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >>> numBits);\r\n } else if (numBits == 32) {\r\n return goog.math.Long.fromBits(high, 0);\r\n } else {\r\n return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\r\n }\r\n }\r\n};"
}
],
"filteredModules": 0,
"origins": [
{
"module": "",
"moduleIdentifier": "",
"moduleName": "",
"loc": "main",
"request": "!!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"reasons": []
}
]
}
],
"modules": [
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"index": 1,
"index2": 6,
"size": 28692,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"issuerId": 1,
"issuerName": "./src/lib/crypto.worker.js",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
}
],
"profile": {
"factory": 0,
"building": 1220
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony side effect evaluation",
"userRequest": "./bin_utils",
"loc": "18:0-19:66"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "27:15-35"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "31:15-26"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "35:15-27"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "39:15-29"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "43:15-29"
},
{
"moduleId": 1,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"module": "./src/lib/crypto.worker.js",
"moduleName": "./src/lib/crypto.worker.js",
"type": "harmony import specifier",
"userRequest": "./bin_utils",
"loc": "47:15-26"
}
],
"usedExports": [
"aesDecryptSync",
"aesEncryptSync",
"bytesModPow",
"hash_pbkdf2",
"pqPrimeFactorization",
"sha1HashSync"
],
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 1,
"source": "\"use strict\";\n/*!\n * Webogram v0.7.0 - messaging web application for MTProto\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n result[\"default\"] = mod;\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar jsbn_1 = require(\"jsbn\");\n// @ts-ignore\nvar Rusha = __importStar(require(\"rusha/dist/rusha.min.js\"));\nvar leemon_1 = require(\"leemon\");\n//import CryptoJS from 'crypto-js';\n// @ts-ignore\nvar pako_inflate_min_js_1 = __importDefault(require(\"pako/dist/pako_inflate.min.js\"));\nvar CryptoJS = require(\"./crypto.js\");\nrequire(\"./closure_long.js\");\nvar goog = this.goog;\nfunction bigint(num) {\n return new jsbn_1.BigInteger(num.toString(16), 16);\n}\nexports.bigint = bigint;\nfunction bigStringInt(strNum) {\n return new jsbn_1.BigInteger(strNum, 10);\n}\nexports.bigStringInt = bigStringInt;\n/* export function dHexDump (bytes) {\n var arr = []\n for (var i = 0; i < bytes.length; i++) {\n if (i && !(i % 2)) {\n if (!(i % 16)) {\n arr.push('\\n')\n } else if (!(i % 4)) {\n arr.push(' ')\n } else {\n arr.push(' ')\n }\n }\n arr.push((bytes[i] < 16 ? '0' : '') + bytes[i].toString(16))\n }\n\n console.log(arr.join(''))\n} */\nfunction bytesToHex(bytes) {\n bytes = bytes || [];\n var arr = [];\n for (var i = 0; i < bytes.length; i++) {\n arr.push((bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16));\n }\n return arr.join('');\n}\nexports.bytesToHex = bytesToHex;\nfunction bytesFromHex(hexString) {\n var len = hexString.length, i;\n var start = 0;\n var bytes = [];\n if (hexString.length % 2) {\n bytes.push(parseInt(hexString.charAt(0), 16));\n start++;\n }\n for (i = start; i < len; i += 2) {\n bytes.push(parseInt(hexString.substr(i, 2), 16));\n }\n return bytes;\n}\nexports.bytesFromHex = bytesFromHex;\nfunction bytesToBase64(bytes) {\n var mod3;\n var result = '';\n for (var nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if (mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(uint6ToBase64(nUint24 >>> 18 & 63), uint6ToBase64(nUint24 >>> 12 & 63), uint6ToBase64(nUint24 >>> 6 & 63), uint6ToBase64(nUint24 & 63));\n nUint24 = 0;\n }\n }\n return result.replace(/A(?=A$|$)/g, '=');\n}\nexports.bytesToBase64 = bytesToBase64;\nfunction uint6ToBase64(nUint6) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\nexports.uint6ToBase64 = uint6ToBase64;\nfunction base64ToBlob(base64str, mimeType) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n var bytes = new Array(end - begin);\n for (var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n return blobConstruct(byteArrays, mimeType);\n}\nexports.base64ToBlob = base64ToBlob;\nfunction dataUrlToBlob(url) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n}\nexports.dataUrlToBlob = dataUrlToBlob;\nfunction blobConstruct(blobParts, mimeType) {\n if (mimeType === void 0) { mimeType = ''; }\n var blob;\n var safeMimeType = blobSafeMimeType(mimeType);\n try {\n blob = new Blob(blobParts, { type: safeMimeType });\n }\n catch (e) {\n // @ts-ignore\n var bb = new BlobBuilder;\n blobParts.forEach(function (blobPart) {\n bb.append(blobPart);\n });\n blob = bb.getBlob(safeMimeType);\n }\n return blob;\n}\nexports.blobConstruct = blobConstruct;\nfunction blobSafeMimeType(mimeType) {\n if ([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n ].indexOf(mimeType) == -1) {\n return 'application/octet-stream';\n }\n return mimeType;\n}\nexports.blobSafeMimeType = blobSafeMimeType;\nfunction bytesCmp(bytes1, bytes2) {\n var len = bytes1.length;\n if (len != bytes2.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (bytes1[i] != bytes2[i]) {\n return false;\n }\n }\n return true;\n}\nexports.bytesCmp = bytesCmp;\nfunction bytesXor(bytes1, bytes2) {\n var len = bytes1.length;\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n return bytes;\n}\nexports.bytesXor = bytesXor;\nfunction bytesToWords(bytes) {\n if (bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n var len = bytes.length;\n var words = [];\n var i;\n for (i = 0; i < len; i++) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n return new CryptoJS.lib.WordArray.init(words, len);\n}\nfunction bytesFromWords(wordArray) {\n var words = wordArray.words;\n var sigBytes = wordArray.sigBytes;\n var bytes = [];\n for (var i = 0; i < sigBytes; i++) {\n bytes.push((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n return bytes;\n}\nfunction bytesFromBigInt(bigInt, len) {\n var bytes = bigInt.toByteArray();\n if (len && bytes.length < len) {\n var padding = [];\n for (var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n }\n else {\n bytes = padding.concat(bytes);\n }\n }\n else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n return bytes;\n}\nexports.bytesFromBigInt = bytesFromBigInt;\nfunction bytesFromLeemonBigInt(bigInt) {\n var str = leemon_1.bigInt2str(bigInt, 16);\n return bytesFromHex(str);\n}\nexports.bytesFromLeemonBigInt = bytesFromLeemonBigInt;\nfunction bytesToArrayBuffer(b) {\n return (new Uint8Array(b)).buffer;\n}\nexports.bytesToArrayBuffer = bytesToArrayBuffer;\nfunction convertToArrayBuffer(bytes) {\n // Be careful with converting subarrays!!\n if (bytes instanceof ArrayBuffer) {\n return bytes;\n }\n if (bytes.buffer !== undefined &&\n bytes.buffer.byteLength == bytes.length * bytes.BYTES_PER_ELEMENT) {\n return bytes.buffer;\n }\n return bytesToArrayBuffer(bytes);\n}\nexports.convertToArrayBuffer = convertToArrayBuffer;\nfunction convertToUint8Array(bytes) {\n if (bytes.buffer !== undefined) {\n return bytes;\n }\n return new Uint8Array(bytes);\n}\nexports.convertToUint8Array = convertToUint8Array;\nfunction convertToByteArray(bytes) {\n if (Array.isArray(bytes)) {\n return bytes;\n }\n bytes = convertToUint8Array(bytes);\n var newBytes = [];\n for (var i = 0, len = bytes.length; i < len; i++) {\n newBytes.push(bytes[i]);\n }\n return newBytes;\n}\nexports.convertToByteArray = convertToByteArray;\nfunction bytesFromArrayBuffer(buffer) {\n var len = buffer.byteLength;\n var byteView = new Uint8Array(buffer);\n var bytes = [];\n for (var i = 0; i < len; ++i) {\n bytes[i] = byteView[i];\n }\n return bytes;\n}\nexports.bytesFromArrayBuffer = bytesFromArrayBuffer;\nfunction bufferConcat(buffer1, buffer2) {\n var l1 = buffer1.byteLength || buffer1.length;\n var l2 = buffer2.byteLength || buffer2.length;\n var tmp = new Uint8Array(l1 + l2);\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\n return tmp.buffer;\n}\nexports.bufferConcat = bufferConcat;\nfunction bufferConcats() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var length = 0;\n args.forEach(function (b) { return length += b.byteLength || b.length; });\n var tmp = new Uint8Array(length);\n var lastLength = 0;\n args.forEach(function (b) {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += b.byteLength || b.length;\n });\n return tmp /* .buffer */;\n}\nexports.bufferConcats = bufferConcats;\nfunction longToInts(sLong) {\n var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000));\n return [divRem[0].intValue(), divRem[1].intValue()];\n}\nexports.longToInts = longToInts;\nfunction longToBytes(sLong) {\n return bytesFromWords({ words: longToInts(sLong), sigBytes: 8 }).reverse();\n}\nexports.longToBytes = longToBytes;\nfunction longFromInts(high, low) {\n return bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n}\nexports.longFromInts = longFromInts;\nfunction intToUint(val) {\n if (typeof (val) === 'string')\n val = parseInt(val);\n if (val < 0) {\n val = val + 4294967296;\n }\n return val;\n}\nexports.intToUint = intToUint;\nfunction uintToInt(val) {\n if (val > 2147483647) {\n val = val - 4294967296;\n }\n return val;\n}\nexports.uintToInt = uintToInt;\nfunction sha1HashSync(bytes) {\n var hash = Rusha.createHash();\n hash.update(bytes);\n var hashBytes = hash.digest();\n //console.log('sha1HashSync', bytes, hashBytes);\n //rushaInstance = rushaInstance || new Rusha(1024 * 1024);\n // console.log(dT(), 'SHA-1 hash start', bytes.byteLength || bytes.length)\n /* var hashBytes = rushaInstance.rawDigest(bytes).buffer; */\n // console.log(dT(), 'SHA-1 hash finish')\n return hashBytes;\n}\nexports.sha1HashSync = sha1HashSync;\nfunction sha1BytesSync(bytes) {\n return bytesFromArrayBuffer(sha1HashSync(bytes));\n}\nexports.sha1BytesSync = sha1BytesSync;\nfunction sha256HashSync(bytes) {\n // console.log(dT(), 'SHA-2 hash start', bytes.byteLength || bytes.length)\n var hashWords = CryptoJS.SHA256(bytesToWords(bytes));\n // console.log(dT(), 'SHA-2 hash finish')\n var hashBytes = bytesFromWords(hashWords);\n return hashBytes;\n}\nexports.sha256HashSync = sha256HashSync;\nfunction rsaEncrypt(publicKey, bytes) {\n bytes = addPadding(bytes, 255);\n // console.log('RSA encrypt start')\n var N = new jsbn_1.BigInteger(publicKey.modulus, 16);\n var E = new jsbn_1.BigInteger(publicKey.exponent, 16);\n var X = new jsbn_1.BigInteger(bytes);\n var encryptedBigInt = X.modPowInt(E, N), encryptedBytes = bytesFromBigInt(encryptedBigInt, 256);\n // console.log('RSA encrypt finish')\n return encryptedBytes;\n}\nexports.rsaEncrypt = rsaEncrypt;\nfunction addPadding(bytes, blockSize, zeroes, full) {\n if (full === void 0) { full = false; }\n blockSize = blockSize || 16;\n var len = bytes.byteLength || bytes.length;\n var needPadding = blockSize - (len % blockSize);\n if (needPadding > 0 && (needPadding < blockSize || full)) {\n var padding = new Array(needPadding);\n if (zeroes) {\n for (var i = 0; i < needPadding; i++) {\n padding[i] = 0;\n }\n }\n else {\n (new jsbn_1.SecureRandom()).nextBytes(padding);\n }\n if (bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(bytes, padding);\n }\n else {\n bytes = bytes.concat(padding);\n }\n }\n return bytes;\n}\nexports.addPadding = addPadding;\nfunction aesEncryptSync(bytes, keyBytes, ivBytes) {\n var len = bytes.byteLength || bytes.length;\n // console.log(dT(), 'AES encrypt start', len/*, bytesToHex(keyBytes), bytesToHex(ivBytes)*/)\n bytes = addPadding(bytes);\n var encryptedWords = CryptoJS.AES.encrypt(bytesToWords(bytes), bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n }).ciphertext;\n var encryptedBytes = bytesFromWords(encryptedWords);\n // console.log(dT(), 'AES encrypt finish')\n return encryptedBytes;\n}\nexports.aesEncryptSync = aesEncryptSync;\nfunction aesDecryptSync(encryptedBytes, keyBytes, ivBytes) {\n // console.log(dT(), 'AES decrypt start', encryptedBytes.length)\n var decryptedWords = CryptoJS.AES.decrypt({ ciphertext: bytesToWords(encryptedBytes) }, bytesToWords(keyBytes), {\n iv: bytesToWords(ivBytes),\n padding: CryptoJS.pad.NoPadding,\n mode: CryptoJS.mode.IGE\n });\n var bytes = bytesFromWords(decryptedWords);\n // console.log(dT(), 'AES decrypt finish')\n return bytes;\n}\nexports.aesDecryptSync = aesDecryptSync;\nfunction getDerivation(hash, salt, password, iterations, keyLength) {\n if (hash === void 0) { hash = 'SHA-512'; }\n return __awaiter(this, void 0, void 0, function () {\n var passwordBuffer, importedKey, saltBuffer, params, derivation;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n passwordBuffer = password;\n return [4 /*yield*/, crypto.subtle.importKey(\"raw\", passwordBuffer, \"PBKDF2\", false, [\"deriveBits\", 'deriveKey'])];\n case 1:\n importedKey = _a.sent();\n saltBuffer = salt /* textEncoder.encode(salt); */;\n params = { name: \"PBKDF2\", hash: hash, salt: saltBuffer, iterations: iterations };\n return [4 /*yield*/, crypto.subtle.deriveBits(params, importedKey, keyLength * 8)];\n case 2:\n derivation = _a.sent();\n return [2 /*return*/, derivation];\n }\n });\n });\n}\nfunction getKey(derivation) {\n return __awaiter(this, void 0, void 0, function () {\n var ivlen, keylen, derivedKey, iv, importedEncryptionKey;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n ivlen = 16;\n keylen = 32;\n derivedKey = derivation.slice(0, keylen);\n iv = derivation.slice(-ivlen);\n return [4 /*yield*/, crypto.subtle.importKey('raw', derivedKey, { name: 'AES-CBC', length: 256 }, false, ['encrypt'])];\n case 1:\n importedEncryptionKey = _a.sent();\n return [2 /*return*/, {\n key: importedEncryptionKey,\n iv: iv\n }];\n }\n });\n });\n}\nfunction encrypt(text, keyObject) {\n return __awaiter(this, void 0, void 0, function () {\n var textBuffer, encryptedText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n textBuffer = text;\n return [4 /*yield*/, crypto.subtle.encrypt({ name: 'AES-CBC', iv: keyObject.iv }, keyObject.key, textBuffer)];\n case 1:\n encryptedText = _a.sent();\n return [2 /*return*/, encryptedText];\n }\n });\n });\n}\n/* import * as crypto from 'crypto'; */\nfunction hash_pbkdf2(/* hasher: 'string', */ buffer, salt, iterations) {\n return __awaiter(this, void 0, void 0, function () {\n var importKey, deriveKey, bits;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, window.crypto.subtle.importKey(\"raw\", //only \"raw\" is allowed\n buffer, //your password\n {\n name: \"PBKDF2\",\n }, false, //whether the key is extractable (i.e. can be used in exportKey)\n [\"deriveKey\", \"deriveBits\"] //can be any combination of \"deriveKey\" and \"deriveBits\"\n )];\n case 1:\n importKey = _a.sent();\n return [4 /*yield*/, window.crypto.subtle.deriveKey({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n {\n name: \"AES-CTR\",\n //the generateKey parameters for that type of algorithm\n length: 256,\n }, false, //whether the derived key is extractable (i.e. can be used in exportKey)\n [\"encrypt\", \"decrypt\"] //limited to the options in that algorithm's importKey\n )];\n case 2:\n deriveKey = _a.sent();\n bits = window.crypto.subtle.deriveBits({\n \"name\": \"PBKDF2\",\n salt: salt,\n iterations: iterations,\n hash: { name: \"SHA-512\" },\n }, importKey, //your key from generateKey or importKey\n 512 //the number of bits you want to derive\n );\n return [2 /*return*/, bits];\n }\n });\n });\n}\nexports.hash_pbkdf2 = hash_pbkdf2;\nfunction gzipUncompress(bytes, toString) {\n // console.log('Gzip uncompress start')\n // @ts-ignore\n //var result = (new Zlib.Gunzip(bytes)).decompress();\n var result = pako_inflate_min_js_1.default.inflate(bytes, toString ? { to: 'string' } : undefined);\n // console.log('Gzip uncompress finish')\n return result;\n}\nexports.gzipUncompress = gzipUncompress;\nfunction nextRandomInt(maxValue) {\n return Math.floor(Math.random() * maxValue);\n}\nexports.nextRandomInt = nextRandomInt;\nfunction pqPrimeFactorization(pqBytes) {\n var what = new jsbn_1.BigInteger(pqBytes);\n var result = false;\n // console.log(dT(), 'PQ start', pqBytes, what.toString(16), what.bitLength())\n try {\n result = pqPrimeLeemon(leemon_1.str2bigInt(what.toString(16), 16, Math.ceil(64 / leemon_1.bpe) + 1));\n }\n catch (e) {\n console.error('Pq leemon Exception', e);\n }\n if (result === false && what.bitLength() <= 64) {\n // console.time('PQ long')\n try {\n result = pqPrimeLong(goog.math.Long.fromString(what.toString(16), 16));\n }\n catch (e) {\n console.error('Pq long Exception', e);\n }\n // console.timeEnd('PQ long')\n }\n // console.log(result)\n if (result === false) {\n // console.time('pq BigInt')\n result = pqPrimeBigInteger(what);\n // console.timeEnd('pq BigInt')\n }\n // console.log(dT(), 'PQ finish')\n return result;\n}\nexports.pqPrimeFactorization = pqPrimeFactorization;\nfunction pqPrimeBigInteger(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = (nextRandomInt(128) & 15) + 17;\n var x = bigint(nextRandomInt(1000000000) + 1);\n var y = x.clone();\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x.clone();\n var b = x.clone();\n var c = bigint(q);\n while (!b.equals(jsbn_1.BigInteger.ZERO)) {\n if (!b.and(jsbn_1.BigInteger.ONE).equals(jsbn_1.BigInteger.ZERO)) {\n c = c.add(a);\n if (c.compareTo(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compareTo(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c.clone();\n var z = x.compareTo(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = z.gcd(what);\n if (!g.equals(jsbn_1.BigInteger.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x.clone();\n }\n }\n if (g.compareTo(jsbn_1.BigInteger.ONE) > 0) {\n break;\n }\n }\n var f = what.divide(g), P, Q;\n if (g.compareTo(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromBigInt(P), bytesFromBigInt(Q), it];\n}\nexports.pqPrimeBigInteger = pqPrimeBigInteger;\nfunction gcdLong(a, b) {\n while (a.notEquals(goog.math.Long.ZERO) && b.notEquals(goog.math.Long.ZERO)) {\n while (b.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n b = b.shiftRight(1);\n }\n while (a.and(goog.math.Long.ONE).equals(goog.math.Long.ZERO)) {\n a = a.shiftRight(1);\n }\n if (a.compare(b) > 0) {\n a = a.subtract(b);\n }\n else {\n b = b.subtract(a);\n }\n }\n return b.equals(goog.math.Long.ZERO) ? a : b;\n}\nexports.gcdLong = gcdLong;\nfunction pqPrimeLong(what) {\n var it = 0, g;\n for (var i = 0; i < 3; i++) {\n var q = goog.math.Long.fromInt((nextRandomInt(128) & 15) + 17);\n var x = goog.math.Long.fromInt(nextRandomInt(1000000000) + 1);\n var y = x;\n var lim = 1 << (i + 18);\n for (var j = 1; j < lim; j++) {\n ++it;\n var a = x;\n var b = x;\n var c = q;\n while (b.notEquals(goog.math.Long.ZERO)) {\n if (b.and(goog.math.Long.ONE).notEquals(goog.math.Long.ZERO)) {\n c = c.add(a);\n if (c.compare(what) > 0) {\n c = c.subtract(what);\n }\n }\n a = a.add(a);\n if (a.compare(what) > 0) {\n a = a.subtract(what);\n }\n b = b.shiftRight(1);\n }\n x = c;\n var z = x.compare(y) < 0 ? y.subtract(x) : x.subtract(y);\n g = gcdLong(z, what);\n if (g.notEquals(goog.math.Long.ONE)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n y = x;\n }\n }\n if (g.compare(goog.math.Long.ONE) > 0) {\n break;\n }\n }\n var f = what.div(g), P, Q;\n if (g.compare(f) > 0) {\n P = f;\n Q = g;\n }\n else {\n P = g;\n Q = f;\n }\n return [bytesFromHex(P.toString(16)), bytesFromHex(Q.toString(16)), it];\n}\nexports.pqPrimeLong = pqPrimeLong;\nfunction pqPrimeLeemon(what) {\n var minBits = 64;\n var minLen = Math.ceil(minBits / leemon_1.bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n for (i = 0; i < 3; i++) {\n q = (nextRandomInt(128) & 15) + 17;\n leemon_1.copyInt_(x, nextRandomInt(1000000000) + 1);\n leemon_1.copy_(y, x);\n lim = 1 << (i + 18);\n for (j = 1; j < lim; j++) {\n ++it;\n leemon_1.copy_(a, x);\n leemon_1.copy_(b, x);\n leemon_1.copyInt_(c, q);\n while (!leemon_1.isZero(b)) {\n if (b[0] & 1) {\n leemon_1.add_(c, a);\n if (leemon_1.greater(c, what)) {\n leemon_1.sub_(c, what);\n }\n }\n leemon_1.add_(a, a);\n if (leemon_1.greater(a, what)) {\n leemon_1.sub_(a, what);\n }\n leemon_1.rightShift_(b, 1);\n }\n leemon_1.copy_(x, c);\n if (leemon_1.greater(x, y)) {\n leemon_1.copy_(z, x);\n leemon_1.sub_(z, y);\n }\n else {\n leemon_1.copy_(z, y);\n leemon_1.sub_(z, x);\n }\n leemon_1.eGCD_(z, what, g, a, b);\n if (!leemon_1.equalsInt(g, 1)) {\n break;\n }\n if ((j & (j - 1)) == 0) {\n leemon_1.copy_(y, x);\n }\n }\n if (leemon_1.greater(g, leemon_1.one)) {\n break;\n }\n }\n leemon_1.divide_(what, g, x, y);\n if (leemon_1.greater(g, x)) {\n P = x;\n Q = g;\n }\n else {\n P = g;\n Q = x;\n }\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n return [bytesFromLeemonBigInt(P), bytesFromLeemonBigInt(Q), it];\n}\nexports.pqPrimeLeemon = pqPrimeLeemon;\nfunction bytesModPow(x, y, m) {\n try {\n var xBigInt = leemon_1.str2bigInt(bytesToHex(x), 16);\n var yBigInt = leemon_1.str2bigInt(bytesToHex(y), 16);\n var mBigInt = leemon_1.str2bigInt(bytesToHex(m), 16);\n var resBigInt = leemon_1.powMod(xBigInt, yBigInt, mBigInt);\n return bytesFromHex(leemon_1.bigInt2str(resBigInt, 16));\n }\n catch (e) {\n console.error('mod pow error', e);\n }\n return bytesFromBigInt(new jsbn_1.BigInteger(x).modPow(new jsbn_1.BigInteger(y), new jsbn_1.BigInteger(m)), 256);\n}\nexports.bytesModPow = bytesModPow;\n"
},
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"index": 0,
"index2": 7,
"size": 1495,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": null,
"issuerId": null,
"issuerName": null,
"issuerPath": null,
"profile": {
"factory": 1,
"building": 3
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": null,
"moduleIdentifier": null,
"module": null,
"moduleName": null,
"type": "single entry",
"userRequest": "!!/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"loc": "main"
}
],
"usedExports": true,
"providedExports": [],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is an entry point"
],
"depth": 0,
"source": "/*!\r\n * Webogram v0.7.0 - messaging web application for MTProto\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* importScripts(\r\n 'polyfill.js',\r\n 'bin_utils.js',\r\n '../../vendor/jsbn/jsbn_combined.js',\r\n '../../vendor/leemon_bigint/bigint.js',\r\n '../../vendor/closure/long.js',\r\n '../../vendor/cryptoJS/crypto.js',\r\n '../../vendor/rusha/rusha.js'\r\n) */\r\n\r\nimport {pqPrimeFactorization, bytesModPow, sha1HashSync,\r\n aesEncryptSync, aesDecryptSync, hash_pbkdf2} from './bin_utils';\r\n\r\nonmessage = function(e) {\r\n var taskID = e.data.taskID,\r\n result;\r\n\r\n switch(e.data.task) {\r\n case 'factorize':\r\n result = pqPrimeFactorization(e.data.bytes);\r\n break;\r\n\r\n case 'mod-pow':\r\n result = bytesModPow(e.data.x, e.data.y, e.data.m);\r\n break;\r\n\r\n case 'sha1-hash':\r\n result = sha1HashSync(e.data.bytes);\r\n break;\r\n\r\n case 'aes-encrypt':\r\n result = aesEncryptSync(e.data.bytes, e.data.keyBytes, e.data.ivBytes);\r\n break;\r\n\r\n case 'aes-decrypt':\r\n result = aesDecryptSync(e.data.encryptedBytes, e.data.keyBytes, e.data.ivBytes);\r\n break;\r\n\r\n case 'pbkdf2':\r\n result = hash_pbkdf2(e.data.buffer, e.data.salt, e.data.iterations);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown task: ' + e.data.task);\r\n }\r\n\r\n postMessage({taskID: taskID, result: result});\r\n}\r\n\r\npostMessage('ready');\r\n"
},
{
"id": 2,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/jsbn/index.js",
"name": "./node_modules/jsbn/index.js",
"index": 2,
"index2": 0,
"size": 42308,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "jsbn",
"loc": "56:13-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "(function(){\n\n // Copyright (c) 2005 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Basic JavaScript BN library - subset useful for RSA encryption.\n\n // Bits per digit\n var dbits;\n\n // JavaScript engine analysis\n var canary = 0xdeadbeefcafe;\n var j_lm = ((canary&0xffffff)==0xefcafe);\n\n // (public) Constructor\n function BigInteger(a,b,c) {\n if(a != null)\n if(\"number\" == typeof a) this.fromNumber(a,b,c);\n else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n else this.fromString(a,b);\n }\n\n // return new, unset BigInteger\n function nbi() { return new BigInteger(null); }\n\n // am: Compute w_j += (x*this_i), propagate carries,\n // c is initial carry, returns final carry.\n // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n // We need to select the fastest one that works in this environment.\n\n // am1: use a single mult and divide to get the high bits,\n // max digit bits should be 26 because\n // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n function am1(i,x,w,j,c,n) {\n while(--n >= 0) {\n var v = x*this[i++]+w[j]+c;\n c = Math.floor(v/0x4000000);\n w[j++] = v&0x3ffffff;\n }\n return c;\n }\n // am2 avoids a big mult-and-extract completely.\n // Max digit bits should be <= 30 because we do bitwise ops\n // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n function am2(i,x,w,j,c,n) {\n var xl = x&0x7fff, xh = x>>15;\n while(--n >= 0) {\n var l = this[i]&0x7fff;\n var h = this[i++]>>15;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n w[j++] = l&0x3fffffff;\n }\n return c;\n }\n // Alternately, set max digit bits to 28 since some\n // browsers slow down when dealing with 32-bit numbers.\n function am3(i,x,w,j,c,n) {\n var xl = x&0x3fff, xh = x>>14;\n while(--n >= 0) {\n var l = this[i]&0x3fff;\n var h = this[i++]>>14;\n var m = xh*l+h*xl;\n l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n c = (l>>28)+(m>>14)+xh*h;\n w[j++] = l&0xfffffff;\n }\n return c;\n }\n var inBrowser = typeof navigator !== \"undefined\";\n if(inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n BigInteger.prototype.am = am2;\n dbits = 30;\n }\n else if(inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n BigInteger.prototype.am = am1;\n dbits = 26;\n }\n else { // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n }\n\n BigInteger.prototype.DB = dbits;\n BigInteger.prototype.DM = ((1<<dbits)-1);\n BigInteger.prototype.DV = (1<<dbits);\n\n var BI_FP = 52;\n BigInteger.prototype.FV = Math.pow(2,BI_FP);\n BigInteger.prototype.F1 = BI_FP-dbits;\n BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n // Digit conversions\n var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n var BI_RC = new Array();\n var rr,vv;\n rr = \"0\".charCodeAt(0);\n for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n rr = \"a\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n rr = \"A\".charCodeAt(0);\n for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n function int2char(n) { return BI_RM.charAt(n); }\n function intAt(s,i) {\n var c = BI_RC[s.charCodeAt(i)];\n return (c==null)?-1:c;\n }\n\n // (protected) copy this to r\n function bnpCopyTo(r) {\n for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n }\n\n // (protected) set from integer value x, -DV <= x < DV\n function bnpFromInt(x) {\n this.t = 1;\n this.s = (x<0)?-1:0;\n if(x > 0) this[0] = x;\n else if(x < -1) this[0] = x+this.DV;\n else this.t = 0;\n }\n\n // return bigint initialized to value\n function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n // (protected) set from string and radix\n function bnpFromString(s,b) {\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 256) k = 8; // byte array\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else { this.fromRadix(s,b); return; }\n this.t = 0;\n this.s = 0;\n var i = s.length, mi = false, sh = 0;\n while(--i >= 0) {\n var x = (k==8)?s[i]&0xff:intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if(sh == 0)\n this[this.t++] = x;\n else if(sh+k > this.DB) {\n this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n this[this.t++] = (x>>(this.DB-sh));\n }\n else\n this[this.t-1] |= x<<sh;\n sh += k;\n if(sh >= this.DB) sh -= this.DB;\n }\n if(k == 8 && (s[0]&0x80) != 0) {\n this.s = -1;\n if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n }\n this.clamp();\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) clamp off excess high words\n function bnpClamp() {\n var c = this.s&this.DM;\n while(this.t > 0 && this[this.t-1] == c) --this.t;\n }\n\n // (public) return string representation in given radix\n function bnToString(b) {\n if(this.s < 0) return \"-\"+this.negate().toString(b);\n var k;\n if(b == 16) k = 4;\n else if(b == 8) k = 3;\n else if(b == 2) k = 1;\n else if(b == 32) k = 5;\n else if(b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n var p = this.DB-(i*this.DB)%k;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n while(i >= 0) {\n if(p < k) {\n d = (this[i]&((1<<p)-1))<<(k-p);\n d |= this[--i]>>(p+=this.DB-k);\n }\n else {\n d = (this[i]>>(p-=k))&km;\n if(p <= 0) { p += this.DB; --i; }\n }\n if(d > 0) m = true;\n if(m) r += int2char(d);\n }\n }\n return m?r:\"0\";\n }\n\n // (public) -this\n function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n // (public) |this|\n function bnAbs() { return (this.s<0)?this.negate():this; }\n\n // (public) return + if this > a, - if this < a, 0 if equal\n function bnCompareTo(a) {\n var r = this.s-a.s;\n if(r != 0) return r;\n var i = this.t;\n r = i-a.t;\n if(r != 0) return (this.s<0)?-r:r;\n while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n return 0;\n }\n\n // returns bit length of the integer x\n function nbits(x) {\n var r = 1, t;\n if((t=x>>>16) != 0) { x = t; r += 16; }\n if((t=x>>8) != 0) { x = t; r += 8; }\n if((t=x>>4) != 0) { x = t; r += 4; }\n if((t=x>>2) != 0) { x = t; r += 2; }\n if((t=x>>1) != 0) { x = t; r += 1; }\n return r;\n }\n\n // (public) return the number of bits in \"this\"\n function bnBitLength() {\n if(this.t <= 0) return 0;\n return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n }\n\n // (protected) r = this << n*DB\n function bnpDLShiftTo(n,r) {\n var i;\n for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n for(i = n-1; i >= 0; --i) r[i] = 0;\n r.t = this.t+n;\n r.s = this.s;\n }\n\n // (protected) r = this >> n*DB\n function bnpDRShiftTo(n,r) {\n for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n r.t = Math.max(this.t-n,0);\n r.s = this.s;\n }\n\n // (protected) r = this << n\n function bnpLShiftTo(n,r) {\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<cbs)-1;\n var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n for(i = this.t-1; i >= 0; --i) {\n r[i+ds+1] = (this[i]>>cbs)|c;\n c = (this[i]&bm)<<bs;\n }\n for(i = ds-1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t+ds+1;\n r.s = this.s;\n r.clamp();\n }\n\n // (protected) r = this >> n\n function bnpRShiftTo(n,r) {\n r.s = this.s;\n var ds = Math.floor(n/this.DB);\n if(ds >= this.t) { r.t = 0; return; }\n var bs = n%this.DB;\n var cbs = this.DB-bs;\n var bm = (1<<bs)-1;\n r[0] = this[ds]>>bs;\n for(var i = ds+1; i < this.t; ++i) {\n r[i-ds-1] |= (this[i]&bm)<<cbs;\n r[i-ds] = this[i]>>bs;\n }\n if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n r.t = this.t-ds;\n r.clamp();\n }\n\n // (protected) r = this - a\n function bnpSubTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]-a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c -= a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c -= a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c<0)?-1:0;\n if(c < -1) r[i++] = this.DV+c;\n else if(c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n }\n\n // (protected) r = this * a, r != this,a (HAC 14.12)\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyTo(a,r) {\n var x = this.abs(), y = a.abs();\n var i = x.t;\n r.t = i+y.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n r.s = 0;\n r.clamp();\n if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n }\n\n // (protected) r = this^2, r != this (HAC 14.16)\n function bnpSquareTo(r) {\n var x = this.abs();\n var i = r.t = 2*x.t;\n while(--i >= 0) r[i] = 0;\n for(i = 0; i < x.t-1; ++i) {\n var c = x.am(i,x[i],r,2*i,0,1);\n if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n r[i+x.t] -= x.DV;\n r[i+x.t+1] = 1;\n }\n }\n if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n r.s = 0;\n r.clamp();\n }\n\n // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n // r != q, this != m. q or r may be null.\n function bnpDivRemTo(m,q,r) {\n var pm = m.abs();\n if(pm.t <= 0) return;\n var pt = this.abs();\n if(pt.t < pm.t) {\n if(q != null) q.fromInt(0);\n if(r != null) this.copyTo(r);\n return;\n }\n if(r == null) r = nbi();\n var y = nbi(), ts = this.s, ms = m.s;\n var nsh = this.DB-nbits(pm[pm.t-1]); // normalize modulus\n if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n else { pm.copyTo(y); pt.copyTo(r); }\n var ys = y.t;\n var y0 = y[ys-1];\n if(y0 == 0) return;\n var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n y.dlShiftTo(j,t);\n if(r.compareTo(t) >= 0) {\n r[r.t++] = 1;\n r.subTo(t,r);\n }\n BigInteger.ONE.dlShiftTo(ys,t);\n t.subTo(y,y); // \"negative\" y so we can replace sub with am later\n while(y.t < ys) y[y.t++] = 0;\n while(--j >= 0) {\n // Estimate quotient digit\n var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out\n y.dlShiftTo(j,t);\n r.subTo(t,r);\n while(r[i] < --qd) r.subTo(t,r);\n }\n }\n if(q != null) {\n r.drShiftTo(ys,q);\n if(ts != ms) BigInteger.ZERO.subTo(q,q);\n }\n r.t = ys;\n r.clamp();\n if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder\n if(ts < 0) BigInteger.ZERO.subTo(r,r);\n }\n\n // (public) this mod a\n function bnMod(a) {\n var r = nbi();\n this.abs().divRemTo(a,null,r);\n if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n return r;\n }\n\n // Modular reduction using \"classic\" algorithm\n function Classic(m) { this.m = m; }\n function cConvert(x) {\n if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n }\n function cRevert(x) { return x; }\n function cReduce(x) { x.divRemTo(this.m,null,x); }\n function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n Classic.prototype.convert = cConvert;\n Classic.prototype.revert = cRevert;\n Classic.prototype.reduce = cReduce;\n Classic.prototype.mulTo = cMulTo;\n Classic.prototype.sqrTo = cSqrTo;\n\n // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n // justification:\n // xy == 1 (mod m)\n // xy = 1+km\n // xy(2-xy) = (1+km)(1-km)\n // x[y(2-xy)] = 1-k^2m^2\n // x[y(2-xy)] == 1 (mod m^2)\n // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n function bnpInvDigit() {\n if(this.t < 1) return 0;\n var x = this[0];\n if((x&1) == 0) return 0;\n var y = x&3; // y == 1/x mod 2^2\n y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4\n y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8\n y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y>0)?this.DV-y:-y;\n }\n\n // Montgomery reduction\n function Montgomery(m) {\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp&0x7fff;\n this.mph = this.mp>>15;\n this.um = (1<<(m.DB-15))-1;\n this.mt2 = 2*m.t;\n }\n\n // xR mod m\n function montConvert(x) {\n var r = nbi();\n x.abs().dlShiftTo(this.m.t,r);\n r.divRemTo(this.m,null,r);\n if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n return r;\n }\n\n // x/R mod m\n function montRevert(x) {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n\n // x = x/R mod m (HAC 14.32)\n function montReduce(x) {\n while(x.t <= this.mt2) // pad x so am has enough room later\n x[x.t++] = 0;\n for(var i = 0; i < this.m.t; ++i) {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i]&0x7fff;\n var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i+this.m.t;\n x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n // propagate carry\n while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n }\n x.clamp();\n x.drShiftTo(this.m.t,x);\n if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = \"x^2/R mod m\"; x != r\n function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = \"xy/R mod m\"; x,y != r\n function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Montgomery.prototype.convert = montConvert;\n Montgomery.prototype.revert = montRevert;\n Montgomery.prototype.reduce = montReduce;\n Montgomery.prototype.mulTo = montMulTo;\n Montgomery.prototype.sqrTo = montSqrTo;\n\n // (protected) true iff this is even\n function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n function bnpExp(e,z) {\n if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n g.copyTo(r);\n while(--i >= 0) {\n z.sqrTo(r,r2);\n if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n else { var t = r; r = r2; r2 = t; }\n }\n return z.revert(r);\n }\n\n // (public) this^e % m, 0 <= e < 2^32\n function bnModPowInt(e,m) {\n var z;\n if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n return this.exp(e,z);\n }\n\n // protected\n BigInteger.prototype.copyTo = bnpCopyTo;\n BigInteger.prototype.fromInt = bnpFromInt;\n BigInteger.prototype.fromString = bnpFromString;\n BigInteger.prototype.clamp = bnpClamp;\n BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n BigInteger.prototype.lShiftTo = bnpLShiftTo;\n BigInteger.prototype.rShiftTo = bnpRShiftTo;\n BigInteger.prototype.subTo = bnpSubTo;\n BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n BigInteger.prototype.squareTo = bnpSquareTo;\n BigInteger.prototype.divRemTo = bnpDivRemTo;\n BigInteger.prototype.invDigit = bnpInvDigit;\n BigInteger.prototype.isEven = bnpIsEven;\n BigInteger.prototype.exp = bnpExp;\n\n // public\n BigInteger.prototype.toString = bnToString;\n BigInteger.prototype.negate = bnNegate;\n BigInteger.prototype.abs = bnAbs;\n BigInteger.prototype.compareTo = bnCompareTo;\n BigInteger.prototype.bitLength = bnBitLength;\n BigInteger.prototype.mod = bnMod;\n BigInteger.prototype.modPowInt = bnModPowInt;\n\n // \"constants\"\n BigInteger.ZERO = nbv(0);\n BigInteger.ONE = nbv(1);\n\n // Copyright (c) 2005-2009 Tom Wu\n // All Rights Reserved.\n // See \"LICENSE\" for details.\n\n // Extended JavaScript BN functions, required for RSA private ops.\n\n // Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n // Version 1.2: square() API, isProbablePrime fix\n\n // (public)\n function bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n // (public) return value as integer\n function bnIntValue() {\n if(this.s < 0) {\n if(this.t == 1) return this[0]-this.DV;\n else if(this.t == 0) return -1;\n }\n else if(this.t == 1) return this[0];\n else if(this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n }\n\n // (public) return value as byte\n function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n // (public) return value as short (assumes DB>=16)\n function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n // (protected) return x s.t. r^x < DV\n function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n // (public) 0 if this == 0, 1 if this > 0\n function bnSigNum() {\n if(this.s < 0) return -1;\n else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n }\n\n // (protected) convert to radix string\n function bnpToRadix(b) {\n if(b == null) b = 10;\n if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b,cs);\n var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n this.divRemTo(d,y,z);\n while(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n }\n return z.intValue().toString(b) + r;\n }\n\n // (protected) convert from radix string\n function bnpFromRadix(s,b) {\n this.fromInt(0);\n if(b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n for(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n this.dMultiply(d);\n this.dAddOffset(w,0);\n j = 0;\n w = 0;\n }\n }\n if(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n }\n if(mi) BigInteger.ZERO.subTo(this,this);\n }\n\n // (protected) alternate constructor\n function bnpFromNumber(a,b,c) {\n if(\"number\" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n this.fromNumber(a,c);\n if(!this.testBit(a-1)) // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n if(this.isEven()) this.dAddOffset(1,0); // force odd\n while(!this.isProbablePrime(b)) {\n this.dAddOffset(2,0);\n if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n }\n }\n }\n else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n }\n }\n\n // (public) convert to bigendian byte array\n function bnToByteArray() {\n var i = this.t, r = new Array();\n r[0] = this.s;\n var p = this.DB-(i*this.DB)%8, d, k = 0;\n if(i-- > 0) {\n if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n if(p < 8) {\n d = (this[i]&((1<<p)-1))<<(8-p);\n d |= this[--i]>>(p+=this.DB-8);\n }\n else {\n d = (this[i]>>(p-=8))&0xff;\n if(p <= 0) { p += this.DB; --i; }\n }\n if((d&0x80) != 0) d |= -256;\n if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n if(k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n }\n\n function bnEquals(a) { return(this.compareTo(a)==0); }\n function bnMin(a) { return(this.compareTo(a)<0)?this:a; }\n function bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n // (protected) r = this op a (bitwise)\n function bnpBitwiseTo(a,op,r) {\n var i, f, m = Math.min(a.t,this.t);\n for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n if(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n r.t = this.t;\n }\n else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n r.t = a.t;\n }\n r.s = op(this.s,a.s);\n r.clamp();\n }\n\n // (public) this & a\n function op_and(x,y) { return x&y; }\n function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n // (public) this | a\n function op_or(x,y) { return x|y; }\n function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n // (public) this ^ a\n function op_xor(x,y) { return x^y; }\n function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n // (public) this & ~a\n function op_andnot(x,y) { return x&~y; }\n function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n // (public) ~this\n function bnNot() {\n var r = nbi();\n for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n }\n\n // (public) this << n\n function bnShiftLeft(n) {\n var r = nbi();\n if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n return r;\n }\n\n // (public) this >> n\n function bnShiftRight(n) {\n var r = nbi();\n if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n return r;\n }\n\n // return index of lowest 1-bit in x, x < 2^31\n function lbit(x) {\n if(x == 0) return -1;\n var r = 0;\n if((x&0xffff) == 0) { x >>= 16; r += 16; }\n if((x&0xff) == 0) { x >>= 8; r += 8; }\n if((x&0xf) == 0) { x >>= 4; r += 4; }\n if((x&3) == 0) { x >>= 2; r += 2; }\n if((x&1) == 0) ++r;\n return r;\n }\n\n // (public) returns index of lowest 1-bit (or -1 if none)\n function bnGetLowestSetBit() {\n for(var i = 0; i < this.t; ++i)\n if(this[i] != 0) return i*this.DB+lbit(this[i]);\n if(this.s < 0) return this.t*this.DB;\n return -1;\n }\n\n // return number of 1 bits in x\n function cbit(x) {\n var r = 0;\n while(x != 0) { x &= x-1; ++r; }\n return r;\n }\n\n // (public) return number of set bits\n function bnBitCount() {\n var r = 0, x = this.s&this.DM;\n for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n return r;\n }\n\n // (public) true iff nth bit is set\n function bnTestBit(n) {\n var j = Math.floor(n/this.DB);\n if(j >= this.t) return(this.s!=0);\n return((this[j]&(1<<(n%this.DB)))!=0);\n }\n\n // (protected) this op (1<<n)\n function bnpChangeBit(n,op) {\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r,op,r);\n return r;\n }\n\n // (public) this | (1<<n)\n function bnSetBit(n) { return this.changeBit(n,op_or); }\n\n // (public) this & ~(1<<n)\n function bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n // (public) this ^ (1<<n)\n function bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n // (protected) r = this + a\n function bnpAddTo(a,r) {\n var i = 0, c = 0, m = Math.min(a.t,this.t);\n while(i < m) {\n c += this[i]+a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n if(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n c += this[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else {\n c += this.s;\n while(i < a.t) {\n c += a[i];\n r[i++] = c&this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c<0)?-1:0;\n if(c > 0) r[i++] = c;\n else if(c < -1) r[i++] = this.DV+c;\n r.t = i;\n r.clamp();\n }\n\n // (public) this + a\n function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n // (public) this - a\n function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n // (public) this * a\n function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n // (public) this^2\n function bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n // (public) this / a\n function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n // (public) this % a\n function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n // (public) [this/a,this%a]\n function bnDivideAndRemainder(a) {\n var q = nbi(), r = nbi();\n this.divRemTo(a,q,r);\n return new Array(q,r);\n }\n\n // (protected) this *= n, this >= 0, 1 < n < DV\n function bnpDMultiply(n) {\n this[this.t] = this.am(0,n-1,this,0,0,this.t);\n ++this.t;\n this.clamp();\n }\n\n // (protected) this += n << w words, this >= 0\n function bnpDAddOffset(n,w) {\n if(n == 0) return;\n while(this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while(this[w] >= this.DV) {\n this[w] -= this.DV;\n if(++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n }\n\n // A \"null\" reducer\n function NullExp() {}\n function nNop(x) { return x; }\n function nMulTo(x,y,r) { x.multiplyTo(y,r); }\n function nSqrTo(x,r) { x.squareTo(r); }\n\n NullExp.prototype.convert = nNop;\n NullExp.prototype.revert = nNop;\n NullExp.prototype.mulTo = nMulTo;\n NullExp.prototype.sqrTo = nSqrTo;\n\n // (public) this^e\n function bnPow(e) { return this.exp(e,new NullExp()); }\n\n // (protected) r = lower n words of \"this * a\", a.t <= n\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyLowerTo(a,n,r) {\n var i = Math.min(this.t+a.t,n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while(i > 0) r[--i] = 0;\n var j;\n for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n r.clamp();\n }\n\n // (protected) r = \"this * a\" without lower n words, n > 0\n // \"this\" should be the larger one if appropriate.\n function bnpMultiplyUpperTo(a,n,r) {\n --n;\n var i = r.t = this.t+a.t-n;\n r.s = 0; // assumes a,this >= 0\n while(--i >= 0) r[i] = 0;\n for(i = Math.max(n-this.t,0); i < a.t; ++i)\n r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n r.clamp();\n r.drShiftTo(1,r);\n }\n\n // Barrett modular reduction\n function Barrett(m) {\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n }\n\n function barrettConvert(x) {\n if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n else if(x.compareTo(this.m) < 0) return x;\n else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n }\n\n function barrettRevert(x) { return x; }\n\n // x = x mod m (HAC 14.42)\n function barrettReduce(x) {\n x.drShiftTo(this.m.t-1,this.r2);\n if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n x.subTo(this.r2,x);\n while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n }\n\n // r = x^2 mod m; x != r\n function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n // r = x*y mod m; x,y != r\n function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n Barrett.prototype.convert = barrettConvert;\n Barrett.prototype.revert = barrettRevert;\n Barrett.prototype.reduce = barrettReduce;\n Barrett.prototype.mulTo = barrettMulTo;\n Barrett.prototype.sqrTo = barrettSqrTo;\n\n // (public) this^e % m (HAC 14.85)\n function bnModPow(e,m) {\n var i = e.bitLength(), k, r = nbv(1), z;\n if(i <= 0) return r;\n else if(i < 18) k = 1;\n else if(i < 48) k = 3;\n else if(i < 144) k = 4;\n else if(i < 768) k = 5;\n else k = 6;\n if(i < 8)\n z = new Classic(m);\n else if(m.isEven())\n z = new Barrett(m);\n else\n z = new Montgomery(m);\n\n // precomputation\n var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n g[1] = z.convert(this);\n if(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n g[n] = nbi();\n z.mulTo(g2,g[n-2],g[n]);\n n += 2;\n }\n }\n\n var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n i = nbits(e[j])-1;\n while(j >= 0) {\n if(i >= k1) w = (e[j]>>(i-k1))&km;\n else {\n w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else {\n while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e[j]&(1<<i)) == 0) {\n z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n if(--i < 0) { i = this.DB-1; --j; }\n }\n }\n return z.revert(r);\n }\n\n // (public) gcd(this,a) (HAC 14.54)\n function bnGCD(a) {\n var x = (this.s<0)?this.negate():this.clone();\n var y = (a.s<0)?a.negate():a.clone();\n if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n if(g < 0) return x;\n if(i < g) g = i;\n if(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n }\n while(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n x.subTo(y,x);\n x.rShiftTo(1,x);\n }\n else {\n y.subTo(x,y);\n y.rShiftTo(1,y);\n }\n }\n if(g > 0) y.lShiftTo(g,y);\n return y;\n }\n\n // (protected) this % n, n < 2^26\n function bnpModInt(n) {\n if(n <= 0) return 0;\n var d = this.DV%n, r = (this.s<0)?n-1:0;\n if(this.t > 0)\n if(d == 0) r = this[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n return r;\n }\n\n // (public) 1/this % m (HAC 14.61)\n function bnModInverse(m) {\n var ac = m.isEven();\n if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(), v = this.clone();\n var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n while(u.signum() != 0) {\n while(u.isEven()) {\n u.rShiftTo(1,u);\n if(ac) {\n if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n a.rShiftTo(1,a);\n }\n else if(!b.isEven()) b.subTo(m,b);\n b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n v.rShiftTo(1,v);\n if(ac) {\n if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n c.rShiftTo(1,c);\n }\n else if(!d.isEven()) d.subTo(m,d);\n d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n u.subTo(v,u);\n if(ac) a.subTo(c,a);\n b.subTo(d,b);\n }\n else {\n v.subTo(u,v);\n if(ac) c.subTo(a,c);\n d.subTo(b,d);\n }\n }\n if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if(d.compareTo(m) >= 0) return d.subtract(m);\n if(d.signum() < 0) d.addTo(m,d); else return d;\n if(d.signum() < 0) return d.add(m); else return d;\n }\n\n var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\n var lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n // (public) test primality with certainty >= 1-.5^t\n function bnIsProbablePrime(t) {\n var i, x = this.abs();\n if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n if(x[0] == lowprimes[i]) return true;\n return false;\n }\n if(x.isEven()) return false;\n i = 1;\n while(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n }\n\n // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n function bnpMillerRabin(t) {\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if(k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t+1)>>1;\n if(t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for(var i = 0; i < t; ++i) {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n var j = 1;\n while(j++ < k && y.compareTo(n1) != 0) {\n y = y.modPowInt(2,this);\n if(y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if(y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n }\n\n // protected\n BigInteger.prototype.chunkSize = bnpChunkSize;\n BigInteger.prototype.toRadix = bnpToRadix;\n BigInteger.prototype.fromRadix = bnpFromRadix;\n BigInteger.prototype.fromNumber = bnpFromNumber;\n BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n BigInteger.prototype.changeBit = bnpChangeBit;\n BigInteger.prototype.addTo = bnpAddTo;\n BigInteger.prototype.dMultiply = bnpDMultiply;\n BigInteger.prototype.dAddOffset = bnpDAddOffset;\n BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n BigInteger.prototype.modInt = bnpModInt;\n BigInteger.prototype.millerRabin = bnpMillerRabin;\n\n // public\n BigInteger.prototype.clone = bnClone;\n BigInteger.prototype.intValue = bnIntValue;\n BigInteger.prototype.byteValue = bnByteValue;\n BigInteger.prototype.shortValue = bnShortValue;\n BigInteger.prototype.signum = bnSigNum;\n BigInteger.prototype.toByteArray = bnToByteArray;\n BigInteger.prototype.equals = bnEquals;\n BigInteger.prototype.min = bnMin;\n BigInteger.prototype.max = bnMax;\n BigInteger.prototype.and = bnAnd;\n BigInteger.prototype.or = bnOr;\n BigInteger.prototype.xor = bnXor;\n BigInteger.prototype.andNot = bnAndNot;\n BigInteger.prototype.not = bnNot;\n BigInteger.prototype.shiftLeft = bnShiftLeft;\n BigInteger.prototype.shiftRight = bnShiftRight;\n BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n BigInteger.prototype.bitCount = bnBitCount;\n BigInteger.prototype.testBit = bnTestBit;\n BigInteger.prototype.setBit = bnSetBit;\n BigInteger.prototype.clearBit = bnClearBit;\n BigInteger.prototype.flipBit = bnFlipBit;\n BigInteger.prototype.add = bnAdd;\n BigInteger.prototype.subtract = bnSubtract;\n BigInteger.prototype.multiply = bnMultiply;\n BigInteger.prototype.divide = bnDivide;\n BigInteger.prototype.remainder = bnRemainder;\n BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n BigInteger.prototype.modPow = bnModPow;\n BigInteger.prototype.modInverse = bnModInverse;\n BigInteger.prototype.pow = bnPow;\n BigInteger.prototype.gcd = bnGCD;\n BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n // JSBN-specific extension\n BigInteger.prototype.square = bnSquare;\n\n // Expose the Barrett function\n BigInteger.prototype.Barrett = Barrett\n\n // BigInteger interfaces not implemented in jsbn:\n\n // BigInteger(int signum, byte[] magnitude)\n // double doubleValue()\n // float floatValue()\n // int hashCode()\n // long longValue()\n // static BigInteger valueOf(long val)\n\n // Random number generator - requires a PRNG backend, e.g. prng4.js\n\n // For best results, put code like\n // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n // in your main HTML document.\n\n var rng_state;\n var rng_pool;\n var rng_pptr;\n\n // Mix in a 32-bit integer into the pool\n function rng_seed_int(x) {\n rng_pool[rng_pptr++] ^= x & 255;\n rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n }\n\n // Mix in the current time (w/milliseconds) into the pool\n function rng_seed_time() {\n rng_seed_int(new Date().getTime());\n }\n\n // Initialize the pool with junk if needed.\n if(rng_pool == null) {\n rng_pool = new Array();\n rng_pptr = 0;\n var t;\n if(typeof window !== \"undefined\" && window.crypto) {\n if (window.crypto.getRandomValues) {\n // Use webcrypto if available\n var ua = new Uint8Array(32);\n window.crypto.getRandomValues(ua);\n for(t = 0; t < 32; ++t)\n rng_pool[rng_pptr++] = ua[t];\n }\n else if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n // Extract entropy (256 bits) from NS4 RNG if available\n var z = window.crypto.random(32);\n for(t = 0; t < z.length; ++t)\n rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n }\n }\n while(rng_pptr < rng_psize) { // extract some randomness from Math.random()\n t = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = t >>> 8;\n rng_pool[rng_pptr++] = t & 255;\n }\n rng_pptr = 0;\n rng_seed_time();\n //rng_seed_int(window.screenX);\n //rng_seed_int(window.screenY);\n }\n\n function rng_get_byte() {\n if(rng_state == null) {\n rng_seed_time();\n rng_state = prng_newstate();\n rng_state.init(rng_pool);\n for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n rng_pool[rng_pptr] = 0;\n rng_pptr = 0;\n //rng_pool = null;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n }\n\n function rng_get_bytes(ba) {\n var i;\n for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n }\n\n function SecureRandom() {}\n\n SecureRandom.prototype.nextBytes = rng_get_bytes;\n\n // prng4.js - uses Arcfour as a PRNG\n\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = new Array();\n }\n\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n function ARC4init(key) {\n var i, j, t;\n for(i = 0; i < 256; ++i)\n this.S[i] = i;\n j = 0;\n for(i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n }\n\n function ARC4next() {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n }\n\n Arcfour.prototype.init = ARC4init;\n Arcfour.prototype.next = ARC4next;\n\n // Plug in your RNG constructor here\n function prng_newstate() {\n return new Arcfour();\n }\n\n // Pool size must be a multiple of 4 and greater than 32.\n // An array of bytes the size of the pool will be passed to init()\n var rng_psize = 256;\n\n if (typeof exports !== 'undefined') {\n exports = module.exports = {\n default: BigInteger,\n BigInteger: BigInteger,\n SecureRandom: SecureRandom,\n };\n } else {\n this.jsbn = {\n BigInteger: BigInteger,\n SecureRandom: SecureRandom\n };\n }\n\n}).call(this);\n"
},
{
"id": 3,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/rusha/dist/rusha.min.js",
"name": "./node_modules/rusha/dist/rusha.min.js",
"index": 3,
"index2": 1,
"size": 12486,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "rusha/dist/rusha.min.js",
"loc": "58:25-59"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*! rusha 2018-02-19 */\n\n(function e(t,r){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=r();else if(typeof define===\"function\"&&define.amd)define([],r);else if(typeof exports===\"object\")exports[\"Rusha\"]=r();else t[\"Rusha\"]=r()})(typeof self!==\"undefined\"?self:this,function(){return function(e){var t={};function r(n){if(t[n]){return t[n].exports}var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"\";return r(r.s=3)}([function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(5);var i=r(1),o=i.toHex,s=i.ceilHeapSize;var f=r(6);var u=function(e){for(e+=9;e%64>0;e+=1){}return e};var c=function(e,t){var r=new Uint8Array(e.buffer);var n=t%4,a=t-n;switch(n){case 0:r[a+3]=0;case 1:r[a+2]=0;case 2:r[a+1]=0;case 3:r[a+0]=0}for(var i=(t>>2)+1;i<e.length;i++){e[i]=0}};var h=function(e,t,r){e[t>>2]|=128<<24-(t%4<<3);e[((t>>2)+2&~15)+14]=r/(1<<29)|0;e[((t>>2)+2&~15)+15]=r<<3};var p=function(e,t){var r=new Int32Array(e,t+320,5);var n=new Int32Array(5);var a=new DataView(n.buffer);a.setInt32(0,r[0],false);a.setInt32(4,r[1],false);a.setInt32(8,r[2],false);a.setInt32(12,r[3],false);a.setInt32(16,r[4],false);return n};var l=function(){function e(t){n(this,e);t=t||64*1024;if(t%64>0){throw new Error(\"Chunk size must be a multiple of 128 bit\")}this._offset=0;this._maxChunkLen=t;this._padMaxChunkLen=u(t);this._heap=new ArrayBuffer(s(this._padMaxChunkLen+320+20));this._h32=new Int32Array(this._heap);this._h8=new Int8Array(this._heap);this._core=new a({Int32Array:Int32Array},{},this._heap)}e.prototype._initState=function e(t,r){this._offset=0;var n=new Int32Array(t,r+320,5);n[0]=1732584193;n[1]=-271733879;n[2]=-1732584194;n[3]=271733878;n[4]=-1009589776};e.prototype._padChunk=function e(t,r){var n=u(t);var a=new Int32Array(this._heap,0,n>>2);c(a,t);h(a,t,r);return n};e.prototype._write=function e(t,r,n,a){f(t,this._h8,this._h32,r,n,a||0)};e.prototype._coreCall=function e(t,r,n,a,i){var o=n;this._write(t,r,n);if(i){o=this._padChunk(n,a)}this._core.hash(o,this._padMaxChunkLen)};e.prototype.rawDigest=function e(t){var r=t.byteLength||t.length||t.size||0;this._initState(this._heap,this._padMaxChunkLen);var n=0,a=this._maxChunkLen;for(n=0;r>n+a;n+=a){this._coreCall(t,n,a,r,false)}this._coreCall(t,n,r-n,r,true);return p(this._heap,this._padMaxChunkLen)};e.prototype.digest=function e(t){return o(this.rawDigest(t).buffer)};e.prototype.digestFromString=function e(t){return this.digest(t)};e.prototype.digestFromBuffer=function e(t){return this.digest(t)};e.prototype.digestFromArrayBuffer=function e(t){return this.digest(t)};e.prototype.resetState=function e(){this._initState(this._heap,this._padMaxChunkLen);return this};e.prototype.append=function e(t){var r=0;var n=t.byteLength||t.length||t.size||0;var a=this._offset%this._maxChunkLen;var i=void 0;this._offset+=n;while(r<n){i=Math.min(n-r,this._maxChunkLen-a);this._write(t,r,i,a);a+=i;r+=i;if(a===this._maxChunkLen){this._core.hash(this._maxChunkLen,this._padMaxChunkLen);a=0}}return this};e.prototype.getState=function e(){var t=this._offset%this._maxChunkLen;var r=void 0;if(!t){var n=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}else{r=this._heap.slice(0)}return{offset:this._offset,heap:r}};e.prototype.setState=function e(t){this._offset=t.offset;if(t.heap.byteLength===20){var r=new Int32Array(this._heap,this._padMaxChunkLen+320,5);r.set(new Int32Array(t.heap))}else{this._h32.set(new Int32Array(t.heap))}return this};e.prototype.rawEnd=function e(){var t=this._offset;var r=t%this._maxChunkLen;var n=this._padChunk(r,t);this._core.hash(n,this._padMaxChunkLen);var a=p(this._heap,this._padMaxChunkLen);this._initState(this._heap,this._padMaxChunkLen);return a};e.prototype.end=function e(){return o(this.rawEnd().buffer)};return e}();e.exports=l;e.exports._core=a},function(e,t){var r=new Array(256);for(var n=0;n<256;n++){r[n]=(n<16?\"0\":\"\")+n.toString(16)}e.exports.toHex=function(e){var t=new Uint8Array(e);var n=new Array(e.byteLength);for(var a=0;a<n.length;a++){n[a]=r[t[a]]}return n.join(\"\")};e.exports.ceilHeapSize=function(e){var t=0;if(e<=65536)return 65536;if(e<16777216){for(t=1;t<e;t=t<<1){}}else{for(t=16777216;t<e;t+=16777216){}}return t};e.exports.isDedicatedWorkerScope=function(e){var t=\"WorkerGlobalScope\"in e&&e instanceof e.WorkerGlobalScope;var r=\"SharedWorkerGlobalScope\"in e&&e instanceof e.SharedWorkerGlobalScope;var n=\"ServiceWorkerGlobalScope\"in e&&e instanceof e.ServiceWorkerGlobalScope;return t&&!r&&!n}},function(e,t,r){e.exports=function(){var e=r(0);var t=function(e,t,r){try{return r(null,e.digest(t))}catch(e){return r(e)}};var n=function(e,t,r,a,i){var o=new self.FileReader;o.onloadend=function s(){if(o.error){return i(o.error)}var f=o.result;t+=o.result.byteLength;try{e.append(f)}catch(e){i(e);return}if(t<a.size){n(e,t,r,a,i)}else{i(null,e.end())}};o.readAsArrayBuffer(a.slice(t,t+r))};var a=true;self.onmessage=function(r){if(!a){return}var i=r.data.data,o=r.data.file,s=r.data.id;if(typeof s===\"undefined\")return;if(!o&&!i)return;var f=r.data.blockSize||4*1024*1024;var u=new e(f);u.resetState();var c=function(e,t){if(!e){self.postMessage({id:s,hash:t})}else{self.postMessage({id:s,error:e.name})}};if(i)t(u,i,c);if(o)n(u,0,f,o,c)};return function(){a=false}}},function(e,t,r){var n=r(4);var a=r(0);var i=r(7);var o=r(2);var s=r(1),f=s.isDedicatedWorkerScope;var u=typeof self!==\"undefined\"&&f(self);a.disableWorkerBehaviour=u?o():function(){};a.createWorker=function(){var e=n(2);var t=e.terminate;e.terminate=function(){URL.revokeObjectURL(e.objectURL);t.call(e)};return e};a.createHash=i;e.exports=a},function(e,t,r){function n(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:false,exports:{}};e[n].call(a.exports,a,a.exports,r);a.l=true;return a.exports}r.m=e;r.c=t;r.i=function(e){return e};r.d=function(e,t,n){if(!r.o(e,t)){Object.defineProperty(e,t,{configurable:false,enumerable:true,get:n})}};r.r=function(e){Object.defineProperty(e,\"__esModule\",{value:true})};r.n=function(e){var t=e&&e.__esModule?function t(){return e[\"default\"]}:function t(){return e};r.d(t,\"a\",t);return t};r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.p=\"/\";r.oe=function(e){console.error(e);throw e};var n=r(r.s=ENTRY_MODULE);return n.default||n}var a=\"[\\\\.|\\\\-|\\\\+|\\\\w|/|@]+\";var i=\"\\\\((/\\\\*.*?\\\\*/)?s?.*?(\"+a+\").*?\\\\)\";function o(e){return(e+\"\").replace(/[.?*+^$[\\]\\\\(){}|-]/g,\"\\\\$&\")}function s(e,t,n){var s={};s[n]=[];var f=t.toString();var u=f.match(/^function\\s?\\(\\w+,\\s*\\w+,\\s*(\\w+)\\)/);if(!u)return s;var c=u[1];var h=new RegExp(\"(\\\\\\\\n|\\\\W)\"+o(c)+i,\"g\");var p;while(p=h.exec(f)){if(p[3]===\"dll-reference\")continue;s[n].push(p[3])}h=new RegExp(\"\\\\(\"+o(c)+'\\\\(\"(dll-reference\\\\s('+a+'))\"\\\\)\\\\)'+i,\"g\");while(p=h.exec(f)){if(!e[p[2]]){s[n].push(p[1]);e[p[2]]=r(p[1]).m}s[p[2]]=s[p[2]]||[];s[p[2]].push(p[4])}return s}function f(e){var t=Object.keys(e);return t.reduce(function(t,r){return t||e[r].length>0},false)}function u(e,t){var r={main:[t]};var n={main:[]};var a={main:{}};while(f(r)){var i=Object.keys(r);for(var o=0;o<i.length;o++){var u=i[o];var c=r[u];var h=c.pop();a[u]=a[u]||{};if(a[u][h]||!e[u][h])continue;a[u][h]=true;n[u]=n[u]||[];n[u].push(h);var p=s(e,e[u][h],u);var l=Object.keys(p);for(var v=0;v<l.length;v++){r[l[v]]=r[l[v]]||[];r[l[v]]=r[l[v]].concat(p[l[v]])}}}return n}e.exports=function(e,t){t=t||{};var a={main:r.m};var i=t.all?{main:Object.keys(a)}:u(a,e);var o=\"\";Object.keys(i).filter(function(e){return e!==\"main\"}).forEach(function(e){var t=0;while(i[e][t]){t++}i[e].push(t);a[e][t]=\"(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })\";o=o+\"var \"+e+\" = (\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(t))+\")({\"+i[e].map(function(t){return\"\"+JSON.stringify(t)+\": \"+a[e][t].toString()}).join(\",\")+\"});\\n\"});o=o+\"(\"+n.toString().replace(\"ENTRY_MODULE\",JSON.stringify(e))+\")({\"+i.main.map(function(e){return\"\"+JSON.stringify(e)+\": \"+a.main[e].toString()}).join(\",\")+\"})(self);\";var s=new window.Blob([o],{type:\"text/javascript\"});if(t.bare){return s}var f=window.URL||window.webkitURL||window.mozURL||window.msURL;var c=f.createObjectURL(s);var h=new window.Worker(c);h.objectURL=c;return h}},function(e,t){e.exports=function e(t,r,n){\"use asm\";var a=new t.Int32Array(n);function i(e,t){e=e|0;t=t|0;var r=0,n=0,i=0,o=0,s=0,f=0,u=0,c=0,h=0,p=0,l=0,v=0,d=0,y=0;i=a[t+320>>2]|0;s=a[t+324>>2]|0;u=a[t+328>>2]|0;h=a[t+332>>2]|0;l=a[t+336>>2]|0;for(r=0;(r|0)<(e|0);r=r+64|0){o=i;f=s;c=u;p=h;v=l;for(n=0;(n|0)<64;n=n+4|0){y=a[r+n>>2]|0;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[e+n>>2]=y}for(n=e+64|0;(n|0)<(e+80|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|~s&h)|0)+((y+l|0)+1518500249|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+80|0;(n|0)<(e+160|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)+1859775393|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+160|0;(n|0)<(e+240|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s&u|s&h|u&h)|0)+((y+l|0)-1894007588|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}for(n=e+240|0;(n|0)<(e+320|0);n=n+4|0){y=(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])<<1|(a[n-12>>2]^a[n-32>>2]^a[n-56>>2]^a[n-64>>2])>>>31;d=((i<<5|i>>>27)+(s^u^h)|0)+((y+l|0)-899497514|0)|0;l=h;h=u;u=s<<30|s>>>2;s=i;i=d;a[n>>2]=y}i=i+o|0;s=s+f|0;u=u+c|0;h=h+p|0;l=l+v|0}a[t+320>>2]=i;a[t+324>>2]=s;a[t+328>>2]=u;a[t+332>>2]=h;a[t+336>>2]=l}return{hash:i}}},function(e,t){var r=this;var n=void 0;if(typeof self!==\"undefined\"&&typeof self.FileReaderSync!==\"undefined\"){n=new self.FileReaderSync}var a=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e.charCodeAt(n+3);case 1:t[i+1-(s<<1)|0]=e.charCodeAt(n+2);case 2:t[i+2-(s<<1)|0]=e.charCodeAt(n+1);case 3:t[i+3-(s<<1)|0]=e.charCodeAt(n)}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2]=e.charCodeAt(n+o)<<24|e.charCodeAt(n+o+1)<<16|e.charCodeAt(n+o+2)<<8|e.charCodeAt(n+o+3)}switch(f){case 3:t[i+u+1|0]=e.charCodeAt(n+u+2);case 2:t[i+u+2|0]=e.charCodeAt(n+u+1);case 1:t[i+u+3|0]=e.charCodeAt(n+u)}};var i=function(e,t,r,n,a,i){var o=void 0,s=i%4,f=(a+s)%4,u=a-f;switch(s){case 0:t[i]=e[n+3];case 1:t[i+1-(s<<1)|0]=e[n+2];case 2:t[i+2-(s<<1)|0]=e[n+1];case 3:t[i+3-(s<<1)|0]=e[n]}if(a<f+(4-s)){return}for(o=4-s;o<u;o=o+4|0){r[i+o>>2|0]=e[n+o]<<24|e[n+o+1]<<16|e[n+o+2]<<8|e[n+o+3]}switch(f){case 3:t[i+u+1|0]=e[n+u+2];case 2:t[i+u+2|0]=e[n+u+1];case 1:t[i+u+3|0]=e[n+u]}};var o=function(e,t,r,a,i,o){var s=void 0,f=o%4,u=(i+f)%4,c=i-u;var h=new Uint8Array(n.readAsArrayBuffer(e.slice(a,a+i)));switch(f){case 0:t[o]=h[3];case 1:t[o+1-(f<<1)|0]=h[2];case 2:t[o+2-(f<<1)|0]=h[1];case 3:t[o+3-(f<<1)|0]=h[0]}if(i<u+(4-f)){return}for(s=4-f;s<c;s=s+4|0){r[o+s>>2|0]=h[s]<<24|h[s+1]<<16|h[s+2]<<8|h[s+3]}switch(u){case 3:t[o+c+1|0]=h[c+2];case 2:t[o+c+2|0]=h[c+1];case 1:t[o+c+3|0]=h[c]}};e.exports=function(e,t,n,s,f,u){if(typeof e===\"string\"){return a(e,t,n,s,f,u)}if(e instanceof Array){return i(e,t,n,s,f,u)}if(r&&r.Buffer&&r.Buffer.isBuffer(e)){return i(e,t,n,s,f,u)}if(e instanceof ArrayBuffer){return i(new Uint8Array(e),t,n,s,f,u)}if(e.buffer instanceof ArrayBuffer){return i(new Uint8Array(e.buffer,e.byteOffset,e.byteLength),t,n,s,f,u)}if(e instanceof Blob){return o(e,t,n,s,f,u)}throw new Error(\"Unsupported data type.\")}},function(e,t,r){function n(e,t){if(!(e instanceof t)){throw new TypeError(\"Cannot call a class as a function\")}}var a=r(0);var i=r(1),o=i.toHex;var s=function(){function e(){n(this,e);this._rusha=new a;this._rusha.resetState()}e.prototype.update=function e(t){this._rusha.append(t);return this};e.prototype.digest=function e(t){var e=this._rusha.rawEnd().buffer;if(!t){return e}if(t===\"hex\"){return o(e)}throw new Error(\"unsupported digest encoding\")};return e}();e.exports=function(){return new s}}])});"
},
{
"id": 4,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/leemon/es/index.js",
"name": "./node_modules/leemon/es/index.js",
"index": 4,
"index2": 2,
"size": 57067,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "leemon",
"loc": "59:15-32"
}
],
"usedExports": true,
"providedExports": [
"bpe",
"one",
"zero",
"findPrimes",
"millerRabinInt",
"millerRabin",
"bitSize",
"expand",
"randTruePrime",
"randProbPrime",
"randProbPrimeRounds",
"mod",
"addInt",
"mult",
"powMod",
"sub",
"add",
"inverseMod",
"multMod",
"randTruePrime_",
"randBigInt",
"randBigInt_",
"GCD",
"GCD_",
"inverseMod_",
"inverseModInt",
"eGCD_",
"negative",
"greaterShift",
"greater",
"divide_",
"carry_",
"modInt",
"int2bigInt",
"str2bigInt",
"equalsInt",
"equals",
"isZero",
"bigInt2str",
"dup",
"copy_",
"copyInt_",
"addInt_",
"rightShift_",
"halve_",
"leftShift_",
"multInt_",
"divInt_",
"linComb_",
"linCombShift_",
"addShift_",
"subShift_",
"sub_",
"add_",
"mult_",
"mod_",
"multMod_",
"squareMod_",
"trim",
"powMod_",
"mont_"
],
"optimizationBailout": [
"ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./src/lib/bin_utils.ts (referenced with cjs require)"
],
"depth": 2,
"source": "'use strict';\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1<b<x)\n// boolean millerRabinInt(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is int, 1<b<x)\n// bigInt mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.\n// int modInt(x,n) //return x mod n for bigInt x and integer n.\n// bigInt mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.\n// bigInt multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.\n// boolean negative(x) //is bigInt x negative?\n// bigInt powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.\n// bigInt randBigInt(n,s) //return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.\n// void linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b\n// void linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys\n// void mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)\n// void multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.\n// void rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. (This never overflows its array).\n// void squareMod_(x,n) //do x=x*x mod n for bigInts x,n\n// void subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.\n//\n// The following functions are based on algorithms from the _Handbook of Applied Cryptography_\n// powMod_() = algorithm 14.94, Montgomery exponentiation\n// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_\n// GCD_() = algorothm 14.57, Lehmer's algorithm\n// mont_() = algorithm 14.36, Montgomery multiplication\n// divide_() = algorithm 14.20 Multiple-precision division\n// squareMod_() = algorithm 14.16 Multiple-precision squaring\n// randTruePrime_() = algorithm 4.62, Maurer's algorithm\n// millerRabin() = algorithm 4.24, Miller-Rabin algorithm\n//\n// Profiling shows:\n// randTruePrime_() spends:\n// 10% of its time in calls to powMod_()\n// 85% of its time in calls to millerRabin()\n// millerRabin() spends:\n// 99% of its time in calls to powMod_() (always with a base of 2)\n// powMod_() spends:\n// 94% of its time in calls to mont_() (almost always with x==y)\n//\n// This suggests there are several ways to speed up this library slightly:\n// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)\n// -- this should especially focus on being fast when raising 2 to a power mod n\n// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test\n// - tune the parameters in randTruePrime_(), including c, m, and recLimit\n// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking\n// within the loop when all the parameters are the same length.\n//\n// There are several ideas that look like they wouldn't help much at all:\n// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)\n// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\n//globals\nexport var bpe = 0; //bits stored per array element\n\nvar mask = 0; //AND this with an array element to chop it down to bpe bits\n\nvar radix = mask + 1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n//the digits for converting to different bases\n\nvar digitsStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'; //initialize the global variables\n//bpe=number of bits in the mantissa on this platform\n\nfor (bpe = 0; 1 << bpe + 1 > 1 << bpe; bpe++) {\n ;\n}\n\nbpe >>= 1; //bpe=number of bits in one element of the array representing the bigInt\n\nmask = (1 << bpe) - 1; //AND the mask with an integer to get its bpe least significant bits\n\nradix = mask + 1; //2^bpe. a single 1 bit to the left of the first bit of mask\n\nexport var one = int2bigInt(1, 1, 1); //constant used in powMod_()\n\nexport var zero = int2bigInt(0, 1, 1); //the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\n\nvar t = new Array(0);\nvar ss = t; //used in mult_()\n\nvar s0 = t; //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\n\nvar s3 = t; //used in powMod_()\n\nvar s4 = t,\n s5 = t; //used in mod_()\n\nvar s6 = t; //used in bigInt2str()\n\nvar s7 = t; //used in powMod_()\n\nvar T = t; //used in GCD_()\n\nvar sa = t; //used in mont_()\n\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t,\n //used in millerRabin()\neg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t,\n //used in eGCD_(), inverseMod_()\n//, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\nprimes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t,\n //used in randTruePrime_()\nrpprb = t; //used in randProbPrimeRounds() (which also uses \"primes\")\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff;\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function findPrimes(n) {\n var i, s, p, ans;\n s = new Array(n);\n\n for (i = 0; i < n; i++) {\n s[i] = 0;\n }\n\n s[0] = 2;\n p = 0; //first p elements of s are primes, the rest are a sieve\n\n for (; s[p] < n;) {\n //s[p] is the pth prime\n for (i = s[p] * s[p]; i < n; i += s[p] //mark multiples of s[p]\n ) {\n s[i] = 1;\n }\n\n p++;\n s[p] = s[p - 1] + 1;\n\n for (; s[p] < n && s[s[p]]; s[p]++) {\n ;\n } //find next prime (where s[p]==0)\n\n }\n\n ans = new Array(p);\n\n for (i = 0; i < p; i++) {\n ans[i] = s[i];\n }\n\n return ans;\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabinInt(x, b) {\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copyInt_(mr_a, b);\n return millerRabin(x, mr_a);\n}\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x and b are bigInts with b<x\n *\n * @export\n * @param {number[]} x\n * @param {number[]} b\n * @returns {(0 | 1)}\n */\n\nexport function millerRabin(x, b) {\n var i, j, k, s;\n\n if (mr_x1.length !== x.length) {\n mr_x1 = dup(x);\n mr_r = dup(x);\n mr_a = dup(x);\n }\n\n copy_(mr_a, b);\n copy_(mr_r, x);\n copy_(mr_x1, x);\n addInt_(mr_r, -1);\n addInt_(mr_x1, -1); //s=the highest power of two that divides mr_r\n\n k = 0;\n\n for (i = 0; i < mr_r.length; i++) {\n for (j = 1; j < mask; j <<= 1) {\n if (x[i] & j) {\n s = k < mr_r.length + bpe ? k : 0;\n i = mr_r.length;\n j = mask;\n } else k++;\n }\n }\n\n if (s) rightShift_(mr_r, s);\n powMod_(mr_a, mr_r, x);\n\n if (!equalsInt(mr_a, 1) && !equals(mr_a, mr_x1)) {\n j = 1; //$off\n\n while (j <= s - 1 && !equals(mr_a, mr_x1)) {\n squareMod_(mr_a, x);\n\n if (equalsInt(mr_a, 1)) {\n return 0;\n }\n\n j++;\n }\n\n if (!equals(mr_a, mr_x1)) {\n return 0;\n }\n }\n\n return 1;\n}\n/**\n * returns how many bits long the bigInt is, not counting leading zeros.\n *\n * @param {number[]} x\n * @returns {number}\n */\n\nexport function bitSize(x) {\n var j, z, w;\n\n for (j = x.length - 1; x[j] == 0 && j > 0; j--) {\n ;\n }\n\n for (z = 0, w = x[j]; w; w >>= 1, z++) {\n ;\n }\n\n z += bpe * j;\n return z;\n}\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function expand(x, n) {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0);\n copy_(ans, x);\n return ans;\n}\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randTruePrime(k) {\n var ans = int2bigInt(0, k, 0);\n randTruePrime_(ans, k);\n return trim(ans, 1);\n}\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function randProbPrime(k) {\n if (k >= 600) return randProbPrimeRounds(k, 2); //numbers from HAC table 4.3\n\n if (k >= 550) return randProbPrimeRounds(k, 4);\n if (k >= 500) return randProbPrimeRounds(k, 5);\n if (k >= 400) return randProbPrimeRounds(k, 6);\n if (k >= 350) return randProbPrimeRounds(k, 7);\n if (k >= 300) return randProbPrimeRounds(k, 9);\n if (k >= 250) return randProbPrimeRounds(k, 12); //numbers from HAC table 4.4\n\n if (k >= 200) return randProbPrimeRounds(k, 15);\n if (k >= 150) return randProbPrimeRounds(k, 18);\n if (k >= 100) return randProbPrimeRounds(k, 27);\n return randProbPrimeRounds(k, 40); //number from HAC remark 4.26 (only an estimate)\n}\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function randProbPrimeRounds(k, n) {\n var ans, i, divisible, B;\n B = 30000; //B is largest prime to use in trial division\n\n ans = int2bigInt(0, k, 0); //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans);\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n randBigInt_(ans, k, 0); //ans = a random odd number to check\n\n ans[0] |= 1;\n divisible = 0; //check ans for divisibility by small primes up to B\n\n for (i = 0; i < primes.length && primes[i] <= B; i++) {\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1;\n break;\n }\n } //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n //do n rounds of Miller Rabin, with random bases less than ans\n\n\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0);\n\n while (!greater(ans, rpprb) //pick a random rpprb that's < ans\n ) {\n randBigInt_(rpprb, k, 0);\n }\n\n if (!millerRabin(ans, rpprb)) divisible = 1;\n }\n\n if (!divisible) return ans;\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function mod(x, n) {\n var ans = dup(x);\n mod_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n\nexport function addInt(x, n) {\n var ans = expand(x, x.length + 1);\n addInt_(ans, n);\n return trim(ans, 1);\n}\n/**\n * return x*y for bigInts x and y. This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function mult(x, y) {\n var ans = expand(x, x.length + y.length);\n mult_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**y mod n) where x,y,n are bigInts and ** is exponentiation.\n *\n * 0**0=1.\n *\n * Faster for odd n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function powMod(x, y, n) {\n var ans = expand(x, n.length);\n powMod_( //this should work without the trim, but doesn't\n ans, trim(y, 2), trim(n, 2));\n return trim(ans, 1);\n}\n/**\n * return (x-y) for bigInts x and y\n *\n * Negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function sub(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n sub_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function add(x, y) {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1);\n add_(ans, y);\n return trim(ans, 1);\n}\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n\nexport function inverseMod(x, n) {\n var ans = expand(x, n.length);\n var s = inverseMod_(ans, n);\n return s ? trim(ans, 1) : null;\n}\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @returns {number[]}\n */\n\nexport function multMod(x, y, n) {\n var ans = expand(x, n.length);\n multMod_(ans, y, n);\n return trim(ans, 1);\n}\n/**\n * generate a k-bit true random prime using Maurer's algorithm, and put it into ans.\n *\n * The bigInt ans must be large enough to hold it.\n *\n * @export\n * @param {number[]} ans\n * @param {number} k\n * @return {void}\n */\n\nexport function randTruePrime_(ans, k) {\n var c, m, pm, dd, j, r, B, divisible, z, zz, recSize;\n var w;\n if (primes.length == 0) primes = findPrimes(30000); //check for divisibility by primes <=30000\n\n if (pows.length == 0) {\n pows = new Array(512);\n\n for (j = 0; j < 512; j++) {\n pows[j] = Math.pow(2, j / 511 - 1);\n }\n } //c and m should be tuned for a particular machine and value of k, to maximize speed\n\n\n c = 0.1; //c=0.1 in HAC\n\n m = 20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n\n var recLimit = 20; //stop recursion when k <=recLimit. Must have recLimit >= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans);\n s_R = dup(ans);\n s_n1 = dup(ans);\n s_r2 = dup(ans);\n s_d = dup(ans);\n s_x1 = dup(ans); //TODO Seems like a bug in eslint, reports as unused\n\n s_x2 = dup(ans);\n s_b = dup(ans);\n s_n = dup(ans);\n s_i = dup(ans);\n s_rm = dup(ans);\n s_q = dup(ans);\n s_a = dup(ans);\n s_aa = dup(ans);\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << (k + 2 >> 1)) - 1; //pm is binary number with all ones, just over sqrt(2^k)\n\n copyInt_(ans, 0);\n\n for (dd = 1; dd;) {\n dd = 0;\n ans[0] = 1 | 1 << k - 1 | Math.floor(Math.random() * (1 << k)); //random, k-bit, odd integer, with msb 1\n\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1;\n break;\n }\n }\n }\n\n carry_(ans);\n return;\n }\n\n B = c * k * k; //try small primes up to B (or all the primes[] array if the largest is less than B).\n\n if (k > 2 * m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m;) {\n r = pows[Math.floor(Math.random() * 512)];\n } //r=Math.pow(2,Math.random()-1);\n else r = 0.5; //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1;\n randTruePrime_(s_q, recSize);\n copyInt_(s_i2, 0);\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << (k - 2) % bpe; //s_i2=2^(k-2)\n\n divide_(s_i2, s_q, s_i, s_rm); //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i);\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0);\n if (greater(s_i, s_R)) break;\n } //now s_R is in the range [0,s_i-1]\n\n\n addInt_(s_R, 1); //now s_R is in the range [1,s_i]\n\n add_(s_R, s_i); //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q);\n mult_(s_n, s_R);\n multInt_(s_n, 2);\n addInt_(s_n, 1); //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R);\n multInt_(s_r2, 2); //s_r2=2*s_R\n //check s_n for divisibility by small primes up to B\n\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++) {\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1;\n break;\n }\n }\n\n if (!divisible) if (!millerRabinInt(s_n, 2)) //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1;\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3);\n\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--) {\n ;\n } //strip leading zeros\n\n\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++) {\n ;\n }\n\n zz += bpe * j; //zz=number of bits in s_n, ignoring leading zeros\n\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0);\n if (greater(s_n, s_a)) break;\n } //now s_a is in the range [0,s_n-1]\n\n\n addInt_(s_n, 3); //now s_a is in the range [0,s_n-4]\n\n addInt_(s_a, 2); //now s_a is in the range [2,s_n-2]\n\n copy_(s_b, s_a);\n copy_(s_n1, s_n);\n addInt_(s_n1, -1);\n powMod_(s_b, s_n1, s_n); //s_b=s_a^(s_n-1) modulo s_n\n\n addInt_(s_b, -1);\n\n if (isZero(s_b)) {\n copy_(s_b, s_a);\n powMod_(s_b, s_r2, s_n);\n addInt_(s_b, -1);\n copy_(s_aa, s_n);\n copy_(s_d, s_b);\n GCD_(s_d, s_n); //if s_b and s_n are relatively prime, then s_n is a prime\n\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa);\n return; //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n}\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n\nexport function randBigInt(n, s) {\n var a, b;\n a = Math.floor((n - 1) / bpe) + 2; //# array elements to hold the BigInt with a leading 0 element\n\n b = int2bigInt(0, 0, a);\n randBigInt_(b, n, s);\n return b;\n}\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n\nexport function randBigInt_(b, n, s) {\n var i, a;\n\n for (i = 0; i < b.length; i++) {\n b[i] = 0;\n }\n\n a = Math.floor((n - 1) / bpe) + 1; //# array elements to hold the BigInt\n\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << bpe - 1));\n }\n\n b[a - 1] &= (2 << (n - 1) % bpe) - 1;\n if (s == 1) b[a - 1] |= 1 << (n - 1) % bpe;\n}\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\n\nexport function GCD(x, y) {\n var xc, yc;\n xc = dup(x);\n yc = dup(y);\n GCD_(xc, yc);\n return xc;\n}\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\n\nexport function GCD_(x, y) {\n var i, xp, yp, A, B, C, D, q, sing;\n var qp;\n if (T.length !== x.length) T = dup(x);\n sing = 1;\n\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0;\n\n for (i = 1; i < y.length; i++ //check if y has nonzero elements other than 0\n ) {\n if (y[i]) {\n sing = 1;\n break;\n }\n }\n\n if (!sing) break; //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--) {\n ;\n } //find most significant element of x\n\n\n xp = x[i];\n yp = y[i];\n A = 1;\n B = 0;\n C = 0;\n D = 1;\n\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C));\n qp = Math.floor((xp + B) / (yp + D));\n if (q != qp) break;\n t = A - q * C;\n A = C;\n C = t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n\n t = B - q * D;\n B = D;\n D = t;\n t = xp - q * yp;\n xp = yp;\n yp = t;\n }\n\n if (B) {\n copy_(T, x);\n linComb_(x, y, A, B); //x=A*x+B*y\n\n linComb_(y, T, D, C); //y=D*y+C*T\n } else {\n mod_(x, y);\n copy_(T, x);\n copy_(x, y);\n copy_(y, T);\n }\n }\n\n if (y[0] === 0) return;\n t = modInt(x, y[0]);\n copyInt_(x, y[0]);\n y[0] = t;\n\n while (y[0]) {\n x[0] %= y[0];\n t = x[0];\n x[0] = y[0];\n y[0] = t;\n }\n}\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n\nexport function inverseMod_(x, n) {\n var k = 1 + 2 * Math.max(x.length, n.length);\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0);\n return 0;\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_v = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n copy_(eg_u, x);\n copy_(eg_v, n);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, n);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, n);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C) //make sure answer is nonnegative\n ) {\n add_(eg_C, n);\n }\n\n copy_(x, eg_C);\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0);\n return 0;\n }\n\n return 1;\n }\n }\n /*::\n declare var never: empty\n return never\n */\n\n}\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function inverseModInt(x, n) {\n var a = 1,\n b = 0,\n t;\n\n for (;;) {\n if (x === 1) return a;\n if (x === 0) return 0;\n b -= a * Math.floor(n / x); //$off\n\n n %= x;\n if (n === 1) return b; //to avoid negatives, change this b to n-b, and each -= to +=\n\n if (n === 0) return 0;\n a -= b * Math.floor(x / n); //$off\n\n x %= n;\n }\n /*::\n declare var never: empty\n return never\n */\n\n} //this deprecated function is for backward compatibility only.\n\nfunction inverseModInt_(x, n) {\n return inverseModInt(x, n);\n}\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\n\n\nexport function eGCD_(x, y, v, a, b) {\n var g = 0;\n var k = Math.max(x.length, y.length);\n\n if (eg_u.length != k) {\n eg_u = new Array(k);\n eg_A = new Array(k);\n eg_B = new Array(k);\n eg_C = new Array(k);\n eg_D = new Array(k);\n }\n\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x);\n halve_(y);\n g++;\n }\n\n copy_(eg_u, x);\n copy_(v, y);\n copyInt_(eg_A, 1);\n copyInt_(eg_B, 0);\n copyInt_(eg_C, 0);\n copyInt_(eg_D, 1);\n\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u);\n\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A);\n halve_(eg_B);\n } else {\n add_(eg_A, y);\n halve_(eg_A);\n sub_(eg_B, x);\n halve_(eg_B);\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v);\n\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C);\n halve_(eg_D);\n } else {\n add_(eg_C, y);\n halve_(eg_C);\n sub_(eg_D, x);\n halve_(eg_D);\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v);\n sub_(eg_A, eg_C);\n sub_(eg_B, eg_D);\n } else {\n //v>u\n sub_(v, eg_u);\n sub_(eg_C, eg_A);\n sub_(eg_D, eg_B);\n }\n\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y);\n sub_(eg_D, x);\n }\n\n multInt_(eg_D, -1); ///make sure b (D) is nonnegative\n\n copy_(a, eg_C);\n copy_(b, eg_D);\n leftShift_(v, g);\n return;\n }\n }\n}\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function negative(x) {\n //TODO Flow Bool type inference\n return x[x.length - 1] >> bpe - 1 & 1;\n}\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\n\nexport function greaterShift(x, y, shift) {\n var i,\n kx = x.length,\n ky = y.length;\n k = kx + shift < ky ? kx + shift : ky;\n\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) {\n if (x[i] > 0) return 1;\n } //if there are nonzeros in x to the left of the first column of y, then x is bigger\n\n\n for (i = kx - 1 + shift; i < ky; i++) {\n if (y[i] > 0) return 0;\n } //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n\n\n for (i = k - 1; i >= shift; i--) {\n if (x[i - shift] > y[i]) return 1;else if (x[i - shift] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function greater(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = x.length; i < y.length; i++) {\n if (y[i]) return 0;\n } //y has more digits\n\n\n for (i = y.length; i < x.length; i++) {\n if (x[i]) return 1;\n } //x has more digits\n\n\n for (i = k - 1; i >= 0; i--) {\n if (x[i] > y[i]) return 1;else if (x[i] < y[i]) return 0;\n }\n\n return 0;\n}\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\n\nexport function divide_(x, y, q, r) {\n var kx, ky;\n var i, j, y1, y2, c, a, b;\n copy_(r, x);\n\n for (ky = y.length; y[ky - 1] === 0; ky--) {\n ;\n } //ky is number of elements in y, not including leading zeros\n //normalize: ensure the most significant element of y has its highest bit set\n\n\n b = y[ky - 1];\n\n for (a = 0; b; a++) {\n b >>= 1;\n }\n\n a = bpe - a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n\n leftShift_(y, a); //multiply both by 1<<a now, then divide both by that at the end\n\n leftShift_(r, a); //Rob Visser discovered a bug: the following line was originally just before the normalization.\n\n for (kx = r.length; r[kx - 1] === 0 && kx > ky; kx--) {\n ;\n } //kx is number of elements in normalized x, not including leading zeros\n\n\n copyInt_(q, 0); // q=0\n\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky); // r=r-leftShift_(y,kx-ky)\n\n q[kx - ky]++; // q[kx-ky]++;\n } // }\n\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask;else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1]); //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky];\n c = y2 >> bpe;\n y2 = y2 & mask;\n y1 = c + q[i - ky] * y[ky - 1];\n c = y1 >> bpe;\n y1 = y1 & mask;\n if (c == r[i] ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1] : c > r[i]) q[i - ky]--;else break;\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky); //r=r-q[i-ky]*leftShift_(y,i-ky)\n\n if (negative(r)) {\n addShift_(r, y, i - ky); //r=r+leftShift_(y,i-ky)\n\n q[i - ky]--;\n }\n }\n\n rightShift_(y, a); //undo the normalization step\n\n rightShift_(r, a); //undo the normalization step\n}\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\n\nexport function carry_(x) {\n var i, k, c, b;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\n\nexport function modInt(x, n) {\n var i,\n c = 0;\n\n for (i = x.length - 1; i >= 0; i--) {\n c = (c * radix + x[i]) % n;\n }\n\n return c;\n}\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\n\nexport function int2bigInt(t, bits, minSize) {\n var i, k;\n k = Math.ceil(bits / bpe) + 1;\n k = minSize > k ? minSize : k;\n var buff = new Array(k);\n copyInt_(buff, t);\n return buff;\n}\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\n\nexport function str2bigInt(s, base, minSize) {\n var d, i, x, y, kk;\n var k = s.length;\n\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0);\n\n for (;;) {\n y = new Array(x.length + 1);\n\n for (i = 0; i < x.length; i++) {\n y[i + 1] = x[i];\n }\n\n y[0] = parseInt(s, 10); //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n\n x = y;\n d = s.indexOf(',', 0);\n if (d < 1) break; //$off\n\n s = s.substring(d + 1);\n if (s.length == 0) break;\n } //$off\n\n\n if (x.length < minSize) {\n //$off\n y = new Array(minSize);\n copy_(y, x);\n return y;\n }\n\n return x;\n }\n\n x = int2bigInt(0, base * k, 0);\n\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0);\n if (base <= 36 && d >= 36) //convert lowercase to uppercase if base<=36\n d -= 26;\n\n if (d >= base || d < 0) {\n //stop at first illegal character\n break;\n }\n\n multInt_(x, base);\n addInt_(x, d);\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--) {\n ;\n } //strip off leading zeros\n //$off\n\n\n k = minSize > k + 1 ? minSize : k + 1; //$off\n\n y = new Array(k); //$off\n\n kk = k < x.length ? k : x.length; //$off\n\n for (i = 0; i < kk; i++) {\n y[i] = x[i];\n } //$off\n\n\n for (; i < k; i++) {\n y[i] = 0;\n }\n\n return y;\n} //return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i<x.length;i++)\n// y[i+1]=x[i];\n// y[0]=parseInt(s,10);\n// x=y;\n// d=s.indexOf(',',0);\n// if (d<1)\n// break;\n// s=s.substring(d+1);\n// if (s.length==0)\n// break;\n// }\n// if (x.length<minSize) {\n// y=new Array(minSize);\n// copy_(y,x);\n// return y;\n// }\n// return x;\n// }\n// x=int2bigInt(0,base*k,0);\n// for (i=0;i<k;i++) {\n// d=str.indexOf(s.substring(i,i+1),0);\n// if (base<=36 && d>=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k<x.length ? k : x.length;\n// for (i=0;i<kk;i++)\n// y[i]=x[i];\n// for (;i<k;i++)\n// y[i]=0;\n// return y;\n// }\n\n/**\n * is bigint x equal to integer y?\n *\n * y must have less than bpe bits\n *\n * @export\n * @param {number[]} x\n * @param {number} y\n * @returns {(1 | 0)}\n */\n\nexport function equalsInt(x, y) {\n var i;\n if (x[0] != y) return 0;\n\n for (i = 1; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * are bigints x and y equal?\n *\n * this works even if x and y are different lengths and have arbitrarily many leading zeros\n *\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\n\nexport function equals(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n if (x[i] !== y[i]) return 0;\n }\n\n if (x.length > y.length) {\n for (; i < x.length; i++) {\n if (x[i]) return 0;\n }\n } else {\n for (; i < y.length; i++) {\n if (y[i]) return 0;\n }\n }\n\n return 1;\n}\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\n\nexport function isZero(x) {\n var i;\n\n for (i = 0; i < x.length; i++) {\n if (x[i]) return 0;\n }\n\n return 1;\n}\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\n\nexport function bigInt2str(x, base) {\n var i,\n t,\n s = '';\n if (s6.length !== x.length) s6 = dup(x);else copy_(s6, x);\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) {\n s += x[i] + ',';\n }\n\n s += x[0];\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base); //t=s6 % base; s6=floor(s6/base);\n\n s = digitsStr.substring(t, t + 1) + s;\n }\n }\n\n if (s.length === 0) s = '0';\n return s;\n}\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\n\nexport function dup(x) {\n var i;\n buff = Array(x.length);\n copy_(buff, x);\n return buff;\n}\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\n\nexport function copy_(x, y) {\n var i;\n var k = x.length < y.length ? x.length : y.length;\n\n for (i = 0; i < k; i++) {\n x[i] = y[i];\n }\n\n for (i = k; i < x.length; i++) {\n x[i] = 0;\n }\n}\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function copyInt_(x, n) {\n var i, c;\n var len = x.length; //TODO .length in for loop have perfomance costs. Bench this\n\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function addInt_(x, n) {\n var i, k, c, b;\n x[0] += n;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i];\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n if (!c) return; //stop carrying as soon as the carry is zero\n }\n}\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\n\nexport function rightShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = 0; i < x.length - k; i++ //right shift x by k elements\n ) {\n x[i] = x[i + k];\n }\n\n for (; i < x.length; i++) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - n | x[i] >> n);\n }\n\n x[i] >>= n;\n}\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\n\nexport function halve_(x) {\n var i;\n\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & (x[i + 1] << bpe - 1 | x[i] >> 1);\n }\n\n x[i] = x[i] >> 1 | x[i] & radix >> 1; //most significant bit stays the same\n}\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function leftShift_(x, n) {\n var i;\n var k = Math.floor(n / bpe);\n\n if (k) {\n for (i = x.length; i >= k; i-- //left shift x by k elements\n ) {\n x[i] = x[i - k];\n }\n\n for (; i >= 0; i--) {\n x[i] = 0;\n } //$off\n\n\n n %= bpe;\n }\n\n if (!n) return;\n\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & (x[i] << n | x[i - 1] >> bpe - n);\n }\n\n x[i] = mask & x[i] << n;\n}\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\n\nexport function multInt_(x, n) {\n var i, k, c, b;\n if (!n) return;\n k = x.length;\n c = 0;\n\n for (i = 0; i < k; i++) {\n c += x[i] * n;\n b = 0;\n\n if (c < 0) {\n b = -(c >> bpe);\n c += b * radix;\n }\n\n x[i] = c & mask;\n c = (c >> bpe) - b;\n }\n}\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\n\nexport function divInt_(x, n) {\n var i,\n r = 0,\n s;\n\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i];\n x[i] = Math.floor(s / n);\n r = s % n;\n }\n\n return r;\n}\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\n\nexport function linComb_(x, y, a, b) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n kk = x.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; i < kk; i++) {\n c += a * x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\n\nexport function linCombShift_(x, y, b, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function addShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\n\nexport function subShift_(x, y, ys) {\n var i, c, k, kk;\n k = x.length < ys + y.length ? x.length : ys + y.length;\n kk = x.length;\n\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < kk; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function sub_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function add_(x, y) {\n var i, c, k, kk;\n k = x.length < y.length ? x.length : y.length;\n\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n\n for (i = k; c && i < x.length; i++) {\n c += x[i];\n x[i] = c & mask;\n c >>= bpe;\n }\n}\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y<x.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\n\nexport function mult_(x, y) {\n var i;\n if (ss.length != 2 * x.length) ss = new Array(2 * x.length);\n copyInt_(ss, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(ss, x, y[i], i);\n } //ss=1*ss+y[i]*(x<<(i*bpe))\n\n\n copy_(x, ss);\n}\n/**\n * do x=x mod n for bigInts x and n\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function mod_(x, n) {\n if (s4.length !== x.length) s4 = dup(x);else copy_(s4, x);\n if (s5.length !== x.length) s5 = dup(x);\n divide_(s4, n, s5, x); //x = remainder of s4 / n\n}\n/**\n * do x=x*y mod n for bigInts x,y,n.\n *\n * for greater speed, let y<x.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function multMod_(x, y, n) {\n var i;\n if (s0.length != 2 * x.length) s0 = new Array(2 * x.length);\n copyInt_(s0, 0);\n\n for (i = 0; i < y.length; i++) {\n if (y[i]) linCombShift_(s0, x, y[i], i);\n } //s0=1*s0+y[i]*(x<<(i*bpe))\n\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * do x=x*x mod n for bigInts x,n.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @return {void}\n */\n\nexport function squareMod_(x, n) {\n var i, j, d, c, kx, kn, k;\n\n for (kx = x.length; kx > 0 && !x[kx - 1]; kx--) {\n ;\n } //ignore leading zeros in x\n\n\n k = kx > n.length ? 2 * kx : 2 * n.length; //k=# elements in the product, which is twice the elements in the larger of x and n\n\n if (s0.length != k) s0 = new Array(k);\n copyInt_(s0, 0);\n\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i];\n s0[2 * i] = c & mask;\n c >>= bpe;\n\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c;\n s0[i + j] = c & mask;\n c >>= bpe;\n }\n\n s0[i + kx] = c;\n }\n\n mod_(s0, n);\n copy_(x, s0);\n}\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\n\nexport function trim(x, k) {\n var i, y;\n\n for (i = x.length; i > 0 && !x[i - 1]; i--) {\n ;\n }\n\n y = new Array(i + k);\n copy_(y, x);\n return y;\n}\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\n\nexport function powMod_(x, y, n) {\n var k1, k2, kn, np;\n if (s7.length != n.length) s7 = dup(n); //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n\n if ((n[0] & 1) == 0) {\n copy_(s7, x);\n copyInt_(x, 1);\n\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n);\n divInt_(y, 2);\n squareMod_(s7, n);\n }\n\n return;\n } //calculate np from n for the Montgomery multiplications\n\n\n copyInt_(s7, 0);\n\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--) {\n ;\n }\n\n np = radix - inverseModInt(modInt(n, radix), radix);\n s7[kn] = 1;\n multMod_(x, s7, n); // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x);else copy_(s3, x); //$off\n\n for (k1 = y.length - 1; k1 > 0 & !y[k1]; k1--) {\n ;\n } //k1=first nonzero element of y\n\n\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1);\n return;\n }\n\n for (k2 = 1 << bpe - 1; k2 && !(y[k1] & k2); k2 >>= 1) {\n ;\n } //k2=position of first 1 bit in y[k1]\n\n\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--;\n\n if (k1 < 0) {\n mont_(x, one, n, np);\n return;\n }\n\n k2 = 1 << bpe - 1;\n }\n\n mont_(x, x, n, np);\n if (k2 & y[k1]) //if next bit is a 1\n mont_(x, s3, n, np);\n }\n}\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\n\nexport function mont_(x, y, n, np) {\n var i, j, c, ui, t, ks;\n var kn = n.length;\n var ky = y.length;\n if (sa.length != kn) sa = new Array(kn);\n copyInt_(sa, 0);\n\n for (; kn > 0 && n[kn - 1] == 0; kn--) {\n ;\n } //ignore leading zeros of n\n\n\n for (; ky > 0 && y[ky - 1] == 0; ky--) {\n ;\n } //ignore leading zeros of y\n\n\n ks = sa.length - 1; //sa will never have more than this many nonzero elements.\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0];\n ui = (t & mask) * np & mask; //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n\n c = t + ui * n[0] >> bpe;\n t = x[i]; //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n\n j = 1;\n\n for (; j < ky - 4;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ky;) {\n c += sa[j] + ui * n[j] + t * y[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn - 4;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < kn;) {\n c += sa[j] + ui * n[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n for (; j < ks;) {\n c += sa[j];\n sa[j - 1] = c & mask;\n c >>= bpe;\n j++;\n }\n\n sa[j - 1] = c & mask;\n }\n\n if (!greater(n, sa)) sub_(sa, n);\n copy_(x, sa);\n}\n//# sourceMappingURL=index.js.map"
},
{
"id": 5,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/pako/dist/pako_inflate.min.js",
"name": "./node_modules/pako/dist/pako_inflate.min.js",
"index": 5,
"index2": 3,
"size": 22682,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "pako/dist/pako_inflate.min.js",
"loc": "62:44-84"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{(\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).pako=e()}}(function(){return function r(o,s,f){function l(t,e){if(!s[t]){if(!o[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(d)return d(t,!0);var n=new Error(\"Cannot find module '\"+t+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var a=s[t]={exports:{}};o[t][0].call(a.exports,function(e){return l(o[t][1][e]||e)},a,a.exports,r,o,s,f)}return s[t].exports}for(var d=\"function\"==typeof require&&require,e=0;e<f.length;e++)l(f[e]);return l}({1:[function(e,t,i){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;i.assign=function(e){for(var t,i,n=Array.prototype.slice.call(arguments,1);n.length;){var a=n.shift();if(a){if(\"object\"!=typeof a)throw new TypeError(a+\"must be non-object\");for(var r in a)t=a,i=r,Object.prototype.hasOwnProperty.call(t,i)&&(e[r]=a[r])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,i,n,a){if(t.subarray&&e.subarray)e.set(t.subarray(i,i+n),a);else for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){var t,i,n,a,r,o;for(t=n=0,i=e.length;t<i;t++)n+=e[t].length;for(o=new Uint8Array(n),t=a=0,i=e.length;t<i;t++)r=e[t],o.set(r,a),a+=r.length;return o}},r={arraySet:function(e,t,i,n,a){for(var r=0;r<n;r++)e[a+r]=t[i+r]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,a)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,r))},i.setTyped(n)},{}],2:[function(e,t,i){\"use strict\";var f=e(\"./common\"),a=!0,r=!0;try{String.fromCharCode.apply(null,[0])}catch(e){a=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){r=!1}for(var l=new f.Buf8(256),n=0;n<256;n++)l[n]=252<=n?6:248<=n?5:240<=n?4:224<=n?3:192<=n?2:1;function d(e,t){if(t<65534&&(e.subarray&&r||!e.subarray&&a))return String.fromCharCode.apply(null,f.shrinkBuf(e,t));for(var i=\"\",n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i}l[254]=l[254]=1,i.string2buf=function(e){var t,i,n,a,r,o=e.length,s=0;for(a=0;a<o;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),s+=i<128?1:i<2048?2:i<65536?3:4;for(t=new f.Buf8(s),a=r=0;r<s;a++)55296==(64512&(i=e.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=e.charCodeAt(a+1)))&&(i=65536+(i-55296<<10)+(n-56320),a++),i<128?t[r++]=i:(i<2048?t[r++]=192|i>>>6:(i<65536?t[r++]=224|i>>>12:(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63),t[r++]=128|i>>>6&63),t[r++]=128|63&i);return t},i.buf2binstring=function(e){return d(e,e.length)},i.binstring2buf=function(e){for(var t=new f.Buf8(e.length),i=0,n=t.length;i<n;i++)t[i]=e.charCodeAt(i);return t},i.buf2string=function(e,t){var i,n,a,r,o=t||e.length,s=new Array(2*o);for(i=n=0;i<o;)if((a=e[i++])<128)s[n++]=a;else if(4<(r=l[a]))s[n++]=65533,i+=r-1;else{for(a&=2===r?31:3===r?15:7;1<r&&i<o;)a=a<<6|63&e[i++],r--;1<r?s[n++]=65533:a<65536?s[n++]=a:(a-=65536,s[n++]=55296|a>>10&1023,s[n++]=56320|1023&a)}return d(s,n)},i.utf8border=function(e,t){var i;for((t=t||e.length)>e.length&&(t=e.length),i=t-1;0<=i&&128==(192&e[i]);)i--;return i<0?t:0===i?t:i+l[e[i]]>t?i:t}},{\"./common\":1}],3:[function(e,t,i){\"use strict\";t.exports=function(e,t,i,n){for(var a=65535&e|0,r=e>>>16&65535|0,o=0;0!==i;){for(i-=o=2e3<i?2e3:i;r=r+(a=a+t[n++]|0)|0,--o;);a%=65521,r%=65521}return a|r<<16|0}},{}],4:[function(e,t,i){\"use strict\";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],5:[function(e,t,i){\"use strict\";var s=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}();t.exports=function(e,t,i,n){var a=s,r=n+i;e^=-1;for(var o=n;o<r;o++)e=e>>>8^a[255&(e^t[o])];return-1^e}},{}],6:[function(e,t,i){\"use strict\";t.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],7:[function(e,t,i){\"use strict\";t.exports=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z;i=e.state,n=e.next_in,E=e.input,a=n+(e.avail_in-5),r=e.next_out,Z=e.output,o=r-(t-e.avail_out),s=r+(e.avail_out-257),f=i.dmax,l=i.wsize,d=i.whave,c=i.wnext,u=i.window,h=i.hold,b=i.bits,m=i.lencode,w=i.distcode,k=(1<<i.lenbits)-1,_=(1<<i.distbits)-1;e:do{b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=m[h&k];t:for(;;){if(h>>>=v=g>>>24,b-=v,0===(v=g>>>16&255))Z[r++]=65535&g;else{if(!(16&v)){if(0==(64&v)){g=m[(65535&g)+(h&(1<<v)-1)];continue t}if(32&v){i.mode=12;break e}e.msg=\"invalid literal/length code\",i.mode=30;break e}p=65535&g,(v&=15)&&(b<v&&(h+=E[n++]<<b,b+=8),p+=h&(1<<v)-1,h>>>=v,b-=v),b<15&&(h+=E[n++]<<b,b+=8,h+=E[n++]<<b,b+=8),g=w[h&_];i:for(;;){if(h>>>=v=g>>>24,b-=v,!(16&(v=g>>>16&255))){if(0==(64&v)){g=w[(65535&g)+(h&(1<<v)-1)];continue i}e.msg=\"invalid distance code\",i.mode=30;break e}if(x=65535&g,b<(v&=15)&&(h+=E[n++]<<b,(b+=8)<v&&(h+=E[n++]<<b,b+=8)),f<(x+=h&(1<<v)-1)){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(h>>>=v,b-=v,(v=r-o)<x){if(d<(v=x-v)&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break e}if(S=u,(y=0)===c){if(y+=l-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}}else if(c<v){if(y+=l+c-v,(v-=c)<p){for(p-=v;Z[r++]=u[y++],--v;);if(y=0,c<p){for(p-=v=c;Z[r++]=u[y++],--v;);y=r-x,S=Z}}}else if(y+=c-v,v<p){for(p-=v;Z[r++]=u[y++],--v;);y=r-x,S=Z}for(;2<p;)Z[r++]=S[y++],Z[r++]=S[y++],Z[r++]=S[y++],p-=3;p&&(Z[r++]=S[y++],1<p&&(Z[r++]=S[y++]))}else{for(y=r-x;Z[r++]=Z[y++],Z[r++]=Z[y++],Z[r++]=Z[y++],2<(p-=3););p&&(Z[r++]=Z[y++],1<p&&(Z[r++]=Z[y++]))}break}}break}}while(n<a&&r<s);n-=p=b>>3,h&=(1<<(b-=p<<3))-1,e.next_in=n,e.next_out=r,e.avail_in=n<a?a-n+5:5-(n-a),e.avail_out=r<s?s-r+257:257-(r-s),i.hold=h,i.bits=b}},{}],8:[function(e,t,i){\"use strict\";var z=e(\"../utils/common\"),R=e(\"./adler32\"),N=e(\"./crc32\"),O=e(\"./inffast\"),C=e(\"./inftrees\"),I=1,D=2,T=0,U=-2,F=1,n=852,a=592;function L(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function r(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new z.Buf16(320),this.work=new z.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=F,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new z.Buf32(n),t.distcode=t.distdyn=new z.Buf32(a),t.sane=1,t.back=-1,T):U}function s(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,o(e)):U}function f(e,t){var i,n;return e&&e.state?(n=e.state,t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15<t)?U:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,s(e))):U}function l(e,t){var i,n;return e?(n=new r,(e.state=n).window=null,(i=f(e,t))!==T&&(e.state=null),i):U}var d,c,u=!0;function H(e){if(u){var t;for(d=new z.Buf32(512),c=new z.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(C(I,e.lens,0,288,d,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;C(D,e.lens,0,32,c,0,e.work,{bits:5}),u=!1}e.lencode=d,e.lenbits=9,e.distcode=c,e.distbits=5}function j(e,t,i,n){var a,r=e.state;return null===r.window&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new z.Buf8(r.wsize)),n>=r.wsize?(z.arraySet(r.window,t,i-r.wsize,r.wsize,0),r.wnext=0,r.whave=r.wsize):(n<(a=r.wsize-r.wnext)&&(a=n),z.arraySet(r.window,t,i-n,a,r.wnext),(n-=a)?(z.arraySet(r.window,t,i-n,n,0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0}i.inflateReset=s,i.inflateReset2=f,i.inflateResetKeep=o,i.inflateInit=function(e){return l(e,15)},i.inflateInit2=l,i.inflate=function(e,t){var i,n,a,r,o,s,f,l,d,c,u,h,b,m,w,k,_,g,v,p,x,y,S,E,Z=0,B=new z.Buf8(4),A=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return U;12===(i=e.state).mode&&(i.mode=13),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,c=s,u=f,y=T;e:for(;;)switch(i.mode){case F:if(0===i.wrap){i.mode=13;break}for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(2&i.wrap&&35615===l){B[i.check=0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0),d=l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&l)<<8)+(l>>8))%31){e.msg=\"incorrect header check\",i.mode=30;break}if(8!=(15&l)){e.msg=\"unknown compression method\",i.mode=30;break}if(d-=4,x=8+(15&(l>>>=4)),0===i.wbits)i.wbits=x;else if(x>i.wbits){e.msg=\"invalid window size\",i.mode=30;break}i.dmax=1<<x,e.adler=i.check=1,i.mode=512&l?10:12,d=l=0;break;case 2:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.flags=l,8!=(255&i.flags)){e.msg=\"unknown compression method\",i.mode=30;break}if(57344&i.flags){e.msg=\"unknown header flags set\",i.mode=30;break}i.head&&(i.head.text=l>>8&1),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=3;case 3:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.time=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,B[2]=l>>>16&255,B[3]=l>>>24&255,i.check=N(i.check,B,4,0)),d=l=0,i.mode=4;case 4:for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.head&&(i.head.xflags=255&l,i.head.os=l>>8),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0,i.mode=5;case 5:if(1024&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length=l,i.head&&(i.head.extra_len=l),512&i.flags&&(B[0]=255&l,B[1]=l>>>8&255,i.check=N(i.check,B,2,0)),d=l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(s<(h=i.length)&&(h=s),h&&(i.head&&(x=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Array(i.head.extra_len)),z.arraySet(i.head.extra,n,r,h,x)),512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,i.length-=h),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.name+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===s)break e;for(h=0;x=n[r+h++],i.head&&x&&i.length<65536&&(i.head.comment+=String.fromCharCode(x)),x&&h<s;);if(512&i.flags&&(i.check=N(i.check,n,h,r)),s-=h,r+=h,x)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;d<16;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(65535&i.check)){e.msg=\"header crc mismatch\",i.mode=30;break}d=l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=12;break;case 10:for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}e.adler=i.check=L(l),d=l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,2;e.adler=i.check=1,i.mode=12;case 12:if(5===t||6===t)break e;case 13:if(i.last){l>>>=7&d,d-=7&d,i.mode=27;break}for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}switch(i.last=1&l,d-=1,3&(l>>>=1)){case 0:i.mode=14;break;case 1:if(H(i),i.mode=20,6!==t)break;l>>>=2,d-=2;break e;case 2:i.mode=17;break;case 3:e.msg=\"invalid block type\",i.mode=30}l>>>=2,d-=2;break;case 14:for(l>>>=7&d,d-=7&d;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if((65535&l)!=(l>>>16^65535)){e.msg=\"invalid stored block lengths\",i.mode=30;break}if(i.length=65535&l,d=l=0,i.mode=15,6===t)break e;case 15:i.mode=16;case 16:if(h=i.length){if(s<h&&(h=s),f<h&&(h=f),0===h)break e;z.arraySet(a,n,r,h,o),s-=h,r+=h,f-=h,o+=h,i.length-=h;break}i.mode=12;break;case 17:for(;d<14;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(i.nlen=257+(31&l),l>>>=5,d-=5,i.ndist=1+(31&l),l>>>=5,d-=5,i.ncode=4+(15&l),l>>>=4,d-=4,286<i.nlen||30<i.ndist){e.msg=\"too many length or distance symbols\",i.mode=30;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;d<3;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.lens[A[i.have++]]=7&l,l>>>=3,d-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,S={bits:i.lenbits},y=C(0,i.lens,0,19,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid code lengths set\",i.mode=30;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(_<16)l>>>=w,d-=w,i.lens[i.have++]=_;else{if(16===_){for(E=w+2;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l>>>=w,d-=w,0===i.have){e.msg=\"invalid bit length repeat\",i.mode=30;break}x=i.lens[i.have-1],h=3+(3&l),l>>>=2,d-=2}else if(17===_){for(E=w+3;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=3+(7&(l>>>=w)),l>>>=3,d-=3}else{for(E=w+7;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}d-=w,x=0,h=11+(127&(l>>>=w)),l>>>=7,d-=7}if(i.have+h>i.nlen+i.ndist){e.msg=\"invalid bit length repeat\",i.mode=30;break}for(;h--;)i.lens[i.have++]=x}}if(30===i.mode)break;if(0===i.lens[256]){e.msg=\"invalid code -- missing end-of-block\",i.mode=30;break}if(i.lenbits=9,S={bits:i.lenbits},y=C(I,i.lens,0,i.nlen,i.lencode,0,i.work,S),i.lenbits=S.bits,y){e.msg=\"invalid literal/lengths set\",i.mode=30;break}if(i.distbits=6,i.distcode=i.distdyn,S={bits:i.distbits},y=C(D,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,S),i.distbits=S.bits,y){e.msg=\"invalid distances set\",i.mode=30;break}if(i.mode=20,6===t)break e;case 20:i.mode=21;case 21:if(6<=s&&258<=f){e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,O(e,u),o=e.next_out,a=e.output,f=e.avail_out,r=e.next_in,n=e.input,s=e.avail_in,l=i.hold,d=i.bits,12===i.mode&&(i.back=-1);break}for(i.back=0;k=(Z=i.lencode[l&(1<<i.lenbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(k&&0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.lencode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,i.length=_,0===k){i.mode=26;break}if(32&k){i.back=-1,i.mode=12;break}if(64&k){e.msg=\"invalid literal/length code\",i.mode=30;break}i.extra=15&k,i.mode=22;case 22:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.length+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;k=(Z=i.distcode[l&(1<<i.distbits)-1])>>>16&255,_=65535&Z,!((w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(0==(240&k)){for(g=w,v=k,p=_;k=(Z=i.distcode[p+((l&(1<<g+v)-1)>>g)])>>>16&255,_=65535&Z,!(g+(w=Z>>>24)<=d);){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}l>>>=g,d-=g,i.back+=g}if(l>>>=w,d-=w,i.back+=w,64&k){e.msg=\"invalid distance code\",i.mode=30;break}i.offset=_,i.extra=15&k,i.mode=24;case 24:if(i.extra){for(E=i.extra;d<E;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}i.offset+=l&(1<<i.extra)-1,l>>>=i.extra,d-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg=\"invalid distance too far back\",i.mode=30;break}i.mode=25;case 25:if(0===f)break e;if(h=u-f,i.offset>h){if((h=i.offset-h)>i.whave&&i.sane){e.msg=\"invalid distance too far back\",i.mode=30;break}h>i.wnext?(h-=i.wnext,b=i.wsize-h):b=i.wnext-h,h>i.length&&(h=i.length),m=i.window}else m=a,b=o-i.offset,h=i.length;for(f<h&&(h=f),f-=h,i.length-=h;a[o++]=m[b++],--h;);0===i.length&&(i.mode=21);break;case 26:if(0===f)break e;a[o++]=i.length,f--,i.mode=21;break;case 27:if(i.wrap){for(;d<32;){if(0===s)break e;s--,l|=n[r++]<<d,d+=8}if(u-=f,e.total_out+=u,i.total+=u,u&&(e.adler=i.check=i.flags?N(i.check,a,u,o-u):R(i.check,a,u,o-u)),u=f,(i.flags?l:L(l))!==i.check){e.msg=\"incorrect data check\",i.mode=30;break}d=l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;d<32;){if(0===s)break e;s--,l+=n[r++]<<d,d+=8}if(l!==(4294967295&i.total)){e.msg=\"incorrect length check\",i.mode=30;break}d=l=0}i.mode=29;case 29:y=1;break e;case 30:y=-3;break e;case 31:return-4;case 32:default:return U}return e.next_out=o,e.avail_out=f,e.next_in=r,e.avail_in=s,i.hold=l,i.bits=d,(i.wsize||u!==e.avail_out&&i.mode<30&&(i.mode<27||4!==t))&&j(e,e.output,e.next_out,u-e.avail_out)?(i.mode=31,-4):(c-=e.avail_in,u-=e.avail_out,e.total_in+=c,e.total_out+=u,i.total+=u,i.wrap&&u&&(e.adler=i.check=i.flags?N(i.check,a,u,e.next_out-u):R(i.check,a,u,e.next_out-u)),e.data_type=i.bits+(i.last?64:0)+(12===i.mode?128:0)+(20===i.mode||15===i.mode?256:0),(0===c&&0===u||4===t)&&y===T&&(y=-5),y)},i.inflateEnd=function(e){if(!e||!e.state)return U;var t=e.state;return t.window&&(t.window=null),e.state=null,T},i.inflateGetHeader=function(e,t){var i;return e&&e.state?0==(2&(i=e.state).wrap)?U:((i.head=t).done=!1,T):U},i.inflateSetDictionary=function(e,t){var i,n=t.length;return e&&e.state?0!==(i=e.state).wrap&&11!==i.mode?U:11===i.mode&&R(1,t,n,0)!==i.check?-3:j(e,t,n,n)?(i.mode=31,-4):(i.havedict=1,T):U},i.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":1,\"./adler32\":3,\"./crc32\":5,\"./inffast\":7,\"./inftrees\":9}],9:[function(e,t,i){\"use strict\";var I=e(\"../utils/common\"),D=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],T=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],U=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],F=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];t.exports=function(e,t,i,n,a,r,o,s){var f,l,d,c,u,h,b,m,w,k=s.bits,_=0,g=0,v=0,p=0,x=0,y=0,S=0,E=0,Z=0,B=0,A=null,z=0,R=new I.Buf16(16),N=new I.Buf16(16),O=null,C=0;for(_=0;_<=15;_++)R[_]=0;for(g=0;g<n;g++)R[t[i+g]]++;for(x=k,p=15;1<=p&&0===R[p];p--);if(p<x&&(x=p),0===p)return a[r++]=20971520,a[r++]=20971520,s.bits=1,0;for(v=1;v<p&&0===R[v];v++);for(x<v&&(x=v),_=E=1;_<=15;_++)if(E<<=1,(E-=R[_])<0)return-1;if(0<E&&(0===e||1!==p))return-1;for(N[1]=0,_=1;_<15;_++)N[_+1]=N[_]+R[_];for(g=0;g<n;g++)0!==t[i+g]&&(o[N[t[i+g]]++]=g);if(0===e?(A=O=o,h=19):1===e?(A=D,z-=257,O=T,C-=257,h=256):(A=U,O=F,h=-1),_=v,u=r,S=g=B=0,d=-1,c=(Z=1<<(y=x))-1,1===e&&852<Z||2===e&&592<Z)return 1;for(;;){for(b=_-S,o[g]<h?(m=0,w=o[g]):o[g]>h?(m=O[C+o[g]],w=A[z+o[g]]):(m=96,w=0),f=1<<_-S,v=l=1<<y;a[u+(B>>S)+(l-=f)]=b<<24|m<<16|w|0,0!==l;);for(f=1<<_-1;B&f;)f>>=1;if(0!==f?(B&=f-1,B+=f):B=0,g++,0==--R[_]){if(_===p)break;_=t[i+o[g]]}if(x<_&&(B&c)!==d){for(0===S&&(S=x),u+=v,E=1<<(y=_-S);y+S<p&&!((E-=R[y+S])<=0);)y++,E<<=1;if(Z+=1<<y,1===e&&852<Z||2===e&&592<Z)return 1;a[d=B&c]=x<<24|y<<16|u-r|0}}return 0!==B&&(a[u+B]=_-S<<24|64<<16|0),s.bits=x,0}},{\"../utils/common\":1}],10:[function(e,t,i){\"use strict\";t.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],11:[function(e,t,i){\"use strict\";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],\"/lib/inflate.js\":[function(e,t,i){\"use strict\";var c=e(\"./zlib/inflate\"),u=e(\"./utils/common\"),h=e(\"./utils/strings\"),b=e(\"./zlib/constants\"),n=e(\"./zlib/messages\"),a=e(\"./zlib/zstream\"),r=e(\"./zlib/gzheader\"),m=Object.prototype.toString;function o(e){if(!(this instanceof o))return new o(e);this.options=u.assign({chunkSize:16384,windowBits:0,to:\"\"},e||{});var t=this.options;t.raw&&0<=t.windowBits&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(0<=t.windowBits&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),15<t.windowBits&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new a,this.strm.avail_out=0;var i=c.inflateInit2(this.strm,t.windowBits);if(i!==b.Z_OK)throw new Error(n[i]);if(this.header=new r,c.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=h.string2buf(t.dictionary):\"[object ArrayBuffer]\"===m.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=c.inflateSetDictionary(this.strm,t.dictionary))!==b.Z_OK))throw new Error(n[i])}function s(e,t){var i=new o(t);if(i.push(e,!0),i.err)throw i.msg||n[i.err];return i.result}o.prototype.push=function(e,t){var i,n,a,r,o,s=this.strm,f=this.options.chunkSize,l=this.options.dictionary,d=!1;if(this.ended)return!1;n=t===~~t?t:!0===t?b.Z_FINISH:b.Z_NO_FLUSH,\"string\"==typeof e?s.input=h.binstring2buf(e):\"[object ArrayBuffer]\"===m.call(e)?s.input=new Uint8Array(e):s.input=e,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new u.Buf8(f),s.next_out=0,s.avail_out=f),(i=c.inflate(s,b.Z_NO_FLUSH))===b.Z_NEED_DICT&&l&&(i=c.inflateSetDictionary(this.strm,l)),i===b.Z_BUF_ERROR&&!0===d&&(i=b.Z_OK,d=!1),i!==b.Z_STREAM_END&&i!==b.Z_OK)return this.onEnd(i),!(this.ended=!0);s.next_out&&(0!==s.avail_out&&i!==b.Z_STREAM_END&&(0!==s.avail_in||n!==b.Z_FINISH&&n!==b.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(a=h.utf8border(s.output,s.next_out),r=s.next_out-a,o=h.buf2string(s.output,a),s.next_out=r,s.avail_out=f-r,r&&u.arraySet(s.output,s.output,a,r,0),this.onData(o)):this.onData(u.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(d=!0)}while((0<s.avail_in||0===s.avail_out)&&i!==b.Z_STREAM_END);return i===b.Z_STREAM_END&&(n=b.Z_FINISH),n===b.Z_FINISH?(i=c.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===b.Z_OK):n!==b.Z_SYNC_FLUSH||(this.onEnd(b.Z_OK),!(s.avail_out=0))},o.prototype.onData=function(e){this.chunks.push(e)},o.prototype.onEnd=function(e){e===b.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=o,i.inflate=s,i.inflateRaw=function(e,t){return(t=t||{}).raw=!0,s(e,t)},i.ungzip=s},{\"./utils/common\":1,\"./utils/strings\":2,\"./zlib/constants\":4,\"./zlib/gzheader\":6,\"./zlib/inflate\":8,\"./zlib/messages\":10,\"./zlib/zstream\":11}]},{},[])(\"/lib/inflate.js\")});\n"
},
{
"id": 6,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.js",
"name": "./src/lib/crypto.js",
"index": 6,
"index2": 4,
"size": 97349,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./crypto.js",
"loc": "63:15-37"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * CryptoJS core components.\r\n */\r\n\r\nconsole.log('CryptoJS included!');\r\n\r\nvar CryptoJS = this.CryptoJS = globalThis.CryptoJS = CryptoJS || (function (Math, undefined) {\r\n /**\r\n * CryptoJS namespace.\r\n */\r\n var C = {};\r\n\r\n /**\r\n * Library namespace.\r\n */\r\n var C_lib = C.lib = {};\r\n\r\n /**\r\n * Base object for prototypal inheritance.\r\n */\r\n var Base = C_lib.Base = (function () {\r\n function F() {}\r\n\r\n return {\r\n /**\r\n * Creates a new object that inherits from this object.\r\n *\r\n * @param {Object} overrides Properties to copy into the new object.\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * field: 'value',\r\n *\r\n * method: function () {\r\n * }\r\n * });\r\n */\r\n extend: function (overrides) {\r\n // Spawn\r\n F.prototype = this;\r\n var subtype = new F();\r\n\r\n // Augment\r\n if (overrides) {\r\n subtype.mixIn(overrides);\r\n }\r\n\r\n // Create default initializer\r\n if (!subtype.hasOwnProperty('init')) {\r\n subtype.init = function () {\r\n subtype.$super.init.apply(this, arguments);\r\n };\r\n }\r\n\r\n // Initializer's prototype is the subtype object\r\n subtype.init.prototype = subtype;\r\n\r\n // Reference supertype\r\n subtype.$super = this;\r\n\r\n return subtype;\r\n },\r\n\r\n /**\r\n * Extends this object and runs the init method.\r\n * Arguments to create() will be passed to init().\r\n *\r\n * @return {Object} The new object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var instance = MyType.create();\r\n */\r\n create: function () {\r\n var instance = this.extend();\r\n instance.init.apply(instance, arguments);\r\n\r\n return instance;\r\n },\r\n\r\n /**\r\n * Initializes a newly created object.\r\n * Override this method to add some logic when your objects are created.\r\n *\r\n * @example\r\n *\r\n * var MyType = CryptoJS.lib.Base.extend({\r\n * init: function () {\r\n * // ...\r\n * }\r\n * });\r\n */\r\n init: function () {\r\n },\r\n\r\n /**\r\n * Copies properties into this object.\r\n *\r\n * @param {Object} properties The properties to mix in.\r\n *\r\n * @example\r\n *\r\n * MyType.mixIn({\r\n * field: 'value'\r\n * });\r\n */\r\n mixIn: function (properties) {\r\n for (var propertyName in properties) {\r\n if (properties.hasOwnProperty(propertyName)) {\r\n this[propertyName] = properties[propertyName];\r\n }\r\n }\r\n\r\n // IE won't copy toString using the loop above\r\n if (properties.hasOwnProperty('toString')) {\r\n this.toString = properties.toString;\r\n }\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = instance.clone();\r\n */\r\n clone: function () {\r\n return this.init.prototype.extend(this);\r\n }\r\n };\r\n }());\r\n\r\n /**\r\n * An array of 32-bit words.\r\n *\r\n * @property {Array} words The array of 32-bit words.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var WordArray = C_lib.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of 32-bit words.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.create();\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\r\n * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 4;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this word array to a string.\r\n *\r\n * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\r\n *\r\n * @return {string} The stringified word array.\r\n *\r\n * @example\r\n *\r\n * var string = wordArray + '';\r\n * var string = wordArray.toString();\r\n * var string = wordArray.toString(CryptoJS.enc.Utf8);\r\n */\r\n toString: function (encoder) {\r\n return (encoder || Hex).stringify(this);\r\n },\r\n\r\n /**\r\n * Concatenates a word array to this word array.\r\n *\r\n * @param {WordArray} wordArray The word array to append.\r\n *\r\n * @return {WordArray} This word array.\r\n *\r\n * @example\r\n *\r\n * wordArray1.concat(wordArray2);\r\n */\r\n concat: function (wordArray) {\r\n // Shortcuts\r\n var thisWords = this.words;\r\n var thatWords = wordArray.words;\r\n var thisSigBytes = this.sigBytes;\r\n var thatSigBytes = wordArray.sigBytes;\r\n\r\n // Clamp excess bits\r\n this.clamp();\r\n\r\n // Concat\r\n if (thisSigBytes % 4) {\r\n // Copy one byte at a time\r\n for (var i = 0; i < thatSigBytes; i++) {\r\n var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\r\n }\r\n } else if (thatWords.length > 0xffff) {\r\n // Copy one word at a time\r\n for (var i = 0; i < thatSigBytes; i += 4) {\r\n thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\r\n }\r\n } else {\r\n // Copy all words at once\r\n // thisWords.push.apply(thisWords, thatWords);\r\n\r\n // HOTFIX from: https://code.google.com/p/crypto-js/issues/detail?id=90\r\n for (var i = 0; i < thatWords.length; i++) {\r\n thisWords.push(thatWords[i]);\r\n }\r\n }\r\n this.sigBytes += thatSigBytes;\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Removes insignificant bits.\r\n *\r\n * @example\r\n *\r\n * wordArray.clamp();\r\n */\r\n clamp: function () {\r\n // Shortcuts\r\n var words = this.words;\r\n var sigBytes = this.sigBytes;\r\n\r\n // Clamp\r\n words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\r\n words.length = Math.ceil(sigBytes / 4);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = wordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone.words = this.words.slice(0);\r\n\r\n return clone;\r\n },\r\n\r\n /**\r\n * Creates a word array filled with random bytes.\r\n *\r\n * @param {number} nBytes The number of random bytes to generate.\r\n *\r\n * @return {WordArray} The random word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.lib.WordArray.random(16);\r\n */\r\n random: function (nBytes) {\r\n var words = [];\r\n for (var i = 0; i < nBytes; i += 4) {\r\n words.push((Math.random() * 0x100000000) | 0);\r\n }\r\n\r\n return new WordArray.init(words, nBytes);\r\n }\r\n });\r\n\r\n /**\r\n * Encoder namespace.\r\n */\r\n var C_enc = C.enc = {};\r\n\r\n /**\r\n * Hex encoding strategy.\r\n */\r\n var Hex = C_enc.Hex = {\r\n /**\r\n * Converts a word array to a hex string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The hex string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var hexChars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n hexChars.push((bite >>> 4).toString(16));\r\n hexChars.push((bite & 0x0f).toString(16));\r\n }\r\n\r\n return hexChars.join('');\r\n },\r\n\r\n /**\r\n * Converts a hex string to a word array.\r\n *\r\n * @param {string} hexStr The hex string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Hex.parse(hexString);\r\n */\r\n parse: function (hexStr) {\r\n // Shortcut\r\n var hexStrLength = hexStr.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < hexStrLength; i += 2) {\r\n words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\r\n }\r\n\r\n return new WordArray.init(words, hexStrLength / 2);\r\n }\r\n };\r\n\r\n /**\r\n * Latin1 encoding strategy.\r\n */\r\n var Latin1 = C_enc.Latin1 = {\r\n /**\r\n * Converts a word array to a Latin1 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The Latin1 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n // Shortcuts\r\n var words = wordArray.words;\r\n var sigBytes = wordArray.sigBytes;\r\n\r\n // Convert\r\n var latin1Chars = [];\r\n for (var i = 0; i < sigBytes; i++) {\r\n var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\r\n latin1Chars.push(String.fromCharCode(bite));\r\n }\r\n\r\n return latin1Chars.join('');\r\n },\r\n\r\n /**\r\n * Converts a Latin1 string to a word array.\r\n *\r\n * @param {string} latin1Str The Latin1 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\r\n */\r\n parse: function (latin1Str) {\r\n // Shortcut\r\n var latin1StrLength = latin1Str.length;\r\n\r\n // Convert\r\n var words = [];\r\n for (var i = 0; i < latin1StrLength; i++) {\r\n words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new WordArray.init(words, latin1StrLength);\r\n }\r\n };\r\n\r\n /**\r\n * UTF-8 encoding strategy.\r\n */\r\n var Utf8 = C_enc.Utf8 = {\r\n /**\r\n * Converts a word array to a UTF-8 string.\r\n *\r\n * @param {WordArray} wordArray The word array.\r\n *\r\n * @return {string} The UTF-8 string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\r\n */\r\n stringify: function (wordArray) {\r\n try {\r\n return decodeURIComponent(escape(Latin1.stringify(wordArray)));\r\n } catch (e) {\r\n throw new Error('Malformed UTF-8 data');\r\n }\r\n },\r\n\r\n /**\r\n * Converts a UTF-8 string to a word array.\r\n *\r\n * @param {string} utf8Str The UTF-8 string.\r\n *\r\n * @return {WordArray} The word array.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\r\n */\r\n parse: function (utf8Str) {\r\n return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\r\n }\r\n };\r\n\r\n /**\r\n * Abstract buffered block algorithm template.\r\n *\r\n * The property blockSize must be implemented in a concrete subtype.\r\n *\r\n * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\r\n */\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\r\n /**\r\n * Resets this block algorithm's data buffer to its initial state.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm.reset();\r\n */\r\n reset: function () {\r\n // Initial values\r\n this._data = new WordArray.init();\r\n this._nDataBytes = 0;\r\n },\r\n\r\n /**\r\n * Adds new data to this block algorithm's buffer.\r\n *\r\n * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\r\n *\r\n * @example\r\n *\r\n * bufferedBlockAlgorithm._append('data');\r\n * bufferedBlockAlgorithm._append(wordArray);\r\n */\r\n _append: function (data) {\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof data == 'string') {\r\n data = Utf8.parse(data);\r\n }\r\n\r\n // Append\r\n this._data.concat(data);\r\n this._nDataBytes += data.sigBytes;\r\n },\r\n\r\n /**\r\n * Processes available data blocks.\r\n *\r\n * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\r\n *\r\n * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\r\n *\r\n * @return {WordArray} The processed data.\r\n *\r\n * @example\r\n *\r\n * var processedData = bufferedBlockAlgorithm._process();\r\n * var processedData = bufferedBlockAlgorithm._process(!!'flush');\r\n */\r\n _process: function (doFlush) {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n var dataSigBytes = data.sigBytes;\r\n var blockSize = this.blockSize;\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count blocks ready\r\n var nBlocksReady = dataSigBytes / blockSizeBytes;\r\n if (doFlush) {\r\n // Round up to include partial blocks\r\n nBlocksReady = Math.ceil(nBlocksReady);\r\n } else {\r\n // Round down to include only full blocks,\r\n // less the number of blocks that must remain in the buffer\r\n nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\r\n }\r\n\r\n // Count words ready\r\n var nWordsReady = nBlocksReady * blockSize;\r\n\r\n // Count bytes ready\r\n var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\r\n\r\n // Process blocks\r\n if (nWordsReady) {\r\n for (var offset = 0; offset < nWordsReady; offset += blockSize) {\r\n // Perform concrete-algorithm logic\r\n this._doProcessBlock(dataWords, offset);\r\n }\r\n\r\n // Remove processed words\r\n var processedWords = dataWords.splice(0, nWordsReady);\r\n data.sigBytes -= nBytesReady;\r\n }\r\n\r\n // Return processed words\r\n return new WordArray.init(processedWords, nBytesReady);\r\n },\r\n\r\n /**\r\n * Creates a copy of this object.\r\n *\r\n * @return {Object} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = bufferedBlockAlgorithm.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n clone._data = this._data.clone();\r\n\r\n return clone;\r\n },\r\n\r\n _minBufferSize: 0\r\n });\r\n\r\n /**\r\n * Abstract hasher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\r\n */\r\n var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Initializes a newly created hasher.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\r\n *\r\n * @example\r\n *\r\n * var hasher = CryptoJS.algo.SHA256.create();\r\n */\r\n init: function (cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this hasher to its initial state.\r\n *\r\n * @example\r\n *\r\n * hasher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-hasher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Updates this hasher with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {Hasher} This hasher.\r\n *\r\n * @example\r\n *\r\n * hasher.update('message');\r\n * hasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n // Append\r\n this._append(messageUpdate);\r\n\r\n // Update the hash\r\n this._process();\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the hash computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @example\r\n *\r\n * var hash = hasher.finalize();\r\n * var hash = hasher.finalize('message');\r\n * var hash = hasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Final message update\r\n if (messageUpdate) {\r\n this._append(messageUpdate);\r\n }\r\n\r\n // Perform concrete-hasher logic\r\n var hash = this._doFinalize();\r\n\r\n return hash;\r\n },\r\n\r\n blockSize: 512/32,\r\n\r\n /**\r\n * Creates a shortcut function to a hasher's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to create a helper for.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHelper: function (hasher) {\r\n return function (message, cfg) {\r\n return new hasher.init(cfg).finalize(message);\r\n };\r\n },\r\n\r\n /**\r\n * Creates a shortcut function to the HMAC's object interface.\r\n *\r\n * @param {Hasher} hasher The hasher to use in this HMAC helper.\r\n *\r\n * @return {Function} The shortcut function.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\r\n */\r\n _createHmacHelper: function (hasher) {\r\n return function (message, key) {\r\n return new C_algo.HMAC.init(hasher, key).finalize(message);\r\n };\r\n }\r\n });\r\n\r\n /**\r\n * Algorithm namespace.\r\n */\r\n var C_algo = C.algo = {};\r\n\r\n return C;\r\n}(Math));\r\n\r\nmodule.exports = CryptoJS;\r\n\r\n(function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var X32WordArray = C_lib.WordArray;\r\n\r\n /**\r\n * x64 namespace.\r\n */\r\n var C_x64 = C.x64 = {};\r\n\r\n /**\r\n * A 64-bit word.\r\n */\r\n var X64Word = C_x64.Word = Base.extend({\r\n /**\r\n * Initializes a newly created 64-bit word.\r\n *\r\n * @param {number} high The high 32 bits.\r\n * @param {number} low The low 32 bits.\r\n *\r\n * @example\r\n *\r\n * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\r\n */\r\n init: function (high, low) {\r\n this.high = high;\r\n this.low = low;\r\n }\r\n\r\n /**\r\n * Bitwise NOTs this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after negating.\r\n *\r\n * @example\r\n *\r\n * var negated = x64Word.not();\r\n */\r\n // not: function () {\r\n // var high = ~this.high;\r\n // var low = ~this.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ANDs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to AND with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ANDing.\r\n *\r\n * @example\r\n *\r\n * var anded = x64Word.and(anotherX64Word);\r\n */\r\n // and: function (word) {\r\n // var high = this.high & word.high;\r\n // var low = this.low & word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise ORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to OR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after ORing.\r\n *\r\n * @example\r\n *\r\n * var ored = x64Word.or(anotherX64Word);\r\n */\r\n // or: function (word) {\r\n // var high = this.high | word.high;\r\n // var low = this.low | word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Bitwise XORs this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to XOR with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after XORing.\r\n *\r\n * @example\r\n *\r\n * var xored = x64Word.xor(anotherX64Word);\r\n */\r\n // xor: function (word) {\r\n // var high = this.high ^ word.high;\r\n // var low = this.low ^ word.low;\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftL(25);\r\n */\r\n // shiftL: function (n) {\r\n // if (n < 32) {\r\n // var high = (this.high << n) | (this.low >>> (32 - n));\r\n // var low = this.low << n;\r\n // } else {\r\n // var high = this.low << (n - 32);\r\n // var low = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Shifts this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to shift.\r\n *\r\n * @return {X64Word} A new x64-Word object after shifting.\r\n *\r\n * @example\r\n *\r\n * var shifted = x64Word.shiftR(7);\r\n */\r\n // shiftR: function (n) {\r\n // if (n < 32) {\r\n // var low = (this.low >>> n) | (this.high << (32 - n));\r\n // var high = this.high >>> n;\r\n // } else {\r\n // var low = this.high >>> (n - 32);\r\n // var high = 0;\r\n // }\r\n\r\n // return X64Word.create(high, low);\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the left.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotL(25);\r\n */\r\n // rotL: function (n) {\r\n // return this.shiftL(n).or(this.shiftR(64 - n));\r\n // },\r\n\r\n /**\r\n * Rotates this word n bits to the right.\r\n *\r\n * @param {number} n The number of bits to rotate.\r\n *\r\n * @return {X64Word} A new x64-Word object after rotating.\r\n *\r\n * @example\r\n *\r\n * var rotated = x64Word.rotR(7);\r\n */\r\n // rotR: function (n) {\r\n // return this.shiftR(n).or(this.shiftL(64 - n));\r\n // },\r\n\r\n /**\r\n * Adds this word with the passed word.\r\n *\r\n * @param {X64Word} word The x64-Word to add with this word.\r\n *\r\n * @return {X64Word} A new x64-Word object after adding.\r\n *\r\n * @example\r\n *\r\n * var added = x64Word.add(anotherX64Word);\r\n */\r\n // add: function (word) {\r\n // var low = (this.low + word.low) | 0;\r\n // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\r\n // var high = (this.high + word.high + carry) | 0;\r\n\r\n // return X64Word.create(high, low);\r\n // }\r\n });\r\n\r\n /**\r\n * An array of 64-bit words.\r\n *\r\n * @property {Array} words The array of CryptoJS.x64.Word objects.\r\n * @property {number} sigBytes The number of significant bytes in this word array.\r\n */\r\n var X64WordArray = C_x64.WordArray = Base.extend({\r\n /**\r\n * Initializes a newly created word array.\r\n *\r\n * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\r\n * @param {number} sigBytes (Optional) The number of significant bytes in the words.\r\n *\r\n * @example\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create();\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ]);\r\n *\r\n * var wordArray = CryptoJS.x64.WordArray.create([\r\n * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\r\n * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\r\n * ], 10);\r\n */\r\n init: function (words, sigBytes) {\r\n words = this.words = words || [];\r\n\r\n if (sigBytes != undefined) {\r\n this.sigBytes = sigBytes;\r\n } else {\r\n this.sigBytes = words.length * 8;\r\n }\r\n },\r\n\r\n /**\r\n * Converts this 64-bit word array to a 32-bit word array.\r\n *\r\n * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\r\n *\r\n * @example\r\n *\r\n * var x32WordArray = x64WordArray.toX32();\r\n */\r\n toX32: function () {\r\n // Shortcuts\r\n var x64Words = this.words;\r\n var x64WordsLength = x64Words.length;\r\n\r\n // Convert\r\n var x32Words = [];\r\n for (var i = 0; i < x64WordsLength; i++) {\r\n var x64Word = x64Words[i];\r\n x32Words.push(x64Word.high);\r\n x32Words.push(x64Word.low);\r\n }\r\n\r\n return X32WordArray.create(x32Words, this.sigBytes);\r\n },\r\n\r\n /**\r\n * Creates a copy of this word array.\r\n *\r\n * @return {X64WordArray} The clone.\r\n *\r\n * @example\r\n *\r\n * var clone = x64WordArray.clone();\r\n */\r\n clone: function () {\r\n var clone = Base.clone.call(this);\r\n\r\n // Clone \"words\" array\r\n var words = clone.words = this.words.slice(0);\r\n\r\n // Clone each X64Word object\r\n var wordsLength = words.length;\r\n for (var i = 0; i < wordsLength; i++) {\r\n words[i] = words[i].clone();\r\n }\r\n\r\n return clone;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Hasher = C_lib.Hasher;\r\n var C_x64 = C.x64;\r\n var X64Word = C_x64.Word;\r\n var X64WordArray = C_x64.WordArray;\r\n var C_algo = C.algo;\r\n\r\n function X64Word_create() {\r\n return X64Word.create.apply(X64Word, arguments);\r\n }\r\n\r\n // Constants\r\n var K = [\r\n X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\r\n X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\r\n X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\r\n X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\r\n X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\r\n X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\r\n X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\r\n X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\r\n X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\r\n X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\r\n X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\r\n X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\r\n X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\r\n X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\r\n X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\r\n X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\r\n X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\r\n X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\r\n X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\r\n X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\r\n X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\r\n X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\r\n X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\r\n X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\r\n X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\r\n X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\r\n X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\r\n X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\r\n X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\r\n X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\r\n X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\r\n X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\r\n X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\r\n X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\r\n X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\r\n X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\r\n X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\r\n X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\r\n X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\r\n X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\r\n ];\r\n\r\n // Reusable objects\r\n var W = [];\r\n (function () {\r\n for (var i = 0; i < 80; i++) {\r\n W[i] = X64Word_create();\r\n }\r\n }());\r\n\r\n /**\r\n * SHA-512 hash algorithm.\r\n */\r\n var SHA512 = C_algo.SHA512 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new X64WordArray.init([\r\n new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\r\n new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\r\n new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\r\n new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\r\n ]);\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcuts\r\n var H = this._hash.words;\r\n\r\n var H0 = H[0];\r\n var H1 = H[1];\r\n var H2 = H[2];\r\n var H3 = H[3];\r\n var H4 = H[4];\r\n var H5 = H[5];\r\n var H6 = H[6];\r\n var H7 = H[7];\r\n\r\n var H0h = H0.high;\r\n var H0l = H0.low;\r\n var H1h = H1.high;\r\n var H1l = H1.low;\r\n var H2h = H2.high;\r\n var H2l = H2.low;\r\n var H3h = H3.high;\r\n var H3l = H3.low;\r\n var H4h = H4.high;\r\n var H4l = H4.low;\r\n var H5h = H5.high;\r\n var H5l = H5.low;\r\n var H6h = H6.high;\r\n var H6l = H6.low;\r\n var H7h = H7.high;\r\n var H7l = H7.low;\r\n\r\n // Working variables\r\n var ah = H0h;\r\n var al = H0l;\r\n var bh = H1h;\r\n var bl = H1l;\r\n var ch = H2h;\r\n var cl = H2l;\r\n var dh = H3h;\r\n var dl = H3l;\r\n var eh = H4h;\r\n var el = H4l;\r\n var fh = H5h;\r\n var fl = H5l;\r\n var gh = H6h;\r\n var gl = H6l;\r\n var hh = H7h;\r\n var hl = H7l;\r\n\r\n // Rounds\r\n for (var i = 0; i < 80; i++) {\r\n var Wil;\r\n var Wih;\r\n\r\n // Shortcut\r\n var Wi = W[i];\r\n\r\n // Extend message\r\n if (i < 16) {\r\n Wih = Wi.high = M[offset + i * 2] | 0;\r\n Wil = Wi.low = M[offset + i * 2 + 1] | 0;\r\n } else {\r\n // Gamma0\r\n var gamma0x = W[i - 15];\r\n var gamma0xh = gamma0x.high;\r\n var gamma0xl = gamma0x.low;\r\n var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\r\n var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\r\n\r\n // Gamma1\r\n var gamma1x = W[i - 2];\r\n var gamma1xh = gamma1x.high;\r\n var gamma1xl = gamma1x.low;\r\n var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\r\n var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\r\n\r\n // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\r\n var Wi7 = W[i - 7];\r\n var Wi7h = Wi7.high;\r\n var Wi7l = Wi7.low;\r\n\r\n var Wi16 = W[i - 16];\r\n var Wi16h = Wi16.high;\r\n var Wi16l = Wi16.low;\r\n\r\n Wil = gamma0l + Wi7l;\r\n Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\r\n Wil = Wil + gamma1l;\r\n Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\r\n Wil = Wil + Wi16l;\r\n Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\r\n\r\n Wi.high = Wih;\r\n Wi.low = Wil;\r\n }\r\n\r\n var chh = (eh & fh) ^ (~eh & gh);\r\n var chl = (el & fl) ^ (~el & gl);\r\n var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\r\n var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\r\n\r\n var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\r\n var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\r\n var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\r\n var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\r\n\r\n // t1 = h + sigma1 + ch + K[i] + W[i]\r\n var Ki = K[i];\r\n var Kih = Ki.high;\r\n var Kil = Ki.low;\r\n\r\n var t1l = hl + sigma1l;\r\n var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\r\n var t1l = t1l + chl;\r\n var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\r\n var t1l = t1l + Kil;\r\n var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\r\n var t1l = t1l + Wil;\r\n var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\r\n\r\n // t2 = sigma0 + maj\r\n var t2l = sigma0l + majl;\r\n var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\r\n\r\n // Update working variables\r\n hh = gh;\r\n hl = gl;\r\n gh = fh;\r\n gl = fl;\r\n fh = eh;\r\n fl = el;\r\n el = (dl + t1l) | 0;\r\n eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\r\n dh = ch;\r\n dl = cl;\r\n ch = bh;\r\n cl = bl;\r\n bh = ah;\r\n bl = al;\r\n al = (t1l + t2l) | 0;\r\n ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H0l = H0.low = (H0l + al);\r\n H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\r\n H1l = H1.low = (H1l + bl);\r\n H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\r\n H2l = H2.low = (H2l + cl);\r\n H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\r\n H3l = H3.low = (H3l + dl);\r\n H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\r\n H4l = H4.low = (H4l + el);\r\n H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\r\n H5l = H5.low = (H5l + fl);\r\n H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\r\n H6l = H6.low = (H6l + gl);\r\n H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\r\n H7l = H7.low = (H7l + hl);\r\n H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Convert hash to 32-bit word array before returning\r\n var hash = this._hash.toX32();\r\n\r\n // Return final computed hash\r\n return hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n },\r\n\r\n blockSize: 1024/32\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA512('message');\r\n * var hash = CryptoJS.SHA512(wordArray);\r\n */\r\n C.SHA512 = Hasher._createHelper(SHA512);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA512(message, key);\r\n */\r\n C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\r\n}());\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n/**\r\n * Cipher core components.\r\n */\r\nCryptoJS.lib.Cipher || (function (undefined) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var Base64 = C_enc.Base64;\r\n var C_algo = C.algo;\r\n var EvpKDF = C_algo.EvpKDF;\r\n\r\n /**\r\n * Abstract base cipher template.\r\n *\r\n * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\r\n * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\r\n * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\r\n * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\r\n */\r\n var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {WordArray} iv The IV to use for this operation.\r\n */\r\n cfg: Base.extend(),\r\n\r\n /**\r\n * Creates this cipher in encryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createEncryptor: function (key, cfg) {\r\n return this.create(this._ENC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Creates this cipher in decryption mode.\r\n *\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {Cipher} A cipher instance.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\r\n */\r\n createDecryptor: function (key, cfg) {\r\n return this.create(this._DEC_XFORM_MODE, key, cfg);\r\n },\r\n\r\n /**\r\n * Initializes a newly created cipher.\r\n *\r\n * @param {number} xformMode Either the encryption or decryption transormation mode constant.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @example\r\n *\r\n * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\r\n */\r\n init: function (xformMode, key, cfg) {\r\n // Apply config defaults\r\n this.cfg = this.cfg.extend(cfg);\r\n\r\n // Store transform mode and key\r\n this._xformMode = xformMode;\r\n this._key = key;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this cipher to its initial state.\r\n *\r\n * @example\r\n *\r\n * cipher.reset();\r\n */\r\n reset: function () {\r\n // Reset data buffer\r\n BufferedBlockAlgorithm.reset.call(this);\r\n\r\n // Perform concrete-cipher logic\r\n this._doReset();\r\n },\r\n\r\n /**\r\n * Adds data to be encrypted or decrypted.\r\n *\r\n * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.process('data');\r\n * var encrypted = cipher.process(wordArray);\r\n */\r\n process: function (dataUpdate) {\r\n // Append\r\n this._append(dataUpdate);\r\n\r\n // Process available blocks\r\n return this._process();\r\n },\r\n\r\n /**\r\n * Finalizes the encryption or decryption process.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\r\n *\r\n * @return {WordArray} The data after final processing.\r\n *\r\n * @example\r\n *\r\n * var encrypted = cipher.finalize();\r\n * var encrypted = cipher.finalize('data');\r\n * var encrypted = cipher.finalize(wordArray);\r\n */\r\n finalize: function (dataUpdate) {\r\n // Final data update\r\n if (dataUpdate) {\r\n this._append(dataUpdate);\r\n }\r\n\r\n // Perform concrete-cipher logic\r\n var finalProcessedData = this._doFinalize();\r\n\r\n return finalProcessedData;\r\n },\r\n\r\n keySize: 128/32,\r\n\r\n ivSize: 128/32,\r\n\r\n _ENC_XFORM_MODE: 1,\r\n\r\n _DEC_XFORM_MODE: 2,\r\n\r\n /**\r\n * Creates shortcut functions to a cipher's object interface.\r\n *\r\n * @param {Cipher} cipher The cipher to create a helper for.\r\n *\r\n * @return {Object} An object with encrypt and decrypt shortcut functions.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\r\n */\r\n _createHelper: (function () {\r\n function selectCipherStrategy(key) {\r\n if (typeof key == 'string') {\r\n return PasswordBasedCipher;\r\n } else {\r\n return SerializableCipher;\r\n }\r\n }\r\n\r\n return function (cipher) {\r\n return {\r\n encrypt: function (message, key, cfg) {\r\n return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\r\n },\r\n\r\n decrypt: function (ciphertext, key, cfg) {\r\n return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\r\n }\r\n };\r\n };\r\n }())\r\n });\r\n\r\n /**\r\n * Abstract base stream cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\r\n */\r\n var StreamCipher = C_lib.StreamCipher = Cipher.extend({\r\n _doFinalize: function () {\r\n // Process partial blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 1\r\n });\r\n\r\n /**\r\n * Mode namespace.\r\n */\r\n var C_mode = C.mode = {};\r\n\r\n /**\r\n * Abstract base block cipher mode template.\r\n */\r\n var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\r\n /**\r\n * Creates this mode for encryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\r\n */\r\n createEncryptor: function (cipher, iv) {\r\n return this.Encryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Creates this mode for decryption.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\r\n */\r\n createDecryptor: function (cipher, iv) {\r\n return this.Decryptor.create(cipher, iv);\r\n },\r\n\r\n /**\r\n * Initializes a newly created mode.\r\n *\r\n * @param {Cipher} cipher A block cipher instance.\r\n * @param {Array} iv The IV words.\r\n *\r\n * @example\r\n *\r\n * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\r\n */\r\n init: function (cipher, iv) {\r\n this._cipher = cipher;\r\n this._iv = iv;\r\n }\r\n });\r\n\r\n /**\r\n * Cipher Block Chaining mode.\r\n */\r\n var CBC = C_mode.CBC = (function () {\r\n /**\r\n * Abstract base CBC mode.\r\n */\r\n var CBC = BlockCipherMode.extend();\r\n\r\n /**\r\n * CBC encryptor.\r\n */\r\n CBC.Encryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // XOR and encrypt\r\n xorBlock.call(this, words, offset, blockSize);\r\n cipher.encryptBlock(words, offset);\r\n\r\n // Remember this block to use with next block\r\n this._prevBlock = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n /**\r\n * CBC decryptor.\r\n */\r\n CBC.Decryptor = CBC.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n // Remember this block to use with next block\r\n var thisBlock = words.slice(offset, offset + blockSize);\r\n\r\n // Decrypt and XOR\r\n cipher.decryptBlock(words, offset);\r\n xorBlock.call(this, words, offset, blockSize);\r\n\r\n // This block becomes the previous block\r\n this._prevBlock = thisBlock;\r\n }\r\n });\r\n\r\n function xorBlock(words, offset, blockSize) {\r\n // Shortcut\r\n var iv = this._iv;\r\n\r\n // Choose mixing block\r\n if (iv) {\r\n var block = iv;\r\n\r\n // Remove IV for subsequent blocks\r\n this._iv = undefined;\r\n } else {\r\n var block = this._prevBlock;\r\n }\r\n\r\n // XOR blocks\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return CBC;\r\n }());\r\n\r\n\r\n /**\r\n * Infinite Garble Extension mode.\r\n */\r\n var IGE = C_mode.IGE = (function () {\r\n /**\r\n * Abstract base IGE mode.\r\n */\r\n var IGE = BlockCipherMode.extend();\r\n\r\n /**\r\n * IGE encryptor.\r\n */\r\n IGE.Encryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, blockSize + blockSize);\r\n }\r\n\r\n\r\n // Remember this block to use with next block\r\n var nextIv2p = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.encryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n this._ivp = words.slice(offset, offset + blockSize);\r\n this._iv2p = nextIv2p;\r\n }\r\n });\r\n\r\n /**\r\n * IGE decryptor.\r\n */\r\n IGE.Decryptor = IGE.extend({\r\n /**\r\n * Processes the data block at offset.\r\n *\r\n * @param {Array} words The data words to operate on.\r\n * @param {number} offset The offset where the block starts.\r\n *\r\n * @example\r\n *\r\n * mode.processBlock(data.words, offset);\r\n */\r\n processBlock: function (words, offset) {\r\n // Shortcuts\r\n var cipher = this._cipher;\r\n var blockSize = cipher.blockSize;\r\n\r\n if (this._ivp === undefined) {\r\n this._ivp = this._iv.slice(0, blockSize);\r\n this._iv2p = this._iv.slice(blockSize, 2 * blockSize);\r\n }\r\n\r\n // Remember this block to use with next block\r\n var nextIvp = words.slice(offset, offset + blockSize);\r\n\r\n // XOR with previous ciphertext\r\n xorBlock(words, this._iv2p, offset, blockSize);\r\n\r\n // Block cipher\r\n cipher.decryptBlock(words, offset);\r\n\r\n // XOR with previous plaintext\r\n xorBlock(words, this._ivp, offset, blockSize);\r\n\r\n this._ivp = nextIvp;\r\n this._iv2p = words.slice(offset, offset + blockSize);\r\n }\r\n });\r\n\r\n function xorBlock(words, block, offset, blockSize) {\r\n for (var i = 0; i < blockSize; i++) {\r\n words[offset + i] ^= block[i];\r\n }\r\n }\r\n\r\n return IGE;\r\n }());\r\n\r\n /**\r\n * Padding namespace.\r\n */\r\n var C_pad = C.pad = {};\r\n\r\n /**\r\n * PKCS #5/7 padding strategy.\r\n */\r\n var Pkcs7 = C_pad.Pkcs7 = {\r\n /**\r\n * Pads data using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to pad.\r\n * @param {number} blockSize The multiple that the data should be padded to.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.pad(wordArray, 4);\r\n */\r\n pad: function (data, blockSize) {\r\n // Shortcut\r\n var blockSizeBytes = blockSize * 4;\r\n\r\n // Count padding bytes\r\n var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\r\n\r\n // Create padding word\r\n var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\r\n\r\n // Create padding\r\n var paddingWords = [];\r\n for (var i = 0; i < nPaddingBytes; i += 4) {\r\n paddingWords.push(paddingWord);\r\n }\r\n var padding = WordArray.create(paddingWords, nPaddingBytes);\r\n\r\n // Add padding\r\n data.concat(padding);\r\n },\r\n\r\n /**\r\n * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\r\n *\r\n * @param {WordArray} data The data to unpad.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * CryptoJS.pad.Pkcs7.unpad(wordArray);\r\n */\r\n unpad: function (data) {\r\n // Get number of padding bytes from last byte\r\n var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\r\n\r\n // Remove padding\r\n data.sigBytes -= nPaddingBytes;\r\n }\r\n };\r\n\r\n var NoPadding = C_pad.NoPadding = {\r\n pad: function () {\r\n },\r\n\r\n unpad: function () {\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Abstract base block cipher template.\r\n *\r\n * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\r\n */\r\n var BlockCipher = C_lib.BlockCipher = Cipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Mode} mode The block mode to use. Default: CBC\r\n * @property {Padding} padding The padding strategy to use. Default: Pkcs7\r\n */\r\n cfg: Cipher.cfg.extend({\r\n mode: CBC,\r\n padding: Pkcs7\r\n }),\r\n\r\n reset: function () {\r\n // Reset cipher\r\n Cipher.reset.call(this);\r\n\r\n // Shortcuts\r\n var cfg = this.cfg;\r\n var iv = cfg.iv;\r\n var mode = cfg.mode;\r\n\r\n // Reset block mode\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n var modeCreator = mode.createEncryptor;\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n var modeCreator = mode.createDecryptor;\r\n\r\n // Keep at least one block in the buffer for unpadding\r\n this._minBufferSize = 1;\r\n }\r\n this._mode = modeCreator.call(mode, this, iv && iv.words);\r\n },\r\n\r\n _doProcessBlock: function (words, offset) {\r\n this._mode.processBlock(words, offset);\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcut\r\n var padding = this.cfg.padding;\r\n\r\n // Finalize\r\n if (this._xformMode == this._ENC_XFORM_MODE) {\r\n // Pad data\r\n padding.pad(this._data, this.blockSize);\r\n\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\r\n // Process final blocks\r\n var finalProcessedBlocks = this._process(!!'flush');\r\n\r\n // Unpad data\r\n padding.unpad(finalProcessedBlocks);\r\n }\r\n\r\n return finalProcessedBlocks;\r\n },\r\n\r\n blockSize: 128/32\r\n });\r\n\r\n /**\r\n * A collection of cipher parameters.\r\n *\r\n * @property {WordArray} ciphertext The raw ciphertext.\r\n * @property {WordArray} key The key to this ciphertext.\r\n * @property {WordArray} iv The IV used in the ciphering operation.\r\n * @property {WordArray} salt The salt used with a key derivation function.\r\n * @property {Cipher} algorithm The cipher algorithm.\r\n * @property {Mode} mode The block mode used in the ciphering operation.\r\n * @property {Padding} padding The padding scheme used in the ciphering operation.\r\n * @property {number} blockSize The block size of the cipher.\r\n * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\r\n */\r\n var CipherParams = C_lib.CipherParams = Base.extend({\r\n /**\r\n * Initializes a newly created cipher params object.\r\n *\r\n * @param {Object} cipherParams An object with any of the possible cipher parameters.\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.lib.CipherParams.create({\r\n * ciphertext: ciphertextWordArray,\r\n * key: keyWordArray,\r\n * iv: ivWordArray,\r\n * salt: saltWordArray,\r\n * algorithm: CryptoJS.algo.AES,\r\n * mode: CryptoJS.mode.CBC,\r\n * padding: CryptoJS.pad.PKCS7,\r\n * blockSize: 4,\r\n * formatter: CryptoJS.format.OpenSSL\r\n * });\r\n */\r\n init: function (cipherParams) {\r\n this.mixIn(cipherParams);\r\n },\r\n\r\n /**\r\n * Converts this cipher params object to a string.\r\n *\r\n * @param {Format} formatter (Optional) The formatting strategy to use.\r\n *\r\n * @return {string} The stringified cipher params.\r\n *\r\n * @throws Error If neither the formatter nor the default formatter is set.\r\n *\r\n * @example\r\n *\r\n * var string = cipherParams + '';\r\n * var string = cipherParams.toString();\r\n * var string = cipherParams.toString(CryptoJS.format.OpenSSL);\r\n */\r\n toString: function (formatter) {\r\n return (formatter || this.formatter).stringify(this);\r\n }\r\n });\r\n\r\n /**\r\n * Format namespace.\r\n */\r\n var C_format = C.format = {};\r\n\r\n /**\r\n * OpenSSL formatting strategy.\r\n */\r\n var OpenSSLFormatter = C_format.OpenSSL = {\r\n /**\r\n * Converts a cipher params object to an OpenSSL-compatible string.\r\n *\r\n * @param {CipherParams} cipherParams The cipher params object.\r\n *\r\n * @return {string} The OpenSSL-compatible string.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\r\n */\r\n stringify: function (cipherParams) {\r\n // Shortcuts\r\n var ciphertext = cipherParams.ciphertext;\r\n var salt = cipherParams.salt;\r\n\r\n // Format\r\n if (salt) {\r\n var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\r\n } else {\r\n var wordArray = ciphertext;\r\n }\r\n\r\n return wordArray.toString(Base64);\r\n },\r\n\r\n /**\r\n * Converts an OpenSSL-compatible string to a cipher params object.\r\n *\r\n * @param {string} openSSLStr The OpenSSL-compatible string.\r\n *\r\n * @return {CipherParams} The cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\r\n */\r\n parse: function (openSSLStr) {\r\n // Parse base64\r\n var ciphertext = Base64.parse(openSSLStr);\r\n\r\n // Shortcut\r\n var ciphertextWords = ciphertext.words;\r\n\r\n // Test for salt\r\n if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\r\n // Extract salt\r\n var salt = WordArray.create(ciphertextWords.slice(2, 4));\r\n\r\n // Remove salt from ciphertext\r\n ciphertextWords.splice(0, 4);\r\n ciphertext.sigBytes -= 16;\r\n }\r\n\r\n return CipherParams.create({ ciphertext: ciphertext, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A cipher wrapper that returns ciphertext as a serializable cipher params object.\r\n */\r\n var SerializableCipher = C_lib.SerializableCipher = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\r\n */\r\n cfg: Base.extend({\r\n format: OpenSSLFormatter\r\n }),\r\n\r\n /**\r\n * Encrypts a message.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Encrypt\r\n var encryptor = cipher.createEncryptor(key, cfg);\r\n var ciphertext = encryptor.finalize(message);\r\n\r\n // Shortcut\r\n var cipherCfg = encryptor.cfg;\r\n\r\n // Create and return serializable cipher params\r\n return CipherParams.create({\r\n ciphertext: ciphertext,\r\n key: key,\r\n iv: cipherCfg.iv,\r\n algorithm: cipher,\r\n mode: cipherCfg.mode,\r\n padding: cipherCfg.padding,\r\n blockSize: cipher.blockSize,\r\n formatter: cfg.format\r\n });\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {WordArray} key The key.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, key, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Decrypt\r\n var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\r\n\r\n return plaintext;\r\n },\r\n\r\n /**\r\n * Converts serialized ciphertext to CipherParams,\r\n * else assumed CipherParams already and returns ciphertext unchanged.\r\n *\r\n * @param {CipherParams|string} ciphertext The ciphertext.\r\n * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\r\n *\r\n * @return {CipherParams} The unserialized ciphertext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\r\n */\r\n _parse: function (ciphertext, format) {\r\n if (typeof ciphertext == 'string') {\r\n return format.parse(ciphertext, this);\r\n } else {\r\n return ciphertext;\r\n }\r\n }\r\n });\r\n\r\n /**\r\n * Key derivation function namespace.\r\n */\r\n var C_kdf = C.kdf = {};\r\n\r\n /**\r\n * OpenSSL key derivation function.\r\n */\r\n var OpenSSLKdf = C_kdf.OpenSSL = {\r\n /**\r\n * Derives a key and IV from a password.\r\n *\r\n * @param {string} password The password to derive from.\r\n * @param {number} keySize The size in words of the key to generate.\r\n * @param {number} ivSize The size in words of the IV to generate.\r\n * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\r\n *\r\n * @return {CipherParams} A cipher params object with the key, IV, and salt.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\r\n * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\r\n */\r\n execute: function (password, keySize, ivSize, salt) {\r\n // Generate random salt\r\n if (!salt) {\r\n salt = WordArray.random(64/8);\r\n }\r\n\r\n // Derive key and IV\r\n var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\r\n\r\n // Separate key and IV\r\n var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\r\n key.sigBytes = keySize * 4;\r\n\r\n // Return params\r\n return CipherParams.create({ key: key, iv: iv, salt: salt });\r\n }\r\n };\r\n\r\n /**\r\n * A serializable cipher wrapper that derives the key from a password,\r\n * and returns ciphertext as a serializable cipher params object.\r\n */\r\n var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\r\n */\r\n cfg: SerializableCipher.cfg.extend({\r\n kdf: OpenSSLKdf\r\n }),\r\n\r\n /**\r\n * Encrypts a message using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {WordArray|string} message The message to encrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {CipherParams} A cipher params object.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\r\n * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n encrypt: function (cipher, message, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Encrypt\r\n var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\r\n\r\n // Mix in derived params\r\n ciphertext.mixIn(derivedParams);\r\n\r\n return ciphertext;\r\n },\r\n\r\n /**\r\n * Decrypts serialized ciphertext using a password.\r\n *\r\n * @param {Cipher} cipher The cipher algorithm to use.\r\n * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\r\n * @param {string} password The password.\r\n * @param {Object} cfg (Optional) The configuration options to use for this operation.\r\n *\r\n * @return {WordArray} The plaintext.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\r\n * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\r\n */\r\n decrypt: function (cipher, ciphertext, password, cfg) {\r\n // Apply config defaults\r\n cfg = this.cfg.extend(cfg);\r\n\r\n // Convert string to CipherParams\r\n ciphertext = this._parse(ciphertext, cfg.format);\r\n\r\n // Derive key and other params\r\n var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\r\n\r\n // Add IV to config\r\n cfg.iv = derivedParams.iv;\r\n\r\n // Decrypt\r\n var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\r\n\r\n return plaintext;\r\n }\r\n });\r\n}());\r\n\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var BlockCipher = C_lib.BlockCipher;\r\n var C_algo = C.algo;\r\n\r\n // Lookup tables\r\n var SBOX = [];\r\n var INV_SBOX = [];\r\n var SUB_MIX_0 = [];\r\n var SUB_MIX_1 = [];\r\n var SUB_MIX_2 = [];\r\n var SUB_MIX_3 = [];\r\n var INV_SUB_MIX_0 = [];\r\n var INV_SUB_MIX_1 = [];\r\n var INV_SUB_MIX_2 = [];\r\n var INV_SUB_MIX_3 = [];\r\n\r\n // Compute lookup tables\r\n (function () {\r\n // Compute double table\r\n var d = [];\r\n for (var i = 0; i < 256; i++) {\r\n if (i < 128) {\r\n d[i] = i << 1;\r\n } else {\r\n d[i] = (i << 1) ^ 0x11b;\r\n }\r\n }\r\n\r\n // Walk GF(2^8)\r\n var x = 0;\r\n var xi = 0;\r\n for (var i = 0; i < 256; i++) {\r\n // Compute sbox\r\n var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\r\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\r\n SBOX[x] = sx;\r\n INV_SBOX[sx] = x;\r\n\r\n // Compute multiplication\r\n var x2 = d[x];\r\n var x4 = d[x2];\r\n var x8 = d[x4];\r\n\r\n // Compute sub bytes, mix columns tables\r\n var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\r\n SUB_MIX_0[x] = (t << 24) | (t >>> 8);\r\n SUB_MIX_1[x] = (t << 16) | (t >>> 16);\r\n SUB_MIX_2[x] = (t << 8) | (t >>> 24);\r\n SUB_MIX_3[x] = t;\r\n\r\n // Compute inv sub bytes, inv mix columns tables\r\n var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\r\n INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\r\n INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\r\n INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);\r\n INV_SUB_MIX_3[sx] = t;\r\n\r\n // Compute next counter\r\n if (!x) {\r\n x = xi = 1;\r\n } else {\r\n x = x2 ^ d[d[d[x8 ^ x2]]];\r\n xi ^= d[d[xi]];\r\n }\r\n }\r\n }());\r\n\r\n // Precomputed Rcon lookup\r\n var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\r\n\r\n /**\r\n * AES block cipher algorithm.\r\n */\r\n var AES = C_algo.AES = BlockCipher.extend({\r\n _doReset: function () {\r\n // Shortcuts\r\n var key = this._key;\r\n var keyWords = key.words;\r\n var keySize = key.sigBytes / 4;\r\n\r\n // Compute number of rounds\r\n var nRounds = this._nRounds = keySize + 6\r\n\r\n // Compute number of key schedule rows\r\n var ksRows = (nRounds + 1) * 4;\r\n\r\n // Compute key schedule\r\n var keySchedule = this._keySchedule = [];\r\n for (var ksRow = 0; ksRow < ksRows; ksRow++) {\r\n if (ksRow < keySize) {\r\n keySchedule[ksRow] = keyWords[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 1];\r\n\r\n if (!(ksRow % keySize)) {\r\n // Rot word\r\n t = (t << 8) | (t >>> 24);\r\n\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n\r\n // Mix Rcon\r\n t ^= RCON[(ksRow / keySize) | 0] << 24;\r\n } else if (keySize > 6 && ksRow % keySize == 4) {\r\n // Sub word\r\n t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\r\n }\r\n\r\n keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\r\n }\r\n }\r\n\r\n // Compute inv key schedule\r\n var invKeySchedule = this._invKeySchedule = [];\r\n for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\r\n var ksRow = ksRows - invKsRow;\r\n\r\n if (invKsRow % 4) {\r\n var t = keySchedule[ksRow];\r\n } else {\r\n var t = keySchedule[ksRow - 4];\r\n }\r\n\r\n if (invKsRow < 4 || ksRow <= 4) {\r\n invKeySchedule[invKsRow] = t;\r\n } else {\r\n invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\r\n INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\r\n }\r\n }\r\n },\r\n\r\n encryptBlock: function (M, offset) {\r\n this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\r\n },\r\n\r\n decryptBlock: function (M, offset) {\r\n // Swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n\r\n this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\r\n\r\n // Inv swap 2nd and 4th rows\r\n var t = M[offset + 1];\r\n M[offset + 1] = M[offset + 3];\r\n M[offset + 3] = t;\r\n },\r\n\r\n _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\r\n // Shortcut\r\n var nRounds = this._nRounds;\r\n\r\n // Get input, add round key\r\n var s0 = M[offset] ^ keySchedule[0];\r\n var s1 = M[offset + 1] ^ keySchedule[1];\r\n var s2 = M[offset + 2] ^ keySchedule[2];\r\n var s3 = M[offset + 3] ^ keySchedule[3];\r\n\r\n // Key schedule row counter\r\n var ksRow = 4;\r\n\r\n // Rounds\r\n for (var round = 1; round < nRounds; round++) {\r\n // Shift rows, sub bytes, mix columns, add round key\r\n var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\r\n var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\r\n var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\r\n var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\r\n\r\n // Update state\r\n s0 = t0;\r\n s1 = t1;\r\n s2 = t2;\r\n s3 = t3;\r\n }\r\n\r\n // Shift rows, sub bytes, add round key\r\n var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\r\n var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\r\n var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\r\n var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\r\n\r\n // Set output\r\n M[offset] = t0;\r\n M[offset + 1] = t1;\r\n M[offset + 2] = t2;\r\n M[offset + 3] = t3;\r\n },\r\n\r\n keySize: 256/32\r\n });\r\n\r\n /**\r\n * Shortcut functions to the cipher's object interface.\r\n *\r\n * @example\r\n *\r\n * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\r\n * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);\r\n */\r\n C.AES = BlockCipher._createHelper(AES);\r\n}());\r\n\r\n\r\n\r\n/*\r\nCryptoJS v3.1.2\r\ncode.google.com/p/crypto-js\r\n(c) 2009-2013 by Jeff Mott. All rights reserved.\r\ncode.google.com/p/crypto-js/wiki/License\r\n*/\r\n(function (Math) {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var WordArray = C_lib.WordArray;\r\n var Hasher = C_lib.Hasher;\r\n var C_algo = C.algo;\r\n\r\n // Initialization and round constants tables\r\n var H = [];\r\n var K = [];\r\n\r\n // Compute constants\r\n (function () {\r\n function isPrime(n) {\r\n var sqrtN = Math.sqrt(n);\r\n for (var factor = 2; factor <= sqrtN; factor++) {\r\n if (!(n % factor)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function getFractionalBits(n) {\r\n return ((n - (n | 0)) * 0x100000000) | 0;\r\n }\r\n\r\n var n = 2;\r\n var nPrime = 0;\r\n while (nPrime < 64) {\r\n if (isPrime(n)) {\r\n if (nPrime < 8) {\r\n H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\r\n }\r\n K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\r\n\r\n nPrime++;\r\n }\r\n\r\n n++;\r\n }\r\n }());\r\n\r\n // Reusable object\r\n var W = [];\r\n\r\n /**\r\n * SHA-256 hash algorithm.\r\n */\r\n var SHA256 = C_algo.SHA256 = Hasher.extend({\r\n _doReset: function () {\r\n this._hash = new WordArray.init(H.slice(0));\r\n },\r\n\r\n _doProcessBlock: function (M, offset) {\r\n // Shortcut\r\n var H = this._hash.words;\r\n\r\n // Working variables\r\n var a = H[0];\r\n var b = H[1];\r\n var c = H[2];\r\n var d = H[3];\r\n var e = H[4];\r\n var f = H[5];\r\n var g = H[6];\r\n var h = H[7];\r\n\r\n // Computation\r\n for (var i = 0; i < 64; i++) {\r\n if (i < 16) {\r\n W[i] = M[offset + i] | 0;\r\n } else {\r\n var gamma0x = W[i - 15];\r\n var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^\r\n ((gamma0x << 14) | (gamma0x >>> 18)) ^\r\n (gamma0x >>> 3);\r\n\r\n var gamma1x = W[i - 2];\r\n var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^\r\n ((gamma1x << 13) | (gamma1x >>> 19)) ^\r\n (gamma1x >>> 10);\r\n\r\n W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\r\n }\r\n\r\n var ch = (e & f) ^ (~e & g);\r\n var maj = (a & b) ^ (a & c) ^ (b & c);\r\n\r\n var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\r\n var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));\r\n\r\n var t1 = h + sigma1 + ch + K[i] + W[i];\r\n var t2 = sigma0 + maj;\r\n\r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + t1) | 0;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (t1 + t2) | 0;\r\n }\r\n\r\n // Intermediate hash value\r\n H[0] = (H[0] + a) | 0;\r\n H[1] = (H[1] + b) | 0;\r\n H[2] = (H[2] + c) | 0;\r\n H[3] = (H[3] + d) | 0;\r\n H[4] = (H[4] + e) | 0;\r\n H[5] = (H[5] + f) | 0;\r\n H[6] = (H[6] + g) | 0;\r\n H[7] = (H[7] + h) | 0;\r\n },\r\n\r\n _doFinalize: function () {\r\n // Shortcuts\r\n var data = this._data;\r\n var dataWords = data.words;\r\n\r\n var nBitsTotal = this._nDataBytes * 8;\r\n var nBitsLeft = data.sigBytes * 8;\r\n\r\n // Add padding\r\n dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\r\n dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\r\n data.sigBytes = dataWords.length * 4;\r\n\r\n // Hash final blocks\r\n this._process();\r\n\r\n // Return final computed hash\r\n return this._hash;\r\n },\r\n\r\n clone: function () {\r\n var clone = Hasher.clone.call(this);\r\n clone._hash = this._hash.clone();\r\n\r\n return clone;\r\n }\r\n });\r\n\r\n /**\r\n * Shortcut function to the hasher's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n *\r\n * @return {WordArray} The hash.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hash = CryptoJS.SHA256('message');\r\n * var hash = CryptoJS.SHA256(wordArray);\r\n */\r\n C.SHA256 = Hasher._createHelper(SHA256);\r\n\r\n /**\r\n * Shortcut function to the HMAC's object interface.\r\n *\r\n * @param {WordArray|string} message The message to hash.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var hmac = CryptoJS.HmacSHA256(message, key);\r\n */\r\n C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\r\n}(Math));\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var C_enc = C.enc;\r\n var Utf8 = C_enc.Utf8;\r\n var C_algo = C.algo;\r\n\r\n /**\r\n * HMAC algorithm.\r\n */\r\n var HMAC = C_algo.HMAC = Base.extend({\r\n /**\r\n * Initializes a newly created HMAC.\r\n *\r\n * @param {Hasher} hasher The hash algorithm to use.\r\n * @param {WordArray|string} key The secret key.\r\n *\r\n * @example\r\n *\r\n * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\r\n */\r\n init: function (hasher, key) {\r\n // Init hasher\r\n hasher = this._hasher = new hasher.init();\r\n\r\n // Convert string to WordArray, else assume WordArray already\r\n if (typeof key == 'string') {\r\n key = Utf8.parse(key);\r\n }\r\n\r\n // Shortcuts\r\n var hasherBlockSize = hasher.blockSize;\r\n var hasherBlockSizeBytes = hasherBlockSize * 4;\r\n\r\n // Allow arbitrary length keys\r\n if (key.sigBytes > hasherBlockSizeBytes) {\r\n key = hasher.finalize(key);\r\n }\r\n\r\n // Clamp excess bits\r\n key.clamp();\r\n\r\n // Clone key for inner and outer pads\r\n var oKey = this._oKey = key.clone();\r\n var iKey = this._iKey = key.clone();\r\n\r\n // Shortcuts\r\n var oKeyWords = oKey.words;\r\n var iKeyWords = iKey.words;\r\n\r\n // XOR keys with pad constants\r\n for (var i = 0; i < hasherBlockSize; i++) {\r\n oKeyWords[i] ^= 0x5c5c5c5c;\r\n iKeyWords[i] ^= 0x36363636;\r\n }\r\n oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\r\n\r\n // Set initial values\r\n this.reset();\r\n },\r\n\r\n /**\r\n * Resets this HMAC to its initial state.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.reset();\r\n */\r\n reset: function () {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Reset\r\n hasher.reset();\r\n hasher.update(this._iKey);\r\n },\r\n\r\n /**\r\n * Updates this HMAC with a message.\r\n *\r\n * @param {WordArray|string} messageUpdate The message to append.\r\n *\r\n * @return {HMAC} This HMAC instance.\r\n *\r\n * @example\r\n *\r\n * hmacHasher.update('message');\r\n * hmacHasher.update(wordArray);\r\n */\r\n update: function (messageUpdate) {\r\n this._hasher.update(messageUpdate);\r\n\r\n // Chainable\r\n return this;\r\n },\r\n\r\n /**\r\n * Finalizes the HMAC computation.\r\n * Note that the finalize operation is effectively a destructive, read-once operation.\r\n *\r\n * @param {WordArray|string} messageUpdate (Optional) A final message update.\r\n *\r\n * @return {WordArray} The HMAC.\r\n *\r\n * @example\r\n *\r\n * var hmac = hmacHasher.finalize();\r\n * var hmac = hmacHasher.finalize('message');\r\n * var hmac = hmacHasher.finalize(wordArray);\r\n */\r\n finalize: function (messageUpdate) {\r\n // Shortcut\r\n var hasher = this._hasher;\r\n\r\n // Compute HMAC\r\n var innerHash = hasher.finalize(messageUpdate);\r\n hasher.reset();\r\n var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\r\n\r\n return hmac;\r\n }\r\n });\r\n}());\r\n\r\n(function () {\r\n // Shortcuts\r\n var C = CryptoJS;\r\n var C_lib = C.lib;\r\n var Base = C_lib.Base;\r\n var WordArray = C_lib.WordArray;\r\n var C_algo = C.algo;\r\n var SHA1 = C_algo.SHA1;\r\n var HMAC = C_algo.HMAC;\r\n\r\n /**\r\n * Password-Based Key Derivation Function 2 algorithm.\r\n */\r\n var PBKDF2 = C_algo.PBKDF2 = Base.extend({\r\n /**\r\n * Configuration options.\r\n *\r\n * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\r\n * @property {Hasher} hasher The hasher to use. Default: SHA1\r\n * @property {number} iterations The number of iterations to perform. Default: 1\r\n */\r\n cfg: Base.extend({\r\n keySize: 128/32,\r\n hasher: SHA1,\r\n iterations: 1\r\n }),\r\n\r\n /**\r\n * Initializes a newly created key derivation function.\r\n *\r\n * @param {Object} cfg (Optional) The configuration options to use for the derivation.\r\n *\r\n * @example\r\n *\r\n * var kdf = CryptoJS.algo.PBKDF2.create();\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\r\n * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\r\n */\r\n init: function (cfg) {\r\n this.cfg = this.cfg.extend(cfg);\r\n },\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @example\r\n *\r\n * var key = kdf.compute(password, salt);\r\n */\r\n compute: function (password, salt) {\r\n // Shortcut\r\n var cfg = this.cfg;\r\n\r\n // Init HMAC\r\n var hmac = HMAC.create(cfg.hasher, password);\r\n\r\n // Initial values\r\n var derivedKey = WordArray.create();\r\n var blockIndex = WordArray.create([0x00000001]);\r\n\r\n // Shortcuts\r\n var derivedKeyWords = derivedKey.words;\r\n var blockIndexWords = blockIndex.words;\r\n var keySize = cfg.keySize;\r\n var iterations = cfg.iterations;\r\n\r\n // Generate key\r\n while (derivedKeyWords.length < keySize) {\r\n var block = hmac.update(salt).finalize(blockIndex);\r\n hmac.reset();\r\n\r\n // Shortcuts\r\n var blockWords = block.words;\r\n var blockWordsLength = blockWords.length;\r\n\r\n // Iterations\r\n var intermediate = block;\r\n for (var i = 1; i < iterations; i++) {\r\n intermediate = hmac.finalize(intermediate);\r\n hmac.reset();\r\n\r\n // Shortcut\r\n var intermediateWords = intermediate.words;\r\n\r\n // XOR intermediate with block\r\n for (var j = 0; j < blockWordsLength; j++) {\r\n blockWords[j] ^= intermediateWords[j];\r\n }\r\n }\r\n\r\n derivedKey.concat(block);\r\n blockIndexWords[0]++;\r\n }\r\n derivedKey.sigBytes = keySize * 4;\r\n\r\n return derivedKey;\r\n }\r\n });\r\n\r\n /**\r\n * Computes the Password-Based Key Derivation Function 2.\r\n *\r\n * @param {WordArray|string} password The password.\r\n * @param {WordArray|string} salt A salt.\r\n * @param {Object} cfg (Optional) The configuration options to use for this computation.\r\n *\r\n * @return {WordArray} The derived key.\r\n *\r\n * @static\r\n *\r\n * @example\r\n *\r\n * var key = CryptoJS.PBKDF2(password, salt);\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\r\n * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\r\n */\r\n C.PBKDF2 = function (password, salt, cfg) {\r\n return PBKDF2.create(cfg).compute(password, salt);\r\n };\r\n}());\r\n"
},
{
"id": 7,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/closure_long.js",
"name": "./src/lib/closure_long.js",
"index": 7,
"index2": 5,
"size": 24517,
"cacheable": true,
"built": true,
"optional": false,
"prefetched": false,
"chunks": [
0
],
"issuer": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"issuerId": 0,
"issuerName": "./src/lib/bin_utils.ts",
"issuerPath": [
{
"id": 1,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/src/lib/crypto.worker.js",
"name": "./src/lib/crypto.worker.js",
"profile": {
"factory": 1,
"building": 3
}
},
{
"id": 0,
"identifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"name": "./src/lib/bin_utils.ts",
"profile": {
"factory": 0,
"building": 1220
}
}
],
"profile": {
"factory": 0,
"building": 50
},
"failed": false,
"errors": 0,
"warnings": 0,
"assets": [],
"reasons": [
{
"moduleId": 0,
"moduleIdentifier": "/Users/kuzmenko/Documents/projects/tweb/node_modules/ts-loader/index.js!/Users/kuzmenko/Documents/projects/tweb/src/lib/bin_utils.ts",
"module": "./src/lib/bin_utils.ts",
"moduleName": "./src/lib/bin_utils.ts",
"type": "cjs require",
"userRequest": "./closure_long.js",
"loc": "64:0-28"
}
],
"usedExports": true,
"providedExports": null,
"optimizationBailout": [
"ModuleConcatenation bailout: Module is not an ECMAScript module"
],
"depth": 2,
"source": "// Copyright 2009 The Closure Library Authors. All Rights Reserved.\r\n//\r\n// Licensed under the Apache License, Version 2.0 (the \"License\");\r\n// you may not use this file except in compliance with the License.\r\n// You may obtain a copy of the License at\r\n//\r\n// http://www.apache.org/licenses/LICENSE-2.0\r\n//\r\n// Unless required by applicable law or agreed to in writing, software\r\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\r\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n// See the License for the specific language governing permissions and\r\n// limitations under the License.\r\n\r\n/**\r\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\r\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\r\n * implementation is derived from LongLib in GWT.\r\n *\r\n */\r\n\r\n/**\r\n * This file also contains some modifications by Igor Zhukov in order to add custom scrollbars to EmojiMenu\r\n * See keyword `MODIFICATION` in source code.\r\n */\r\n\r\n/*! MODIFICATION\r\nThe following line was added by Igor Zhukov in order to make library compatibile with other app parts\r\n*/\r\nvar goog = {\r\n provide: function () {}, \r\n math: {\r\n Long: {\r\n ZERO: undefined,\r\n fromString: undefined,\r\n ONE: undefined,\r\n fromInt: undefined\r\n }\r\n }\r\n};\r\nthis.goog = goog;\r\n\r\n\r\ngoog.provide('goog.math.Long');\r\n\r\n\r\n\r\n/**\r\n * Constructs a 64-bit two's-complement integer, given its low and high 32-bit\r\n * values as *signed* integers. See the from* functions below for more\r\n * convenient ways of constructing Longs.\r\n *\r\n * The internal representation of a long is the two given signed, 32-bit values.\r\n * We use 32-bit pieces because these are the size of integers on which\r\n * Javascript performs bit-operations. For operations like addition and\r\n * multiplication, we split each number into 16-bit pieces, which can easily be\r\n * multiplied within Javascript's floating-point representation without overflow\r\n * or change in sign.\r\n *\r\n * In the algorithms below, we frequently reduce the negative case to the\r\n * positive case by negating the input(s) and then post-processing the result.\r\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n * a positive number, it overflows back into a negative). Not handling this\r\n * case would often result in infinite recursion.\r\n *\r\n * @param {number} low The low (signed) 32 bits of the long.\r\n * @param {number} high The high (signed) 32 bits of the long.\r\n * @constructor\r\n */\r\ngoog.math.Long = function(low, high) {\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.low_ = low | 0; // force into 32 signed bits.\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.high_ = high | 0; // force into 32 signed bits.\r\n};\r\n\r\n\r\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\r\n// from* methods on which they depend.\r\n\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @private\r\n */\r\ngoog.math.Long.IntCache_ = {};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given (32-bit) integer value.\r\n * @param {number} value The 32-bit integer in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromInt = function(value) {\r\n if (-128 <= value && value < 128) {\r\n var cachedObj = goog.math.Long.IntCache_[value];\r\n if (cachedObj) {\r\n return cachedObj;\r\n }\r\n }\r\n\r\n var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);\r\n if (-128 <= value && value < 128) {\r\n goog.math.Long.IntCache_[value] = obj;\r\n }\r\n return obj;\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite\r\n * number. Otherwise, zero is returned.\r\n * @param {number} value The number in question.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromNumber = function(value) {\r\n if (isNaN(value) || !isFinite(value)) {\r\n return goog.math.Long.ZERO;\r\n } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {\r\n return goog.math.Long.MAX_VALUE;\r\n } else if (value < 0) {\r\n return goog.math.Long.fromNumber(-value).negate();\r\n } else {\r\n return new goog.math.Long(\r\n (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,\r\n (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representing the 64-bit integer that comes by concatenating\r\n * the given high and low bits. Each is assumed to use 32 bits.\r\n * @param {number} lowBits The low 32-bits.\r\n * @param {number} highBits The high 32-bits.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromBits = function(lowBits, highBits) {\r\n return new goog.math.Long(lowBits, highBits);\r\n};\r\n\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the given\r\n * radix.\r\n * @param {string} str The textual representation of the Long.\r\n * @param {number=} opt_radix The radix in which the text is written.\r\n * @return {!goog.math.Long} The corresponding Long value.\r\n */\r\ngoog.math.Long.fromString = function(str, opt_radix) {\r\n if (str.length == 0) {\r\n throw Error('number format error: empty string');\r\n }\r\n\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (str.charAt(0) == '-') {\r\n return goog.math.Long.fromString(str.substring(1), radix).negate();\r\n } else if (str.indexOf('-') >= 0) {\r\n throw Error('number format error: interior \"-\" character: ' + str);\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));\r\n\r\n var result = goog.math.Long.ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i);\r\n var value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = goog.math.Long.fromNumber(Math.pow(radix, size));\r\n result = result.multiply(power).add(goog.math.Long.fromNumber(value));\r\n } else {\r\n result = result.multiply(radixToPower);\r\n result = result.add(goog.math.Long.fromNumber(value));\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove\r\n// these variables, so there should be no runtime penalty for these.\r\n\r\n\r\n/**\r\n * Number used repeated below in calculations. This must appear before the\r\n * first call to any from* function below.\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_32_DBL_ =\r\n goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_31_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ / 2;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_48_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_64_DBL_ =\r\n goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;\r\n\r\n\r\n/**\r\n * @type {number}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_63_DBL_ =\r\n goog.math.Long.TWO_PWR_64_DBL_ / 2;\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ZERO = goog.math.Long.fromInt(0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.ONE = goog.math.Long.fromInt(1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MAX_VALUE =\r\n goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);\r\n\r\n\r\n/** @type {!goog.math.Long} */\r\ngoog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);\r\n\r\n\r\n/**\r\n * @type {!goog.math.Long}\r\n * @private\r\n */\r\ngoog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);\r\n\r\n\r\n/** @return {number} The value, assuming it is a 32-bit integer. */\r\ngoog.math.Long.prototype.toInt = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The closest floating-point representation to this value. */\r\ngoog.math.Long.prototype.toNumber = function() {\r\n return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +\r\n this.getLowBitsUnsigned();\r\n};\r\n\r\n\r\n/**\r\n * @param {number=} opt_radix The radix in which the text should be written.\r\n * @return {string} The textual representation of this value.\r\n * @override\r\n */\r\ngoog.math.Long.prototype.toString = function(opt_radix) {\r\n var radix = opt_radix || 10;\r\n if (radix < 2 || 36 < radix) {\r\n throw Error('radix out of range: ' + radix);\r\n }\r\n\r\n if (this.isZero()) {\r\n return '0';\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = goog.math.Long.fromNumber(radix);\r\n var div = this.div(radixLong);\r\n var rem = div.multiply(radixLong).subtract(this);\r\n return div.toString(radix) + rem.toInt().toString(radix);\r\n } else {\r\n return '-' + this.negate().toString(radix);\r\n }\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));\r\n\r\n var rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower);\r\n var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();\r\n var digits = intval.toString(radix);\r\n\r\n rem = remDiv;\r\n if (rem.isZero()) {\r\n return digits + result;\r\n } else {\r\n while (digits.length < 6) {\r\n digits = '0' + digits;\r\n }\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n\r\n/** @return {number} The high 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getHighBits = function() {\r\n return this.high_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as a signed value. */\r\ngoog.math.Long.prototype.getLowBits = function() {\r\n return this.low_;\r\n};\r\n\r\n\r\n/** @return {number} The low 32-bits as an unsigned value. */\r\ngoog.math.Long.prototype.getLowBitsUnsigned = function() {\r\n return (this.low_ >= 0) ?\r\n this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;\r\n};\r\n\r\n\r\n/**\r\n * @return {number} Returns the number of bits needed to represent the absolute\r\n * value of this Long.\r\n */\r\ngoog.math.Long.prototype.getNumBitsAbs = function() {\r\n if (this.isNegative()) {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return 64;\r\n } else {\r\n return this.negate().getNumBitsAbs();\r\n }\r\n } else {\r\n var val = this.high_ != 0 ? this.high_ : this.low_;\r\n for (var bit = 31; bit > 0; bit--) {\r\n if ((val & (1 << bit)) != 0) {\r\n break;\r\n }\r\n }\r\n return this.high_ != 0 ? bit + 33 : bit + 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is zero. */\r\ngoog.math.Long.prototype.isZero = function() {\r\n return this.high_ == 0 && this.low_ == 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is negative. */\r\ngoog.math.Long.prototype.isNegative = function() {\r\n return this.high_ < 0;\r\n};\r\n\r\n\r\n/** @return {boolean} Whether this value is odd. */\r\ngoog.math.Long.prototype.isOdd = function() {\r\n return (this.low_ & 1) == 1;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long equals the other.\r\n */\r\ngoog.math.Long.prototype.equals = function(other) {\r\n return (this.high_ == other.high_) && (this.low_ == other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long does not equal the other.\r\n */\r\ngoog.math.Long.prototype.notEquals = function(other) {\r\n return (this.high_ != other.high_) || (this.low_ != other.low_);\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than the other.\r\n */\r\ngoog.math.Long.prototype.lessThan = function(other) {\r\n return this.compare(other) < 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is less than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.lessThanOrEqual = function(other) {\r\n return this.compare(other) <= 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than the other.\r\n */\r\ngoog.math.Long.prototype.greaterThan = function(other) {\r\n return this.compare(other) > 0;\r\n};\r\n\r\n\r\n/**\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {boolean} Whether this Long is greater than or equal to the other.\r\n */\r\ngoog.math.Long.prototype.greaterThanOrEqual = function(other) {\r\n return this.compare(other) >= 0;\r\n};\r\n\r\n\r\n/**\r\n * Compares this Long with the given one.\r\n * @param {goog.math.Long} other Long to compare against.\r\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\r\n * if the given one is greater.\r\n */\r\ngoog.math.Long.prototype.compare = function(other) {\r\n if (this.equals(other)) {\r\n return 0;\r\n }\r\n\r\n var thisNeg = this.isNegative();\r\n var otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg) {\r\n return -1;\r\n }\r\n if (!thisNeg && otherNeg) {\r\n return 1;\r\n }\r\n\r\n // at this point, the signs are the same, so subtraction will not overflow\r\n if (this.subtract(other).isNegative()) {\r\n return -1;\r\n } else {\r\n return 1;\r\n }\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The negation of this value. */\r\ngoog.math.Long.prototype.negate = function() {\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.MIN_VALUE;\r\n } else {\r\n return this.not().add(goog.math.Long.ONE);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns the sum of this and the given Long.\r\n * @param {goog.math.Long} other Long to add to this one.\r\n * @return {!goog.math.Long} The sum of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.add = function(other) {\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns the difference of this and the given Long.\r\n * @param {goog.math.Long} other Long to subtract from this.\r\n * @return {!goog.math.Long} The difference of this and the given Long.\r\n */\r\ngoog.math.Long.prototype.subtract = function(other) {\r\n return this.add(other.negate());\r\n};\r\n\r\n\r\n/**\r\n * Returns the product of this and the given long.\r\n * @param {goog.math.Long} other Long to multiply with this.\r\n * @return {!goog.math.Long} The product of this and the other.\r\n */\r\ngoog.math.Long.prototype.multiply = function(other) {\r\n if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n } else if (other.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().multiply(other.negate());\r\n } else {\r\n return this.negate().multiply(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.multiply(other.negate()).negate();\r\n }\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&\r\n other.lessThan(goog.math.Long.TWO_PWR_24_)) {\r\n return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());\r\n }\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high_ >>> 16;\r\n var a32 = this.high_ & 0xFFFF;\r\n var a16 = this.low_ >>> 16;\r\n var a00 = this.low_ & 0xFFFF;\r\n\r\n var b48 = other.high_ >>> 16;\r\n var b32 = other.high_ & 0xFFFF;\r\n var b16 = other.low_ >>> 16;\r\n var b00 = other.low_ & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long divided by the given one.\r\n * @param {goog.math.Long} other Long by which to divide.\r\n * @return {!goog.math.Long} This Long divided by the given one.\r\n */\r\ngoog.math.Long.prototype.div = function(other) {\r\n if (other.isZero()) {\r\n throw Error('division by zero');\r\n } else if (this.isZero()) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.equals(goog.math.Long.MIN_VALUE)) {\r\n if (other.equals(goog.math.Long.ONE) ||\r\n other.equals(goog.math.Long.NEG_ONE)) {\r\n return goog.math.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ONE;\r\n } else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shiftRight(1);\r\n var approx = halfThis.div(other).shiftLeft(1);\r\n if (approx.equals(goog.math.Long.ZERO)) {\r\n return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;\r\n } else {\r\n var rem = this.subtract(other.multiply(approx));\r\n var result = approx.add(rem.div(other));\r\n return result;\r\n }\r\n }\r\n } else if (other.equals(goog.math.Long.MIN_VALUE)) {\r\n return goog.math.Long.ZERO;\r\n }\r\n\r\n if (this.isNegative()) {\r\n if (other.isNegative()) {\r\n return this.negate().div(other.negate());\r\n } else {\r\n return this.negate().div(other).negate();\r\n }\r\n } else if (other.isNegative()) {\r\n return this.div(other.negate()).negate();\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n var res = goog.math.Long.ZERO;\r\n var rem = this;\r\n while (rem.greaterThanOrEqual(other)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2);\r\n var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n var approxRes = goog.math.Long.fromNumber(approx);\r\n var approxRem = approxRes.multiply(other);\r\n while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\r\n approx -= delta;\r\n approxRes = goog.math.Long.fromNumber(approx);\r\n approxRem = approxRes.multiply(other);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero()) {\r\n approxRes = goog.math.Long.ONE;\r\n }\r\n\r\n res = res.add(approxRes);\r\n rem = rem.subtract(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long modulo the given one.\r\n * @param {goog.math.Long} other Long by which to mod.\r\n * @return {!goog.math.Long} This Long modulo the given one.\r\n */\r\ngoog.math.Long.prototype.modulo = function(other) {\r\n return this.subtract(this.div(other).multiply(other));\r\n};\r\n\r\n\r\n/** @return {!goog.math.Long} The bitwise-NOT of this value. */\r\ngoog.math.Long.prototype.not = function() {\r\n return goog.math.Long.fromBits(~this.low_, ~this.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-AND of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to AND.\r\n * @return {!goog.math.Long} The bitwise-AND of this and the other.\r\n */\r\ngoog.math.Long.prototype.and = function(other) {\r\n return goog.math.Long.fromBits(this.low_ & other.low_,\r\n this.high_ & other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-OR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to OR.\r\n * @return {!goog.math.Long} The bitwise-OR of this and the other.\r\n */\r\ngoog.math.Long.prototype.or = function(other) {\r\n return goog.math.Long.fromBits(this.low_ | other.low_,\r\n this.high_ | other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns the bitwise-XOR of this Long and the given one.\r\n * @param {goog.math.Long} other The Long with which to XOR.\r\n * @return {!goog.math.Long} The bitwise-XOR of this and the other.\r\n */\r\ngoog.math.Long.prototype.xor = function(other) {\r\n return goog.math.Long.fromBits(this.low_ ^ other.low_,\r\n this.high_ ^ other.high_);\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the left by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftLeft = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var low = this.low_;\r\n if (numBits < 32) {\r\n var high = this.high_;\r\n return goog.math.Long.fromBits(\r\n low << numBits,\r\n (high << numBits) | (low >>> (32 - numBits)));\r\n } else {\r\n return goog.math.Long.fromBits(0, low << (numBits - 32));\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount.\r\n */\r\ngoog.math.Long.prototype.shiftRight = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >> numBits);\r\n } else {\r\n return goog.math.Long.fromBits(\r\n high >> (numBits - 32),\r\n high >= 0 ? 0 : -1);\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns this Long with bits shifted to the right by the given amount, with\r\n * the new top bits matching the current sign bit.\r\n * @param {number} numBits The number of bits by which to shift.\r\n * @return {!goog.math.Long} This shifted to the right by the given amount, with\r\n * zeros placed into the new leading bits.\r\n */\r\ngoog.math.Long.prototype.shiftRightUnsigned = function(numBits) {\r\n numBits &= 63;\r\n if (numBits == 0) {\r\n return this;\r\n } else {\r\n var high = this.high_;\r\n if (numBits < 32) {\r\n var low = this.low_;\r\n return goog.math.Long.fromBits(\r\n (low >>> numBits) | (high << (32 - numBits)),\r\n high >>> numBits);\r\n } else if (numBits == 32) {\r\n return goog.math.Long.fromBits(high, 0);\r\n } else {\r\n return goog.math.Long.fromBits(high >>> (numBits - 32), 0);\r\n }\r\n }\r\n};"
}
],
"filteredModules": 0,
"logging": {
"webpack.buildChunkGraph.visitModules": {
"entries": [],
"filteredEntries": 2,
"debug": false
}
},
"children": [],
"name": "worker"
}
]
}