diff --git a/.gitignore b/.gitignore index 6f81061..eda6a78 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /it0-out0.diff /it1-out* +/it2-out* diff --git a/Makefile b/Makefile index 2907ad4..608a292 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,36 @@ TEE := -run: +GCC_FLAGS := -g -O0 -Wall + +run: it1 it2 + +it0: + echo "Hand made" + +it1: cat it1-in.lang0 | python3 it0-out.py $(if $(TEE),| tee,> ) it1-out0.py cat it1-in.lang0 | python3 it1-out0.py $(if $(TEE),| tee,> ) it1-out1.py diff it1-out0.py it1-out1.py > it1-out1.diff cat it1-in.lang0 | python3 it1-out1.py $(if $(TEE),| tee,> ) it1-out2.py diff it1-out1.py it1-out2.py > it1-out2.diff - cat it1-in.lang0 | python3 it1-out2.py $(if $(TEE),| tee,> ) it1-out3.py - diff it1-out2.py it1-out3.py > it1-out3.diff + cat it1-in.lang0 | python3 it1-out2.py $(if $(TEE),| tee,> ) it1-out.py + diff it1-out2.py it1-out.py > it1-out.diff # See how much our hand written code differs from resulting code -diff it0-out.py it1-out0.py > it0-out0.diff +it2: it1 + cat it2-in.lang0 | python3 it1-out.py $(if $(TEE),| tee,> ) it2-out0.py + + cat it2-in.lang0 | python3 it2-out0.py $(if $(TEE),| tee,> ) it2-out1.c && gcc it2-out1.c -o it2-out1 $(GCC_FLAGS) +# diff it2-out0.c it2-out1.c > it2-out1.diff + cat it2-in.lang0 | ./it2-out1 $(if $(TEE),| tee,> ) it2-out2.c && gcc it2-out2.c -o it2-out2 $(GCC_FLAGS) + diff it2-out1.c it2-out2.c > it2-out2.diff + cat it2-in.lang0 | ./it2-out2 $(if $(TEE),| tee,> ) it2-out.c && gcc it2-out.c -o it2-out $(GCC_FLAGS) + diff it2-out2.c it2-out.c > it2-out.diff + clean: - -rm it1-out* + -rm it1-out* it2-out* + +.PHONY: it2 diff --git a/it0-out.py b/it0-out.py index ffdcd5d..0e86033 100644 --- a/it0-out.py +++ b/it0-out.py @@ -95,6 +95,11 @@ def parseexprcall(): emit(')') +def parsestatdeclare(indent): + skipchar(' ') + var = lexident() + skipchar(eol) + def parsestatset(indent): skipchar(' ') var = lexident() @@ -195,6 +200,10 @@ def parsestat(indent): call = lexident() trace('call', call) + if call == "declare": + parsestatdeclare(indent) + return + if call == "set": parsestatset(indent) return @@ -269,6 +278,7 @@ def parseblock(indent): def parsefunc(): funcname = lexident() + trace('funcname', funcname) emit('def ') emit(funcname) @@ -283,6 +293,15 @@ def parsefunc(): emit(var) first = False + if '/' == peek(): + # Ahead declaration + skipchar('/') + skipchar(eol) + emit("):\n") + emit(" pass # ahead declaration\n") + emit("\n") + return + skipchar(':') skipchar(eol) diff --git a/it1-in.lang0 b/it1-in.lang0 index d2a965d..a2addaf 100644 --- a/it1-in.lang0 +++ b/it1-in.lang0 @@ -7,6 +7,7 @@ increaseindent indent: / lexident: + declare word set word "" forever calc char peek @@ -81,6 +82,12 @@ parseexprcall: emit ")" / +parsestatdeclare indent: + skipchar " " + calc var lexident + skipchar eol +/ + parsestatset indent: skipchar " " calc var lexident @@ -105,6 +112,8 @@ parsestatcalc indent: skipchar eol / +parseblock indent/ + parsestatif indent: skipchar " " emit indent @@ -194,6 +203,11 @@ parsestatskipchar indent: parsestat indent: calc call lexident trace call + calc isset eq call "declare" + if isset + parsestatdeclare indent + return + / calc isset eq call "set" if isset parsestatset indent @@ -305,6 +319,11 @@ parseblock indent: parsefunc: calc funcname lexident + calc char peek + calc iseoblock eq char "/" + if iseoblock + return + / trace funcname emit "def " emit funcname @@ -327,6 +346,16 @@ parsefunc: emit var set first "0" / + calc char peek + calc iseoblock eq char "/" + if iseoblock + skipchar "/" + skipchar eol + emit "):\n" + emit " pass # ahead declaration\n" + emit "\n" + return + / skipchar ":" skipchar eol emit "):\n" diff --git a/it2-in.lang0 b/it2-in.lang0 new file mode 100644 index 0000000..7320eab --- /dev/null +++ b/it2-in.lang0 @@ -0,0 +1,584 @@ +increaseindent indent: + calc indent addstringchar indent " " + calc indent addstringchar indent " " + calc indent addstringchar indent " " + calc indent addstringchar indent " " + return indent +/ + +lexident: + declare char + declare isbeforea + declare isafterz + declare word + set word "" + forever + calc char peek + calc isbeforea lt char "a" + if isbeforea + break + / + calc isafterz lt "z" char + if isafterz + break + / + calc word addstringchar word char + skip + / + return word +/ + +parseconststring: + declare char + declare iseof + declare isquote + skipchar quote + emit quote + forever + calc char peek + calc iseof eq char eof + if iseof + break + / + calc isquote eq char quote + if isquote + break + / + emit char + skip + / + skipchar quote + emit quote + return +/ + +parseexprvarref: + declare varname + calc varname lexident + emit "var_" + emit varname + return +/ + +parseexprcall: + declare char + declare first + declare funcname + declare isspace + declare isnotspace + declare isfirst + declare isnotfirst + declare isquote + declare isnotquote + calc funcname lexident + emit funcname + emit "(" + set first "1" + forever + calc char peek + calc isspace eq char " " + calc isnotspace not isspace + if isnotspace + break + / + skip + calc isfirst eq first "1" + calc isnotfirst not isfirst + if isnotfirst + emit ", " + / + calc char peek + calc isquote eq char quote + calc isnotquote not isquote + if isquote + parseconststring + / + if isnotquote + parseexprvarref + / + set first "0" + / + emit ")" + return +/ + +parsestatdeclare indent: + declare var + skipchar " " + calc var lexident + emit indent + emit "char * var_" + emit var + emit ";" + emit eol + skipchar eol + return +/ + +parsestatset indent: + declare var + skipchar " " + calc var lexident + skipchar " " + emit indent + emit "var_" + emit var + emit " = " + parseconststring + emit ";" + emit eol + skipchar eol + return +/ + +parsestatcalc indent: + declare var + skipchar " " + calc var lexident + skipchar " " + emit indent + emit "var_" + emit var + emit " = " + parseexprcall + emit ";" + emit eol + skipchar eol + return +/ + +parseblock indent/ + +parsestatif indent: + declare indentt + skipchar " " + emit indent + emit "if ( 0 < strlen(" + parseexprvarref + emit ") )\n" + emit indent + emit "{\n" + skipchar eol + calc indentt increaseindent indent + parseblock indentt + emit indent + emit "}\n" + return +/ + +parsestatforever indent: + declare indentt + emit indent + emit "while (1)\n" + emit indent + emit "{\n" + skipchar eol + calc indentt increaseindent indent + parseblock indentt + emit indent + emit "}\n" + return +/ + +parsestatbreak indent: + emit indent + emit "break;\n" + skipchar eol + return +/ + +parsestatreturn indent: + declare char + declare isspace + declare isnotspace + emit indent + emit "return " + calc char peek + calc isspace eq char " " + calc isnotspace not isspace + if isspace + skip + parseexprvarref + / + if isnotspace + emit "0" + / + emit ";" + emit eol + skipchar eol + return +/ + +parsestatemit indent: + declare char + declare isquote + declare isnotquote + emit indent + emit "emit(" + skipchar " " + calc char peek + calc isquote eq char quote + calc isnotquote not isquote + if isquote + parseconststring + / + if isnotquote + parseexprvarref + / + emit ");\n" + skipchar eol + return +/ + +parsestattrace indent: + declare varname + emit indent + emit "trace(" + emit quote + skipchar " " + calc varname lexident + emit varname + emit quote + emit ", var_" + emit varname + emit ");\n" + skipchar eol + return +/ + +parsestatskipchar indent: + declare char + declare isquote + declare isnotquote + skipchar " " + emit indent + emit "skipchar(" + calc char peek + calc isquote eq char quote + calc isnotquote not isquote + if isquote + parseconststring + / + if isnotquote + parseexprvarref + / + emit ");\n" + skipchar eol + return +/ + +parsestat indent: + declare call + declare char + declare first + declare iscall + declare isfirst + declare isspace + declare isquote + declare isnotfirst + declare isnotspace + declare isnotquote + calc call lexident + trace call + calc iscall eq call "declare" + if iscall + parsestatdeclare indent + return + / + calc iscall eq call "set" + if iscall + parsestatset indent + return + / + calc iscall eq call "calc" + if iscall + parsestatcalc indent + return + / + calc iscall eq call "if" + if iscall + parsestatif indent + return + / + calc iscall eq call "forever" + if iscall + parsestatforever indent + return + / + calc iscall eq call "break" + if iscall + parsestatbreak indent + return + / + calc iscall eq call "return" + if iscall + parsestatreturn indent + return + / + calc iscall eq call "emit" + if iscall + parsestatemit indent + return + / + calc iscall eq call "trace" + if iscall + parsestattrace indent + return + / + calc iscall eq call "skipchar" + if iscall + parsestatskipchar indent + return + / + emit indent + emit call + emit "(" + set first "1" + forever + calc char peek + calc isspace eq char " " + calc isnotspace not isspace + if isnotspace + break + / + skip + calc char peek + calc isquote eq char quote + calc isnotquote not isquote + if isquote + parseconststring + / + if isnotquote + parseexprvarref + / + calc isfirst eq first "1" + calc isnotfirst not isfirst + if isnotfirst + emit ", " + / + set first "0" + / + skipchar eol + emit ");\n" + return +/ + +parseblock indent: + declare char + declare copy + declare iseol + declare isnoteol + declare isdone + declare iseoblock + forever + forever + calc char peek + calc iseol eq char eol + calc isnoteol not iseol + if isnoteol + break + / + skip + / + set copy " " + forever + calc isdone eq copy indent + if isdone + break + / + skipchar "\t" + calc copy increaseindent copy + / + calc char peek + calc iseoblock eq char "/" + if iseoblock + skip + skipchar eol + break + / + skipchar "\t" + parsestat indent + / + return +/ + +parsefunc: + declare char + declare first + declare funcname + declare iseoblock + declare isfirst + declare isspace + declare isnotfirst + declare isnotspace + declare var + calc funcname lexident + trace funcname + emit "char * " + emit funcname + emit "(" + set first "1" + forever + calc char peek + calc isspace eq char " " + calc isnotspace not isspace + if isnotspace + break + / + skip + calc var lexident + calc isfirst eq first "1" + calc isnotfirst not isfirst + if isnotfirst + emit ", " + / + emit "char * var_" + emit var + set first "0" + / + calc char peek + calc iseoblock eq char "/" + if iseoblock + skipchar "/" + skipchar eol + emit ");" + emit "\n" + return + / + skipchar ":" + skipchar eol + emit ")\n{\n" + parseblock " " + emit "}\n\n" + return +/ + +emitheader: + emit "#include \n" + emit "#include \n" + emit "#include \n" + emit "#include \n" + emit eol + emit eol + emit "char var_eof[1] = {0};\n" + emit "char var_eol[2] = {10, 0};\n" + emit "char var_quote[2] = {34, 0};\n" + emit "char var_false[1] = {0};\n" + emit "char var_true[2] = {'1', 0};\n" + emit eol + emit eol + emit "char * eq(char * a, char * b)\n" + emit "{\n" + emit " return (strcmp(a, b) == 0) ? var_true : var_false;\n" + emit "}\n" + emit "\n" + emit "char * lt(char * a, char * b)\n" + emit "{\n" + emit " return (strcmp(a, b) < 0) ? var_true : var_false;\n" + emit "}\n" + emit "char * not(char * a)\n" + emit "{\n" + emit " return (strcmp(a, var_true) != 0) ? var_true : var_false;\n" + emit "}\n" + emit "\n" + emit "char * addstringchar(char * str, char * chr)\n" + emit "{\n" + emit " int str_len = strlen(str);\n" + emit " assert(strlen(chr) == 1);\n" + emit " char * res = malloc((str_len + 2) * sizeof(char));\n" + emit " strcpy(res, str);\n" + emit " res[str_len + 0] = chr[0];\n" + emit " res[str_len + 1] = 0;\n" + emit " return res;\n" + emit "}\n" + emit "\n" + emit "char * emit(char * str)\n" + emit "{\n" + emit " fputs(str, stdout);\n" + emit " return 0;\n" + emit "}\n" + emit "\n" + emit "char * trace(char * var_name, char * var_value)\n" + emit "{\n" + emit " const char * env_trace = getenv(" + emit quote + emit "TRACE" + emit quote + emit ");\n" + emit " if( !env_trace ) return 0;\n" + emit " fputs(var_name, stderr);\n" + emit " fputs(" + emit quote + emit "=" + emit quote + emit ", stderr);\n" + emit " fputs(var_value, stderr);\n" + emit " fputs(var_eol, stderr);\n" + emit " return 0;\n" + emit "}\n" + emit eol + emit "int LINE = 0;\n" + emit eol + emit "char * peek()\n" + emit "{\n" + emit " char * res = malloc(2*sizeof(char));\n" + emit " res[0] = getc(stdin);\n" + emit " res[1] = 0;\n" + emit " ungetc(res[0], stdin);\n" + emit " return res;\n" + emit "}\n" + emit "\n" + emit "void skip()\n" + emit "{\n" + emit " char c = getc(stdin);\n" + emit " if( c == 10 ) LINE += 1;\n" + emit "}\n" + emit "\n" + emit "void skipchar(char * chr)\n" + emit "{\n" + emit " assert(strlen(chr) == 1);\n" + emit " char * act = peek();\n" + emit " assert(strlen(act) == 1);\n" + emit " if( chr[0] == act[0] ) {skip(); return;};\n" + emit " fprintf(stderr, " + emit quote + emit "Expected '%c' on line %d but saw '%c' instead%c" + emit quote + emit ", chr[0], LINE, act[0], 10);\n" + emit " exit(1);\n" + emit "}\n" + emit "\n" + return +/ + +emitfooter: + emit "" + return +/ + +main: + declare char + declare iseof + declare iseol + declare isnoteol + emitheader + forever + calc char peek + calc iseof eq char eof + if iseof + break + / + forever + calc char peek + calc iseol eq char eol + calc isnoteol not iseol + if isnoteol + break + / + skip + / + parsefunc + / + emitfooter + return +/ diff --git a/t-diagram.excalidraw b/t-diagram.excalidraw new file mode 100644 index 0000000..cc78aca --- /dev/null +++ b/t-diagram.excalidraw @@ -0,0 +1,2162 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "sa5DlHhxpJaKEJJQyQzX0", + "type": "rectangle", + "x": 725, + "y": 306, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 902003894, + "version": 28, + "versionNonce": 1349374006, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "vC6ze8D2C_8xamOti_FDo" + } + ], + "updated": 1736684246699, + "link": null, + "locked": false + }, + { + "id": "vC6ze8D2C_8xamOti_FDo", + "type": "text", + "x": 752.9500732421875, + "y": 319, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0V", + "roundness": null, + "seed": 1788670826, + "version": 19, + "versionNonce": 1785814954, + "isDeleted": false, + "boundElements": null, + "updated": 1736684250287, + "link": null, + "locked": false, + "text": "it0-out.py\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "sa5DlHhxpJaKEJJQyQzX0", + "originalText": "it0-out.py\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "iRDZE9sWTt5mrJyU5i0OC", + "type": "rectangle", + "x": 727, + "y": 215, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0X", + "roundness": { + "type": 3 + }, + "seed": 792095402, + "version": 70, + "versionNonce": 839175030, + "isDeleted": false, + "boundElements": [ + { + "id": "lVEW9qv7JCrDEcaTw23EF", + "type": "text" + } + ], + "updated": 1736684345816, + "link": null, + "locked": false + }, + { + "id": "lVEW9qv7JCrDEcaTw23EF", + "type": "text", + "x": 786.2900390625, + "y": 240.5, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Z", + "roundness": null, + "seed": 1438280950, + "version": 68, + "versionNonce": 1195221302, + "isDeleted": false, + "boundElements": null, + "updated": 1736684348736, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "iRDZE9sWTt5mrJyU5i0OC", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KD8v4pRNddVymx4gtcuFf", + "type": "rectangle", + "x": 1489.5, + "y": 212.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Z4", + "roundness": { + "type": 3 + }, + "seed": 449131702, + "version": 485, + "versionNonce": 1740622378, + "isDeleted": false, + "boundElements": [ + { + "id": "udIwcNyD5b7w3jOwv5w5O", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "udIwcNyD5b7w3jOwv5w5O", + "type": "text", + "x": 1548.7900390625, + "y": 238, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Z8", + "roundness": null, + "seed": 1188960682, + "version": 482, + "versionNonce": 2052650218, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "KD8v4pRNddVymx4gtcuFf", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "5dxh4jp-LBMH-OO9qJDeP", + "type": "rectangle", + "x": 873, + "y": 26, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZG", + "roundness": { + "type": 3 + }, + "seed": 321199670, + "version": 118, + "versionNonce": 1798632746, + "isDeleted": false, + "boundElements": [ + { + "id": "dNE_Ok9Fv3hB84lcVR7sb", + "type": "text" + } + ], + "updated": 1736684445213, + "link": null, + "locked": false + }, + { + "id": "dNE_Ok9Fv3hB84lcVR7sb", + "type": "text", + "x": 932.2900390625, + "y": 51.5, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZV", + "roundness": null, + "seed": 1944815658, + "version": 115, + "versionNonce": 1274068970, + "isDeleted": false, + "boundElements": null, + "updated": 1736684445213, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "5dxh4jp-LBMH-OO9qJDeP", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "tucsxFW4KsqJ7nebJW25u", + "type": "rectangle", + "x": 1008, + "y": -165.25, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZVV", + "roundness": { + "type": 3 + }, + "seed": 1721035894, + "version": 183, + "versionNonce": 2132921642, + "isDeleted": false, + "boundElements": [ + { + "id": "dJgZuLybWv3V2VMtrrQob", + "type": "text" + } + ], + "updated": 1736684949700, + "link": null, + "locked": false + }, + { + "id": "dJgZuLybWv3V2VMtrrQob", + "type": "text", + "x": 1067.2900390625, + "y": -139.75, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZW", + "roundness": null, + "seed": 718716394, + "version": 179, + "versionNonce": 2088933354, + "isDeleted": false, + "boundElements": null, + "updated": 1736684949700, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "tucsxFW4KsqJ7nebJW25u", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "V2lA3s8-_GqfV15_LNAa4", + "type": "rectangle", + "x": 1146.75, + "y": -356.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZWG", + "roundness": { + "type": 3 + }, + "seed": 859754922, + "version": 224, + "versionNonce": 575082678, + "isDeleted": false, + "boundElements": [ + { + "id": "lpfkRtKp3yuaTTxrV7pDj", + "type": "text" + } + ], + "updated": 1736684961559, + "link": null, + "locked": false + }, + { + "id": "lpfkRtKp3yuaTTxrV7pDj", + "type": "text", + "x": 1206.0400390625, + "y": -331, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ZWV", + "roundness": null, + "seed": 1108342262, + "version": 219, + "versionNonce": 600803830, + "isDeleted": false, + "boundElements": null, + "updated": 1736684961559, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "V2lA3s8-_GqfV15_LNAa4", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "1Fs8X72_ly-ZMkVkF9jsw", + "type": "rectangle", + "x": 1635.5, + "y": 23.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zd", + "roundness": { + "type": 3 + }, + "seed": 820588022, + "version": 533, + "versionNonce": 503236522, + "isDeleted": false, + "boundElements": [ + { + "id": "YkDbjN74IOoV8cz3amB97", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "YkDbjN74IOoV8cz3amB97", + "type": "text", + "x": 1694.7900390625, + "y": 49, + "width": 78.419921875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zl", + "roundness": null, + "seed": 268522602, + "version": 529, + "versionNonce": 1524384362, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "python3", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "1Fs8X72_ly-ZMkVkF9jsw", + "originalText": "python3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "-w6of5yEqut19et1qPd0U", + "type": "rectangle", + "x": 1770.5, + "y": -169.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zp", + "roundness": { + "type": 3 + }, + "seed": 726852202, + "version": 582, + "versionNonce": 2075944234, + "isDeleted": false, + "boundElements": [ + { + "id": "kKBSfe_0w5BFgwByjlnJa", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "kKBSfe_0w5BFgwByjlnJa", + "type": "text", + "x": 1853.370018005371, + "y": -144, + "width": 31.259963989257812, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zt", + "roundness": null, + "seed": 294801718, + "version": 580, + "versionNonce": 973746154, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "gcc", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "-w6of5yEqut19et1qPd0U", + "originalText": "gcc", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "zj3TnQ--hn7OHU7CQp6m2", + "type": "rectangle", + "x": 1880.5, + "y": -350.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zv", + "roundness": { + "type": 3 + }, + "seed": 2112476662, + "version": 631, + "versionNonce": 1775280810, + "isDeleted": false, + "boundElements": [ + { + "id": "q3BfGLBXzdvn6qPpQI7jA", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "q3BfGLBXzdvn6qPpQI7jA", + "type": "text", + "x": 1963.370018005371, + "y": -325, + "width": 31.259963989257812, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0Zx", + "roundness": null, + "seed": 247409770, + "version": 628, + "versionNonce": 632995178, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "gcc", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zj3TnQ--hn7OHU7CQp6m2", + "originalText": "gcc", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "JpWSt6KcCpoXnoEq_GCJp", + "type": "rectangle", + "x": 566, + "y": 122, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0d", + "roundness": { + "type": 3 + }, + "seed": 2070136810, + "version": 130, + "versionNonce": 1921081002, + "isDeleted": false, + "boundElements": [ + { + "id": "wbK8T0IJWC6QMWKFsflZU", + "type": "text" + } + ], + "updated": 1736684351221, + "link": null, + "locked": false + }, + { + "id": "wbK8T0IJWC6QMWKFsflZU", + "type": "text", + "x": 593.9500732421875, + "y": 135, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l", + "roundness": null, + "seed": 864846774, + "version": 138, + "versionNonce": 1358166378, + "isDeleted": false, + "boundElements": null, + "updated": 1736684351221, + "link": null, + "locked": false, + "text": "it1-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "JpWSt6KcCpoXnoEq_GCJp", + "originalText": "it1-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xdt3-HzXEKTWxrWigJjiT", + "type": "rectangle", + "x": 1328.5, + "y": 119.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l1", + "roundness": { + "type": 3 + }, + "seed": 1790705462, + "version": 545, + "versionNonce": 2064875562, + "isDeleted": false, + "boundElements": [ + { + "id": "Mj0dEWiGr1Z9qT8mn8V3K", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "Mj0dEWiGr1Z9qT8mn8V3K", + "type": "text", + "x": 1356.4500732421875, + "y": 132.5, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l2", + "roundness": null, + "seed": 779040554, + "version": 554, + "versionNonce": 365292266, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "xdt3-HzXEKTWxrWigJjiT", + "originalText": "it2-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Vi9eTOIjQtbNC7zF_5rwS", + "type": "rectangle", + "x": 741, + "y": -74, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l4", + "roundness": { + "type": 3 + }, + "seed": 993873258, + "version": 237, + "versionNonce": 989596726, + "isDeleted": false, + "boundElements": [ + { + "id": "5pAueU5y4qXjdgix_f5pa", + "type": "text" + } + ], + "updated": 1736684488394, + "link": null, + "locked": false + }, + { + "id": "5pAueU5y4qXjdgix_f5pa", + "type": "text", + "x": 768.9500732421875, + "y": -61, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l8", + "roundness": null, + "seed": 471340598, + "version": 242, + "versionNonce": 645687542, + "isDeleted": false, + "boundElements": null, + "updated": 1736684455955, + "link": null, + "locked": false, + "text": "it1-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Vi9eTOIjQtbNC7zF_5rwS", + "originalText": "it1-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nq35O_LXfbGnImWL9Qc06", + "type": "rectangle", + "x": 876, + "y": -265.25, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l88", + "roundness": { + "type": 3 + }, + "seed": 560721334, + "version": 304, + "versionNonce": 524056234, + "isDeleted": false, + "boundElements": [ + { + "id": "hOjP8z6dti8Z5hpgB3d5b", + "type": "text" + } + ], + "updated": 1736684957255, + "link": null, + "locked": false + }, + { + "id": "hOjP8z6dti8Z5hpgB3d5b", + "type": "text", + "x": 903.9500732421875, + "y": -252.25, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l8G", + "roundness": null, + "seed": 1843097770, + "version": 308, + "versionNonce": 1508581622, + "isDeleted": false, + "boundElements": null, + "updated": 1736684957255, + "link": null, + "locked": false, + "text": "it1-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nq35O_LXfbGnImWL9Qc06", + "originalText": "it1-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "sm_C3kQH3NnoN8GY0WsHa", + "type": "rectangle", + "x": 1014.75, + "y": -456.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l8K", + "roundness": { + "type": 3 + }, + "seed": 529206378, + "version": 345, + "versionNonce": 1752619830, + "isDeleted": false, + "boundElements": [ + { + "id": "P9GsVng_mlohB8reiaQaw", + "type": "text" + } + ], + "updated": 1736684961559, + "link": null, + "locked": false + }, + { + "id": "P9GsVng_mlohB8reiaQaw", + "type": "text", + "x": 1042.7000732421875, + "y": -443.5, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0l8O", + "roundness": null, + "seed": 1003079478, + "version": 348, + "versionNonce": 1453458550, + "isDeleted": false, + "boundElements": null, + "updated": 1736684961559, + "link": null, + "locked": false, + "text": "it1-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "sm_C3kQH3NnoN8GY0WsHa", + "originalText": "it1-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "FkKqusUxwu0Fdxigv0fZW", + "type": "rectangle", + "x": 1503.5, + "y": -75.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lA", + "roundness": { + "type": 3 + }, + "seed": 480422006, + "version": 653, + "versionNonce": 1818033578, + "isDeleted": false, + "boundElements": [ + { + "id": "ypQvCIgox5Ez78rMw8nJk", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "ypQvCIgox5Ez78rMw8nJk", + "type": "text", + "x": 1531.4500732421875, + "y": -62.5, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lC", + "roundness": null, + "seed": 1922220522, + "version": 659, + "versionNonce": 1812183146, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "FkKqusUxwu0Fdxigv0fZW", + "originalText": "it2-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EIr70q6Ecsh_k_mhXX_d1", + "type": "rectangle", + "x": 1665.5, + "y": -261.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lD", + "roundness": { + "type": 3 + }, + "seed": 271217654, + "version": 715, + "versionNonce": 612703018, + "isDeleted": false, + "boundElements": [ + { + "id": "5JR6I1qRvymfZUCUFUEiC", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "5JR6I1qRvymfZUCUFUEiC", + "type": "text", + "x": 1693.4500732421875, + "y": -248.5, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lE", + "roundness": null, + "seed": 887058026, + "version": 720, + "versionNonce": 1951147498, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "EIr70q6Ecsh_k_mhXX_d1", + "originalText": "it2-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "P5YHIvfxndgZtpw2M194q", + "type": "rectangle", + "x": 1775.5, + "y": -442.5, + "width": 197, + "height": 76, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lEV", + "roundness": { + "type": 3 + }, + "seed": 560441142, + "version": 764, + "versionNonce": 878958762, + "isDeleted": false, + "boundElements": [ + { + "id": "2mQPed9SFteJcR4z6zGyt", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "2mQPed9SFteJcR4z6zGyt", + "type": "text", + "x": 1803.4500732421875, + "y": -429.5, + "width": 141.099853515625, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0lF", + "roundness": null, + "seed": 1202851626, + "version": 768, + "versionNonce": 1685533546, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-in.lang0\n(hand written)", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "P5YHIvfxndgZtpw2M194q", + "originalText": "it2-in.lang0\n(hand written)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "xhGx8DjmbBrbJtwOztMKw", + "type": "rectangle", + "x": 876, + "y": 121, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0p", + "roundness": { + "type": 3 + }, + "seed": 1738165110, + "version": 320, + "versionNonce": 242867434, + "isDeleted": false, + "boundElements": [ + { + "id": "MFQOMZ3Q8GWnWIOy737f6", + "type": "text" + } + ], + "updated": 1736684364282, + "link": null, + "locked": false + }, + { + "id": "MFQOMZ3Q8GWnWIOy737f6", + "type": "text", + "x": 920.2900619506836, + "y": 146, + "width": 106.41987609863281, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0t", + "roundness": null, + "seed": 781897450, + "version": 334, + "versionNonce": 1304604586, + "isDeleted": false, + "boundElements": null, + "updated": 1736684364282, + "link": null, + "locked": false, + "text": "it1-out0.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "xhGx8DjmbBrbJtwOztMKw", + "originalText": "it1-out0.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "V4SlwrmLxEj5lu0skBUJ1", + "type": "rectangle", + "x": 1638.5, + "y": 118.5, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0t8", + "roundness": { + "type": 3 + }, + "seed": 1180838326, + "version": 735, + "versionNonce": 1456551466, + "isDeleted": false, + "boundElements": [ + { + "id": "uq1n89eIzIoEF64MTNtC0", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "uq1n89eIzIoEF64MTNtC0", + "type": "text", + "x": 1680.0600662231445, + "y": 143.5, + "width": 111.87986755371094, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0tG", + "roundness": null, + "seed": 1735849130, + "version": 750, + "versionNonce": 1549590762, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-out0.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "V4SlwrmLxEj5lu0skBUJ1", + "originalText": "it2-out0.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "q7GdmXdIkEVil1E7K3Vtv", + "type": "rectangle", + "x": 1009, + "y": -77, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0tV", + "roundness": { + "type": 3 + }, + "seed": 216212342, + "version": 378, + "versionNonce": 1346015286, + "isDeleted": false, + "boundElements": [ + { + "id": "Y8BLkvSVXeE_VCIsnaqRY", + "type": "text" + } + ], + "updated": 1736684465162, + "link": null, + "locked": false + }, + { + "id": "Y8BLkvSVXeE_VCIsnaqRY", + "type": "text", + "x": 1055.2600555419922, + "y": -52.00000000000001, + "width": 102.47988891601562, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u", + "roundness": null, + "seed": 15431402, + "version": 394, + "versionNonce": 1445402998, + "isDeleted": false, + "boundElements": null, + "updated": 1736684465162, + "link": null, + "locked": false, + "text": "it1-out1.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "q7GdmXdIkEVil1E7K3Vtv", + "originalText": "it1-out1.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "4tXC4CO1352XEGgn5ZWPo", + "type": "rectangle", + "x": 1144, + "y": -268.25, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u1", + "roundness": { + "type": 3 + }, + "seed": 72402678, + "version": 443, + "versionNonce": 210036778, + "isDeleted": false, + "boundElements": [ + { + "id": "nB2NHk0Nl6BGmmPd2LQlN", + "type": "text" + } + ], + "updated": 1736684949700, + "link": null, + "locked": false + }, + { + "id": "nB2NHk0Nl6BGmmPd2LQlN", + "type": "text", + "x": 1187.5300598144531, + "y": -243.25, + "width": 107.93988037109375, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u2", + "roundness": null, + "seed": 993774442, + "version": 460, + "versionNonce": 789420906, + "isDeleted": false, + "boundElements": null, + "updated": 1736684954094, + "link": null, + "locked": false, + "text": "it1-out2.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4tXC4CO1352XEGgn5ZWPo", + "originalText": "it1-out2.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_njzXhKgPzadFQfgDnI_E", + "type": "rectangle", + "x": 1282.75, + "y": -459.5, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u2V", + "roundness": { + "type": 3 + }, + "seed": 335671082, + "version": 484, + "versionNonce": 1075185078, + "isDeleted": false, + "boundElements": [ + { + "id": "K8FKdMdbEtQXcBMy_4JGQ", + "type": "text" + } + ], + "updated": 1736684961559, + "link": null, + "locked": false + }, + { + "id": "K8FKdMdbEtQXcBMy_4JGQ", + "type": "text", + "x": 1327.2000579833984, + "y": -434.5, + "width": 106.09988403320312, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u3", + "roundness": null, + "seed": 414675062, + "version": 502, + "versionNonce": 1109378358, + "isDeleted": false, + "boundElements": null, + "updated": 1736684963415, + "link": null, + "locked": false, + "text": "it1-out3.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_njzXhKgPzadFQfgDnI_E", + "originalText": "it1-out3.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZjoMA7OeaNnjNpaVjFLsc", + "type": "rectangle", + "x": 1489, + "y": 299.25, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u4", + "roundness": { + "type": 3 + }, + "seed": 1033809526, + "version": 504, + "versionNonce": 1889874858, + "isDeleted": false, + "boundElements": [ + { + "id": "-3hZTUkUzcwcd4qQ6tH9Q", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "-3hZTUkUzcwcd4qQ6tH9Q", + "type": "text", + "x": 1533.4500579833984, + "y": 324.25, + "width": 106.09988403320312, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0u8", + "roundness": null, + "seed": 1942100970, + "version": 523, + "versionNonce": 1708469866, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it1-out3.py", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZjoMA7OeaNnjNpaVjFLsc", + "originalText": "it1-out3.py", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "_dSfxbsy4dHEcZZ5zwehT", + "type": "rectangle", + "x": 1771.5, + "y": -79.5, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0uG", + "roundness": { + "type": 3 + }, + "seed": 656376566, + "version": 741, + "versionNonce": 280482090, + "isDeleted": false, + "boundElements": [ + { + "id": "gSS5ui-65NHgMOUQh5qaI", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "gSS5ui-65NHgMOUQh5qaI", + "type": "text", + "x": 1820.8600616455078, + "y": -54.5, + "width": 96.27987670898438, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0uV", + "roundness": null, + "seed": 2126958442, + "version": 761, + "versionNonce": 1958222826, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-out1.c", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "_dSfxbsy4dHEcZZ5zwehT", + "originalText": "it2-out1.c", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "7AT_y3BQx_MTOK2YJ5gyT", + "type": "rectangle", + "x": 1875.5, + "y": -258.5, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0uX", + "roundness": { + "type": 3 + }, + "seed": 1264283498, + "version": 803, + "versionNonce": 1877020330, + "isDeleted": false, + "boundElements": [ + { + "id": "0RfiY6ME4YQvG93V4ZTf7", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "0RfiY6ME4YQvG93V4ZTf7", + "type": "text", + "x": 1922.1300659179688, + "y": -233.5, + "width": 101.7398681640625, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0uZ", + "roundness": null, + "seed": 1038423094, + "version": 823, + "versionNonce": 1725802858, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-out2.c", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "7AT_y3BQx_MTOK2YJ5gyT", + "originalText": "it2-out2.c", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "wtdGNdh8BUiQz-JxcpA_L", + "type": "rectangle", + "x": 1990.5, + "y": -443.5, + "width": 195.0000000000001, + "height": 74.99999999999999, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ua", + "roundness": { + "type": 3 + }, + "seed": 1360068714, + "version": 840, + "versionNonce": 1895361578, + "isDeleted": false, + "boundElements": [ + { + "id": "yJu3JDSgZH2EElzwcEo8a", + "type": "text" + } + ], + "updated": 1736684934138, + "link": null, + "locked": false + }, + { + "id": "yJu3JDSgZH2EElzwcEo8a", + "type": "text", + "x": 2038.050064086914, + "y": -418.5, + "width": 99.89987182617188, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0ub", + "roundness": null, + "seed": 1154290486, + "version": 865, + "versionNonce": 69064426, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "text": "it2-out3.c", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "wtdGNdh8BUiQz-JxcpA_L", + "originalText": "it2-out3.c", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "eDELti94mLy2t3R4bECOH", + "type": "arrow", + "x": 685, + "y": 96, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": { + "type": 2 + }, + "seed": 1666782582, + "version": 59, + "versionNonce": 2125545782, + "isDeleted": false, + "boundElements": null, + "updated": 1736684495257, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "PeyUjZakaWogn3vg3j8eo", + "type": "arrow", + "x": 820, + "y": -95.25, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5G", + "roundness": { + "type": 2 + }, + "seed": 2143844406, + "version": 124, + "versionNonce": 1720455530, + "isDeleted": false, + "boundElements": null, + "updated": 1736684957255, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "w4Ar-4KEfqfFsRbjOrY5k", + "type": "arrow", + "x": 958.75, + "y": -286.5, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5O", + "roundness": { + "type": 2 + }, + "seed": 84834794, + "version": 163, + "versionNonce": 1556910134, + "isDeleted": false, + "boundElements": null, + "updated": 1736684961559, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9OGDgT_Lsmfhwczs8Rc-Z", + "type": "arrow", + "x": 1447.5, + "y": 93.5, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": { + "type": 2 + }, + "seed": 302049590, + "version": 472, + "versionNonce": 550988202, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "og_eon1hJp99Tg0eXsa8W", + "type": "arrow", + "x": 1609.5, + "y": -92.5, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": { + "type": 2 + }, + "seed": 501515574, + "version": 532, + "versionNonce": 2119214186, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "MZIQeqz9pm0T9ka6Vu3kQ", + "type": "arrow", + "x": 1719.5, + "y": -273.5, + "width": 61, + "height": 75, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": { + "type": 2 + }, + "seed": 1335447670, + "version": 579, + "versionNonce": 911509290, + "isDeleted": false, + "boundElements": null, + "updated": 1736684934138, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 61, + -75 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "elbowed": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/t-diagram.png b/t-diagram.png new file mode 100644 index 0000000..b11aab8 Binary files /dev/null and b/t-diagram.png differ