├── data ├── sampleMultipleSpeakers.mp3 ├── sampleEmpty.TextGrid ├── sampleMultipleSpeakers.TextGrid ├── sampleNested.TextGrid └── sampleUtterances.TextGrid ├── .jshintrc ├── lib ├── .jshintrc └── textgrid.js ├── test ├── .jshintrc └── textgrid-spec.js ├── .gitignore ├── bower.json ├── .github └── workflows │ └── node.js.yml ├── package.json ├── Gruntfile.js ├── dist ├── textgrid.min.js └── textgrid.js ├── README.md └── LICENSE /data/sampleMultipleSpeakers.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FieldDB/PraatTextGridJS/HEAD/data/sampleMultipleSpeakers.mp3 -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "unused": true, 11 | "boss": true, 12 | "eqnull": true, 13 | "node": true 14 | } 15 | -------------------------------------------------------------------------------- /lib/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "boss": true, 11 | "eqnull": true, 12 | "predef": ["exports", "console"] 13 | } 14 | -------------------------------------------------------------------------------- /data/sampleEmpty.TextGrid: -------------------------------------------------------------------------------- 1 | File type = "ooTextFile" 2 | Object class = "TextGrid" 3 | 4 | xmin = 0 5 | xmax = 1.4729375 6 | tiers? 7 | size = 1 8 | item []: 9 | item [1]: 10 | class = "IntervalTier" 11 | name = "utterances" 12 | xmin = 0 13 | xmax = 1.4729375 14 | intervals: size = 1 15 | intervals [1]: 16 | xmin = 0 17 | xmax = 1.4729375 18 | text = "utterance" 19 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "unused": true, 11 | "boss": true, 12 | "eqnull": true, 13 | "node": true, 14 | "globals": { 15 | "jasmine": true, 16 | "beforeEach": false, 17 | "afterEach": false, 18 | "describe": false, 19 | "xdescribe": false, 20 | "it": false, 21 | "xit": false, 22 | "expect": false, 23 | "runs": false, 24 | "waitsFor": false 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | .DS_Store 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # Compiled binary addons (http://nodejs.org/api/addons.html) 21 | build 22 | 23 | # Dependency directory 24 | # Deployed apps should consider commenting this line out: 25 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 26 | node_modules 27 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "textgrid", 3 | "version": "2.2.0", 4 | "homepage": "https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS", 5 | "authors": [ 6 | "OpenSourceFieldLinguistics Contribs" 7 | ], 8 | "description": "A small library which can parse TextGrid into json and json into TextGrid", 9 | "main": "dist/textgrid.js", 10 | "moduleType": [ 11 | "amd", 12 | "node" 13 | ], 14 | "keywords": [ 15 | "praat", 16 | "textgrid" 17 | ], 18 | "license": "Apache 2.0", 19 | "ignore": [ 20 | "**/.*", 21 | "node_modules", 22 | "bower_components", 23 | "test", 24 | "tests", 25 | "lib", 26 | "Gruntfile.js", 27 | "data", 28 | "package.json" 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ main ] 9 | pull_request: 10 | branches: [ main ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [12.x, 14.x, 16.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v2 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | cache: 'npm' 29 | - run: npm install -g grunt-cli 30 | - run: npm ci 31 | - run: npm test 32 | - run: npm run build 33 | -------------------------------------------------------------------------------- /data/sampleMultipleSpeakers.TextGrid: -------------------------------------------------------------------------------- 1 | File type = "ooTextFile" 2 | Object class = "TextGrid" 3 | 4 | xmin = 0 5 | xmax = 4.066979166666667 6 | tiers? 7 | size = 2 8 | item []: 9 | item [1]: 10 | class = "IntervalTier" 11 | name = "speaker1" 12 | xmin = 0 13 | xmax = 4.066979166666667 14 | intervals: size = 3 15 | intervals [1]: 16 | xmin = 0 17 | xmax = 0.38548958333333305 18 | text = "" 19 | intervals [2]: 20 | xmin = 0.38548958333333305 21 | xmax = 1.7262741188606137 22 | text = "wigpajig e'sig?" 23 | intervals [3]: 24 | xmin = 1.7262741188606137 25 | xmax = 4.066979166666667 26 | text = "" 27 | item [2]: 28 | class = "IntervalTier" 29 | name = "speaker2" 30 | xmin = 0 31 | xmax = 4.066979166666667 32 | intervals: size = 3 33 | intervals [1]: 34 | xmin = 0 35 | xmax = 2.6213710276947118 36 | text = "" 37 | intervals [2]: 38 | xmin = 2.6213710276947118 39 | xmax = 3.8502328855855916 40 | text = "ehe wigpagig" 41 | intervals [3]: 42 | xmin = 3.8502328855855916 43 | xmax = 4.066979166666667 44 | text = "" 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "textgrid", 3 | "description": "A small library which can parse TextGrid into json and json into TextGrid", 4 | "version": "2.2.0", 5 | "homepage": "https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS", 6 | "author": { 7 | "name": "OpenSourceFieldLinguistics Contribs", 8 | "email": "" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git://github.com/OpenSourceFieldlinguistics/PraatTextGridJS.git" 13 | }, 14 | "bugs": { 15 | "url": "https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS/issues" 16 | }, 17 | "licenses": [ 18 | { 19 | "type": "Apache 2.0", 20 | "url": "https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS/blob/master/LICENSE" 21 | } 22 | ], 23 | "main": "lib/textgrid", 24 | "engines": { 25 | "node": ">= 0.6.0" 26 | }, 27 | "scripts": { 28 | "build": "grunt", 29 | "lint": "grunt jshint", 30 | "test": "jasmine-node test", 31 | "watch": "grunt watch --force" 32 | }, 33 | "devDependencies": { 34 | "grunt": "^1.4.1", 35 | "grunt-cli": "^1.4.3", 36 | "grunt-contrib-concat": "^2.0.0", 37 | "grunt-contrib-jshint": "^3.1.1", 38 | "grunt-contrib-uglify": "^5.0.1", 39 | "grunt-contrib-watch": "^1.1.0", 40 | "grunt-jasmine-node": "^0.3.1", 41 | "jasmine-node": "^3.0.0" 42 | }, 43 | "keywords": [] 44 | } 45 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function(grunt) { 4 | 5 | // Project configuration. 6 | grunt.initConfig({ 7 | // Metadata. 8 | pkg: grunt.file.readJSON('package.json'), 9 | banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + 10 | '<%= grunt.template.today("yyyy-mm-dd") %>\n' + 11 | '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + 12 | '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + 13 | ' Licensed <%= pkg.licenses[0].type %> */\n', 14 | // Task configuration. 15 | concat: { 16 | options: { 17 | banner: '<%= banner %>', 18 | stripBanners: true 19 | }, 20 | dist: { 21 | src: ['lib/<%= pkg.name %>.js'], 22 | dest: 'dist/<%= pkg.name %>.js' 23 | }, 24 | }, 25 | uglify: { 26 | options: { 27 | banner: '<%= banner %>' 28 | }, 29 | dist: { 30 | src: '<%= concat.dist.dest %>', 31 | dest: 'dist/<%= pkg.name %>.min.js' 32 | }, 33 | }, 34 | jasmine_node: { 35 | options: { 36 | specNameMatcher: 'spec', 37 | forceExit: false, 38 | match: '.', 39 | requirejs: false, 40 | isVerbose: true, 41 | showColors: true, 42 | }, 43 | jUnit: { 44 | report: true, 45 | savePath: './build/reports/jasmine/', 46 | consolidate: true, 47 | useDotNotation: false 48 | } 49 | }, 50 | jshint: { 51 | options: { 52 | jshintrc: '.jshintrc' 53 | }, 54 | gruntfile: { 55 | src: 'Gruntfile.js' 56 | }, 57 | lib: { 58 | options: { 59 | jshintrc: 'lib/.jshintrc' 60 | }, 61 | src: ['lib/**/*.js'] 62 | }, 63 | test: { 64 | options: { 65 | jshintrc: 'test/.jshintrc' 66 | }, 67 | src: ['test/**/*.js'] 68 | }, 69 | }, 70 | watch: { 71 | gruntfile: { 72 | files: '<%= jshint.gruntfile.src %>', 73 | tasks: ['jshint:gruntfile'] 74 | }, 75 | lib: { 76 | files: '<%= jshint.lib.src %>', 77 | tasks: ['jshint:lib', 'jasmine_node'] 78 | }, 79 | test: { 80 | files: '<%= jshint.test.src %>', 81 | tasks: ['jshint:test', 'jasmine_node'] 82 | }, 83 | }, 84 | }); 85 | 86 | // These plugins provide necessary tasks. 87 | grunt.loadNpmTasks('grunt-contrib-concat'); 88 | grunt.loadNpmTasks('grunt-contrib-uglify'); 89 | grunt.loadNpmTasks('grunt-jasmine-node'); 90 | grunt.loadNpmTasks('grunt-contrib-jshint'); 91 | grunt.loadNpmTasks('grunt-contrib-watch'); 92 | 93 | // Default task. 94 | grunt.registerTask('default', ['jshint', 'jasmine_node', 'concat', 'uglify']); 95 | 96 | }; 97 | -------------------------------------------------------------------------------- /dist/textgrid.min.js: -------------------------------------------------------------------------------- 1 | /*! textgrid - v2.2.0 - 2021-12-14 2 | * https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS 3 | * Copyright (c) 2021 OpenSourceFieldLinguistics Contribs; Licensed Apache 2.0 */ 4 | 5 | !function(e){"use strict";function h(e){for(var t,i,n={},r=0;r 34 | 37 | ``` 38 | 39 | In your code, you can attach textgrid's methods to any object. 40 | 41 | ```html 42 | 45 | 46 | 49 | ``` 50 | 51 | An example of what you can do with the result. 52 | 53 | ```js 54 | var textgrid = TextGrid.textgridToIGT(text); 55 | if (textgrid.isIGTNestedOrAlignedOrBySpeaker.probablyAligned) { 56 | for (itemIndex in textgrid.intervalsByXmin) { 57 | if (!textgrid.intervalsByXmin.hasOwnProperty(itemIndex)) { 58 | continue; 59 | } 60 | if (textgrid.intervalsByXmin[itemIndex]) { 61 | row = {}; 62 | for (intervalIndex = 0; intervalIndex < textgrid.intervalsByXmin[itemIndex].length; intervalIndex++) { 63 | interval = textgrid.intervalsByXmin[itemIndex][intervalIndex]; 64 | row.startTime = row.startTime ? row.startTime : interval.xmin; 65 | row.endTime = row.endTime ? row.endTime : interval.xmax; 66 | row.utterance = row.utterance ? row.utterance : interval.text.trim(); 67 | row.modality = "spoken"; 68 | row.tier = interval.tierName; 69 | row.speakers = interval.speaker; 70 | row.audioFileName = interval.fileName || audioFileName; 71 | row.CheckedWithConsultant = interval.speaker; 72 | consultants.push(row.speakers); 73 | row[interval.tierName] = interval.text; 74 | header.push(interval.tierName); 75 | } 76 | matrix.push(row); 77 | } 78 | } 79 | } else { 80 | for (itemIndex in textgrid.intervalsByXmin) { 81 | if (!textgrid.intervalsByXmin.hasOwnProperty(itemIndex)) { 82 | continue; 83 | } 84 | if (textgrid.intervalsByXmin[itemIndex]) { 85 | for (intervalIndex = 0; intervalIndex < textgrid.intervalsByXmin[itemIndex].length; intervalIndex++) { 86 | row = {}; 87 | interval = textgrid.intervalsByXmin[itemIndex][intervalIndex]; 88 | row.startTime = row.startTime ? row.startTime : interval.xmin; 89 | row.endTime = row.endTime ? row.endTime : interval.xmax; 90 | row.utterance = row.utterance ? row.utterance : interval.text.trim(); 91 | row.modality = "spoken"; 92 | row.tier = interval.tierName; 93 | row.speakers = interval.speaker; 94 | row.audioFileName = interval.fileName || audioFileName; 95 | row.CheckedWithConsultant = interval.speaker; 96 | consultants.push(row.speakers); 97 | row[interval.tierName] = interval.text; 98 | header.push(interval.tierName); 99 | matrix.push(row); 100 | } 101 | } 102 | } 103 | } 104 | 105 | ``` 106 | 107 | ## Documentation 108 | http://opensourcefieldlinguistics.github.io/FieldDB/ 109 | 110 | ## Examples 111 | See tests directory for more ways to use the library 112 | 113 | ## Contributing 114 | In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/). 115 | 116 | _The "dist" subdirectory files are generated via Grunt. You'll find source code in the "lib" subdirectory!_ 117 | 118 | ## Release History 119 | * v1.102.3 April 22 2014 Long audio import support 120 | * v2.2.0 April 22 2014 Support for multiple small files each corresponding to an utterance 121 | 122 | 123 | ## License 124 | Copyright (c) 2014 OpenSourceFieldLinguistics Contribs 125 | Licensed under the Apache 2.0 license. 126 | -------------------------------------------------------------------------------- /data/sampleNested.TextGrid: -------------------------------------------------------------------------------- 1 | File type = "ooTextFile" 2 | Object class = "TextGrid" 3 | 4 | xmin = 0 5 | xmax = 2.2413151927437642 6 | tiers? 7 | size = 6 8 | item []: 9 | item [1]: 10 | class = "IntervalTier" 11 | name = "phones" 12 | xmin = 0 13 | xmax = 2.2413151927437642 14 | intervals: size = 19 15 | intervals [1]: 16 | xmin = 0 17 | xmax = 0.08321880070642035 18 | text = "n" 19 | intervals [2]: 20 | xmin = 0.08321880070642035 21 | xmax = 0.26576343768717986 22 | text = "o" 23 | intervals [3]: 24 | xmin = 0.26576343768717986 25 | xmax = 0.3605194324558184 26 | text = "q" 27 | intervals [4]: 28 | xmin = 0.3605194324558184 29 | xmax = 0.5848681847756833 30 | text = "a" 31 | intervals [5]: 32 | xmin = 0.5848681847756833 33 | xmax = 0.6392135347165201 34 | text = "t" 35 | intervals [6]: 36 | xmin = 0.6392135347165201 37 | xmax = 0.6963458256799638 38 | text = "a" 39 | intervals [7]: 40 | xmin = 0.6963458256799638 41 | xmax = 0.7604454691999253 42 | text = "t" 43 | intervals [8]: 44 | xmin = 0.7604454691999253 45 | xmax = 0.8635622870363848 46 | text = "u" 47 | intervals [9]: 48 | xmin = 0.8635622870363848 49 | xmax = 0.9569248112937199 50 | text = "s" 51 | intervals [10]: 52 | xmin = 0.9569248112937199 53 | xmax = 1.0391395714606269 54 | text = "u" 55 | intervals [11]: 56 | xmin = 1.0391395714606269 57 | xmax = 1.138075977763176 58 | text = "n" 59 | intervals [12]: 60 | xmin = 1.138075977763176 61 | xmax = 1.390294140309111 62 | text = "a" 63 | intervals [13]: 64 | xmin = 1.390294140309111 65 | xmax = 1.5045587222359986 66 | text = "y" 67 | intervals [14]: 68 | xmin = 1.5045587222359986 69 | xmax = 1.6341514797872247 70 | text = "a" 71 | intervals [15]: 72 | xmin = 1.6341514797872247 73 | xmax = 1.6926772412619722 74 | text = "w" 75 | intervals [16]: 76 | xmin = 1.6926772412619722 77 | xmax = 1.8445655269940546 78 | text = "a" 79 | intervals [17]: 80 | xmin = 1.8445655269940546 81 | xmax = 2.0034211652826546 82 | text = "n" 83 | intervals [18]: 84 | xmin = 2.0034211652826546 85 | xmax = 2.0995706305625967 86 | text = "m" 87 | intervals [19]: 88 | xmin = 2.0995706305625967 89 | xmax = 2.2413151927437642 90 | text = "i" 91 | item [2]: 92 | class = "IntervalTier" 93 | name = "silences" 94 | xmin = 0 95 | xmax = 2.2413151927437642 96 | intervals: size = 1 97 | intervals [1]: 98 | xmin = 0 99 | xmax = 2.2413151927437642 100 | text = "noqata tusunayawanmi" 101 | item [3]: 102 | class = "IntervalTier" 103 | name = "words" 104 | xmin = 0 105 | xmax = 2.2413151927437642 106 | intervals: size = 2 107 | intervals [1]: 108 | xmin = 0 109 | xmax = 0.6824111205669288 110 | text = "noqata" 111 | intervals [2]: 112 | xmin = 0.6824111205669288 113 | xmax = 2.2413151927437642 114 | text = "tusunayawanmi" 115 | item [4]: 116 | class = "IntervalTier" 117 | name = "morphemes" 118 | xmin = 0 119 | xmax = 2.2413151927437642 120 | intervals: size = 6 121 | intervals [1]: 122 | xmin = 0 123 | xmax = 0.5834747142643797 124 | text = "noqa" 125 | intervals [2]: 126 | xmin = 0.5834747142643797 127 | xmax = 0.6865915321008393 128 | text = "ta" 129 | intervals [3]: 130 | xmin = 0.6865915321008393 131 | xmax = 1.0391395714606269 132 | text = "tusu" 133 | intervals [4]: 134 | xmin = 1.0391395714606269 135 | xmax = 1.6369384208098319 136 | text = "naya" 137 | intervals [5]: 138 | xmin = 1.6369384208098319 139 | xmax = 1.9295672281835685 140 | text = "wan" 141 | intervals [6]: 142 | xmin = 1.9295672281835685 143 | xmax = 2.2413151927437642 144 | text = "mi" 145 | item [5]: 146 | class = "IntervalTier" 147 | name = "gloss" 148 | xmin = 0 149 | xmax = 2.2413151927437642 150 | intervals: size = 6 151 | intervals [1]: 152 | xmin = 0 153 | xmax = 0.5834747142643797 154 | text = "1sg" 155 | intervals [2]: 156 | xmin = 0.5834747142643797 157 | xmax = 0.6865915321008393 158 | text = "ACC" 159 | intervals [3]: 160 | xmin = 0.6865915321008393 161 | xmax = 1.0391395714606269 162 | text = "dance" 163 | intervals [4]: 164 | xmin = 1.0391395714606269 165 | xmax = 1.6369384208098319 166 | text = "IMP" 167 | intervals [5]: 168 | xmin = 1.6369384208098319 169 | xmax = 1.9295672281835685 170 | text = "wan" 171 | intervals [6]: 172 | xmin = 1.9295672281835685 173 | xmax = 2.2413151927437642 174 | text = "mi" 175 | item [6]: 176 | class = "IntervalTier" 177 | name = "translation" 178 | xmin = 0 179 | xmax = 2.2413151927437642 180 | intervals: size = 1 181 | intervals [1]: 182 | xmin = 0 183 | xmax = 2.2413151927437642 184 | text = "I feel like dancing." 185 | -------------------------------------------------------------------------------- /test/textgrid-spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var textgrid = require("../lib/textgrid.js").TextGrid; 4 | var fs = require("fs"); 5 | /* 6 | ======== A Handy Little Jasmine Reference ======== 7 | https://github.com/pivotal/jasmine/wiki/Matchers 8 | 9 | Spec matchers: 10 | expect(x).toEqual(y); compares objects or primitives x and y and passes if they are equivalent 11 | expect(x).toBe(y); compares objects or primitives x and y and passes if they are the same object 12 | expect(x).toMatch(pattern); compares x to string or regular expression pattern and passes if they match 13 | expect(x).toBeDefined(); passes if x is not undefined 14 | expect(x).toBeUndefined(); passes if x is undefined 15 | expect(x).toBeNull(); passes if x is null 16 | expect(x).toBeTruthy(); passes if x evaluates to true 17 | expect(x).toBeFalsy(); passes if x evaluates to false 18 | expect(x).toContain(y); passes if array or string x contains y 19 | expect(x).toBeLessThan(y); passes if x is less than y 20 | expect(x).toBeGreaterThan(y); passes if x is greater than y 21 | expect(function(){fn();}).toThrow(e); passes if function fn throws exception e when executed 22 | 23 | Every matcher"s criteria can be inverted by prepending .not: 24 | expect(x).not.toEqual(y); compares objects or primitives x and y and passes if they are not equivalent 25 | 26 | Custom matchers help to document the intent of your specs, and can help to remove code duplication in your specs. 27 | beforeEach(function() { 28 | this.addMatchers({ 29 | 30 | toBeLessThan: function(expected) { 31 | var actual = this.actual; 32 | var notText = this.isNot ? " not" : "; 33 | 34 | this.message = function () { 35 | return "Expected " + actual + notText + " to be less than " + expected; 36 | } 37 | 38 | return actual < expected; 39 | } 40 | 41 | }); 42 | }); 43 | 44 | */ 45 | describe("lib/textgrid", function() { 46 | 47 | it("should init", function() { 48 | expect(textgrid.init).toBeDefined(); 49 | }); 50 | 51 | it("should read sample data", function() { 52 | var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sampleUtterances.TextGrid", { 53 | encoding: "UTF-8" 54 | }); 55 | expect(sampleUtterancesTextGrid).toBeDefined(); 56 | }); 57 | 58 | it("should convert sampleUtterancesTextGrid textgrid into json", function() { 59 | var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sampleUtterances.TextGrid", { 60 | encoding: "UTF-8" 61 | }); 62 | var json = textgrid.textgridToJSON(sampleUtterancesTextGrid); 63 | // console.log(JSON.stringify(json, null, 2)); 64 | expect(typeof json).toBe("object"); 65 | for (var itemIndex = 0; itemIndex < json.items.length; itemIndex++) { 66 | console.log("Sanity check for tier " + itemIndex); 67 | if (json.items[itemIndex].points) { 68 | expect(json.items[itemIndex].points.length).toEqual(json.items[itemIndex].points_size); 69 | } 70 | if (json.items[itemIndex].intervals) { 71 | expect(json.items[itemIndex].intervals.length).toEqual(json.items[itemIndex].intervals_size); 72 | } 73 | } 74 | }); 75 | 76 | it("should discover IGT relationships between aligned tiers", function() { 77 | var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sample_elan.TextGrid", { 78 | encoding: "UTF-8" 79 | }); 80 | var json = textgrid.textgridToIGT(sampleUtterancesTextGrid); 81 | expect(typeof json).toBe("object"); 82 | // console.log(JSON.stringify(json.intervalsByXmin, null, 2)); 83 | expect(typeof json.intervalsByXmin).toBe("object"); 84 | expect(typeof json.intervalsByText).toBe("object"); 85 | expect(json.isIGTNestedOrAlignedOrBySpeaker.probablyAligned).toBeTruthy(); 86 | 87 | }); 88 | 89 | it("should discover speakers in Elan exported tiers", function() { 90 | var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sample_elan.TextGrid", { 91 | encoding: "UTF-8" 92 | }); 93 | var json = textgrid.textgridToIGT(sampleUtterancesTextGrid); 94 | // console.log(JSON.stringify(json, null, 2)); 95 | expect(json.isIGTNestedOrAlignedOrBySpeaker.probablyBySpeaker).toBeTruthy(); 96 | 97 | }); 98 | 99 | it("should discover be possible to get start and end times for segments in", function() { 100 | var sampleUtterancesTextGrid = fs.readFileSync(__dirname + "/../data/sampleNested.TextGrid", { 101 | encoding: "UTF-8" 102 | }); 103 | var json = textgrid.textgridToIGT(sampleUtterancesTextGrid); 104 | // console.log(JSON.stringify(json, null, 2)); 105 | expect(typeof json).toBe("object"); 106 | console.log(JSON.stringify(json.isIGTNestedOrAlignedOrBySpeaker, null, 2)); 107 | 108 | }); 109 | 110 | it("should discover not IGT relationships between speaker tiers", function() { 111 | var sampleMultipleSpeakersTiers = fs.readFileSync(__dirname + "/../data/sampleMultipleSpeakers.TextGrid", { 112 | encoding: "UTF-8" 113 | }); 114 | var json = textgrid.textgridToIGT(sampleMultipleSpeakersTiers, "speakersaretiernames"); 115 | // console.log(JSON.stringify(json, null, 2)); 116 | expect(typeof json).toBe("object"); 117 | console.log(json.items.length); 118 | console.log(JSON.stringify(json.isIGTNestedOrAlignedOrBySpeaker, null, 2)); 119 | expect(json.isIGTNestedOrAlignedOrBySpeaker.probablyAligned).toBeFalsy(); 120 | expect(json.isIGTNestedOrAlignedOrBySpeaker.probablyBySpeaker).toBeTruthy(); 121 | 122 | }); 123 | 124 | 125 | it("should accept multiple TextGrids from different files with optionally inserted file names", function() { 126 | var sampleMultipleTextGrids = "\n\nFile name = sampleMultipleSpeakers\n" + fs.readFileSync(__dirname + "/../data/sampleMultipleSpeakers.TextGrid", { 127 | encoding: "UTF-8" 128 | }); 129 | sampleMultipleTextGrids = sampleMultipleTextGrids + "\n\n" + fs.readFileSync(__dirname + "/../data/sample_elan.TextGrid", { 130 | encoding: "UTF-8" 131 | }); 132 | sampleMultipleTextGrids = sampleMultipleTextGrids + "\n\nFile name = sampleNested\n" + fs.readFileSync(__dirname + "/../data/sampleNested.TextGrid", { 133 | encoding: "UTF-8" 134 | }); 135 | var json = textgrid.textgridToIGT(sampleMultipleTextGrids); 136 | // console.log(JSON.stringify(json, null, 2)); 137 | expect(typeof json).toBe("object"); 138 | console.log(json.items.length); 139 | expect(json.items.length).toEqual(16); 140 | expect(json.items[0].fileName).toEqual("sampleMultipleSpeakers"); 141 | expect(json.items[2].fileName).toEqual("Unknown"); 142 | // console.log(JSON.stringify(json.items[json.items.length-1].fileName, null, 2)); 143 | expect(json.items[json.items.length - 1].fileName).toEqual("sampleNested"); 144 | expect(json.fileNames).toEqual([ 'sampleMultipleSpeakers', 'sampleNested' ]); 145 | }); 146 | 147 | it("should put the filename as the text of an interval if there is only 1 or two intervals and the interval text is utterance", function() { 148 | var sampleEmptyTextGrid = "\n\nFile name = sampleEmpty\n" + fs.readFileSync(__dirname + "/../data/sampleEmpty.TextGrid", { 149 | encoding: "UTF-8" 150 | }); 151 | var json = textgrid.textgridToIGT(sampleEmptyTextGrid); 152 | // console.log(JSON.stringify(json, null, 2)); 153 | expect(typeof json).toBe("object"); 154 | // console.log(json.items.length); 155 | expect(json.items.length).toEqual(1); 156 | expect(json.items[0].intervals[0].text).toEqual("sampleEmpty"); 157 | }); 158 | 159 | xit("should create one interval if there were no intervals in the TextGrid", function() { 160 | var sampleEmptyTextGrid = fs.readFileSync(__dirname + "/../data/sampleEmpty.TextGrid", { 161 | encoding: "UTF-8" 162 | }); 163 | var json = textgrid.textgridToIGT(sampleEmptyTextGrid); 164 | // console.log(JSON.stringify(json, null, 2)); 165 | expect(typeof json).toBe("object"); 166 | console.log(json.items.length); 167 | expect(json.items.length).toEqual(1); 168 | }); 169 | }); 170 | -------------------------------------------------------------------------------- /dist/textgrid.js: -------------------------------------------------------------------------------- 1 | /*! textgrid - v2.2.0 - 2021-12-14 2 | * https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS 3 | * Copyright (c) 2021 OpenSourceFieldLinguistics Contribs; Licensed Apache 2.0 */ 4 | (function(exports) { 5 | 6 | 'use strict'; 7 | 8 | var TextGrid = { 9 | 10 | }; 11 | 12 | TextGrid.init = function() { 13 | return "init"; 14 | }; 15 | 16 | 17 | var createAnObject = function(lines) { 18 | var json = {}, 19 | pieces, 20 | key, 21 | value; 22 | 23 | for (var lineIndex = 0; lineIndex < lines.length; lineIndex++) { 24 | pieces = lines[lineIndex].split(" = "); 25 | key = pieces[0].trim().replace(/ /g, "_"); 26 | value = pieces[1].trim().replace(/"/g, ""); 27 | json[key] = value; 28 | } 29 | return json; 30 | }; 31 | 32 | TextGrid.textgridToJSON = function(textgrid, assumeTiersAreSpeakers) { 33 | var lines = textgrid.split("\n"), 34 | json = { 35 | items: [] 36 | }, 37 | line, 38 | lineIndex, 39 | pieces, 40 | items = [], 41 | currentItem = null, 42 | type, 43 | fileName = "Unknown", 44 | fileNames = [], 45 | key, 46 | value, 47 | text; 48 | 49 | // console.log("File length " + lines.length); 50 | while (lines.length > 0) { 51 | line = lines.shift(); 52 | /* keys at the file level */ 53 | if (!line) { 54 | line = lines.shift(); 55 | if (!line) { 56 | if (currentItem) { 57 | currentItem.fileName = fileName; 58 | json.items.push(currentItem); 59 | } 60 | currentItem = null; 61 | fileName = "Unknown"; /* reset filename if there is are two empty lines */ 62 | console.log("Reset filename if there is are two empty lines"); 63 | } 64 | } else if (line.search(/ /) !== 0 && line.search(/\t/) !== 0) { 65 | pieces = line.split(" = "); 66 | if (pieces.length === 2) { 67 | key = pieces[0].trim().replace(/ /g, "_"); 68 | value = pieces[1].trim().replace(/"/g, ""); 69 | json[key] = value; 70 | if (key === "File_name") { 71 | fileName = value + ""; 72 | console.log(" Found a file name " + fileName); 73 | fileNames.push(fileName); 74 | } 75 | } 76 | } else { 77 | /* either point or interval introducers, or keys for items */ 78 | if (line.search(/\[[\0-9]+\]/) !== -1) { 79 | pieces = line.split("["); 80 | type = pieces[0].trim(); 81 | if (type === "item") { 82 | console.log(" Found an item for " + fileName); 83 | if (currentItem) { 84 | currentItem.fileName = fileName; 85 | json.items.push(currentItem); 86 | } 87 | currentItem = {}; 88 | } else if (type === "points") { 89 | var p = createAnObject([lines.shift(), lines.shift()]); 90 | currentItem[type] = currentItem[type] || []; 91 | currentItem[type].push(p); 92 | } else if (type === "intervals") { 93 | var interval = createAnObject([lines.shift(), lines.shift(), lines.shift()]); 94 | currentItem[type] = currentItem[type] || []; 95 | currentItem[type].push(interval); 96 | 97 | } 98 | } else { 99 | pieces = line.split(" = "); 100 | if (pieces.length === 2) { 101 | key = pieces[0].trim().replace(/ /g, "_"); 102 | value = pieces[1].trim().replace(/"/g, ""); 103 | if (key.indexOf(":_size") > -1) { 104 | key = key.replace(":_", "_"); 105 | value = parseInt(value, 10); 106 | } 107 | currentItem[key] = value; 108 | } 109 | } 110 | } 111 | } 112 | if (currentItem) { 113 | currentItem.fileName = fileName; 114 | json.items.push(currentItem); 115 | } 116 | json.fileNames = fileNames; 117 | return json; 118 | }; 119 | 120 | TextGrid.textgridToIGT = function(textgrid, assumeTiersAreSpeakers) { 121 | return this.jsonToIGT(this.textgridToJSON(textgrid, assumeTiersAreSpeakers), assumeTiersAreSpeakers); 122 | }; 123 | 124 | TextGrid.jsonToIGT = function(json, assumeTiersAreSpeakers) { 125 | var tiersByLength = {}; 126 | json.intervalsByXmin = {}; 127 | json.intervalsByText = {}; 128 | var itemIndex; 129 | var intervalIndex; 130 | var xmin, 131 | xmax, 132 | key, 133 | interval, 134 | fileName, 135 | text, 136 | length, 137 | probablyFromElanWithSpeakerEncodedInTierName = false, 138 | probablyFromElanWithSpeakerEncodedInTierNameCount = 0; 139 | 140 | var maximizeFindingTextInAudio = /[ #?!'".,\/\(\)\*\#0-9-]/g; 141 | var tierNames = json.items.map(function(tier) { 142 | if (tier.name.indexOf("@") > -1 /* probably elan tiers */ ) { 143 | tier.speaker = tier.name.substring(tier.name.indexOf("@") + 1).trim(); 144 | tier.name = tier.name.substring(0, tier.name.indexOf("@")).trim(); 145 | probablyFromElanWithSpeakerEncodedInTierNameCount++; 146 | } 147 | if (assumeTiersAreSpeakers) { 148 | tier.speaker = tier.name; 149 | } 150 | if (tier.name === "silences") { 151 | tier.name = "utterances"; 152 | } 153 | return tier.name; 154 | }); 155 | // console.log(tierNames); 156 | if (tierNames.length - probablyFromElanWithSpeakerEncodedInTierNameCount === 0) { 157 | probablyFromElanWithSpeakerEncodedInTierName = true; 158 | } 159 | if (!json || !json.items) { 160 | return json; 161 | } 162 | for (itemIndex = 0; itemIndex < json.items.length; itemIndex++) { 163 | tiersByLength[json.items[itemIndex].name] = json.items[itemIndex].intervals_size || json.items[itemIndex].points_size; 164 | if (json.items[itemIndex].intervals) { 165 | for (intervalIndex = 0; intervalIndex < json.items[itemIndex].intervals.length; intervalIndex++) { 166 | xmin = this.marginForConsideringIntervalsMatching(json.items[itemIndex].intervals[intervalIndex].xmin); 167 | xmax = this.marginForConsideringIntervalsMatching(json.items[itemIndex].intervals[intervalIndex].xmax); 168 | interval = json.items[itemIndex].intervals[intervalIndex]; 169 | interval.fileName = json.items[itemIndex].fileName; 170 | interval.tierName = json.items[itemIndex].name; 171 | interval.speaker = json.items[itemIndex].speaker; 172 | key = xmin + ":" + xmax; 173 | json.intervalsByXmin[key] = json.intervalsByXmin[key] || []; 174 | json.intervalsByXmin[key].push(interval); 175 | 176 | text = interval.text ? interval.text.trim().toLocaleLowerCase().replace(maximizeFindingTextInAudio, "") : ""; 177 | if (text) { 178 | // if its the only interval, and it says utterance, put the file name there instead under the assumption that the filename is probably meaningful 179 | if (text === "utterance" && json.items[itemIndex].intervals.length < 3) { 180 | text = interval.fileName; 181 | if (text.indexOf(".") > -1) { 182 | text = text.substring(0, interval.fileName.lastIndexOf(".")); 183 | } 184 | text = text.trim().replace(/_/g, " "); 185 | // console.log("text replaced with filename. " + text); 186 | interval.text = text; 187 | } 188 | json.intervalsByText[text] = json.intervalsByText[text] || []; 189 | length = json.intervalsByText[text].length; 190 | json.intervalsByText[text][length] = interval; 191 | } 192 | 193 | //json.intervalsByXmin[key].push({ 194 | //text: interval.text, 195 | //tierName: tierName 196 | //}); 197 | 198 | //json.intervalsByXmin[xmin + ":" + xmax].push({ 199 | //tierName: interval.text 200 | //}); 201 | } 202 | } 203 | } 204 | // this.printIGT(json.intervalsByXmin); 205 | json.probablyFromElanWithSpeakerEncodedInTierName = probablyFromElanWithSpeakerEncodedInTierName; 206 | json.isIGTNestedOrAlignedOrBySpeaker = this.isIGTNestedOrAlignedOrBySpeaker(json); 207 | return json; 208 | }; 209 | 210 | TextGrid.isIGTNestedOrAlignedOrBySpeaker = function(json) { 211 | var intervals = json.intervalsByXmin; 212 | var histogram = {}, 213 | bin, 214 | intervalKey, 215 | totalPotentialIGTIntervals = 0, 216 | probablyBySpeaker = false, 217 | probablyAligned = false; 218 | 219 | for (var tier in json.items) { 220 | if (json.items.hasOwnProperty(tier) && json.items[tier].speaker) { 221 | probablyBySpeaker = true; 222 | } 223 | } 224 | 225 | for (intervalKey in intervals) { 226 | histogram[intervals[intervalKey].length] = histogram[intervals[intervalKey].length] ? histogram[intervals[intervalKey].length] + 1 : 1; 227 | totalPotentialIGTIntervals++; 228 | } 229 | /* Normalize the histogram */ 230 | for (bin in histogram) { 231 | histogram[bin] = histogram[bin] / totalPotentialIGTIntervals; 232 | if (bin > 1 && histogram[bin] > 0.10) { 233 | probablyAligned = true; 234 | } 235 | // console.log(histogram[bin]); 236 | } 237 | 238 | // If there are more than 4 files, they are probably not IGT across files. 239 | if (json.fileNames && json.fileNames.length > 4) { 240 | probablyAligned = false; 241 | } 242 | // console.log(histogram); 243 | // console.log("probably aligned " + probablyAligned); 244 | 245 | return { 246 | histogram: histogram, 247 | probablyAligned: probablyAligned, 248 | probablyBySpeaker: probablyBySpeaker 249 | }; 250 | }; 251 | 252 | TextGrid.marginForConsideringIntervalsMatching = function(value, optionalMillisecond) { 253 | if (optionalMillisecond) { 254 | optionalMillisecond = 100 / optionalMillisecond; 255 | } else { 256 | optionalMillisecond = 100 / 20; 257 | } 258 | return (Math.round(value * optionalMillisecond) / optionalMillisecond).toFixed(2); 259 | }; 260 | 261 | TextGrid.printIGT = function(igtIntervalsJSON) { 262 | var mapper = function(interval) { 263 | return interval.xmin + "," + interval.xmax + "," + interval.text; 264 | }; 265 | for (var interval in igtIntervalsJSON) { 266 | console.log(interval); 267 | if (igtIntervalsJSON.hasOwnProperty(interval)) { 268 | console.log(igtIntervalsJSON[interval].map(mapper)); 269 | } 270 | } 271 | }; 272 | 273 | exports.TextGrid = TextGrid; 274 | 275 | }(typeof exports === "object" && exports || this)); 276 | -------------------------------------------------------------------------------- /lib/textgrid.js: -------------------------------------------------------------------------------- 1 | /* 2 | * textgrid 3 | * https://github.com/OpenSourceFieldlinguistics/PraatTextGridJS 4 | * 5 | * Copyright (c) 2014 OpenSourceFieldLinguistics Contribs 6 | * Licensed under the Apache 2.0 license. 7 | */ 8 | 9 | (function(exports) { 10 | 11 | 'use strict'; 12 | 13 | var TextGrid = { 14 | 15 | }; 16 | 17 | TextGrid.init = function() { 18 | return "init"; 19 | }; 20 | 21 | 22 | var createAnObject = function(lines) { 23 | var json = {}, 24 | pieces, 25 | key, 26 | value; 27 | 28 | for (var lineIndex = 0; lineIndex < lines.length; lineIndex++) { 29 | pieces = lines[lineIndex].split(" = "); 30 | key = pieces[0].trim().replace(/ /g, "_"); 31 | value = pieces[1].trim().replace(/"/g, ""); 32 | json[key] = value; 33 | } 34 | return json; 35 | }; 36 | 37 | TextGrid.textgridToJSON = function(textgrid, assumeTiersAreSpeakers) { 38 | var lines = textgrid.split("\n"), 39 | json = { 40 | items: [] 41 | }, 42 | line, 43 | lineIndex, 44 | pieces, 45 | items = [], 46 | currentItem = null, 47 | type, 48 | fileName = "Unknown", 49 | fileNames = [], 50 | key, 51 | value, 52 | text; 53 | 54 | // console.log("File length " + lines.length); 55 | while (lines.length > 0) { 56 | line = lines.shift(); 57 | /* keys at the file level */ 58 | if (!line) { 59 | line = lines.shift(); 60 | if (!line) { 61 | if (currentItem) { 62 | currentItem.fileName = fileName; 63 | json.items.push(currentItem); 64 | } 65 | currentItem = null; 66 | fileName = "Unknown"; /* reset filename if there is are two empty lines */ 67 | console.log("Reset filename if there is are two empty lines"); 68 | } 69 | } else if (line.search(/ /) !== 0 && line.search(/\t/) !== 0) { 70 | pieces = line.split(" = "); 71 | if (pieces.length === 2) { 72 | key = pieces[0].trim().replace(/ /g, "_"); 73 | value = pieces[1].trim().replace(/"/g, ""); 74 | json[key] = value; 75 | if (key === "File_name") { 76 | fileName = value + ""; 77 | console.log(" Found a file name " + fileName); 78 | fileNames.push(fileName); 79 | } 80 | } 81 | } else { 82 | /* either point or interval introducers, or keys for items */ 83 | if (line.search(/\[[\0-9]+\]/) !== -1) { 84 | pieces = line.split("["); 85 | type = pieces[0].trim(); 86 | if (type === "item") { 87 | console.log(" Found an item for " + fileName); 88 | if (currentItem) { 89 | currentItem.fileName = fileName; 90 | json.items.push(currentItem); 91 | } 92 | currentItem = {}; 93 | } else if (type === "points") { 94 | var p = createAnObject([lines.shift(), lines.shift()]); 95 | currentItem[type] = currentItem[type] || []; 96 | currentItem[type].push(p); 97 | } else if (type === "intervals") { 98 | var interval = createAnObject([lines.shift(), lines.shift(), lines.shift()]); 99 | currentItem[type] = currentItem[type] || []; 100 | currentItem[type].push(interval); 101 | 102 | } 103 | } else { 104 | pieces = line.split(" = "); 105 | if (pieces.length === 2) { 106 | key = pieces[0].trim().replace(/ /g, "_"); 107 | value = pieces[1].trim().replace(/"/g, ""); 108 | if (key.indexOf(":_size") > -1) { 109 | key = key.replace(":_", "_"); 110 | value = parseInt(value, 10); 111 | } 112 | currentItem[key] = value; 113 | } 114 | } 115 | } 116 | } 117 | if (currentItem) { 118 | currentItem.fileName = fileName; 119 | json.items.push(currentItem); 120 | } 121 | json.fileNames = fileNames; 122 | return json; 123 | }; 124 | 125 | TextGrid.textgridToIGT = function(textgrid, assumeTiersAreSpeakers) { 126 | return this.jsonToIGT(this.textgridToJSON(textgrid, assumeTiersAreSpeakers), assumeTiersAreSpeakers); 127 | }; 128 | 129 | TextGrid.jsonToIGT = function(json, assumeTiersAreSpeakers) { 130 | var tiersByLength = {}; 131 | json.intervalsByXmin = {}; 132 | json.intervalsByText = {}; 133 | var itemIndex; 134 | var intervalIndex; 135 | var xmin, 136 | xmax, 137 | key, 138 | interval, 139 | fileName, 140 | text, 141 | length, 142 | probablyFromElanWithSpeakerEncodedInTierName = false, 143 | probablyFromElanWithSpeakerEncodedInTierNameCount = 0; 144 | 145 | var maximizeFindingTextInAudio = /[ #?!'".,\/\(\)\*\#0-9-]/g; 146 | var tierNames = json.items.map(function(tier) { 147 | if (tier.name.indexOf("@") > -1 /* probably elan tiers */ ) { 148 | tier.speaker = tier.name.substring(tier.name.indexOf("@") + 1).trim(); 149 | tier.name = tier.name.substring(0, tier.name.indexOf("@")).trim(); 150 | probablyFromElanWithSpeakerEncodedInTierNameCount++; 151 | } 152 | if (assumeTiersAreSpeakers) { 153 | tier.speaker = tier.name; 154 | } 155 | if (tier.name === "silences") { 156 | tier.name = "utterances"; 157 | } 158 | return tier.name; 159 | }); 160 | // console.log(tierNames); 161 | if (tierNames.length - probablyFromElanWithSpeakerEncodedInTierNameCount === 0) { 162 | probablyFromElanWithSpeakerEncodedInTierName = true; 163 | } 164 | if (!json || !json.items) { 165 | return json; 166 | } 167 | for (itemIndex = 0; itemIndex < json.items.length; itemIndex++) { 168 | tiersByLength[json.items[itemIndex].name] = json.items[itemIndex].intervals_size || json.items[itemIndex].points_size; 169 | if (json.items[itemIndex].intervals) { 170 | for (intervalIndex = 0; intervalIndex < json.items[itemIndex].intervals.length; intervalIndex++) { 171 | xmin = this.marginForConsideringIntervalsMatching(json.items[itemIndex].intervals[intervalIndex].xmin); 172 | xmax = this.marginForConsideringIntervalsMatching(json.items[itemIndex].intervals[intervalIndex].xmax); 173 | interval = json.items[itemIndex].intervals[intervalIndex]; 174 | interval.fileName = json.items[itemIndex].fileName; 175 | interval.tierName = json.items[itemIndex].name; 176 | interval.speaker = json.items[itemIndex].speaker; 177 | key = xmin + ":" + xmax; 178 | json.intervalsByXmin[key] = json.intervalsByXmin[key] || []; 179 | json.intervalsByXmin[key].push(interval); 180 | 181 | text = interval.text ? interval.text.trim().toLocaleLowerCase().replace(maximizeFindingTextInAudio, "") : ""; 182 | if (text) { 183 | // if its the only interval, and it says utterance, put the file name there instead under the assumption that the filename is probably meaningful 184 | if (text === "utterance" && json.items[itemIndex].intervals.length < 3) { 185 | text = interval.fileName; 186 | if (text.indexOf(".") > -1) { 187 | text = text.substring(0, interval.fileName.lastIndexOf(".")); 188 | } 189 | text = text.trim().replace(/_/g, " "); 190 | // console.log("text replaced with filename. " + text); 191 | interval.text = text; 192 | } 193 | json.intervalsByText[text] = json.intervalsByText[text] || []; 194 | length = json.intervalsByText[text].length; 195 | json.intervalsByText[text][length] = interval; 196 | } 197 | 198 | //json.intervalsByXmin[key].push({ 199 | //text: interval.text, 200 | //tierName: tierName 201 | //}); 202 | 203 | //json.intervalsByXmin[xmin + ":" + xmax].push({ 204 | //tierName: interval.text 205 | //}); 206 | } 207 | } 208 | } 209 | // this.printIGT(json.intervalsByXmin); 210 | json.probablyFromElanWithSpeakerEncodedInTierName = probablyFromElanWithSpeakerEncodedInTierName; 211 | json.isIGTNestedOrAlignedOrBySpeaker = this.isIGTNestedOrAlignedOrBySpeaker(json); 212 | return json; 213 | }; 214 | 215 | TextGrid.isIGTNestedOrAlignedOrBySpeaker = function(json) { 216 | var intervals = json.intervalsByXmin; 217 | var histogram = {}, 218 | bin, 219 | intervalKey, 220 | totalPotentialIGTIntervals = 0, 221 | probablyBySpeaker = false, 222 | probablyAligned = false; 223 | 224 | for (var tier in json.items) { 225 | if (json.items.hasOwnProperty(tier) && json.items[tier].speaker) { 226 | probablyBySpeaker = true; 227 | } 228 | } 229 | 230 | for (intervalKey in intervals) { 231 | histogram[intervals[intervalKey].length] = histogram[intervals[intervalKey].length] ? histogram[intervals[intervalKey].length] + 1 : 1; 232 | totalPotentialIGTIntervals++; 233 | } 234 | /* Normalize the histogram */ 235 | for (bin in histogram) { 236 | histogram[bin] = histogram[bin] / totalPotentialIGTIntervals; 237 | if (bin > 1 && histogram[bin] > 0.10) { 238 | probablyAligned = true; 239 | } 240 | // console.log(histogram[bin]); 241 | } 242 | 243 | // If there are more than 4 files, they are probably not IGT across files. 244 | if (json.fileNames && json.fileNames.length > 4) { 245 | probablyAligned = false; 246 | } 247 | // console.log(histogram); 248 | // console.log("probably aligned " + probablyAligned); 249 | 250 | return { 251 | histogram: histogram, 252 | probablyAligned: probablyAligned, 253 | probablyBySpeaker: probablyBySpeaker 254 | }; 255 | }; 256 | 257 | TextGrid.marginForConsideringIntervalsMatching = function(value, optionalMillisecond) { 258 | if (optionalMillisecond) { 259 | optionalMillisecond = 100 / optionalMillisecond; 260 | } else { 261 | optionalMillisecond = 100 / 20; 262 | } 263 | return (Math.round(value * optionalMillisecond) / optionalMillisecond).toFixed(2); 264 | }; 265 | 266 | TextGrid.printIGT = function(igtIntervalsJSON) { 267 | var mapper = function(interval) { 268 | return interval.xmin + "," + interval.xmax + "," + interval.text; 269 | }; 270 | for (var interval in igtIntervalsJSON) { 271 | console.log(interval); 272 | if (igtIntervalsJSON.hasOwnProperty(interval)) { 273 | console.log(igtIntervalsJSON[interval].map(mapper)); 274 | } 275 | } 276 | }; 277 | 278 | exports.TextGrid = TextGrid; 279 | 280 | }(typeof exports === "object" && exports || this)); 281 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /data/sampleUtterances.TextGrid: -------------------------------------------------------------------------------- 1 | File type = "ooTextFile" 2 | Object class = "TextGrid" 3 | 4 | xmin = 0 5 | xmax = 178.60266666666666 6 | tiers? 7 | size = 2 8 | item []: 9 | item [1]: 10 | class = "TextTier" 11 | name = "syllables" 12 | xmin = 0 13 | xmax = 178.60266666666666 14 | points: size = 726 15 | points [1]: 16 | number = 1.187064461186207 17 | mark = "1" 18 | points [2]: 19 | number = 1.314035835226656 20 | mark = "2" 21 | points [3]: 22 | number = 1.4384186050859216 23 | mark = "3" 24 | points [4]: 25 | number = 1.5531913098170418 26 | mark = "4" 27 | points [5]: 28 | number = 1.7025326887694625 29 | mark = "5" 30 | points [6]: 31 | number = 1.9408889761767438 32 | mark = "6" 33 | points [7]: 34 | number = 2.1882851284371267 35 | mark = "7" 36 | points [8]: 37 | number = 2.277948622781001 38 | mark = "8" 39 | points [9]: 40 | number = 2.3999793526654654 41 | mark = "9" 42 | points [10]: 43 | number = 2.962216898978141 44 | mark = "10" 45 | points [11]: 46 | number = 3.0544767808459214 47 | mark = "11" 48 | points [12]: 49 | number = 3.2359935306294716 50 | mark = "12" 51 | points [13]: 52 | number = 3.3725033641806705 53 | mark = "13" 54 | points [14]: 55 | number = 3.529821205285573 56 | mark = "14" 57 | points [15]: 58 | number = 3.9306666471581315 59 | mark = "15" 60 | points [16]: 61 | number = 4.0831397984704045 62 | mark = "16" 63 | points [17]: 64 | number = 4.344257846625297 65 | mark = "17" 66 | points [18]: 67 | number = 5.377401043046937 68 | mark = "18" 69 | points [19]: 70 | number = 5.518418000779108 71 | mark = "19" 72 | points [20]: 73 | number = 5.834590025896496 74 | mark = "20" 75 | points [21]: 76 | number = 6.292493639036973 77 | mark = "21" 78 | points [22]: 79 | number = 6.4996353935026665 80 | mark = "22" 81 | points [23]: 82 | number = 6.771635241443867 83 | mark = "23" 84 | points [24]: 85 | number = 6.966243110786102 86 | mark = "24" 87 | points [25]: 88 | number = 7.39027921544603 89 | mark = "25" 90 | points [26]: 91 | number = 8.50502574618211 92 | mark = "26" 93 | points [27]: 94 | number = 8.661577799454111 95 | mark = "27" 96 | points [28]: 97 | number = 8.869686608033504 98 | mark = "28" 99 | points [29]: 100 | number = 9.093920111455894 101 | mark = "29" 102 | points [30]: 103 | number = 9.283552947923347 104 | mark = "30" 105 | points [31]: 106 | number = 9.355534760315393 107 | mark = "31" 108 | points [32]: 109 | number = 9.610658964124312 110 | mark = "32" 111 | points [33]: 112 | number = 9.927687496586117 113 | mark = "33" 114 | points [34]: 115 | number = 10.138799404993794 116 | mark = "34" 117 | points [35]: 118 | number = 10.29213612778403 119 | mark = "35" 120 | points [36]: 121 | number = 10.591597022213524 122 | mark = "36" 123 | points [37]: 124 | number = 11.192070610489044 125 | mark = "37" 126 | points [38]: 127 | number = 11.68109855974291 128 | mark = "38" 129 | points [39]: 130 | number = 11.922794474938858 131 | mark = "39" 132 | points [40]: 133 | number = 12.10447298731966 134 | mark = "40" 135 | points [41]: 136 | number = 12.244020332007807 137 | mark = "41" 138 | points [42]: 139 | number = 12.54067504500819 140 | mark = "42" 141 | points [43]: 142 | number = 13.187882302845317 143 | mark = "43" 144 | points [44]: 145 | number = 13.618837807065834 146 | mark = "44" 147 | points [45]: 148 | number = 13.964513081201414 149 | mark = "45" 150 | points [46]: 151 | number = 14.07811021960432 152 | mark = "46" 153 | points [47]: 154 | number = 14.37998762854076 155 | mark = "47" 156 | points [48]: 157 | number = 14.540648010075035 158 | mark = "48" 159 | points [49]: 160 | number = 14.842761620083667 161 | mark = "49" 162 | points [50]: 163 | number = 15.13568071952798 164 | mark = "50" 165 | points [51]: 166 | number = 15.321159363565926 167 | mark = "51" 168 | points [52]: 169 | number = 15.53375300418995 170 | mark = "52" 171 | points [53]: 172 | number = 15.776255389562692 173 | mark = "53" 174 | points [54]: 175 | number = 15.961957588039898 176 | mark = "54" 177 | points [55]: 178 | number = 16.1296784575388 179 | mark = "55" 180 | points [56]: 181 | number = 17.639348312079843 182 | mark = "56" 183 | points [57]: 184 | number = 17.93316545986138 185 | mark = "57" 186 | points [58]: 187 | number = 18.07558035532388 188 | mark = "58" 189 | points [59]: 190 | number = 18.309962547195262 191 | mark = "59" 192 | points [60]: 193 | number = 18.413396580443813 194 | mark = "60" 195 | points [61]: 196 | number = 18.680762599521724 197 | mark = "61" 198 | points [62]: 199 | number = 18.886613454125968 200 | mark = "62" 201 | points [63]: 202 | number = 19.25672367950791 203 | mark = "63" 204 | points [64]: 205 | number = 19.488139150219702 206 | mark = "64" 207 | points [65]: 208 | number = 19.7086101302123 209 | mark = "65" 210 | points [66]: 211 | number = 19.87272293778733 212 | mark = "66" 213 | points [67]: 214 | number = 20.127760650377468 215 | mark = "67" 216 | points [68]: 217 | number = 20.35718079764945 218 | mark = "68" 219 | points [69]: 220 | number = 20.607430534713693 221 | mark = "69" 222 | points [70]: 223 | number = 20.983176579063358 224 | mark = "70" 225 | points [71]: 226 | number = 21.35462945612581 227 | mark = "71" 228 | points [72]: 229 | number = 21.638674989651463 230 | mark = "72" 231 | points [73]: 232 | number = 21.84738787623736 233 | mark = "73" 234 | points [74]: 235 | number = 22.08807607934926 236 | mark = "74" 237 | points [75]: 238 | number = 22.20453315038928 239 | mark = "75" 240 | points [76]: 241 | number = 22.395677154763302 242 | mark = "76" 243 | points [77]: 244 | number = 22.73853143567527 245 | mark = "77" 246 | points [78]: 247 | number = 23.006501093089756 248 | mark = "78" 249 | points [79]: 250 | number = 23.16646223340467 251 | mark = "79" 252 | points [80]: 253 | number = 23.24070132946391 254 | mark = "80" 255 | points [81]: 256 | number = 24.847920470113817 257 | mark = "81" 258 | points [82]: 259 | number = 25.200940847713326 260 | mark = "82" 261 | points [83]: 262 | number = 25.717878439936246 263 | mark = "83" 264 | points [84]: 265 | number = 25.842386001260614 266 | mark = "84" 267 | points [85]: 268 | number = 26.084124057224088 269 | mark = "85" 270 | points [86]: 271 | number = 26.292803889841238 272 | mark = "86" 273 | points [87]: 274 | number = 26.545075228732404 275 | mark = "87" 276 | points [88]: 277 | number = 26.647083960487542 278 | mark = "88" 279 | points [89]: 280 | number = 26.804135236691252 281 | mark = "89" 282 | points [90]: 283 | number = 26.96794975402397 284 | mark = "90" 285 | points [91]: 286 | number = 27.266800548230787 287 | mark = "91" 288 | points [92]: 289 | number = 27.602764725414414 290 | mark = "92" 291 | points [93]: 292 | number = 27.669780721188044 293 | mark = "93" 294 | points [94]: 295 | number = 27.906641422470265 296 | mark = "94" 297 | points [95]: 298 | number = 28.18464304312438 299 | mark = "95" 300 | points [96]: 301 | number = 28.26273285205289 302 | mark = "96" 303 | points [97]: 304 | number = 28.380784495818464 305 | mark = "97" 306 | points [98]: 307 | number = 28.720409628027966 308 | mark = "98" 309 | points [99]: 310 | number = 28.89513290911898 311 | mark = "99" 312 | points [100]: 313 | number = 29.181400249262964 314 | mark = "100" 315 | points [101]: 316 | number = 29.275223425574104 317 | mark = "101" 318 | points [102]: 319 | number = 29.41594407379309 320 | mark = "102" 321 | points [103]: 322 | number = 29.667798647732592 323 | mark = "103" 324 | points [104]: 325 | number = 30.094083367769592 326 | mark = "104" 327 | points [105]: 328 | number = 30.30527704422976 329 | mark = "105" 330 | points [106]: 331 | number = 30.5151288568175 332 | mark = "106" 333 | points [107]: 334 | number = 31.022382254370413 335 | mark = "107" 336 | points [108]: 337 | number = 31.21268832882909 338 | mark = "108" 339 | points [109]: 340 | number = 31.487758142400093 341 | mark = "109" 342 | points [110]: 343 | number = 31.640816640864013 344 | mark = "110" 345 | points [111]: 346 | number = 31.767334426494035 347 | mark = "111" 348 | points [112]: 349 | number = 32.00090146123514 350 | mark = "112" 351 | points [113]: 352 | number = 33.535134843046926 353 | mark = "113" 354 | points [114]: 355 | number = 33.687702182295524 356 | mark = "114" 357 | points [115]: 358 | number = 33.95489854456326 359 | mark = "115" 360 | points [116]: 361 | number = 34.178519181943926 362 | mark = "116" 363 | points [117]: 364 | number = 34.35143166981765 365 | mark = "117" 366 | points [118]: 367 | number = 34.64511015915501 368 | mark = "118" 369 | points [119]: 370 | number = 35.06753667083642 371 | mark = "119" 372 | points [120]: 373 | number = 35.1754964739663 374 | mark = "120" 375 | points [121]: 376 | number = 35.519428676400146 377 | mark = "121" 378 | points [122]: 379 | number = 35.71307412267027 380 | mark = "122" 381 | points [123]: 382 | number = 35.913064069844864 383 | mark = "123" 384 | points [124]: 385 | number = 36.140819994529636 386 | mark = "124" 387 | points [125]: 388 | number = 36.36132805167596 389 | mark = "125" 390 | points [126]: 391 | number = 36.966332940508096 392 | mark = "126" 393 | points [127]: 394 | number = 37.07626017654263 395 | mark = "127" 396 | points [128]: 397 | number = 37.60016212054577 398 | mark = "128" 399 | points [129]: 400 | number = 37.66837160251378 401 | mark = "129" 402 | points [130]: 403 | number = 37.74710953634623 404 | mark = "130" 405 | points [131]: 406 | number = 37.99342241303628 407 | mark = "131" 408 | points [132]: 409 | number = 38.185279246596984 410 | mark = "132" 411 | points [133]: 412 | number = 38.36750875586929 413 | mark = "133" 414 | points [134]: 415 | number = 38.62234232738885 416 | mark = "134" 417 | points [135]: 418 | number = 38.703021540443395 419 | mark = "135" 420 | points [136]: 421 | number = 38.77749623928933 422 | mark = "136" 423 | points [137]: 424 | number = 38.928238090500564 425 | mark = "137" 426 | points [138]: 427 | number = 39.01153375187911 428 | mark = "138" 429 | points [139]: 430 | number = 39.33999795143564 431 | mark = "139" 432 | points [140]: 433 | number = 39.51865330961519 434 | mark = "140" 435 | points [141]: 436 | number = 39.646752445637745 437 | mark = "141" 438 | points [142]: 439 | number = 39.75319240679575 440 | mark = "142" 441 | points [143]: 442 | number = 39.88761842022948 443 | mark = "143" 444 | points [144]: 445 | number = 39.981023526757525 446 | mark = "144" 447 | points [145]: 448 | number = 40.08258598854349 449 | mark = "145" 450 | points [146]: 451 | number = 40.19264502952297 452 | mark = "146" 453 | points [147]: 454 | number = 40.57952829035985 455 | mark = "147" 456 | points [148]: 457 | number = 40.71016873239422 458 | mark = "148" 459 | points [149]: 460 | number = 40.962984772022956 461 | mark = "149" 462 | points [150]: 463 | number = 41.13754645997457 464 | mark = "150" 465 | points [151]: 466 | number = 41.33182924850315 467 | mark = "151" 468 | points [152]: 469 | number = 41.65411948306476 470 | mark = "152" 471 | points [153]: 472 | number = 42.121349340463496 473 | mark = "153" 474 | points [154]: 475 | number = 42.4304899773445 476 | mark = "154" 477 | points [155]: 478 | number = 42.527866391093184 479 | mark = "155" 480 | points [156]: 481 | number = 42.6935879535572 482 | mark = "156" 483 | points [157]: 484 | number = 42.9124783795279 485 | mark = "157" 486 | points [158]: 487 | number = 43.06839656740048 488 | mark = "158" 489 | points [159]: 490 | number = 43.22839382346665 491 | mark = "159" 492 | points [160]: 493 | number = 43.38430883033479 494 | mark = "160" 495 | points [161]: 496 | number = 43.67124359781989 497 | mark = "161" 498 | points [162]: 499 | number = 43.87613685230043 500 | mark = "162" 501 | points [163]: 502 | number = 44.08834913348497 503 | mark = "163" 504 | points [164]: 505 | number = 44.23218147057959 506 | mark = "164" 507 | points [165]: 508 | number = 44.48170288594728 509 | mark = "165" 510 | points [166]: 511 | number = 44.58941639763499 512 | mark = "166" 513 | points [167]: 514 | number = 44.743510183188796 515 | mark = "167" 516 | points [168]: 517 | number = 44.90238132766649 518 | mark = "168" 519 | points [169]: 520 | number = 45.11961813645953 521 | mark = "169" 522 | points [170]: 523 | number = 45.183356873163966 524 | mark = "170" 525 | points [171]: 526 | number = 45.355687512908844 527 | mark = "171" 528 | points [172]: 529 | number = 45.44560602259423 530 | mark = "172" 531 | points [173]: 532 | number = 45.67109419691535 533 | mark = "173" 534 | points [174]: 535 | number = 45.873509312711384 536 | mark = "174" 537 | points [175]: 538 | number = 46.226271429550664 539 | mark = "175" 540 | points [176]: 541 | number = 46.4666193257841 542 | mark = "176" 543 | points [177]: 544 | number = 46.581061455306205 545 | mark = "177" 546 | points [178]: 547 | number = 47.02293772754014 548 | mark = "178" 549 | points [179]: 550 | number = 47.138539200930964 551 | mark = "179" 552 | points [180]: 553 | number = 47.35081296351489 554 | mark = "180" 555 | points [181]: 556 | number = 47.51187378857964 557 | mark = "181" 558 | points [182]: 559 | number = 47.66425498807295 560 | mark = "182" 561 | points [183]: 562 | number = 47.78984292379972 563 | mark = "183" 564 | points [184]: 565 | number = 48.0517222637682 566 | mark = "184" 567 | points [185]: 568 | number = 48.31753117320273 569 | mark = "185" 570 | points [186]: 571 | number = 48.48891274375 572 | mark = "186" 573 | points [187]: 574 | number = 48.75806122593685 575 | mark = "187" 576 | points [188]: 577 | number = 48.893851731152786 578 | mark = "188" 579 | points [189]: 580 | number = 49.05607013635997 581 | mark = "189" 582 | points [190]: 583 | number = 49.23332758737256 584 | mark = "190" 585 | points [191]: 586 | number = 49.51220234574048 587 | mark = "191" 588 | points [192]: 589 | number = 49.770574907933955 590 | mark = "192" 591 | points [193]: 592 | number = 49.84359458218973 593 | mark = "193" 594 | points [194]: 595 | number = 50.04287590151684 596 | mark = "194" 597 | points [195]: 598 | number = 50.105135040844644 599 | mark = "195" 600 | points [196]: 601 | number = 50.18026653193294 602 | mark = "196" 603 | points [197]: 604 | number = 50.450172867074436 605 | mark = "197" 606 | points [198]: 607 | number = 50.53965689348989 608 | mark = "198" 609 | points [199]: 610 | number = 50.98992104655152 611 | mark = "199" 612 | points [200]: 613 | number = 51.28825319262306 614 | mark = "200" 615 | points [201]: 616 | number = 51.49894590834885 617 | mark = "201" 618 | points [202]: 619 | number = 51.69525029789314 620 | mark = "202" 621 | points [203]: 622 | number = 51.99450219026048 623 | mark = "203" 624 | points [204]: 625 | number = 52.18927095285011 626 | mark = "204" 627 | points [205]: 628 | number = 52.47353369163812 629 | mark = "205" 630 | points [206]: 631 | number = 52.662388001142794 632 | mark = "206" 633 | points [207]: 634 | number = 52.85140686502317 635 | mark = "207" 636 | points [208]: 637 | number = 53.11824076796311 638 | mark = "208" 639 | points [209]: 640 | number = 53.32269239647301 641 | mark = "209" 642 | points [210]: 643 | number = 53.51897021994799 644 | mark = "210" 645 | points [211]: 646 | number = 53.96857153244993 647 | mark = "211" 648 | points [212]: 649 | number = 54.3471766128288 650 | mark = "212" 651 | points [213]: 652 | number = 54.6355201721823 653 | mark = "213" 654 | points [214]: 655 | number = 54.71942927807983 656 | mark = "214" 657 | points [215]: 658 | number = 54.887507997298854 659 | mark = "215" 660 | points [216]: 661 | number = 55.10069559672735 662 | mark = "216" 663 | points [217]: 664 | number = 55.197897560403305 665 | mark = "217" 666 | points [218]: 667 | number = 55.428898605723646 668 | mark = "218" 669 | points [219]: 670 | number = 56.97227567716329 671 | mark = "219" 672 | points [220]: 673 | number = 57.24285776916669 674 | mark = "220" 675 | points [221]: 676 | number = 57.535880673654695 677 | mark = "221" 678 | points [222]: 679 | number = 57.69896903030145 680 | mark = "222" 681 | points [223]: 682 | number = 57.93693819294461 683 | mark = "223" 684 | points [224]: 685 | number = 58.157999780375256 686 | mark = "224" 687 | points [225]: 688 | number = 58.99720567051282 689 | mark = "225" 690 | points [226]: 691 | number = 59.07237568758998 692 | mark = "226" 693 | points [227]: 694 | number = 59.15175232012438 695 | mark = "227" 696 | points [228]: 697 | number = 59.27605624362033 698 | mark = "228" 699 | points [229]: 700 | number = 59.531063711195195 701 | mark = "229" 702 | points [230]: 703 | number = 59.720067341159094 704 | mark = "230" 705 | points [231]: 706 | number = 59.89656651272289 707 | mark = "231" 708 | points [232]: 709 | number = 60.12857734338322 710 | mark = "232" 711 | points [233]: 712 | number = 60.36340840820127 713 | mark = "233" 714 | points [234]: 715 | number = 60.65125275316859 716 | mark = "234" 717 | points [235]: 718 | number = 61.26436918715463 719 | mark = "235" 720 | points [236]: 721 | number = 61.67365318198177 722 | mark = "236" 723 | points [237]: 724 | number = 62.17346466979109 725 | mark = "237" 726 | points [238]: 727 | number = 62.376887270034295 728 | mark = "238" 729 | points [239]: 730 | number = 62.56139978107261 731 | mark = "239" 732 | points [240]: 733 | number = 62.67093328360372 734 | mark = "240" 735 | points [241]: 736 | number = 62.78771847868577 737 | mark = "241" 738 | points [242]: 739 | number = 63.02492556908015 740 | mark = "242" 741 | points [243]: 742 | number = 63.1280784133931 743 | mark = "243" 744 | points [244]: 745 | number = 63.19406505128678 746 | mark = "244" 747 | points [245]: 748 | number = 63.55955165190876 749 | mark = "245" 750 | points [246]: 751 | number = 63.72321695042682 752 | mark = "246" 753 | points [247]: 754 | number = 63.86138200736641 755 | mark = "247" 756 | points [248]: 757 | number = 64.17291223134012 758 | mark = "248" 759 | points [249]: 760 | number = 64.38177783564177 761 | mark = "249" 762 | points [250]: 763 | number = 65.78154210976813 764 | mark = "250" 765 | points [251]: 766 | number = 65.9691139480263 767 | mark = "251" 768 | points [252]: 769 | number = 66.25413588150154 770 | mark = "252" 771 | points [253]: 772 | number = 66.58100365424025 773 | mark = "253" 774 | points [254]: 775 | number = 66.69638052137293 776 | mark = "254" 777 | points [255]: 778 | number = 66.884467688396 779 | mark = "255" 780 | points [256]: 781 | number = 67.08219504027586 782 | mark = "256" 783 | points [257]: 784 | number = 67.26467001744447 785 | mark = "257" 786 | points [258]: 787 | number = 67.47023499587145 788 | mark = "258" 789 | points [259]: 790 | number = 67.56348075717217 791 | mark = "259" 792 | points [260]: 793 | number = 68.08421252708648 794 | mark = "260" 795 | points [261]: 796 | number = 68.18037043758719 797 | mark = "261" 798 | points [262]: 799 | number = 68.59676727733584 800 | mark = "262" 801 | points [263]: 802 | number = 68.70326781330647 803 | mark = "263" 804 | points [264]: 805 | number = 68.85753732585314 806 | mark = "264" 807 | points [265]: 808 | number = 68.92765441299721 809 | mark = "265" 810 | points [266]: 811 | number = 69.43002130262462 812 | mark = "266" 813 | points [267]: 814 | number = 69.5607627870773 815 | mark = "267" 816 | points [268]: 817 | number = 69.72965493313843 818 | mark = "268" 819 | points [269]: 820 | number = 70.33912017829603 821 | mark = "269" 822 | points [270]: 823 | number = 70.54211275264531 824 | mark = "270" 825 | points [271]: 826 | number = 70.69162124637523 827 | mark = "271" 828 | points [272]: 829 | number = 70.94915588907314 830 | mark = "272" 831 | points [273]: 832 | number = 71.75256719709724 833 | mark = "273" 834 | points [274]: 835 | number = 71.98522405480969 836 | mark = "274" 837 | points [275]: 838 | number = 72.28181121554506 839 | mark = "275" 840 | points [276]: 841 | number = 72.37018544797576 842 | mark = "276" 843 | points [277]: 844 | number = 72.78065651176482 845 | mark = "277" 846 | points [278]: 847 | number = 73.05238014147548 848 | mark = "278" 849 | points [279]: 850 | number = 73.30764498338657 851 | mark = "279" 852 | points [280]: 853 | number = 73.44002111034874 854 | mark = "280" 855 | points [281]: 856 | number = 73.64272032499504 857 | mark = "281" 858 | points [282]: 859 | number = 73.80189086705857 860 | mark = "282" 861 | points [283]: 862 | number = 74.43012168926067 863 | mark = "283" 864 | points [284]: 865 | number = 74.71262651086226 866 | mark = "284" 867 | points [285]: 868 | number = 74.9728722221973 869 | mark = "285" 870 | points [286]: 871 | number = 75.18272955891236 872 | mark = "286" 873 | points [287]: 874 | number = 75.26341836462565 875 | mark = "287" 876 | points [288]: 877 | number = 76.72103456946323 878 | mark = "288" 879 | points [289]: 880 | number = 76.92486168226951 881 | mark = "289" 882 | points [290]: 883 | number = 77.18729084857958 884 | mark = "290" 885 | points [291]: 886 | number = 77.6344038536603 887 | mark = "291" 888 | points [292]: 889 | number = 77.94530629069854 890 | mark = "292" 891 | points [293]: 892 | number = 78.13777150111623 893 | mark = "293" 894 | points [294]: 895 | number = 78.20346709883397 896 | mark = "294" 897 | points [295]: 898 | number = 78.41242322365558 899 | mark = "295" 900 | points [296]: 901 | number = 78.79968579238978 902 | mark = "296" 903 | points [297]: 904 | number = 79.01189011920185 905 | mark = "297" 906 | points [298]: 907 | number = 79.13264673767151 908 | mark = "298" 909 | points [299]: 910 | number = 79.34360479647859 911 | mark = "299" 912 | points [300]: 913 | number = 79.65838022013023 914 | mark = "300" 915 | points [301]: 916 | number = 79.89702757295711 917 | mark = "301" 918 | points [302]: 919 | number = 80.13645972619263 920 | mark = "302" 921 | points [303]: 922 | number = 80.37832192037902 923 | mark = "303" 924 | points [304]: 925 | number = 80.60458796995503 926 | mark = "304" 927 | points [305]: 928 | number = 80.7899118973522 929 | mark = "305" 930 | points [306]: 931 | number = 81.2203584629512 932 | mark = "306" 933 | points [307]: 934 | number = 81.3627882080186 935 | mark = "307" 936 | points [308]: 937 | number = 81.57378854825367 938 | mark = "308" 939 | points [309]: 940 | number = 81.76845053693243 941 | mark = "309" 942 | points [310]: 943 | number = 81.9599399803225 944 | mark = "310" 945 | points [311]: 946 | number = 82.1932554321354 947 | mark = "311" 948 | points [312]: 949 | number = 82.34120296922612 950 | mark = "312" 951 | points [313]: 952 | number = 82.65440237064713 953 | mark = "313" 954 | points [314]: 955 | number = 83.02908897130847 956 | mark = "314" 957 | points [315]: 958 | number = 83.19760120118904 959 | mark = "315" 960 | points [316]: 961 | number = 83.45566108336268 962 | mark = "316" 963 | points [317]: 964 | number = 83.61467118191746 965 | mark = "317" 966 | points [318]: 967 | number = 83.77862389531603 968 | mark = "318" 969 | points [319]: 970 | number = 84.00598142181006 971 | mark = "319" 972 | points [320]: 973 | number = 84.17270970391972 974 | mark = "320" 975 | points [321]: 976 | number = 84.31443392941762 977 | mark = "321" 978 | points [322]: 979 | number = 84.4011768275813 980 | mark = "322" 981 | points [323]: 982 | number = 84.47810481601933 983 | mark = "323" 984 | points [324]: 985 | number = 84.64988983956572 986 | mark = "324" 987 | points [325]: 988 | number = 84.73312005294618 989 | mark = "325" 990 | points [326]: 991 | number = 84.88931494519784 992 | mark = "326" 993 | points [327]: 994 | number = 85.0622495865335 995 | mark = "327" 996 | points [328]: 997 | number = 85.19534281171796 998 | mark = "328" 999 | points [329]: 1000 | number = 85.51554351060734 1001 | mark = "329" 1002 | points [330]: 1003 | number = 85.7011951407872 1004 | mark = "330" 1005 | points [331]: 1006 | number = 85.89974947555652 1007 | mark = "331" 1008 | points [332]: 1009 | number = 86.10292524589288 1010 | mark = "332" 1011 | points [333]: 1012 | number = 86.2940642643221 1013 | mark = "333" 1014 | points [334]: 1015 | number = 86.41883528999247 1016 | mark = "334" 1017 | points [335]: 1018 | number = 86.60374141519661 1019 | mark = "335" 1020 | points [336]: 1021 | number = 86.81575834923908 1022 | mark = "336" 1023 | points [337]: 1024 | number = 87.2394221386756 1025 | mark = "337" 1026 | points [338]: 1027 | number = 87.30628103878794 1028 | mark = "338" 1029 | points [339]: 1030 | number = 87.50894290006198 1031 | mark = "339" 1032 | points [340]: 1033 | number = 87.8647064351864 1034 | mark = "340" 1035 | points [341]: 1036 | number = 88.15816911236097 1037 | mark = "341" 1038 | points [342]: 1039 | number = 88.40161255013307 1040 | mark = "342" 1041 | points [343]: 1042 | number = 88.52662374337505 1043 | mark = "343" 1044 | points [344]: 1045 | number = 88.63561020977595 1046 | mark = "344" 1047 | points [345]: 1048 | number = 88.9754672895717 1049 | mark = "345" 1050 | points [346]: 1051 | number = 89.10934640097308 1052 | mark = "346" 1053 | points [347]: 1054 | number = 89.2125437540013 1055 | mark = "347" 1056 | points [348]: 1057 | number = 89.4478329415859 1058 | mark = "348" 1059 | points [349]: 1060 | number = 89.85016152925076 1061 | mark = "349" 1062 | points [350]: 1063 | number = 90.12561786533213 1064 | mark = "350" 1065 | points [351]: 1066 | number = 90.37058049753176 1067 | mark = "351" 1068 | points [352]: 1069 | number = 90.48765103777598 1070 | mark = "352" 1071 | points [353]: 1072 | number = 90.6682262583816 1073 | mark = "353" 1074 | points [354]: 1075 | number = 91.20826113797938 1076 | mark = "354" 1077 | points [355]: 1078 | number = 91.34835312100219 1079 | mark = "355" 1080 | points [356]: 1081 | number = 91.54781636815501 1082 | mark = "356" 1083 | points [357]: 1084 | number = 91.84778908606577 1085 | mark = "357" 1086 | points [358]: 1087 | number = 92.08701571826971 1088 | mark = "358" 1089 | points [359]: 1090 | number = 92.42770037978576 1091 | mark = "359" 1092 | points [360]: 1093 | number = 92.6126796521367 1094 | mark = "360" 1095 | points [361]: 1096 | number = 92.93601012404281 1097 | mark = "361" 1098 | points [362]: 1099 | number = 93.17408703122048 1100 | mark = "362" 1101 | points [363]: 1102 | number = 93.34513412874196 1103 | mark = "363" 1104 | points [364]: 1105 | number = 94.17727738691414 1106 | mark = "364" 1107 | points [365]: 1108 | number = 94.41524055485573 1109 | mark = "365" 1110 | points [366]: 1111 | number = 94.65104977381567 1112 | mark = "366" 1113 | points [367]: 1114 | number = 94.84178905996853 1115 | mark = "367" 1116 | points [368]: 1117 | number = 94.94598808518914 1118 | mark = "368" 1119 | points [369]: 1120 | number = 95.11656885765507 1121 | mark = "369" 1122 | points [370]: 1123 | number = 95.31505696974517 1124 | mark = "370" 1125 | points [371]: 1126 | number = 95.56980538849281 1127 | mark = "371" 1128 | points [372]: 1129 | number = 95.89461152894393 1130 | mark = "372" 1131 | points [373]: 1132 | number = 96.19760999781998 1133 | mark = "373" 1134 | points [374]: 1135 | number = 96.42774194184598 1136 | mark = "374" 1137 | points [375]: 1138 | number = 96.59107421824369 1139 | mark = "375" 1140 | points [376]: 1141 | number = 96.72824664633599 1142 | mark = "376" 1143 | points [377]: 1144 | number = 97.02644292506447 1145 | mark = "377" 1146 | points [378]: 1147 | number = 97.37232633616368 1148 | mark = "378" 1149 | points [379]: 1150 | number = 97.50810521613454 1151 | mark = "379" 1152 | points [380]: 1153 | number = 98.12309325146566 1154 | mark = "380" 1155 | points [381]: 1156 | number = 98.5608155922818 1157 | mark = "381" 1158 | points [382]: 1159 | number = 98.79029110292633 1160 | mark = "382" 1161 | points [383]: 1162 | number = 99.02159718946301 1163 | mark = "383" 1164 | points [384]: 1165 | number = 99.20450726920534 1166 | mark = "384" 1167 | points [385]: 1168 | number = 99.33566158641923 1169 | mark = "385" 1170 | points [386]: 1171 | number = 99.83258537355441 1172 | mark = "386" 1173 | points [387]: 1174 | number = 99.98720218654319 1175 | mark = "387" 1176 | points [388]: 1177 | number = 100.14464910139247 1178 | mark = "388" 1179 | points [389]: 1180 | number = 100.3885350669474 1181 | mark = "389" 1182 | points [390]: 1183 | number = 100.47271793813069 1184 | mark = "390" 1185 | points [391]: 1186 | number = 100.69862707466076 1187 | mark = "391" 1188 | points [392]: 1189 | number = 100.8544361776647 1190 | mark = "392" 1191 | points [393]: 1192 | number = 101.04429375930988 1193 | mark = "393" 1194 | points [394]: 1195 | number = 101.7661431934648 1196 | mark = "394" 1197 | points [395]: 1198 | number = 102.3762306406707 1199 | mark = "395" 1200 | points [396]: 1201 | number = 102.53205420212852 1202 | mark = "396" 1203 | points [397]: 1204 | number = 102.76135637886222 1205 | mark = "397" 1206 | points [398]: 1207 | number = 102.92560849732627 1208 | mark = "398" 1209 | points [399]: 1210 | number = 103.00128348078151 1211 | mark = "399" 1212 | points [400]: 1213 | number = 103.19192834366794 1214 | mark = "400" 1215 | points [401]: 1216 | number = 103.40097849531081 1217 | mark = "401" 1218 | points [402]: 1219 | number = 103.51159377302208 1220 | mark = "402" 1221 | points [403]: 1222 | number = 103.5852122708394 1223 | mark = "403" 1224 | points [404]: 1225 | number = 103.73745783123671 1226 | mark = "404" 1227 | points [405]: 1228 | number = 103.86825872894853 1229 | mark = "405" 1230 | points [406]: 1231 | number = 104.02933726164781 1232 | mark = "406" 1233 | points [407]: 1234 | number = 104.14257670958271 1235 | mark = "407" 1236 | points [408]: 1237 | number = 104.30363240816652 1238 | mark = "408" 1239 | points [409]: 1240 | number = 104.44792713939303 1241 | mark = "409" 1242 | points [410]: 1243 | number = 104.61105449610017 1244 | mark = "410" 1245 | points [411]: 1246 | number = 104.88746143595057 1247 | mark = "411" 1248 | points [412]: 1249 | number = 105.0344025451225 1250 | mark = "412" 1251 | points [413]: 1252 | number = 105.22878774643925 1253 | mark = "413" 1254 | points [414]: 1255 | number = 105.42222001659265 1256 | mark = "414" 1257 | points [415]: 1258 | number = 105.5916621633865 1259 | mark = "415" 1260 | points [416]: 1261 | number = 105.69420415058151 1262 | mark = "416" 1263 | points [417]: 1264 | number = 105.87333313755866 1265 | mark = "417" 1266 | points [418]: 1267 | number = 106.1269388381507 1268 | mark = "418" 1269 | points [419]: 1270 | number = 107.21305718283186 1271 | mark = "419" 1272 | points [420]: 1273 | number = 107.40243025590121 1274 | mark = "420" 1275 | points [421]: 1276 | number = 107.59494949877273 1277 | mark = "421" 1278 | points [422]: 1279 | number = 107.83797280551715 1280 | mark = "422" 1281 | points [423]: 1282 | number = 108.0666219051285 1283 | mark = "423" 1284 | points [424]: 1285 | number = 108.31045361988224 1286 | mark = "424" 1287 | points [425]: 1288 | number = 108.42039777209563 1289 | mark = "425" 1290 | points [426]: 1291 | number = 108.5211390267812 1292 | mark = "426" 1293 | points [427]: 1294 | number = 108.60173790242497 1295 | mark = "427" 1296 | points [428]: 1297 | number = 108.66187974818551 1298 | mark = "428" 1299 | points [429]: 1300 | number = 108.87860504948024 1301 | mark = "429" 1302 | points [430]: 1303 | number = 108.99062551360875 1304 | mark = "430" 1305 | points [431]: 1306 | number = 109.25483086284086 1307 | mark = "431" 1308 | points [432]: 1309 | number = 109.472194766484 1310 | mark = "432" 1311 | points [433]: 1312 | number = 109.88153892080068 1313 | mark = "433" 1314 | points [434]: 1315 | number = 110.12602176564019 1316 | mark = "434" 1317 | points [435]: 1318 | number = 110.2972561369208 1319 | mark = "435" 1320 | points [436]: 1321 | number = 110.38213818400922 1322 | mark = "436" 1323 | points [437]: 1324 | number = 110.70980622261386 1325 | mark = "437" 1326 | points [438]: 1327 | number = 110.89605286479033 1328 | mark = "438" 1329 | points [439]: 1330 | number = 111.03300730104854 1331 | mark = "439" 1332 | points [440]: 1333 | number = 111.2481188401708 1334 | mark = "440" 1335 | points [441]: 1336 | number = 111.33919433657798 1337 | mark = "441" 1338 | points [442]: 1339 | number = 111.4998711271103 1340 | mark = "442" 1341 | points [443]: 1342 | number = 111.58076376750165 1343 | mark = "443" 1344 | points [444]: 1345 | number = 111.70846222041276 1346 | mark = "444" 1347 | points [445]: 1348 | number = 111.96527421384653 1349 | mark = "445" 1350 | points [446]: 1351 | number = 112.12276521446962 1352 | mark = "446" 1353 | points [447]: 1354 | number = 112.20726734461543 1355 | mark = "447" 1356 | points [448]: 1357 | number = 112.405031715439 1358 | mark = "448" 1359 | points [449]: 1360 | number = 112.49653693378733 1361 | mark = "449" 1362 | points [450]: 1363 | number = 112.65900520687913 1364 | mark = "450" 1365 | points [451]: 1366 | number = 112.82445719165861 1367 | mark = "451" 1368 | points [452]: 1369 | number = 113.07196123012754 1370 | mark = "452" 1371 | points [453]: 1372 | number = 113.67250238966122 1373 | mark = "453" 1374 | points [454]: 1375 | number = 113.85836190101061 1376 | mark = "454" 1377 | points [455]: 1378 | number = 113.91574681440686 1379 | mark = "455" 1380 | points [456]: 1381 | number = 114.09049201210355 1382 | mark = "456" 1383 | points [457]: 1384 | number = 114.35818329740519 1385 | mark = "457" 1386 | points [458]: 1387 | number = 114.45920358558345 1388 | mark = "458" 1389 | points [459]: 1390 | number = 114.65910408854138 1391 | mark = "459" 1392 | points [460]: 1393 | number = 114.9387501421191 1394 | mark = "460" 1395 | points [461]: 1396 | number = 115.06320439221827 1397 | mark = "461" 1398 | points [462]: 1399 | number = 116.7371566219981 1400 | mark = "462" 1401 | points [463]: 1402 | number = 116.84208526283274 1403 | mark = "463" 1404 | points [464]: 1405 | number = 116.98083298737797 1406 | mark = "464" 1407 | points [465]: 1408 | number = 117.1165160756026 1409 | mark = "465" 1410 | points [466]: 1411 | number = 117.42075463867535 1412 | mark = "466" 1413 | points [467]: 1414 | number = 117.55011909851311 1415 | mark = "467" 1416 | points [468]: 1417 | number = 117.67910207147865 1418 | mark = "468" 1419 | points [469]: 1420 | number = 118.03828152964135 1421 | mark = "469" 1422 | points [470]: 1423 | number = 118.21518496022014 1424 | mark = "470" 1425 | points [471]: 1426 | number = 118.3776463289131 1427 | mark = "471" 1428 | points [472]: 1429 | number = 118.56778886596109 1430 | mark = "472" 1431 | points [473]: 1432 | number = 118.91510236989481 1433 | mark = "473" 1434 | points [474]: 1435 | number = 119.06866120334033 1436 | mark = "474" 1437 | points [475]: 1438 | number = 119.43453549469619 1439 | mark = "475" 1440 | points [476]: 1441 | number = 119.60427281425847 1442 | mark = "476" 1443 | points [477]: 1444 | number = 119.71555230865282 1445 | mark = "477" 1446 | points [478]: 1447 | number = 119.97035741839159 1448 | mark = "478" 1449 | points [479]: 1450 | number = 120.08485622172637 1451 | mark = "479" 1452 | points [480]: 1453 | number = 120.17225304095192 1454 | mark = "480" 1455 | points [481]: 1456 | number = 120.4061515703097 1457 | mark = "481" 1458 | points [482]: 1459 | number = 120.57267693966665 1460 | mark = "482" 1461 | points [483]: 1462 | number = 121.10608295488537 1463 | mark = "483" 1464 | points [484]: 1465 | number = 121.29933865180158 1466 | mark = "484" 1467 | points [485]: 1468 | number = 121.45754410077248 1469 | mark = "485" 1470 | points [486]: 1471 | number = 122.20189395884752 1472 | mark = "486" 1473 | points [487]: 1474 | number = 122.29502802181597 1475 | mark = "487" 1476 | points [488]: 1477 | number = 122.35823905164305 1478 | mark = "488" 1479 | points [489]: 1480 | number = 122.72914968956984 1481 | mark = "489" 1482 | points [490]: 1483 | number = 123.05590685521071 1484 | mark = "490" 1485 | points [491]: 1486 | number = 123.24763888005587 1487 | mark = "491" 1488 | points [492]: 1489 | number = 123.41430941783025 1490 | mark = "492" 1491 | points [493]: 1492 | number = 123.55877756997914 1493 | mark = "493" 1494 | points [494]: 1495 | number = 123.80183823193309 1496 | mark = "494" 1497 | points [495]: 1498 | number = 124.00338398511381 1499 | mark = "495" 1500 | points [496]: 1501 | number = 124.1542579596599 1502 | mark = "496" 1503 | points [497]: 1504 | number = 124.34474688501184 1505 | mark = "497" 1506 | points [498]: 1507 | number = 124.52329199775546 1508 | mark = "498" 1509 | points [499]: 1510 | number = 124.75286131836222 1511 | mark = "499" 1512 | points [500]: 1513 | number = 124.80721250299229 1514 | mark = "500" 1515 | points [501]: 1516 | number = 124.91755511001138 1517 | mark = "501" 1518 | points [502]: 1519 | number = 125.22090070356315 1520 | mark = "502" 1521 | points [503]: 1522 | number = 125.61216014945728 1523 | mark = "503" 1524 | points [504]: 1525 | number = 125.8055876744542 1526 | mark = "504" 1527 | points [505]: 1528 | number = 125.90909385948916 1529 | mark = "505" 1530 | points [506]: 1531 | number = 126.0590331573271 1532 | mark = "506" 1533 | points [507]: 1534 | number = 126.15618343236183 1535 | mark = "507" 1536 | points [508]: 1537 | number = 126.53449744420193 1538 | mark = "508" 1539 | points [509]: 1540 | number = 126.93033261563372 1541 | mark = "509" 1542 | points [510]: 1543 | number = 127.29690803996307 1544 | mark = "510" 1545 | points [511]: 1546 | number = 127.57329735393121 1547 | mark = "511" 1548 | points [512]: 1549 | number = 128.0150136692116 1550 | mark = "512" 1551 | points [513]: 1552 | number = 128.21717081918442 1553 | mark = "513" 1554 | points [514]: 1555 | number = 128.37338256140237 1556 | mark = "514" 1557 | points [515]: 1558 | number = 128.60261188221733 1559 | mark = "515" 1560 | points [516]: 1561 | number = 129.35695354654274 1562 | mark = "516" 1563 | points [517]: 1564 | number = 129.56637312704112 1565 | mark = "517" 1566 | points [518]: 1567 | number = 129.78822243401004 1568 | mark = "518" 1569 | points [519]: 1570 | number = 129.93790154191498 1571 | mark = "519" 1572 | points [520]: 1573 | number = 130.01061923250643 1574 | mark = "520" 1575 | points [521]: 1576 | number = 130.19508994448236 1577 | mark = "521" 1578 | points [522]: 1579 | number = 130.28737105172178 1580 | mark = "522" 1581 | points [523]: 1582 | number = 130.39029401027727 1583 | mark = "523" 1584 | points [524]: 1585 | number = 130.8378489803357 1586 | mark = "524" 1587 | points [525]: 1588 | number = 131.17430846746717 1589 | mark = "525" 1590 | points [526]: 1591 | number = 131.44389172434344 1592 | mark = "526" 1593 | points [527]: 1594 | number = 131.60911707819832 1595 | mark = "527" 1596 | points [528]: 1597 | number = 131.77243745777753 1598 | mark = "528" 1599 | points [529]: 1600 | number = 131.95724680641007 1601 | mark = "529" 1602 | points [530]: 1603 | number = 132.10545324747093 1604 | mark = "530" 1605 | points [531]: 1606 | number = 132.38020003284538 1607 | mark = "531" 1608 | points [532]: 1609 | number = 132.57755935463754 1610 | mark = "532" 1611 | points [533]: 1612 | number = 132.657065127422 1613 | mark = "533" 1614 | points [534]: 1615 | number = 132.7706392785036 1616 | mark = "534" 1617 | points [535]: 1618 | number = 132.93090668095752 1619 | mark = "535" 1620 | points [536]: 1621 | number = 133.06239725532498 1622 | mark = "536" 1623 | points [537]: 1624 | number = 133.2135710556208 1625 | mark = "537" 1626 | points [538]: 1627 | number = 133.29805030937254 1628 | mark = "538" 1629 | points [539]: 1630 | number = 133.3656833823517 1631 | mark = "539" 1632 | points [540]: 1633 | number = 133.48313522928052 1634 | mark = "540" 1635 | points [541]: 1636 | number = 133.57108751315343 1637 | mark = "541" 1638 | points [542]: 1639 | number = 133.69227407146016 1640 | mark = "542" 1641 | points [543]: 1642 | number = 133.82055220768916 1643 | mark = "543" 1644 | points [544]: 1645 | number = 133.94150447972393 1646 | mark = "544" 1647 | points [545]: 1648 | number = 134.12190539761062 1649 | mark = "545" 1650 | points [546]: 1651 | number = 134.38681905617827 1652 | mark = "546" 1653 | points [547]: 1654 | number = 134.76087440409947 1655 | mark = "547" 1656 | points [548]: 1657 | number = 135.06455834587396 1658 | mark = "548" 1659 | points [549]: 1660 | number = 135.15058966910053 1661 | mark = "549" 1662 | points [550]: 1663 | number = 135.43404269727452 1664 | mark = "550" 1665 | points [551]: 1666 | number = 135.8325437855729 1667 | mark = "551" 1668 | points [552]: 1669 | number = 135.96636588687403 1670 | mark = "552" 1671 | points [553]: 1672 | number = 136.0918016702898 1673 | mark = "553" 1674 | points [554]: 1675 | number = 136.178539486574 1676 | mark = "554" 1677 | points [555]: 1678 | number = 136.87848102445682 1679 | mark = "555" 1680 | points [556]: 1681 | number = 137.01474464305863 1682 | mark = "556" 1683 | points [557]: 1684 | number = 137.19772738521527 1685 | mark = "557" 1686 | points [558]: 1687 | number = 137.54978453248805 1688 | mark = "558" 1689 | points [559]: 1690 | number = 138.30299089749138 1691 | mark = "559" 1692 | points [560]: 1693 | number = 138.39983494795152 1694 | mark = "560" 1695 | points [561]: 1696 | number = 138.47974557300418 1697 | mark = "561" 1698 | points [562]: 1699 | number = 138.56071223854988 1700 | mark = "562" 1701 | points [563]: 1702 | number = 138.71585789884261 1703 | mark = "563" 1704 | points [564]: 1705 | number = 138.89969181678936 1706 | mark = "564" 1707 | points [565]: 1708 | number = 139.2002709030787 1709 | mark = "565" 1710 | points [566]: 1711 | number = 139.370117884139 1712 | mark = "566" 1713 | points [567]: 1714 | number = 139.64560221419381 1715 | mark = "567" 1716 | points [568]: 1717 | number = 139.78663223299003 1718 | mark = "568" 1719 | points [569]: 1720 | number = 139.93892483400862 1721 | mark = "569" 1722 | points [570]: 1723 | number = 140.19271307255806 1724 | mark = "570" 1725 | points [571]: 1726 | number = 140.38857289233945 1727 | mark = "571" 1728 | points [572]: 1729 | number = 140.59119397895432 1730 | mark = "572" 1731 | points [573]: 1732 | number = 140.73272200014767 1733 | mark = "573" 1734 | points [574]: 1735 | number = 140.8970821247242 1736 | mark = "574" 1737 | points [575]: 1738 | number = 141.02907437850521 1739 | mark = "575" 1740 | points [576]: 1741 | number = 141.16725477762063 1742 | mark = "576" 1743 | points [577]: 1744 | number = 141.3857794773474 1745 | mark = "577" 1746 | points [578]: 1747 | number = 141.8963179193965 1748 | mark = "578" 1749 | points [579]: 1750 | number = 142.0402231345633 1751 | mark = "579" 1752 | points [580]: 1753 | number = 142.4809255210678 1754 | mark = "580" 1755 | points [581]: 1756 | number = 142.66632616662244 1757 | mark = "581" 1758 | points [582]: 1759 | number = 143.06513585376376 1760 | mark = "582" 1761 | points [583]: 1762 | number = 143.34061278535162 1763 | mark = "583" 1764 | points [584]: 1765 | number = 143.4544862497432 1766 | mark = "584" 1767 | points [585]: 1768 | number = 143.72567520941345 1769 | mark = "585" 1770 | points [586]: 1771 | number = 143.83342974933794 1772 | mark = "586" 1773 | points [587]: 1774 | number = 144.0328137367608 1775 | mark = "587" 1776 | points [588]: 1777 | number = 144.35990215893327 1778 | mark = "588" 1779 | points [589]: 1780 | number = 144.53300260771195 1781 | mark = "589" 1782 | points [590]: 1783 | number = 144.81928647990088 1784 | mark = "590" 1785 | points [591]: 1786 | number = 145.04727520245467 1787 | mark = "591" 1788 | points [592]: 1789 | number = 145.1996306923563 1790 | mark = "592" 1791 | points [593]: 1792 | number = 145.4224997278902 1793 | mark = "593" 1794 | points [594]: 1795 | number = 145.63791413499834 1796 | mark = "594" 1797 | points [595]: 1798 | number = 145.76154684209507 1799 | mark = "595" 1800 | points [596]: 1801 | number = 145.9866270962018 1802 | mark = "596" 1803 | points [597]: 1804 | number = 146.21727386946225 1805 | mark = "597" 1806 | points [598]: 1807 | number = 147.014221952602 1808 | mark = "598" 1809 | points [599]: 1810 | number = 147.23861776007163 1811 | mark = "599" 1812 | points [600]: 1813 | number = 147.34756467393794 1814 | mark = "600" 1815 | points [601]: 1816 | number = 147.48272988856473 1817 | mark = "601" 1818 | points [602]: 1819 | number = 147.70457408419614 1820 | mark = "602" 1821 | points [603]: 1822 | number = 147.7803206849575 1823 | mark = "603" 1824 | points [604]: 1825 | number = 147.99019250364 1826 | mark = "604" 1827 | points [605]: 1828 | number = 148.2452936194993 1829 | mark = "605" 1830 | points [606]: 1831 | number = 148.49801450975323 1832 | mark = "606" 1833 | points [607]: 1834 | number = 148.81623528756106 1835 | mark = "607" 1836 | points [608]: 1837 | number = 149.1148949795467 1838 | mark = "608" 1839 | points [609]: 1840 | number = 149.35549269133762 1841 | mark = "609" 1842 | points [610]: 1843 | number = 149.5383962539015 1844 | mark = "610" 1845 | points [611]: 1846 | number = 149.85976653375337 1847 | mark = "611" 1848 | points [612]: 1849 | number = 149.94072089245316 1850 | mark = "612" 1851 | points [613]: 1852 | number = 150.07409885352618 1853 | mark = "613" 1854 | points [614]: 1855 | number = 150.27383802238364 1856 | mark = "614" 1857 | points [615]: 1858 | number = 150.5773687836087 1859 | mark = "615" 1860 | points [616]: 1861 | number = 150.73058269240104 1862 | mark = "616" 1863 | points [617]: 1864 | number = 150.9700982686037 1865 | mark = "617" 1866 | points [618]: 1867 | number = 151.12310872261259 1868 | mark = "618" 1869 | points [619]: 1870 | number = 151.2820412278259 1871 | mark = "619" 1872 | points [620]: 1873 | number = 151.55952046695916 1874 | mark = "620" 1875 | points [621]: 1876 | number = 151.71470906739867 1877 | mark = "621" 1878 | points [622]: 1879 | number = 152.0264501166286 1880 | mark = "622" 1881 | points [623]: 1882 | number = 152.14731562589276 1883 | mark = "623" 1884 | points [624]: 1885 | number = 152.74955254886862 1886 | mark = "624" 1887 | points [625]: 1888 | number = 153.14854823040915 1889 | mark = "625" 1890 | points [626]: 1891 | number = 153.27637195993944 1892 | mark = "626" 1893 | points [627]: 1894 | number = 153.3881419425606 1895 | mark = "627" 1896 | points [628]: 1897 | number = 153.60699105319404 1898 | mark = "628" 1899 | points [629]: 1900 | number = 153.79727606610842 1901 | mark = "629" 1902 | points [630]: 1903 | number = 154.1069628818686 1904 | mark = "630" 1905 | points [631]: 1906 | number = 154.31558502291364 1907 | mark = "631" 1908 | points [632]: 1909 | number = 154.48783349623326 1910 | mark = "632" 1911 | points [633]: 1912 | number = 154.6756873665813 1913 | mark = "633" 1914 | points [634]: 1915 | number = 154.80489273675175 1916 | mark = "634" 1917 | points [635]: 1918 | number = 154.9101059671828 1919 | mark = "635" 1920 | points [636]: 1921 | number = 155.10169647853687 1922 | mark = "636" 1923 | points [637]: 1924 | number = 155.315571146164 1925 | mark = "637" 1926 | points [638]: 1927 | number = 155.45874776559512 1928 | mark = "638" 1929 | points [639]: 1930 | number = 155.5426978227689 1931 | mark = "639" 1932 | points [640]: 1933 | number = 155.7166642104852 1934 | mark = "640" 1935 | points [641]: 1936 | number = 155.87099114037028 1937 | mark = "641" 1938 | points [642]: 1939 | number = 156.14294985655357 1940 | mark = "642" 1941 | points [643]: 1942 | number = 156.27038488840455 1943 | mark = "643" 1944 | points [644]: 1945 | number = 156.3544617440529 1946 | mark = "644" 1947 | points [645]: 1948 | number = 156.4063648648437 1949 | mark = "645" 1950 | points [646]: 1951 | number = 156.60087608017662 1952 | mark = "646" 1953 | points [647]: 1954 | number = 156.77992264715246 1955 | mark = "647" 1956 | points [648]: 1957 | number = 156.97115503826006 1958 | mark = "648" 1959 | points [649]: 1960 | number = 157.23929313796432 1961 | mark = "649" 1962 | points [650]: 1963 | number = 157.32378088510066 1964 | mark = "650" 1965 | points [651]: 1966 | number = 157.4375144148856 1967 | mark = "651" 1968 | points [652]: 1969 | number = 157.8140142369215 1970 | mark = "652" 1971 | points [653]: 1972 | number = 158.04306106771972 1973 | mark = "653" 1974 | points [654]: 1975 | number = 158.16565530119345 1976 | mark = "654" 1977 | points [655]: 1978 | number = 158.53656275378646 1979 | mark = "655" 1980 | points [656]: 1981 | number = 158.65431258014567 1982 | mark = "656" 1983 | points [657]: 1984 | number = 158.76263359843537 1985 | mark = "657" 1986 | points [658]: 1987 | number = 158.87473285206858 1988 | mark = "658" 1989 | points [659]: 1990 | number = 159.08894357861615 1991 | mark = "659" 1992 | points [660]: 1993 | number = 159.3703446203227 1994 | mark = "660" 1995 | points [661]: 1996 | number = 159.45450931212736 1997 | mark = "661" 1998 | points [662]: 1999 | number = 159.57892267579743 2000 | mark = "662" 2001 | points [663]: 2002 | number = 159.79441567550765 2003 | mark = "663" 2004 | points [664]: 2005 | number = 160.08779463180798 2006 | mark = "664" 2007 | points [665]: 2008 | number = 160.2842738051991 2009 | mark = "665" 2010 | points [666]: 2011 | number = 160.66995726245327 2012 | mark = "666" 2013 | points [667]: 2014 | number = 160.8112986905011 2015 | mark = "667" 2016 | points [668]: 2017 | number = 161.1759611274481 2018 | mark = "668" 2019 | points [669]: 2020 | number = 161.48524582486823 2021 | mark = "669" 2022 | points [670]: 2023 | number = 161.87020508433315 2024 | mark = "670" 2025 | points [671]: 2026 | number = 162.03517177749552 2027 | mark = "671" 2028 | points [672]: 2029 | number = 162.20925582118866 2030 | mark = "672" 2031 | points [673]: 2032 | number = 162.3213086075197 2033 | mark = "673" 2034 | points [674]: 2035 | number = 162.59533627265463 2036 | mark = "674" 2037 | points [675]: 2038 | number = 162.7034610935179 2039 | mark = "675" 2040 | points [676]: 2041 | number = 162.80148934062274 2042 | mark = "676" 2043 | points [677]: 2044 | number = 163.07538663726655 2045 | mark = "677" 2046 | points [678]: 2047 | number = 163.35804120930496 2048 | mark = "678" 2049 | points [679]: 2050 | number = 163.48507603272003 2051 | mark = "679" 2052 | points [680]: 2053 | number = 163.57052840080755 2054 | mark = "680" 2055 | points [681]: 2056 | number = 163.89837743116001 2057 | mark = "681" 2058 | points [682]: 2059 | number = 164.00272674884596 2060 | mark = "682" 2061 | points [683]: 2062 | number = 164.26726461714838 2063 | mark = "683" 2064 | points [684]: 2065 | number = 164.44044593470548 2066 | mark = "684" 2067 | points [685]: 2068 | number = 165.34281342439874 2069 | mark = "685" 2070 | points [686]: 2071 | number = 165.831565634229 2072 | mark = "686" 2073 | points [687]: 2074 | number = 167.34689853447293 2075 | mark = "687" 2076 | points [688]: 2077 | number = 167.59013419025698 2078 | mark = "688" 2079 | points [689]: 2080 | number = 167.89073832642873 2081 | mark = "689" 2082 | points [690]: 2083 | number = 167.99427550521997 2084 | mark = "690" 2085 | points [691]: 2086 | number = 168.24959189306256 2087 | mark = "691" 2088 | points [692]: 2089 | number = 168.48541310821903 2090 | mark = "692" 2091 | points [693]: 2092 | number = 168.6089313538073 2093 | mark = "693" 2094 | points [694]: 2095 | number = 168.866568889617 2096 | mark = "694" 2097 | points [695]: 2098 | number = 168.92961690621362 2099 | mark = "695" 2100 | points [696]: 2101 | number = 169.30024707376361 2102 | mark = "696" 2103 | points [697]: 2104 | number = 169.766126315 2105 | mark = "697" 2106 | points [698]: 2107 | number = 169.96914829206736 2108 | mark = "698" 2109 | points [699]: 2110 | number = 170.3360059191862 2111 | mark = "699" 2112 | points [700]: 2113 | number = 170.41747915451336 2114 | mark = "700" 2115 | points [701]: 2116 | number = 170.49706364894715 2117 | mark = "701" 2118 | points [702]: 2119 | number = 170.7217071048849 2120 | mark = "702" 2121 | points [703]: 2122 | number = 170.84714842444532 2123 | mark = "703" 2124 | points [704]: 2125 | number = 170.914438718456 2126 | mark = "704" 2127 | points [705]: 2128 | number = 171.0732039804629 2129 | mark = "705" 2130 | points [706]: 2131 | number = 171.7259257011265 2132 | mark = "706" 2133 | points [707]: 2134 | number = 171.80522164276687 2135 | mark = "707" 2136 | points [708]: 2137 | number = 172.47315461233157 2138 | mark = "708" 2139 | points [709]: 2140 | number = 173.02556518642055 2141 | mark = "709" 2142 | points [710]: 2143 | number = 173.13694459618767 2144 | mark = "710" 2145 | points [711]: 2146 | number = 173.51452830318345 2147 | mark = "711" 2148 | points [712]: 2149 | number = 173.89765704882015 2150 | mark = "712" 2151 | points [713]: 2152 | number = 174.03958637211673 2153 | mark = "713" 2154 | points [714]: 2155 | number = 174.1591100493916 2156 | mark = "714" 2157 | points [715]: 2158 | number = 174.52366943000166 2159 | mark = "715" 2160 | points [716]: 2161 | number = 174.6960618470144 2162 | mark = "716" 2163 | points [717]: 2164 | number = 174.83801835012406 2165 | mark = "717" 2166 | points [718]: 2167 | number = 175.029508821886 2168 | mark = "718" 2169 | points [719]: 2170 | number = 175.63493005759418 2171 | mark = "719" 2172 | points [720]: 2173 | number = 175.94522701031033 2174 | mark = "720" 2175 | points [721]: 2176 | number = 176.096622127172 2177 | mark = "721" 2178 | points [722]: 2179 | number = 176.75870900916166 2180 | mark = "722" 2181 | points [723]: 2182 | number = 177.21274842941125 2183 | mark = "723" 2184 | points [724]: 2185 | number = 177.5042865637023 2186 | mark = "724" 2187 | points [725]: 2188 | number = 177.97165857602968 2189 | mark = "725" 2190 | points [726]: 2191 | number = 178.08454314062377 2192 | mark = "726" 2193 | item [2]: 2194 | class = "IntervalTier" 2195 | name = "silences" 2196 | xmin = 0 2197 | xmax = 178.60266666666666 2198 | intervals: size = 37 2199 | intervals [1]: 2200 | xmin = 0 2201 | xmax = 4.661333333333338 2202 | text = "utterance" 2203 | intervals [2]: 2204 | xmin = 4.661333333333338 2205 | xmax = 5.109333333333337 2206 | text = "silent" 2207 | intervals [3]: 2208 | xmin = 5.109333333333337 2209 | xmax = 7.653333333333338 2210 | text = "utterance" 2211 | intervals [4]: 2212 | xmin = 7.653333333333338 2213 | xmax = 8.357333333333337 2214 | text = "silent" 2215 | intervals [5]: 2216 | xmin = 8.357333333333337 2217 | xmax = 16.165333333333336 2218 | text = "utterance" 2219 | intervals [6]: 2220 | xmin = 16.165333333333336 2221 | xmax = 17.477333333333338 2222 | text = "silent" 2223 | intervals [7]: 2224 | xmin = 17.477333333333338 2225 | xmax = 23.877333333333336 2226 | text = "utterance" 2227 | intervals [8]: 2228 | xmin = 23.877333333333336 2229 | xmax = 24.46933333333334 2230 | text = "silent" 2231 | intervals [9]: 2232 | xmin = 24.46933333333334 2233 | xmax = 32.06933333333334 2234 | text = "utterance" 2235 | intervals [10]: 2236 | xmin = 32.06933333333334 2237 | xmax = 33.34933333333334 2238 | text = "silent" 2239 | intervals [11]: 2240 | xmin = 33.34933333333334 2241 | xmax = 55.90933333333334 2242 | text = "utterance" 2243 | intervals [12]: 2244 | xmin = 55.90933333333334 2245 | xmax = 56.62933333333334 2246 | text = "silent" 2247 | intervals [13]: 2248 | xmin = 56.62933333333334 2249 | xmax = 64.53333333333333 2250 | text = "utterance" 2251 | intervals [14]: 2252 | xmin = 64.53333333333333 2253 | xmax = 65.44533333333334 2254 | text = "silent" 2255 | intervals [15]: 2256 | xmin = 65.44533333333334 2257 | xmax = 75.86133333333333 2258 | text = "utterance" 2259 | intervals [16]: 2260 | xmin = 75.86133333333333 2261 | xmax = 76.66133333333333 2262 | text = "silent" 2263 | intervals [17]: 2264 | xmin = 76.66133333333333 2265 | xmax = 93.39733333333334 2266 | text = "utterance" 2267 | intervals [18]: 2268 | xmin = 93.39733333333334 2269 | xmax = 93.94133333333333 2270 | text = "silent" 2271 | intervals [19]: 2272 | xmin = 93.94133333333333 2273 | xmax = 101.12533333333333 2274 | text = "utterance" 2275 | intervals [20]: 2276 | xmin = 101.12533333333333 2277 | xmax = 101.63733333333333 2278 | text = "silent" 2279 | intervals [21]: 2280 | xmin = 101.63733333333333 2281 | xmax = 106.42133333333334 2282 | text = "utterance" 2283 | intervals [22]: 2284 | xmin = 106.42133333333334 2285 | xmax = 107.12533333333333 2286 | text = "silent" 2287 | intervals [23]: 2288 | xmin = 107.12533333333333 2289 | xmax = 115.70133333333334 2290 | text = "utterance" 2291 | intervals [24]: 2292 | xmin = 115.70133333333334 2293 | xmax = 116.64533333333334 2294 | text = "silent" 2295 | intervals [25]: 2296 | xmin = 116.64533333333334 2297 | xmax = 146.30933333333334 2298 | text = "utterance" 2299 | intervals [26]: 2300 | xmin = 146.30933333333334 2301 | xmax = 146.88533333333334 2302 | text = "silent" 2303 | intervals [27]: 2304 | xmin = 146.88533333333334 2305 | xmax = 152.22933333333333 2306 | text = "utterance" 2307 | intervals [28]: 2308 | xmin = 152.22933333333333 2309 | xmax = 152.70933333333335 2310 | text = "silent" 2311 | intervals [29]: 2312 | xmin = 152.70933333333335 2313 | xmax = 164.74133333333333 2314 | text = "utterance" 2315 | intervals [30]: 2316 | xmin = 164.74133333333333 2317 | xmax = 165.25333333333333 2318 | text = "silent" 2319 | intervals [31]: 2320 | xmin = 165.25333333333333 2321 | xmax = 165.95733333333334 2322 | text = "utterance" 2323 | intervals [32]: 2324 | xmin = 165.95733333333334 2325 | xmax = 167.20533333333333 2326 | text = "silent" 2327 | intervals [33]: 2328 | xmin = 167.20533333333333 2329 | xmax = 171.84533333333334 2330 | text = "utterance" 2331 | intervals [34]: 2332 | xmin = 171.84533333333334 2333 | xmax = 172.43733333333333 2334 | text = "silent" 2335 | intervals [35]: 2336 | xmin = 172.43733333333333 2337 | xmax = 175.14133333333334 2338 | text = "utterance" 2339 | intervals [36]: 2340 | xmin = 175.14133333333334 2341 | xmax = 175.54133333333334 2342 | text = "silent" 2343 | intervals [37]: 2344 | xmin = 175.54133333333334 2345 | xmax = 178.60266666666666 2346 | text = "utterance" 2347 | --------------------------------------------------------------------------------