From 2dc348a29c4863459697ca188707b5023eeae19a Mon Sep 17 00:00:00 2001 From: Deon George Date: Sun, 1 May 2022 17:42:19 +1000 Subject: [PATCH] Enabled adding a context to render, so that dynamic fields can resolve locally (like in a message). Improved dynamic fields identification and resolution. Use of more consts for standard frames. Fix history recording and backtracking. --- frames_check.js | 2 ++ load/defs.js | 15 ++++++++ load/frame-ansi.js | 4 +-- load/frame-page.js | 51 ++++++++++++++------------- load/funcs.js | 83 +++++++++++++++++++++++++++++++++---------- load/msgbases.js | 29 +++++++++++----- main.js | 87 +++++++++++++++++++++++++++++++++++----------- text/98a.tex | 2 +- text/98b.tex | 2 +- text/998a.tex | 2 +- text/99a.tex | 2 +- text/99b.tex | 2 +- 12 files changed, 202 insertions(+), 79 deletions(-) diff --git a/frames_check.js b/frames_check.js index 0fdcec1..68528bd 100644 --- a/frames_check.js +++ b/frames_check.js @@ -117,3 +117,5 @@ if (vtx.content && ans.content) if (errors) exit(1); +else + writeln('= OK'); diff --git a/load/defs.js b/load/defs.js index 88676f6..14c3b3a 100644 --- a/load/defs.js +++ b/load/defs.js @@ -59,6 +59,10 @@ const FRAME_TYPE_EXTERNAL ='x'; const FRAME_TYPE_RESPONSE ='r'; /* Login frame, enables the user to authenticate to the system, or to a CUG */ const FRAME_TYPE_LOGIN ='l'; +/* Mail template frames - mail templates will have the user's stats for the area passed to render() */ +const FRAME_TYPE_MAIL_TEMPLATE ='m'; +/* Frame is a message */ +const FRAME_TYPE_MESSAGE ='M'; /* Disable *# going backwards for the following frames */ var NO_HISTORY_FRAMES =['980a','98b','981a','982a','983a','998a']; @@ -74,6 +78,7 @@ const INACTIVE_LOGIN =5*60000; var SYSTEM_ZONE =516; +// @todo rename these all to FRAME_* /* Home Frame */ const HOME_FRAME ={frame: 1,index: 'a'}; /* Login Frame */ @@ -88,8 +93,18 @@ const LOGIN_FAILED_FRAME ={frame: 983,index: 'a'}; const HOME_FRAME_AUTH ={frame: 98,index: 'b'}; /* Home page for initial connection */ const HOME_FRAME_CONNECT ={frame: 980,index: 'a'}; +const FRAME_SYSTEM_ERROR ={frame: 998,index: 'a'}; /* Attributes saved/loaded from files */ const SAVED_FRAME_ATTRS =['version','frame','frame_fields','index','owner','cost','content','isPublic','isAccessible','type','key']; +/* The page that has our echomail area reading template */ +var MAIL_TEMPLATE_FRAME ='199a'; + +/* The page that has our echomail area summary template */ +var MAIL_TEMPLATE_AREA_SUMMARY ='198a'; + +// The maximum size of embedded dynamic fields in frames +var DYNAMIC_FIELD_SIZE_MAX =50; + this; diff --git a/load/frame-ansi.js b/load/frame-ansi.js index 149b039..ae55f81 100644 --- a/load/frame-ansi.js +++ b/load/frame-ansi.js @@ -75,7 +75,7 @@ function FrameAnsi() { } // Render the frame to the user - this.render=function(withoutHeader) { + this.render=function(context,withoutHeader) { log(LOG_DEBUG,'- ANSI FRAME'); owner = base64_decode(this.owner); @@ -99,7 +99,7 @@ function FrameAnsi() { contentgraphic = new Graphic(this.settings.FRAME_WIDTH); contentgraphic.auto_extend = true; contentgraphic.atcodes = false; - contentgraphic.ANSI = this.parse(base64_decode(this.content)); + contentgraphic.ANSI = this.parse(base64_decode(this.content),context); var contentframe = new Frame(1,2,this.settings.FRAME_WIDTH,this.settings.FRAME_LENGTH,LIGHTGRAY,frame); contentframe.open(); diff --git a/load/frame-page.js b/load/frame-page.js index 241acf2..21a51b2 100644 --- a/load/frame-page.js +++ b/load/frame-page.js @@ -1,5 +1,3 @@ -var MAIL_TEMPLATE_FRAME = '199a'; - // Our frame object function PageFrame() { 'use strict'; @@ -171,8 +169,7 @@ PageFrame.prototype.load = function(filename) { log(LOG_ERROR,'Frame error: '+error); // Load our system error frame. - // @todo this should be a config item - this.load('998a'); + this.load(pageStr(FRAME_SYSTEM_ERROR)); return null; } @@ -190,11 +187,13 @@ PageFrame.prototype.loadMessage = function(page) { this.owner = 1; this.isPublic = true; this.isAccessible = true; - this.key = [0,null,null,null,null,null,null,null,null,918]; + // @todo Keys should map to next/previous/send, etc as indicated in the template frame. + this.key = [this.frame.substr(0,7)+'1',null,null,null,null,null,null,null,null,null]; + this.type = FRAME_TYPE_MESSAGE; // Load our message var ma = new MsgAreas() - var msg = ma.getMessage(page); + var msg = ma.getMessage(this.frame); var msg_header; if (! msg) @@ -215,6 +214,7 @@ PageFrame.prototype.loadMessage = function(page) { msg_header += 'SUBJECT: '+msg.subject.substr(0,72)+"\n\r"; } else { + // @todo change this to use atcode() msg_header = base64_decode(to.content).replace(/@(.*)@/g, function (str, code, offset, s) { var length = code.split(':')[1]; @@ -228,7 +228,7 @@ PageFrame.prototype.loadMessage = function(page) { ); } - log(LOG_DEBUG,'Loaded message: '+msg_header+msg.content); + //log(LOG_DEBUG,'Loaded message: '+msg_header+msg.content); this.content = base64_encode(msg_header+msg.content); log(LOG_DEBUG,'Loaded frame: ['+this.frame+']['+this.index+'] ('+this.page+')'); @@ -247,8 +247,16 @@ PageFrame.prototype.loadMessage = function(page) { * should apply for that field. * * @param text + * @param context */ -PageFrame.prototype.parse = function(text) { +PageFrame.prototype.parse = function(text,context) { + log(LOG_DEBUG,'Parsing Frame ...'); + + if (this.type === FRAME_TYPE_MESSAGE) { + log(LOG_DEBUG,'- Not parsing message frame'); + return text; + } + /** Column * @type {number} */ @@ -394,13 +402,16 @@ PageFrame.prototype.parse = function(text) { break; // X - dynamic fields, terminated with ESC + // Dynamic fields are defined with ESC X FIELD;LENGTH;PAD ESC \ + // @note FIELD & LENGTH are required + // @note Dynamic field is can only be DYNAMIC_FIELD_SIZE_MAX chars in size case 'X': - //log(LOG_DEBUG,'PU ['+r+'x'+c+'] '+advance); + //log(LOG_DEBUG,'DF ['+r+'x'+c+'] '+advance); advance++; - // Find our end ST param in the next 50 chars - matches = text.substr(p+advance,50).match(/(([a-z]+;[0-9]+)([;]?.+)?)\x1b\\/); - //log(LOG_DEBUG,'PU ['+r+'x'+c+'] ADVANCE: '+advance+', MATCHES: '+JSON.stringify(matches)+', LENGTH: '+(matches ? matches[0].length : 0)+', STRING: '+text.substr(p+advance,50)); + // Find our end ST param in the next DYNAMIC_FIELD_SIZE_MAX chars + matches = text.substr(p+advance,DYNAMIC_FIELD_SIZE_MAX).match(/(([a-zA-Z._^;]+[0-9]?;-?[0-9^;]+)([;]?[^;]+)?)\x1b\\/); + //log(LOG_DEBUG,'- DF ['+r+'x'+c+'] ADVANCE: '+advance+', MATCHES: '+JSON.stringify(matches)+', LENGTH: '+(matches ? matches[0].length : 0)+', STRING: '+text.substr(p+advance,50)); if (! matches) { chars += nextbyte; @@ -410,14 +421,13 @@ PageFrame.prototype.parse = function(text) { advance += matches[0].length-1; - var pu = matches[0].substr(0,matches[0].length-2).split(';'); - //log(LOG_DEBUG,'PU ['+r+'x'+c+'] ADVANCE: '+advance+', PU: '+pu); + var df = matches[0].substr(0,matches[0].length-2).split(';'); + //log(LOG_DEBUG,'- DF ['+r+'x'+c+'] ADVANCE: '+advance+', DF: '+df); - chars = renderfield(pu[0],pu[1]); + log(LOG_DEBUG,'- DF found at ['+r+'x'+(c-1)+'], Field: '+df[0]+', Length: '+df[1]+', Attrs: '+JSON.stringify({i:i,f:f,b:b})); + chars = atcode(df[0],df[1],df[2],context); byte = ''; - log(LOG_DEBUG,'PU Field found at ['+r+'x'+(c-1)+'], Field: '+pu[0]+', Length: '+pu[1]+', Attrs: '+JSON.stringify({i:i,f:f,b:b})); - break; // _ - has our fields that take input @@ -528,12 +538,5 @@ PageFrame.prototype.parse = function(text) { */ } - // Convert any atcodes - output = output.replace(/@(.*)@/g, - function (str, code, offset, s) { - return bbs.atcode(code); - } - ); - return output; }; diff --git a/load/funcs.js b/load/funcs.js index 4608b22..aeada19 100644 --- a/load/funcs.js +++ b/load/funcs.js @@ -104,6 +104,58 @@ function ans2bin(ansi,frame) { } } +// Dynamic Field Processing +// @note bbs.atcodes() cannot process modifiers, so this function is a replacement. +function atcode(field,length,pad,context) { + 'use strict'; + + length = length ? length : field.length; + pad = pad ? pad : ' '; + var result = ''; + + switch(field) { + // Get the ECHOAREA FTN AREA_TAG + case 'areatag': + if (typeof context !== 'object') { + log(LOG_ERROR,'Unable to render ['+field+'], no context provided'); + break; + } + + result = context.msgbase.cfg.area_tag; + break; + + // Get the ECHOAREA Description + case 'areadesc': + if (typeof context !== 'object') { + log(LOG_ERROR,'Unable to render ['+field+'], no context provided'); + break; + } + + result = context.msgbase.cfg.description; + break; + + case 'nodeid': + result = getNodeID(); + break; + + default: + result = bbs.atcode(field); + + if (result === null) + result = ''; + } + + log(LOG_DEBUG,' - result length ['+result.length+'] desired ('+length+')'); + if (result.length < Math.abs(length)) + result = (length < 0) ? padright(result,Math.abs(length),pad) : padleft(result,length,pad); + else if (result.length > Math.abs(length)) + result = result.substr(0,Math.abs(length)); + + log(LOG_DEBUG,'- ATCODE ['+field+'] ('+length+'|"'+pad+'") returns ['+result+']'); + + return result; +} + /** * Find a message base by code * @@ -164,7 +216,7 @@ function getNodeID() { } } - return pad(matches[0],3)+pad(matches[1],3)+pad(bbs.node_num,2); + return padleft(matches[0],3,'0')+padleft(matches[1],3,'0')+padleft(bbs.node_num,2,'0'); } function getPageOwners() { @@ -228,11 +280,18 @@ function msgBaseImport(msgbase,page,text) { return msgbase.save_msg(hdr, body); } -// Pad a number with zeros -function pad(n, width, z) { - z = z || '0'; +// Right Pad a string with char c +function padright(n,width,c) { + c = c || '0'; n = n + ''; - return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; + return n.length >= width ? n : new Array(width - n.length + 1).join(c) + n; +} + +// Left Pad a string with char c +function padleft(n,width,c) { + c = c || '0'; + n = n + ''; + return n.length >= width ? n : n+new Array(width - n.length + 1).join(c); } /** @@ -314,20 +373,6 @@ function pageEditor(page) { return pageditor; } -function renderfield(field,length) { - switch (field) { - case 'nodeid': - result = getNodeID(); - } - - if (result.length < length) - result += ' '.repeat(length-result.length); - else if (result.length > length) - result = result.substr(0,length); - - return result; -} - /** * This function returns a list of zones used by this system. */ diff --git a/load/msgbases.js b/load/msgbases.js index 34a464e..d0ccee6 100644 --- a/load/msgbases.js +++ b/load/msgbases.js @@ -230,17 +230,30 @@ MsgArea.prototype.tag_msgs = function() { return true; } -MsgAreas.prototype.getMessage = function(page) { - if (page === undefined) +MsgAreas.prototype.getArea = function(area) { + log(LOG_DEBUG,'- AREA:'+JSON.stringify(area)); + if (area === undefined) return undefined; - var zone = page.substr(0,4); - var echo = page.substr(4,2); - var page = page.substr(6); + var zone = (''+area).substr(1,4); + var echo = (''+area).substr(5,2); + log(LOG_DEBUG,' - zone:'+JSON.stringify(zone)); + log(LOG_DEBUG,' - echo:'+JSON.stringify(echo)); - area = this.areas.filter(function(x) { + return this.areas.filter(function(x) { return x.zone_id === zone && x.area_id === echo; })[0] - - return area ? area.getMessage(page) : undefined; +} + +MsgAreas.prototype.getMessage = function(page) { + var area = this.getArea(page); + log(LOG_DEBUG,' - msg:'+JSON.stringify(page.substr(7,4))); + + return area ? area.getMessage(page.substr(7,4)) : undefined; +} + +MsgAreas.prototype.getUserStats = function(page) { + var area = this.getArea(page); + + return area ? msg_area.grp_list[area.msgbase.cfg.grp_number].sub_list[msg_area.sub[area.msgbase.cfg.code].index] : undefined; } diff --git a/main.js b/main.js index 3de87e5..a279e1a 100644 --- a/main.js +++ b/main.js @@ -880,7 +880,8 @@ while(bbs.online) { // GO Backwards case ACTION_BACKUP: - // Do we have anywhere to go, drop the current page from the history. + log(LOG_DEBUG,'- ACTION_BACKUP: history size - '+history.length+' with ['+history.join('|')+']'); + // Do we have anywhere to go, drop the current page from the history if (history.length > 1) history.pop(); @@ -888,7 +889,7 @@ while(bbs.online) { next_page = (history.length > 0) ? history[history.length-1] : null; - log(LOG_DEBUG,'- ACTION_BACKUP: Backing up to ['+(next_page ? pageStr(next_page) : '')+'] current ['+fo.page+']'); + log(LOG_DEBUG,'- ACTION_BACKUP: Backing up to ['+JSON.stringify(next_page)+'] current ['+fo.page+']'); // If there is no next page, we'll ignore the request. if (! next_page || (pageStr(next_page) === fo.page)) { @@ -902,22 +903,55 @@ while(bbs.online) { var current = null; // For logged in users, we'll see if this is a mail page. - // @todo consider how we do mail security. - // 1zzzzEEnnnn - if (user.number && /^1[0-9]{10}/.test(next_page.frame)) { - log(LOG_DEBUG,'- ACTION_GOTO - load message: ['+next_page.frame+']'); + if (user.number) { + // @todo consider how we do mail security. - require('ansitex/load/control-echomail.js','CONTROL_ECHOMAIL'); - control.push(new echomail((''+next_page.frame).substr(1))); - action = false; - log(LOG_DEBUG,'- ACTION_GOTO - control message: ['+JSON.stringify(control[control.length-1])+'] ('+control.length+')'); + // Echoarea mail summary + if (/^1[0-9]{6}1$/.test(next_page.frame)) { + log(LOG_DEBUG,'- ACTION_GOTO - load echoarea summary: ['+next_page.frame+']'); - if (! control[control.length-1].ready()) { - control.pop(); - fo.sendBaseline('ERR_ROUTE',false); - mode = action = false; + to = viewdata ? new FrameViewdata() : new FrameAnsi(); + // @todo look for a template in the area or group first + to.load(MAIL_TEMPLATE_AREA_SUMMARY); + + // If the template page doesnt exist + if (! to.content) { + fo.sendBaseline('ERR_ROUTE',false); + mode = action = false; + break; + } + + current = fo; + var ma = new MsgAreas(); + fo = viewdata ? new FrameViewdata() : new FrameAnsi(); + fo.frame = next_page.frame; + fo.index = next_page.index; + fo.content = to.content; + fo.isPublic = true; + fo.isAccessible = to.isAccessible; + fo.owner = to.owner; + fo.type = to.type; + + log(LOG_DEBUG,'USER:'+JSON.stringify(ma.getUserStats((''+next_page.frame).substr(1,6)),null,"\r")); + next_page = null; + + // 1zzzzEEnnnn - get a message + } else if (/^1[0-9]{10}/.test(next_page.frame)) { + log(LOG_DEBUG,'- ACTION_GOTO - load message: ['+next_page.frame+']'); + + require('ansitex/load/control-echomail.js','CONTROL_ECHOMAIL'); + control.push(new echomail((''+next_page.frame).substr(1))); + action = false; + log(LOG_DEBUG,'- ACTION_GOTO - control message: ['+JSON.stringify(control[control.length-1])+'] ('+control.length+')'); + + if (! control[control.length-1].ready()) { + control.pop(); + fo.sendBaseline('ERR_ROUTE',false); + mode = action = false; + } + + next_page = null; } - break; } if (next_page !== null) { @@ -937,6 +971,8 @@ while(bbs.online) { mode = action = false; break; } + + next_page = null; } // If the user has access to the frame @@ -959,16 +995,14 @@ while(bbs.online) { log(LOG_DEBUG,'- ACTION_GOTO: next_page ['+JSON.stringify(next_page)+'] last history ['+JSON.stringify(history[history.length-1])+']'); // Record our history - if (next_page && (! history.length || (pageStr(history[history.length-1]) !== pageStr(next_page))) && (fo.type !== FRAME_TYPE_LOGIN)) { + if ((! history.length || (pageStr(history[history.length-1]) !== fo.page)) && (fo.type !== FRAME_TYPE_LOGIN)) { // Ignore the login frames - if (NO_HISTORY_FRAMES.indexOf(pageStr(next_page)) === -1) { - history.push(next_page); - log(LOG_DEBUG,'- ACTION_GOTO: Added to history ['+(next_page ? pageStr(next_page) : '')+'] now ['+history.length+']'); + if (NO_HISTORY_FRAMES.indexOf(fo.page) === -1) { + history.push({frame:fo.frame,index:fo.index}); + log(LOG_DEBUG,'- ACTION_GOTO: Added to history ['+fo.page+'] now ['+history.length+']'); } } - next_page = null; - // Load frame case ACTION_RELOAD: log(LOG_DEBUG,'- ACTION_RELOAD: ['+(next_page ? pageStr(next_page) : '')+']'); @@ -983,6 +1017,17 @@ while(bbs.online) { bbs.node_action=NODE_MAIN; switch(fo.type) { + // Terminate frame + case FRAME_TYPE_MAIL_TEMPLATE: + log(LOG_DEBUG,'- MAIL_TEMPLATE: ['+fo.frame+']'); + //log(LOG_DEBUG,' - '+JSON.stringify(ma.getArea(fo.frame))); + fo.render(ma.getArea(fo.frame)); + mode = false; + action = false; + ma = undefined; + + break; + // Terminate frame case FRAME_TYPE_TERMINATE: fo.render(); diff --git a/text/98a.tex b/text/98a.tex index 9f95d74..de7a8fd 100644 --- a/text/98a.tex +++ b/text/98a.tex @@ -1 +1 @@ -{"version":1,"frame":98,"index":"a","owner":9,"cost":0,"content":"G1swbRtbNzFDG1sxOzMybRtYbm9kZWlkOzgbXBtbMG0NChtbNTVDG1sxbUBEQVRFVElNRUAbWzBtDQobWzIyQxtbMW3aIL/Cv7Pav9q/2sK/wr8gwy3avxtbMG0NChtbMjJDs7Ozw9mzsyCzs7Mgs8PZILMgs7MNChtbMjJDG1sxOzMwbcDB2cHZwMDZwNnAINnB2SDA2cDZIPr6+htbMG0NChtbMjJDG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0NChtbMjNDG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbQ0KG1syM0MbWzE7MzFt3NzEsRtbMzdtIBtbMzJtsrEbWzM3bSAbWzMybbEbWzM3bSAbWzM0bd/fxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSCyscQgILKxxN8g39/C3yAbWzM3OzQwbQ0KG1syM0MbWzE7MzFtsbAbWzBtIBtbMTszMW2wG1swbSAbWzE7MzJtsbAbWzBtIBtbMTszMm2wG1swbSAbWzE7MzRtsbAbWzBtIBtbMTszNG2wG1swbSAbWzE7MzNtsbAbWzBtIBtbMzA7NDdtILGwILAgsbAgsCCxsCCwIBtbMzc7NDBtDQobWzIzQxtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbQ0KG1syMkMbWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbQ0KG1s0QxtbMW0uICAgICAuICAgG1szMG2zG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KG1syQxtbMW3av7/Cv9q/IL/avxtbMG0gG1sxOzMwbbMbWzBtIBtbMTszMW1VU0VSOhtbMG0gG1sxbRtfVVNFUjsyNXQ7+RtcG1swbSAgICAgICAgICAgICAgICAbWzE7MzBtsxtbMG0NChtbMkPAv7Ozs7OzILOzsyAbWzE7MzBtsxtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzE7MzBtsxtbMG0NChtbMkMbWzE7MzBtwNnZwbTZ2RtbMzdtIBtbMzBt2dnZG1szN20gG1szMG2zG1swbSAbWzE7MzFtUEFTUzobWzBtIBtbMW0bX1BBU1M7NDBwO/kbXBtbMG0gG1sxOzMwbbMbWzBtDQobWzVDG1sxOzMwbcTZG1swbSAgICAgICAbWzE7MzBtsxtbMG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzE7MzBtsxtbMG0NCg0KDQoNCg0KG1sxM0MbWzE7MzBtVG8gcmVnaXN0ZXIgYW4gYWNjb3VudCBlbnRlchtbMG0gG1sxbU5FVxtbMG0gG1sxOzMwbWZvciB0aGUgdXNlciBuYW1lG1swbQ0KG1sxNkMbWzE7MzBtVXNlG1swbSAbWzE7MzJtKiobWzBtIBtbMTszMG10byBjbGVhciB5b3VyIGlucHV0G1swbSAbWzE7MzJtKjAwG1swbSAbWzE7MzBtdG8gc3RhcnQgYWdhaW4bWzBtDQo=","isPublic":1,"isAccessible":1,"type":"l","key":[null,"login",null,null,null,null,null,null,null,null],"date":"2020-07-08T05:17:35.174Z"} +{"version":1,"frame":98,"index":"a","owner":9,"cost":0,"content":"G1swbRtbNzFDG1sxOzMybRtYbm9kZWlkOzgbXBtbMG0NChtbNTVDG1sxbRtYREFURVRJTUU7MjQbXBtbMG0NChtbMjJDG1sxbdogv8K/s9q/2r/awr/CvyDDLdq/G1swbQ0KG1syMkOzs7PD2bOzILOzsyCzw9kgsyCzsw0KG1syMkMbWzE7MzBtwMHZwdnAwNnA2cAg2cHZIMDZwNkg+vr6G1swbQ0KG1syMkMbWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbQ0KG1syM0MbWzE7MzFt3NzE3BtbMzdtIBtbMzJt3NzE3BtbMzdtIBtbMzRt3NzE3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtINzcICAg3NzE3CDc3CDcIBtbMzc7NDBtDQobWzIzQxtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtDQobWzIzQxtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0NChtbMjNDG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtDQobWzIyQxtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQobWzRDG1sxbS4gICAgIC4gICAbWzMwbbMbWzBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxOzMwbbMbWzBtDQobWzJDG1sxbdq/v8K/2r8gv9q/G1swbSAbWzE7MzBtsxtbMG0gG1sxOzMxbVVTRVI6G1swbSAbWzFtG19VU0VSOzI1dDv5G1wbWzBtICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KG1syQ8C/s7Ozs7Mgs7OzIBtbMTszMG2zG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KG1syQxtbMTszMG3A2dnBtNnZG1szN20gG1szMG3Z2dkbWzM3bSAbWzMwbbMbWzBtIBtbMTszMW1QQVNTOhtbMG0gG1sxbRtfUEFTUzs0MHA7+RtcG1swbSAbWzE7MzBtsxtbMG0NChtbNUMbWzE7MzBtxNkbWzBtICAgICAgIBtbMTszMG2zG1swbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszMG2zG1swbQ0KDQoNCg0KDQobWzEzQxtbMTszMG1UbyByZWdpc3RlciBhbiBhY2NvdW50IGVudGVyG1swbSAbWzFtTkVXG1swbSAbWzE7MzBtZm9yIHRoZSB1c2VyIG5hbWUbWzBtDQobWzE2QxtbMTszMG1Vc2UbWzBtIBtbMTszMm0qKhtbMG0gG1sxOzMwbXRvIGNsZWFyIHlvdXIgaW5wdXQbWzBtIBtbMTszMm0qMDAbWzBtIBtbMTszMG10byBzdGFydCBhZ2FpbhtbMG0NCg==","isPublic":1,"isAccessible":1,"type":"l","key":[null,"login",null,null,null,null,null,null,null,null],"date":"2020-07-08T05:17:35.174Z"} diff --git a/text/98b.tex b/text/98b.tex index 3616b8d..060027a 100644 --- a/text/98b.tex +++ b/text/98b.tex @@ -1 +1 @@ -{"version":1,"frame":98,"index":"b","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQogG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbSAgIBtbMW3aIL/Cv7Pav9q/2sK/wr8bWzBtICAgICAgICAgICAbWzE7MzBtQERBVEVUSU1FfEwxNUAbWzBtDQogG1sxOzMxbdzcxLEbWzM3bSAbWzMybbKxG1szN20gG1szMm2xG1szN20gG1szNG3f38TcG1szN20gG1szM23c3BtbMG0gG1szMDs0N20gsrHEICCyscTfIN/fwt8gG1szNzs0MG0gICCzs7PD2bOzILOzsyCzw9kgICAgICAgICAgICAgICAgICAbWzE7MzBtQFRJTUV8TDhAG1swbQ0KIBtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0gICAbWzE7MzBtwMHZwdnAwNnA2cAg2cHZG1swbQ0KIBtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0bWzI0QxtbMTszMDs0MW3fG1szNzs0MG0gG1szMDs0MW3fG1szNzs0MG0gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1szNzs0MG0gG1szMDs0MW3fG1s0MG3fG1szMW3cG1szN20gG1szMDs0MW3fG1s0MG3f3xtbMzdtIBtbMzA7NDFt3xtbNDBt3xtbNDFt3xtbMG0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxOzVtIBtbMDsxOzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzQwbd8gIBtbNDFt3BtbNDBt39wbWzBtDQogV2VsY29tZSAbWzFtQE1FTU8yLUwyMEAbWzA7MzBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszN23f398g3yDfIN/fICDf398g3yDfG1swbQ0KIFlvdSd2ZSByZWFjaGVkIBtbMTszMW1BG1szMm1OG1szNG1TG1szM21JG1swOzMwOzQ3bXRleBtbMzc7NDBtIG9uICAgICAgICAbWzE7MzA7NDFt3xtbNDBt398bWzM3bSAbWzMwOzQxbd8bWzQwbd8bWzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd8bWzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd/fG1szN20gG1szMG3f3xtbNDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbNDBt3xtbNDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbNDBt398bWzM3bSAbWzMwbd/fG1s0MW3fG1szNzs0MG0gG1szMG3fG1szN20gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1szNzs0MG0gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1swbQ0KIG5vZGUgG1sxbRtYbm9kZWlkOzgbXBtbMG0uICAgICAgICAgICAgICAgICAgIBtbMTszMTs0MW3cG1szNzs0MG0gICAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxbd/fG1s0MW3cG1szNzs0MG0gICAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzQwbd/cG1szN20gG1szMTs0MW3cG1szNzs0MG0gG1szMTs0MW3cG1szNzs0MG0gG1szMTs0MW3cG1swbSAgICAgG1sxOzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzQwbSAbWzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzBtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxbd/f3yDf398g3yDfIN/f3yAgIN8g3yDfIN/f3yDf398gICDfIN8g39/fIN8g3xtbMG0NCiBUaGVyZSBhcmUgG1sxbUBPTi1aMkAbWzBtIG90aGVycyBvbmxpbmUgYXMgICAgG1sxOzMxbVBsZWFzZSBiZSBwYXRpZW50IHdoaWxlIHdlG1swbQ0KIHdlbGwgYW5kIBtbMW0wMBtbMG0gbmV3IHVzZXJzIHRvZGF5LiAgICAgICAgICAgICAgICAgICAgG1sxOzMxbWlubm92YXRlIGFuZCBpcm9uIG91dCB0aGUgYnVncxtbMG0NCg0KIFlvdSBoYXZlIBtbMW1AQllURVNMRUZUQBtbMG0gY3JlZGl0cyBsZWZ0DQogYW5kIBtbMW1ATUFJTFdAIBtbMG1tZXNzYWdlcyBpbiB5b3VyIG1haWxib3guDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzFtUHJlc3MbWzBtIBtbMTs1OzMybTAbWzA7MTszM20gG1szN21NYWluIE1lbnUbWzBtDQoNCg==","isPublic":0,"isAccessible":1,"type":"i","key":[1,null,null,null,null,null,null,null,null,null],"date":"2020-07-08T01:30:48.608Z"} +{"version":1,"frame":98,"index":"b","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQogG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbSAgIBtbMW3aIL/Cv7Pav9q/2sK/wr8bWzBtICAgICAgICAgICAbWzE7MzBtG1hEQVRFVElNRTsxNRtcG1swbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtICAgs7Ozw9mzsyCzs7Mgs8PZICAgICAgICAgICAgICAgICAgG1sxOzMwbRtYVElNRTs4G1wbWzBtDQogG1sxOzMxbbGwG1swbSAbWzE7MzFtsBtbMG0gG1sxOzMybbGwG1swbSAbWzE7MzJtsBtbMG0gG1sxOzM0bbGwG1swbSAbWzE7MzRtsBtbMG0gG1sxOzMzbbGwG1swbSAbWzMwOzQ3bSCxsCCwILGwILAgsbAgsCAbWzM3OzQwbSAgIBtbMTszMG3AwdnB2cDA2cDZwCDZwdkbWzBtDQogG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtDQobWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbRtbMjRDG1sxOzMwOzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd8bWzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd8bWzMxbdwbWzM3bSAbWzMwOzQxbd8bWzQwbd/fG1szN20gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1swbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzE7NW0gG1swOzE7MzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbMzc7NDBtIBtbMzE7NDFt3BtbNDBt3yAgG1s0MW3cG1s0MG3f3BtbMG0NCiBXZWxjb21lIBtbMW0bWFJFQUxOQU1FOzIwG1wbWzA7MzBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBtbMTszN23f398g3yDfIN/fICDf398g3yDfG1swbQ0KIFlvdSd2ZSByZWFjaGVkIBtbMTszMW1BG1szMm1OG1szNG1TG1szM21JG1swOzMwOzQ3bXRleBtbMzc7NDBtIG9uICAgICAgICAbWzE7MzA7NDFt3xtbNDBt398bWzM3bSAbWzMwOzQxbd8bWzQwbd8bWzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd8bWzQxbd8bWzM3OzQwbSAbWzMwOzQxbd8bWzQwbd/fG1szN20gG1szMG3f3xtbNDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbNDBt3xtbNDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbMzc7NDBtIBtbMzA7NDFt3xtbNDBt398bWzM3bSAbWzMwbd/fG1s0MW3fG1szNzs0MG0gG1szMG3fG1szN20gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1szNzs0MG0gG1szMDs0MW3fG1s0MG3fG1s0MW3fG1swbQ0KIG5vZGUgG1sxbRtYbm9kZWlkOzgbXBtbMG0uICAgICAgICAgICAgICAgICAgIBtbMTszMTs0MW3cG1szNzs0MG0gICAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxbd/fG1s0MW3cG1szNzs0MG0gICAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzQwbd/cG1szN20gG1szMTs0MW3cG1szNzs0MG0gG1szMTs0MW3cG1szNzs0MG0gG1szMTs0MW3cG1swbSAgICAgG1sxOzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzQwbSAbWzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzM3OzQwbSAbWzMxOzQxbdwbWzBtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxbd/f3yDf398g3yDfIN/f3yAgIN8g3yDfIN/f3yDf398gICDfIN8g39/fIN8g3xtbMG0NCiBUaGVyZSBhcmUgG1sxbRtYT047MhtcG1swbSBvdGhlcnMgb25saW5lIGFzICAgIBtbMTszMW1QbGVhc2UgYmUgcGF0aWVudCB3aGlsZSB3ZRtbMG0NCiB3ZWxsIGFuZCAbWzFtG1hTVEFUUy5OVVNFUlM7MhtcG1swbSBuZXcgdXNlcnMgdG9kYXkuICAgICAgICAgICAgICAgICAgICAbWzE7MzFtaW5ub3ZhdGUgYW5kIGlyb24gb3V0IHRoZSBidWdzG1swbQ0KDQogWW91IGhhdmUgG1sxbRtYQllURVNMRUZUOy0xMBtcG1swbSBjcmVkaXRzIGxlZnQNCiBhbmQgG1sxbRtYTUFJTFc7LTMbXCAbWzBtbWVzc2FnZXMgaW4geW91ciBtYWlsYm94Lg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgG1sxbVByZXNzG1swbSAbWzE7NTszMm0wG1swOzE7MzNtIBtbMzdtTWFpbiBNZW51G1swbQ0KDQo=","isPublic":0,"isAccessible":1,"type":"i","key":[1,null,null,null,null,null,null,null,null,null],"date":"2020-07-08T01:30:48.608Z"} diff --git a/text/998a.tex b/text/998a.tex index 63d447f..06439e2 100644 --- a/text/998a.tex +++ b/text/998a.tex @@ -1 +1 @@ -{"version":1,"frame":998,"index":"a","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQogG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtDQogG1sxOzMxbbGwG1swbSAbWzE7MzFtsBtbMG0gG1sxOzMybbGwG1swbSAbWzE7MzJtsBtbMG0gG1sxOzM0bbGwG1swbSAbWzE7MzRtsBtbMG0gG1sxOzMzbbGwG1swbSAbWzMwOzQ3bSCxsCCwILGwILAgsbAgsCAbWzM3OzQwbQ0KIBtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0NCg0KG1sxbUhtbSwgYSBzeXN0ZW0gG1szMW1FUlJPUhtbMzdtIG9jY3VycmVkLhtbMG0NChtbMW1Ob2RlICA6IBtbMzFtG1hub2RlaWQ7OBtcG1swbQ0KG1sxbVN5c3RlbTogG1szMW1AQkJTLUwxMEAbWzBtDQoNChtbMW1JZiB0aGlzIGtlZXBzIGhhcHBlbmluZywgeW91IG1heSBuZWVkIHRvIHRlbGwgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yG1swbQ0KG1sxbXZpYSBwYWdlIBtbMzJtKjA4G1swbQ0KDQobWzFtVG8gdHJ5IGFnYWluLCBwbGVhc2UgcHJlc3MgG1szMm0wG1swbQ0K","isPublic":1,"isAccessible":1,"type":"i","key":[0,null,null,null,null,null,null,null,null,null],"date":"2021-02-18T00:52:54.117Z"} +{"version":1,"frame":998,"index":"a","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtDQogG1sxOzMxbdzcxNwbWzM3bSAbWzMybdzcxNwbWzM3bSAbWzM0bdzcxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSDc3CAgINzcxNwg3Nwg3CAbWzM3OzQwbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtDQogG1sxOzMxbbGwG1swbSAbWzE7MzFtsBtbMG0gG1sxOzMybbGwG1swbSAbWzE7MzJtsBtbMG0gG1sxOzM0bbGwG1swbSAbWzE7MzRtsBtbMG0gG1sxOzMzbbGwG1swbSAbWzMwOzQ3bSCxsCCwILGwILAgsbAgsCAbWzM3OzQwbQ0KIBtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0NCg0KG1sxbUhtbSwgYSBzeXN0ZW0gG1szMW1FUlJPUhtbMzdtIG9jY3VycmVkLhtbMG0NChtbMW1Ob2RlICA6IBtbMzFtG1hub2RlaWQ7OBtcG1swbQ0KG1sxbVN5c3RlbTogG1szMW0bWEJCUzsxMBtcG1swbQ0KDQobWzFtSWYgdGhpcyBrZWVwcyBoYXBwZW5pbmcsIHlvdSBtYXkgbmVlZCB0byB0ZWxsIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRvchtbMG0NChtbMW12aWEgcGFnZSAbWzMybSowOBtbMG0NCg0KG1sxbVRvIHRyeSBhZ2FpbiwgcGxlYXNlIHByZXNzIBtbMzJtMBtbMG0NCg==","isPublic":1,"isAccessible":1,"type":"i","key":[0,null,null,null,null,null,null,null,null,null],"date":"2021-02-18T00:52:54.117Z"} diff --git a/text/99a.tex b/text/99a.tex index 00fb8de..e99db0f 100644 --- a/text/99a.tex +++ b/text/99a.tex @@ -1 +1 @@ -{"version":1,"frame":99,"index":"a","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtICAgICAgICAgG1sxbdq/G1swbQ0KIBtbMTszMW3c3MTcG1szN20gG1szMm3c3MTcG1szN20gG1szNG3c3MTcG1szN20gG1szM23c3BtbMG0gG1szMDs0N20g3NwgICDc3MTcINzcINwgG1szNzs0MG0gICAbWzFtwr/av9q/2rTDv7/awr8bWzBtICAgICAgICAgICAgG1sxOzMwbUBEQVRFVElNRXxMMTVAG1swbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtICAgs7Ozs7Ozs7Ozs7Ozw9kgICAgICAgICAgICAgICAgICAgG1sxOzMwbUBUSU1FfEw4QBtbMG0NCiAbWzE7MzFtsbAbWzBtIBtbMTszMW2wG1swbSAbWzE7MzJtsbAbWzBtIBtbMTszMm2wG1swbSAbWzE7MzRtsbAbWzBtIBtbMTszNG2wG1swbSAbWzE7MzNtsbAbWzBtIBtbMzA7NDdtILGwILAgsbAgsCCxsCCwIBtbMzc7NDBtICAgG1sxOzMwbcG0wNnA2cDZwNnAtMHZG1swbQ0KIBtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbSAgIBtbMTszMG3E2RtbMzFtICAgICAgICAbWzMwbcTZG1swbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0gICAgICAgICAgIBtbMTs1OzMybSowIxtbMDsxbSB0byBnZXQgYmFjayB0byB0aGUgTWFpbiBNZW51G1swbQ0KDQogIFRoYW5rcyBmb3IgdmlzaXRpbmcgG1sxOzMxbUEbWzMybU4bWzM0bVMbWzMzbUkbWzA7MzA7NDdtdGV4G1szNzs0MG0gG1sxbUBNRU1PMi1MMjBAG1swbQ0KICBZb3Ugd2VyZSBvbiBub2RlIBtbMW0bWG5vZGVpZDs4G1wgG1swbXByb3ZpZGVkIGJ5IBtbMW1AQkJTLUwxMEAbWzBtDQogIHdpdGggG1sxbUBTVEFUUy5MVE9EQVktWjJAG1swbSBvdGhlcnMuDQoNCiAgWW91IGhhdmUgG1sxbUBCWVRFU0xFRlRAG1swbSBjcmVkaXRzIGxlZnQgYW5kIBtbMW1ATUFJTFdAIBtbMG1tZXNzYWdlcyBpbiB5b3VyIG1haWxib3guDQogIFRvZGF5IHlvdSd2ZSBiZWVuIG9uIGZvciAbWzFtQFNUQVRTLlRUT0RBWS1aMkAbWzBtIG1pbnV0ZXMuDQoNCiAgG1sxbVByZXNzG1swbSAbWzE7NTszMm0jG1swOzE7MzNtIBtbMzdtdG8gZGlzY29ubmVjdC4bWzBtDQo=","isPublic":1,"isAccessible":1,"type":"i","key":[0,null,null,null,null,null,null,null,null,null],"date":"2020-07-15T12:15:47.742Z"} +{"version":1,"frame":99,"index":"a","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtICAgICAgICAgG1sxbdq/G1swbQ0KIBtbMTszMW3c3MTcG1szN20gG1szMm3c3MTcG1szN20gG1szNG3c3MTcG1szN20gG1szM23c3BtbMG0gG1szMDs0N20g3NwgICDc3MTcINzcINwgG1szNzs0MG0gICAbWzFtwr/av9q/2rTDv7/awr8bWzBtICAgICAgICAgICAgG1sxOzMwbRtYREFURVRJTUU7MTUbXBtbMG0NCiAbWzE7MzFt3NzEsRtbMzdtIBtbMzJtsrEbWzM3bSAbWzMybbEbWzM3bSAbWzM0bd/fxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSCyscQgILKxxN8g39/C3yAbWzM3OzQwbSAgILOzs7Ozs7Ozs7Ozs8PZICAgICAgICAgICAgICAgICAgIBtbMTszMG0bWFRJTUU7OBtcG1swbQ0KIBtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0gICAbWzE7MzBtwbTA2cDZwNnA2cC0wdkbWzBtDQogG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtICAgG1sxOzMwbcTZG1szMW0gICAgICAgIBtbMzBtxNkbWzBtDQobWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbSAgICAgICAgICAgG1sxOzU7MzJtKjAjG1swOzFtIHRvIGdldCBiYWNrIHRvIHRoZSBNYWluIE1lbnUbWzBtDQoNCiAgVGhhbmtzIGZvciB2aXNpdGluZyAbWzE7MzFtQRtbMzJtThtbMzRtUxtbMzNtSRtbMDszMDs0N210ZXgbWzM3OzQwbSAbWzFtG1hSRUFMTkFNRTsyMBtcG1swbQ0KICBZb3Ugd2VyZSBvbiBub2RlIBtbMW0bWG5vZGVpZDs4G1wgG1swbXByb3ZpZGVkIGJ5IBtbMW0bWEJCUzsxMBtcG1swbQ0KICB3aXRoIBtbMW0bWFNUQVRTLkxUT0RBWTsyG1wbWzBtIG90aGVycy4NCg0KICBZb3UgaGF2ZSAbWzFtG1hCWVRFU0xFRlQ7LTEwG1wbWzBtIGNyZWRpdHMgbGVmdCBhbmQgG1sxbRtYTUFJTFc7LTMbXCAbWzBtbWVzc2FnZXMgaW4geW91ciBtYWlsYm94Lg0KICBUb2RheSB5b3UndmUgYmVlbiBvbiBmb3IgG1sxbRtYU1RBVFMuVFRPREFZOy0zG1wbWzBtIG1pbnV0ZXMuDQoNCiAgG1sxbVByZXNzG1swbSAbWzE7NTszMm0jG1swOzE7MzNtIBtbMzdtdG8gZGlzY29ubmVjdC4bWzBtDQo=","isPublic":1,"isAccessible":1,"type":"i","key":[0,null,null,null,null,null,null,null,null,null],"date":"2020-07-15T12:15:47.742Z"} diff --git a/text/99b.tex b/text/99b.tex index ac521e9..c37f5ea 100644 --- a/text/99b.tex +++ b/text/99b.tex @@ -1 +1 @@ -{"version":1,"frame":99,"index":"b","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtICAgICAgICAgG1sxbdq/G1swbQ0KIBtbMTszMW3c3MTcG1szN20gG1szMm3c3MTcG1szN20gG1szNG3c3MTcG1szN20gG1szM23c3BtbMG0gG1szMDs0N20g3NwgICDc3MTcINzcINwgG1szNzs0MG0gICAbWzFtwr/av9q/2rTDv7/awr8bWzBtICAgICAgICAgICAgG1sxOzMwbUBEQVRFVElNRXxMMTVAG1swbQ0KIBtbMTszMW3c3MSxG1szN20gG1szMm2ysRtbMzdtIBtbMzJtsRtbMzdtIBtbMzRt39/E3BtbMzdtIBtbMzNt3NwbWzBtIBtbMzA7NDdtILKxxCAgsrHE3yDf38LfIBtbMzc7NDBtICAgs7Ozs7Ozs7Ozs7Ozw9kgICAgICAgICAgICAgICAgICAgG1sxOzMwbUBUSU1FfEw4QBtbMG0NCiAbWzE7MzFtsbAbWzBtIBtbMTszMW2wG1swbSAbWzE7MzJtsbAbWzBtIBtbMTszMm2wG1swbSAbWzE7MzRtsbAbWzBtIBtbMTszNG2wG1swbSAbWzE7MzNtsbAbWzBtIBtbMzA7NDdtILGwILAgsbAgsCCxsCCwIBtbMzc7NDBtICAgG1sxOzMwbcG0wNnA2cDZwNnAtMHZG1swbQ0KIBtbMTszMW3f38TfG1swbSAbWzE7MzJt398bWzBtIBtbMTszMm3fG1swbSAbWzE7MzRt39/E3xtbMG0gG1sxOzMzbd/fG1swbSAbWzMwOzQ3bSDf38TfIN/fxN8g398g3yAbWzM3OzQwbSAgIBtbMTszMG3E2RtbMzFtICAgICAgICAbWzMwbcTZG1swbQ0KG1sxOzMwbcTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExBtbMG0NCg0KICBUaGFua3MgZm9yIHZpc2l0aW5nIBtbMTszMW1BG1szMm1OG1szNG1TG1szM21JG1swOzMwOzQ3bXRleBtbMzc7NDBtIBtbMW1ATUVNTzItTDIwQBtbMG0NCiAgWW91IHdlcmUgb24gbm9kZSAbWzFtG1hub2RlaWQ7OBtcIBtbMG1wcm92aWRlZCBieSAbWzFtQEJCUy1MMTBAG1swbQ0K","isPublic":1,"isAccessible":1,"type":"t","key":[1,null,null,null,null,null,null,null,null,null],"date":"2020-07-08T01:48:01.797Z"} +{"version":1,"frame":99,"index":"b","owner":9,"cost":0,"content":"G1swbRtbMTszMG3ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQbWzBtICAgICAgICAgG1sxbdq/G1swbQ0KIBtbMTszMW3c3MTcG1szN20gG1szMm3c3MTcG1szN20gG1szNG3c3MTcG1szN20gG1szM23c3BtbMG0gG1szMDs0N20g3NwgICDc3MTcINzcINwgG1szNzs0MG0gICAbWzFtwr/av9q/2rTDv7/awr8bWzBtICAgICAgICAgICAgG1sxOzMwbRtYREFURVRJTUU7MTUbXBtbMG0NCiAbWzE7MzFt3NzEsRtbMzdtIBtbMzJtsrEbWzM3bSAbWzMybbEbWzM3bSAbWzM0bd/fxNwbWzM3bSAbWzMzbdzcG1swbSAbWzMwOzQ3bSCyscQgILKxxN8g39/C3yAbWzM3OzQwbSAgILOzs7Ozs7Ozs7Ozs8PZICAgICAgICAgICAgICAgICAgIBtbMTszMG0bWFRJTUU7OBtcG1swbQ0KIBtbMTszMW2xsBtbMG0gG1sxOzMxbbAbWzBtIBtbMTszMm2xsBtbMG0gG1sxOzMybbAbWzBtIBtbMTszNG2xsBtbMG0gG1sxOzM0bbAbWzBtIBtbMTszM22xsBtbMG0gG1szMDs0N20gsbAgsCCxsCCwILGwILAgG1szNzs0MG0gICAbWzE7MzBtwbTA2cDZwNnA2cC0wdkbWzBtDQogG1sxOzMxbd/fxN8bWzBtIBtbMTszMm3f3xtbMG0gG1sxOzMybd8bWzBtIBtbMTszNG3f38TfG1swbSAbWzE7MzNt398bWzBtIBtbMzA7NDdtIN/fxN8g39/E3yDf3yDfIBtbMzc7NDBtICAgG1sxOzMwbcTZG1szMW0gICAgICAgIBtbMzBtxNkbWzBtDQobWzE7MzBtxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEG1swbQ0KDQogIFRoYW5rcyBmb3IgdmlzaXRpbmcgG1sxOzMxbUEbWzMybU4bWzM0bVMbWzMzbUkbWzA7MzA7NDdtdGV4G1szNzs0MG0gG1sxbRtYUkVBTE5BTUU7MjAbXBtbMG0NCiAgWW91IHdlcmUgb24gbm9kZSAbWzFtG1hub2RlaWQ7OBtcIBtbMG1wcm92aWRlZCBieSAbWzFtG1hCQlM7MTAbXBtbMG0NCg==","isPublic":1,"isAccessible":1,"type":"t","key":[1,null,null,null,null,null,null,null,null,null],"date":"2020-07-08T01:48:01.797Z"}