├── .eslintrc.js ├── .gitignore ├── README.md ├── binding.gyp ├── examples ├── fonts │ ├── sans-mono.json │ ├── sans.json │ └── serif.json ├── hello.js ├── hwinfo.js ├── modules │ ├── text.js │ └── util.js ├── panic.js └── star.js ├── index.js ├── package.json ├── src ├── argchecks.h ├── egl.cc ├── egl.h ├── node-common.h ├── openvg.cc └── openvg.h └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | es6: true, 4 | node: true, 5 | }, 6 | extends: 'eslint:recommended', 7 | plugins: [ 8 | 'prettier', 9 | ], 10 | rules: { 11 | curly: 'error', 12 | 'no-console': 'off', 13 | 'no-else-return': 'error', 14 | 'no-inner-declarations': 'off', 15 | 'no-var': 'error', 16 | 'prefer-arrow-callback': 'error', 17 | 'prefer-const': 'error', 18 | 'prettier/prettier': [ 19 | 'error', { 20 | bracketSpacing: false, 21 | parser: 'flow', 22 | singleQuote: true, 23 | trailingComma: 'es5', 24 | }, 25 | ], 26 | strict: 'error', 27 | }, 28 | }; 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | .lock-wscript 4 | core 5 | 6 | .gdbinit 7 | .gdb_history 8 | 9 | ._* 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-openvg (OpenVG bindings for node.js) 2 | 3 | [![NPM](https://nodei.co/npm/openvg.png?downloads=true&stars=true)](https://nodei.co/npm-dl/openvg/) [![NPM](https://nodei.co/npm-dl/openvg.png)](https://nodei.co/npm-dl/openvg/) 4 | 5 | This module implements bindings for OpenVG. It is targeted to the raspberry-pi. 6 | 7 | It is heavily inspired in [node-sdl](https://github.com/creationix/node-sdl) and [openvg](https://github.com/ajstarks/openvg). 8 | 9 | Tested on node 8.1.2 using the new n-api native bindings. 10 | 11 | ## 0. Installation 12 | 13 | Just install via npm: 14 | 15 | npm install openvg 16 | 17 | ## 1. Usage 18 | 19 | This library makes a 1:1 mapping between OpenVG 1.1 (as currently bundled on raspian) and JS (via node.js/v8 bindings). 20 | 21 | ### Differences from the OpenVG APIs. 22 | 23 | All array based APIs are implemented via JS typed arrays. As such, length and offsets are supposed to be handled by the typed array API. 24 | 25 | Due to exceptional slowness of typed array creation (should be avoided at all costs either in node and in browser code), even when using [subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays/Int8Array), the APIs that receive typed arrays as parameters (setXxxFV, setXxxIV, etc.) also present OL (Offset + Length) or O (Offset) variants. 26 | 27 | ### Commonalities with the OpenVG APIs. 28 | 29 | Currently, handles to OpenVG resources aren't wrapped in JS/C++ objects. 30 | For this reason, special care must be taken to ensure propper destruction of these 31 | objects, as they wont be reclaimed by the garbage collector. 32 | This may be seen as a bonus since this explicit resource management may help improve 33 | performance, esp. in the scenario where this library is supposed to be used. 34 | 35 | PS: There are plans to support this kind of wrapping in the future. 36 | 37 | ### Examples 38 | 39 | This library was created as a base for [openvg-canvas](https://github.com/luismreis/node-openvg-canvas), but can be used standalone. 40 | 41 | Also, check the [examples directory](https://github.com/luismreis/node-openvg/tree/master/examples). 42 | 43 | ## License 44 | 45 | (The MIT License) 46 | 47 | Copyright (c) 2012-2015 Luis Reis 48 | 49 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 50 | 51 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 52 | 53 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 54 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets": [ 3 | { 4 | "target_name": "openvg", 5 | "sources": [ 6 | "src/openvg.cc", 7 | "src/egl.cc" 8 | ], 9 | "ldflags": [ 10 | "-L/opt/vc/lib", 11 | "-lGLESv2" 12 | ], 13 | "cflags": [ 14 | "-DENABLE_GDB_JIT_INTERFACE", 15 | "-Wall" 16 | ], 17 | "include_dirs" : [ 18 | "/opt/vc/include", 19 | "/opt/vc/include/interface/vcos/pthreads", 20 | "/opt/vc/include/interface/vmcs_host/linux" 21 | ] 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /examples/fonts/sans.json: -------------------------------------------------------------------------------- 1 | { 2 | "_comments" : [ 3 | "/* Generated by font2openvg. See http://developer.hybrid.fi for more information. */", 4 | "/* converted from font file /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf */", 5 | "/* font family name: DejaVu Sans */", 6 | "/* font style name: Book */" 7 | ], 8 | 9 | "glyphInstructions" : [ 10 | 2,4,4,4,4,0,2,4,4,4,4,4,4,0,2,4,4,4,4,0, 11 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4,4,4, 12 | 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 13 | 4,0,2,4,4,10,10,4,10,10,4,10,10,10,10,4,4,4,10,10, 14 | 4,10,10,4,10,10,10,10,4,0,2,4,10,10,10,10,0,2,4,10, 15 | 10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10, 16 | 10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0, 17 | 2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,4,0,2, 18 | 4,10,10,4,10,10,4,4,4,10,10,10,10,10,10,10,10,10,10,10, 19 | 10,4,10,10,10,10,10,10,0,2,4,4,4,4,0,2,10,10,10,10, 20 | 4,10,10,10,10,4,0,2,4,10,10,10,10,4,10,10,10,10,0,2, 21 | 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,2, 22 | 4,4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,4,4, 23 | 0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2, 24 | 10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0,2, 25 | 4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,10,10,10, 26 | 10,10,10,10,10,4,10,10,10,10,10,10,10,10,0,2,10,10,10,10, 27 | 10,10,4,10,10,10,10,10,10,4,4,4,10,10,10,10,10,10,4,10, 28 | 10,10,10,10,10,0,2,4,4,4,0,2,4,4,4,4,4,4,4,4, 29 | 4,4,4,0,2,4,4,4,4,10,10,10,10,10,10,10,10,4,10,10, 30 | 10,10,10,10,10,10,4,0,2,10,10,10,10,10,10,10,10,0,2,4, 31 | 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,2,4,4, 32 | 4,4,4,4,4,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10, 33 | 10,10,10,10,10,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10, 34 | 10,10,10,0,2,4,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 35 | 10,10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0,2, 36 | 4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4,4,0,2, 37 | 4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 38 | 2,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,10,10, 39 | 4,10,10,10,10,10,10,4,10,10,10,10,10,10,4,10,10,10,10,4, 40 | 0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10,10, 41 | 4,4,4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,4, 42 | 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,4,0,2,4, 43 | 4,4,0,2,4,4,4,4,4,4,4,4,0,2,4,4,10,10,10,10, 44 | 4,0,2,4,4,10,10,10,10,4,0,2,4,10,10,10,10,10,10,10, 45 | 10,4,4,0,2,4,10,10,10,10,10,10,10,10,4,10,10,10,10,10, 46 | 10,10,10,0,2,4,4,10,10,10,10,4,0,2,4,10,10,10,10,4, 47 | 4,0,2,4,4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4, 48 | 4,4,4,4,4,4,4,0,2,4,4,4,4,4,10,10,10,10,10,10, 49 | 10,10,4,10,10,10,10,10,10,10,10,0,2,4,4,4,4,4,4,4, 50 | 4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,10,10,4,4,4, 51 | 10,10,4,0,2,4,4,4,4,4,4,4,4,4,4,4,0,2,4,4, 52 | 4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4,4,4,0, 53 | 2,4,4,4,4,4,4,4,4,4,4,0,2,10,10,10,10,10,10,10, 54 | 10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,10,10,10,10,4, 55 | 0,2,4,10,10,10,10,4,4,4,4,0,2,10,10,10,10,10,10,10, 56 | 10,0,2,4,4,4,10,10,10,10,10,10,10,10,10,10,0,2,10,10, 57 | 4,4,4,10,10,4,4,4,4,4,10,10,10,10,0,2,4,4,10,10, 58 | 10,10,4,0,2,4,10,10,10,10,10,10,4,10,10,10,10,10,10,4, 59 | 10,10,10,10,10,10,4,10,10,10,10,10,10,0,2,4,4,4,4,4, 60 | 4,4,4,0,2,4,4,10,10,10,10,4,4,4,10,10,10,10,4,0, 61 | 2,4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4, 62 | 4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4,4,0,2,4, 63 | 4,4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4, 64 | 0,2,4,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4, 65 | 4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,0,2,4,4,4, 66 | 4,0,2,4,4,4,4,0,2,10,10,10,10,10,10,4,4,0,2,4, 67 | 4,4,10,10,10,10,10,10,4,4,10,10,10,10,4,10,10,10,10,0, 68 | 2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10,10,4, 69 | 4,4,4,4,0,2,4,10,10,10,10,10,10,10,10,4,10,10,10,10, 70 | 10,10,10,10,0,2,4,4,4,4,4,10,10,10,10,10,10,10,10,0, 71 | 2,10,10,10,10,10,10,10,10,0,2,4,4,10,10,10,10,4,10,10, 72 | 10,10,10,10,10,10,0,2,10,10,10,10,4,0,2,4,4,10,10,4, 73 | 4,4,4,4,4,4,4,4,4,4,10,10,4,0,2,10,10,10,10,10, 74 | 10,10,10,0,2,10,10,10,10,4,10,10,10,10,4,10,10,10,10,10, 75 | 10,10,10,4,4,4,0,2,4,4,4,10,10,10,10,4,4,4,4,4, 76 | 10,10,10,10,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4, 77 | 10,10,4,4,4,10,10,4,0,2,4,4,4,4,0,2,4,4,4,4, 78 | 4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,10,10,10,10,4, 79 | 4,4,10,10,10,10,4,4,4,10,10,10,10,4,4,4,4,4,10,10, 80 | 10,10,0,2,4,4,4,10,10,10,10,4,4,4,4,4,10,10,10,10, 81 | 0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10,10, 82 | 0,2,4,4,4,4,4,10,10,10,10,10,10,10,10,0,2,10,10,10, 83 | 10,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10, 84 | 10,10,10,10,10,4,4,4,4,4,0,2,10,10,10,10,4,4,4,4, 85 | 4,10,10,10,10,4,0,2,4,10,10,10,10,10,10,4,10,10,10,10, 86 | 10,10,4,10,10,10,10,10,10,4,10,10,10,10,10,10,0,2,4,4, 87 | 4,4,4,10,10,4,4,4,10,10,4,4,4,4,4,4,0,2,4,4, 88 | 4,10,10,10,10,4,4,4,4,4,10,10,10,10,0,2,4,0,2,4, 89 | 4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4,4, 90 | 4,0,2,4,4,4,4,4,4,4,4,4,4,4,4,0,2,10,10,4, 91 | 4,4,10,10,4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4, 92 | 4,4,4,0,2,4,4,10,10,4,10,10,4,4,4,10,10,4,10,10, 93 | 4,4,4,10,10,4,10,10,10,10,4,10,10,4,0,2,4,4,4,4, 94 | 0,2,4,10,10,4,10,10,10,10,4,10,10,4,4,4,10,10,4,10, 95 | 10,4,4,4,10,10,4,10,10,4,4,0,2,4,10,10,10,10,10,10, 96 | 10,10,4,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0,2,4, 97 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 98 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 99 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 100 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 101 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 102 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 103 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 104 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 105 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 106 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 107 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 108 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 109 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 110 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 111 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 112 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 113 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 114 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 115 | 4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 116 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4, 117 | 4,0,2,4,10,10,10,10,0,2,4,10,10,4,10,10,4,10,10,4, 118 | 4,4,10,10,10,10,4,4,4,10,10,0,2,4,10,10,10,10,4,4, 119 | 4,4,4,4,4,4,4,4,4,4,4,4,4,10,10,10,10,0,2,4, 120 | 4,4,10,10,10,10,4,4,4,10,10,10,10,4,4,4,10,10,10,10, 121 | 4,4,4,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,4, 122 | 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 123 | 4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,10,10, 124 | 10,10,10,10,10,10,0,2,4,10,10,10,10,10,10,10,10,10,10,10, 125 | 10,10,10,10,10,4,10,10,10,10,10,4,10,10,10,10,10,10,10,10, 126 | 10,10,0,2,4,4,4,4,0,2,4,4,4,4,0,2,10,10,10,10, 127 | 10,10,10,10,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10, 128 | 10,10,10,10,10,10,10,10,10,10,0,2,4,10,10,10,10,10,10,10, 129 | 10,4,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0,2,4,4, 130 | 4,10,10,10,10,10,10,4,4,10,10,10,10,4,10,10,10,10,0,2, 131 | 10,10,10,10,10,10,4,4,0,2,4,4,4,4,4,4,4,0,2,4, 132 | 4,4,4,4,4,4,0,2,4,4,4,4,4,4,0,2,4,4,4,4, 133 | 0,2,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,2, 134 | 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,2,4,4, 135 | 4,10,10,10,10,0,2,10,10,10,10,10,10,4,4,4,10,10,4,4, 136 | 4,4,4,0,2,4,4,4,4,0,2,10,10,10,10,10,10,10,10,0, 137 | 2,10,10,10,10,10,10,10,10,10,10,0,2,4,4,4,4,4,4,4, 138 | 4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,10,10,10, 139 | 10,10,10,4,10,10,10,10,10,10,0,2,10,10,10,10,10,10,4,10, 140 | 10,10,10,10,10,4,4,4,10,10,10,10,10,10,4,10,10,10,10,10, 141 | 10,0,2,4,4,4,4,0,2,4,4,4,10,10,10,10,4,4,4,10, 142 | 10,10,10,4,10,10,10,10,10,10,10,10,4,4,0,2,4,4,4,4, 143 | 4,4,4,4,10,10,10,10,0,2,4,4,4,4,0,2,10,10,10,10, 144 | 10,10,4,10,10,10,10,10,10,4,0,2,4,4,4,4,4,4,4,4, 145 | 4,4,4,0,2,4,4,4,4,0,2,10,10,10,10,10,10,10,10,0, 146 | 2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,4,4,4,0,2, 147 | 4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4, 148 | 0,2,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4,0,2, 149 | 4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,4,4,0,2,4, 150 | 4,4,4,10,10,10,10,10,10,4,10,10,10,10,10,10,0,2,4,4, 151 | 4,4,0,2,10,10,10,10,10,10,4,10,10,10,10,10,10,4,4,4, 152 | 10,10,10,10,10,10,4,10,10,10,10,10,10,0,2,4,4,4,0,2, 153 | 4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4, 154 | 4,10,10,4,10,10,10,10,10,10,4,10,10,10,10,10,10,4,10,10, 155 | 10,10,4,0,2,4,4,4,4,0,2,4,4,4,0,2,4,4,4,4, 156 | 4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,0,2,4,4,4, 157 | 4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,0,2,4,4, 158 | 4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,0,2,4,4,4, 159 | 0,2,4,4,4,4,4,4,4,4,0,2,4,10,10,10,10,4,4,10, 160 | 10,10,10,4,10,10,10,10,4,4,10,10,10,10,0,2,4,4,4,0, 161 | 2,4,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4, 162 | 4,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4,0,2,10,10, 163 | 10,10,10,10,10,10,4,4,4,4,4,4,4,0,2,4,4,4,4,4, 164 | 4,4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4, 165 | 10,10,10,10,10,10,10,10,4,10,10,10,10,10,10,10,10,0,2,10, 166 | 10,10,10,10,10,4,10,10,10,10,10,10,4,0,2,4,4,4,4,4, 167 | 4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4, 168 | 4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4, 169 | 4,4,4,4,4,4,4,0,2,4,4,4,4,4,4,4,0,2,4,4, 170 | 4,4,4,4,4,4,4,4,4,4,0,2,4,4,4,4,0,2,4,4, 171 | 4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4, 172 | 0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,4,4, 173 | 4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0, 174 | 2,4,10,10,10,10,4,4,4,4,4,4,0,2,4,4,4,4,4,4, 175 | 10,10,10,10,4,0,2,4,4,4,4,4,4,4,4,4,4,0,2,4, 176 | 10,10,10,10,4,4,10,10,10,10,4,10,10,10,10,4,4,10,10,10, 177 | 10,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10, 178 | 10,0,2,4,4,4,4,0,2,10,10,10,10,10,10,10,10,0,2,10, 179 | 10,10,10,10,10,10,10,0,2,4,4,4,4,0,2,10,10,10,10,10, 180 | 10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,4, 181 | 4,4,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10, 182 | 10,10,0,2,4,10,10,10,10,4,4,10,10,10,10,4,10,10,10,10, 183 | 4,4,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,10,10, 184 | 10,10,10,10,10,10,0,2,4,4,4,4,0,2,4,4,4,4,0,2, 185 | 4,4,4,4,4,4,4,4,4,4,4,4,0,2,4,10,10,10,10,10, 186 | 10,0,2,10,10,10,10,10,10,4,0,2,10,10,10,10,10,10,4,4, 187 | 4,10,10,10,10,10,10,4,4,4,0,2,4,4,10,10,10,10,4,4, 188 | 4,10,10,10,10,4,0,2,4,4,4,4,0,2,4,4,10,10,10,10, 189 | 4,4,4,10,10,10,10,4,0,2,4,4,4,4,0,2,4,4,10,10, 190 | 10,10,4,4,4,10,10,10,10,4,0,2,4,4,4,4,4,4,4,0, 191 | 2,4,4,10,10,10,10,4,4,4,10,10,10,10,4,0,2,4,4,4, 192 | 4,0,2,4,4,4,4,0,2,4,4,4,4,4,4,4,4,4,0,2, 193 | 4,4,4,4,0,2,4,4,4,10,10,10,10,4,4,4,4,0,2,4, 194 | 4,10,10,10,10,4,0,2,10,10,10,10,10,10,10,10,4,10,10,10, 195 | 10,10,10,4,10,10,10,10,10,10,4,10,10,10,10,10,10,10,10,4, 196 | 4,4,0,2,10,10,10,10,10,10,4,4,0,2,4,4,4,10,10,10, 197 | 10,10,10,4,4,10,10,10,10,4,10,10,10,10,0,2,4,4,4,4, 198 | 0,2,10,10,10,10,10,10,4,4,0,2,4,4,4,10,10,10,10,10, 199 | 10,4,4,10,10,10,10,4,10,10,10,10,0,2,4,4,4,4,0,2, 200 | 10,10,10,10,10,10,4,4,0,2,4,4,4,10,10,10,10,10,10,4, 201 | 4,10,10,10,10,4,10,10,10,10,0,2,4,4,4,4,4,4,4,0, 202 | 2,10,10,10,10,10,10,4,4,0,2,4,4,4,10,10,10,10,10,10, 203 | 4,4,10,10,10,10,4,10,10,10,10,0,2,4,10,10,10,10,4,10, 204 | 10,10,10,4,10,10,10,10,4,10,10,10,10,0,2,10,10,10,10,10, 205 | 10,4,4,0,2,4,4,4,10,10,10,10,10,10,4,4,10,10,10,10, 206 | 4,10,10,10,10,0,2,4,4,4,4,0,2,4,4,4,4,0,2,10, 207 | 10,10,10,10,10,4,4,0,2,4,4,4,10,10,10,10,10,10,4,4, 208 | 10,10,10,10,4,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0, 209 | 2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,4,0,2,10,10, 210 | 10,10,4,4,10,10,10,10,4,10,10,10,10,10,10,10,10,10,10,4, 211 | 4,10,10,10,10,4,10,10,10,10,0,2,10,10,10,10,10,10,4,4, 212 | 0,2,4,10,10,10,10,10,10,10,10,4,10,10,10,10,10,10,10,10, 213 | 0,2,10,10,10,10,10,10,4,10,10,10,10,10,10,4,0,2,4,4, 214 | 10,10,10,10,4,10,10,10,10,10,10,10,10,0,2,10,10,10,10,4, 215 | 0,2,4,4,4,4,0,2,4,4,10,10,10,10,4,10,10,10,10,10, 216 | 10,10,10,0,2,10,10,10,10,4,0,2,4,4,4,4,0,2,4,4, 217 | 10,10,10,10,4,10,10,10,10,10,10,10,10,0,2,10,10,10,10,4, 218 | 0,2,4,4,4,4,4,4,4,0,2,4,4,10,10,10,10,4,10,10, 219 | 10,10,10,10,10,10,0,2,10,10,10,10,4,0,2,4,4,4,4,0, 220 | 2,4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4, 221 | 0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,0,2,4,4,4, 222 | 4,0,2,4,0,2,4,4,4,4,4,4,4,0,2,4,4,4,4,0, 223 | 2,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,10,10,10,10, 224 | 10,10,10,10,10,10,0,2,10,10,10,10,10,10,10,10,10,10,4,4, 225 | 4,4,4,4,4,4,4,4,4,0,2,4,4,4,10,10,10,10,4,4, 226 | 4,4,4,10,10,10,10,0,2,4,10,10,10,10,4,10,10,10,10,4, 227 | 10,10,10,10,4,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0, 228 | 2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0,2,10,10,10, 229 | 10,10,10,10,10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4, 230 | 4,0,2,10,10,10,10,10,10,10,10,0,2,10,10,10,10,10,10,10, 231 | 10,0,2,4,4,4,4,4,4,4,0,2,10,10,10,10,10,10,10,10, 232 | 0,2,10,10,10,10,10,10,10,10,0,2,4,10,10,10,10,4,10,10, 233 | 10,10,4,10,10,10,10,4,10,10,10,10,0,2,10,10,10,10,10,10, 234 | 10,10,0,2,10,10,10,10,10,10,10,10,0,2,4,4,4,4,0,2, 235 | 4,4,4,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,4,4, 236 | 4,4,0,2,4,10,10,10,10,10,10,0,2,10,10,10,10,10,10,4, 237 | 0,2,10,10,10,10,10,10,4,4,4,10,10,10,10,10,10,4,4,4, 238 | 0,2,4,4,4,10,10,10,10,4,4,4,4,4,10,10,10,10,0,2, 239 | 4,0,2,4,4,4,4,0,2,4,4,4,10,10,10,10,4,4,4,4, 240 | 4,10,10,10,10,0,2,4,0,2,4,4,4,4,0,2,4,4,4,10, 241 | 10,10,10,4,4,4,4,4,10,10,10,10,0,2,4,0,2,4,4,4, 242 | 4,4,4,4,0,2,4,4,4,10,10,10,10,4,4,4,4,4,10,10, 243 | 10,10,0,2,4,0,2,4,4,4,4,0,2,4,4,4,4,0,2,10, 244 | 10,4,4,4,10,10,4,4,4,4,4,4,4,0,2,4,4,4,4,0, 245 | 2,4,4,4,4,4,10,10,10,10,10,10,10,10,0,2,10,10,10,10, 246 | 10,10,10,10,0,2,10,10,4,4,4,10,10,4,4,4,4,4,4,4, 247 | 0,2,4,4,4,4,0,2,4,4,4,4,0 248 | ], 249 | "glyphInstructionIndices" : [ 250 | 0,0,14,26,62,104,150,189,195,207,219,239,253,261,267,273,279,299,312,335, 251 | 366,384,408,437,446,484,513,525,539,548,560,569,601,658,673,704,724,742,756,768, 252 | 792,806,812,824,837,845,860,872,892,912,937,964,994,1004,1020,1029,1044,1058,1069,1081, 253 | 1091,1097,1107,1116,1122,1128,1160,1185,1205,1230,1254,1274,1307,1325,1337,1355,1368,1374,1403,1421, 254 | 1441,1466,1491,1507,1537,1557,1578,1587,1602,1616,1632,1644,1675,1681,1712,1732,1744,1756,1768,1780, 255 | 1792,1804,1816,1828,1840,1852,1864,1876,1888,1900,1912,1924,1936,1948,1960,1972,1984,1996,2008,2020, 256 | 2032,2044,2056,2068,2080,2092,2104,2116,2128,2128,2142,2172,2198,2238,2265,2277,2323,2335,2391,2429, 257 | 2447,2455,2461,2524,2530,2552,2572,2591,2622,2628,2655,2669,2675,2691,2704,2730,2748,2785,2823,2878, 258 | 2910,2931,2952,2976,3015,3042,3074,3098,3134,3154,3174,3197,3223,3235,3247,3262,3280,3306,3342,3368, 259 | 3394,3423,3467,3499,3513,3551,3573,3595,3620,3648,3665,3687,3723,3761,3799,3840,3894,3938,3990,4041, 260 | 4077,4107,4137,4170,4206,4221,4236,4254,4275,4310,4350,4376,4402,4431,4473,4505,4523,4561,4588,4615, 261 | 4645,4678,4700,4725 262 | ], 263 | "glyphInstructionCounts" : [ 264 | 0,14,12,36,42,46,39,6,12,12,20,14,8,6,6,6,20,13,23,31, 265 | 18,24,29,9,38,29,12,14,9,12,9,32,57,15,31,20,18,14,12,24, 266 | 14,6,12,13,8,15,12,20,20,25,27,30,10,16,9,15,14,11,12,10, 267 | 6,10,9,6,6,32,25,20,25,24,20,33,18,12,18,13,6,29,18,20, 268 | 25,25,16,30,20,21,9,15,14,16,12,31,6,31,20,12,12,12,12,12, 269 | 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, 270 | 12,12,12,12,12,12,12,12,0,14,30,26,40,27,12,46,12,56,38,18, 271 | 8,6,63,6,22,20,19,31,6,27,14,6,16,13,26,18,37,38,55,32, 272 | 21,21,24,39,27,32,24,36,20,20,23,26,12,12,15,18,26,36,26,26, 273 | 29,44,32,14,38,22,22,25,28,17,22,36,38,38,41,54,44,52,51,36, 274 | 30,30,33,36,15,15,18,21,35,40,26,26,29,42,32,18,38,27,27,30, 275 | 33,22,25,28 276 | ], 277 | 278 | "glyphPointIndices" : [ 279 | 0,0,12,22,56,119,192,257,262,281,300,319,332,339,344,349,354,388,400,438, 280 | 492,508,547,598,606,673,724,734,746,754,764,772,820,923,936,980,1015,1039,1052,1063, 281 | 1102,1115,1120,1135,1147,1154,1168,1179,1213,1239,1280,1317,1370,1379,1402,1410,1424,1437,1447,1458, 282 | 1467,1472,1481,1489,1494,1499,1549,1588,1623,1662,1700,1723,1778,1803,1813,1833,1845,1850,1894,1919, 283 | 1953,1992,2031,2054,2107,2130,2157,2165,2179,2192,2211,2222,2268,2273,2319,2354,2364,2374,2384,2394, 284 | 2404,2414,2424,2434,2444,2454,2464,2474,2484,2494,2504,2514,2524,2534,2544,2554,2564,2574,2584,2594, 285 | 2604,2614,2624,2634,2644,2654,2664,2674,2684,2684,2696,2740,2773,2835,2861,2871,2954,2964,3065,3120, 286 | 3136,3143,3148,3251,3256,3294,3312,3342,3396,3401,3443,3460,3465,3492,3504,3543,3559,3592,3639,3714, 287 | 3762,3780,3798,3819,3871,3894,3939,3961,4023,4041,4059,4080,4103,4113,4123,4136,4151,4183,4233,4272, 288 | 4311,4353,4426,4470,4483,4542,4570,4598,4629,4662,4677,4705,4768,4823,4878,4936,5023,5083,5167,5251, 289 | 5313,5356,5399,5445,5493,5505,5517,5532,5549,5602,5664,5703,5742,5784,5855,5899,5914,5973,6005,6037, 290 | 6072,6109,6133,6172 291 | ], 292 | "glyphPoints" : [ 293 | 13136,10800,21760,10800,21760,0,13136,0,13136,10800,13136,63456,21760,63456,21760,35616,20912,20448,14032,20448, 294 | 13136,35616,13136,63456,15600,63456,15600,39872,8368,39872,8368,63456,15600,63456,31664,63456,31664,39872,24432,39872, 295 | 24432,63456,31664,63456,44496,38288,32128,38288,28560,24096,41008,24096,44496,38288,38128,62480,33696,44832,46112,44832, 296 | 50576,62480,57376,62480,52992,44832,66256,44832,66256,38288,51344,38288,47856,24096,61376,24096,61376,17600,46192,17600, 297 | 41776,0,34976,0,39360,17600,26896,17600,22528,0,15680,0,20096,17600,6720,17600,6720,24096,21680,24096, 298 | 25248,38288,11568,38288,11568,44832,26896,44832,31232,62480,38128,62480,29408,-12800,25168,-12800,25120,0,20656,80, 299 | 16192,1040,11728,2000,7232,3904,7232,11568,11568,8848,16008,7464,20448,6080,25168,6032,25168,25408,15760,26944, 300 | 11496,30600,7232,34256,7232,40624,7232,47552,11864,51552,16496,55552,25168,56144,25168,66128,29408,66128,29408,56272, 301 | 33360,56096,37056,55440,40752,54784,44288,53632,44288,46192,40752,47984,37040,48960,33328,49936,29408,50112,29408,31968, 302 | 39056,30480,43608,26648,48160,22816,48160,16192,48160,9008,43336,4864,38512,720,29408,80,29408,-12800,25168,32720, 303 | 25168,50144,20224,49600,17632,47344,15040,45088,15040,41360,15040,37696,17440,35656,19840,33616,25168,32720,29408,24560, 304 | 29408,6160,34800,6880,37544,9224,40288,11568,40288,15392,40288,19120,37672,21336,35056,23552,29408,24560,63280,27920, 305 | 59584,27920,57480,24776,55376,21632,55376,16016,55376,10496,57480,7328,59584,4160,63280,4160,66896,4160,69000,7328, 306 | 71104,10496,71104,16016,71104,21584,69000,24752,66896,27920,63280,27920,63280,33328,70000,33328,73952,28648,77904,23968, 307 | 77904,16016,77904,8080,73928,3424,69952,-1232,63280,-1232,56480,-1232,52528,3424,48576,8080,48576,16016,48576,24016, 308 | 52552,28672,56528,33328,63280,33328,19424,59200,15760,59200,13664,56032,11568,52864,11568,47344,11568,41728,13648,38584, 309 | 15728,35440,19424,35440,23120,35440,25224,38584,27328,41728,27328,47344,27328,52832,25200,56016,23072,59200,19424,59200, 310 | 57808,64608,64608,64608,24912,-1232,18112,-1232,57808,64608,19424,64608,26144,64608,30136,59952,34128,55296,34128,47344, 311 | 34128,39312,30152,34680,26176,30048,19424,30048,12672,30048,8736,34704,4800,39360,4800,47344,4800,55248,8752,59928, 312 | 12704,64608,19424,64608,21168,34128,17296,30688,15488,27264,13680,23840,13680,20096,13680,13904,18184,9776,22688,5648, 313 | 29488,5648,33536,5648,37064,6992,40592,8336,43696,11056,21168,34128,27152,38880,48752,16784,51248,20576,52656,24888, 314 | 54064,29200,54320,34048,62224,34048,61712,28432,59504,22952,57296,17472,53344,12112,65200,0,54480,0,48400,6240, 315 | 43984,2464,39144,616,34304,-1232,28736,-1232,18480,-1232,11984,4608,5488,10448,5488,19600,5488,25040,8336,29816, 316 | 11184,34592,16880,38800,14832,41488,13768,44144,12704,46800,12704,49344,12704,56224,17424,60416,22144,64608,29968,64608, 317 | 33488,64608,36992,63840,40496,63072,44112,61536,44112,53808,40416,55808,37056,56848,33696,57888,30816,57888,26352,57888, 318 | 23568,55528,20784,53168,20784,49424,20784,47264,22040,45072,23296,42880,27152,38880,15600,63456,15600,39872,8368,39872, 319 | 8368,63456,15600,63456,26992,66048,21296,56272,18528,46712,15760,37152,15760,27328,15760,17504,18544,7880,21328,-1744, 320 | 26992,-11472,20192,-11472,13808,-1488,10648,8160,7488,17808,7488,27328,7488,36800,10632,46408,13776,56016,20192,66048, 321 | 26992,66048,6976,66048,13776,66048,20144,56016,23312,46408,26480,36800,26480,27328,26480,17808,23312,8160,20144,-1488, 322 | 13776,-11472,6976,-11472,12624,-1744,15408,7880,18192,17504,18192,27328,18192,37152,15408,46712,12624,56272,6976,66048, 323 | 40928,52992,25664,44752,40928,36464,38464,32304,24176,40928,24176,24912,19344,24912,19344,40928,5056,32304,2592,36464, 324 | 17856,44752,2592,52992,5056,57200,19344,48576,19344,64608,24176,64608,24176,48576,38464,57200,40928,52992,40032,54576, 325 | 40032,30896,63712,30896,63712,23680,40032,23680,40032,0,32896,0,32896,23680,9216,23680,9216,30896,32896,30896, 326 | 32896,54576,40032,54576,10208,10800,19168,10800,19168,3488,12192,-10112,6720,-10112,10208,3488,10208,10800,4256,27328, 327 | 27152,27328,27152,20352,4256,20352,4256,27328,9312,10800,18272,10800,18272,0,9312,0,9312,10800,22096,63456, 328 | 29328,63456,7232,-8080,0,-8080,22096,63456,27664,57808,21040,57808,17704,51280,14368,44752,14368,31664,14368,18608, 329 | 17704,12088,21040,5568,27664,5568,34336,5568,37672,12088,41008,18608,41008,31664,41008,44752,37672,51280,34336,57808, 330 | 27664,57808,27664,64608,38336,64608,43968,56168,49600,47728,49600,31664,49600,15648,43968,7208,38336,-1232,27664,-1232, 331 | 17008,-1232,11376,7208,5744,15648,5744,31664,5744,47728,11376,56168,17008,64608,27664,64608,10800,7232,24816,7232, 332 | 24816,55632,9568,52576,9568,60400,24736,63456,33328,63456,33328,7232,47344,7232,47344,0,10800,0,10800,7232, 333 | 16704,7232,46672,7232,46672,0,6368,0,6368,7232,11264,12288,19696,20808,28128,29328,30304,31792,34432,36416, 334 | 36064,39632,37696,42848,37696,45936,37696,51008,34152,54192,30608,57376,24912,57376,20864,57376,16384,55976,11904,54576, 335 | 6800,51728,6800,60400,11984,62480,16488,63544,20992,64608,24736,64608,34592,64608,40456,59672,46320,54736,46320,46496, 336 | 46320,42592,44856,39080,43392,35568,39520,30816,38464,29584,32768,23696,27072,17808,16704,7232,35312,34208,41488,32896, 337 | 44944,28728,48400,24560,48400,18448,48400,9056,41944,3912,35488,-1232,23584,-1232,19600,-1232,15368,-448,11136,336, 338 | 6624,1920,6624,10208,10208,8112,14456,7056,18704,6000,23328,6000,31408,6000,35640,9184,39872,12368,39872,18448, 339 | 39872,24048,35936,27216,32000,30384,24992,30384,17600,30384,17600,37440,25328,37440,31664,37440,35024,39968,38384,42496, 340 | 38384,47264,38384,52144,34920,54760,31456,57376,24992,57376,21456,57376,17424,56608,13392,55840,8544,54224,8544,61888, 341 | 13424,63248,17696,63928,21968,64608,25760,64608,35536,64608,41232,60160,46928,55712,46928,48160,46928,42880,43904,39248, 342 | 40880,35616,35312,34208,32896,55968,11216,22096,32896,22096,32896,55968,30640,63456,41440,63456,41440,22096,50496,22096, 343 | 50496,14960,41440,14960,41440,0,32896,0,32896,14960,4256,14960,4256,23248,30640,63456,9392,63456,43088,63456, 344 | 43088,56224,17248,56224,17248,40672,19120,41312,20992,41632,22864,41952,24736,41952,35360,41952,41568,36128,47776,30304, 345 | 47776,20352,47776,10112,41400,4440,35024,-1232,23424,-1232,19424,-1232,15280,-552,11136,128,6720,1488,6720,10112, 346 | 10544,8032,14624,7016,18704,6000,23248,6000,30608,6000,34896,9864,39184,13728,39184,20352,39184,26992,34896,30856, 347 | 30608,34720,23248,34720,19808,34720,16384,33960,12960,33200,9392,31584,9392,63456,28736,35152,22944,35152,19568,31200, 348 | 16192,27248,16192,20352,16192,13520,19568,9544,22944,5568,28736,5568,34512,5568,37888,9544,41264,13520,41264,20352, 349 | 41264,27248,37888,31200,34512,35152,28736,35152,45776,62048,45776,54224,42544,55760,39248,56568,35952,57376,32720,57376, 350 | 24224,57376,19744,51640,15264,45904,14624,34304,17120,38000,20904,39976,24688,41952,29248,41952,38800,41952,44344,36152, 351 | 49888,30352,49888,20352,49888,10576,44112,4672,38336,-1232,28736,-1232,17728,-1232,11904,7208,6080,15648,6080,31664, 352 | 6080,46704,13216,55656,20352,64608,32384,64608,35616,64608,38912,63968,42208,63328,45776,62048,7136,63456,47936,63456, 353 | 47936,59792,24912,0,15936,0,37616,56224,7136,56224,7136,63456,27664,30128,21552,30128,18040,26856,14528,23584, 354 | 14528,17856,14528,12112,18040,8840,21552,5568,27664,5568,33792,5568,37320,8864,40848,12160,40848,17856,40848,23584, 355 | 37336,26856,33824,30128,27664,30128,19088,33792,13552,35152,10472,38936,7392,42720,7392,48160,7392,55760,12816,60184, 356 | 18240,64608,27664,64608,37152,64608,42544,60184,47936,55760,47936,48160,47936,42720,44856,38936,41776,35152,36288,33792, 357 | 42496,32336,45960,28128,49424,23920,49424,17856,49424,8624,43792,3696,38160,-1232,27664,-1232,17168,-1232,11536,3696, 358 | 5904,8624,5904,17856,5904,23920,9392,28128,12880,32336,19088,33792,15936,47344,15936,42416,19016,39656,22096,36896, 359 | 27664,36896,33200,36896,36320,39656,39440,42416,39440,47344,39440,52272,36320,55040,33200,57808,27664,57808,22096,57808, 360 | 19016,55040,15936,52272,15936,47344,9568,1312,9568,9136,12800,7600,16112,6800,19424,6000,22608,6000,31104,6000, 361 | 35592,11712,40080,17424,40720,29072,38256,25408,34472,23456,30688,21504,26096,21504,16576,21504,11032,27264,5488,33024, 362 | 5488,43008,5488,52784,11264,58696,17040,64608,26640,64608,37648,64608,43456,56168,49264,47728,49264,31664,49264,16656, 363 | 42144,7712,35024,-1232,22992,-1232,19760,-1232,16448,-592,13136,48,9568,1312,26640,28224,32432,28224,35808,32176, 364 | 39184,36128,39184,43008,39184,49856,35808,53832,32432,57808,26640,57808,20864,57808,17488,53832,14112,49856,14112,43008, 365 | 14112,36128,17488,32176,20864,28224,26640,28224,10208,10800,19168,10800,19168,0,10208,0,10208,10800,10208,45008, 366 | 19168,45008,19168,34208,10208,34208,10208,45008,10208,45008,19168,45008,19168,34208,10208,34208,10208,45008,10208,10800, 367 | 19168,10800,19168,3488,12192,-10112,6720,-10112,10208,3488,10208,10800,63712,42848,19840,27248,63712,11728,63712,4000, 368 | 9216,23760,9216,30816,63712,50576,63712,42848,9216,39520,63712,39520,63712,32384,9216,32384,9216,39520,9216,22192, 369 | 63712,22192,63712,14960,9216,14960,9216,22192,9216,42848,9216,50576,63712,30816,63712,23760,9216,4000,9216,11728, 370 | 52992,27248,9216,42848,16624,10800,25248,10800,25248,0,16624,0,16624,10800,24992,17040,16880,17040,16880,23584, 371 | 16880,27888,18064,30648,19248,33408,23072,37056,26896,40848,29328,43088,30408,45088,31488,47088,31488,49168,31488,52960, 372 | 28704,55296,25920,57632,21328,57632,17984,57632,14176,56144,10368,54656,6240,51808,6240,59792,10240,62224,14344,63416, 373 | 18448,64608,22816,64608,30640,64608,35384,60480,40128,56352,40128,49600,40128,46368,38592,43456,37056,40544,33232,36896, 374 | 29488,33232,27504,31232,26672,30112,25840,28992,25504,27920,25248,27024,25120,25752,24992,24480,24992,22272,24992,17040, 375 | 32384,22816,32384,16752,35400,13288,38416,9824,43696,9824,48912,9824,51912,13304,54912,16784,54912,22816,54912,28768, 376 | 51848,32280,48784,35792,43600,35792,38464,35792,35424,32304,32384,28816,32384,22816,55552,10112,52992,6848,49704,5296, 377 | 46416,3744,42032,3744,34720,3744,30152,9032,25584,14320,25584,22816,25584,31328,30176,36640,34768,41952,42032,41952, 378 | 46416,41952,49728,40360,53040,38768,55552,35536,55552,41104,61632,41104,61632,9824,67824,10752,71336,15488,74848,20224, 379 | 74848,27760,74848,32304,73504,36296,72160,40288,69440,43696,65024,49264,58672,52216,52320,55168,44832,55168,39616,55168, 380 | 34808,53784,30000,52400,25920,49680,19248,45344,15488,38312,11728,31280,11728,23072,11728,16320,14176,10416,16624,4512, 381 | 21248,0,25712,-4416,31576,-6736,37440,-9056,44112,-9056,49600,-9056,54888,-7208,60176,-5360,64608,-1920,68432,-6624, 382 | 63120,-10752,56848,-12944,50576,-15136,44112,-15136,36256,-15136,29288,-12352,22320,-9568,16880,-4256,11440,1056,8592,8048, 383 | 5744,15040,5744,23072,5744,30816,8632,37824,11520,44832,16880,50144,22352,55552,29536,58416,36720,61280,44752,61280, 384 | 53760,61280,61472,57584,69184,53888,74416,47088,77600,42928,79280,38040,80960,33152,80960,27920,80960,16752,74200,10288, 385 | 67440,3824,55552,3568,55552,10112,29744,54992,18112,23424,41440,23424,29744,54992,24912,63456,34640,63456,58816,0, 386 | 49888,0,44112,16272,15520,16272,9728,0,688,0,24912,63456,17120,30304,17120,7056,30896,7056,37824,7056, 387 | 41160,9928,44496,12800,44496,18704,44496,24656,41160,27480,37824,30304,30896,30304,17120,30304,17120,56400,17120,37280, 388 | 29840,37280,36128,37280,39208,39632,42288,41984,42288,46832,42288,51632,39208,54016,36128,56400,29840,56400,17120,56400, 389 | 8544,63456,30480,63456,40288,63456,45600,59376,50912,55296,50912,47776,50912,41952,48192,38504,45472,35056,40208,34208, 390 | 46544,32848,50048,28536,53552,24224,53552,17760,53552,9264,47768,4632,41984,0,31328,0,8544,0,8544,63456, 391 | 56064,58560,56064,49520,51728,53552,46816,55552,41904,57552,36384,57552,25504,57552,19720,50896,13936,44240,13936,31664, 392 | 13936,19120,19720,12472,25504,5824,36384,5824,41904,5824,46816,7824,51728,9824,56064,13856,56064,4880,51552,1824, 393 | 46520,296,41488,-1232,35872,-1232,21456,-1232,13168,7584,4880,16400,4880,31664,4880,46960,13168,55784,21456,64608, 394 | 35872,64608,41568,64608,46600,63096,51632,61584,56064,58560,17120,56400,17120,7056,27504,7056,40624,7056,46728,13008, 395 | 52832,18960,52832,31792,52832,44544,46728,50472,40624,56400,27504,56400,17120,56400,8544,63456,26176,63456,44624,63456, 396 | 53256,55784,61888,48112,61888,31792,61888,15392,53216,7696,44544,0,26176,0,8544,0,8544,63456,8544,63456, 397 | 48656,63456,48656,56224,17120,56224,17120,37440,47344,37440,47344,30224,17120,30224,17120,7232,49424,7232,49424,0, 398 | 8544,0,8544,63456,8544,63456,45008,63456,45008,56224,17120,56224,17120,37520,42288,37520,42288,30304,17120,30304, 399 | 17120,0,8544,0,8544,63456,51808,9056,51808,26096,37776,26096,37776,33152,60304,33152,60304,5904,55328,2384, 400 | 49336,576,43344,-1232,36544,-1232,21680,-1232,13280,7456,4880,16144,4880,31664,4880,47216,13280,55912,21680,64608, 401 | 36544,64608,42752,64608,48344,63072,53936,61536,58656,58560,58656,49424,53888,53472,48536,55512,43184,57552,37280,57552, 402 | 25632,57552,19784,51048,13936,44544,13936,31664,13936,18832,19784,12328,25632,5824,37280,5824,41824,5824,45392,6608, 403 | 48960,7392,51808,9056,8544,63456,17120,63456,17120,37440,48320,37440,48320,63456,56912,63456,56912,0,48320,0, 404 | 48320,30224,17120,30224,17120,0,8544,0,8544,63456,8544,63456,17120,63456,17120,0,8544,0,8544,63456, 405 | 8544,63456,17120,63456,17120,4416,17120,-7056,12768,-12240,8416,-17424,-1232,-17424,-4512,-17424,-4512,-10208,-1824,-10208, 406 | 3872,-10208,6208,-7016,8544,-3824,8544,4416,8544,63456,8544,63456,17120,63456,17120,36640,45600,63456,56656,63456, 407 | 25168,33872,58912,0,47600,0,17120,30560,17120,0,8544,0,8544,63456,8544,63456,17120,63456,17120,7232, 408 | 48032,7232,48032,0,8544,0,8544,63456,8544,63456,21328,63456,37520,20272,53808,63456,66592,63456,66592,0, 409 | 58224,0,58224,55712,41856,12192,33232,12192,16880,55712,16880,0,8544,0,8544,63456,8544,63456,20096,63456, 410 | 48240,10368,48240,63456,56560,63456,56560,0,45008,0,16880,53088,16880,0,8544,0,8544,63456,34304,57632, 411 | 24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712,24944,5744,34304,5744,43648,5744,49112,12712, 412 | 54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632,34304,64608,47648,64608,55632,55656,63616,46704, 413 | 63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,20912,-1232,12896,7696,4880,16624,4880,31664,4880,46704, 414 | 12896,55656,20912,64608,34304,64608,17120,56400,17120,32560,27920,32560,33920,32560,37192,35664,40464,38768,40464,44496, 415 | 40464,50192,37192,53296,33920,56400,27920,56400,17120,56400,8544,63456,27920,63456,38592,63456,44056,58632,49520,53808, 416 | 49520,44496,49520,35104,44056,30304,38592,25504,27920,25504,17120,25504,17120,0,8544,0,8544,63456,34304,57632, 417 | 24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712,24944,5744,34304,5744,43648,5744,49112,12712, 418 | 54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632,46320,1152,57632,-11216,47264,-11216,37872,-1056, 419 | 36464,-1152,35720,-1192,34976,-1232,34304,-1232,20912,-1232,12896,7712,4880,16656,4880,31664,4880,46704,12896,55656, 420 | 20912,64608,34304,64608,47648,64608,55632,55656,63616,46704,63616,31664,63616,20608,59176,12744,54736,4880,46320,1152, 421 | 38640,29744,41392,28816,44008,25752,46624,22688,49264,17344,57968,0,48752,0,40624,16272,37488,22656,34536,24736, 422 | 31584,26816,26480,26816,17120,26816,17120,0,8544,0,8544,63456,27920,63456,38800,63456,44160,58904,49520,54352, 423 | 49520,45184,49520,39184,46736,35232,43952,31280,38640,29744,17120,56400,17120,33872,27920,33872,34128,33872,37296,36744, 424 | 40464,39616,40464,45184,40464,50752,37296,53576,34128,56400,27920,56400,17120,56400,46576,61376,46576,52992,41696,55328, 425 | 37360,56480,33024,57632,28992,57632,21968,57632,18168,54912,14368,52192,14368,47168,14368,42960,16896,40816,19424,38672, 426 | 26480,37360,31664,36288,41264,34464,45832,29856,50400,25248,50400,17504,50400,8288,44216,3528,38032,-1232,26096,-1232, 427 | 21584,-1232,16512,-216,11440,800,6000,2800,6000,11648,11216,8720,16232,7232,21248,5744,26096,5744,33440,5744, 428 | 37440,8632,41440,11520,41440,16880,41440,21552,38568,24184,35696,26816,29152,28128,23920,29152,14320,31072,10032,35152, 429 | 5744,39232,5744,46496,5744,54912,11672,59760,17600,64608,28000,64608,32464,64608,37096,63800,41728,62992,46576,61376, 430 | -256,63456,53424,63456,53424,56224,30896,56224,30896,0,22272,0,22272,56224,-256,56224,-256,63456,7568,63456, 431 | 16192,63456,16192,24912,16192,14704,19888,10224,23584,5744,31872,5744,40128,5744,43824,10224,47520,14704,47520,24912, 432 | 47520,63456,56144,63456,56144,23840,56144,11440,50000,5104,43856,-1232,31872,-1232,19840,-1232,13704,5104,7568,11440, 433 | 7568,23840,7568,63456,24912,0,688,63456,9648,63456,29744,10032,49888,63456,58816,63456,34640,0,24912,0, 434 | 2896,63456,11568,63456,24912,9824,38208,63456,47856,63456,61200,9824,74496,63456,83216,63456,67280,0,56480,0, 435 | 43088,55088,29584,0,18784,0,2896,63456,5488,63456,14704,63456,30480,39872,46320,63456,55552,63456,35152,32976, 436 | 56912,0,47680,0,29840,26992,11856,0,2592,0,25248,33872,5488,63456,-176,63456,9056,63456,26640,37360, 437 | 44112,63456,53344,63456,30896,30224,30896,0,22272,0,22272,30224,-176,63456,4880,63456,54736,63456,54736,56912, 438 | 14624,7232,55712,7232,55712,0,3904,0,3904,6544,44032,56224,4880,56224,4880,63456,7488,66128,25504,66128, 439 | 25504,60048,15296,60048,15296,-5392,25504,-5392,25504,-11472,7488,-11472,7488,66128,7232,63456,29328,-8080,22096,-8080, 440 | 0,63456,7232,63456,26480,66128,26480,-11472,8464,-11472,8464,-5392,18608,-5392,18608,60048,8464,60048,8464,66128, 441 | 26480,66128,40624,63456,63712,39776,55168,39776,36464,56560,17760,39776,9216,39776,32304,63456,40624,63456,44368,-14448, 442 | 44368,-20528,-848,-20528,-848,-14448,44368,-14448,15600,69616,27584,53728,21088,53728,7232,69616,15600,69616,29840,23920, 443 | 20352,23920,16696,21760,13040,19600,13040,14368,13040,10208,15784,7760,18528,5312,23248,5312,29744,5312,33680,9920, 444 | 37616,14528,37616,22192,37616,23920,29840,23920,45440,27152,45440,0,37616,0,37616,7232,34928,2896,30936,832, 445 | 26944,-1232,21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856,5232,21888,10608,25968,15984,30048,26640,30048, 446 | 37616,30048,37616,30816,37616,36208,34064,39160,30512,42112,24096,42112,20016,42112,16152,41136,12288,40160,8720,38208, 447 | 8720,45440,13008,47088,17048,47920,21088,48752,24912,48752,35232,48752,40336,43392,45440,38032,45440,27152,42368,23760, 448 | 42368,32384,38824,37296,35280,42208,29072,42208,22864,42208,19312,37296,15760,32384,15760,23760,15760,15136,19312,10224, 449 | 22864,5312,29072,5312,35280,5312,38824,10224,42368,15136,42368,23760,15760,40368,18240,44624,22000,46688,25760,48752, 450 | 30976,48752,39648,48752,45072,41864,50496,34976,50496,23760,50496,12544,45072,5656,39648,-1232,30976,-1232,25760,-1232, 451 | 22000,832,18240,2896,15760,7136,15760,0,7904,0,7904,66128,15760,66128,15760,40368,42464,45776,42464,38464, 452 | 39136,40288,35800,41200,32464,42112,29072,42112,21456,42112,17248,37288,13040,32464,13040,23760,13040,15040,17248,10216, 453 | 21456,5392,29072,5392,32464,5392,35800,6312,39136,7232,42464,9056,42464,1824,39184,304,35680,-464,32176,-1232, 454 | 28224,-1232,17472,-1232,11136,5528,4800,12288,4800,23760,4800,35408,11200,42080,17600,48752,28736,48752,32336,48752, 455 | 35784,48008,39232,47264,42464,45776,39520,40368,39520,66128,47344,66128,47344,0,39520,0,39520,7136,37056,2896, 456 | 33296,832,29536,-1232,24272,-1232,15648,-1232,10224,5656,4800,12544,4800,23760,4800,34976,10224,41864,15648,48752, 457 | 24272,48752,29536,48752,33296,46688,37056,44624,39520,40368,12880,23760,12880,15136,16424,10224,19968,5312,26176,5312, 458 | 32384,5312,35952,10224,39520,15136,39520,23760,39520,32384,35952,37296,32384,42208,26176,42208,19968,42208,16424,37296, 459 | 12880,32384,12880,23760,48912,25760,48912,21936,12960,21936,13472,13856,17832,9624,22192,5392,29968,5392,34464,5392, 460 | 38696,6496,42928,7600,47088,9824,47088,2416,42880,640,38464,-296,34048,-1232,29488,-1232,18112,-1232,11456,5400, 461 | 4800,12032,4800,23328,4800,35024,11112,41888,17424,48752,28128,48752,37744,48752,43328,42568,48912,36384,48912,25760, 462 | 41104,28048,41008,34464,37504,38288,34000,42112,28224,42112,21680,42112,17744,38416,13808,34720,13216,28000,41104,28048, 463 | 32304,66128,32304,59632,24816,59632,20608,59632,18976,57928,17344,56224,17344,51808,17344,47600,30224,47600,30224,41520, 464 | 17344,41520,17344,0,9472,0,9472,41520,2000,41520,2000,47600,9472,47600,9472,50912,9472,58864,13176,62496, 465 | 16880,66128,24912,66128,32304,66128,39520,24352,39520,32848,36016,37528,32512,42208,26176,42208,19888,42208,16384,37528, 466 | 12880,32848,12880,24352,12880,15888,16384,11216,19888,6544,26176,6544,32512,6544,36016,11216,39520,15888,39520,24352, 467 | 47344,5904,47344,-6240,41944,-12176,36544,-18112,25408,-18112,21296,-18112,17640,-17496,13984,-16880,10544,-15600,10544,-7984, 468 | 13984,-9856,17344,-10752,20704,-11648,24176,-11648,31872,-11648,35696,-7632,39520,-3616,39520,4512,39520,8368,37104,4160, 469 | 33320,2080,29536,0,24272,0,15520,0,10160,6672,4800,13344,4800,24352,4800,35408,10160,42080,15520,48752, 470 | 24272,48752,29536,48752,33320,46664,37104,44576,39520,40368,39520,47600,47344,47600,47344,5904,47776,28736,47776,0, 471 | 39952,0,39952,28480,39952,35232,37320,38592,34688,41952,29408,41952,23072,41952,19416,37912,15760,33872,15760,26896, 472 | 15760,0,7904,0,7904,66128,15760,66128,15760,40208,18576,44496,22376,46624,26176,48752,31152,48752,39360,48752, 473 | 43568,43672,47776,38592,47776,28736,8208,47600,16016,47600,16016,0,8208,0,8208,47600,8208,66128,16016,66128, 474 | 16016,56224,8208,56224,8208,66128,8208,47600,16016,47600,16016,-848,16016,-9952,12552,-14032,9088,-18112,1408,-18112, 475 | -1568,-18112,-1568,-11472,512,-11472,4976,-11472,6592,-9416,8208,-7360,8208,-848,8208,47600,8208,66128,16016,66128, 476 | 16016,56224,8208,56224,8208,66128,7904,66128,15760,66128,15760,27072,39104,47600,49088,47600,23840,25328,50144,0, 477 | 39952,0,15760,23248,15760,0,7904,0,7904,66128,8208,66128,16016,66128,16016,0,8208,0,8208,66128, 478 | 45264,38464,48192,43728,52272,46240,56352,48752,61888,48752,69312,48752,73352,43544,77392,38336,77392,28736,77392,0, 479 | 69536,0,69536,28480,69536,35312,67112,38632,64688,41952,59712,41952,53632,41952,50104,37912,46576,33872,46576,26896, 480 | 46576,0,38720,0,38720,28480,38720,35360,36296,38656,33872,41952,28816,41952,22816,41952,19288,37888,15760,33824, 481 | 15760,26896,15760,0,7904,0,7904,47600,15760,47600,15760,40208,18448,44576,22184,46664,25920,48752,31072,48752, 482 | 36256,48752,39888,46112,43520,43472,45264,38464,47776,28736,47776,0,39952,0,39952,28480,39952,35232,37320,38592, 483 | 34688,41952,29408,41952,23072,41952,19416,37912,15760,33872,15760,26896,15760,0,7904,0,7904,47600,15760,47600, 484 | 15760,40208,18576,44496,22376,46624,26176,48752,31152,48752,39360,48752,43568,43672,47776,38592,47776,28736,26640,42112, 485 | 20352,42112,16696,37208,13040,32304,13040,23760,13040,15216,16680,10304,20320,5392,26640,5392,32896,5392,36552,10328, 486 | 40208,15264,40208,23760,40208,32208,36552,37160,32896,42112,26640,42112,26640,48752,36848,48752,42672,42120,48496,35488, 487 | 48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232,16400,-1232,10600,5416,4800,12064,4800,23760,4800,35488, 488 | 10600,42120,16400,48752,26640,48752,15760,7136,15760,-18112,7904,-18112,7904,47600,15760,47600,15760,40368,18240,44624, 489 | 22000,46688,25760,48752,30976,48752,39648,48752,45072,41864,50496,34976,50496,23760,50496,12544,45072,5656,39648,-1232, 490 | 30976,-1232,25760,-1232,22000,832,18240,2896,15760,7136,42368,23760,42368,32384,38824,37296,35280,42208,29072,42208, 491 | 22864,42208,19312,37296,15760,32384,15760,23760,15760,15136,19312,10224,22864,5312,29072,5312,35280,5312,38824,10224, 492 | 42368,15136,42368,23760,12880,23760,12880,15136,16424,10224,19968,5312,26176,5312,32384,5312,35952,10224,39520,15136, 493 | 39520,23760,39520,32384,35952,37296,32384,42208,26176,42208,19968,42208,16424,37296,12880,32384,12880,23760,39520,7136, 494 | 37056,2896,33296,832,29536,-1232,24272,-1232,15648,-1232,10224,5656,4800,12544,4800,23760,4800,34976,10224,41864, 495 | 15648,48752,24272,48752,29536,48752,33296,46688,37056,44624,39520,40368,39520,47600,47344,47600,47344,-18112,39520,-18112, 496 | 39520,7136,35792,40288,34464,41056,32912,41416,31360,41776,29488,41776,22864,41776,19312,37464,15760,33152,15760,25072, 497 | 15760,0,7904,0,7904,47600,15760,47600,15760,40208,18240,44544,22192,46648,26144,48752,31792,48752,32592,48752, 498 | 33576,48640,34560,48528,35744,48320,35792,40288,38544,46192,38544,38800,35232,40496,31664,41352,28096,42208,24272,42208, 499 | 18448,42208,15536,40424,12624,38640,12624,35056,12624,32336,14704,30792,16784,29248,23072,27840,25760,27248,34080,25456, 500 | 37592,22208,41104,18960,41104,13136,41104,6496,35856,2632,30608,-1232,21424,-1232,17600,-1232,13456,-488,9312,256, 501 | 4720,1744,4720,9824,9056,7568,13264,6440,17472,5312,21584,5312,27120,5312,30096,7200,33072,9088,33072,12544, 502 | 33072,15728,30920,17424,28768,19120,21504,20704,18784,21328,11520,22864,8288,26032,5056,29200,5056,34720,5056,41440, 503 | 9816,45096,14576,48752,23328,48752,27664,48752,31488,48112,35312,47472,38544,46192,15936,61120,15936,47600,32048,47600, 504 | 32048,41520,15936,41520,15936,15680,15936,9856,17528,8200,19120,6544,24016,6544,32048,6544,32048,0,24016,0, 505 | 14960,0,11520,3376,8080,6752,8080,15680,8080,41520,2336,41520,2336,47600,8080,47600,8080,61120,15936,61120, 506 | 7392,18784,7392,47600,15216,47600,15216,19088,15216,12320,17848,8944,20480,5568,25760,5568,32080,5568,35760,9608, 507 | 39440,13648,39440,20608,39440,47600,47264,47600,47264,0,39440,0,39440,7312,36592,2976,32832,872,29072,-1232, 508 | 24096,-1232,15888,-1232,11640,3864,7392,8960,7392,18784,27072,48752,27072,48752,2592,47600,10880,47600,25760,7648, 509 | 40624,47600,48912,47600,31072,0,20448,0,2592,47600,3648,47600,11472,47600,21248,10448,30976,47600,40208,47600, 510 | 49984,10448,59712,47600,67536,47600,55088,0,45856,0,35616,39008,25328,0,16112,0,3648,47600,47776,47600, 511 | 30560,24432,48656,0,39440,0,25584,18704,11728,0,2512,0,20992,24912,4080,47600,13296,47600,25920,30640, 512 | 38544,47600,47776,47600,28000,-4416,24688,-12928,21544,-15520,18400,-18112,13136,-18112,6880,-18112,6880,-11568,11472,-11568, 513 | 14704,-11568,16488,-10032,18272,-8496,20448,-2800,21840,768,2592,47600,10880,47600,25760,10368,40624,47600,48912,47600, 514 | 28000,-4416,4800,47600,41952,47600,41952,40464,12544,6240,41952,6240,41952,0,3744,0,3744,7136,33152,41360, 515 | 4800,41360,4800,47600,44496,-8080,44496,-14192,41856,-14192,31280,-14192,27688,-11048,24096,-7904,24096,1488,24096,11648, 516 | 24096,18064,21800,20528,19504,22992,13472,22992,10880,22992,10880,29072,13472,29072,19552,29072,21824,31512,24096,33952, 517 | 24096,40288,24096,50496,24096,59888,27688,63008,31280,66128,41856,66128,44496,66128,44496,60048,41600,60048,35616,60048, 518 | 33792,58184,31968,56320,31968,50320,31968,39776,31968,33104,30032,30088,28096,27072,23424,26016,28128,24864,30048,21848, 519 | 31968,18832,31968,12192,31968,1664,31968,-4336,33792,-6208,35616,-8080,41600,-8080,44496,-8080,18272,66512,18272,-20528, 520 | 11056,-20528,11056,66512,18272,66512,10880,-8080,13856,-8080,19808,-8080,21616,-6248,23424,-4416,23424,1664,23424,12192, 521 | 23424,18832,25336,21848,27248,24864,31968,26016,27248,27072,25336,30088,23424,33104,23424,39776,23424,50320,23424,56352, 522 | 21616,58200,19808,60048,13856,60048,10880,60048,10880,66128,13552,66128,24144,66128,27688,63008,31232,59888,31232,50496, 523 | 31232,40288,31232,33952,33528,31512,35824,29072,41856,29072,44496,29072,44496,22992,41856,22992,35824,22992,33528,20528, 524 | 31232,18064,31232,11648,31232,1488,31232,-7904,27688,-11048,24144,-14192,13552,-14192,10880,-14192,10880,-8080,63712,34720, 525 | 63712,27152,59248,23808,55440,22360,51632,20912,47520,20912,42848,20912,36640,23424,36160,23584,35952,23680,35664,23808, 526 | 35024,24016,28432,26640,24432,26640,20704,26640,17048,25008,13392,23376,9216,19840,9216,27408,13680,30768,17488,32232, 527 | 21296,33696,25408,33696,30096,33696,36336,31152,36768,30976,36976,30896,37312,30768,37904,30560,44496,27920,48496,27920, 528 | 52144,27920,55736,29536,59328,31152,63712,34720,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 529 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 530 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 531 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 532 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 533 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 534 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 535 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 536 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 537 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 538 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 539 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 540 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 541 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 542 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 543 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 544 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 545 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 546 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 547 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 548 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 549 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 550 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 551 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 552 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 553 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 554 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 555 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 556 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 557 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 558 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 559 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 560 | 43008,-10544,43008,56480,9216,56480,9216,-10544,4336,-15392,4336,61376,47856,61376,47856,-15392,4336,-15392,9216,-10544, 561 | 43008,-10544,43008,56480,9216,56480,9216,-10544,21760,52656,13136,52656,13136,63456,21760,63456,21760,52656,21760,0, 562 | 13136,0,13136,27840,14032,43008,20912,43008,21760,27840,21760,0,28816,5568,28816,41952,22560,41184,19080,36384, 563 | 15600,31584,15600,23760,15600,15888,19080,11088,22560,6288,28816,5568,45008,45776,45008,38464,41856,40208,38968,41096, 564 | 36080,41984,33200,42112,33152,5392,36128,5616,39040,6504,41952,7392,45008,9056,45008,1824,42240,560,39328,-184, 565 | 36416,-928,33152,-1232,33152,-13296,28816,-13296,28816,-1056,18576,-208,12944,6312,7312,12832,7312,23760,7312,34720, 566 | 12944,41224,18576,47728,28816,48656,28816,60864,33152,60864,33200,48656,36288,48496,39200,47792,42112,47088,45008,45776, 567 | 46832,62048,46832,54320,43600,56064,40712,56936,37824,57808,35232,57808,28944,57808,26480,54512,24016,51216,24016,42208, 568 | 24016,33072,40624,33072,40624,26992,24016,26992,24016,7232,47680,7232,47680,0,5488,0,5488,7232,15520,7232, 569 | 15520,26992,7056,26992,7056,33072,15520,33072,15520,43184,15520,54272,20064,59440,24608,64608,34464,64608,37056,64608, 570 | 40264,63944,43472,63280,46832,62048,37872,42208,46672,51088,51504,46192,42752,37440,44320,34928,45088,32400,45856,29872, 571 | 45856,27248,45856,24560,45048,22120,44240,19680,42544,17248,51424,8464,46576,3648,37776,12448,35280,10752,32816,9944, 572 | 30352,9136,27760,9136,25280,9136,22736,9920,20192,10704,17600,12288,8800,3488,4000,8368,12800,17120,11216,19760, 573 | 10432,22272,9648,24784,9648,27248,9648,29968,10456,32432,11264,34896,12880,37280,4080,46032,8960,50912,17760,42112, 574 | 20096,43776,22568,44560,25040,45344,27760,45344,30304,45344,32792,44584,35280,43824,37872,42208,39184,27328,39184,32080, 575 | 35888,35360,32592,38640,27760,38640,22992,38640,19632,35360,16272,32080,16272,27328,16272,22480,19608,19168,22944,15856, 576 | 27760,15856,32560,15856,35872,19192,39184,22528,39184,27328,49520,19344,31968,19344,31968,0,23424,0,23424,19344, 577 | 5744,19344,5744,24560,23424,24560,23424,26736,19840,33328,5744,33328,5744,38544,16960,38544,3488,63456,11568,63456, 578 | 27664,33696,43696,63456,51808,63456,38288,38544,49520,38544,49520,33328,35440,33328,31872,26736,31872,24560,49520,24560, 579 | 49520,19344,18272,17344,18272,-14880,11056,-14880,11056,17344,18272,17344,18272,60864,18272,28640,11056,28640,11056,60864, 580 | 18272,60864,16112,39776,13424,37824,12112,35912,10800,34000,10800,32048,10800,28816,13752,25992,16704,23168,27328,17424, 581 | 30000,19344,31320,21272,32640,23200,32640,25168,32640,28352,29600,31240,26560,34128,16112,39776,35232,62128,35232,55168, 582 | 31712,56816,28672,57648,25632,58480,23248,58480,19120,58480,16824,56784,14528,55088,14528,52064,14528,48240,23296,43344, 583 | 24400,42720,24992,42368,33952,37312,36736,34040,39520,30768,39520,26480,39520,22656,37568,19680,35616,16704,31664,14448, 584 | 34304,12240,35512,9920,36720,7600,36720,4880,36720,-1152,32384,-4720,28048,-8288,20704,-8288,17600,-8288,14328,-7672, 585 | 11056,-7056,7312,-5824,7312,1152,11008,-512,14152,-1336,17296,-2160,19760,-2160,24096,-2160,26496,-376,28896,1408, 586 | 28896,4640,28896,8960,19504,14192,18448,14784,9344,19888,6624,23144,3904,26400,3904,30720,3904,34592,5880,37632, 587 | 7856,40672,11728,42752,9216,44624,7968,47008,6720,49392,6720,52320,6720,57840,10968,61224,15216,64608,22272,64608, 588 | 25376,64608,28624,63984,31872,63360,35232,62128,25760,65968,34384,65968,34384,57376,25760,57376,25760,65968,9136,65968, 589 | 17760,65968,17760,57376,9136,57376,9136,65968,43520,63120,49984,63120,55568,60776,61152,58432,65792,53808,70416,49168, 590 | 72712,43600,75008,38032,75008,31488,75008,25040,72712,19488,70416,13936,65792,9312,61152,4672,55568,2336,49984,0, 591 | 43520,0,37056,0,31472,2336,25888,4672,21248,9312,16624,13936,14328,19488,12032,25040,12032,31488,12032,38032, 592 | 14328,43600,16624,49168,21248,53808,25888,58432,31472,60776,37056,63120,43520,63120,43520,58736,37952,58736,33152,56736, 593 | 28352,54736,24352,50752,20352,46752,18312,41888,16272,37024,16272,31488,16272,26016,18312,21192,20352,16368,24352,12368, 594 | 28352,8368,33152,6352,37952,4336,43520,4336,49136,4336,53960,6352,58784,8368,62768,12368,66720,16320,68696,21120, 595 | 70672,25920,70672,31488,70672,37152,68680,41976,66688,46800,62768,50752,58784,54736,53960,56736,49136,58736,43520,58736, 596 | 56224,48320,56224,42848,53424,44240,50664,44920,47904,45600,45088,45600,38768,45600,35216,41880,31664,38160,31664,31488, 597 | 31664,24736,35296,21040,38928,17344,45520,17344,48240,17344,50832,18000,53424,18656,56224,20096,56224,14704,53376,13472, 598 | 50464,12880,47552,12288,44576,12288,35408,12288,30072,17472,24736,22656,24736,31488,24736,40368,30072,45512,35408,50656, 599 | 44576,50656,47680,50656,50576,50064,53472,49472,56224,48320,5904,25168,35152,25168,35152,19936,5904,19936,5904,25168, 600 | 35056,49520,35056,30480,28736,30480,28736,35232,26864,32560,23800,31112,20736,29664,16784,29664,11344,29664,8112,32536, 601 | 4880,35408,4880,40208,4880,45936,8944,48872,13008,51808,20992,51808,28736,51808,28736,51984,28736,55840,26248,57776, 602 | 23760,59712,18784,59712,16144,59712,13256,58992,10368,58272,7488,56816,7488,62224,10576,63408,13664,64008,16752,64608, 603 | 19680,64608,27456,64608,31256,60864,35056,57120,35056,49520,23328,46928,16496,46928,13816,45504,11136,44080,11136,40720, 604 | 11136,38000,13216,36360,15296,34720,18784,34720,23200,34720,25968,37784,28736,40848,28736,45680,28736,46928,23328,46928, 605 | 45088,45008,45088,36896,32304,25504,45088,14112,45088,6000,25168,23760,25168,27248,45088,45008,26640,45008,26640,36896, 606 | 13856,25504,26640,14112,26640,6000,6720,23760,6720,27248,26640,45008,9216,36640,63712,36640,63712,12192,56560,12192, 607 | 56560,29408,9216,29408,9216,36640,4256,27328,27152,27328,27152,20352,4256,20352,4256,27328,43520,58736,37952,58736, 608 | 33152,56736,28352,54736,24352,50752,20352,46752,18312,41888,16272,37024,16272,31488,16272,26016,18312,21192,20352,16368, 609 | 24352,12368,28352,8368,33152,6352,37952,4336,43520,4336,49136,4336,53960,6352,58784,8368,62768,12368,66720,16320, 610 | 68696,21120,70672,25920,70672,31488,70672,37152,68680,41976,66688,46800,62768,50752,58784,54736,53960,56736,49136,58736, 611 | 43520,58736,43520,63120,49984,63120,55568,60776,61152,58432,65792,53808,70416,49168,72712,43600,75008,38032,75008,31488, 612 | 75008,25040,72712,19488,70416,13936,65792,9312,61152,4672,55568,2336,49984,0,43520,0,37056,0,31472,2336, 613 | 25888,4672,21248,9312,16624,13936,14328,19488,12032,25040,12032,31488,12032,38032,14328,43600,16624,49168,21248,53808, 614 | 25888,58432,31472,60776,37056,63120,43520,63120,42368,45520,37152,45520,37152,33792,42368,33792,47040,33792,48896,35104, 615 | 50752,36416,50752,39616,50752,42848,48880,44184,47008,45520,42368,45520,42672,49888,50144,49888,53848,47360,57552,44832, 616 | 57552,39696,57552,36048,55320,33664,53088,31280,49008,30560,50016,30224,51440,28584,52864,26944,54832,23840,60640,14368, 617 | 53344,14368,47856,23248,45344,27328,43792,28408,42240,29488,39952,29488,37152,29488,37152,14368,30560,14368,30560,49888, 618 | 42672,49888,9056,64848,34464,64848,34464,58560,9056,58560,9056,64848,21760,59120,18368,59120,16024,56760,13680,54400, 619 | 13680,51008,13680,47648,16024,45328,18368,43008,21760,43008,25168,43008,27504,45328,29840,47648,29840,51008,29840,54352, 620 | 27480,56736,25120,59120,21760,59120,21760,64608,24480,64608,26984,63560,29488,62512,31328,60560,33280,58656,34256,56232, 621 | 35232,53808,35232,51008,35232,45392,31304,41504,27376,37616,21680,37616,15936,37616,12112,41440,8288,45264,8288,51008, 622 | 8288,56688,12200,60648,16112,64608,21760,64608,40032,54576,40032,38128,63712,38128,63712,30896,40032,30896,40032,14448, 623 | 32896,14448,32896,30896,9216,30896,9216,38128,32896,38128,32896,54576,40032,54576,9216,7232,63712,7232,63712,0, 624 | 9216,0,9216,7232,11392,33232,29408,33232,29408,28384,4000,28384,4000,33072,5440,34384,8112,36768,22736,49728, 625 | 22736,53728,22736,56528,20528,58248,18320,59968,14704,59968,12496,59968,9904,59224,7312,58480,4256,56992,4256,62224, 626 | 7520,63408,10344,64008,13168,64608,15600,64608,21760,64608,25456,61800,29152,58992,29152,54400,29152,48496,15088,36416, 627 | 12704,34384,11392,33232,22272,47600,26176,46832,28328,44520,30480,42208,30480,38720,30480,33440,26440,30600,22400,27760, 628 | 14880,27760,12448,27760,9792,28200,7136,28640,4160,29488,4160,34640,6368,33488,8904,32936,11440,32384,14288,32384, 629 | 18912,32384,21464,34064,24016,35744,24016,38720,24016,41856,21656,43472,19296,45088,14704,45088,11056,45088,11056,49680, 630 | 15040,49680,19040,49680,21104,51024,23168,52368,23168,54912,23168,57376,21040,58672,18912,59968,14880,59968,13168,59968, 631 | 11008,59584,8848,59200,5392,58224,5392,63120,8496,63840,11216,64224,13936,64608,16272,64608,22400,64608,25992,62096, 632 | 29584,59584,29584,55376,29584,52448,27672,50408,25760,48368,22272,47600,27664,69616,36128,69616,22272,53632,15760,53632, 633 | 27664,69616,7392,-18112,7392,47600,15216,47600,15216,18016,15216,11856,18152,8712,21088,5568,26816,5568,33104,5568, 634 | 36272,9136,39440,12704,39440,19840,39440,47600,47264,47600,47264,10960,47264,8416,48008,7208,48752,6000,50320,6000, 635 | 50704,6000,51384,6232,52064,6464,53248,6976,53248,688,51504,-304,49952,-768,48400,-1232,46928,-1232,43984,-1232, 636 | 42240,424,40496,2080,39872,5488,37744,2128,34664,448,31584,-1232,27408,-1232,23072,-1232,20040,424,17008,2080, 637 | 15216,5392,15216,-18112,7392,-18112,26896,63456,45936,63456,45936,-8368,39952,-8368,39952,58224,31872,58224,31872,-8368, 638 | 25840,-8368,25840,27584,16704,28304,11712,33000,6720,37696,6720,45520,6720,53600,12240,58528,17760,63456,26896,63456, 639 | 9312,35616,18272,35616,18272,24816,9312,24816,9312,35616,25328,0,27664,-2640,28816,-4872,29968,-7104,29968,-9136, 640 | 29968,-12928,27416,-14856,24864,-16784,19840,-16784,17888,-16784,16040,-16528,14192,-16272,12368,-15760,12368,-10208,13808,-10928, 641 | 15384,-11248,16960,-11568,18960,-11568,21456,-11568,22736,-10544,24016,-9520,24016,-7568,24016,-6288,23104,-4440,22192,-2592, 642 | 20272,0,25328,0,6624,33072,15296,33072,15296,59040,5824,57296,5824,62224,15600,63872,21424,63872,21424,33072, 643 | 30128,33072,30128,28384,6624,28384,6624,33072,5904,25168,35152,25168,35152,19936,5904,19936,5904,25168,20528,64608, 644 | 28128,64608,32512,59904,36896,55200,36896,47088,36896,38976,32512,34320,28128,29664,20528,29664,12928,29664,8504,34336, 645 | 4080,39008,4080,47088,4080,55200,8504,59904,12928,64608,20528,64608,20528,59712,16064,59712,13384,56288,10704,52864, 646 | 10704,47088,10704,41440,13408,38040,16112,34640,20528,34640,24992,34640,27648,38040,30304,41440,30304,47088,30304,52912, 647 | 27672,56312,25040,59712,20528,59712,8208,45008,28128,27248,28128,23760,8208,6000,8208,14112,20992,25504,8208,36896, 648 | 8208,45008,26640,45008,46576,27248,46576,23760,26640,6000,26640,14112,39440,25504,26640,36896,26640,45008,6624,33072, 649 | 15296,33072,15296,59040,5824,57296,5824,62224,15600,63872,21424,63872,21424,33072,30128,33072,30128,28384,6624,28384, 650 | 6624,33072,69424,30064,56288,12256,69424,12256,69424,30064,68496,35200,75552,35200,75552,12256,81280,12256,81280,7616, 651 | 75552,7616,75552,-288,69424,-288,69424,7616,51824,7616,51824,12768,68496,35200,58496,64608,65296,64608,25680,-1232, 652 | 18880,-1232,58496,64608,6624,33072,15296,33072,15296,59040,5824,57296,5824,62224,15600,63872,21424,63872,21424,33072, 653 | 30128,33072,30128,28384,6624,28384,6624,33072,60544,4560,78560,4560,78560,-288,53152,-288,53152,4400,54592,5712, 654 | 57264,8096,71888,21056,71888,25056,71888,27856,69680,29576,67472,31296,63856,31296,61648,31296,59056,30552,56464,29808, 655 | 53408,28320,53408,33552,56672,34736,59496,35336,62320,35936,64752,35936,70912,35936,74608,33128,78304,30320,78304,25728, 656 | 78304,19824,64240,7744,61856,5712,60544,4560,58496,64608,65296,64608,25680,-1232,18880,-1232,58496,64608,22272,47600, 657 | 26176,46832,28328,44520,30480,42208,30480,38720,30480,33440,26440,30600,22400,27760,14880,27760,12448,27760,9792,28200, 658 | 7136,28640,4160,29488,4160,34640,6368,33488,8904,32936,11440,32384,14288,32384,18912,32384,21464,34064,24016,35744, 659 | 24016,38720,24016,41856,21656,43472,19296,45088,14704,45088,11056,45088,11056,49680,15040,49680,19040,49680,21104,51024, 660 | 23168,52368,23168,54912,23168,57376,21040,58672,18912,59968,14880,59968,13168,59968,11008,59584,8848,59200,5392,58224, 661 | 5392,63120,8496,63840,11216,64224,13936,64608,16272,64608,22400,64608,25992,62096,29584,59584,29584,55376,29584,52448, 662 | 27672,50408,25760,48368,22272,47600,69424,30064,56288,12256,69424,12256,69424,30064,68496,35200,75552,35200,75552,12256, 663 | 81280,12256,81280,7616,75552,7616,75552,-288,69424,-288,69424,7616,51824,7616,51824,12768,68496,35200,58496,64608, 664 | 65296,64608,25680,-1232,18880,-1232,58496,64608,21248,46416,29328,46416,29328,39776,29328,35488,28160,32728,26992,29968, 665 | 23168,26272,19344,22528,16880,20272,15792,18272,14704,16272,14704,14192,14704,10416,17488,8080,20272,5744,24912,5744, 666 | 28224,5744,32048,7232,35872,8720,39952,11568,39952,3568,35952,1152,31872,-40,27792,-1232,23424,-1232,15600,-1232, 667 | 10840,2888,6080,7008,6080,13776,6080,17008,7632,19912,9184,22816,12960,26480,16704,30128,18736,32128,19544,33256, 668 | 20352,34384,20704,35440,20992,36336,21120,37608,21248,38880,21248,41184,21248,46416,29584,52656,20992,52656,20992,63456, 669 | 29584,63456,29584,52656,29744,54992,18112,23424,41440,23424,29744,54992,24912,63456,34640,63456,58816,0,49888,0, 670 | 44112,16272,15520,16272,9728,0,688,0,24912,63456,27024,80208,35344,68992,28848,68992,19072,80208,27024,80208, 671 | 29744,54992,18112,23424,41440,23424,29744,54992,24912,63456,34640,63456,58816,0,49888,0,44112,16272,15520,16272, 672 | 9728,0,688,0,24912,63456,31776,80208,39632,80208,29952,68992,23440,68992,31776,80208,29744,54992,18112,23424, 673 | 41440,23424,29744,54992,24912,63456,34640,63456,58816,0,49888,0,44112,16272,15520,16272,9728,0,688,0, 674 | 24912,63456,25440,80304,33440,80304,42400,68992,36496,68992,29440,76560,22384,68992,16480,68992,25440,80304,29744,54992, 675 | 18112,23424,41440,23424,29744,54992,24912,63456,34640,63456,58816,0,49888,0,44112,16272,15520,16272,9728,0, 676 | 688,0,24912,63456,29264,72176,26848,73584,25792,74176,25128,74408,24464,74640,23952,74640,22432,74640,21576,73584, 677 | 20720,72528,20720,70608,20720,70352,15408,70352,15408,74640,17600,77152,19792,79664,23440,79664,24976,79664,26272,79320, 678 | 27568,78976,29616,77840,32032,76560,33008,76000,33728,75752,34448,75504,35088,75504,36448,75504,37304,76584,38160,77664, 679 | 38160,79408,38160,79664,43472,79664,43376,75408,41192,72880,39008,70352,35440,70352,33984,70352,32728,70696,31472,71040, 680 | 29264,72176,29744,54992,18112,23424,41440,23424,29744,54992,24912,63456,34640,63456,58816,0,49888,0,44112,16272, 681 | 15520,16272,9728,0,688,0,24912,63456,33440,78976,42064,78976,42064,70352,33440,70352,33440,78976,16816,78976, 682 | 25440,78976,25440,70352,16816,70352,16816,78976,36208,69104,36208,71776,34320,73672,32432,75568,29744,75568,27024,75568, 683 | 25176,73720,23328,71872,23328,69104,23328,66432,25200,64560,27072,62688,29744,62688,32432,62688,34320,64560,36208,66432, 684 | 36208,69104,29744,54992,18192,23424,41360,23424,29744,54992,23328,59376,20736,61120,19424,63560,18112,66000,18112,69104, 685 | 18112,74000,21488,77400,24864,80800,29744,80800,34592,80800,38016,77376,41440,73952,41440,69104,41440,66128,40104,63624, 686 | 38768,61120,36208,59376,58816,0,49888,0,44112,16272,15520,16272,9728,0,688,0,23328,59376,78416,63456, 687 | 78416,56224,46928,56224,46928,37440,77136,37440,77136,30224,46928,30224,46928,7232,79216,7232,79216,0,38288,0, 688 | 38288,16272,15856,16272,9056,0,336,0,26896,63456,78416,63456,32816,56736,18784,23424,38288,23424,38288,56736, 689 | 32816,56736,56064,58560,56064,49520,51728,53552,46816,55552,41904,57552,36384,57552,25504,57552,19720,50896,13936,44240, 690 | 13936,31664,13936,19120,19720,12472,25504,5824,36384,5824,41904,5824,46816,7824,51728,9824,56064,13856,56064,4880, 691 | 51552,1824,46520,296,41488,-1232,35872,-1232,21456,-1232,13168,7584,4880,16400,4880,31664,4880,46960,13168,55784, 692 | 21456,64608,35872,64608,41568,64608,46600,63096,51632,61584,56064,58560,38640,0,40976,-2640,42128,-4872,43280,-7104, 693 | 43280,-9136,43280,-12928,40728,-14856,38176,-16784,33152,-16784,31200,-16784,29352,-16528,27504,-16272,25680,-15760,25680,-10208, 694 | 27120,-10928,28696,-11248,30272,-11568,32272,-11568,34768,-11568,36048,-10544,37328,-9520,37328,-7568,37328,-6288,36416,-4440, 695 | 35504,-2592,33584,0,38640,0,8544,63456,48656,63456,48656,56224,17120,56224,17120,37440,47344,37440,47344,30224, 696 | 17120,30224,17120,7232,49424,7232,49424,0,8544,0,8544,63456,26000,80208,34320,68992,27824,68992,18048,80208, 697 | 26000,80208,8544,63456,48656,63456,48656,56224,17120,56224,17120,37440,47344,37440,47344,30224,17120,30224,17120,7232, 698 | 49424,7232,49424,0,8544,0,8544,63456,30752,80208,38608,80208,28928,68992,22416,68992,30752,80208,8544,63456, 699 | 48656,63456,48656,56224,17120,56224,17120,37440,47344,37440,47344,30224,17120,30224,17120,7232,49424,7232,49424,0, 700 | 8544,0,8544,63456,24416,80304,32416,80304,41376,68992,35472,68992,28416,76560,21360,68992,15456,68992,24416,80304, 701 | 8544,63456,48656,63456,48656,56224,17120,56224,17120,37440,47344,37440,47344,30224,17120,30224,17120,7232,49424,7232, 702 | 49424,0,8544,0,8544,63456,32416,78976,41040,78976,41040,70352,32416,70352,32416,78976,15792,78976,24416,78976, 703 | 24416,70352,15792,70352,15792,78976,8544,63456,17120,63456,17120,0,8544,0,8544,63456,10640,80208,18960,68992, 704 | 12464,68992,2688,80208,10640,80208,8544,63456,17120,63456,17120,0,8544,0,8544,63456,15392,80208,23248,80208, 705 | 13568,68992,7056,68992,15392,80208,8544,63456,17120,63456,17120,0,8544,0,8544,63456,9056,80304,17056,80304, 706 | 26016,68992,20112,68992,13056,76560,6000,68992,96,68992,9056,80304,8544,63456,17120,63456,17120,0,8544,0, 707 | 8544,63456,17056,78976,25680,78976,25680,70352,17056,70352,17056,78976,432,78976,9056,78976,9056,70352,432,70352, 708 | 432,78976,8960,63456,26640,63456,45056,63456,53680,55784,62304,48112,62304,31792,62304,15392,53656,7696,45008,0, 709 | 26640,0,8960,0,8960,29744,432,29744,432,35872,8960,35872,8960,63456,17600,56400,17600,35872,31872,35872, 710 | 31872,29744,17600,29744,17600,7056,27920,7056,41056,7056,47152,13008,53248,18960,53248,31792,53248,44544,47152,50472, 711 | 41056,56400,27920,56400,17600,56400,8544,63456,20096,63456,48240,10368,48240,63456,56560,63456,56560,0,45008,0, 712 | 16880,53088,16880,0,8544,0,8544,63456,32336,72176,29920,73584,28864,74176,28200,74408,27536,74640,27024,74640, 713 | 25504,74640,24648,73584,23792,72528,23792,70608,23792,70352,18480,70352,18480,74640,20672,77152,22864,79664,26512,79664, 714 | 28048,79664,29344,79320,30640,78976,32688,77840,35104,76560,36080,76000,36800,75752,37520,75504,38160,75504,39520,75504, 715 | 40376,76584,41232,77664,41232,79408,41232,79664,46544,79664,46448,75408,44264,72880,42080,70352,38512,70352,37056,70352, 716 | 35800,70696,34544,71040,32336,72176,34304,57632,24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712, 717 | 24944,5744,34304,5744,43648,5744,49112,12712,54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632, 718 | 34304,64608,47648,64608,55632,55656,63616,46704,63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,20912,-1232, 719 | 12896,7696,4880,16624,4880,31664,4880,46704,12896,55656,20912,64608,34304,64608,32144,80208,40464,68992,33968,68992, 720 | 24192,80208,32144,80208,34304,57632,24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712,24944,5744, 721 | 34304,5744,43648,5744,49112,12712,54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632,34304,64608, 722 | 47648,64608,55632,55656,63616,46704,63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,20912,-1232,12896,7696, 723 | 4880,16624,4880,31664,4880,46704,12896,55656,20912,64608,34304,64608,36896,80208,44752,80208,35072,68992,28560,68992, 724 | 36896,80208,34304,57632,24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712,24944,5744,34304,5744, 725 | 43648,5744,49112,12712,54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632,34304,64608,47648,64608, 726 | 55632,55656,63616,46704,63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,20912,-1232,12896,7696,4880,16624, 727 | 4880,31664,4880,46704,12896,55656,20912,64608,34304,64608,30560,80304,38560,80304,47520,68992,41616,68992,34560,76560, 728 | 27504,68992,21600,68992,30560,80304,34304,57632,24944,57632,19440,50664,13936,43696,13936,31664,13936,19680,19440,12712, 729 | 24944,5744,34304,5744,43648,5744,49112,12712,54576,19680,54576,31664,54576,43696,49112,50664,43648,57632,34304,57632, 730 | 34304,64608,47648,64608,55632,55656,63616,46704,63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,20912,-1232, 731 | 12896,7696,4880,16624,4880,31664,4880,46704,12896,55656,20912,64608,34304,64608,34384,72176,31968,73584,30912,74176, 732 | 30248,74408,29584,74640,29072,74640,27552,74640,26696,73584,25840,72528,25840,70608,25840,70352,20528,70352,20528,74640, 733 | 22720,77152,24912,79664,28560,79664,30096,79664,31392,79320,32688,78976,34736,77840,37152,76560,38128,76000,38848,75752, 734 | 39568,75504,40208,75504,41568,75504,42424,76584,43280,77664,43280,79408,43280,79664,48592,79664,48496,75408,46312,72880, 735 | 44128,70352,40560,70352,39104,70352,37848,70696,36592,71040,34384,72176,34304,57632,24944,57632,19440,50664,13936,43696, 736 | 13936,31664,13936,19680,19440,12712,24944,5744,34304,5744,43648,5744,49112,12712,54576,19680,54576,31664,54576,43696, 737 | 49112,50664,43648,57632,34304,57632,34304,64608,47648,64608,55632,55656,63616,46704,63616,31664,63616,16656,55632,7712, 738 | 47648,-1232,34304,-1232,20912,-1232,12896,7696,4880,16624,4880,31664,4880,46704,12896,55656,20912,64608,34304,64608, 739 | 38560,78976,47184,78976,47184,70352,38560,70352,38560,78976,21936,78976,30560,78976,30560,70352,21936,70352,21936,78976, 740 | 61024,46752,41600,27248,61024,7824,55968,2672,36464,22192,16960,2672,11936,7824,31328,27248,11936,46752,16960,51888, 741 | 36464,32384,55968,51888,61024,46752,51248,47264,20784,11312,23424,8592,26840,7168,30256,5744,34304,5744,43648,5744, 742 | 49112,12712,54576,19680,54576,31664,54576,36416,53744,40328,52912,44240,51248,47264,47776,52064,45184,54784,41760,56208, 743 | 38336,57632,34304,57632,24944,57632,19440,50664,13936,43696,13936,31664,13936,26896,14768,22904,15600,18912,17248,16016, 744 | 47776,52064,11568,9312,8240,13648,6560,19256,4880,24864,4880,31664,4880,46704,12896,55656,20912,64608,34304,64608, 745 | 39824,64608,44520,62968,49216,61328,52912,58144,59792,66256,64128,62480,56912,54064,60224,49680,61920,44032,63616,38384, 746 | 63616,31664,63616,16656,55632,7712,47648,-1232,34304,-1232,28864,-1232,24168,360,19472,1952,15600,5136,8720,-2976, 747 | 4336,768,11568,9312,7568,63456,16192,63456,16192,24912,16192,14704,19888,10224,23584,5744,31872,5744,40128,5744, 748 | 43824,10224,47520,14704,47520,24912,47520,63456,56144,63456,56144,23840,56144,11440,50000,5104,43856,-1232,31872,-1232, 749 | 19840,-1232,13704,5104,7568,11440,7568,23840,7568,63456,29072,80208,37392,68992,30896,68992,21120,80208,29072,80208, 750 | 7568,63456,16192,63456,16192,24912,16192,14704,19888,10224,23584,5744,31872,5744,40128,5744,43824,10224,47520,14704, 751 | 47520,24912,47520,63456,56144,63456,56144,23840,56144,11440,50000,5104,43856,-1232,31872,-1232,19840,-1232,13704,5104, 752 | 7568,11440,7568,23840,7568,63456,33824,80208,41680,80208,32000,68992,25488,68992,33824,80208,7568,63456,16192,63456, 753 | 16192,24912,16192,14704,19888,10224,23584,5744,31872,5744,40128,5744,43824,10224,47520,14704,47520,24912,47520,63456, 754 | 56144,63456,56144,23840,56144,11440,50000,5104,43856,-1232,31872,-1232,19840,-1232,13704,5104,7568,11440,7568,23840, 755 | 7568,63456,27488,80304,35488,80304,44448,68992,38544,68992,31488,76560,24432,68992,18528,68992,27488,80304,7568,63456, 756 | 16192,63456,16192,24912,16192,14704,19888,10224,23584,5744,31872,5744,40128,5744,43824,10224,47520,14704,47520,24912, 757 | 47520,63456,56144,63456,56144,23840,56144,11440,50000,5104,43856,-1232,31872,-1232,19840,-1232,13704,5104,7568,11440, 758 | 7568,23840,7568,63456,35488,78976,44112,78976,44112,70352,35488,70352,35488,78976,18864,78976,27488,78976,27488,70352, 759 | 18864,70352,18864,78976,-176,63456,9056,63456,26640,37360,44112,63456,53344,63456,30896,30224,30896,0,22272,0, 760 | 22272,30224,-176,63456,28704,80208,36560,80208,26880,68992,20368,68992,28704,80208,8544,63456,17120,63456,17120,52240, 761 | 27920,52240,38592,52240,44056,47456,49520,42672,49520,33328,49520,23968,44056,19168,38592,14368,27920,14368,17120,14368, 762 | 17120,0,8544,0,8544,63456,17120,45184,17120,21424,27920,21424,33920,21424,37192,24528,40464,27632,40464,33328, 763 | 40464,39008,37208,42096,33952,45184,27920,45184,17120,45184,7904,48320,7904,56816,12984,61472,18064,66128,27328,66128, 764 | 36160,66128,40816,61200,45472,56272,45600,46752,39184,46416,35616,43968,32048,41520,32048,37440,32048,35440,33280,33720, 765 | 34512,32000,37280,30224,39696,28640,46752,24144,48792,21128,50832,18112,50832,13856,50832,6544,46048,2656,41264,-1232, 766 | 32304,-1232,29584,-1232,26696,-704,23808,-176,20704,848,20704,7824,24096,6544,27072,5928,30048,5312,32816,5312, 767 | 37744,5312,40296,7328,42848,9344,42848,13216,42848,15888,41592,17680,40336,19472,36048,22096,32128,24432,28048,26944, 768 | 26200,29816,24352,32688,24352,36544,24352,41952,27904,45608,31456,49264,37872,50496,37520,54864,34744,57248,31968,59632, 769 | 27152,59632,21632,59632,18744,56680,15856,53728,15856,48160,15856,0,7904,0,7904,48320,29840,23920,20352,23920, 770 | 16696,21760,13040,19600,13040,14368,13040,10208,15784,7760,18528,5312,23248,5312,29744,5312,33680,9920,37616,14528, 771 | 37616,22192,37616,23920,29840,23920,45440,27152,45440,0,37616,0,37616,7232,34928,2896,30936,832,26944,-1232, 772 | 21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856,5232,21888,10608,25968,15984,30048,26640,30048,37616,30048, 773 | 37616,30816,37616,36208,34064,39160,30512,42112,24096,42112,20016,42112,16152,41136,12288,40160,8720,38208,8720,45440, 774 | 13008,47088,17048,47920,21088,48752,24912,48752,35232,48752,40336,43392,45440,38032,45440,27152,18672,69616,30656,53728, 775 | 24160,53728,10304,69616,18672,69616,29840,23920,20352,23920,16696,21760,13040,19600,13040,14368,13040,10208,15784,7760, 776 | 18528,5312,23248,5312,29744,5312,33680,9920,37616,14528,37616,22192,37616,23920,29840,23920,45440,27152,45440,0, 777 | 37616,0,37616,7232,34928,2896,30936,832,26944,-1232,21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856, 778 | 5232,21888,10608,25968,15984,30048,26640,30048,37616,30048,37616,30816,37616,36208,34064,39160,30512,42112,24096,42112, 779 | 20016,42112,16152,41136,12288,40160,8720,38208,8720,45440,13008,47088,17048,47920,21088,48752,24912,48752,35232,48752, 780 | 40336,43392,45440,38032,45440,27152,30736,69616,39200,69616,25344,53632,18832,53632,30736,69616,29840,23920,20352,23920, 781 | 16696,21760,13040,19600,13040,14368,13040,10208,15784,7760,18528,5312,23248,5312,29744,5312,33680,9920,37616,14528, 782 | 37616,22192,37616,23920,29840,23920,45440,27152,45440,0,37616,0,37616,7232,34928,2896,30936,832,26944,-1232, 783 | 21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856,5232,21888,10608,25968,15984,30048,26640,30048,37616,30048, 784 | 37616,30816,37616,36208,34064,39160,30512,42112,24096,42112,20016,42112,16152,41136,12288,40160,8720,38208,8720,45440, 785 | 13008,47088,17048,47920,21088,48752,24912,48752,35232,48752,40336,43392,45440,38032,45440,27152,21680,69616,27984,69616, 786 | 38384,53632,32480,53632,24832,64048,17184,53632,11280,53632,21680,69616,29840,23920,20352,23920,16696,21760,13040,19600, 787 | 13040,14368,13040,10208,15784,7760,18528,5312,23248,5312,29744,5312,33680,9920,37616,14528,37616,22192,37616,23920, 788 | 29840,23920,45440,27152,45440,0,37616,0,37616,7232,34928,2896,30936,832,26944,-1232,21168,-1232,13856,-1232, 789 | 9544,2872,5232,6976,5232,13856,5232,21888,10608,25968,15984,30048,26640,30048,37616,30048,37616,30816,37616,36208, 790 | 34064,39160,30512,42112,24096,42112,20016,42112,16152,41136,12288,40160,8720,38208,8720,45440,13008,47088,17048,47920, 791 | 21088,48752,24912,48752,35232,48752,40336,43392,45440,38032,45440,27152,24656,58224,22240,60560,21312,61408,20608,61816, 792 | 19904,62224,19344,62224,17728,62224,16968,60672,16208,59120,16112,55632,10800,55632,10896,61376,13064,64496,15232,67616, 793 | 19088,67616,20704,67616,22064,67024,23424,66432,25008,65024,27424,62688,28352,61840,29056,61432,29760,61024,30320,61024, 794 | 31936,61024,32696,62576,33456,64128,33552,67616,38864,67616,38768,61888,36600,58760,34432,55632,30576,55632,28960,55632, 795 | 27600,56224,26240,56816,24656,58224,29840,23920,20352,23920,16696,21760,13040,19600,13040,14368,13040,10208,15784,7760, 796 | 18528,5312,23248,5312,29744,5312,33680,9920,37616,14528,37616,22192,37616,23920,29840,23920,45440,27152,45440,0, 797 | 37616,0,37616,7232,34928,2896,30936,832,26944,-1232,21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856, 798 | 5232,21888,10608,25968,15984,30048,26640,30048,37616,30048,37616,30816,37616,36208,34064,39160,30512,42112,24096,42112, 799 | 20016,42112,16152,41136,12288,40160,8720,38208,8720,45440,13008,47088,17048,47920,21088,48752,24912,48752,35232,48752, 800 | 40336,43392,45440,38032,45440,27152,28832,65968,37456,65968,37456,57376,28832,57376,28832,65968,12208,65968,20832,65968, 801 | 20832,57376,12208,57376,12208,65968,29840,23920,20352,23920,16696,21760,13040,19600,13040,14368,13040,10208,15784,7760, 802 | 18528,5312,23248,5312,29744,5312,33680,9920,37616,14528,37616,22192,37616,23920,29840,23920,45440,27152,45440,0, 803 | 37616,0,37616,7232,34928,2896,30936,832,26944,-1232,21168,-1232,13856,-1232,9544,2872,5232,6976,5232,13856, 804 | 5232,21888,10608,25968,15984,30048,26640,30048,37616,30048,37616,30816,37616,36208,34064,39160,30512,42112,24096,42112, 805 | 20016,42112,16152,41136,12288,40160,8720,38208,8720,45440,13008,47088,17048,47920,21088,48752,24912,48752,35232,48752, 806 | 40336,43392,45440,38032,45440,27152,31296,64768,31296,67440,29424,69312,27552,71184,24832,71184,22064,71184,20216,69336, 807 | 18368,67488,18368,64768,18368,62000,20216,60152,22064,58304,24832,58304,27552,58304,29424,60176,31296,62048,31296,64768, 808 | 36480,64768,36480,59888,33096,56488,29712,53088,24832,53088,19952,53088,16568,56488,13184,59888,13184,64768,13184,69664, 809 | 16568,73040,19952,76416,24832,76416,29712,76416,33096,73040,36480,69664,36480,64768,73008,28048,72976,34464,69472,38288, 810 | 65968,42112,60144,42112,53632,42112,49704,38416,45776,34720,45184,28000,73008,28048,42288,40928,45440,44752,49944,46752, 811 | 54448,48752,60048,48752,69664,48752,75272,42568,80880,36384,80880,25760,80880,21936,44928,21936,45440,13808,49768,9560, 812 | 54096,5312,61888,5312,66304,5312,70552,6440,74800,7568,79056,9824,79056,2416,74800,640,70384,-296,65968,-1232, 813 | 61456,-1232,54352,-1232,49088,1336,43824,3904,40544,8960,37440,3872,32848,1320,28256,-1232,22192,-1232,14160,-1232, 814 | 9696,2744,5232,6720,5232,13856,5232,21888,10608,25968,15984,30048,26640,30048,37616,30048,37616,30816,37616,36208, 815 | 34064,39160,30512,42112,24096,42112,20016,42112,16152,41136,12288,40160,8720,38208,8720,45440,13008,47088,17048,47920, 816 | 21088,48752,24912,48752,30944,48752,35472,46712,40000,44672,42288,40928,29840,23920,20352,23920,16696,21760,13040,19600, 817 | 13040,14368,13040,10208,15784,7760,18528,5312,23248,5312,29744,5312,33680,9920,37616,14528,37616,22192,37616,23920, 818 | 29840,23920,42464,45776,42464,38464,39136,40288,35800,41200,32464,42112,29072,42112,21456,42112,17248,37288,13040,32464, 819 | 13040,23760,13040,15040,17248,10216,21456,5392,29072,5392,32464,5392,35800,6312,39136,7232,42464,9056,42464,1824, 820 | 39184,304,35680,-464,32176,-1232,28224,-1232,17472,-1232,11136,5528,4800,12288,4800,23760,4800,35408,11200,42080, 821 | 17600,48752,28736,48752,32336,48752,35784,48008,39232,47264,42464,45776,31472,0,33808,-2640,34960,-4872,36112,-7104, 822 | 36112,-9136,36112,-12928,33560,-14856,31008,-16784,25984,-16784,24032,-16784,22184,-16528,20336,-16272,18512,-15760,18512,-10208, 823 | 19952,-10928,21528,-11248,23104,-11568,25104,-11568,27600,-11568,28880,-10544,30160,-9520,30160,-7568,30160,-6288,29248,-4440, 824 | 28336,-2592,26416,0,31472,0,48912,25760,48912,21936,12960,21936,13472,13856,17832,9624,22192,5392,29968,5392, 825 | 34464,5392,38696,6496,42928,7600,47088,9824,47088,2416,42880,640,38464,-296,34048,-1232,29488,-1232,18112,-1232, 826 | 11456,5400,4800,12032,4800,23328,4800,35024,11112,41888,17424,48752,28128,48752,37744,48752,43328,42568,48912,36384, 827 | 48912,25760,41104,28048,41008,34464,37504,38288,34000,42112,28224,42112,21680,42112,17744,38416,13808,34720,13216,28000, 828 | 41104,28048,21744,69616,33728,53728,27232,53728,13376,69616,21744,69616,48912,25760,48912,21936,12960,21936,13472,13856, 829 | 17832,9624,22192,5392,29968,5392,34464,5392,38696,6496,42928,7600,47088,9824,47088,2416,42880,640,38464,-296, 830 | 34048,-1232,29488,-1232,18112,-1232,11456,5400,4800,12032,4800,23328,4800,35024,11112,41888,17424,48752,28128,48752, 831 | 37744,48752,43328,42568,48912,36384,48912,25760,41104,28048,41008,34464,37504,38288,34000,42112,28224,42112,21680,42112, 832 | 17744,38416,13808,34720,13216,28000,41104,28048,33808,69616,42272,69616,28416,53632,21904,53632,33808,69616,48912,25760, 833 | 48912,21936,12960,21936,13472,13856,17832,9624,22192,5392,29968,5392,34464,5392,38696,6496,42928,7600,47088,9824, 834 | 47088,2416,42880,640,38464,-296,34048,-1232,29488,-1232,18112,-1232,11456,5400,4800,12032,4800,23328,4800,35024, 835 | 11112,41888,17424,48752,28128,48752,37744,48752,43328,42568,48912,36384,48912,25760,41104,28048,41008,34464,37504,38288, 836 | 34000,42112,28224,42112,21680,42112,17744,38416,13808,34720,13216,28000,41104,28048,24752,69616,31056,69616,41456,53632, 837 | 35552,53632,27904,64048,20256,53632,14352,53632,24752,69616,48912,25760,48912,21936,12960,21936,13472,13856,17832,9624, 838 | 22192,5392,29968,5392,34464,5392,38696,6496,42928,7600,47088,9824,47088,2416,42880,640,38464,-296,34048,-1232, 839 | 29488,-1232,18112,-1232,11456,5400,4800,12032,4800,23328,4800,35024,11112,41888,17424,48752,28128,48752,37744,48752, 840 | 43328,42568,48912,36384,48912,25760,41104,28048,41008,34464,37504,38288,34000,42112,28224,42112,21680,42112,17744,38416, 841 | 13808,34720,13216,28000,41104,28048,31904,65968,40528,65968,40528,57376,31904,57376,31904,65968,15280,65968,23904,65968, 842 | 23904,57376,15280,57376,15280,65968,6384,69616,18368,53728,11872,53728,-1984,69616,6384,69616,8208,47600,16016,47600, 843 | 16016,0,8208,0,8208,47600,12112,48752,12112,48752,18448,69616,26912,69616,13056,53632,6544,53632,18448,69616, 844 | 8208,47600,16016,47600,16016,0,8208,0,8208,47600,12112,48752,12112,48752,8208,47600,16016,47600,16016,0, 845 | 8208,0,8208,47600,12112,48752,12112,48752,9392,69616,15696,69616,26096,53632,20192,53632,12544,64048,4896,53632, 846 | -1008,53632,9392,69616,8208,47600,16016,47600,16016,0,8208,0,8208,47600,12112,48752,12112,48752,16544,65968, 847 | 25168,65968,25168,57376,16544,57376,16544,65968,-80,65968,8544,65968,8544,57376,-80,57376,-80,65968,35616,38880, 848 | 33488,39616,31616,39952,29744,40288,28000,40288,20912,40288,16976,35696,13040,31104,13040,22816,13040,14832,16744,10112, 849 | 20448,5392,26640,5392,32816,5392,36512,10112,40208,14832,40208,22816,40208,28000,39056,32000,37904,36000,35616,38880, 850 | 38288,48496,43648,42416,46072,36296,48496,30176,48496,22816,48496,11984,42456,5376,36416,-1232,26640,-1232,16832,-1232, 851 | 10816,5376,4800,11984,4800,22816,4800,33440,10664,40056,16528,46672,25920,46672,26688,46672,27792,46560,28896,46448, 852 | 30688,46240,23920,53888,10368,49344,8960,53552,20912,57456,13216,66128,22912,66128,28304,59968,42464,64688,43856,60560, 853 | 31328,56400,38288,48496,47776,28736,47776,0,39952,0,39952,28480,39952,35232,37320,38592,34688,41952,29408,41952, 854 | 23072,41952,19416,37912,15760,33872,15760,26896,15760,0,7904,0,7904,47600,15760,47600,15760,40208,18576,44496, 855 | 22376,46624,26176,48752,31152,48752,39360,48752,43568,43672,47776,38592,47776,28736,27728,58224,25312,60560,24384,61408, 856 | 23680,61816,22976,62224,22416,62224,20800,62224,20040,60672,19280,59120,19184,55632,13872,55632,13968,61376,16136,64496, 857 | 18304,67616,22160,67616,23776,67616,25136,67024,26496,66432,28080,65024,30496,62688,31424,61840,32128,61432,32832,61024, 858 | 33392,61024,35008,61024,35768,62576,36528,64128,36624,67616,41936,67616,41840,61888,39672,58760,37504,55632,33648,55632, 859 | 32032,55632,30672,56224,29312,56816,27728,58224,26640,42112,20352,42112,16696,37208,13040,32304,13040,23760,13040,15216, 860 | 16680,10304,20320,5392,26640,5392,32896,5392,36552,10328,40208,15264,40208,23760,40208,32208,36552,37160,32896,42112, 861 | 26640,42112,26640,48752,36848,48752,42672,42120,48496,35488,48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232, 862 | 16400,-1232,10600,5416,4800,12064,4800,23760,4800,35488,10600,42120,16400,48752,26640,48752,20720,69616,32704,53728, 863 | 26208,53728,12352,69616,20720,69616,26640,42112,20352,42112,16696,37208,13040,32304,13040,23760,13040,15216,16680,10304, 864 | 20320,5392,26640,5392,32896,5392,36552,10328,40208,15264,40208,23760,40208,32208,36552,37160,32896,42112,26640,42112, 865 | 26640,48752,36848,48752,42672,42120,48496,35488,48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232,16400,-1232, 866 | 10600,5416,4800,12064,4800,23760,4800,35488,10600,42120,16400,48752,26640,48752,32784,69616,41248,69616,27392,53632, 867 | 20880,53632,32784,69616,26640,42112,20352,42112,16696,37208,13040,32304,13040,23760,13040,15216,16680,10304,20320,5392, 868 | 26640,5392,32896,5392,36552,10328,40208,15264,40208,23760,40208,32208,36552,37160,32896,42112,26640,42112,26640,48752, 869 | 36848,48752,42672,42120,48496,35488,48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232,16400,-1232,10600,5416, 870 | 4800,12064,4800,23760,4800,35488,10600,42120,16400,48752,26640,48752,23728,69616,30032,69616,40432,53632,34528,53632, 871 | 26880,64048,19232,53632,13328,53632,23728,69616,26640,42112,20352,42112,16696,37208,13040,32304,13040,23760,13040,15216, 872 | 16680,10304,20320,5392,26640,5392,32896,5392,36552,10328,40208,15264,40208,23760,40208,32208,36552,37160,32896,42112, 873 | 26640,42112,26640,48752,36848,48752,42672,42120,48496,35488,48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232, 874 | 16400,-1232,10600,5416,4800,12064,4800,23760,4800,35488,10600,42120,16400,48752,26640,48752,26704,58224,24288,60560, 875 | 23360,61408,22656,61816,21952,62224,21392,62224,19776,62224,19016,60672,18256,59120,18160,55632,12848,55632,12944,61376, 876 | 15112,64496,17280,67616,21136,67616,22752,67616,24112,67024,25472,66432,27056,65024,29472,62688,30400,61840,31104,61432, 877 | 31808,61024,32368,61024,33984,61024,34744,62576,35504,64128,35600,67616,40912,67616,40816,61888,38648,58760,36480,55632, 878 | 32624,55632,31008,55632,29648,56224,28288,56816,26704,58224,26640,42112,20352,42112,16696,37208,13040,32304,13040,23760, 879 | 13040,15216,16680,10304,20320,5392,26640,5392,32896,5392,36552,10328,40208,15264,40208,23760,40208,32208,36552,37160, 880 | 32896,42112,26640,42112,26640,48752,36848,48752,42672,42120,48496,35488,48496,23760,48496,12064,42672,5416,36848,-1232, 881 | 26640,-1232,16400,-1232,10600,5416,4800,12064,4800,23760,4800,35488,10600,42120,16400,48752,26640,48752,30880,65968, 882 | 39504,65968,39504,57376,30880,57376,30880,65968,14256,65968,22880,65968,22880,57376,14256,57376,14256,65968,31232,48240, 883 | 41696,48240,41696,37776,31232,37776,31232,48240,31232,16784,41696,16784,41696,6368,31232,6368,31232,16784,9216,30896, 884 | 63712,30896,63712,23680,9216,23680,9216,30896,38464,34048,17760,8880,19504,7104,21696,6248,23888,5392,26640,5392, 885 | 32896,5392,36552,10328,40208,15264,40208,23760,40208,27120,39784,29600,39360,32080,38464,34048,35440,38640,33664,40368, 886 | 31472,41240,29280,42112,26640,42112,20224,42112,16632,37120,13040,32128,13040,23168,13040,20096,13448,17760,13856,15424, 887 | 14704,13472,35440,38640,9392,7056,7104,10320,5952,14512,4800,18704,4800,23760,4800,35488,10600,42120,16400,48752, 888 | 26640,48752,30608,48752,33984,47664,37360,46576,40208,44368,46112,51504,50144,48160,43952,40544,46192,37280,47344,33072, 889 | 48496,28864,48496,23760,48496,12064,42672,5416,36848,-1232,26640,-1232,22560,-1232,19144,-128,15728,976,13040,3152, 890 | 7136,-4000,3056,-688,9392,7056,7392,18784,7392,47600,15216,47600,15216,19088,15216,12320,17848,8944,20480,5568, 891 | 25760,5568,32080,5568,35760,9608,39440,13648,39440,20608,39440,47600,47264,47600,47264,0,39440,0,39440,7312, 892 | 36592,2976,32832,872,29072,-1232,24096,-1232,15888,-1232,11640,3864,7392,8960,7392,18784,27072,48752,27072,48752, 893 | 20720,69616,32704,53728,26208,53728,12352,69616,20720,69616,7392,18784,7392,47600,15216,47600,15216,19088,15216,12320, 894 | 17848,8944,20480,5568,25760,5568,32080,5568,35760,9608,39440,13648,39440,20608,39440,47600,47264,47600,47264,0, 895 | 39440,0,39440,7312,36592,2976,32832,872,29072,-1232,24096,-1232,15888,-1232,11640,3864,7392,8960,7392,18784, 896 | 27072,48752,27072,48752,32784,69616,41248,69616,27392,53632,20880,53632,32784,69616,7392,18784,7392,47600,15216,47600, 897 | 15216,19088,15216,12320,17848,8944,20480,5568,25760,5568,32080,5568,35760,9608,39440,13648,39440,20608,39440,47600, 898 | 47264,47600,47264,0,39440,0,39440,7312,36592,2976,32832,872,29072,-1232,24096,-1232,15888,-1232,11640,3864, 899 | 7392,8960,7392,18784,27072,48752,27072,48752,23728,69616,30032,69616,40432,53632,34528,53632,26880,64048,19232,53632, 900 | 13328,53632,23728,69616,7392,18784,7392,47600,15216,47600,15216,19088,15216,12320,17848,8944,20480,5568,25760,5568, 901 | 32080,5568,35760,9608,39440,13648,39440,20608,39440,47600,47264,47600,47264,0,39440,0,39440,7312,36592,2976, 902 | 32832,872,29072,-1232,24096,-1232,15888,-1232,11640,3864,7392,8960,7392,18784,27072,48752,27072,48752,30880,65968, 903 | 39504,65968,39504,57376,30880,57376,30880,65968,14256,65968,22880,65968,22880,57376,14256,57376,14256,65968,28000,-4416, 904 | 24688,-12928,21544,-15520,18400,-18112,13136,-18112,6880,-18112,6880,-11568,11472,-11568,14704,-11568,16488,-10032,18272,-8496, 905 | 20448,-2800,21840,768,2592,47600,10880,47600,25760,10368,40624,47600,48912,47600,28000,-4416,31760,69616,40224,69616, 906 | 26368,53632,19856,53632,31760,69616,15760,7136,15760,-18112,7904,-18112,7904,66128,15760,66128,15760,40368,18240,44624, 907 | 22000,46688,25760,48752,30976,48752,39648,48752,45072,41864,50496,34976,50496,23760,50496,12544,45072,5656,39648,-1232, 908 | 30976,-1232,25760,-1232,22000,832,18240,2896,15760,7136,42368,23760,42368,32384,38824,37296,35280,42208,29072,42208, 909 | 22864,42208,19312,37296,15760,32384,15760,23760,15760,15136,19312,10224,22864,5312,29072,5312,35280,5312,38824,10224, 910 | 42368,15136,42368,23760,28000,-4416,24688,-12928,21544,-15520,18400,-18112,13136,-18112,6880,-18112,6880,-11568,11472,-11568, 911 | 14704,-11568,16488,-10032,18272,-8496,20448,-2800,21840,768,2592,47600,10880,47600,25760,10368,40624,47600,48912,47600, 912 | 28000,-4416,29856,65968,38480,65968,38480,57376,29856,57376,29856,65968,13232,65968,21856,65968,21856,57376,13232,57376, 913 | 13232,65968 914 | ], 915 | "glyphAdvances" : [ 916 | 917 | 27664,34896,40032,72928,55376,82704,67872,23920,33952,33952,43520,72928,27664,31408,27664,29328,55376,55376,55376,55376, 918 | 55376,55376,55376,55376,55376,55376,29328,29328,72928,72928,72928,46192,87040,59536,59712,60768,67024,54992,50064,67440, 919 | 65456,25664,25664,57072,48496,75104,65104,68512,52480,68512,60480,55248,53168,63712,59536,86064,59632,53168,59632,33952, 920 | 29328,33952,72928,43520,43520,53344,55248,47856,55248,53552,30640,55248,55168,24176,24176,50400,24176,84784,55168,53248, 921 | 55248,55248,35792,45344,34128,55168,51504,71184,51504,51504,45680,55376,29328,55376,72928,52240,52240,52240,52240,52240, 922 | 52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240,52240, 923 | 52240,52240,52240,52240,52240,52240,52240,52240,27664,34896,55376,55376,55376,55376,29328,43520,43520,87040,41008,53248, 924 | 72928,31408,87040,43520,43520,72928,34896,34896,43520,55376,55376,27664,43520,34896,41008,53248,84368,84368,84368,46192, 925 | 59536,59536,59536,59536,59536,59536,84784,60768,54992,54992,54992,54992,25664,25664,25664,25664,67440,65104,68512,68512, 926 | 68512,68512,68512,72928,68512,63712,63712,63712,63712,53168,52656,54832,53344,53344,53344,53344,53344,53344,85472,47856, 927 | 53552,53552,53552,53552,24176,24176,24176,24176,53248,55168,53248,53248,53248,53248,53248,72928,53248,55168,55168,55168, 928 | 55168,51504,55248,51504 929 | ], 930 | 931 | "glyphBBoxes" : [ 932 | 0,0,0,0,13136,0,21760,63456,8368,39872,31664,63456,6720,0,66256,62480,7232,-12800,48160,66128, 933 | 4800,-1232,77904,64608,5488,-1232,65200,64608,8368,39872,15600,63456,7488,-11472,26992,66048,6976,-11472,26480,66048, 934 | 2592,24912,40928,64608,9216,0,63712,54576,6720,-10112,19168,10800,4256,20352,27152,27328,9312,0,18272,10800, 935 | 0,-8080,29328,63456,5744,-1232,49600,64608,9568,0,47344,63456,6368,0,46672,64608,6624,-1232,48400,64608, 936 | 4256,0,50496,63456,6720,-1232,47776,63456,6080,-1232,49888,64608,7136,0,47936,63456,5904,-1232,49424,64608, 937 | 5488,-1232,49264,64608,10208,0,19168,45008,6720,-10112,19168,45008,9216,4000,63712,50576,9216,14960,63712,39520, 938 | 9216,4000,63712,50576,6240,0,40128,64608,5744,-15136,80960,61280,688,0,58816,63456,8544,0,53552,63456, 939 | 4880,-1232,56064,64608,8544,0,61888,63456,8544,0,49424,63456,8544,0,45008,63456,4880,-1232,60304,64608, 940 | 8544,0,56912,63456,8544,0,17120,63456,-4512,-17424,17120,63456,8544,0,58912,63456,8544,0,48032,63456, 941 | 8544,0,66592,63456,8544,0,56560,63456,4880,-1232,63616,64608,8544,0,49520,63456,4880,-11216,63616,64608, 942 | 8544,0,57968,63456,5744,-1232,50400,64608,-256,0,53424,63456,7568,-1232,56144,63456,688,0,58816,63456, 943 | 2896,0,83216,63456,2592,0,56912,63456,-176,0,53344,63456,3904,0,55712,63456,7488,-11472,25504,66128, 944 | 0,-8080,29328,63456,8464,-11472,26480,66128,9216,39776,63712,63456,-848,-20528,44368,-14448,7232,53728,27584,69616, 945 | 5232,-1232,45440,48752,7904,-1232,50496,66128,4800,-1232,42464,48752,4800,-1232,47344,66128,4800,-1232,48912,48752, 946 | 2000,0,32304,66128,4800,-18112,47344,48752,7904,0,47776,66128,8208,0,16016,66128,-1568,-18112,16016,66128, 947 | 7904,0,50144,66128,8208,0,16016,66128,7904,0,77392,48752,7904,0,47776,48752,4800,-1232,48496,48752, 948 | 7904,-18112,50496,48752,4800,-18112,47344,48752,7904,0,35792,48752,4720,-1232,41104,48752,2336,0,32048,61120, 949 | 7392,-1232,47264,48752,2592,0,48912,47600,3648,0,67536,47600,2512,0,48656,47600,2592,-18112,48912,47600, 950 | 3744,0,41952,47600,10880,-14192,44496,66128,11056,-20528,18272,66512,10880,-14192,44496,66128,9216,19840,63712,34720, 951 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 952 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 953 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 954 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 955 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 956 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376, 957 | 4336,-15392,47856,61376,4336,-15392,47856,61376,4336,-15392,47856,61376,0,0,0,0,13136,0,21760,63456, 958 | 7312,-13296,45008,60864,5488,0,47680,64608,4000,3488,51504,51088,3488,0,51808,63456,11056,-14880,18272,60864, 959 | 3904,-8288,39520,64608,9136,57376,34384,65968,12032,0,75008,63120,4880,19936,35152,64608,6720,6000,45088,45008, 960 | 9216,12192,63712,36640,4256,20352,27152,27328,12032,0,75008,63120,9056,58560,34464,64848,8288,37616,35232,64608, 961 | 9216,0,63712,54576,4000,28384,29408,64608,4160,27760,30480,64608,15760,53632,36128,69616,7392,-18112,53248,47600, 962 | 6720,-8368,45936,63456,9312,24816,18272,35616,12368,-16784,29968,0,5824,28384,30128,63872,4080,19936,36896,64608, 963 | 8208,6000,46576,45008,5824,-1232,81280,64608,5824,-1232,78560,64608,4160,-1232,81280,64608,6080,-1232,39952,63456, 964 | 688,0,58816,80208,688,0,58816,80208,688,0,58816,80304,688,0,58816,79664,688,0,58816,78976, 965 | 688,0,58816,80800,336,0,79216,63456,4880,-16784,56064,64608,8544,0,49424,80208,8544,0,49424,80208, 966 | 8544,0,49424,80304,8544,0,49424,78976,2688,0,18960,80208,7056,0,23248,80208,96,0,26016,80304, 967 | 432,0,25680,78976,432,0,62304,63456,8544,0,56560,79664,4880,-1232,63616,80208,4880,-1232,63616,80208, 968 | 4880,-1232,63616,80304,4880,-1232,63616,79664,4880,-1232,63616,78976,11936,2672,61024,51888,4336,-2976,64128,66256, 969 | 7568,-1232,56144,80208,7568,-1232,56144,80208,7568,-1232,56144,80304,7568,-1232,56144,78976,-176,0,53344,80208, 970 | 8544,0,49520,63456,7904,-1232,50832,66128,5232,-1232,45440,69616,5232,-1232,45440,69616,5232,-1232,45440,69616, 971 | 5232,-1232,45440,67616,5232,-1232,45440,65968,5232,-1232,45440,76416,5232,-1232,80880,48752,4800,-16784,42464,48752, 972 | 4800,-1232,48912,69616,4800,-1232,48912,69616,4800,-1232,48912,69616,4800,-1232,48912,65968,-1984,0,18368,69616, 973 | 6544,0,26912,69616,-1008,0,26096,69616,-80,0,25168,65968,4800,-1232,48496,66128,7904,0,47776,67616, 974 | 4800,-1232,48496,69616,4800,-1232,48496,69616,4800,-1232,48496,69616,4800,-1232,48496,67616,4800,-1232,48496,65968, 975 | 9216,6368,63712,48240,3056,-4000,50144,51504,7392,-1232,47264,69616,7392,-1232,47264,69616,7392,-1232,47264,69616, 976 | 7392,-1232,47264,65968,2592,-18112,48912,69616,7904,-18112,50496,66128,2592,-18112,48912,65968 977 | ], 978 | 979 | "glyphCount" : 224, 980 | "characterMap" : [ 981 | -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 982 | -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7, 983 | 8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, 984 | 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, 985 | 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67, 986 | 68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87, 987 | 88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107, 988 | 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, 989 | 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147, 990 | 148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167, 991 | 168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187, 992 | 188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, 993 | 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223 994 | ] 995 | } 996 | -------------------------------------------------------------------------------- /examples/hello.js: -------------------------------------------------------------------------------- 1 | // 2 | // Based on https://github.com/ajstarks/openvg hellovg.c/go 3 | // 4 | 5 | 'use strict'; 6 | 7 | const openVG = require('../index'); 8 | 9 | const util = require('./modules/util'); 10 | const text = require('./modules/text'); 11 | 12 | util.init(); 13 | 14 | const width = openVG.screen.width; 15 | const height = openVG.screen.height; 16 | 17 | util.start(); // Start the picture 18 | util.background(0, 0, 0); // Black background 19 | util.fill(44, 77, 232, 1); // Big blue marble 20 | util.circle(width / 2, 0, width); // The "world" 21 | util.fill(255, 255, 255, 1); // White text 22 | 23 | const message = 'hello, world'; 24 | 25 | text.textMiddle( 26 | width / 2, 27 | height / 2, 28 | message, 29 | util.fonts.serifTypeface, 30 | width / 10 31 | ); // Greetings 32 | 33 | util.end(); // End the picture 34 | 35 | process.on('exit', () => { 36 | util.finish(); 37 | console.log('Making a clean exit.'); 38 | }); 39 | 40 | console.log('Press return to exit.'); 41 | process.stdin.resume(); 42 | process.stdin.setEncoding('utf8'); 43 | 44 | process.stdin.once('data', () => process.stdin.pause()); 45 | -------------------------------------------------------------------------------- /examples/hwinfo.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const openVG = require('../index'); 4 | 5 | openVG.init(); 6 | 7 | console.log('Screen dimensions:'); 8 | console.log(' ' + openVG.screen.width + ' x ' + openVG.screen.height); 9 | console.log(''); 10 | 11 | const { 12 | VG_IMAGE_FORMAT_QUERY, 13 | VG_PATH_DATATYPE_QUERY, 14 | } = openVG.VGHardwareQueryType; 15 | const { 16 | VG_HARDWARE_ACCELERATED, 17 | VG_HARDWARE_UNACCELERATED, 18 | } = openVG.VGHardwareQueryResult; 19 | 20 | console.log('Hardware Image Formats:'); 21 | Object.keys(openVG.VGImageFormat).map(fmt => { 22 | const result = openVG.hardwareQuery( 23 | VG_IMAGE_FORMAT_QUERY, 24 | openVG.VGImageFormat[fmt] 25 | ); 26 | 27 | console.log( 28 | ' ' + 29 | fmt + 30 | ': ' + 31 | (result === VG_HARDWARE_ACCELERATED 32 | ? 'VG_HARDWARE_ACCELERATED' 33 | : result === VG_HARDWARE_UNACCELERATED 34 | ? 'VG_HARDWARE_UNACCELERATED' 35 | : result === 0 ? '-' : '- (0x' + result.toString(16) + ')') 36 | ); 37 | }); 38 | 39 | console.log(''); 40 | 41 | console.log('Hardware Path Data Types:'); 42 | Object.keys(openVG.VGPathDatatype).map(type => { 43 | const result = openVG.hardwareQuery( 44 | VG_PATH_DATATYPE_QUERY, 45 | openVG.VGPathDatatype[type] 46 | ); 47 | 48 | console.log( 49 | ' ' + 50 | type + 51 | ': ' + 52 | (result === VG_HARDWARE_ACCELERATED 53 | ? 'VG_HARDWARE_ACCELERATED' 54 | : result === VG_HARDWARE_UNACCELERATED 55 | ? 'VG_HARDWARE_UNACCELERATED' 56 | : result === 0 ? '-' : '- (0x' + result.toString(16) + ')') 57 | ); 58 | }); 59 | 60 | console.log(''); 61 | 62 | console.log('Renderer and Extension Information:'); 63 | Object.keys(openVG.VGStringID).map(string => { 64 | console.log( 65 | ' [' + string + ']: ' + openVG.getString(openVG.VGStringID[string]) 66 | ); 67 | }); 68 | 69 | console.log(''); 70 | console.log('Params:'); 71 | 72 | console.log( 73 | ' Max Scissor Rects ........: ' + 74 | openVG.getI(openVG.VGParamType.VG_MAX_SCISSOR_RECTS) 75 | ); 76 | console.log( 77 | ' Max Dash Count ...........: ' + 78 | openVG.getI(openVG.VGParamType.VG_MAX_DASH_COUNT) 79 | ); 80 | console.log( 81 | ' Max Kernel Size ..........: ' + 82 | openVG.getI(openVG.VGParamType.VG_MAX_KERNEL_SIZE) 83 | ); 84 | console.log( 85 | ' Max Separable Kernel Size : ' + 86 | openVG.getI(openVG.VGParamType.VG_MAX_SEPARABLE_KERNEL_SIZE) 87 | ); 88 | console.log( 89 | ' Max Image Width ..........: ' + 90 | openVG.getI(openVG.VGParamType.VG_MAX_IMAGE_WIDTH) 91 | ); 92 | console.log( 93 | ' Max Image Height .........: ' + 94 | openVG.getI(openVG.VGParamType.VG_MAX_IMAGE_HEIGHT) 95 | ); 96 | console.log( 97 | ' Max Image Pixels .........: ' + 98 | openVG.getI(openVG.VGParamType.VG_MAX_IMAGE_PIXELS) 99 | ); 100 | console.log( 101 | ' Max Image Bytes ..........: ' + 102 | openVG.getI(openVG.VGParamType.VG_MAX_IMAGE_BYTES) 103 | ); 104 | console.log( 105 | ' Max Float ................: ' + 106 | openVG.getI(openVG.VGParamType.VG_MAX_FLOAT) 107 | ); 108 | console.log( 109 | ' Max Gaussian Std Deviation: ' + 110 | openVG.getI(openVG.VGParamType.VG_MAX_GAUSSIAN_STD_DEVIATION) 111 | ); 112 | openVG.finish(); 113 | -------------------------------------------------------------------------------- /examples/modules/text.js: -------------------------------------------------------------------------------- 1 | // Text functions shared by examples 2 | // 3 | // Based on https://github.com/ajstarks/openvg libshapes.c/go 4 | // 5 | 6 | 'use strict'; 7 | 8 | const fs = require('fs'); 9 | 10 | const openVG = require('../../index'); 11 | 12 | // textwidth returns the width of a text string at the specified font and size. 13 | function textWidth(s, f, size) { 14 | let tw = 0.0; 15 | for (let i = 0; i < s.length; i++) { 16 | const character = s.charCodeAt(i); 17 | const glyph = f.characterMap[character]; 18 | if (glyph == -1) { 19 | continue; //glyph is undefined 20 | } 21 | 22 | tw += size * f.glyphAdvances[glyph] / 65536.0; 23 | } 24 | 25 | return tw; 26 | } 27 | 28 | // Text renders a string of text at a specified location, size, using the 29 | // specified font glyphs derived from 30 | // http://web.archive.org/web/20070808195131/http://developer.hybrid.fi/font2openvg/renderFont.cpp.txt 31 | function drawText(x, y, s, f, pointsize) { 32 | const size = pointsize; 33 | const baseMatrix = new Float32Array(9); 34 | let xx = x; 35 | 36 | openVG.getMatrix(baseMatrix); 37 | 38 | for (let i = 0; i < s.length; i++) { 39 | const character = s.charCodeAt(i); 40 | const glyph = f.characterMap[character]; 41 | if (glyph == -1) { 42 | continue; //glyph is undefined 43 | } 44 | 45 | // prettier-ignore 46 | const glyphTransform = new Float32Array([ 47 | size, 0.0, 0.0, 48 | 0.0, size, 0.0, 49 | xx, y, 1.0, 50 | ]); 51 | openVG.loadMatrix(baseMatrix); 52 | openVG.multMatrix(glyphTransform); 53 | openVG.drawPath( 54 | f.glyphs[glyph], 55 | openVG.VGPaintMode.VG_FILL_PATH | openVG.VGPaintMode.VG_STROKE_PATH 56 | ); 57 | xx += size * f.glyphAdvances[glyph] / 65536.0; 58 | } 59 | 60 | openVG.loadMatrix(baseMatrix); 61 | } 62 | 63 | function textMiddle(x, y, s, f, pointsize) { 64 | const tw = textWidth(s, f, pointsize); 65 | drawText(x - tw / 2.0, y, s, f, pointsize); 66 | } 67 | 68 | const MAXFONTPATH = 256; 69 | 70 | function loadFont(name) { 71 | const jsonf = JSON.parse(fs.readFileSync(name)); 72 | 73 | const f = { 74 | glyphs: new Uint32Array(MAXFONTPATH), 75 | characterMap: jsonf.characterMap, 76 | glyphAdvances: jsonf.glyphAdvances, 77 | count: jsonf.glyphCount, 78 | }; 79 | 80 | const glyphPoints = new Int32Array(jsonf.glyphPoints); 81 | const glyphInstructions = new Uint8Array(jsonf.glyphInstructions); 82 | 83 | if (jsonf.glyphCount > MAXFONTPATH) { 84 | return {err: 'Font is too big'}; 85 | } 86 | 87 | for (let i = 0; i < jsonf.glyphCount; i++) { 88 | const instructions = glyphInstructions.subarray( 89 | jsonf.glyphInstructionIndices[i] 90 | ); 91 | const instructionCounts = jsonf.glyphInstructionCounts[i]; 92 | 93 | const path = openVG.createPath( 94 | openVG.VG_PATH_FORMAT_STANDARD, 95 | openVG.VGPathDatatype.VG_PATH_DATATYPE_S_32, 96 | 1.0 / 65536.0, // scale 97 | 0.0, // bias 98 | 0, // segmentCapacityHint 99 | 0, // coordCapacityHint 100 | openVG.VGPathCapabilities.VG_PATH_CAPABILITY_ALL 101 | ); 102 | 103 | f.glyphs[i] = path; 104 | if (instructionCounts) { 105 | const offset = 2 * jsonf.glyphPointIndices[i]; 106 | const points = glyphPoints.subarray(offset); 107 | 108 | openVG.appendPathData(path, instructionCounts, instructions, points); 109 | } 110 | } 111 | 112 | return f; 113 | } 114 | 115 | // unloadfont frees font path data 116 | function unloadFont(f) { 117 | for (let i = 0; i < f.glyphs.length; i++) { 118 | openVG.destroyPath(f.glyphs[i]); 119 | } 120 | } 121 | 122 | module.exports = { 123 | textWidth, 124 | drawText, 125 | textMiddle, 126 | loadFont, 127 | unloadFont, 128 | }; 129 | -------------------------------------------------------------------------------- /examples/modules/util.js: -------------------------------------------------------------------------------- 1 | // Utility functions shared by examples 2 | // 3 | // Based on https://github.com/ajstarks/openvg libshapes.c/go 4 | // 5 | 6 | 'use strict'; 7 | 8 | const openVG = require('../../index'); 9 | const text = require('./text'); 10 | 11 | const { 12 | VG_CLEAR_COLOR, 13 | VG_STROKE_CAP_STYLE, 14 | VG_STROKE_JOIN_STYLE, 15 | } = openVG.VGParamType; 16 | 17 | const {VG_PAINT_COLOR, VG_PAINT_TYPE} = openVG.VGPaintParamType; 18 | 19 | const {VG_PAINT_TYPE_COLOR} = openVG.VGPaintType; 20 | 21 | const {VG_CAP_BUTT} = openVG.VGCapStyle; 22 | 23 | const {VG_JOIN_MITER} = openVG.VGJoinStyle; 24 | 25 | const {VG_FILL_PATH, VG_STROKE_PATH} = openVG.VGPaintMode; 26 | 27 | const VG_FILL_AND_STROKE_PATH = VG_FILL_PATH | VG_STROKE_PATH; 28 | 29 | const fonts = { 30 | sansTypeface: undefined, 31 | serifTypeface: undefined, 32 | sansMonoTypeface: undefined, 33 | }; 34 | 35 | function start() { 36 | const color = new Float32Array([255, 255, 255, 1]); 37 | openVG.setFVOL(VG_CLEAR_COLOR, color, 0, 4); 38 | openVG.clear(0, 0, openVG.screen.width, openVG.screen.height); 39 | (color[0] = 0), (color[1] = 0), (color[2] = 0); 40 | setFill(color); 41 | setStroke(color); 42 | strokeWidth(0); 43 | openVG.loadIdentity(); 44 | } 45 | 46 | function end() { 47 | openVG.egl.swapBuffers(openVG.screen.display, openVG.screen.surface); 48 | } 49 | 50 | function init(options) { 51 | if (options === undefined) { 52 | options = {}; 53 | } 54 | 55 | if (options.loadFonts === undefined) { 56 | options.loadFonts = true; 57 | } 58 | 59 | openVG.init(); 60 | 61 | if (options.loadFonts) { 62 | fonts.sansTypeface = text.loadFont('examples/fonts/sans.json'); 63 | fonts.serifTypeface = text.loadFont('examples/fonts/serif.json'); 64 | fonts.sansMonoTypeface = text.loadFont('examples/fonts/sans-mono.json'); 65 | } 66 | } 67 | 68 | function deinit() { 69 | if (fonts.sansTypeface) { 70 | text.unloadFont(fonts.sansTypeface); 71 | } 72 | 73 | if (fonts.serifTypeface) { 74 | text.unloadFont(fonts.serifTypeface); 75 | } 76 | 77 | if (fonts.sansMonoypeface) { 78 | text.unloadFont(fonts.sansMonoTypeface); 79 | } 80 | 81 | openVG.deinit(); 82 | } 83 | 84 | function capRGB(rgb) { 85 | return (rgb > 255 ? 255 : rgb < 0 ? 0 : rgb) / 255.0; 86 | } 87 | 88 | function capAlpha(a) { 89 | return a < 0.0 || a > 1.0 ? 1.0 : a; 90 | } 91 | 92 | // RGBA fills a color vectors from a RGBA quad. 93 | function RGBA(r, g, b, a, color) { 94 | r = capRGB(r); 95 | g = capRGB(g); 96 | b = capRGB(b); 97 | a = capAlpha(a); 98 | 99 | color[0] = r; 100 | color[1] = g; 101 | color[2] = b; 102 | color[3] = a; 103 | } 104 | 105 | function setFill(color) { 106 | const fillPaint = openVG.createPaint(); 107 | openVG.setParameterI(fillPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); 108 | openVG.setParameterFV(fillPaint, VG_PAINT_COLOR, color); 109 | openVG.setPaint(fillPaint, VG_FILL_PATH); 110 | openVG.destroyPaint(fillPaint); 111 | } 112 | 113 | function setStroke(color) { 114 | const strokePaint = openVG.createPaint(); 115 | openVG.setParameterI(strokePaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR); 116 | openVG.setParameterFV(strokePaint, VG_PAINT_COLOR, color); 117 | openVG.setPaint(strokePaint, VG_STROKE_PATH); 118 | openVG.destroyPaint(strokePaint); 119 | } 120 | 121 | function strokeWidth(width) { 122 | openVG.setF(openVG.VGParamType.VG_STROKE_LINE_WIDTH, width); 123 | openVG.setI(VG_STROKE_CAP_STYLE, VG_CAP_BUTT); 124 | openVG.setI(VG_STROKE_JOIN_STYLE, VG_JOIN_MITER); 125 | } 126 | 127 | function newPath() { 128 | return openVG.createPath( 129 | openVG.VG_PATH_FORMAT_STANDARD, 130 | openVG.VGPathDatatype.VG_PATH_DATATYPE_F, 131 | 1.0, 132 | 0.0, 133 | 0, 134 | 0, 135 | openVG.VGPathCapabilities.VG_PATH_CAPABILITY_ALL 136 | ); 137 | } 138 | 139 | // Line makes a line at connecting the specified locations 140 | function line(x0, y0, x1, y1) { 141 | const path = newPath(); 142 | openVG.vgu.line(path, x0, y0, x1, y1); 143 | openVG.drawPath(path, VG_FILL_AND_STROKE_PATH); 144 | openVG.destroyPath(path); 145 | } 146 | 147 | // Rect makes a rectangle at the specified location and dimensions 148 | function rect(x, y, w, h) { 149 | const path = newPath(); 150 | openVG.vgu.rect(path, x, y, w, h); 151 | openVG.drawPath(path, VG_FILL_AND_STROKE_PATH); 152 | openVG.destroyPath(path); 153 | } 154 | 155 | // Ellipse makes an ellipse at the specified location and dimensions 156 | function ellipse(x, y, w, h) { 157 | const path = newPath(); 158 | openVG.vgu.ellipse(path, x, y, w, h); 159 | openVG.drawPath(path, VG_FILL_AND_STROKE_PATH); 160 | openVG.destroyPath(path); 161 | } 162 | 163 | function circle(x, y, r) { 164 | ellipse(x, y, r, r); 165 | } 166 | 167 | function background(r, g, b) { 168 | fill(r, g, b, 1.0); 169 | rect(0, 0, openVG.screen.width, openVG.screen.height); 170 | } 171 | 172 | function fill(r, g, b, a) { 173 | const color = new Float32Array(4); 174 | RGBA(r, g, b, a, color); 175 | setFill(color); 176 | } 177 | 178 | function stroke(r, g, b, a) { 179 | const color = new Float32Array(4); 180 | RGBA(r, g, b, a, color); 181 | setStroke(color); 182 | } 183 | 184 | function checkVGError(msg) { 185 | const err = openVG.getError(); 186 | if (err !== 0) { 187 | console.log('vgError: ' + msg + ' : ' + openVG.VGErrorCodeReverse[err]); 188 | } 189 | } 190 | 191 | module.exports = { 192 | fonts, 193 | start, 194 | end, 195 | init, 196 | deinit, 197 | RGBA, 198 | setFill, 199 | setStroke, 200 | strokeWidth, 201 | line, 202 | rect, 203 | ellipse, 204 | circle, 205 | background, 206 | fill, 207 | stroke, 208 | checkVGError, 209 | }; 210 | -------------------------------------------------------------------------------- /examples/panic.js: -------------------------------------------------------------------------------- 1 | // 2 | // A fake panic dashboard 3 | // http://www.panic.com/blog/2010/03/the-panic-status-board/ 4 | // 5 | 6 | 'use strict'; 7 | 8 | const openVG = require('../index'); 9 | 10 | const util = require('./modules/util'); 11 | const text = require('./modules/text'); 12 | 13 | function terminate() { 14 | util.finish(); 15 | console.log('Making a clean exit.'); 16 | } 17 | 18 | util.init(); 19 | 20 | const {width, height} = openVG.screen; 21 | 22 | const MAIL_QUEUES_HEIGHT = 0.2; 23 | 24 | const dashboardData = { 25 | mails: [ 26 | { 27 | project: 'Transmit', 28 | messages: 18, 29 | days: 1, 30 | color: [238, 192, 70], 31 | }, 32 | { 33 | project: 'Coda', 34 | messages: 29, 35 | days: 3, 36 | color: [104, 192, 44], 37 | }, 38 | { 39 | project: 'Unison', 40 | messages: 48, 41 | days: 3, 42 | color: [232, 84, 63], 43 | }, 44 | { 45 | project: 'CandyBar', 46 | messages: 8, 47 | days: 2, 48 | color: [116, 88, 186], 49 | }, 50 | { 51 | project: 'General', 52 | messages: 3, 53 | days: 0, 54 | color: [77, 124, 241], 55 | }, 56 | ], 57 | }; 58 | 59 | function paintMailQueues() { 60 | const mailQueues = dashboardData.mails.length; 61 | const margin = 20; 62 | const barMargin = 8; 63 | const countHeight = 30; 64 | const countMargin = 4; 65 | 66 | const baseHeight = height * (1.0 - MAIL_QUEUES_HEIGHT); 67 | 68 | util.strokeWidth(0); 69 | 70 | let maxH = 0; 71 | for (let i = 0; i < mailQueues; i++) { 72 | const msgs = dashboardData.mails[i].messages; 73 | if (msgs > maxH) { 74 | maxH = msgs; 75 | } 76 | } 77 | 78 | const barWidth = (width - 2 * margin) / mailQueues; 79 | for (let i = 0; i < mailQueues; i++) { 80 | const offset = margin + (width - 2 * margin) * i / mailQueues; 81 | util.fill( 82 | dashboardData.mails[i].color[0], 83 | dashboardData.mails[i].color[1], 84 | dashboardData.mails[i].color[2], 85 | 1 86 | ); 87 | 88 | const barHeight = 89 | (height * MAIL_QUEUES_HEIGHT - countHeight) * 90 | dashboardData.mails[i].messages / 91 | maxH; 92 | util.rect( 93 | offset + barMargin, 94 | baseHeight, 95 | barWidth - barMargin * 2, 96 | barHeight 97 | ); 98 | 99 | util.fill(255, 255, 255, 1.0); 100 | text.textMiddle( 101 | offset + barMargin + (barWidth - barMargin * 2) / 2, 102 | baseHeight + barHeight + countMargin, 103 | dashboardData.mails[i].messages + ' / ' + dashboardData.mails[i].days, 104 | util.fonts.sansTypeface, 105 | countHeight - 2 * countMargin 106 | ); 107 | } 108 | 109 | util.stroke(255, 255, 255, 1.0); 110 | util.strokeWidth(2); 111 | util.line(margin, baseHeight, width - margin, baseHeight); 112 | util.strokeWidth(0); 113 | 114 | // console.log('line: ' + 115 | // width * margin + ', ' + baseHeight + ', ' + 116 | // width * (1.0-margin) + ', ' + baseHeight); 117 | } 118 | 119 | function paintDashboard() { 120 | variate(); 121 | 122 | util.background(0, 0, 0); 123 | 124 | paintMailQueues(); 125 | 126 | util.end(); 127 | } 128 | 129 | function requestPaint() { 130 | process.nextTick(paintDashboard); 131 | } 132 | 133 | function getRandomInt(min, max) { 134 | return Math.floor(Math.random() * (max - min + 1)) + min; 135 | } 136 | 137 | function minZero(value) { 138 | return value < 0 ? 0 : value; 139 | } 140 | 141 | function variate() { 142 | dashboardData.mails.forEach(mq => { 143 | mq.messages = minZero(mq.messages + getRandomInt(-5, 5)); 144 | mq.days = minZero(mq.days + getRandomInt(-2, 2)); 145 | }); 146 | } 147 | 148 | util.start(); 149 | 150 | const animTime = 1000 / 24; // 24 fps 151 | 152 | const paintInterval = setInterval(requestPaint, animTime); 153 | 154 | process.on('exit', terminate); 155 | 156 | console.log('Press return to exit.'); 157 | process.stdin.resume(); 158 | process.stdin.setEncoding('utf8'); 159 | 160 | process.stdin.once('data', () => { 161 | clearInterval(paintInterval); 162 | process.stdin.pause(); 163 | }); 164 | -------------------------------------------------------------------------------- /examples/star.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const vg = require('../index'); 4 | const util = require('./modules/util'); 5 | 6 | util.init({loadFonts: false}); 7 | 8 | const {width, height} = vg.screen; 9 | 10 | const starPoints = 5; 11 | let outerRadius = 1; 12 | let innerRadius = 13 | Math.sin(Math.PI / 2 - 2 * Math.PI / starPoints) / 14 | Math.sin(Math.PI / 2 - 2 * Math.PI / starPoints / 2); 15 | 16 | const segments = new Uint8Array(4 * 1024); 17 | const data = new Float32Array(4 * 1024); 18 | let segmentsPos = 0; 19 | let dataPos = 0; 20 | 21 | function moveTo(x, y) { 22 | segments[segmentsPos++] = vg.VGPathCommand.VG_MOVE_TO_ABS; 23 | data[dataPos++] = x; 24 | data[dataPos++] = y; 25 | } 26 | 27 | function lineTo(x, y) { 28 | segments[segmentsPos++] = vg.VGPathCommand.VG_LINE_TO_ABS; 29 | data[dataPos++] = x; 30 | data[dataPos++] = y; 31 | } 32 | 33 | function init() { 34 | util.fill(255, 0, 0, 1); 35 | util.stroke(255, 255, 255, 1.0); 36 | util.strokeWidth(2); 37 | 38 | return vg.createPath( 39 | vg.VG_PATH_FORMAT_STANDARD, 40 | vg.VGPathDatatype.VG_PATH_DATATYPE_F, 41 | 1.0 /* scale */, 42 | 0.0 /* bias */, 43 | 0 /* segCapacityHint */, 44 | 0 /* coordCapacityHint */, 45 | vg.VGPathCapabilities.VG_PATH_CAPABILITY_ALL 46 | ); 47 | } 48 | 49 | function paint(path) { 50 | util.background(0, 0, 0); 51 | 52 | vg.clearPath(path, vg.VGPathCapabilities.VG_PATH_CAPABILITY_ALL); 53 | 54 | segmentsPos = 0; 55 | dataPos = 0; 56 | 57 | const baseAngle = Math.PI / 2 + Date.now() / 1000 / 2 / (Math.PI / 2); 58 | const angle = 0 * Math.PI * 2 / starPoints / 2 + baseAngle; 59 | 60 | moveTo( 61 | width / 2 + outerRadius * Math.cos(angle), 62 | height / 2 + outerRadius * Math.sin(angle) 63 | ); 64 | 65 | for (let i = 1; i < starPoints * 2; i++) { 66 | let angle = i * Math.PI * 2 / starPoints / 2 + baseAngle; 67 | lineTo( 68 | width / 2 + innerRadius * Math.cos(angle), 69 | height / 2 + innerRadius * Math.sin(angle) 70 | ); 71 | i++; 72 | angle = i * Math.PI * 2 / starPoints / 2 + baseAngle; 73 | lineTo( 74 | width / 2 + outerRadius * Math.cos(angle), 75 | height / 2 + outerRadius * Math.sin(angle) 76 | ); 77 | } 78 | 79 | vg.appendPathData(path, segmentsPos, segments, data); 80 | 81 | util.fill(255, 0, 0, 1); 82 | vg.drawPath( 83 | path, 84 | vg.VGPaintMode.VG_FILL_PATH | vg.VGPaintMode.VG_STROKE_PATH 85 | ); 86 | 87 | util.end(); 88 | } 89 | 90 | function terminate() { 91 | util.finish(); 92 | console.log('Making a clean exit.'); 93 | } 94 | 95 | outerRadius *= 2 * height / 6; 96 | innerRadius *= 2 * height / 6; 97 | 98 | util.start(); 99 | 100 | const animTime = 1000 / 120; 101 | 102 | const path = init(); 103 | const paintInterval = setInterval(() => paint(path), animTime); 104 | 105 | process.on('exit', terminate); 106 | 107 | console.log('Press return to exit.'); 108 | process.stdin.resume(); 109 | process.stdin.setEncoding('utf8'); 110 | 111 | process.stdin.once('data', () => { 112 | clearInterval(paintInterval); 113 | process.stdin.pause(); 114 | }); 115 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const openVG = require('./build/Release/openvg.node'); 4 | 5 | const screen = { 6 | width: null, 7 | height: null, 8 | }; 9 | 10 | function reverseMap(map) { 11 | const result = {}; 12 | Object.keys(map).forEach(key => (result[map[key]] = key)); 13 | return result; 14 | } 15 | 16 | const VGErrorCode = { 17 | VG_NO_ERROR: 0x0000, 18 | VG_BAD_HANDLE_ERROR: 0x1000, 19 | VG_ILLEGAL_ARGUMENT_ERROR: 0x1001, 20 | VG_OUT_OF_MEMORY_ERROR: 0x1002, 21 | VG_PATH_CAPABILITY_ERROR: 0x1003, 22 | VG_UNSUPPORTED_IMAGE_FORMAT_ERROR: 0x1004, 23 | VG_UNSUPPORTED_PATH_FORMAT_ERROR: 0x1005, 24 | VG_IMAGE_IN_USE_ERROR: 0x1006, 25 | VG_NO_CONTEXT_ERROR: 0x1007, 26 | }; 27 | 28 | const VGErrorCodeReverse = reverseMap(VGErrorCode); 29 | 30 | const VGParamType = { 31 | /* Mode settings */ 32 | VG_MATRIX_MODE: 0x1100, 33 | VG_FILL_RULE: 0x1101, 34 | VG_IMAGE_QUALITY: 0x1102, 35 | VG_RENDERING_QUALITY: 0x1103, 36 | VG_BLEND_MODE: 0x1104, 37 | VG_IMAGE_MODE: 0x1105, 38 | 39 | /* Scissoring rectangles */ 40 | VG_SCISSOR_RECTS: 0x1106, 41 | 42 | /* Color Transformation */ 43 | VG_COLOR_TRANSFORM: 0x1170, 44 | VG_COLOR_TRANSFORM_VALUES: 0x1171, 45 | 46 | /* Stroke parameters */ 47 | VG_STROKE_LINE_WIDTH: 0x1110, 48 | VG_STROKE_CAP_STYLE: 0x1111, 49 | VG_STROKE_JOIN_STYLE: 0x1112, 50 | VG_STROKE_MITER_LIMIT: 0x1113, 51 | VG_STROKE_DASH_PATTERN: 0x1114, 52 | VG_STROKE_DASH_PHASE: 0x1115, 53 | VG_STROKE_DASH_PHASE_RESET: 0x1116, 54 | 55 | /* Edge fill color for VG_TILE_FILL tiling mode */ 56 | VG_TILE_FILL_COLOR: 0x1120, 57 | 58 | /* Color for vgClear */ 59 | VG_CLEAR_COLOR: 0x1121, 60 | 61 | /* Glyph origin */ 62 | VG_GLYPH_ORIGIN: 0x1122, 63 | 64 | /* Enable/disable alpha masking and scissoring */ 65 | VG_MASKING: 0x1130, 66 | VG_SCISSORING: 0x1131, 67 | 68 | /* Pixel layout information */ 69 | VG_PIXEL_LAYOUT: 0x1140, 70 | VG_SCREEN_LAYOUT: 0x1141, 71 | 72 | /* Source format selection for image filters */ 73 | VG_FILTER_FORMAT_LINEAR: 0x1150, 74 | VG_FILTER_FORMAT_PREMULTIPLIED: 0x1151, 75 | 76 | /* Destination write enable mask for image filters */ 77 | VG_FILTER_CHANNEL_MASK: 0x1152, 78 | 79 | /* Implementation limits (read-only) */ 80 | VG_MAX_SCISSOR_RECTS: 0x1160, 81 | VG_MAX_DASH_COUNT: 0x1161, 82 | VG_MAX_KERNEL_SIZE: 0x1162, 83 | VG_MAX_SEPARABLE_KERNEL_SIZE: 0x1163, 84 | VG_MAX_COLOR_RAMP_STOPS: 0x1164, 85 | VG_MAX_IMAGE_WIDTH: 0x1165, 86 | VG_MAX_IMAGE_HEIGHT: 0x1166, 87 | VG_MAX_IMAGE_PIXELS: 0x1167, 88 | VG_MAX_IMAGE_BYTES: 0x1168, 89 | VG_MAX_FLOAT: 0x1169, 90 | VG_MAX_GAUSSIAN_STD_DEVIATION: 0x116a, 91 | }; 92 | 93 | const VGParamTypeReverse = reverseMap(VGParamType); 94 | 95 | const VGRenderingQuality = { 96 | VG_RENDERING_QUALITY_NONANTIALIASED: 0x1200, 97 | VG_RENDERING_QUALITY_FASTER: 0x1201, 98 | VG_RENDERING_QUALITY_BETTER: 0x1202 /* Default */, 99 | }; 100 | 101 | const VGRenderingQualityReverse = reverseMap(VGRenderingQuality); 102 | 103 | const VGPixelLayout = { 104 | VG_PIXEL_LAYOUT_UNKNOWN: 0x1300, 105 | VG_PIXEL_LAYOUT_RGB_VERTICAL: 0x1301, 106 | VG_PIXEL_LAYOUT_BGR_VERTICAL: 0x1302, 107 | VG_PIXEL_LAYOUT_RGB_HORIZONTAL: 0x1303, 108 | VG_PIXEL_LAYOUT_BGR_HORIZONTAL: 0x1304, 109 | }; 110 | 111 | const VGPixelLayoutReverse = reverseMap(VGPixelLayout); 112 | 113 | const VGMatrixMode = { 114 | VG_MATRIX_PATH_USER_TO_SURFACE: 0x1400, 115 | VG_MATRIX_IMAGE_USER_TO_SURFACE: 0x1401, 116 | VG_MATRIX_FILL_PAINT_TO_USER: 0x1402, 117 | VG_MATRIX_STROKE_PAINT_TO_USER: 0x1403, 118 | VG_MATRIX_GLYPH_USER_TO_SURFACE: 0x1404, 119 | }; 120 | 121 | const VGMatrixModeReverse = reverseMap(VGMatrixMode); 122 | 123 | const VGMaskOperation = { 124 | VG_CLEAR_MASK: 0x1500, 125 | VG_FILL_MASK: 0x1501, 126 | VG_SET_MASK: 0x1502, 127 | VG_UNION_MASK: 0x1503, 128 | VG_INTERSECT_MASK: 0x1504, 129 | VG_SUBTRACT_MASK: 0x1505, 130 | }; 131 | 132 | const VGMaskOperationReverse = reverseMap(VGMaskOperation); 133 | 134 | const VG_PATH_FORMAT_STANDARD = 0; 135 | 136 | const VGPathDatatype = { 137 | VG_PATH_DATATYPE_S_8: 0, 138 | VG_PATH_DATATYPE_S_16: 1, 139 | VG_PATH_DATATYPE_S_32: 2, 140 | VG_PATH_DATATYPE_F: 3, 141 | }; 142 | 143 | const VGPathDatatypeReverse = reverseMap(VGPathDatatype); 144 | 145 | const VGPathAbsRel = { 146 | VG_ABSOLUTE: 0, 147 | VG_RELATIVE: 1, 148 | }; 149 | 150 | const VGPathAbsRelReverse = reverseMap(VGPathAbsRel); 151 | 152 | const VGPathSegment = { 153 | VG_CLOSE_PATH: 0 << 1, 154 | VG_MOVE_TO: 1 << 1, 155 | VG_LINE_TO: 2 << 1, 156 | VG_HLINE_TO: 3 << 1, 157 | VG_VLINE_TO: 4 << 1, 158 | VG_QUAD_TO: 5 << 1, 159 | VG_CUBIC_TO: 6 << 1, 160 | VG_SQUAD_TO: 7 << 1, 161 | VG_SCUBIC_TO: 8 << 1, 162 | VG_SCCWARC_TO: 9 << 1, 163 | VG_SCWARC_TO: 10 << 1, 164 | VG_LCCWARC_TO: 11 << 1, 165 | VG_LCWARC_TO: 12 << 1, 166 | }; 167 | 168 | const VGPathSegmentReverse = reverseMap(VGPathSegment); 169 | 170 | const VGPathCommand = { 171 | VG_MOVE_TO_ABS: VGPathSegment.VG_MOVE_TO | VGPathAbsRel.VG_ABSOLUTE, 172 | VG_MOVE_TO_REL: VGPathSegment.VG_MOVE_TO | VGPathAbsRel.VG_RELATIVE, 173 | VG_LINE_TO_ABS: VGPathSegment.VG_LINE_TO | VGPathAbsRel.VG_ABSOLUTE, 174 | VG_LINE_TO_REL: VGPathSegment.VG_LINE_TO | VGPathAbsRel.VG_RELATIVE, 175 | VG_HLINE_TO_ABS: VGPathSegment.VG_HLINE_TO | VGPathAbsRel.VG_ABSOLUTE, 176 | VG_HLINE_TO_REL: VGPathSegment.VG_HLINE_TO | VGPathAbsRel.VG_RELATIVE, 177 | VG_VLINE_TO_ABS: VGPathSegment.VG_VLINE_TO | VGPathAbsRel.VG_ABSOLUTE, 178 | VG_VLINE_TO_REL: VGPathSegment.VG_VLINE_TO | VGPathAbsRel.VG_RELATIVE, 179 | VG_QUAD_TO_ABS: VGPathSegment.VG_QUAD_TO | VGPathAbsRel.VG_ABSOLUTE, 180 | VG_QUAD_TO_REL: VGPathSegment.VG_QUAD_TO | VGPathAbsRel.VG_RELATIVE, 181 | VG_CUBIC_TO_ABS: VGPathSegment.VG_CUBIC_TO | VGPathAbsRel.VG_ABSOLUTE, 182 | VG_CUBIC_TO_REL: VGPathSegment.VG_CUBIC_TO | VGPathAbsRel.VG_RELATIVE, 183 | VG_SQUAD_TO_ABS: VGPathSegment.VG_SQUAD_TO | VGPathAbsRel.VG_ABSOLUTE, 184 | VG_SQUAD_TO_REL: VGPathSegment.VG_SQUAD_TO | VGPathAbsRel.VG_RELATIVE, 185 | VG_SCUBIC_TO_ABS: VGPathSegment.VG_SCUBIC_TO | VGPathAbsRel.VG_ABSOLUTE, 186 | VG_SCUBIC_TO_REL: VGPathSegment.VG_SCUBIC_TO | VGPathAbsRel.VG_RELATIVE, 187 | VG_SCCWARC_TO_ABS: VGPathSegment.VG_SCCWARC_TO | VGPathAbsRel.VG_ABSOLUTE, 188 | VG_SCCWARC_TO_REL: VGPathSegment.VG_SCCWARC_TO | VGPathAbsRel.VG_RELATIVE, 189 | VG_SCWARC_TO_ABS: VGPathSegment.VG_SCWARC_TO | VGPathAbsRel.VG_ABSOLUTE, 190 | VG_SCWARC_TO_REL: VGPathSegment.VG_SCWARC_TO | VGPathAbsRel.VG_RELATIVE, 191 | VG_LCCWARC_TO_ABS: VGPathSegment.VG_LCCWARC_TO | VGPathAbsRel.VG_ABSOLUTE, 192 | VG_LCCWARC_TO_REL: VGPathSegment.VG_LCCWARC_TO | VGPathAbsRel.VG_RELATIVE, 193 | VG_LCWARC_TO_ABS: VGPathSegment.VG_LCWARC_TO | VGPathAbsRel.VG_ABSOLUTE, 194 | VG_LCWARC_TO_REL: VGPathSegment.VG_LCWARC_TO | VGPathAbsRel.VG_RELATIVE, 195 | }; 196 | 197 | const VGPathCommandReverse = reverseMap(VGPathCommand); 198 | 199 | const VGPathCapabilities = { 200 | VG_PATH_CAPABILITY_APPEND_FROM: 1 << 0, 201 | VG_PATH_CAPABILITY_APPEND_TO: 1 << 1, 202 | VG_PATH_CAPABILITY_MODIFY: 1 << 2, 203 | VG_PATH_CAPABILITY_TRANSFORM_FROM: 1 << 3, 204 | VG_PATH_CAPABILITY_TRANSFORM_TO: 1 << 4, 205 | VG_PATH_CAPABILITY_INTERPOLATE_FROM: 1 << 5, 206 | VG_PATH_CAPABILITY_INTERPOLATE_TO: 1 << 6, 207 | VG_PATH_CAPABILITY_PATH_LENGTH: 1 << 7, 208 | VG_PATH_CAPABILITY_POINT_ALONG_PATH: 1 << 8, 209 | VG_PATH_CAPABILITY_TANGENT_ALONG_PATH: 1 << 9, 210 | VG_PATH_CAPABILITY_PATH_BOUNDS: 1 << 10, 211 | VG_PATH_CAPABILITY_PATH_TRANSFORMED_BOUNDS: 1 << 11, 212 | VG_PATH_CAPABILITY_ALL: (1 << 12) - 1, 213 | }; 214 | 215 | const VGPathCapabilitiesReverse = reverseMap(VGPathCapabilities); 216 | 217 | const VGPathParamType = { 218 | VG_PATH_FORMAT: 0x1600, 219 | VG_PATH_DATATYPE: 0x1601, 220 | VG_PATH_SCALE: 0x1602, 221 | VG_PATH_BIAS: 0x1603, 222 | VG_PATH_NUM_SEGMENTS: 0x1604, 223 | VG_PATH_NUM_COORDS: 0x1605, 224 | }; 225 | 226 | const VGPathParamTypeReverse = reverseMap(VGPathParamType); 227 | 228 | const VGCapStyle = { 229 | VG_CAP_BUTT: 0x1700, 230 | VG_CAP_ROUND: 0x1701, 231 | VG_CAP_SQUARE: 0x1702, 232 | }; 233 | 234 | const VGCapStyleReverse = reverseMap(VGCapStyle); 235 | 236 | const VGJoinStyle = { 237 | VG_JOIN_MITER: 0x1800, 238 | VG_JOIN_ROUND: 0x1801, 239 | VG_JOIN_BEVEL: 0x1802, 240 | }; 241 | 242 | const VGJoinStyleReverse = reverseMap(VGJoinStyle); 243 | 244 | const VGFillRule = { 245 | VG_EVEN_ODD: 0x1900, 246 | VG_NON_ZERO: 0x1901, 247 | }; 248 | 249 | const VGFillRuleReverse = reverseMap(VGFillRule); 250 | 251 | const VGPaintMode = { 252 | VG_STROKE_PATH: 1 << 0, 253 | VG_FILL_PATH: 1 << 1, 254 | }; 255 | 256 | const VGPaintModeReverse = reverseMap(VGPaintMode); 257 | 258 | const VGPaintParamType = { 259 | /* Color paint parameters */ 260 | VG_PAINT_TYPE: 0x1a00, 261 | VG_PAINT_COLOR: 0x1a01, 262 | VG_PAINT_COLOR_RAMP_SPREAD_MODE: 0x1a02, 263 | VG_PAINT_COLOR_RAMP_PREMULTIPLIED: 0x1a07, 264 | VG_PAINT_COLOR_RAMP_STOPS: 0x1a03, 265 | 266 | /* Linear gradient paint parameters */ 267 | VG_PAINT_LINEAR_GRADIENT: 0x1a04, 268 | 269 | /* Radial gradient paint parameters */ 270 | VG_PAINT_RADIAL_GRADIENT: 0x1a05, 271 | 272 | /* Pattern paint parameters */ 273 | VG_PAINT_PATTERN_TILING_MODE: 0x1a06, 274 | }; 275 | 276 | const VGPaintParamTypeReverse = reverseMap(VGPaintParamType); 277 | 278 | const VGPaintType = { 279 | VG_PAINT_TYPE_COLOR: 0x1b00, 280 | VG_PAINT_TYPE_LINEAR_GRADIENT: 0x1b01, 281 | VG_PAINT_TYPE_RADIAL_GRADIENT: 0x1b02, 282 | VG_PAINT_TYPE_PATTERN: 0x1b03, 283 | }; 284 | 285 | const VGPaintTypeReverse = reverseMap(VGPaintType); 286 | 287 | const VGColorRampSpreadMode = { 288 | VG_COLOR_RAMP_SPREAD_PAD: 0x1c00, 289 | VG_COLOR_RAMP_SPREAD_REPEAT: 0x1c01, 290 | VG_COLOR_RAMP_SPREAD_REFLECT: 0x1c02, 291 | }; 292 | 293 | const VGColorRampSpreadModeReverse = reverseMap(VGColorRampSpreadMode); 294 | 295 | const VGTilingMode = { 296 | VG_TILE_FILL: 0x1d00, 297 | VG_TILE_PAD: 0x1d01, 298 | VG_TILE_REPEAT: 0x1d02, 299 | VG_TILE_REFLECT: 0x1d03, 300 | }; 301 | 302 | const VGTilingModeReverse = reverseMap(VGTilingMode); 303 | 304 | const VGImageFormat = { 305 | /* RGB{A,X} channel ordering */ 306 | VG_sRGBX_8888: 0, 307 | VG_sRGBA_8888: 1, 308 | VG_sRGBA_8888_PRE: 2, 309 | VG_sRGB_565: 3, 310 | VG_sRGBA_5551: 4, 311 | VG_sRGBA_4444: 5, 312 | VG_sL_8: 6, 313 | VG_lRGBX_8888: 7, 314 | VG_lRGBA_8888: 8, 315 | VG_lRGBA_8888_PRE: 9, 316 | VG_lL_8: 10, 317 | VG_A_8: 11, 318 | VG_BW_1: 12, 319 | VG_A_1: 13, 320 | VG_A_4: 14, 321 | 322 | /* {A,X}RGB channel ordering */ 323 | VG_sXRGB_8888: 0 | (1 << 6), 324 | VG_sARGB_8888: 1 | (1 << 6), 325 | VG_sARGB_8888_PRE: 2 | (1 << 6), 326 | VG_sARGB_1555: 4 | (1 << 6), 327 | VG_sARGB_4444: 5 | (1 << 6), 328 | VG_lXRGB_8888: 7 | (1 << 6), 329 | VG_lARGB_8888: 8 | (1 << 6), 330 | VG_lARGB_8888_PRE: 9 | (1 << 6), 331 | 332 | /* BGR{A,X} channel ordering */ 333 | VG_sBGRX_8888: 0 | (1 << 7), 334 | VG_sBGRA_8888: 1 | (1 << 7), 335 | VG_sBGRA_8888_PRE: 2 | (1 << 7), 336 | VG_sBGR_565: 3 | (1 << 7), 337 | VG_sBGRA_5551: 4 | (1 << 7), 338 | VG_sBGRA_4444: 5 | (1 << 7), 339 | VG_lBGRX_8888: 7 | (1 << 7), 340 | VG_lBGRA_8888: 8 | (1 << 7), 341 | VG_lBGRA_8888_PRE: 9 | (1 << 7), 342 | 343 | /* {A,X}BGR channel ordering */ 344 | VG_sXBGR_8888: 0 | (1 << 6) | (1 << 7), 345 | VG_sABGR_8888: 1 | (1 << 6) | (1 << 7), 346 | VG_sABGR_8888_PRE: 2 | (1 << 6) | (1 << 7), 347 | VG_sABGR_1555: 4 | (1 << 6) | (1 << 7), 348 | VG_sABGR_4444: 5 | (1 << 6) | (1 << 7), 349 | VG_lXBGR_8888: 7 | (1 << 6) | (1 << 7), 350 | VG_lABGR_8888: 8 | (1 << 6) | (1 << 7), 351 | VG_lABGR_8888_PRE: 9 | (1 << 6) | (1 << 7), 352 | }; 353 | 354 | const VGImageFormatReverse = reverseMap(VGImageFormat); 355 | 356 | const VGImageQuality = { 357 | VG_IMAGE_QUALITY_NONANTIALIASED: 1 << 0, 358 | VG_IMAGE_QUALITY_FASTER: 1 << 1, 359 | VG_IMAGE_QUALITY_BETTER: 1 << 2, 360 | }; 361 | 362 | const VGImageQualityReverse = reverseMap(VGImageQuality); 363 | 364 | const VGImageParamType = { 365 | VG_IMAGE_FORMAT: 0x1e00, 366 | VG_IMAGE_WIDTH: 0x1e01, 367 | VG_IMAGE_HEIGHT: 0x1e02, 368 | }; 369 | 370 | const VGImageParamTypeReverse = reverseMap(VGImageParamType); 371 | 372 | const VGImageMode = { 373 | VG_DRAW_IMAGE_NORMAL: 0x1f00, 374 | VG_DRAW_IMAGE_MULTIPLY: 0x1f01, 375 | VG_DRAW_IMAGE_STENCIL: 0x1f02, 376 | }; 377 | 378 | const VGImageModeReverse = reverseMap(VGImageMode); 379 | 380 | const VGImageChannel = { 381 | VG_RED: 1 << 3, 382 | VG_GREEN: 1 << 2, 383 | VG_BLUE: 1 << 1, 384 | VG_ALPHA: 1 << 0, 385 | }; 386 | 387 | const VGImageChannelReverse = reverseMap(VGImageChannel); 388 | 389 | const VGBlendMode = { 390 | VG_BLEND_SRC: 0x2000, 391 | VG_BLEND_SRC_OVER: 0x2001, 392 | VG_BLEND_DST_OVER: 0x2002, 393 | VG_BLEND_SRC_IN: 0x2003, 394 | VG_BLEND_DST_IN: 0x2004, 395 | VG_BLEND_MULTIPLY: 0x2005, 396 | VG_BLEND_SCREEN: 0x2006, 397 | VG_BLEND_DARKEN: 0x2007, 398 | VG_BLEND_LIGHTEN: 0x2008, 399 | VG_BLEND_ADDITIVE: 0x2009, 400 | }; 401 | 402 | const VGBlendModeReverse = reverseMap(VGBlendMode); 403 | 404 | const VGFontParamType = { 405 | VG_FONT_NUM_GLYPHS: 0x2f00, 406 | }; 407 | 408 | const VGFontParamTypeReverse = reverseMap(VGFontParamType); 409 | 410 | const VGHardwareQueryType = { 411 | VG_IMAGE_FORMAT_QUERY: 0x2100, 412 | VG_PATH_DATATYPE_QUERY: 0x2101, 413 | }; 414 | 415 | const VGHardwareQueryTypeReverse = reverseMap(VGHardwareQueryType); 416 | 417 | const VGHardwareQueryResult = { 418 | VG_HARDWARE_ACCELERATED: 0x2200, 419 | VG_HARDWARE_UNACCELERATED: 0x2201, 420 | }; 421 | 422 | const VGHardwareQueryResultReverse = reverseMap(VGHardwareQueryResult); 423 | 424 | const VGStringID = { 425 | VG_VENDOR: 0x2300, 426 | VG_RENDERER: 0x2301, 427 | VG_VERSION: 0x2302, 428 | VG_EXTENSIONS: 0x2303, 429 | }; 430 | 431 | const VGStringIDReverse = reverseMap(VGStringID); 432 | 433 | const VGUErrorCode = { 434 | VGU_NO_ERROR: 0, 435 | VGU_BAD_HANDLE_ERROR: 0xf000, 436 | VGU_ILLEGAL_ARGUMENT_ERROR: 0xf001, 437 | VGU_OUT_OF_MEMORY_ERROR: 0xf002, 438 | VGU_PATH_CAPABILITY_ERROR: 0xf003, 439 | VGU_BAD_WARP_ERROR: 0xf004, 440 | }; 441 | 442 | const VGUErrorCodeReverse = reverseMap(VGUErrorCode); 443 | 444 | const VGUArcType = { 445 | VGU_ARC_OPEN: 0xf100, 446 | VGU_ARC_CHORD: 0xf101, 447 | VGU_ARC_PIE: 0xf102, 448 | }; 449 | 450 | const VGUArcTypeReverse = reverseMap(VGUErrorCode); 451 | 452 | const VGParamTypeKHR = { 453 | VG_MAX_AVERAGE_BLUR_DIMENSION_KHR: 0x116b, 454 | VG_AVERAGE_BLUR_DIMENSION_RESOLUTION_KHR: 0x116c, 455 | VG_MAX_AVERAGE_BLUR_ITERATIONS_KHR: 0x116d, 456 | }; 457 | 458 | const VGParamTypeKHRReverse = reverseMap(VGParamTypeKHR); 459 | 460 | const VGBlendModeKHR = { 461 | VG_BLEND_OVERLAY_KHR: 0x2010, 462 | VG_BLEND_HARDLIGHT_KHR: 0x2011, 463 | VG_BLEND_SOFTLIGHT_SVG_KHR: 0x2012, 464 | VG_BLEND_SOFTLIGHT_KHR: 0x2013, 465 | VG_BLEND_COLORDODGE_KHR: 0x2014, 466 | VG_BLEND_COLORBURN_KHR: 0x2015, 467 | VG_BLEND_DIFFERENCE_KHR: 0x2016, 468 | VG_BLEND_SUBTRACT_KHR: 0x2017, 469 | VG_BLEND_INVERT_KHR: 0x2018, 470 | VG_BLEND_EXCLUSION_KHR: 0x2019, 471 | VG_BLEND_LINEARDODGE_KHR: 0x201a, 472 | VG_BLEND_LINEARBURN_KHR: 0x201b, 473 | VG_BLEND_VIVIDLIGHT_KHR: 0x201c, 474 | VG_BLEND_LINEARLIGHT_KHR: 0x201d, 475 | VG_BLEND_PINLIGHT_KHR: 0x201e, 476 | VG_BLEND_HARDMIX_KHR: 0x201f, 477 | VG_BLEND_CLEAR_KHR: 0x2020, 478 | VG_BLEND_DST_KHR: 0x2021, 479 | VG_BLEND_SRC_OUT_KHR: 0x2022, 480 | VG_BLEND_DST_OUT_KHR: 0x2023, 481 | VG_BLEND_SRC_ATOP_KHR: 0x2024, 482 | VG_BLEND_DST_ATOP_KHR: 0x2025, 483 | VG_BLEND_XOR_KHR: 0x2026, 484 | }; 485 | 486 | const VGBlendModeKHRReverse = reverseMap(VGBlendModeKHR); 487 | 488 | const VGPfTypeKHR = { 489 | VG_PF_OBJECT_VISIBLE_FLAG_KHR: 1 << 0, 490 | VG_PF_KNOCKOUT_FLAG_KHR: 1 << 1, 491 | VG_PF_OUTER_FLAG_KHR: 1 << 2, 492 | VG_PF_INNER_FLAG_KHR: 1 << 3, 493 | }; 494 | 495 | const VGPfTypeKHRReverse = reverseMap(VGPfTypeKHR); 496 | 497 | const VGUErrorCodeKHR = { 498 | VGU_IMAGE_IN_USE_ERROR: 0xf010, 499 | }; 500 | 501 | const VGUErrorCodeKHRReverse = reverseMap(VGUErrorCodeKHR); 502 | 503 | const VGPaintParamTypeNds = { 504 | VG_PAINT_COLOR_RAMP_LINEAR_NDS: 0x1a10, 505 | VG_COLOR_MATRIX_NDS: 0x1a11, 506 | VG_PAINT_COLOR_TRANSFORM_LINEAR_NDS: 0x1a12, 507 | }; 508 | 509 | const VGPaintParamTypeNdsReverse = reverseMap(VGPaintParamTypeNds); 510 | 511 | const VGImageModeNds = { 512 | VG_DRAW_IMAGE_COLOR_MATRIX_NDS: 0x1f10, 513 | }; 514 | 515 | const VGImageModeNdsReverse = reverseMap(VGImageModeNds); 516 | 517 | const VGParamTypeNds = { 518 | VG_CLIP_MODE_NDS: 0x1180, 519 | VG_CLIP_LINES_NDS: 0x1181, 520 | VG_MAX_CLIP_LINES_NDS: 0x1182, 521 | }; 522 | 523 | const VGParamTypeNdsReverse = reverseMap(VGParamTypeNds); 524 | 525 | const VGClipModeNds = { 526 | VG_CLIPMODE_NONE_NDS: 0x3000, 527 | VG_CLIPMODE_CLIP_CLOSED_NDS: 0x3001, 528 | VG_CLIPMODE_CLIP_OPEN_NDS: 0x3002, 529 | VG_CLIPMODE_CULL_NDS: 0x3003, 530 | }; 531 | 532 | const VGClipModeNdsReverse = reverseMap(VGClipModeNds); 533 | 534 | const VGPathSegmentNds = { 535 | VG_RQUAD_TO_NDS: 13 << 1, 536 | VG_RCUBIC_TO_NDS: 14 << 1, 537 | }; 538 | 539 | const VGPathSegmentNdsReverse = reverseMap(VGPathSegmentNds); 540 | 541 | const VGPathCommandNds = { 542 | VG_RQUAD_TO_ABS_NDS: 543 | VGPathSegmentNds.VG_RQUAD_TO_NDS | VGPathSegmentNds.VG_ABSOLUTE, 544 | VG_RQUAD_TO_REL_NDS: 545 | VGPathSegmentNds.VG_RQUAD_TO_NDS | VGPathSegmentNds.VG_RELATIVE, 546 | VG_RCUBIC_TO_ABS_NDS: 547 | VGPathSegmentNds.VG_RCUBIC_TO_NDS | VGPathSegmentNds.VG_ABSOLUTE, 548 | VG_RCUBIC_TO_REL_NDS: 549 | VGPathSegmentNds.VG_RCUBIC_TO_NDS | VGPathSegmentNds.VG_RELATIVE, 550 | }; 551 | 552 | const VGPathCommandNdsReverse = reverseMap(VGPathCommandNds); 553 | 554 | function init() { 555 | openVG.nativeInit(screen); 556 | } 557 | 558 | function deinit() { 559 | openVG.nativeDeinit(); 560 | } 561 | 562 | module.exports = Object.assign(openVG, { 563 | init, 564 | deinit, 565 | screen, 566 | VGErrorCode, 567 | VGErrorCodeReverse, 568 | VGParamType, 569 | VGParamTypeReverse, 570 | VGRenderingQuality, 571 | VGRenderingQualityReverse, 572 | VGPixelLayout, 573 | VGPixelLayoutReverse, 574 | VGMatrixMode, 575 | VGMatrixModeReverse, 576 | VGMaskOperation, 577 | VGMaskOperationReverse, 578 | VG_PATH_FORMAT_STANDARD, 579 | VGPathDatatype, 580 | VGPathDatatypeReverse, 581 | VGPathAbsRel, 582 | VGPathAbsRelReverse, 583 | VGPathSegment, 584 | VGPathSegmentReverse, 585 | VGPathCommand, 586 | VGPathCommandReverse, 587 | VGPathCapabilities, 588 | VGPathCapabilitiesReverse, 589 | VGPathParamType, 590 | VGPathParamTypeReverse, 591 | VGCapStyle, 592 | VGCapStyleReverse, 593 | VGJoinStyle, 594 | VGJoinStyleReverse, 595 | VGFillRule, 596 | VGFillRuleReverse, 597 | VGPaintMode, 598 | VGPaintModeReverse, 599 | VGPaintParamType, 600 | VGPaintParamTypeReverse, 601 | VGPaintType, 602 | VGPaintTypeReverse, 603 | VGColorRampSpreadMode, 604 | VGColorRampSpreadModeReverse, 605 | VGTilingMode, 606 | VGTilingModeReverse, 607 | VGImageFormat, 608 | VGImageFormatReverse, 609 | VGImageQuality, 610 | VGImageQualityReverse, 611 | VGImageParamType, 612 | VGImageParamTypeReverse, 613 | VGImageMode, 614 | VGImageModeReverse, 615 | VGImageChannel, 616 | VGImageChannelReverse, 617 | VGBlendMode, 618 | VGBlendModeReverse, 619 | VGFontParamType, 620 | VGFontParamTypeReverse, 621 | VGHardwareQueryType, 622 | VGHardwareQueryTypeReverse, 623 | VGHardwareQueryResult, 624 | VGHardwareQueryResultReverse, 625 | VGStringID, 626 | VGStringIDReverse, 627 | VGUErrorCode, 628 | VGUErrorCodeReverse, 629 | VGUArcType, 630 | VGUArcTypeReverse, 631 | VGParamTypeKHR, 632 | VGParamTypeKHRReverse, 633 | VGBlendModeKHR, 634 | VGBlendModeKHRReverse, 635 | VGPfTypeKHR, 636 | VGPfTypeKHRReverse, 637 | VGUErrorCodeKHR, 638 | VGUErrorCodeKHRReverse, 639 | VGPaintParamTypeNds, 640 | VGPaintParamTypeNdsReverse, 641 | VGImageModeNds, 642 | VGImageModeNdsReverse, 643 | VGParamTypeNds, 644 | VGParamTypeNdsReverse, 645 | VGClipModeNds, 646 | VGClipModeNdsReverse, 647 | VGPathSegmentNds, 648 | VGPathSegmentNdsReverse, 649 | VGPathCommandNds, 650 | VGPathCommandNdsReverse, 651 | }); 652 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "openvg", 3 | "version": "0.5.0", 4 | "author": "Luis Reis (http://luismreis.com/)", 5 | "description": "OpenVG bindings for node", 6 | "main": "index.js", 7 | "repository": { 8 | "type": "git", 9 | "url": "git://github.com/luismreis/node-openvg.git" 10 | }, 11 | "keyword": [ 12 | "raspberry-pi", 13 | "openvg" 14 | ], 15 | "dependencies": {}, 16 | "devDependencies": { 17 | "eslint": "^4.1.0", 18 | "eslint-friendly-formatter": "^3.0.0", 19 | "eslint-plugin-prettier": "^2.1.2", 20 | "husky": "^0.14.1", 21 | "lint-staged": "^4.0.0", 22 | "prettier": "^1.4.4" 23 | }, 24 | "license": "MIT", 25 | "engines": { 26 | "node": ">=8.0" 27 | }, 28 | "scripts": { 29 | "prettier": "prettier --no-bracket-spacing --print-width 80 --single-quote --trailing-comma es5 --write index.js examples/*.js examples/**/*.js", 30 | "lint": "EFF_NO_LINK_RULES=true eslint . --format 'node_modules/eslint-friendly-formatter'" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/argchecks.h: -------------------------------------------------------------------------------- 1 | #ifndef ARG_CHECKS_H_ 2 | #define ARG_CHECKS_H_ 3 | 4 | #include 5 | 6 | #define DeclareArgs(argc, args, count) \ 7 | size_t argc = count; \ 8 | napi_value args[count]; 9 | 10 | #if defined(ARG_CHECKS) 11 | 12 | #define BASE_MESSAGE "Invalid arguments: Expected " 13 | #define THROW(fn, args) NanThrowTypeError(BASE_MESSAGE #fn "(" args ")") 14 | 15 | #define ASSERT_ARG_COUNT(env, info, fn, argc, args, count) \ 16 | NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));\ 17 | NAPI_ASSERT(env, argc == count, #fn ": Wrong number of arguments"); 18 | 19 | #define ASSERT_TYPE(env, fn, args, arg_index, type) \ 20 | do {\ 21 | napi_valuetype valuetype;\ 22 | NAPI_CALL(env, napi_typeof(env, args[arg_index - 1], &valuetype));\ 23 | NAPI_ASSERT(env, valuetype == napi_##type,\ 24 | #fn ": Wrong argument[" #arg_index "] type: " #type " expected.");\ 25 | } while(0) 26 | 27 | 28 | #define CheckArgs0(env, info, fn, argc, args); \ 29 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 0) 30 | 31 | #define CheckArgs1(env, info, fn, argc, args, type1); \ 32 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 1); \ 33 | ASSERT_TYPE(env, fn, args, 1, type1) 34 | 35 | #define CheckArgs2(env, info, fn, argc, args, type1, type2); \ 36 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 2); \ 37 | ASSERT_TYPE(env, fn, args, 1, type1); \ 38 | ASSERT_TYPE(env, fn, args, 2, type2) 39 | 40 | #define CheckArgs3(env, info, fn, argc, args, type1, type2, type3); \ 41 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 3); \ 42 | ASSERT_TYPE(env, fn, args, 1, type1); \ 43 | ASSERT_TYPE(env, fn, args, 2, type2); \ 44 | ASSERT_TYPE(env, fn, args, 3, type3) 45 | 46 | #define CheckArgs4(env, info, fn, argc, args, type1, type2, type3, type4); \ 47 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 4); \ 48 | ASSERT_TYPE(env, fn, args, 1, type1); \ 49 | ASSERT_TYPE(env, fn, args, 2, type2); \ 50 | ASSERT_TYPE(env, fn, args, 3, type3); \ 51 | ASSERT_TYPE(env, fn, args, 4, type4) 52 | 53 | #define CheckArgs5(env, info, fn, argc, args, type1, type2, type3, type4, type5); \ 54 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 5); \ 55 | ASSERT_TYPE(env, fn, args, 1, type1); \ 56 | ASSERT_TYPE(env, fn, args, 2, type2); \ 57 | ASSERT_TYPE(env, fn, args, 3, type3); \ 58 | ASSERT_TYPE(env, fn, args, 4, type4); \ 59 | ASSERT_TYPE(env, fn, args, 5, type5) 60 | 61 | #define CheckArgs6(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6); \ 62 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 6); \ 63 | ASSERT_TYPE(env, fn, args, 1, type1); \ 64 | ASSERT_TYPE(env, fn, args, 2, type2); \ 65 | ASSERT_TYPE(env, fn, args, 3, type3); \ 66 | ASSERT_TYPE(env, fn, args, 4, type4); \ 67 | ASSERT_TYPE(env, fn, args, 5, type5); \ 68 | ASSERT_TYPE(env, fn, args, 6, type6) 69 | 70 | #define CheckArgs7(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7); \ 71 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 7); \ 72 | ASSERT_TYPE(env, fn, args, 1, type1); \ 73 | ASSERT_TYPE(env, fn, args, 2, type2); \ 74 | ASSERT_TYPE(env, fn, args, 3, type3); \ 75 | ASSERT_TYPE(env, fn, args, 4, type4); \ 76 | ASSERT_TYPE(env, fn, args, 5, type5); \ 77 | ASSERT_TYPE(env, fn, args, 6, type6); \ 78 | ASSERT_TYPE(env, fn, args, 7, type7) 79 | 80 | #define CheckArgs8(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8); \ 81 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 8); \ 82 | ASSERT_TYPE(env, fn, args, 1, type1); \ 83 | ASSERT_TYPE(env, fn, args, 2, type2); \ 84 | ASSERT_TYPE(env, fn, args, 3, type3); \ 85 | ASSERT_TYPE(env, fn, args, 4, type4); \ 86 | ASSERT_TYPE(env, fn, args, 5, type5); \ 87 | ASSERT_TYPE(env, fn, args, 6, type6); \ 88 | ASSERT_TYPE(env, fn, args, 7, type7); \ 89 | ASSERT_TYPE(env, fn, args, 8, type8) 90 | 91 | #define CheckArgs9(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8, type9); \ 92 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 9); \ 93 | ASSERT_TYPE(env, fn, args, 1, type1); \ 94 | ASSERT_TYPE(env, fn, args, 2, type2); \ 95 | ASSERT_TYPE(env, fn, args, 3, type3); \ 96 | ASSERT_TYPE(env, fn, args, 4, type4); \ 97 | ASSERT_TYPE(env, fn, args, 5, type5); \ 98 | ASSERT_TYPE(env, fn, args, 6, type6); \ 99 | ASSERT_TYPE(env, fn, args, 7, type7); \ 100 | ASSERT_TYPE(env, fn, args, 8, type8); \ 101 | ASSERT_TYPE(env, fn, args, 9, type9) 102 | 103 | #define CheckArgs10(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10); \ 104 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 10); \ 105 | ASSERT_TYPE(env, fn, args, 1, type1); \ 106 | ASSERT_TYPE(env, fn, args, 2, type2); \ 107 | ASSERT_TYPE(env, fn, args, 3, type3); \ 108 | ASSERT_TYPE(env, fn, args, 4, type4); \ 109 | ASSERT_TYPE(env, fn, args, 5, type5); \ 110 | ASSERT_TYPE(env, fn, args, 6, type6); \ 111 | ASSERT_TYPE(env, fn, args, 7, type7); \ 112 | ASSERT_TYPE(env, fn, args, 8, type8); \ 113 | ASSERT_TYPE(env, fn, args, 9, type9); \ 114 | ASSERT_TYPE(env, fn, args, 10, type10) 115 | 116 | #define CheckArgs11(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11); \ 117 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 11); \ 118 | ASSERT_TYPE(env, fn, args, 1, type1); \ 119 | ASSERT_TYPE(env, fn, args, 2, type2); \ 120 | ASSERT_TYPE(env, fn, args, 3, type3); \ 121 | ASSERT_TYPE(env, fn, args, 4, type4); \ 122 | ASSERT_TYPE(env, fn, args, 5, type5); \ 123 | ASSERT_TYPE(env, fn, args, 6, type6); \ 124 | ASSERT_TYPE(env, fn, args, 7, type7); \ 125 | ASSERT_TYPE(env, fn, args, 8, type8); \ 126 | ASSERT_TYPE(env, fn, args, 9, type9); \ 127 | ASSERT_TYPE(env, fn, args, 10, type10); \ 128 | ASSERT_TYPE(env, fn, args, 11, type11) 129 | 130 | #define CheckArgs12(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12); \ 131 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 12); \ 132 | ASSERT_TYPE(env, fn, args, 1, type1); \ 133 | ASSERT_TYPE(env, fn, args, 2, type2); \ 134 | ASSERT_TYPE(env, fn, args, 3, type3); \ 135 | ASSERT_TYPE(env, fn, args, 4, type4); \ 136 | ASSERT_TYPE(env, fn, args, 5, type5); \ 137 | ASSERT_TYPE(env, fn, args, 6, type6); \ 138 | ASSERT_TYPE(env, fn, args, 7, type7); \ 139 | ASSERT_TYPE(env, fn, args, 8, type8); \ 140 | ASSERT_TYPE(env, fn, args, 9, type9); \ 141 | ASSERT_TYPE(env, fn, args, 10, type10); \ 142 | ASSERT_TYPE(env, fn, args, 11, type11); \ 143 | ASSERT_TYPE(env, fn, args, 12, type12) 144 | 145 | #define CheckArgs17(env, info, fn, argc, args, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16, type17); \ 146 | ASSERT_ARG_COUNT(env, info, fn, argc, args, 17); \ 147 | ASSERT_TYPE(env, fn, args, 1, type1); \ 148 | ASSERT_TYPE(env, fn, args, 2, type2); \ 149 | ASSERT_TYPE(env, fn, args, 3, type3); \ 150 | ASSERT_TYPE(env, fn, args, 4, type4); \ 151 | ASSERT_TYPE(env, fn, args, 5, type5); \ 152 | ASSERT_TYPE(env, fn, args, 6, type6); \ 153 | ASSERT_TYPE(env, fn, args, 7, type7); \ 154 | ASSERT_TYPE(env, fn, args, 8, type8); \ 155 | ASSERT_TYPE(env, fn, args, 9, type9); \ 156 | ASSERT_TYPE(env, fn, args, 10, type10); \ 157 | ASSERT_TYPE(env, fn, args, 11, type11); \ 158 | ASSERT_TYPE(env, fn, args, 12, type12); \ 159 | ASSERT_TYPE(env, fn, args, 13, type13); \ 160 | ASSERT_TYPE(env, fn, args, 14, type14); \ 161 | ASSERT_TYPE(env, fn, args, 15, type15); \ 162 | ASSERT_TYPE(env, fn, args, 16, type16); \ 163 | ASSERT_TYPE(env, fn, args, 17, type17) 164 | 165 | #else 166 | 167 | #define CheckArgs0(env, info, fn, argc, args) 168 | #define CheckArgs1(env, info, fn, argc, args, type0) 169 | #define CheckArgs2(env, info, fn, argc, args, type0, type1) 170 | #define CheckArgs3(env, info, fn, argc, args, type0, type1, type2) 171 | #define CheckArgs4(env, info, fn, argc, args, type0, type1, type2, type3) 172 | #define CheckArgs5(env, info, fn, argc, args, type0, type1, type2, type3, type4) 173 | #define CheckArgs6(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5) 174 | #define CheckArgs7(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6) 175 | #define CheckArgs8(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7) 176 | #define CheckArgs9(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7, type8) 177 | #define CheckArgs10(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7, type8, type9) 178 | #define CheckArgs11(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10) 179 | #define CheckArgs12(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11) 180 | #define CheckArgs17(env, info, fn, argc, args, type0, type1, type2, type3, type4, type5, type6, type7, type8, type9, type10, type11, type12, type13, type14, type15, type16) 181 | 182 | #endif 183 | 184 | #endif 185 | -------------------------------------------------------------------------------- /src/egl.cc: -------------------------------------------------------------------------------- 1 | #include "EGL/egl.h" 2 | #include "GLES/gl.h" 3 | 4 | #include "egl.h" 5 | #include "bcm_host.h" 6 | 7 | // TODO REMOVE 8 | #define ARG_CHECKS 9 | 10 | #include "node-common.h" 11 | #include "argchecks.h" 12 | 13 | using namespace v8; 14 | using namespace node; 15 | 16 | egl::state_t egl::State; 17 | EGLConfig egl::Config; 18 | 19 | extern void egl::InitBindings(napi_env env, napi_value target) { 20 | napi_property_descriptor descriptors[] = { 21 | DECLARE_NAPI_PROPERTY("getError", egl::GetError), 22 | DECLARE_NAPI_PROPERTY("swapBuffers", egl::SwapBuffers), 23 | DECLARE_NAPI_PROPERTY( 24 | "createPbufferFromClientBuffer", 25 | egl::CreatePbufferFromClientBuffer 26 | ), 27 | DECLARE_NAPI_PROPERTY("destroySurface", egl::DestroySurface), 28 | 29 | DECLARE_NAPI_PROPERTY("createContext", egl::CreateContext), 30 | DECLARE_NAPI_PROPERTY("destroyContext", egl::DestroyContext), 31 | DECLARE_NAPI_PROPERTY("makeCurrent", egl::MakeCurrent) 32 | }; 33 | 34 | NAPI_CALL_RETURN_VOID( 35 | env, 36 | napi_define_properties( 37 | env, 38 | target, 39 | sizeof(descriptors) / sizeof(*descriptors), 40 | descriptors 41 | ) 42 | ); 43 | } 44 | 45 | extern void egl::Init() { 46 | EGLBoolean result; 47 | int32_t success = 0; 48 | 49 | static const EGLint attribute_list[] = { 50 | EGL_RED_SIZE, 8, 51 | EGL_GREEN_SIZE, 8, 52 | EGL_BLUE_SIZE, 8, 53 | EGL_ALPHA_SIZE, 8, 54 | EGL_ALPHA_MASK_SIZE, 8, 55 | EGL_SURFACE_TYPE, EGL_WINDOW_BIT & EGL_SWAP_BEHAVIOR_PRESERVED_BIT, 56 | EGL_NONE 57 | }; 58 | 59 | EGLint num_config; 60 | 61 | VC_RECT_T dst_rect; 62 | VC_RECT_T src_rect; 63 | DISPMANX_ELEMENT_HANDLE_T dispman_element; 64 | DISPMANX_DISPLAY_HANDLE_T dispman_display; 65 | DISPMANX_UPDATE_HANDLE_T dispman_update; 66 | 67 | static EGL_DISPMANX_WINDOW_T nativewindow; 68 | 69 | // bcm_host_init() must be called before anything else 70 | bcm_host_init(); 71 | 72 | // get an EGL display connection 73 | State.display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 74 | 75 | result = eglInitialize(State.display, NULL, NULL); 76 | assert(EGL_FALSE != result); 77 | 78 | // bind OpenVG API 79 | eglBindAPI(EGL_OPENVG_API); 80 | 81 | // get an appropriate EGL frame buffer configuration 82 | result = eglChooseConfig(State.display, attribute_list, 83 | &egl::Config, 1, &num_config); 84 | assert(EGL_FALSE != result); 85 | 86 | // create an EGL rendering context 87 | State.context = 88 | eglCreateContext(State.display, egl::Config, EGL_NO_CONTEXT, NULL); 89 | assert(State.context != EGL_NO_CONTEXT); 90 | 91 | // create an EGL window surface 92 | success = graphics_get_display_size(0 /* LCD */ , &State.screen_width, 93 | &State.screen_height); 94 | assert(success >= 0); 95 | 96 | dst_rect.x = 0; 97 | dst_rect.y = 0; 98 | dst_rect.width = State.screen_width; 99 | dst_rect.height = State.screen_height; 100 | 101 | src_rect.x = 0; 102 | src_rect.y = 0; 103 | src_rect.width = State.screen_width << 16; 104 | src_rect.height = State.screen_height << 16; 105 | 106 | dispman_display = vc_dispmanx_display_open(0 /* LCD */ ); 107 | dispman_update = vc_dispmanx_update_start(0); 108 | 109 | dispman_element = 110 | vc_dispmanx_element_add(dispman_update, dispman_display, 0 /*layer */ , 111 | &dst_rect, 0 /*src */ , &src_rect, 112 | DISPMANX_PROTECTION_NONE, 113 | 0 /*alpha */ , 0 /*clamp */ , 114 | DISPMANX_NO_ROTATE /*transform */); 115 | 116 | nativewindow.element = dispman_element; 117 | nativewindow.width = State.screen_width; 118 | nativewindow.height = State.screen_height; 119 | vc_dispmanx_update_submit_sync(dispman_update); 120 | 121 | State.surface = 122 | eglCreateWindowSurface(State.display, egl::Config, &nativewindow, NULL); 123 | assert(State.surface != EGL_NO_SURFACE); 124 | 125 | // connect the context to the surface 126 | result = 127 | eglMakeCurrent(State.display, State.surface, State.surface, State.context); 128 | assert(EGL_FALSE != result); 129 | 130 | // preserve color buffer when swapping 131 | eglSurfaceAttrib(State.display, State.surface, 132 | EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); 133 | } 134 | 135 | // Code from https://github.com/ajstarks/openvg/blob/master/oglinit.c doesn't 136 | // seem necessary. 137 | extern void egl::InitOpenGLES() { 138 | //DAVE - Set up screen ratio 139 | glViewport(0, 0, (GLsizei) State.screen_width, (GLsizei) State.screen_height); 140 | 141 | glMatrixMode(GL_PROJECTION); 142 | glLoadIdentity(); 143 | 144 | float ratio = (float)State.screen_width / (float)State.screen_height; 145 | glFrustumf(-ratio, ratio, -1.0f, 1.0f, 1.0f, 10.0f); 146 | } 147 | 148 | extern void egl::Finish() { 149 | glClear(GL_COLOR_BUFFER_BIT); 150 | eglSwapBuffers(State.display, State.surface); 151 | eglMakeCurrent(State.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 152 | eglDestroySurface(State.display, State.surface); 153 | eglDestroyContext(State.display, State.context); 154 | eglTerminate(State.display); 155 | 156 | #ifdef __VIDEOCORE__ 157 | bcm_host_deinit(); 158 | #endif 159 | } 160 | 161 | 162 | napi_value egl::GetError(napi_env env, napi_callback_info info) { 163 | DeclareArgs(argc, args, 0); 164 | CheckArgs0(env, info, getError, argc, args); 165 | 166 | napi_value result; 167 | NAPI_CALL(env, napi_create_number(env, eglGetError(), &result)); 168 | return result; 169 | } 170 | 171 | 172 | napi_value egl::SwapBuffers(napi_env env, napi_callback_info info) { 173 | DeclareArgs(argc, args, 2); 174 | CheckArgs2(env, info, swapBuffers, argc, args, external, external); 175 | 176 | void* display; 177 | NAPI_CALL(env, napi_get_value_external(env, args[0], &display)); 178 | void* surface; 179 | NAPI_CALL(env, napi_get_value_external(env, args[1], &surface)); 180 | 181 | EGLBoolean swapResult = eglSwapBuffers(display, surface); 182 | 183 | napi_value result; 184 | NAPI_CALL(env, napi_get_boolean(env, swapResult, &result)); 185 | return result; 186 | } 187 | 188 | napi_value egl::CreatePbufferFromClientBuffer(napi_env env, napi_callback_info info) { 189 | // According to the spec (sec. 4.2.2 EGL Functions) 190 | // The buffer is a VGImage: "The VGImage to be targeted is cast to the 191 | // EGLClientBuffer type and passed as the buffer parameter." 192 | // So, check for a Number (as VGImages are checked on openvg.cc) and 193 | // cast to a EGLClientBuffer. 194 | 195 | DeclareArgs(argc, args, 1); 196 | CheckArgs1(env, info, CreatePbufferFromClientBuffer, argc, args, number); 197 | 198 | uint32_t clientBuffer; 199 | NAPI_CALL(env, napi_get_value_uint32(env, args[0], &clientBuffer)); 200 | 201 | EGLClientBuffer buffer = reinterpret_cast(clientBuffer); 202 | 203 | static const EGLint attribute_list[] = { 204 | EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, 205 | EGL_TEXTURE_TARGET, EGL_TEXTURE_2D, 206 | EGL_MIPMAP_TEXTURE, EGL_FALSE, 207 | EGL_NONE 208 | }; 209 | 210 | EGLSurface surface = eglCreatePbufferFromClientBuffer( 211 | State.display, 212 | EGL_OPENVG_IMAGE, 213 | buffer, 214 | egl::Config, 215 | attribute_list 216 | ); 217 | 218 | napi_value result; 219 | NAPI_CALL(env, napi_create_external(env, surface, NULL, NULL, &result)); 220 | return result; 221 | } 222 | 223 | napi_value egl::DestroySurface(napi_env env, napi_callback_info info) { 224 | DeclareArgs(argc, args, 1); 225 | CheckArgs1(env, info, destroySurface, argc, args, external); 226 | 227 | EGLSurface surface; 228 | NAPI_CALL(env, napi_get_value_external(env, args[0], &surface)); 229 | 230 | EGLBoolean errorCode = eglDestroySurface(State.display, surface); 231 | 232 | napi_value result; 233 | NAPI_CALL(env, napi_get_boolean(env, errorCode, &result)); 234 | return result; 235 | } 236 | 237 | napi_value egl::MakeCurrent(napi_env env, napi_callback_info info) { 238 | DeclareArgs(argc, args, 2); 239 | CheckArgs2(env, info, makeCurrent, argc, args, external, external); 240 | 241 | EGLSurface surface; 242 | NAPI_CALL(env, napi_get_value_external(env, args[0], &surface)); 243 | EGLContext context; 244 | NAPI_CALL(env, napi_get_value_external(env, args[1], &context)); 245 | 246 | // According to EGL 1.4 spec, 3.7.3, for OpenVG contexts, draw and read 247 | // surfaces must be the same 248 | EGLBoolean errorCode = eglMakeCurrent( 249 | State.display, 250 | surface, 251 | surface, 252 | context 253 | ); 254 | 255 | napi_value result; 256 | NAPI_CALL(env, napi_get_boolean(env, errorCode, &result)); 257 | return result; 258 | } 259 | 260 | napi_value egl::CreateContext(napi_env env, napi_callback_info info) { 261 | DeclareArgs(argc, args, 1); 262 | // No arg checks 263 | 264 | NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); 265 | 266 | EGLContext shareContext = EGL_NO_CONTEXT; 267 | 268 | if (argc != 0) { 269 | NAPI_CALL(env, napi_get_value_external(env, args[0], &shareContext)); 270 | } 271 | 272 | // According to EGL 1.4 spec, 3.7.3, for OpenVG contexts, draw and read 273 | // surfaces must be the same 274 | EGLContext context = 275 | eglCreateContext(State.display, egl::Config, shareContext, NULL); 276 | 277 | napi_value result; 278 | NAPI_CALL(env, napi_create_external(env, context, NULL, NULL, &result)); 279 | return result; 280 | } 281 | 282 | napi_value egl::DestroyContext(napi_env env, napi_callback_info info) { 283 | DeclareArgs(argc, args, 1); 284 | CheckArgs1(env, info, destroyContext, argc, args, external); 285 | 286 | EGLContext context; 287 | NAPI_CALL(env, napi_get_value_external(env, args[0], &context)); 288 | 289 | EGLBoolean destroyResult = eglDestroyContext(State.display, context); 290 | 291 | napi_value result; 292 | NAPI_CALL(env, napi_get_boolean(env, destroyResult, &result)); 293 | return result; 294 | } 295 | -------------------------------------------------------------------------------- /src/egl.h: -------------------------------------------------------------------------------- 1 | #ifndef NODE_OPENVG_EGL_H_ 2 | #define NODE_OPENVG_EGL_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | #include "EGL/egl.h" 9 | 10 | using namespace v8; 11 | 12 | namespace egl { 13 | 14 | struct state_t { 15 | EGLDisplay display; 16 | EGLContext context; 17 | EGLSurface surface; 18 | 19 | uint32_t screen_width; 20 | uint32_t screen_height; 21 | }; 22 | 23 | extern state_t State; 24 | extern EGLConfig Config; 25 | 26 | extern void InitBindings(napi_env env, napi_value target); 27 | 28 | void Init(); 29 | void InitOpenGLES(); 30 | void Finish(); 31 | 32 | napi_value GetError(napi_env env, napi_callback_info info); 33 | napi_value SwapBuffers(napi_env env, napi_callback_info info); 34 | napi_value CreatePbufferFromClientBuffer(napi_env env, napi_callback_info info); 35 | napi_value DestroySurface(napi_env env, napi_callback_info info); 36 | 37 | napi_value CreateContext(napi_env env, napi_callback_info info); 38 | napi_value DestroyContext(napi_env env, napi_callback_info info); 39 | napi_value MakeCurrent(napi_env env, napi_callback_info info); 40 | 41 | } 42 | 43 | #define CHECK_EGL_ERROR {\ 44 | EGLint errorCode = eglGetError();\ 45 | if(errorCode != EGL_SUCCESS) {\ 46 | char buffer[100];\ 47 | snprintf(&buffer[0], sizeof(buffer), "eglGetError: 0x%x", errorCode);\ 48 | __assert_fail (buffer, __FILE__, __LINE__, __PRETTY_FUNCTION__);\ 49 | }\ 50 | } 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /src/node-common.h: -------------------------------------------------------------------------------- 1 | // This is a copy for /test/addons-napi/common.h 2 | 3 | // Empty value so that macros here are able to return NULL or void 4 | #define NAPI_RETVAL_NOTHING // Intentionally blank #define 5 | 6 | #define GET_AND_THROW_LAST_ERROR(env) \ 7 | do { \ 8 | const napi_extended_error_info *error_info; \ 9 | napi_get_last_error_info((env), &error_info); \ 10 | bool is_pending; \ 11 | napi_is_exception_pending((env), &is_pending); \ 12 | /* If an exception is already pending, don't rethrow it */ \ 13 | if (!is_pending) { \ 14 | const char* error_message = error_info->error_message != NULL ? \ 15 | error_info->error_message : \ 16 | "empty error message"; \ 17 | napi_throw_error((env), error_message); \ 18 | } \ 19 | } while(0); 20 | 21 | #define NAPI_ASSERT_BASE(env, assertion, message, ret_val) \ 22 | if (!(assertion)) { \ 23 | napi_throw_error( \ 24 | (env), \ 25 | "assertion (" #assertion ") failed: " message); \ 26 | return ret_val; \ 27 | } 28 | 29 | // Returns NULL on failed assertion. 30 | // This is meant to be used inside napi_callback methods. 31 | #define NAPI_ASSERT(env, assertion, message) \ 32 | NAPI_ASSERT_BASE(env, assertion, message, NULL) 33 | 34 | // Returns empty on failed assertion. 35 | // This is meant to be used inside functions with void return type. 36 | #define NAPI_ASSERT_RETURN_VOID(env, assertion, message) \ 37 | NAPI_ASSERT_BASE(env, assertion, message, NAPI_RETVAL_NOTHING) 38 | 39 | #define NAPI_CALL_BASE(env, the_call, ret_val) \ 40 | if ((the_call) != napi_ok) { \ 41 | GET_AND_THROW_LAST_ERROR((env)); \ 42 | return ret_val; \ 43 | } 44 | 45 | // Returns NULL if the_call doesn't return napi_ok. 46 | #define NAPI_CALL(env, the_call) \ 47 | NAPI_CALL_BASE(env, the_call, NULL) 48 | 49 | // Returns empty if the_call doesn't return napi_ok. 50 | #define NAPI_CALL_RETURN_VOID(env, the_call) \ 51 | NAPI_CALL_BASE(env, the_call, NAPI_RETVAL_NOTHING) 52 | 53 | #define DECLARE_NAPI_PROPERTY(name, func) \ 54 | { (name), 0, (func), 0, 0, 0, napi_default, 0 } 55 | 56 | #define DECLARE_NAPI_GETTER(name, func) \ 57 | { (name), 0, 0, (func), 0, 0, napi_default, 0 } 58 | -------------------------------------------------------------------------------- /src/openvg.h: -------------------------------------------------------------------------------- 1 | #ifndef NODE_OPENVG_H_ 2 | #define NODE_OPENVG_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include "EGL/egl.h" 8 | 9 | #include "node-common.h" 10 | 11 | using namespace v8; 12 | 13 | namespace openvg { 14 | 15 | napi_value NativeInit(napi_env env, napi_callback_info info); 16 | napi_value NativeDeinit(napi_env env, napi_callback_info info); 17 | 18 | napi_value GetError(napi_env env, napi_callback_info info); 19 | 20 | napi_value Flush(napi_env env, napi_callback_info info); 21 | napi_value Finish(napi_env env, napi_callback_info info); 22 | 23 | /* Getters and Setters */ 24 | napi_value SetF(napi_env env, napi_callback_info info); 25 | napi_value SetI(napi_env env, napi_callback_info info); 26 | napi_value SetFV(napi_env env, napi_callback_info info); 27 | napi_value SetIV(napi_env env, napi_callback_info info); 28 | napi_value SetFVOL(napi_env env, napi_callback_info info); 29 | napi_value SetIVOL(napi_env env, napi_callback_info info); 30 | 31 | napi_value GetF(napi_env env, napi_callback_info info); 32 | napi_value GetI(napi_env env, napi_callback_info info); 33 | napi_value GetVectorSize(napi_env env, napi_callback_info info); 34 | napi_value GetFV(napi_env env, napi_callback_info info); 35 | napi_value GetIV(napi_env env, napi_callback_info info); 36 | napi_value GetFVOL(napi_env env, napi_callback_info info); 37 | napi_value GetIVOL(napi_env env, napi_callback_info info); 38 | 39 | napi_value SetParameterF(napi_env env, napi_callback_info info); 40 | napi_value SetParameterI(napi_env env, napi_callback_info info); 41 | napi_value SetParameterFV(napi_env env, napi_callback_info info); 42 | napi_value SetParameterIV(napi_env env, napi_callback_info info); 43 | napi_value SetParameterFVOL(napi_env env, napi_callback_info info); 44 | napi_value SetParameterIVOL(napi_env env, napi_callback_info info); 45 | 46 | napi_value GetParameterF(napi_env env, napi_callback_info info); 47 | napi_value GetParameterI(napi_env env, napi_callback_info info); 48 | napi_value GetParameterVectorSize(napi_env env, napi_callback_info info); 49 | napi_value GetParameterFV(napi_env env, napi_callback_info info); 50 | napi_value GetParameterIV(napi_env env, napi_callback_info info); 51 | napi_value GetParameterFVOL(napi_env env, napi_callback_info info); 52 | napi_value GetParameterIVOL(napi_env env, napi_callback_info info); 53 | 54 | /* Matrix Manipulation */ 55 | napi_value LoadIdentity(napi_env env, napi_callback_info info); 56 | napi_value LoadMatrix(napi_env env, napi_callback_info info); 57 | napi_value GetMatrix(napi_env env, napi_callback_info info); 58 | napi_value MultMatrix(napi_env env, napi_callback_info info); 59 | napi_value Translate(napi_env env, napi_callback_info info); 60 | napi_value Scale(napi_env env, napi_callback_info info); 61 | napi_value Shear(napi_env env, napi_callback_info info); 62 | napi_value Rotate(napi_env env, napi_callback_info info); 63 | 64 | /* Masking and Clearing */ 65 | napi_value Mask(napi_env env, napi_callback_info info); 66 | napi_value RenderToMask(napi_env env, napi_callback_info info); 67 | napi_value CreateMaskLayer(napi_env env, napi_callback_info info); 68 | napi_value DestroyMaskLayer(napi_env env, napi_callback_info info); 69 | napi_value FillMaskLayer(napi_env env, napi_callback_info info); 70 | napi_value CopyMask(napi_env env, napi_callback_info info); 71 | napi_value Clear(napi_env env, napi_callback_info info); 72 | 73 | /* Paths */ 74 | napi_value CreatePath(napi_env env, napi_callback_info info); 75 | napi_value ClearPath(napi_env env, napi_callback_info info); 76 | napi_value DestroyPath(napi_env env, napi_callback_info info); 77 | napi_value RemovePathCapabilities(napi_env env, napi_callback_info info); 78 | napi_value GetPathCapabilities(napi_env env, napi_callback_info info); 79 | napi_value AppendPath(napi_env env, napi_callback_info info); 80 | napi_value AppendPathData(napi_env env, napi_callback_info info); 81 | napi_value AppendPathDataO(napi_env env, napi_callback_info info); 82 | napi_value ModifyPathCoords(napi_env env, napi_callback_info info); 83 | napi_value TransformPath(napi_env env, napi_callback_info info); 84 | napi_value InterpolatePath(napi_env env, napi_callback_info info); 85 | napi_value PathLength(napi_env env, napi_callback_info info); 86 | napi_value PointAlongPath(napi_env env, napi_callback_info info); 87 | napi_value PathBounds(napi_env env, napi_callback_info info); 88 | napi_value PathTransformedBounds(napi_env env, napi_callback_info info); 89 | napi_value DrawPath(napi_env env, napi_callback_info info); 90 | 91 | /* Paint */ 92 | napi_value CreatePaint(napi_env env, napi_callback_info info); 93 | napi_value DestroyPaint(napi_env env, napi_callback_info info); 94 | napi_value SetPaint(napi_env env, napi_callback_info info); 95 | napi_value GetPaint(napi_env env, napi_callback_info info); 96 | napi_value SetColor(napi_env env, napi_callback_info info); 97 | napi_value GetColor(napi_env env, napi_callback_info info); 98 | napi_value PaintPattern(napi_env env, napi_callback_info info); 99 | 100 | /* Images */ 101 | napi_value CreateImage(napi_env env, napi_callback_info info); 102 | napi_value DestroyImage(napi_env env, napi_callback_info info); 103 | napi_value ClearImage(napi_env env, napi_callback_info info); 104 | napi_value ImageSubData(napi_env env, napi_callback_info info); 105 | napi_value GetImageSubData(napi_env env, napi_callback_info info); 106 | napi_value ChildImage(napi_env env, napi_callback_info info); 107 | napi_value GetParent(napi_env env, napi_callback_info info); 108 | napi_value CopyImage(napi_env env, napi_callback_info info); 109 | napi_value DrawImage(napi_env env, napi_callback_info info); 110 | napi_value SetPixels(napi_env env, napi_callback_info info); 111 | napi_value WritePixels(napi_env env, napi_callback_info info); 112 | napi_value GetPixels(napi_env env, napi_callback_info info); 113 | napi_value ReadPixels(napi_env env, napi_callback_info info); 114 | napi_value CopyPixels(napi_env env, napi_callback_info info); 115 | 116 | /* Text */ 117 | napi_value CreateFont(napi_env env, napi_callback_info info); 118 | napi_value DestroyFont(napi_env env, napi_callback_info info); 119 | napi_value SetGlyphToPath(napi_env env, napi_callback_info info); 120 | napi_value SetGlyphToImage(napi_env env, napi_callback_info info); 121 | napi_value ClearGlyph(napi_env env, napi_callback_info info); 122 | napi_value DrawGlyph(napi_env env, napi_callback_info info); 123 | napi_value DrawGlyphs(napi_env env, napi_callback_info info); 124 | 125 | /* Image Filters */ 126 | napi_value ColorMatrix(napi_env env, napi_callback_info info); 127 | napi_value Convolve(napi_env env, napi_callback_info info); 128 | napi_value SeparableConvolve(napi_env env, napi_callback_info info); 129 | napi_value GaussianBlur(napi_env env, napi_callback_info info); 130 | napi_value Lookup(napi_env env, napi_callback_info info); 131 | napi_value LookupSingle(napi_env env, napi_callback_info info); 132 | 133 | /* Hardware Queries */ 134 | napi_value HardwareQuery(napi_env env, napi_callback_info info); 135 | 136 | /* Renderer and Extension Information */ 137 | napi_value GetString(napi_env env, napi_callback_info info); 138 | 139 | namespace vgu { 140 | 141 | napi_value Line(napi_env env, napi_callback_info info); 142 | napi_value Polygon(napi_env env, napi_callback_info info); 143 | napi_value Rect(napi_env env, napi_callback_info info); 144 | napi_value RoundRect(napi_env env, napi_callback_info info); 145 | napi_value Ellipse(napi_env env, napi_callback_info info); 146 | napi_value Arc(napi_env env, napi_callback_info info); 147 | napi_value ComputeWarpQuadToSquare(napi_env env, napi_callback_info info); 148 | napi_value ComputeWarpSquareToQuad(napi_env env, napi_callback_info info); 149 | napi_value ComputeWarpQuadToQuad(napi_env env, napi_callback_info info); 150 | 151 | } 152 | 153 | namespace ext { 154 | 155 | napi_value CreateEGLImageTargetKHR(napi_env env, napi_callback_info info); 156 | 157 | napi_value IterativeAverageBlurKHR(napi_env env, napi_callback_info info); 158 | 159 | napi_value ParametricFilterKHR(napi_env env, napi_callback_info info); 160 | napi_value DropShadowKHR(napi_env env, napi_callback_info info); 161 | napi_value GlowKHR(napi_env env, napi_callback_info info); 162 | napi_value BevelKHR(napi_env env, napi_callback_info info); 163 | napi_value GradientGlowKHR(napi_env env, napi_callback_info info); 164 | napi_value GradientBevelKHR(napi_env env, napi_callback_info info); 165 | 166 | napi_value ProjectiveMatrixNDS(napi_env env, napi_callback_info info); 167 | napi_value TransformClipLineNDS(napi_env env, napi_callback_info info); 168 | 169 | } 170 | 171 | } 172 | 173 | #endif 174 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@^3.0.4: 12 | version "3.3.0" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 14 | 15 | acorn@^5.0.1: 16 | version "5.0.3" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.5.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 22 | 23 | ajv@^4.7.0: 24 | version "4.11.8" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ansi-escapes@^1.0.0: 31 | version "1.4.0" 32 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 33 | 34 | ansi-escapes@^2.0.0: 35 | version "2.0.0" 36 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" 37 | 38 | ansi-regex@^2.0.0: 39 | version "2.1.1" 40 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 41 | 42 | ansi-styles@^2.2.1: 43 | version "2.2.1" 44 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 45 | 46 | app-root-path@^2.0.0: 47 | version "2.0.1" 48 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" 49 | 50 | argparse@^1.0.7: 51 | version "1.0.9" 52 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 53 | dependencies: 54 | sprintf-js "~1.0.2" 55 | 56 | array-union@^1.0.1: 57 | version "1.0.2" 58 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 59 | dependencies: 60 | array-uniq "^1.0.1" 61 | 62 | array-uniq@^1.0.1: 63 | version "1.0.3" 64 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 65 | 66 | arrify@^1.0.0: 67 | version "1.0.1" 68 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 69 | 70 | babel-code-frame@^6.22.0: 71 | version "6.22.0" 72 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 73 | dependencies: 74 | chalk "^1.1.0" 75 | esutils "^2.0.2" 76 | js-tokens "^3.0.0" 77 | 78 | balanced-match@^1.0.0: 79 | version "1.0.0" 80 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 81 | 82 | brace-expansion@^1.1.7: 83 | version "1.1.8" 84 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 85 | dependencies: 86 | balanced-match "^1.0.0" 87 | concat-map "0.0.1" 88 | 89 | caller-path@^0.1.0: 90 | version "0.1.0" 91 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 92 | dependencies: 93 | callsites "^0.2.0" 94 | 95 | callsites@^0.2.0: 96 | version "0.2.0" 97 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 98 | 99 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 100 | version "1.1.3" 101 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 102 | dependencies: 103 | ansi-styles "^2.2.1" 104 | escape-string-regexp "^1.0.2" 105 | has-ansi "^2.0.0" 106 | strip-ansi "^3.0.0" 107 | supports-color "^2.0.0" 108 | 109 | ci-info@^1.0.0: 110 | version "1.0.0" 111 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" 112 | 113 | circular-json@^0.3.1: 114 | version "0.3.1" 115 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 116 | 117 | cli-cursor@^1.0.2: 118 | version "1.0.2" 119 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 120 | dependencies: 121 | restore-cursor "^1.0.1" 122 | 123 | cli-cursor@^2.1.0: 124 | version "2.1.0" 125 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 126 | dependencies: 127 | restore-cursor "^2.0.0" 128 | 129 | cli-spinners@^0.1.2: 130 | version "0.1.2" 131 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" 132 | 133 | cli-truncate@^0.2.1: 134 | version "0.2.1" 135 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" 136 | dependencies: 137 | slice-ansi "0.0.4" 138 | string-width "^1.0.1" 139 | 140 | cli-width@^2.0.0: 141 | version "2.1.0" 142 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 143 | 144 | co@^4.6.0: 145 | version "4.6.0" 146 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 147 | 148 | coalescy@1.0.0: 149 | version "1.0.0" 150 | resolved "https://registry.yarnpkg.com/coalescy/-/coalescy-1.0.0.tgz#4b065846b836361ada6c4b4a4abf4bc1cac31bf1" 151 | 152 | code-point-at@^1.0.0: 153 | version "1.1.0" 154 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 155 | 156 | commander@^2.9.0: 157 | version "2.10.0" 158 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.10.0.tgz#e1f5d3245de246d1a5ca04702fa1ad1bd7e405fe" 159 | dependencies: 160 | graceful-readlink ">= 1.0.0" 161 | 162 | concat-map@0.0.1: 163 | version "0.0.1" 164 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 165 | 166 | concat-stream@^1.6.0: 167 | version "1.6.0" 168 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 169 | dependencies: 170 | inherits "^2.0.3" 171 | readable-stream "^2.2.2" 172 | typedarray "^0.0.6" 173 | 174 | core-util-is@~1.0.0: 175 | version "1.0.2" 176 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 177 | 178 | cosmiconfig@^1.1.0: 179 | version "1.1.0" 180 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37" 181 | dependencies: 182 | graceful-fs "^4.1.2" 183 | js-yaml "^3.4.3" 184 | minimist "^1.2.0" 185 | object-assign "^4.0.1" 186 | os-homedir "^1.0.1" 187 | parse-json "^2.2.0" 188 | pinkie-promise "^2.0.0" 189 | require-from-string "^1.1.0" 190 | 191 | cross-spawn@^5.0.1: 192 | version "5.1.0" 193 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 194 | dependencies: 195 | lru-cache "^4.0.1" 196 | shebang-command "^1.2.0" 197 | which "^1.2.9" 198 | 199 | date-fns@^1.27.2: 200 | version "1.28.5" 201 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" 202 | 203 | debug@^2.6.8: 204 | version "2.6.8" 205 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 206 | dependencies: 207 | ms "2.0.0" 208 | 209 | deep-is@~0.1.3: 210 | version "0.1.3" 211 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 212 | 213 | del@^2.0.2: 214 | version "2.2.2" 215 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 216 | dependencies: 217 | globby "^5.0.0" 218 | is-path-cwd "^1.0.0" 219 | is-path-in-cwd "^1.0.0" 220 | object-assign "^4.0.1" 221 | pify "^2.0.0" 222 | pinkie-promise "^2.0.0" 223 | rimraf "^2.2.8" 224 | 225 | doctrine@^2.0.0: 226 | version "2.0.0" 227 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 228 | dependencies: 229 | esutils "^2.0.2" 230 | isarray "^1.0.0" 231 | 232 | elegant-spinner@^1.0.1: 233 | version "1.0.1" 234 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" 235 | 236 | error-ex@^1.2.0: 237 | version "1.3.1" 238 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 239 | dependencies: 240 | is-arrayish "^0.2.1" 241 | 242 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 243 | version "1.0.5" 244 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 245 | 246 | eslint-friendly-formatter@^3.0.0: 247 | version "3.0.0" 248 | resolved "https://registry.yarnpkg.com/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz#278874435a6c46ec1d94fa0b1ff494e30ef04290" 249 | dependencies: 250 | chalk "^1.0.0" 251 | coalescy "1.0.0" 252 | extend "^3.0.0" 253 | minimist "^1.2.0" 254 | text-table "^0.2.0" 255 | 256 | eslint-plugin-prettier@^2.1.2: 257 | version "2.1.2" 258 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.1.2.tgz#4b90f4ee7f92bfbe2e926017e1ca40eb628965ea" 259 | dependencies: 260 | fast-diff "^1.1.1" 261 | jest-docblock "^20.0.1" 262 | 263 | eslint-scope@^3.7.1: 264 | version "3.7.1" 265 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 266 | dependencies: 267 | esrecurse "^4.1.0" 268 | estraverse "^4.1.1" 269 | 270 | eslint@^4.1.0: 271 | version "4.1.0" 272 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.1.0.tgz#bbb55a28220ee08b69da9554d45a6b2ebfd7d913" 273 | dependencies: 274 | babel-code-frame "^6.22.0" 275 | chalk "^1.1.3" 276 | concat-stream "^1.6.0" 277 | debug "^2.6.8" 278 | doctrine "^2.0.0" 279 | eslint-scope "^3.7.1" 280 | espree "^3.4.3" 281 | esquery "^1.0.0" 282 | estraverse "^4.2.0" 283 | esutils "^2.0.2" 284 | file-entry-cache "^2.0.0" 285 | glob "^7.1.2" 286 | globals "^9.17.0" 287 | ignore "^3.3.3" 288 | imurmurhash "^0.1.4" 289 | inquirer "^3.0.6" 290 | is-my-json-valid "^2.16.0" 291 | is-resolvable "^1.0.0" 292 | js-yaml "^3.8.4" 293 | json-stable-stringify "^1.0.1" 294 | levn "^0.3.0" 295 | lodash "^4.17.4" 296 | minimatch "^3.0.2" 297 | mkdirp "^0.5.1" 298 | natural-compare "^1.4.0" 299 | optionator "^0.8.2" 300 | path-is-inside "^1.0.2" 301 | pluralize "^4.0.0" 302 | progress "^2.0.0" 303 | require-uncached "^1.0.3" 304 | strip-json-comments "~2.0.1" 305 | table "^4.0.1" 306 | text-table "~0.2.0" 307 | 308 | espree@^3.4.3: 309 | version "3.4.3" 310 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" 311 | dependencies: 312 | acorn "^5.0.1" 313 | acorn-jsx "^3.0.0" 314 | 315 | esprima@^3.1.1: 316 | version "3.1.3" 317 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 318 | 319 | esquery@^1.0.0: 320 | version "1.0.0" 321 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 322 | dependencies: 323 | estraverse "^4.0.0" 324 | 325 | esrecurse@^4.1.0: 326 | version "4.2.0" 327 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 328 | dependencies: 329 | estraverse "^4.1.0" 330 | object-assign "^4.0.1" 331 | 332 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 333 | version "4.2.0" 334 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 335 | 336 | esutils@^2.0.2: 337 | version "2.0.2" 338 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 339 | 340 | execa@^0.7.0: 341 | version "0.7.0" 342 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 343 | dependencies: 344 | cross-spawn "^5.0.1" 345 | get-stream "^3.0.0" 346 | is-stream "^1.1.0" 347 | npm-run-path "^2.0.0" 348 | p-finally "^1.0.0" 349 | signal-exit "^3.0.0" 350 | strip-eof "^1.0.0" 351 | 352 | exit-hook@^1.0.0: 353 | version "1.1.1" 354 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 355 | 356 | extend@^3.0.0: 357 | version "3.0.1" 358 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 359 | 360 | external-editor@^2.0.4: 361 | version "2.0.4" 362 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 363 | dependencies: 364 | iconv-lite "^0.4.17" 365 | jschardet "^1.4.2" 366 | tmp "^0.0.31" 367 | 368 | fast-diff@^1.1.1: 369 | version "1.1.1" 370 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.1.tgz#0aea0e4e605b6a2189f0e936d4b7fbaf1b7cfd9b" 371 | 372 | fast-levenshtein@~2.0.4: 373 | version "2.0.6" 374 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 375 | 376 | figures@^1.7.0: 377 | version "1.7.0" 378 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 379 | dependencies: 380 | escape-string-regexp "^1.0.5" 381 | object-assign "^4.1.0" 382 | 383 | figures@^2.0.0: 384 | version "2.0.0" 385 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 386 | dependencies: 387 | escape-string-regexp "^1.0.5" 388 | 389 | file-entry-cache@^2.0.0: 390 | version "2.0.0" 391 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 392 | dependencies: 393 | flat-cache "^1.2.1" 394 | object-assign "^4.0.1" 395 | 396 | flat-cache@^1.2.1: 397 | version "1.2.2" 398 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 399 | dependencies: 400 | circular-json "^0.3.1" 401 | del "^2.0.2" 402 | graceful-fs "^4.1.2" 403 | write "^0.2.1" 404 | 405 | fs.realpath@^1.0.0: 406 | version "1.0.0" 407 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 408 | 409 | generate-function@^2.0.0: 410 | version "2.0.0" 411 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 412 | 413 | generate-object-property@^1.1.0: 414 | version "1.2.0" 415 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 416 | dependencies: 417 | is-property "^1.0.0" 418 | 419 | get-stream@^3.0.0: 420 | version "3.0.0" 421 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 422 | 423 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 424 | version "7.1.2" 425 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 426 | dependencies: 427 | fs.realpath "^1.0.0" 428 | inflight "^1.0.4" 429 | inherits "2" 430 | minimatch "^3.0.4" 431 | once "^1.3.0" 432 | path-is-absolute "^1.0.0" 433 | 434 | globals@^9.17.0: 435 | version "9.18.0" 436 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 437 | 438 | globby@^5.0.0: 439 | version "5.0.0" 440 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 441 | dependencies: 442 | array-union "^1.0.1" 443 | arrify "^1.0.0" 444 | glob "^7.0.3" 445 | object-assign "^4.0.1" 446 | pify "^2.0.0" 447 | pinkie-promise "^2.0.0" 448 | 449 | graceful-fs@^4.1.2: 450 | version "4.1.11" 451 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 452 | 453 | "graceful-readlink@>= 1.0.0": 454 | version "1.0.1" 455 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 456 | 457 | has-ansi@^2.0.0: 458 | version "2.0.0" 459 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 460 | dependencies: 461 | ansi-regex "^2.0.0" 462 | 463 | husky@^0.14.1: 464 | version "0.14.1" 465 | resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.1.tgz#8edba33e728ceed75343e88bb8002e4cbd8d1b40" 466 | dependencies: 467 | is-ci "^1.0.10" 468 | normalize-path "^1.0.0" 469 | strip-indent "^2.0.0" 470 | 471 | iconv-lite@^0.4.17: 472 | version "0.4.18" 473 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 474 | 475 | ignore@^3.3.3: 476 | version "3.3.3" 477 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" 478 | 479 | imurmurhash@^0.1.4: 480 | version "0.1.4" 481 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 482 | 483 | indent-string@^2.1.0: 484 | version "2.1.0" 485 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 486 | dependencies: 487 | repeating "^2.0.0" 488 | 489 | indent-string@^3.0.0: 490 | version "3.1.0" 491 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d" 492 | 493 | inflight@^1.0.4: 494 | version "1.0.6" 495 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 496 | dependencies: 497 | once "^1.3.0" 498 | wrappy "1" 499 | 500 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 501 | version "2.0.3" 502 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 503 | 504 | inquirer@^3.0.6: 505 | version "3.1.1" 506 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" 507 | dependencies: 508 | ansi-escapes "^2.0.0" 509 | chalk "^1.0.0" 510 | cli-cursor "^2.1.0" 511 | cli-width "^2.0.0" 512 | external-editor "^2.0.4" 513 | figures "^2.0.0" 514 | lodash "^4.3.0" 515 | mute-stream "0.0.7" 516 | run-async "^2.2.0" 517 | rx-lite "^4.0.8" 518 | rx-lite-aggregates "^4.0.8" 519 | string-width "^2.0.0" 520 | strip-ansi "^3.0.0" 521 | through "^2.3.6" 522 | 523 | is-arrayish@^0.2.1: 524 | version "0.2.1" 525 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 526 | 527 | is-ci@^1.0.10: 528 | version "1.0.10" 529 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" 530 | dependencies: 531 | ci-info "^1.0.0" 532 | 533 | is-finite@^1.0.0: 534 | version "1.0.2" 535 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 536 | dependencies: 537 | number-is-nan "^1.0.0" 538 | 539 | is-fullwidth-code-point@^1.0.0: 540 | version "1.0.0" 541 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 542 | dependencies: 543 | number-is-nan "^1.0.0" 544 | 545 | is-fullwidth-code-point@^2.0.0: 546 | version "2.0.0" 547 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 548 | 549 | is-my-json-valid@^2.16.0: 550 | version "2.16.0" 551 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 552 | dependencies: 553 | generate-function "^2.0.0" 554 | generate-object-property "^1.1.0" 555 | jsonpointer "^4.0.0" 556 | xtend "^4.0.0" 557 | 558 | is-path-cwd@^1.0.0: 559 | version "1.0.0" 560 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 561 | 562 | is-path-in-cwd@^1.0.0: 563 | version "1.0.0" 564 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 565 | dependencies: 566 | is-path-inside "^1.0.0" 567 | 568 | is-path-inside@^1.0.0: 569 | version "1.0.0" 570 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 571 | dependencies: 572 | path-is-inside "^1.0.1" 573 | 574 | is-promise@^2.1.0: 575 | version "2.1.0" 576 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 577 | 578 | is-property@^1.0.0: 579 | version "1.0.2" 580 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 581 | 582 | is-resolvable@^1.0.0: 583 | version "1.0.0" 584 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 585 | dependencies: 586 | tryit "^1.0.1" 587 | 588 | is-stream@^1.1.0: 589 | version "1.1.0" 590 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 591 | 592 | isarray@^1.0.0, isarray@~1.0.0: 593 | version "1.0.0" 594 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 595 | 596 | isexe@^2.0.0: 597 | version "2.0.0" 598 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 599 | 600 | jest-docblock@^20.0.1: 601 | version "20.0.3" 602 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" 603 | 604 | js-tokens@^3.0.0: 605 | version "3.0.1" 606 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 607 | 608 | js-yaml@^3.4.3, js-yaml@^3.8.4: 609 | version "3.8.4" 610 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" 611 | dependencies: 612 | argparse "^1.0.7" 613 | esprima "^3.1.1" 614 | 615 | jschardet@^1.4.2: 616 | version "1.4.2" 617 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" 618 | 619 | json-stable-stringify@^1.0.1: 620 | version "1.0.1" 621 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 622 | dependencies: 623 | jsonify "~0.0.0" 624 | 625 | jsonify@~0.0.0: 626 | version "0.0.0" 627 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 628 | 629 | jsonpointer@^4.0.0: 630 | version "4.0.1" 631 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 632 | 633 | levn@^0.3.0, levn@~0.3.0: 634 | version "0.3.0" 635 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 636 | dependencies: 637 | prelude-ls "~1.1.2" 638 | type-check "~0.3.2" 639 | 640 | lint-staged@^4.0.0: 641 | version "4.0.0" 642 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-4.0.0.tgz#c15669f598614a6e68090303e175a799d48e0d85" 643 | dependencies: 644 | app-root-path "^2.0.0" 645 | cosmiconfig "^1.1.0" 646 | execa "^0.7.0" 647 | listr "^0.12.0" 648 | lodash.chunk "^4.2.0" 649 | minimatch "^3.0.0" 650 | npm-which "^3.0.1" 651 | p-map "^1.1.1" 652 | staged-git-files "0.0.4" 653 | 654 | listr-silent-renderer@^1.1.1: 655 | version "1.1.1" 656 | resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" 657 | 658 | listr-update-renderer@^0.2.0: 659 | version "0.2.0" 660 | resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" 661 | dependencies: 662 | chalk "^1.1.3" 663 | cli-truncate "^0.2.1" 664 | elegant-spinner "^1.0.1" 665 | figures "^1.7.0" 666 | indent-string "^3.0.0" 667 | log-symbols "^1.0.2" 668 | log-update "^1.0.2" 669 | strip-ansi "^3.0.1" 670 | 671 | listr-verbose-renderer@^0.4.0: 672 | version "0.4.0" 673 | resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f" 674 | dependencies: 675 | chalk "^1.1.3" 676 | cli-cursor "^1.0.2" 677 | date-fns "^1.27.2" 678 | figures "^1.7.0" 679 | 680 | listr@^0.12.0: 681 | version "0.12.0" 682 | resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" 683 | dependencies: 684 | chalk "^1.1.3" 685 | cli-truncate "^0.2.1" 686 | figures "^1.7.0" 687 | indent-string "^2.1.0" 688 | is-promise "^2.1.0" 689 | is-stream "^1.1.0" 690 | listr-silent-renderer "^1.1.1" 691 | listr-update-renderer "^0.2.0" 692 | listr-verbose-renderer "^0.4.0" 693 | log-symbols "^1.0.2" 694 | log-update "^1.0.2" 695 | ora "^0.2.3" 696 | p-map "^1.1.1" 697 | rxjs "^5.0.0-beta.11" 698 | stream-to-observable "^0.1.0" 699 | strip-ansi "^3.0.1" 700 | 701 | lodash.chunk@^4.2.0: 702 | version "4.2.0" 703 | resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" 704 | 705 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0: 706 | version "4.17.4" 707 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 708 | 709 | log-symbols@^1.0.2: 710 | version "1.0.2" 711 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 712 | dependencies: 713 | chalk "^1.0.0" 714 | 715 | log-update@^1.0.2: 716 | version "1.0.2" 717 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" 718 | dependencies: 719 | ansi-escapes "^1.0.0" 720 | cli-cursor "^1.0.2" 721 | 722 | lru-cache@^4.0.1: 723 | version "4.1.1" 724 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 725 | dependencies: 726 | pseudomap "^1.0.2" 727 | yallist "^2.1.2" 728 | 729 | mimic-fn@^1.0.0: 730 | version "1.1.0" 731 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 732 | 733 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 734 | version "3.0.4" 735 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 736 | dependencies: 737 | brace-expansion "^1.1.7" 738 | 739 | minimist@0.0.8: 740 | version "0.0.8" 741 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 742 | 743 | minimist@^1.2.0: 744 | version "1.2.0" 745 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 746 | 747 | mkdirp@^0.5.1: 748 | version "0.5.1" 749 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 750 | dependencies: 751 | minimist "0.0.8" 752 | 753 | ms@2.0.0: 754 | version "2.0.0" 755 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 756 | 757 | mute-stream@0.0.7: 758 | version "0.0.7" 759 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 760 | 761 | natural-compare@^1.4.0: 762 | version "1.4.0" 763 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 764 | 765 | normalize-path@^1.0.0: 766 | version "1.0.0" 767 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" 768 | 769 | npm-path@^2.0.2: 770 | version "2.0.3" 771 | resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" 772 | dependencies: 773 | which "^1.2.10" 774 | 775 | npm-run-path@^2.0.0: 776 | version "2.0.2" 777 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 778 | dependencies: 779 | path-key "^2.0.0" 780 | 781 | npm-which@^3.0.1: 782 | version "3.0.1" 783 | resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" 784 | dependencies: 785 | commander "^2.9.0" 786 | npm-path "^2.0.2" 787 | which "^1.2.10" 788 | 789 | number-is-nan@^1.0.0: 790 | version "1.0.1" 791 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 792 | 793 | object-assign@^4.0.1, object-assign@^4.1.0: 794 | version "4.1.1" 795 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 796 | 797 | once@^1.3.0: 798 | version "1.4.0" 799 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 800 | dependencies: 801 | wrappy "1" 802 | 803 | onetime@^1.0.0: 804 | version "1.1.0" 805 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 806 | 807 | onetime@^2.0.0: 808 | version "2.0.1" 809 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 810 | dependencies: 811 | mimic-fn "^1.0.0" 812 | 813 | optionator@^0.8.2: 814 | version "0.8.2" 815 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 816 | dependencies: 817 | deep-is "~0.1.3" 818 | fast-levenshtein "~2.0.4" 819 | levn "~0.3.0" 820 | prelude-ls "~1.1.2" 821 | type-check "~0.3.2" 822 | wordwrap "~1.0.0" 823 | 824 | ora@^0.2.3: 825 | version "0.2.3" 826 | resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" 827 | dependencies: 828 | chalk "^1.1.1" 829 | cli-cursor "^1.0.2" 830 | cli-spinners "^0.1.2" 831 | object-assign "^4.0.1" 832 | 833 | os-homedir@^1.0.1: 834 | version "1.0.2" 835 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 836 | 837 | os-tmpdir@~1.0.1: 838 | version "1.0.2" 839 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 840 | 841 | p-finally@^1.0.0: 842 | version "1.0.0" 843 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 844 | 845 | p-map@^1.1.1: 846 | version "1.1.1" 847 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" 848 | 849 | parse-json@^2.2.0: 850 | version "2.2.0" 851 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 852 | dependencies: 853 | error-ex "^1.2.0" 854 | 855 | path-is-absolute@^1.0.0: 856 | version "1.0.1" 857 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 858 | 859 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 860 | version "1.0.2" 861 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 862 | 863 | path-key@^2.0.0: 864 | version "2.0.1" 865 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 866 | 867 | pify@^2.0.0: 868 | version "2.3.0" 869 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 870 | 871 | pinkie-promise@^2.0.0: 872 | version "2.0.1" 873 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 874 | dependencies: 875 | pinkie "^2.0.0" 876 | 877 | pinkie@^2.0.0: 878 | version "2.0.4" 879 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 880 | 881 | pluralize@^4.0.0: 882 | version "4.0.0" 883 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" 884 | 885 | prelude-ls@~1.1.2: 886 | version "1.1.2" 887 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 888 | 889 | prettier@^1.4.4: 890 | version "1.4.4" 891 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.4.4.tgz#a8d1447b14c9bf67e6d420dcadd10fb9a4fad65a" 892 | 893 | process-nextick-args@~1.0.6: 894 | version "1.0.7" 895 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 896 | 897 | progress@^2.0.0: 898 | version "2.0.0" 899 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 900 | 901 | pseudomap@^1.0.2: 902 | version "1.0.2" 903 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 904 | 905 | readable-stream@^2.2.2: 906 | version "2.3.2" 907 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d" 908 | dependencies: 909 | core-util-is "~1.0.0" 910 | inherits "~2.0.3" 911 | isarray "~1.0.0" 912 | process-nextick-args "~1.0.6" 913 | safe-buffer "~5.1.0" 914 | string_decoder "~1.0.0" 915 | util-deprecate "~1.0.1" 916 | 917 | repeating@^2.0.0: 918 | version "2.0.1" 919 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 920 | dependencies: 921 | is-finite "^1.0.0" 922 | 923 | require-from-string@^1.1.0: 924 | version "1.2.1" 925 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" 926 | 927 | require-uncached@^1.0.3: 928 | version "1.0.3" 929 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 930 | dependencies: 931 | caller-path "^0.1.0" 932 | resolve-from "^1.0.0" 933 | 934 | resolve-from@^1.0.0: 935 | version "1.0.1" 936 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 937 | 938 | restore-cursor@^1.0.1: 939 | version "1.0.1" 940 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 941 | dependencies: 942 | exit-hook "^1.0.0" 943 | onetime "^1.0.0" 944 | 945 | restore-cursor@^2.0.0: 946 | version "2.0.0" 947 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 948 | dependencies: 949 | onetime "^2.0.0" 950 | signal-exit "^3.0.2" 951 | 952 | rimraf@^2.2.8: 953 | version "2.6.1" 954 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 955 | dependencies: 956 | glob "^7.0.5" 957 | 958 | run-async@^2.2.0: 959 | version "2.3.0" 960 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 961 | dependencies: 962 | is-promise "^2.1.0" 963 | 964 | rx-lite-aggregates@^4.0.8: 965 | version "4.0.8" 966 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 967 | dependencies: 968 | rx-lite "*" 969 | 970 | rx-lite@*, rx-lite@^4.0.8: 971 | version "4.0.8" 972 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 973 | 974 | rxjs@^5.0.0-beta.11: 975 | version "5.4.1" 976 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.1.tgz#b62f757f279445d265a18a58fb0a70dc90e91626" 977 | dependencies: 978 | symbol-observable "^1.0.1" 979 | 980 | safe-buffer@~5.1.0: 981 | version "5.1.1" 982 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 983 | 984 | shebang-command@^1.2.0: 985 | version "1.2.0" 986 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 987 | dependencies: 988 | shebang-regex "^1.0.0" 989 | 990 | shebang-regex@^1.0.0: 991 | version "1.0.0" 992 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 993 | 994 | signal-exit@^3.0.0, signal-exit@^3.0.2: 995 | version "3.0.2" 996 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 997 | 998 | slice-ansi@0.0.4: 999 | version "0.0.4" 1000 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1001 | 1002 | sprintf-js@~1.0.2: 1003 | version "1.0.3" 1004 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1005 | 1006 | staged-git-files@0.0.4: 1007 | version "0.0.4" 1008 | resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" 1009 | 1010 | stream-to-observable@^0.1.0: 1011 | version "0.1.0" 1012 | resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" 1013 | 1014 | string-width@^1.0.1: 1015 | version "1.0.2" 1016 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1017 | dependencies: 1018 | code-point-at "^1.0.0" 1019 | is-fullwidth-code-point "^1.0.0" 1020 | strip-ansi "^3.0.0" 1021 | 1022 | string-width@^2.0.0: 1023 | version "2.0.0" 1024 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1025 | dependencies: 1026 | is-fullwidth-code-point "^2.0.0" 1027 | strip-ansi "^3.0.0" 1028 | 1029 | string_decoder@~1.0.0: 1030 | version "1.0.3" 1031 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1032 | dependencies: 1033 | safe-buffer "~5.1.0" 1034 | 1035 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1036 | version "3.0.1" 1037 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1038 | dependencies: 1039 | ansi-regex "^2.0.0" 1040 | 1041 | strip-eof@^1.0.0: 1042 | version "1.0.0" 1043 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1044 | 1045 | strip-indent@^2.0.0: 1046 | version "2.0.0" 1047 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" 1048 | 1049 | strip-json-comments@~2.0.1: 1050 | version "2.0.1" 1051 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1052 | 1053 | supports-color@^2.0.0: 1054 | version "2.0.0" 1055 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1056 | 1057 | symbol-observable@^1.0.1: 1058 | version "1.0.4" 1059 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 1060 | 1061 | table@^4.0.1: 1062 | version "4.0.1" 1063 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" 1064 | dependencies: 1065 | ajv "^4.7.0" 1066 | ajv-keywords "^1.0.0" 1067 | chalk "^1.1.1" 1068 | lodash "^4.0.0" 1069 | slice-ansi "0.0.4" 1070 | string-width "^2.0.0" 1071 | 1072 | text-table@^0.2.0, text-table@~0.2.0: 1073 | version "0.2.0" 1074 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1075 | 1076 | through@^2.3.6: 1077 | version "2.3.8" 1078 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1079 | 1080 | tmp@^0.0.31: 1081 | version "0.0.31" 1082 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 1083 | dependencies: 1084 | os-tmpdir "~1.0.1" 1085 | 1086 | tryit@^1.0.1: 1087 | version "1.0.3" 1088 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1089 | 1090 | type-check@~0.3.2: 1091 | version "0.3.2" 1092 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1093 | dependencies: 1094 | prelude-ls "~1.1.2" 1095 | 1096 | typedarray@^0.0.6: 1097 | version "0.0.6" 1098 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1099 | 1100 | util-deprecate@~1.0.1: 1101 | version "1.0.2" 1102 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1103 | 1104 | which@^1.2.10, which@^1.2.9: 1105 | version "1.2.14" 1106 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 1107 | dependencies: 1108 | isexe "^2.0.0" 1109 | 1110 | wordwrap@~1.0.0: 1111 | version "1.0.0" 1112 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1113 | 1114 | wrappy@1: 1115 | version "1.0.2" 1116 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1117 | 1118 | write@^0.2.1: 1119 | version "0.2.1" 1120 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1121 | dependencies: 1122 | mkdirp "^0.5.1" 1123 | 1124 | xtend@^4.0.0: 1125 | version "4.0.1" 1126 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1127 | 1128 | yallist@^2.1.2: 1129 | version "2.1.2" 1130 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1131 | --------------------------------------------------------------------------------