├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── dist ├── vue-placeholders.js └── vue-placeholders.min.js ├── example.html ├── package.json ├── spec └── tests.js ├── src ├── index.js ├── vue-placeholders-image.js └── vue-placeholders-text.js └── testem.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | bower_components 4 | TODO 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | branches: 5 | only: 6 | - master 7 | before_install: 8 | - * 9 | before_script: 10 | - * 11 | env: 12 | global: 13 | - secure: * 14 | - secure: * 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Jeremy Suntheimer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # vue-placeholders 3 | 4 | A simple [Vue](http://vuejs.org) directive for placeholder images and lorem-ipsum text. 5 | 6 | ## Usage 7 | 8 | For a placeholder image: 9 | 10 | ```Html 11 | 12 | ``` 13 | 14 | For lorem-ipsum text: 15 | 16 | ```Html 17 |
18 | ``` 19 | 20 | ### You can check out a demo [here](http://lithiumjake.github.io/vue-placeholders/) 21 | 22 | ## API 23 | 24 | The **v-phimg** directive expects a string describing the dimensions in pixels, seperated by an 'x', ie "200x200" 25 | 26 | The **v-phtxt** directive expects a string describing a number of paragraphs, ie "4p", the number of sentences, ie "5s", 27 | or the number of paragraphs and sentences per paragraph, ie "3p8s". 28 | 29 | ## Attribution 30 | 31 | Based entirely on the work of Josh David Miller https://github.com/joshdmiller/angular-placeholders 32 | which is itself based, in part, on https://github.com/fkadeveloper/loremjs 33 | 34 | Ported with love from AngularJS to [Vue.js](http://vuejs.org/) 35 | 36 | 37 | ## License 38 | 39 | The MIT License (MIT) 40 | 41 | Copyright (c) 2014 Jeremy Suntheimer 42 | 43 | Permission is hereby granted, free of charge, to any person obtaining a copy 44 | of this software and associated documentation files (the "Software"), to deal 45 | in the Software without restriction, including without limitation the rights 46 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 47 | copies of the Software, and to permit persons to whom the Software is 48 | furnished to do so, subject to the following conditions: 49 | 50 | The above copyright notice and this permission notice shall be included in 51 | all copies or substantial portions of the Software. 52 | 53 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 54 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 55 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 56 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 57 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 58 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 59 | THE SOFTWARE. 60 | -------------------------------------------------------------------------------- /dist/vue-placeholders.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) { 113 | text_size = config.text_size / (context.measureText(text).width / size.w) 114 | context.font = 'bold ' + text_size + 'pt sans-serif' 115 | } 116 | 117 | context.fillText( text, size.w / 2, size.h / 2 ) 118 | return canvas.toDataURL("image/png") 119 | } 120 | } 121 | 122 | },{}],3:[function(require,module,exports){ 123 | /** 124 | * Permission is hereby granted, free of charge, to any person obtaining a copy 125 | * of this software and associated documentation files (the "Software"), to 126 | * deal in the Software without restriction, including without limitation the 127 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 128 | * sell copies of the Software, and to permit persons to whom the Software is 129 | * furnished to do so, subject to the following conditions: 130 | * 131 | * The above copyright notice and this permission notice shall be included in 132 | * all copies or substantial portions of the Software. 133 | * 134 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 135 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 136 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 137 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 138 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 139 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 140 | * IN THE SOFTWARE. 141 | */ 142 | 143 | /** 144 | * Based entirely on the work of Josh David Miller (https://github.com/joshdmiller/angular-placeholders) 145 | * which is itself based, in part, on https://github.com/fkadeveloper/loremjs 146 | * Ported from AngularJS to Vue.js (http://vuejs.org/) 147 | **/ 148 | 149 | module.exports = { 150 | 151 | update: function(value) { 152 | 153 | var val = this.value ? this.value : this.key, 154 | el = this.el, 155 | numSentences, 156 | numParagraphs, 157 | p_match, 158 | s_match 159 | 160 | p_match = val.match( /(\d+)p/ ) 161 | s_match = val.match( /(\d+)s/ ) 162 | 163 | if ( p_match !== null) { 164 | numParagraphs = parseInt( p_match[1], 10 ) 165 | } else { 166 | numParagraphs = false; 167 | } 168 | 169 | if ( s_match !== null ) { 170 | numSentences = parseInt( s_match[1], 10 ) 171 | } else { 172 | numSentences = false; 173 | } 174 | 175 | this.populate(numParagraphs, numSentences, el) 176 | }, 177 | 178 | populate: function(numParagraphs, numSentences, el) { 179 | var contents 180 | 181 | if ( numParagraphs || !numSentences ) { 182 | contents = this.createParagraphs( numParagraphs, numSentences ) 183 | } else { 184 | contents = this.createSentences( numSentences ) 185 | } 186 | 187 | el.innerHTML = contents 188 | }, 189 | 190 | randomInt: function(min, max) { 191 | return Math.floor(Math.random() * (max - min + 1)) + min 192 | }, 193 | 194 | createSentence: function (sentenceLength) { 195 | var wordIndex, 196 | sentence 197 | 198 | sentenceLength = sentenceLength || this.randomInt( 5, 20 ) 199 | wordIndex = this.randomInt(0, this.words.length - sentenceLength - 1) 200 | sentence = this.words.slice(wordIndex, wordIndex + sentenceLength) 201 | .join(' ') 202 | .replace(/\,$/g, '') + '.' 203 | 204 | return sentence.charAt(0).toUpperCase() + sentence.slice(1) 205 | }, 206 | 207 | createSentences: function(numSentences) { 208 | var sentences = [] 209 | 210 | numSentences = numSentences || this.randomInt( 3, 7 ) 211 | 212 | for (var i = 0; i < numSentences; i++ ) { 213 | sentences.push(this.createSentence()) 214 | } 215 | 216 | return sentences.join(' ') 217 | }, 218 | 219 | createParagraph: function(numSentences) { 220 | var sentences = this.createSentences( numSentences ) 221 | return "

" + sentences + "

" 222 | }, 223 | 224 | createParagraphs: function (numParagraphs, numSentences) { 225 | var paragraphs = [], 226 | randomInt = this.randomInt 227 | 228 | numParagraphs = numParagraphs || randomInt( 3, 7 ) 229 | for (var i = 0; i < numParagraphs; i++ ) { 230 | paragraphs.push( this.createParagraph( numSentences ) ) 231 | } 232 | 233 | return paragraphs.join('\n') 234 | }, 235 | 236 | words: ["lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", 237 | "elit", "ut", "aliquam,", "purus", "sit", "amet", "luctus", "venenatis,", 238 | "lectus", "magna", "fringilla", "urna,", "porttitor", "rhoncus", "dolor", 239 | "purus", "non", "enim", "praesent", "elementum", "facilisis", "leo,", "vel", 240 | "fringilla", "est", "ullamcorper", "eget", "nulla", "facilisi", "etiam", 241 | "dignissim", "diam", "quis", "enim", "lobortis", "scelerisque", "fermentum", 242 | "dui", "faucibus", "in", "ornare", "quam", "viverra", "orci", "sagittis", "eu", 243 | "volutpat", "odio", "facilisis", "mauris", "sit", "amet", "massa", "vitae", 244 | "tortor", "condimentum", "lacinia", "quis", "vel", "eros", "donec", "ac", 245 | "odio", "tempor", "orci", "dapibus", "ultrices", "in", "iaculis", "nunc", 246 | "sed", "augue", "lacus,", "viverra", "vitae", "congue", "eu,", "consequat", 247 | "ac", "felis", "donec", "et", "odio", "pellentesque", "diam", "volutpat", 248 | "commodo", "sed", "egestas", "egestas", "fringilla", "phasellus", "faucibus", 249 | "scelerisque", "eleifend", "donec", "pretium", "vulputate", "sapien", "nec", 250 | "sagittis", "aliquam", "malesuada", "bibendum", "arcu", "vitae", "elementum", 251 | "curabitur", "vitae", "nunc", "sed", "velit", "dignissim", "sodales", "ut", 252 | "eu", "sem", "integer", "vitae", "justo", "eget", "magna", "fermentum", 253 | "iaculis", "eu", "non", "diam", "phasellus", "vestibulum", "lorem", "sed", 254 | "risus", "ultricies", "tristique", "nulla", "aliquet", "enim", "tortor,", "at", 255 | "auctor", "urna", "nunc", "id", "cursus", "metus", "aliquam", "eleifend", "mi", 256 | "in", "nulla", "posuere", "sollicitudin", "aliquam", "ultrices", "sagittis", 257 | "orci,", "a", "scelerisque", "purus", "semper", "eget", "duis", "at", "tellus", 258 | "at", "urna", "condimentum", "mattis", "pellentesque", "id", "nibh", "tortor,", 259 | "id", "aliquet", "lectus", "proin", "nibh", "nisl,", "condimentum", "id", 260 | "venenatis", "a,", "condimentum", "vitae", "sapien", "pellentesque", 261 | "habitant", "morbi", "tristique", "senectus", "et", "netus", "et", "malesuada", 262 | "fames", "ac", "turpis", "egestas", "sed", "tempus,", "urna", "et", "pharetra", 263 | "pharetra,", "massa", "massa", "ultricies", "mi,", "quis", "hendrerit", 264 | "dolor", "magna", "eget", "est", "lorem", "ipsum", "dolor", "sit", "amet,", 265 | "consectetur", "adipiscing", "elit", "pellentesque", "habitant", "morbi", 266 | "tristique", "senectus", "et", "netus", "et", "malesuada", "fames", "ac", 267 | "turpis", "egestas", "integer", "eget", "aliquet", "nibh", "praesent", 268 | "tristique", "magna", "sit", "amet", "purus", "gravida", "quis", "blandit", 269 | "turpis", "cursus", "in", "hac", "habitasse", "platea", "dictumst", "quisque", 270 | "sagittis,", "purus", "sit", "amet", "volutpat", "consequat,", "mauris", 271 | "nunc", "congue", "nisi,", "vitae", "suscipit", "tellus", "mauris", "a", 272 | "diam", "maecenas", "sed", "enim", "ut", "sem", "viverra", "aliquet", "eget", 273 | "sit", "amet", "tellus", "cras", "adipiscing", "enim", "eu", "turpis", 274 | "egestas", "pretium", "aenean", "pharetra,", "magna", "ac", "placerat", 275 | "vestibulum,", "lectus", "mauris", "ultrices", "eros,", "in", "cursus", 276 | "turpis", "massa", "tincidunt", "dui", "ut", "ornare", "lectus", "sit", "amet", 277 | "est", "placerat", "in", "egestas", "erat", "imperdiet", "sed", "euismod", 278 | "nisi", "porta", "lorem", "mollis", "aliquam", "ut", "porttitor", "leo", "a", 279 | "diam", "sollicitudin", "tempor", "id", "eu", "nisl", "nunc", "mi", "ipsum,", 280 | "faucibus", "vitae", "aliquet", "nec,", "ullamcorper", "sit", "amet", "risus", 281 | "nullam", "eget", "felis", "eget", "nunc", "lobortis", "mattis", "aliquam", 282 | "faucibus", "purus", "in", "massa", "tempor", "nec", "feugiat", "nisl", 283 | "pretium", "fusce", "id", "velit", "ut", "tortor", "pretium", "viverra", 284 | "suspendisse", "potenti", "nullam", "ac", "tortor", "vitae", "purus", 285 | "faucibus", "ornare", "suspendisse", "sed", "nisi", "lacus,", "sed", "viverra", 286 | "tellus", "in", "hac", "habitasse", "platea", "dictumst", "vestibulum", 287 | "rhoncus", "est", "pellentesque", "elit", "ullamcorper", "dignissim", "cras", 288 | "tincidunt", "lobortis", "feugiat", "vivamus", "at", "augue", "eget", "arcu", 289 | "dictum", "varius", "duis", "at", "consectetur", "lorem", "donec", "massa", 290 | "sapien,", "faucibus", "et", "molestie", "ac,", "feugiat", "sed", "lectus", 291 | "vestibulum", "mattis", "ullamcorper", "velit", "sed", "ullamcorper", "morbi", 292 | "tincidunt", "ornare", "massa,", "eget", "egestas", "purus", "viverra", 293 | "accumsan", "in", "nisl", "nisi,", "scelerisque", "eu", "ultrices", "vitae,", 294 | "auctor", "eu", "augue", "ut", "lectus", "arcu,", "bibendum", "at", "varius", 295 | "vel,", "pharetra", "vel", "turpis", "nunc", "eget", "lorem", "dolor,", "sed", 296 | "viverra", "ipsum", "nunc", "aliquet", "bibendum", "enim,", "facilisis", 297 | "gravida", "neque", "convallis", "a", "cras", "semper", "auctor", "neque,", 298 | "vitae", "tempus", "quam", "pellentesque", "nec", "nam", "aliquam", "sem", 299 | "et", "tortor", "consequat", "id", "porta", "nibh", "venenatis", "cras", "sed", 300 | "felis", "eget", "velit", "aliquet", "sagittis", "id", "consectetur", "purus", 301 | "ut", "faucibus", "pulvinar", "elementum", "integer", "enim", "neque,", 302 | "volutpat", "ac", "tincidunt", "vitae,", "semper", "quis", "lectus", "nulla", 303 | "at", "volutpat", "diam", "ut", "venenatis", "tellus", "in", "metus", 304 | "vulputate", "eu", "scelerisque", "felis", "imperdiet", "proin", "fermentum", 305 | "leo", "vel", "orci", "porta", "non", "pulvinar", "neque", "laoreet", 306 | "suspendisse", "interdum", "consectetur", "libero,", "id", "faucibus", "nisl", 307 | "tincidunt", "eget", "nullam", "non", "nisi", "est,", "sit", "amet", 308 | "facilisis", "magna", "etiam", "tempor,", "orci", "eu", "lobortis", 309 | "elementum,", "nibh", "tellus", "molestie", "nunc,", "non", "blandit", "massa", 310 | "enim", "nec", "dui", "nunc", "mattis", "enim", "ut", "tellus", "elementum", 311 | "sagittis", "vitae", "et", "leo", "duis", "ut", "diam", "quam", "nulla", 312 | "porttitor", "massa", "id", "neque", "aliquam", "vestibulum", "morbi", 313 | "blandit", "cursus", "risus,", "at", "ultrices", "mi", "tempus", "imperdiet", 314 | "nulla", "malesuada", "pellentesque", "elit", "eget", "gravida", "cum", 315 | "sociis", "natoque", "penatibus", "et", "magnis", "dis", "parturient", 316 | "montes,", "nascetur", "ridiculus", "mus", "mauris", "vitae", "ultricies", 317 | "leo", "integer", "malesuada", "nunc", "vel", "risus", "commodo", "viverra", 318 | "maecenas", "accumsan,", "lacus", "vel", "facilisis", "volutpat,", "est", 319 | "velit", "egestas", "dui,", "id", "ornare", "arcu", "odio", "ut", "sem", 320 | "nulla", "pharetra", "diam", "sit", "amet", "nisl", "suscipit", "adipiscing", 321 | "bibendum", "est", "ultricies", "integer", "quis", "auctor", "elit", "sed", 322 | "vulputate", "mi", "sit", "amet", "mauris", "commodo", "quis", "imperdiet", 323 | "massa", "tincidunt", "nunc", "pulvinar", "sapien", "et", "ligula", 324 | "ullamcorper", "malesuada", "proin", "libero", "nunc,", "consequat", 325 | "interdum", "varius", "sit", "amet,", "mattis", "vulputate", "enim", "nulla", 326 | "aliquet", "porttitor", "lacus,", "luctus", "accumsan", "tortor", "posuere", 327 | "ac", "ut", "consequat", "semper", "viverra", "nam", "libero", "justo,", 328 | "laoreet", "sit", "amet", "cursus", "sit", "amet,", "dictum", "sit", "amet", 329 | "justo", "donec", "enim", "diam,", "vulputate", "ut", "pharetra", "sit", 330 | "amet,", "aliquam", "id", "diam", "maecenas", "ultricies", "mi", "eget", 331 | "mauris", "pharetra", "et", "ultrices", "neque", "ornare", "aenean", "euismod", 332 | "elementum", "nisi,", "quis", "eleifend", "quam", "adipiscing", "vitae", 333 | "proin", "sagittis,", "nisl", "rhoncus", "mattis", "rhoncus,", "urna", "neque", 334 | "viverra", "justo,", "nec", "ultrices", "dui", "sapien", "eget", "mi", "proin", 335 | "sed", "libero", "enim,", "sed", "faucibus", "turpis", "in", "eu", "mi", 336 | "bibendum", "neque", "egestas", "congue", "quisque", "egestas", "diam", "in", 337 | "arcu", "cursus", "euismod", "quis", "viverra", "nibh", "cras", "pulvinar", 338 | "mattis", "nunc,", "sed", "blandit", "libero", "volutpat", "sed", "cras", 339 | "ornare", "arcu", "dui", "vivamus", "arcu", "felis,", "bibendum", "ut", 340 | "tristique", "et,", "egestas", "quis", "ipsum", "suspendisse", "ultrices", 341 | "fusce", "ut", "placerat", "orci", "nulla", "pellentesque", 342 | "dignissim", "enim,", "sit", "amet", "venenatis", "urna", "cursus", "eget", 343 | "nunc", "scelerisque", "viverra", "mauris,", "in", "aliquam", "sem", 344 | "fringilla", "ut", "morbi", "tincidunt", "augue", "interdum", "velit", 345 | "euismod", "in", "pellentesque", "massa", "placerat", "duis", "ultricies", 346 | "lacus", "sed", "turpis", "tincidunt", "id", "aliquet", "risus", "feugiat", 347 | "in", "ante", "metus,", "dictum", "at", "tempor", "commodo,", "ullamcorper", 348 | "a", "lacus", "vestibulum", "sed", "arcu", "non", "odio", "euismod", "lacinia", 349 | "at", "quis", "risus", "sed", "vulputate", "odio", "ut", "enim", "blandit", 350 | "volutpat", "maecenas", "volutpat", "blandit", "aliquam", "etiam", "erat", 351 | "velit,", "scelerisque", "in", "dictum", "non,", "consectetur", "a", "erat", 352 | "nam", "at", "lectus", "urna", "duis", "convallis", "convallis", "tellus,", 353 | "id", "interdum", "velit", "laoreet", "id", "donec", "ultrices", "tincidunt", 354 | "arcu,", "non", "sodales", "neque", "sodales", "ut", "etiam", "sit", "amet", 355 | "nisl", "purus,", "in", "mollis", "nunc", "sed", "id", "semper", "risus", "in", 356 | "hendrerit", "gravida", "rutrum", "quisque", "non", "tellus", "orci,", "ac", 357 | "auctor", "augue", "mauris", "augue", "neque,", "gravida", "in", "fermentum", 358 | "et,", "sollicitudin", "ac", "orci", "phasellus", "egestas", "tellus", 359 | "rutrum", "tellus", "pellentesque", "eu", "tincidunt", "tortor", "aliquam", 360 | "nulla", "facilisi", "cras", "fermentum,", "odio", "eu", "feugiat", "pretium,", 361 | "nibh", "ipsum", "consequat", "nisl,", "vel", "pretium", "lectus", "quam", 362 | "id", "leo", "in", "vitae", "turpis", "massa", "sed", "elementum", "tempus", 363 | "egestas", "sed", "sed", "risus", "pretium", "quam", "vulputate", "dignissim", 364 | "suspendisse", "in", "est", "ante", "in", "nibh", "mauris,", "cursus", 365 | "mattis", "molestie", "a,", "iaculis", "at", "erat", "pellentesque", 366 | "adipiscing", "commodo", "elit,", "at", "imperdiet", "dui", "accumsan", "sit", 367 | "amet", "nulla", "facilisi", "morbi", "tempus", "iaculis", "urna,", "id", 368 | "volutpat", "lacus", "laoreet", "non", "curabitur", "gravida", "arcu", "ac", 369 | "tortor", "dignissim", "convallis", "aenean", "et", "tortor", "at", "risus", 370 | "viverra", "adipiscing", "at", "in", "tellus", "integer", "feugiat", 371 | "scelerisque", "varius", "morbi", "enim", "nunc,", "faucibus", "a", 372 | "pellentesque", "sit", "amet,", "porttitor", "eget", "dolor", "morbi", "non", 373 | "arcu", "risus,", "quis", "varius", "quam", "quisque", "id", "diam", "vel", 374 | "quam", "elementum", "pulvinar", "etiam", "non", "quam", "lacus", 375 | "suspendisse", "faucibus", "interdum", "posuere", "lorem", "ipsum", "dolor", 376 | "sit", "amet,", "consectetur", "adipiscing", "elit", "duis", "tristique", 377 | "sollicitudin", "nibh", "sit", "amet", "commodo", "nulla", "facilisi", 378 | "nullam", "vehicula", "ipsum", "a", "arcu", "cursus", "vitae", "congue", 379 | "mauris", "rhoncus", "aenean", "vel", "elit", "scelerisque", "mauris", 380 | "pellentesque", "pulvinar", "pellentesque", "habitant", "morbi", "tristique", 381 | "senectus", "et", "netus", "et", "malesuada", "fames", "ac", "turpis", 382 | "egestas", "maecenas", "pharetra", "convallis", "posuere", "morbi", "leo", 383 | "urna,", "molestie", "at", "elementum", "eu,", "facilisis", "sed", "odio", 384 | "morbi", "quis", "commodo", "odio", "aenean", "sed", "adipiscing", "diam", 385 | "donec", "adipiscing", "tristique", "risus", "nec", "feugiat", "in", 386 | "fermentum", "posuere", "urna", "nec", "tincidunt", "praesent", "semper", 387 | "feugiat", "nibh", "sed", "pulvinar", "proin", "gravida", "hendrerit", 388 | "lectus", "a", "molestie", "gravida", "dictum" 389 | ] 390 | } 391 | 392 | },{}]},{},[1]) 393 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlcyI6WyIvaG9tZS9qYWtlL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvaG9tZS9qYWtlL2NvZGUvdnVlLXBsYWNlaG9sZGVycy9zcmMvaW5kZXguanMiLCIvaG9tZS9qYWtlL2NvZGUvdnVlLXBsYWNlaG9sZGVycy9zcmMvdnVlLXBsYWNlaG9sZGVycy1pbWFnZS5qcyIsIi9ob21lL2pha2UvY29kZS92dWUtcGxhY2Vob2xkZXJzL3NyYy92dWUtcGxhY2Vob2xkZXJzLXRleHQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIil9dmFyIGY9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGYuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sZixmLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4gKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3JcbiAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1NcbiAqIElOIFRIRSBTT0ZUV0FSRS5cbiAqL1xuLyoqXG4qIEJhc2VkIGVudGlyZWx5IG9uIHRoZSB3b3JrIG9mIEpvc2ggRGF2aWQgTWlsbGVyIChodHRwczovL2dpdGh1Yi5jb20vam9zaGRtaWxsZXIvYW5ndWxhci1wbGFjZWhvbGRlcnMpXG4qIHdoaWNoIGlzIGl0c2VsZiBiYXNlZCwgaW4gcGFydCwgb24gaHR0cHM6Ly9naXRodWIuY29tL2ZrYWRldmVsb3Blci9sb3JlbWpzXG4qIFBvcnRlZCBmcm9tIEFuZ3VsYXJKUyB0byBWdWUuanMgKGh0dHA6Ly92dWVqcy5vcmcvKVxuKiovXG5cblZ1ZS5kaXJlY3RpdmUoJ3BoaW1nJywgcmVxdWlyZSgnLi92dWUtcGxhY2Vob2xkZXJzLWltYWdlJykpXG5WdWUuZGlyZWN0aXZlKCdwaHR4dCcsIHJlcXVpcmUoJy4vdnVlLXBsYWNlaG9sZGVycy10ZXh0JykpXG4iLCIvKmpzaGludCBhc2k6IHRydWUqL1xuLyoqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICogSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qKlxuKiBCYXNlZCBlbnRpcmVseSBvbiB0aGUgd29yayBvZiBKb3NoIERhdmlkIE1pbGxlciAoaHR0cHM6Ly9naXRodWIuY29tL2pvc2hkbWlsbGVyL2FuZ3VsYXItcGxhY2Vob2xkZXJzKVxuKiBQb3J0ZWQgZnJvbSBBbmd1bGFySlMgdG8gVnVlLmpzIChodHRwOi8vdnVlanMub3JnLylcbioqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICBiaW5kOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmNvbmZpZyAgPSB7XG4gICAgICB0ZXh0X3NpemU6IDEwLFxuICAgICAgZmlsbF9jb2xvcjogJyNFRUVFRUUnLFxuICAgICAgdGV4dF9jb2xvcjogJyNBQUFBQUEnXG4gICAgfVxuICB9LFxuICBcbiAgdXBkYXRlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgdmFsICAgICA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogdGhpcy5rZXksXG4gICAgICAgIGVsICAgICAgPSB0aGlzLmVsLFxuICAgICAgICBtYXRjaGVzID0gdmFsLm1hdGNoKCAvXihcXGQrKXgoXFxkKykkLyApLFxuICAgICAgICBkYXRhVXJsLFxuICAgICAgICBzaXplXG5cbiAgICBpZighbWF0Y2hlcykgcmV0dXJuXG4gICAgXG4gICAgc2l6ZSA9IHsgdzogbWF0Y2hlc1sxXSwgaDogbWF0Y2hlc1syXSB9XG4gICAgZWwuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgdmFsKVxuICAgIGVsLnNldEF0dHJpYnV0ZShcImFsdFwiLCB2YWwpXG5cbiAgICBkYXRhVXJsID0gdGhpcy5kcmF3SW1hZ2UodmFsLCBzaXplKVxuXG4gICAgaWYgKGVsLnRhZ05hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgZGF0YVVybClcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybChcIicgKyBkYXRhVXJsICsgJ1wiKSdcbiAgICB9XG4gIH0sXG5cbiAgZ2V0VGV4dFNpemU6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB2YXIgZGltZW5zaW9uX2FyciA9IFtzaXplLmgsIHNpemUud10uc29ydCgpLFxuICAgICAgICBtYXhGYWN0b3IgICAgID0gTWF0aC5yb3VuZChkaW1lbnNpb25fYXJyWzFdIC8gMTYpXG4gXG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuY29uZmlnLnRleHRfc2l6ZSwgbWF4RmFjdG9yKVxuICB9LFxuXG4gIGRyYXdJbWFnZTogZnVuY3Rpb24odmFsLCBzaXplKSB7XG4gICAgdmFyIGNhbnZhcyAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdjYW52YXMnICksXG4gICAgICAgIGNvbnRleHQgICA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICksXG4gICAgICAgIHRleHRfc2l6ZSA9IHRoaXMuZ2V0VGV4dFNpemUoc2l6ZSksXG4gICAgICAgIGNvbmZpZyAgICA9IHRoaXMuY29uZmlnLFxuICAgICAgICB0ZXh0ICAgICAgPSB2YWxcblxuICAgIGNhbnZhcy53aWR0aCA9IHNpemUud1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzaXplLmhcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGNvbmZpZy5maWxsX2NvbG9yXG4gICAgY29udGV4dC5maWxsUmVjdCggMCwgMCwgc2l6ZS53LCBzaXplLmggKVxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29uZmlnLnRleHRfY29sb3JcbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuICAgIGNvbnRleHQuZm9udCA9ICdib2xkICcrIHRleHRfc2l6ZSArICdwdCBzYW5zLXNlcmlmJ1xuXG4gICAgaWYgKGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGggLyBzaXplLncgPiAxKSB7XG4gICAgICB0ZXh0X3NpemUgPSBjb25maWcudGV4dF9zaXplIC8gKGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGggLyBzaXplLncpXG4gICAgICBjb250ZXh0LmZvbnQgPSAnYm9sZCAnICsgdGV4dF9zaXplICsgJ3B0IHNhbnMtc2VyaWYnXG4gICAgfVxuXG4gICAgY29udGV4dC5maWxsVGV4dCggdGV4dCwgc2l6ZS53IC8gMiwgc2l6ZS5oIC8gMiApXG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIilcbiAgfVxufVxuIiwiLyoqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbiAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICogc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICogSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qKlxuKiBCYXNlZCBlbnRpcmVseSBvbiB0aGUgd29yayBvZiBKb3NoIERhdmlkIE1pbGxlciAoaHR0cHM6Ly9naXRodWIuY29tL2pvc2hkbWlsbGVyL2FuZ3VsYXItcGxhY2Vob2xkZXJzKVxuKiB3aGljaCBpcyBpdHNlbGYgYmFzZWQsIGluIHBhcnQsIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9ma2FkZXZlbG9wZXIvbG9yZW1qc1xuKiBQb3J0ZWQgZnJvbSBBbmd1bGFySlMgdG8gVnVlLmpzIChodHRwOi8vdnVlanMub3JnLylcbioqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICB1cGRhdGU6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gXG4gICAgdmFyIHZhbCAgICAgID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUgOiB0aGlzLmtleSxcbiAgICAgICAgZWwgICAgICAgPSB0aGlzLmVsLFxuICAgICAgICBudW1TZW50ZW5jZXMsXG4gICAgICAgIG51bVBhcmFncmFwaHMsXG4gICAgICAgIHBfbWF0Y2gsXG4gICAgICAgIHNfbWF0Y2hcblxuICAgIHBfbWF0Y2ggPSB2YWwubWF0Y2goIC8oXFxkKylwLyApXG4gICAgc19tYXRjaCA9IHZhbC5tYXRjaCggLyhcXGQrKXMvIClcblxuICAgIGlmICggcF9tYXRjaCAhPT0gbnVsbCkge1xuICAgICAgbnVtUGFyYWdyYXBocyA9IHBhcnNlSW50KCBwX21hdGNoWzFdLCAxMCApXG4gICAgfSBlbHNlIHtcbiAgICAgIG51bVBhcmFncmFwaHMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIHNfbWF0Y2ggIT09IG51bGwgKSB7XG4gICAgICBudW1TZW50ZW5jZXMgPSBwYXJzZUludCggc19tYXRjaFsxXSwgMTAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBudW1TZW50ZW5jZXMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnBvcHVsYXRlKG51bVBhcmFncmFwaHMsIG51bVNlbnRlbmNlcywgZWwpXG4gIH0sXG5cbiAgcG9wdWxhdGU6IGZ1bmN0aW9uKG51bVBhcmFncmFwaHMsIG51bVNlbnRlbmNlcywgZWwpIHtcbiAgICB2YXIgY29udGVudHNcblxuICAgIGlmICggbnVtUGFyYWdyYXBocyB8fCAhbnVtU2VudGVuY2VzICkge1xuICAgICAgY29udGVudHMgPSB0aGlzLmNyZWF0ZVBhcmFncmFwaHMoIG51bVBhcmFncmFwaHMsIG51bVNlbnRlbmNlcyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVTZW50ZW5jZXMoIG51bVNlbnRlbmNlcyApXG4gICAgfVxuICAgIFxuICAgIGVsLmlubmVySFRNTCA9ICBjb250ZW50cyBcbiAgfSxcblxuICByYW5kb21JbnQ6IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW5cbiAgfSxcblxuICBjcmVhdGVTZW50ZW5jZTogZnVuY3Rpb24gKHNlbnRlbmNlTGVuZ3RoKSB7XG4gICAgdmFyIHdvcmRJbmRleCxcbiAgICAgICAgc2VudGVuY2VcbiAgICAgICAgIFxuICAgIHNlbnRlbmNlTGVuZ3RoID0gc2VudGVuY2VMZW5ndGggfHwgdGhpcy5yYW5kb21JbnQoIDUsIDIwIClcbiAgICB3b3JkSW5kZXggPSB0aGlzLnJhbmRvbUludCgwLCB0aGlzLndvcmRzLmxlbmd0aCAtIHNlbnRlbmNlTGVuZ3RoIC0gMSlcbiAgICBzZW50ZW5jZSA9IHRoaXMud29yZHMuc2xpY2Uod29yZEluZGV4LCB3b3JkSW5kZXggKyBzZW50ZW5jZUxlbmd0aClcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5yZXBsYWNlKC9cXCwkL2csICcnKSArICcuJ1xuIFxuICAgIHJldHVybiBzZW50ZW5jZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlbnRlbmNlLnNsaWNlKDEpXG4gIH0sXG5cbiAgY3JlYXRlU2VudGVuY2VzOiBmdW5jdGlvbihudW1TZW50ZW5jZXMpIHtcbiAgICB2YXIgc2VudGVuY2VzID0gW11cblxuICAgIG51bVNlbnRlbmNlcyA9IG51bVNlbnRlbmNlcyB8fCB0aGlzLnJhbmRvbUludCggMywgNyApXG4gICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVNlbnRlbmNlczsgaSsrICkge1xuICAgICAgc2VudGVuY2VzLnB1c2godGhpcy5jcmVhdGVTZW50ZW5jZSgpKVxuICAgIH1cblxuICAgIHJldHVybiBzZW50ZW5jZXMuam9pbignICcpXG4gIH0sXG5cbiAgY3JlYXRlUGFyYWdyYXBoOiBmdW5jdGlvbihudW1TZW50ZW5jZXMpIHtcbiAgICB2YXIgc2VudGVuY2VzID0gdGhpcy5jcmVhdGVTZW50ZW5jZXMoIG51bVNlbnRlbmNlcyApXG4gICAgcmV0dXJuIFwiPHA+XCIgKyBzZW50ZW5jZXMgKyBcIjwvcD5cIlxuICB9LFxuXG4gIGNyZWF0ZVBhcmFncmFwaHM6IGZ1bmN0aW9uIChudW1QYXJhZ3JhcGhzLCBudW1TZW50ZW5jZXMpIHtcbiAgICB2YXIgcGFyYWdyYXBocyA9IFtdLFxuICAgICAgICByYW5kb21JbnQgID0gdGhpcy5yYW5kb21JbnRcblxuICAgIG51bVBhcmFncmFwaHMgPSBudW1QYXJhZ3JhcGhzIHx8IHJhbmRvbUludCggMywgNyApXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1QYXJhZ3JhcGhzOyBpKysgKSB7XG4gICAgICBwYXJhZ3JhcGhzLnB1c2goIHRoaXMuY3JlYXRlUGFyYWdyYXBoKCBudW1TZW50ZW5jZXMgKSApXG4gICAgfVxuICAgIFxuICAgIHJldHVybiBwYXJhZ3JhcGhzLmpvaW4oJ1xcbicpXG4gIH0sXG4gXG4gIHdvcmRzOiBbXCJsb3JlbVwiLCBcImlwc3VtXCIsIFwiZG9sb3JcIiwgXCJzaXRcIiwgXCJhbWV0LFwiLCBcImNvbnNlY3RldHVyXCIsIFwiYWRpcGlzY2luZ1wiLFxuICAgIFwiZWxpdFwiLCBcInV0XCIsIFwiYWxpcXVhbSxcIiwgXCJwdXJ1c1wiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJsdWN0dXNcIiwgXCJ2ZW5lbmF0aXMsXCIsXG4gICAgXCJsZWN0dXNcIiwgXCJtYWduYVwiLCBcImZyaW5naWxsYVwiLCBcInVybmEsXCIsIFwicG9ydHRpdG9yXCIsIFwicmhvbmN1c1wiLCBcImRvbG9yXCIsXG4gICAgXCJwdXJ1c1wiLCBcIm5vblwiLCBcImVuaW1cIiwgXCJwcmFlc2VudFwiLCBcImVsZW1lbnR1bVwiLCBcImZhY2lsaXNpc1wiLCBcImxlbyxcIiwgXCJ2ZWxcIixcbiAgICBcImZyaW5naWxsYVwiLCBcImVzdFwiLCBcInVsbGFtY29ycGVyXCIsIFwiZWdldFwiLCBcIm51bGxhXCIsIFwiZmFjaWxpc2lcIiwgXCJldGlhbVwiLFxuICAgIFwiZGlnbmlzc2ltXCIsIFwiZGlhbVwiLCBcInF1aXNcIiwgXCJlbmltXCIsIFwibG9ib3J0aXNcIiwgXCJzY2VsZXJpc3F1ZVwiLCBcImZlcm1lbnR1bVwiLFxuICAgIFwiZHVpXCIsIFwiZmF1Y2lidXNcIiwgXCJpblwiLCBcIm9ybmFyZVwiLCBcInF1YW1cIiwgXCJ2aXZlcnJhXCIsIFwib3JjaVwiLCBcInNhZ2l0dGlzXCIsIFwiZXVcIixcbiAgICBcInZvbHV0cGF0XCIsIFwib2Rpb1wiLCBcImZhY2lsaXNpc1wiLCBcIm1hdXJpc1wiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJtYXNzYVwiLCBcInZpdGFlXCIsXG4gICAgXCJ0b3J0b3JcIiwgXCJjb25kaW1lbnR1bVwiLCBcImxhY2luaWFcIiwgXCJxdWlzXCIsIFwidmVsXCIsIFwiZXJvc1wiLCBcImRvbmVjXCIsIFwiYWNcIixcbiAgICBcIm9kaW9cIiwgXCJ0ZW1wb3JcIiwgXCJvcmNpXCIsIFwiZGFwaWJ1c1wiLCBcInVsdHJpY2VzXCIsIFwiaW5cIiwgXCJpYWN1bGlzXCIsIFwibnVuY1wiLFxuICAgIFwic2VkXCIsIFwiYXVndWVcIiwgXCJsYWN1cyxcIiwgXCJ2aXZlcnJhXCIsIFwidml0YWVcIiwgXCJjb25ndWVcIiwgXCJldSxcIiwgXCJjb25zZXF1YXRcIixcbiAgICBcImFjXCIsIFwiZmVsaXNcIiwgXCJkb25lY1wiLCBcImV0XCIsIFwib2Rpb1wiLCBcInBlbGxlbnRlc3F1ZVwiLCBcImRpYW1cIiwgXCJ2b2x1dHBhdFwiLFxuICAgIFwiY29tbW9kb1wiLCBcInNlZFwiLCBcImVnZXN0YXNcIiwgXCJlZ2VzdGFzXCIsIFwiZnJpbmdpbGxhXCIsIFwicGhhc2VsbHVzXCIsIFwiZmF1Y2lidXNcIixcbiAgICBcInNjZWxlcmlzcXVlXCIsIFwiZWxlaWZlbmRcIiwgXCJkb25lY1wiLCBcInByZXRpdW1cIiwgXCJ2dWxwdXRhdGVcIiwgXCJzYXBpZW5cIiwgXCJuZWNcIixcbiAgICBcInNhZ2l0dGlzXCIsIFwiYWxpcXVhbVwiLCBcIm1hbGVzdWFkYVwiLCBcImJpYmVuZHVtXCIsIFwiYXJjdVwiLCBcInZpdGFlXCIsIFwiZWxlbWVudHVtXCIsXG4gICAgXCJjdXJhYml0dXJcIiwgXCJ2aXRhZVwiLCBcIm51bmNcIiwgXCJzZWRcIiwgXCJ2ZWxpdFwiLCBcImRpZ25pc3NpbVwiLCBcInNvZGFsZXNcIiwgXCJ1dFwiLFxuICAgIFwiZXVcIiwgXCJzZW1cIiwgXCJpbnRlZ2VyXCIsIFwidml0YWVcIiwgXCJqdXN0b1wiLCBcImVnZXRcIiwgXCJtYWduYVwiLCBcImZlcm1lbnR1bVwiLFxuICAgIFwiaWFjdWxpc1wiLCBcImV1XCIsIFwibm9uXCIsIFwiZGlhbVwiLCBcInBoYXNlbGx1c1wiLCBcInZlc3RpYnVsdW1cIiwgXCJsb3JlbVwiLCBcInNlZFwiLFxuICAgIFwicmlzdXNcIiwgXCJ1bHRyaWNpZXNcIiwgXCJ0cmlzdGlxdWVcIiwgXCJudWxsYVwiLCBcImFsaXF1ZXRcIiwgXCJlbmltXCIsIFwidG9ydG9yLFwiLCBcImF0XCIsXG4gICAgXCJhdWN0b3JcIiwgXCJ1cm5hXCIsIFwibnVuY1wiLCBcImlkXCIsIFwiY3Vyc3VzXCIsIFwibWV0dXNcIiwgXCJhbGlxdWFtXCIsIFwiZWxlaWZlbmRcIiwgXCJtaVwiLFxuICAgIFwiaW5cIiwgXCJudWxsYVwiLCBcInBvc3VlcmVcIiwgXCJzb2xsaWNpdHVkaW5cIiwgXCJhbGlxdWFtXCIsIFwidWx0cmljZXNcIiwgXCJzYWdpdHRpc1wiLFxuICAgIFwib3JjaSxcIiwgXCJhXCIsIFwic2NlbGVyaXNxdWVcIiwgXCJwdXJ1c1wiLCBcInNlbXBlclwiLCBcImVnZXRcIiwgXCJkdWlzXCIsIFwiYXRcIiwgXCJ0ZWxsdXNcIixcbiAgICBcImF0XCIsIFwidXJuYVwiLCBcImNvbmRpbWVudHVtXCIsIFwibWF0dGlzXCIsIFwicGVsbGVudGVzcXVlXCIsIFwiaWRcIiwgXCJuaWJoXCIsIFwidG9ydG9yLFwiLFxuICAgIFwiaWRcIiwgXCJhbGlxdWV0XCIsIFwibGVjdHVzXCIsIFwicHJvaW5cIiwgXCJuaWJoXCIsIFwibmlzbCxcIiwgXCJjb25kaW1lbnR1bVwiLCBcImlkXCIsXG4gICAgXCJ2ZW5lbmF0aXNcIiwgXCJhLFwiLCBcImNvbmRpbWVudHVtXCIsIFwidml0YWVcIiwgXCJzYXBpZW5cIiwgXCJwZWxsZW50ZXNxdWVcIixcbiAgICBcImhhYml0YW50XCIsIFwibW9yYmlcIiwgXCJ0cmlzdGlxdWVcIiwgXCJzZW5lY3R1c1wiLCBcImV0XCIsIFwibmV0dXNcIiwgXCJldFwiLCBcIm1hbGVzdWFkYVwiLFxuICAgIFwiZmFtZXNcIiwgXCJhY1wiLCBcInR1cnBpc1wiLCBcImVnZXN0YXNcIiwgXCJzZWRcIiwgXCJ0ZW1wdXMsXCIsIFwidXJuYVwiLCBcImV0XCIsIFwicGhhcmV0cmFcIixcbiAgICBcInBoYXJldHJhLFwiLCBcIm1hc3NhXCIsIFwibWFzc2FcIiwgXCJ1bHRyaWNpZXNcIiwgXCJtaSxcIiwgXCJxdWlzXCIsIFwiaGVuZHJlcml0XCIsXG4gICAgXCJkb2xvclwiLCBcIm1hZ25hXCIsIFwiZWdldFwiLCBcImVzdFwiLCBcImxvcmVtXCIsIFwiaXBzdW1cIiwgXCJkb2xvclwiLCBcInNpdFwiLCBcImFtZXQsXCIsXG4gICAgXCJjb25zZWN0ZXR1clwiLCBcImFkaXBpc2NpbmdcIiwgXCJlbGl0XCIsIFwicGVsbGVudGVzcXVlXCIsIFwiaGFiaXRhbnRcIiwgXCJtb3JiaVwiLFxuICAgIFwidHJpc3RpcXVlXCIsIFwic2VuZWN0dXNcIiwgXCJldFwiLCBcIm5ldHVzXCIsIFwiZXRcIiwgXCJtYWxlc3VhZGFcIiwgXCJmYW1lc1wiLCBcImFjXCIsXG4gICAgXCJ0dXJwaXNcIiwgXCJlZ2VzdGFzXCIsIFwiaW50ZWdlclwiLCBcImVnZXRcIiwgXCJhbGlxdWV0XCIsIFwibmliaFwiLCBcInByYWVzZW50XCIsXG4gICAgXCJ0cmlzdGlxdWVcIiwgXCJtYWduYVwiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJwdXJ1c1wiLCBcImdyYXZpZGFcIiwgXCJxdWlzXCIsIFwiYmxhbmRpdFwiLFxuICAgIFwidHVycGlzXCIsIFwiY3Vyc3VzXCIsIFwiaW5cIiwgXCJoYWNcIiwgXCJoYWJpdGFzc2VcIiwgXCJwbGF0ZWFcIiwgXCJkaWN0dW1zdFwiLCBcInF1aXNxdWVcIixcbiAgICBcInNhZ2l0dGlzLFwiLCBcInB1cnVzXCIsIFwic2l0XCIsIFwiYW1ldFwiLCBcInZvbHV0cGF0XCIsIFwiY29uc2VxdWF0LFwiLCBcIm1hdXJpc1wiLFxuICAgIFwibnVuY1wiLCBcImNvbmd1ZVwiLCBcIm5pc2ksXCIsIFwidml0YWVcIiwgXCJzdXNjaXBpdFwiLCBcInRlbGx1c1wiLCBcIm1hdXJpc1wiLCBcImFcIixcbiAgICBcImRpYW1cIiwgXCJtYWVjZW5hc1wiLCBcInNlZFwiLCBcImVuaW1cIiwgXCJ1dFwiLCBcInNlbVwiLCBcInZpdmVycmFcIiwgXCJhbGlxdWV0XCIsIFwiZWdldFwiLFxuICAgIFwic2l0XCIsIFwiYW1ldFwiLCBcInRlbGx1c1wiLCBcImNyYXNcIiwgXCJhZGlwaXNjaW5nXCIsIFwiZW5pbVwiLCBcImV1XCIsIFwidHVycGlzXCIsXG4gICAgXCJlZ2VzdGFzXCIsIFwicHJldGl1bVwiLCBcImFlbmVhblwiLCBcInBoYXJldHJhLFwiLCBcIm1hZ25hXCIsIFwiYWNcIiwgXCJwbGFjZXJhdFwiLFxuICAgIFwidmVzdGlidWx1bSxcIiwgXCJsZWN0dXNcIiwgXCJtYXVyaXNcIiwgXCJ1bHRyaWNlc1wiLCBcImVyb3MsXCIsIFwiaW5cIiwgXCJjdXJzdXNcIixcbiAgICBcInR1cnBpc1wiLCBcIm1hc3NhXCIsIFwidGluY2lkdW50XCIsIFwiZHVpXCIsIFwidXRcIiwgXCJvcm5hcmVcIiwgXCJsZWN0dXNcIiwgXCJzaXRcIiwgXCJhbWV0XCIsXG4gICAgXCJlc3RcIiwgXCJwbGFjZXJhdFwiLCBcImluXCIsIFwiZWdlc3Rhc1wiLCBcImVyYXRcIiwgXCJpbXBlcmRpZXRcIiwgXCJzZWRcIiwgXCJldWlzbW9kXCIsXG4gICAgXCJuaXNpXCIsIFwicG9ydGFcIiwgXCJsb3JlbVwiLCBcIm1vbGxpc1wiLCBcImFsaXF1YW1cIiwgXCJ1dFwiLCBcInBvcnR0aXRvclwiLCBcImxlb1wiLCBcImFcIixcbiAgICBcImRpYW1cIiwgXCJzb2xsaWNpdHVkaW5cIiwgXCJ0ZW1wb3JcIiwgXCJpZFwiLCBcImV1XCIsIFwibmlzbFwiLCBcIm51bmNcIiwgXCJtaVwiLCBcImlwc3VtLFwiLFxuICAgIFwiZmF1Y2lidXNcIiwgXCJ2aXRhZVwiLCBcImFsaXF1ZXRcIiwgXCJuZWMsXCIsIFwidWxsYW1jb3JwZXJcIiwgXCJzaXRcIiwgXCJhbWV0XCIsIFwicmlzdXNcIixcbiAgICBcIm51bGxhbVwiLCBcImVnZXRcIiwgXCJmZWxpc1wiLCBcImVnZXRcIiwgXCJudW5jXCIsIFwibG9ib3J0aXNcIiwgXCJtYXR0aXNcIiwgXCJhbGlxdWFtXCIsXG4gICAgXCJmYXVjaWJ1c1wiLCBcInB1cnVzXCIsIFwiaW5cIiwgXCJtYXNzYVwiLCBcInRlbXBvclwiLCBcIm5lY1wiLCBcImZldWdpYXRcIiwgXCJuaXNsXCIsXG4gICAgXCJwcmV0aXVtXCIsIFwiZnVzY2VcIiwgXCJpZFwiLCBcInZlbGl0XCIsIFwidXRcIiwgXCJ0b3J0b3JcIiwgXCJwcmV0aXVtXCIsIFwidml2ZXJyYVwiLFxuICAgIFwic3VzcGVuZGlzc2VcIiwgXCJwb3RlbnRpXCIsIFwibnVsbGFtXCIsIFwiYWNcIiwgXCJ0b3J0b3JcIiwgXCJ2aXRhZVwiLCBcInB1cnVzXCIsXG4gICAgXCJmYXVjaWJ1c1wiLCBcIm9ybmFyZVwiLCBcInN1c3BlbmRpc3NlXCIsIFwic2VkXCIsIFwibmlzaVwiLCBcImxhY3VzLFwiLCBcInNlZFwiLCBcInZpdmVycmFcIixcbiAgICBcInRlbGx1c1wiLCBcImluXCIsIFwiaGFjXCIsIFwiaGFiaXRhc3NlXCIsIFwicGxhdGVhXCIsIFwiZGljdHVtc3RcIiwgXCJ2ZXN0aWJ1bHVtXCIsXG4gICAgXCJyaG9uY3VzXCIsIFwiZXN0XCIsIFwicGVsbGVudGVzcXVlXCIsIFwiZWxpdFwiLCBcInVsbGFtY29ycGVyXCIsIFwiZGlnbmlzc2ltXCIsIFwiY3Jhc1wiLFxuICAgIFwidGluY2lkdW50XCIsIFwibG9ib3J0aXNcIiwgXCJmZXVnaWF0XCIsIFwidml2YW11c1wiLCBcImF0XCIsIFwiYXVndWVcIiwgXCJlZ2V0XCIsIFwiYXJjdVwiLFxuICAgIFwiZGljdHVtXCIsIFwidmFyaXVzXCIsIFwiZHVpc1wiLCBcImF0XCIsIFwiY29uc2VjdGV0dXJcIiwgXCJsb3JlbVwiLCBcImRvbmVjXCIsIFwibWFzc2FcIixcbiAgICBcInNhcGllbixcIiwgXCJmYXVjaWJ1c1wiLCBcImV0XCIsIFwibW9sZXN0aWVcIiwgXCJhYyxcIiwgXCJmZXVnaWF0XCIsIFwic2VkXCIsIFwibGVjdHVzXCIsXG4gICAgXCJ2ZXN0aWJ1bHVtXCIsIFwibWF0dGlzXCIsIFwidWxsYW1jb3JwZXJcIiwgXCJ2ZWxpdFwiLCBcInNlZFwiLCBcInVsbGFtY29ycGVyXCIsIFwibW9yYmlcIixcbiAgICBcInRpbmNpZHVudFwiLCBcIm9ybmFyZVwiLCBcIm1hc3NhLFwiLCBcImVnZXRcIiwgXCJlZ2VzdGFzXCIsIFwicHVydXNcIiwgXCJ2aXZlcnJhXCIsXG4gICAgXCJhY2N1bXNhblwiLCBcImluXCIsIFwibmlzbFwiLCBcIm5pc2ksXCIsIFwic2NlbGVyaXNxdWVcIiwgXCJldVwiLCBcInVsdHJpY2VzXCIsIFwidml0YWUsXCIsXG4gICAgXCJhdWN0b3JcIiwgXCJldVwiLCBcImF1Z3VlXCIsIFwidXRcIiwgXCJsZWN0dXNcIiwgXCJhcmN1LFwiLCBcImJpYmVuZHVtXCIsIFwiYXRcIiwgXCJ2YXJpdXNcIixcbiAgICBcInZlbCxcIiwgXCJwaGFyZXRyYVwiLCBcInZlbFwiLCBcInR1cnBpc1wiLCBcIm51bmNcIiwgXCJlZ2V0XCIsIFwibG9yZW1cIiwgXCJkb2xvcixcIiwgXCJzZWRcIixcbiAgICBcInZpdmVycmFcIiwgXCJpcHN1bVwiLCBcIm51bmNcIiwgXCJhbGlxdWV0XCIsIFwiYmliZW5kdW1cIiwgXCJlbmltLFwiLCBcImZhY2lsaXNpc1wiLFxuICAgIFwiZ3JhdmlkYVwiLCBcIm5lcXVlXCIsIFwiY29udmFsbGlzXCIsIFwiYVwiLCBcImNyYXNcIiwgXCJzZW1wZXJcIiwgXCJhdWN0b3JcIiwgXCJuZXF1ZSxcIixcbiAgICBcInZpdGFlXCIsIFwidGVtcHVzXCIsIFwicXVhbVwiLCBcInBlbGxlbnRlc3F1ZVwiLCBcIm5lY1wiLCBcIm5hbVwiLCBcImFsaXF1YW1cIiwgXCJzZW1cIixcbiAgICBcImV0XCIsIFwidG9ydG9yXCIsIFwiY29uc2VxdWF0XCIsIFwiaWRcIiwgXCJwb3J0YVwiLCBcIm5pYmhcIiwgXCJ2ZW5lbmF0aXNcIiwgXCJjcmFzXCIsIFwic2VkXCIsXG4gICAgXCJmZWxpc1wiLCBcImVnZXRcIiwgXCJ2ZWxpdFwiLCBcImFsaXF1ZXRcIiwgXCJzYWdpdHRpc1wiLCBcImlkXCIsIFwiY29uc2VjdGV0dXJcIiwgXCJwdXJ1c1wiLFxuICAgIFwidXRcIiwgXCJmYXVjaWJ1c1wiLCBcInB1bHZpbmFyXCIsIFwiZWxlbWVudHVtXCIsIFwiaW50ZWdlclwiLCBcImVuaW1cIiwgXCJuZXF1ZSxcIixcbiAgICBcInZvbHV0cGF0XCIsIFwiYWNcIiwgXCJ0aW5jaWR1bnRcIiwgXCJ2aXRhZSxcIiwgXCJzZW1wZXJcIiwgXCJxdWlzXCIsIFwibGVjdHVzXCIsIFwibnVsbGFcIixcbiAgICBcImF0XCIsIFwidm9sdXRwYXRcIiwgXCJkaWFtXCIsIFwidXRcIiwgXCJ2ZW5lbmF0aXNcIiwgXCJ0ZWxsdXNcIiwgXCJpblwiLCBcIm1ldHVzXCIsXG4gICAgXCJ2dWxwdXRhdGVcIiwgXCJldVwiLCBcInNjZWxlcmlzcXVlXCIsIFwiZmVsaXNcIiwgXCJpbXBlcmRpZXRcIiwgXCJwcm9pblwiLCBcImZlcm1lbnR1bVwiLFxuICAgIFwibGVvXCIsIFwidmVsXCIsIFwib3JjaVwiLCBcInBvcnRhXCIsIFwibm9uXCIsIFwicHVsdmluYXJcIiwgXCJuZXF1ZVwiLCBcImxhb3JlZXRcIixcbiAgICBcInN1c3BlbmRpc3NlXCIsIFwiaW50ZXJkdW1cIiwgXCJjb25zZWN0ZXR1clwiLCBcImxpYmVybyxcIiwgXCJpZFwiLCBcImZhdWNpYnVzXCIsIFwibmlzbFwiLFxuICAgIFwidGluY2lkdW50XCIsIFwiZWdldFwiLCBcIm51bGxhbVwiLCBcIm5vblwiLCBcIm5pc2lcIiwgXCJlc3QsXCIsIFwic2l0XCIsIFwiYW1ldFwiLFxuICAgIFwiZmFjaWxpc2lzXCIsIFwibWFnbmFcIiwgXCJldGlhbVwiLCBcInRlbXBvcixcIiwgXCJvcmNpXCIsIFwiZXVcIiwgXCJsb2JvcnRpc1wiLFxuICAgIFwiZWxlbWVudHVtLFwiLCBcIm5pYmhcIiwgXCJ0ZWxsdXNcIiwgXCJtb2xlc3RpZVwiLCBcIm51bmMsXCIsIFwibm9uXCIsIFwiYmxhbmRpdFwiLCBcIm1hc3NhXCIsXG4gICAgXCJlbmltXCIsIFwibmVjXCIsIFwiZHVpXCIsIFwibnVuY1wiLCBcIm1hdHRpc1wiLCBcImVuaW1cIiwgXCJ1dFwiLCBcInRlbGx1c1wiLCBcImVsZW1lbnR1bVwiLFxuICAgIFwic2FnaXR0aXNcIiwgXCJ2aXRhZVwiLCBcImV0XCIsIFwibGVvXCIsIFwiZHVpc1wiLCBcInV0XCIsIFwiZGlhbVwiLCBcInF1YW1cIiwgXCJudWxsYVwiLFxuICAgIFwicG9ydHRpdG9yXCIsIFwibWFzc2FcIiwgXCJpZFwiLCBcIm5lcXVlXCIsIFwiYWxpcXVhbVwiLCBcInZlc3RpYnVsdW1cIiwgXCJtb3JiaVwiLFxuICAgIFwiYmxhbmRpdFwiLCBcImN1cnN1c1wiLCBcInJpc3VzLFwiLCBcImF0XCIsIFwidWx0cmljZXNcIiwgXCJtaVwiLCBcInRlbXB1c1wiLCBcImltcGVyZGlldFwiLFxuICAgIFwibnVsbGFcIiwgXCJtYWxlc3VhZGFcIiwgXCJwZWxsZW50ZXNxdWVcIiwgXCJlbGl0XCIsIFwiZWdldFwiLCBcImdyYXZpZGFcIiwgXCJjdW1cIixcbiAgICBcInNvY2lpc1wiLCBcIm5hdG9xdWVcIiwgXCJwZW5hdGlidXNcIiwgXCJldFwiLCBcIm1hZ25pc1wiLCBcImRpc1wiLCBcInBhcnR1cmllbnRcIixcbiAgICBcIm1vbnRlcyxcIiwgXCJuYXNjZXR1clwiLCBcInJpZGljdWx1c1wiLCBcIm11c1wiLCBcIm1hdXJpc1wiLCBcInZpdGFlXCIsIFwidWx0cmljaWVzXCIsXG4gICAgXCJsZW9cIiwgXCJpbnRlZ2VyXCIsIFwibWFsZXN1YWRhXCIsIFwibnVuY1wiLCBcInZlbFwiLCBcInJpc3VzXCIsIFwiY29tbW9kb1wiLCBcInZpdmVycmFcIixcbiAgICBcIm1hZWNlbmFzXCIsIFwiYWNjdW1zYW4sXCIsIFwibGFjdXNcIiwgXCJ2ZWxcIiwgXCJmYWNpbGlzaXNcIiwgXCJ2b2x1dHBhdCxcIiwgXCJlc3RcIixcbiAgICBcInZlbGl0XCIsIFwiZWdlc3Rhc1wiLCBcImR1aSxcIiwgXCJpZFwiLCBcIm9ybmFyZVwiLCBcImFyY3VcIiwgXCJvZGlvXCIsIFwidXRcIiwgXCJzZW1cIixcbiAgICBcIm51bGxhXCIsIFwicGhhcmV0cmFcIiwgXCJkaWFtXCIsIFwic2l0XCIsIFwiYW1ldFwiLCBcIm5pc2xcIiwgXCJzdXNjaXBpdFwiLCBcImFkaXBpc2NpbmdcIixcbiAgICBcImJpYmVuZHVtXCIsIFwiZXN0XCIsIFwidWx0cmljaWVzXCIsIFwiaW50ZWdlclwiLCBcInF1aXNcIiwgXCJhdWN0b3JcIiwgXCJlbGl0XCIsIFwic2VkXCIsXG4gICAgXCJ2dWxwdXRhdGVcIiwgXCJtaVwiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJtYXVyaXNcIiwgXCJjb21tb2RvXCIsIFwicXVpc1wiLCBcImltcGVyZGlldFwiLFxuICAgIFwibWFzc2FcIiwgXCJ0aW5jaWR1bnRcIiwgXCJudW5jXCIsIFwicHVsdmluYXJcIiwgXCJzYXBpZW5cIiwgXCJldFwiLCBcImxpZ3VsYVwiLFxuICAgIFwidWxsYW1jb3JwZXJcIiwgXCJtYWxlc3VhZGFcIiwgXCJwcm9pblwiLCBcImxpYmVyb1wiLCBcIm51bmMsXCIsIFwiY29uc2VxdWF0XCIsXG4gICAgXCJpbnRlcmR1bVwiLCBcInZhcml1c1wiLCBcInNpdFwiLCBcImFtZXQsXCIsIFwibWF0dGlzXCIsIFwidnVscHV0YXRlXCIsIFwiZW5pbVwiLCBcIm51bGxhXCIsXG4gICAgXCJhbGlxdWV0XCIsIFwicG9ydHRpdG9yXCIsIFwibGFjdXMsXCIsIFwibHVjdHVzXCIsIFwiYWNjdW1zYW5cIiwgXCJ0b3J0b3JcIiwgXCJwb3N1ZXJlXCIsXG4gICAgXCJhY1wiLCBcInV0XCIsIFwiY29uc2VxdWF0XCIsIFwic2VtcGVyXCIsIFwidml2ZXJyYVwiLCBcIm5hbVwiLCBcImxpYmVyb1wiLCBcImp1c3RvLFwiLFxuICAgIFwibGFvcmVldFwiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJjdXJzdXNcIiwgXCJzaXRcIiwgXCJhbWV0LFwiLCBcImRpY3R1bVwiLCBcInNpdFwiLCBcImFtZXRcIixcbiAgICBcImp1c3RvXCIsIFwiZG9uZWNcIiwgXCJlbmltXCIsIFwiZGlhbSxcIiwgXCJ2dWxwdXRhdGVcIiwgXCJ1dFwiLCBcInBoYXJldHJhXCIsIFwic2l0XCIsXG4gICAgXCJhbWV0LFwiLCBcImFsaXF1YW1cIiwgXCJpZFwiLCBcImRpYW1cIiwgXCJtYWVjZW5hc1wiLCBcInVsdHJpY2llc1wiLCBcIm1pXCIsIFwiZWdldFwiLFxuICAgIFwibWF1cmlzXCIsIFwicGhhcmV0cmFcIiwgXCJldFwiLCBcInVsdHJpY2VzXCIsIFwibmVxdWVcIiwgXCJvcm5hcmVcIiwgXCJhZW5lYW5cIiwgXCJldWlzbW9kXCIsXG4gICAgXCJlbGVtZW50dW1cIiwgXCJuaXNpLFwiLCBcInF1aXNcIiwgXCJlbGVpZmVuZFwiLCBcInF1YW1cIiwgXCJhZGlwaXNjaW5nXCIsIFwidml0YWVcIixcbiAgICBcInByb2luXCIsIFwic2FnaXR0aXMsXCIsIFwibmlzbFwiLCBcInJob25jdXNcIiwgXCJtYXR0aXNcIiwgXCJyaG9uY3VzLFwiLCBcInVybmFcIiwgXCJuZXF1ZVwiLFxuICAgIFwidml2ZXJyYVwiLCBcImp1c3RvLFwiLCBcIm5lY1wiLCBcInVsdHJpY2VzXCIsIFwiZHVpXCIsIFwic2FwaWVuXCIsIFwiZWdldFwiLCBcIm1pXCIsIFwicHJvaW5cIixcbiAgICBcInNlZFwiLCBcImxpYmVyb1wiLCBcImVuaW0sXCIsIFwic2VkXCIsIFwiZmF1Y2lidXNcIiwgXCJ0dXJwaXNcIiwgXCJpblwiLCBcImV1XCIsIFwibWlcIixcbiAgICBcImJpYmVuZHVtXCIsIFwibmVxdWVcIiwgXCJlZ2VzdGFzXCIsIFwiY29uZ3VlXCIsIFwicXVpc3F1ZVwiLCBcImVnZXN0YXNcIiwgXCJkaWFtXCIsIFwiaW5cIixcbiAgICBcImFyY3VcIiwgXCJjdXJzdXNcIiwgXCJldWlzbW9kXCIsIFwicXVpc1wiLCBcInZpdmVycmFcIiwgXCJuaWJoXCIsIFwiY3Jhc1wiLCBcInB1bHZpbmFyXCIsXG4gICAgXCJtYXR0aXNcIiwgXCJudW5jLFwiLCBcInNlZFwiLCBcImJsYW5kaXRcIiwgXCJsaWJlcm9cIiwgXCJ2b2x1dHBhdFwiLCBcInNlZFwiLCBcImNyYXNcIixcbiAgICBcIm9ybmFyZVwiLCBcImFyY3VcIiwgXCJkdWlcIiwgXCJ2aXZhbXVzXCIsIFwiYXJjdVwiLCBcImZlbGlzLFwiLCBcImJpYmVuZHVtXCIsIFwidXRcIixcbiAgICBcInRyaXN0aXF1ZVwiLCBcImV0LFwiLCBcImVnZXN0YXNcIiwgXCJxdWlzXCIsIFwiaXBzdW1cIiwgXCJzdXNwZW5kaXNzZVwiLCBcInVsdHJpY2VzXCIsXG4gICAgXCJmdXNjZVwiLCBcInV0XCIsIFwicGxhY2VyYXRcIiwgXCJvcmNpXCIsIFwibnVsbGFcIiwgXCJwZWxsZW50ZXNxdWVcIixcbiAgICBcImRpZ25pc3NpbVwiLCBcImVuaW0sXCIsIFwic2l0XCIsIFwiYW1ldFwiLCBcInZlbmVuYXRpc1wiLCBcInVybmFcIiwgXCJjdXJzdXNcIiwgXCJlZ2V0XCIsXG4gICAgXCJudW5jXCIsIFwic2NlbGVyaXNxdWVcIiwgXCJ2aXZlcnJhXCIsIFwibWF1cmlzLFwiLCBcImluXCIsIFwiYWxpcXVhbVwiLCBcInNlbVwiLFxuICAgIFwiZnJpbmdpbGxhXCIsIFwidXRcIiwgXCJtb3JiaVwiLCBcInRpbmNpZHVudFwiLCBcImF1Z3VlXCIsIFwiaW50ZXJkdW1cIiwgXCJ2ZWxpdFwiLFxuICAgIFwiZXVpc21vZFwiLCBcImluXCIsIFwicGVsbGVudGVzcXVlXCIsIFwibWFzc2FcIiwgXCJwbGFjZXJhdFwiLCBcImR1aXNcIiwgXCJ1bHRyaWNpZXNcIixcbiAgICBcImxhY3VzXCIsIFwic2VkXCIsIFwidHVycGlzXCIsIFwidGluY2lkdW50XCIsIFwiaWRcIiwgXCJhbGlxdWV0XCIsIFwicmlzdXNcIiwgXCJmZXVnaWF0XCIsXG4gICAgXCJpblwiLCBcImFudGVcIiwgXCJtZXR1cyxcIiwgXCJkaWN0dW1cIiwgXCJhdFwiLCBcInRlbXBvclwiLCBcImNvbW1vZG8sXCIsIFwidWxsYW1jb3JwZXJcIixcbiAgICBcImFcIiwgXCJsYWN1c1wiLCBcInZlc3RpYnVsdW1cIiwgXCJzZWRcIiwgXCJhcmN1XCIsIFwibm9uXCIsIFwib2Rpb1wiLCBcImV1aXNtb2RcIiwgXCJsYWNpbmlhXCIsXG4gICAgXCJhdFwiLCBcInF1aXNcIiwgXCJyaXN1c1wiLCBcInNlZFwiLCBcInZ1bHB1dGF0ZVwiLCBcIm9kaW9cIiwgXCJ1dFwiLCBcImVuaW1cIiwgXCJibGFuZGl0XCIsXG4gICAgXCJ2b2x1dHBhdFwiLCBcIm1hZWNlbmFzXCIsIFwidm9sdXRwYXRcIiwgXCJibGFuZGl0XCIsIFwiYWxpcXVhbVwiLCBcImV0aWFtXCIsIFwiZXJhdFwiLFxuICAgIFwidmVsaXQsXCIsIFwic2NlbGVyaXNxdWVcIiwgXCJpblwiLCBcImRpY3R1bVwiLCBcIm5vbixcIiwgXCJjb25zZWN0ZXR1clwiLCBcImFcIiwgXCJlcmF0XCIsXG4gICAgXCJuYW1cIiwgXCJhdFwiLCBcImxlY3R1c1wiLCBcInVybmFcIiwgXCJkdWlzXCIsIFwiY29udmFsbGlzXCIsIFwiY29udmFsbGlzXCIsIFwidGVsbHVzLFwiLFxuICAgIFwiaWRcIiwgXCJpbnRlcmR1bVwiLCBcInZlbGl0XCIsIFwibGFvcmVldFwiLCBcImlkXCIsIFwiZG9uZWNcIiwgXCJ1bHRyaWNlc1wiLCBcInRpbmNpZHVudFwiLFxuICAgIFwiYXJjdSxcIiwgXCJub25cIiwgXCJzb2RhbGVzXCIsIFwibmVxdWVcIiwgXCJzb2RhbGVzXCIsIFwidXRcIiwgXCJldGlhbVwiLCBcInNpdFwiLCBcImFtZXRcIixcbiAgICBcIm5pc2xcIiwgXCJwdXJ1cyxcIiwgXCJpblwiLCBcIm1vbGxpc1wiLCBcIm51bmNcIiwgXCJzZWRcIiwgXCJpZFwiLCBcInNlbXBlclwiLCBcInJpc3VzXCIsIFwiaW5cIixcbiAgICBcImhlbmRyZXJpdFwiLCBcImdyYXZpZGFcIiwgXCJydXRydW1cIiwgXCJxdWlzcXVlXCIsIFwibm9uXCIsIFwidGVsbHVzXCIsIFwib3JjaSxcIiwgXCJhY1wiLFxuICAgIFwiYXVjdG9yXCIsIFwiYXVndWVcIiwgXCJtYXVyaXNcIiwgXCJhdWd1ZVwiLCBcIm5lcXVlLFwiLCBcImdyYXZpZGFcIiwgXCJpblwiLCBcImZlcm1lbnR1bVwiLFxuICAgIFwiZXQsXCIsIFwic29sbGljaXR1ZGluXCIsIFwiYWNcIiwgXCJvcmNpXCIsIFwicGhhc2VsbHVzXCIsIFwiZWdlc3Rhc1wiLCBcInRlbGx1c1wiLFxuICAgIFwicnV0cnVtXCIsIFwidGVsbHVzXCIsIFwicGVsbGVudGVzcXVlXCIsIFwiZXVcIiwgXCJ0aW5jaWR1bnRcIiwgXCJ0b3J0b3JcIiwgXCJhbGlxdWFtXCIsXG4gICAgXCJudWxsYVwiLCBcImZhY2lsaXNpXCIsIFwiY3Jhc1wiLCBcImZlcm1lbnR1bSxcIiwgXCJvZGlvXCIsIFwiZXVcIiwgXCJmZXVnaWF0XCIsIFwicHJldGl1bSxcIixcbiAgICBcIm5pYmhcIiwgXCJpcHN1bVwiLCBcImNvbnNlcXVhdFwiLCBcIm5pc2wsXCIsIFwidmVsXCIsIFwicHJldGl1bVwiLCBcImxlY3R1c1wiLCBcInF1YW1cIixcbiAgICBcImlkXCIsIFwibGVvXCIsIFwiaW5cIiwgXCJ2aXRhZVwiLCBcInR1cnBpc1wiLCBcIm1hc3NhXCIsIFwic2VkXCIsIFwiZWxlbWVudHVtXCIsIFwidGVtcHVzXCIsXG4gICAgXCJlZ2VzdGFzXCIsIFwic2VkXCIsIFwic2VkXCIsIFwicmlzdXNcIiwgXCJwcmV0aXVtXCIsIFwicXVhbVwiLCBcInZ1bHB1dGF0ZVwiLCBcImRpZ25pc3NpbVwiLFxuICAgIFwic3VzcGVuZGlzc2VcIiwgXCJpblwiLCBcImVzdFwiLCBcImFudGVcIiwgXCJpblwiLCBcIm5pYmhcIiwgXCJtYXVyaXMsXCIsIFwiY3Vyc3VzXCIsXG4gICAgXCJtYXR0aXNcIiwgXCJtb2xlc3RpZVwiLCBcImEsXCIsIFwiaWFjdWxpc1wiLCBcImF0XCIsIFwiZXJhdFwiLCBcInBlbGxlbnRlc3F1ZVwiLFxuICAgIFwiYWRpcGlzY2luZ1wiLCBcImNvbW1vZG9cIiwgXCJlbGl0LFwiLCBcImF0XCIsIFwiaW1wZXJkaWV0XCIsIFwiZHVpXCIsIFwiYWNjdW1zYW5cIiwgXCJzaXRcIixcbiAgICBcImFtZXRcIiwgXCJudWxsYVwiLCBcImZhY2lsaXNpXCIsIFwibW9yYmlcIiwgXCJ0ZW1wdXNcIiwgXCJpYWN1bGlzXCIsIFwidXJuYSxcIiwgXCJpZFwiLFxuICAgIFwidm9sdXRwYXRcIiwgXCJsYWN1c1wiLCBcImxhb3JlZXRcIiwgXCJub25cIiwgXCJjdXJhYml0dXJcIiwgXCJncmF2aWRhXCIsIFwiYXJjdVwiLCBcImFjXCIsXG4gICAgXCJ0b3J0b3JcIiwgXCJkaWduaXNzaW1cIiwgXCJjb252YWxsaXNcIiwgXCJhZW5lYW5cIiwgXCJldFwiLCBcInRvcnRvclwiLCBcImF0XCIsIFwicmlzdXNcIixcbiAgICBcInZpdmVycmFcIiwgXCJhZGlwaXNjaW5nXCIsIFwiYXRcIiwgXCJpblwiLCBcInRlbGx1c1wiLCBcImludGVnZXJcIiwgXCJmZXVnaWF0XCIsXG4gICAgXCJzY2VsZXJpc3F1ZVwiLCBcInZhcml1c1wiLCBcIm1vcmJpXCIsIFwiZW5pbVwiLCBcIm51bmMsXCIsIFwiZmF1Y2lidXNcIiwgXCJhXCIsXG4gICAgXCJwZWxsZW50ZXNxdWVcIiwgXCJzaXRcIiwgXCJhbWV0LFwiLCBcInBvcnR0aXRvclwiLCBcImVnZXRcIiwgXCJkb2xvclwiLCBcIm1vcmJpXCIsIFwibm9uXCIsXG4gICAgXCJhcmN1XCIsIFwicmlzdXMsXCIsIFwicXVpc1wiLCBcInZhcml1c1wiLCBcInF1YW1cIiwgXCJxdWlzcXVlXCIsIFwiaWRcIiwgXCJkaWFtXCIsIFwidmVsXCIsXG4gICAgXCJxdWFtXCIsIFwiZWxlbWVudHVtXCIsIFwicHVsdmluYXJcIiwgXCJldGlhbVwiLCBcIm5vblwiLCBcInF1YW1cIiwgXCJsYWN1c1wiLFxuICAgIFwic3VzcGVuZGlzc2VcIiwgXCJmYXVjaWJ1c1wiLCBcImludGVyZHVtXCIsIFwicG9zdWVyZVwiLCBcImxvcmVtXCIsIFwiaXBzdW1cIiwgXCJkb2xvclwiLFxuICAgIFwic2l0XCIsIFwiYW1ldCxcIiwgXCJjb25zZWN0ZXR1clwiLCBcImFkaXBpc2NpbmdcIiwgXCJlbGl0XCIsIFwiZHVpc1wiLCBcInRyaXN0aXF1ZVwiLFxuICAgIFwic29sbGljaXR1ZGluXCIsIFwibmliaFwiLCBcInNpdFwiLCBcImFtZXRcIiwgXCJjb21tb2RvXCIsIFwibnVsbGFcIiwgXCJmYWNpbGlzaVwiLFxuICAgIFwibnVsbGFtXCIsIFwidmVoaWN1bGFcIiwgXCJpcHN1bVwiLCBcImFcIiwgXCJhcmN1XCIsIFwiY3Vyc3VzXCIsIFwidml0YWVcIiwgXCJjb25ndWVcIixcbiAgICBcIm1hdXJpc1wiLCBcInJob25jdXNcIiwgXCJhZW5lYW5cIiwgXCJ2ZWxcIiwgXCJlbGl0XCIsIFwic2NlbGVyaXNxdWVcIiwgXCJtYXVyaXNcIixcbiAgICBcInBlbGxlbnRlc3F1ZVwiLCBcInB1bHZpbmFyXCIsIFwicGVsbGVudGVzcXVlXCIsIFwiaGFiaXRhbnRcIiwgXCJtb3JiaVwiLCBcInRyaXN0aXF1ZVwiLFxuICAgIFwic2VuZWN0dXNcIiwgXCJldFwiLCBcIm5ldHVzXCIsIFwiZXRcIiwgXCJtYWxlc3VhZGFcIiwgXCJmYW1lc1wiLCBcImFjXCIsIFwidHVycGlzXCIsXG4gICAgXCJlZ2VzdGFzXCIsIFwibWFlY2VuYXNcIiwgXCJwaGFyZXRyYVwiLCBcImNvbnZhbGxpc1wiLCBcInBvc3VlcmVcIiwgXCJtb3JiaVwiLCBcImxlb1wiLFxuICAgIFwidXJuYSxcIiwgXCJtb2xlc3RpZVwiLCBcImF0XCIsIFwiZWxlbWVudHVtXCIsIFwiZXUsXCIsIFwiZmFjaWxpc2lzXCIsIFwic2VkXCIsIFwib2Rpb1wiLFxuICAgIFwibW9yYmlcIiwgXCJxdWlzXCIsIFwiY29tbW9kb1wiLCBcIm9kaW9cIiwgXCJhZW5lYW5cIiwgXCJzZWRcIiwgXCJhZGlwaXNjaW5nXCIsIFwiZGlhbVwiLFxuICAgIFwiZG9uZWNcIiwgXCJhZGlwaXNjaW5nXCIsIFwidHJpc3RpcXVlXCIsIFwicmlzdXNcIiwgXCJuZWNcIiwgXCJmZXVnaWF0XCIsIFwiaW5cIixcbiAgICBcImZlcm1lbnR1bVwiLCBcInBvc3VlcmVcIiwgXCJ1cm5hXCIsIFwibmVjXCIsIFwidGluY2lkdW50XCIsIFwicHJhZXNlbnRcIiwgXCJzZW1wZXJcIixcbiAgICBcImZldWdpYXRcIiwgXCJuaWJoXCIsIFwic2VkXCIsIFwicHVsdmluYXJcIiwgXCJwcm9pblwiLCBcImdyYXZpZGFcIiwgXCJoZW5kcmVyaXRcIixcbiAgICBcImxlY3R1c1wiLCBcImFcIiwgXCJtb2xlc3RpZVwiLCBcImdyYXZpZGFcIiwgXCJkaWN0dW1cIlxuICBdXG59XG4iXX0= 394 | -------------------------------------------------------------------------------- /dist/vue-placeholders.min.js: -------------------------------------------------------------------------------- 1 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o1){text_size=config.text_size/(context.measureText(text).width/size.w);context.font="bold "+text_size+"pt sans-serif"}context.fillText(text,size.w/2,size.h/2);return canvas.toDataURL("image/png")}}},{}],3:[function(require,module,exports){module.exports={update:function(value){var val=this.value?this.value:this.key,el=this.el,numSentences,numParagraphs,p_match,s_match;p_match=val.match(/(\d+)p/);s_match=val.match(/(\d+)s/);if(p_match!==null){numParagraphs=parseInt(p_match[1],10)}else{numParagraphs=false}if(s_match!==null){numSentences=parseInt(s_match[1],10)}else{numSentences=false}this.populate(numParagraphs,numSentences,el)},populate:function(numParagraphs,numSentences,el){var contents;if(numParagraphs||!numSentences){contents=this.createParagraphs(numParagraphs,numSentences)}else{contents=this.createSentences(numSentences)}el.innerHTML=contents},randomInt:function(min,max){return Math.floor(Math.random()*(max-min+1))+min},createSentence:function(sentenceLength){var wordIndex,sentence;sentenceLength=sentenceLength||this.randomInt(5,20);wordIndex=this.randomInt(0,this.words.length-sentenceLength-1);sentence=this.words.slice(wordIndex,wordIndex+sentenceLength).join(" ").replace(/\,$/g,"")+".";return sentence.charAt(0).toUpperCase()+sentence.slice(1)},createSentences:function(numSentences){var sentences=[];numSentences=numSentences||this.randomInt(3,7);for(var i=0;i"+sentences+"

"},createParagraphs:function(numParagraphs,numSentences){var paragraphs=[],randomInt=this.randomInt;numParagraphs=numParagraphs||randomInt(3,7);for(var i=0;i 2 | 3 | 4 | 5 | 6 | 7 | Vue Placeholdes 8 | 11 | 12 | 13 |
14 | 15 |
16 |
17 | 18 | 19 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-placeholders", 3 | "version": "0.1.0", 4 | "author": { 5 | "name": "lithiumjake", 6 | "email": "lithiumjake@mail.com", 7 | "url": "lithiumjake.github.io" 8 | }, 9 | "license": "MIT", 10 | "description": "Vue directive for easy lorem-ipsum text and place-holder images", 11 | "keywords": [ 12 | "Vue", 13 | "lorem-ipsum" 14 | ], 15 | "main": "dist/vue-placeholders.js", 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/lithiumjake/vue-placeholders.git" 19 | }, 20 | "bugs": "https://github.com/lithiummjake/vue-placeholders/issues", 21 | "homepage": "https://github.com/lithiumjake/vue-placeholders", 22 | "devDependencies": { 23 | "testem": "*", 24 | "mocha": "*", 25 | "chai": "*", 26 | "sinon": "*", 27 | "sinon-chai": "*", 28 | "browserify": "*", 29 | "watchify": "*", 30 | "uglify-js": "*" 31 | }, 32 | "scripts": { 33 | "test": "node_modules/.bin/testem ci", 34 | "bdd": "node_modules/.bin/testem -g", 35 | "build-debug": "node_modules/.bin/browserify src/index.js -d > dist/vue-placeholders.js", 36 | "build-min": "node_modules/.bin/browserify src/index.js | uglifyjs > dist/vue-placeholders.min.js", 37 | "build": "npm run build-debug && npm run build-min", 38 | "watch": "node_modules/.bin/watchify src/index.js -d -o dist/vue-placeholders.js -v" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /spec/tests.js: -------------------------------------------------------------------------------- 1 | var chai = require("chai"); 2 | var sinon = require("sinon"); 3 | var sinonChai = require("sinon-chai"); 4 | chai.should(); 5 | chai.use(sinonChai); 6 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Permission is hereby granted, free of charge, to any person obtaining a copy 3 | * of this software and associated documentation files (the "Software"), to 4 | * deal in the Software without restriction, including without limitation the 5 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 6 | * sell copies of the Software, and to permit persons to whom the Software is 7 | * furnished to do so, subject to the following conditions: 8 | * 9 | * The above copyright notice and this permission notice shall be included in 10 | * all copies or substantial portions of the Software. 11 | * 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 17 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 18 | * IN THE SOFTWARE. 19 | */ 20 | /** 21 | * Based entirely on the work of Josh David Miller (https://github.com/joshdmiller/angular-placeholders) 22 | * which is itself based, in part, on https://github.com/fkadeveloper/loremjs 23 | * Ported from AngularJS to Vue.js (http://vuejs.org/) 24 | **/ 25 | 26 | Vue.directive('phimg', require('./vue-placeholders-image')) 27 | Vue.directive('phtxt', require('./vue-placeholders-text')) 28 | -------------------------------------------------------------------------------- /src/vue-placeholders-image.js: -------------------------------------------------------------------------------- 1 | /*jshint asi: true*/ 2 | /** 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy 4 | * of this software and associated documentation files (the "Software"), to 5 | * deal in the Software without restriction, including without limitation the 6 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | * sell copies of the Software, and to permit persons to whom the Software is 8 | * furnished to do so, subject to the following conditions: 9 | * 10 | * The above copyright notice and this permission notice shall be included in 11 | * all copies or substantial portions of the Software. 12 | * 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | * IN THE SOFTWARE. 20 | */ 21 | 22 | /** 23 | * Based entirely on the work of Josh David Miller (https://github.com/joshdmiller/angular-placeholders) 24 | * Ported from AngularJS to Vue.js (http://vuejs.org/) 25 | **/ 26 | 27 | module.exports = { 28 | 29 | bind: function() { 30 | this.config = { 31 | text_size: 10, 32 | fill_color: '#EEEEEE', 33 | text_color: '#AAAAAA' 34 | } 35 | }, 36 | 37 | update: function (value) { 38 | var val = this.value ? this.value : this.key, 39 | el = this.el, 40 | matches = val.match( /^(\d+)x(\d+)$/ ), 41 | dataUrl, 42 | size 43 | 44 | if(!matches) return 45 | 46 | size = { w: matches[1], h: matches[2] } 47 | el.setAttribute("title", val) 48 | el.setAttribute("alt", val) 49 | 50 | dataUrl = this.drawImage(val, size) 51 | 52 | if (el.tagName === "IMG") { 53 | el.setAttribute('src', dataUrl) 54 | } else { 55 | el.style.backgroundImage = 'url("' + dataUrl + '")' 56 | } 57 | }, 58 | 59 | getTextSize: function(size) { 60 | var dimension_arr = [size.h, size.w].sort(), 61 | maxFactor = Math.round(dimension_arr[1] / 16) 62 | 63 | return Math.max(this.config.text_size, maxFactor) 64 | }, 65 | 66 | drawImage: function(val, size) { 67 | var canvas = document.createElement( 'canvas' ), 68 | context = canvas.getContext( '2d' ), 69 | text_size = this.getTextSize(size), 70 | config = this.config, 71 | text = val 72 | 73 | canvas.width = size.w 74 | canvas.height = size.h 75 | context.fillStyle = config.fill_color 76 | context.fillRect( 0, 0, size.w, size.h ) 77 | context.fillStyle = config.text_color 78 | context.textAlign = 'center' 79 | context.textBaseline = 'middle' 80 | context.font = 'bold '+ text_size + 'pt sans-serif' 81 | 82 | if (context.measureText(text).width / size.w > 1) { 83 | text_size = config.text_size / (context.measureText(text).width / size.w) 84 | context.font = 'bold ' + text_size + 'pt sans-serif' 85 | } 86 | 87 | context.fillText( text, size.w / 2, size.h / 2 ) 88 | return canvas.toDataURL("image/png") 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/vue-placeholders-text.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Permission is hereby granted, free of charge, to any person obtaining a copy 3 | * of this software and associated documentation files (the "Software"), to 4 | * deal in the Software without restriction, including without limitation the 5 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 6 | * sell copies of the Software, and to permit persons to whom the Software is 7 | * furnished to do so, subject to the following conditions: 8 | * 9 | * The above copyright notice and this permission notice shall be included in 10 | * all copies or substantial portions of the Software. 11 | * 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 15 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 16 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 17 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 18 | * IN THE SOFTWARE. 19 | */ 20 | 21 | /** 22 | * Based entirely on the work of Josh David Miller (https://github.com/joshdmiller/angular-placeholders) 23 | * which is itself based, in part, on https://github.com/fkadeveloper/loremjs 24 | * Ported from AngularJS to Vue.js (http://vuejs.org/) 25 | **/ 26 | 27 | module.exports = { 28 | 29 | update: function(value) { 30 | 31 | var val = this.value ? this.value : this.key, 32 | el = this.el, 33 | numSentences, 34 | numParagraphs, 35 | p_match, 36 | s_match 37 | 38 | p_match = val.match( /(\d+)p/ ) 39 | s_match = val.match( /(\d+)s/ ) 40 | 41 | if ( p_match !== null) { 42 | numParagraphs = parseInt( p_match[1], 10 ) 43 | } else { 44 | numParagraphs = false; 45 | } 46 | 47 | if ( s_match !== null ) { 48 | numSentences = parseInt( s_match[1], 10 ) 49 | } else { 50 | numSentences = false; 51 | } 52 | 53 | this.populate(numParagraphs, numSentences, el) 54 | }, 55 | 56 | populate: function(numParagraphs, numSentences, el) { 57 | var contents 58 | 59 | if ( numParagraphs || !numSentences ) { 60 | contents = this.createParagraphs( numParagraphs, numSentences ) 61 | } else { 62 | contents = this.createSentences( numSentences ) 63 | } 64 | 65 | el.innerHTML = contents 66 | }, 67 | 68 | randomInt: function(min, max) { 69 | return Math.floor(Math.random() * (max - min + 1)) + min 70 | }, 71 | 72 | createSentence: function (sentenceLength) { 73 | var wordIndex, 74 | sentence 75 | 76 | sentenceLength = sentenceLength || this.randomInt( 5, 20 ) 77 | wordIndex = this.randomInt(0, this.words.length - sentenceLength - 1) 78 | sentence = this.words.slice(wordIndex, wordIndex + sentenceLength) 79 | .join(' ') 80 | .replace(/\,$/g, '') + '.' 81 | 82 | return sentence.charAt(0).toUpperCase() + sentence.slice(1) 83 | }, 84 | 85 | createSentences: function(numSentences) { 86 | var sentences = [] 87 | 88 | numSentences = numSentences || this.randomInt( 3, 7 ) 89 | 90 | for (var i = 0; i < numSentences; i++ ) { 91 | sentences.push(this.createSentence()) 92 | } 93 | 94 | return sentences.join(' ') 95 | }, 96 | 97 | createParagraph: function(numSentences) { 98 | var sentences = this.createSentences( numSentences ) 99 | return "

" + sentences + "

" 100 | }, 101 | 102 | createParagraphs: function (numParagraphs, numSentences) { 103 | var paragraphs = [], 104 | randomInt = this.randomInt 105 | 106 | numParagraphs = numParagraphs || randomInt( 3, 7 ) 107 | for (var i = 0; i < numParagraphs; i++ ) { 108 | paragraphs.push( this.createParagraph( numSentences ) ) 109 | } 110 | 111 | return paragraphs.join('\n') 112 | }, 113 | 114 | words: ["lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", 115 | "elit", "ut", "aliquam,", "purus", "sit", "amet", "luctus", "venenatis,", 116 | "lectus", "magna", "fringilla", "urna,", "porttitor", "rhoncus", "dolor", 117 | "purus", "non", "enim", "praesent", "elementum", "facilisis", "leo,", "vel", 118 | "fringilla", "est", "ullamcorper", "eget", "nulla", "facilisi", "etiam", 119 | "dignissim", "diam", "quis", "enim", "lobortis", "scelerisque", "fermentum", 120 | "dui", "faucibus", "in", "ornare", "quam", "viverra", "orci", "sagittis", "eu", 121 | "volutpat", "odio", "facilisis", "mauris", "sit", "amet", "massa", "vitae", 122 | "tortor", "condimentum", "lacinia", "quis", "vel", "eros", "donec", "ac", 123 | "odio", "tempor", "orci", "dapibus", "ultrices", "in", "iaculis", "nunc", 124 | "sed", "augue", "lacus,", "viverra", "vitae", "congue", "eu,", "consequat", 125 | "ac", "felis", "donec", "et", "odio", "pellentesque", "diam", "volutpat", 126 | "commodo", "sed", "egestas", "egestas", "fringilla", "phasellus", "faucibus", 127 | "scelerisque", "eleifend", "donec", "pretium", "vulputate", "sapien", "nec", 128 | "sagittis", "aliquam", "malesuada", "bibendum", "arcu", "vitae", "elementum", 129 | "curabitur", "vitae", "nunc", "sed", "velit", "dignissim", "sodales", "ut", 130 | "eu", "sem", "integer", "vitae", "justo", "eget", "magna", "fermentum", 131 | "iaculis", "eu", "non", "diam", "phasellus", "vestibulum", "lorem", "sed", 132 | "risus", "ultricies", "tristique", "nulla", "aliquet", "enim", "tortor,", "at", 133 | "auctor", "urna", "nunc", "id", "cursus", "metus", "aliquam", "eleifend", "mi", 134 | "in", "nulla", "posuere", "sollicitudin", "aliquam", "ultrices", "sagittis", 135 | "orci,", "a", "scelerisque", "purus", "semper", "eget", "duis", "at", "tellus", 136 | "at", "urna", "condimentum", "mattis", "pellentesque", "id", "nibh", "tortor,", 137 | "id", "aliquet", "lectus", "proin", "nibh", "nisl,", "condimentum", "id", 138 | "venenatis", "a,", "condimentum", "vitae", "sapien", "pellentesque", 139 | "habitant", "morbi", "tristique", "senectus", "et", "netus", "et", "malesuada", 140 | "fames", "ac", "turpis", "egestas", "sed", "tempus,", "urna", "et", "pharetra", 141 | "pharetra,", "massa", "massa", "ultricies", "mi,", "quis", "hendrerit", 142 | "dolor", "magna", "eget", "est", "lorem", "ipsum", "dolor", "sit", "amet,", 143 | "consectetur", "adipiscing", "elit", "pellentesque", "habitant", "morbi", 144 | "tristique", "senectus", "et", "netus", "et", "malesuada", "fames", "ac", 145 | "turpis", "egestas", "integer", "eget", "aliquet", "nibh", "praesent", 146 | "tristique", "magna", "sit", "amet", "purus", "gravida", "quis", "blandit", 147 | "turpis", "cursus", "in", "hac", "habitasse", "platea", "dictumst", "quisque", 148 | "sagittis,", "purus", "sit", "amet", "volutpat", "consequat,", "mauris", 149 | "nunc", "congue", "nisi,", "vitae", "suscipit", "tellus", "mauris", "a", 150 | "diam", "maecenas", "sed", "enim", "ut", "sem", "viverra", "aliquet", "eget", 151 | "sit", "amet", "tellus", "cras", "adipiscing", "enim", "eu", "turpis", 152 | "egestas", "pretium", "aenean", "pharetra,", "magna", "ac", "placerat", 153 | "vestibulum,", "lectus", "mauris", "ultrices", "eros,", "in", "cursus", 154 | "turpis", "massa", "tincidunt", "dui", "ut", "ornare", "lectus", "sit", "amet", 155 | "est", "placerat", "in", "egestas", "erat", "imperdiet", "sed", "euismod", 156 | "nisi", "porta", "lorem", "mollis", "aliquam", "ut", "porttitor", "leo", "a", 157 | "diam", "sollicitudin", "tempor", "id", "eu", "nisl", "nunc", "mi", "ipsum,", 158 | "faucibus", "vitae", "aliquet", "nec,", "ullamcorper", "sit", "amet", "risus", 159 | "nullam", "eget", "felis", "eget", "nunc", "lobortis", "mattis", "aliquam", 160 | "faucibus", "purus", "in", "massa", "tempor", "nec", "feugiat", "nisl", 161 | "pretium", "fusce", "id", "velit", "ut", "tortor", "pretium", "viverra", 162 | "suspendisse", "potenti", "nullam", "ac", "tortor", "vitae", "purus", 163 | "faucibus", "ornare", "suspendisse", "sed", "nisi", "lacus,", "sed", "viverra", 164 | "tellus", "in", "hac", "habitasse", "platea", "dictumst", "vestibulum", 165 | "rhoncus", "est", "pellentesque", "elit", "ullamcorper", "dignissim", "cras", 166 | "tincidunt", "lobortis", "feugiat", "vivamus", "at", "augue", "eget", "arcu", 167 | "dictum", "varius", "duis", "at", "consectetur", "lorem", "donec", "massa", 168 | "sapien,", "faucibus", "et", "molestie", "ac,", "feugiat", "sed", "lectus", 169 | "vestibulum", "mattis", "ullamcorper", "velit", "sed", "ullamcorper", "morbi", 170 | "tincidunt", "ornare", "massa,", "eget", "egestas", "purus", "viverra", 171 | "accumsan", "in", "nisl", "nisi,", "scelerisque", "eu", "ultrices", "vitae,", 172 | "auctor", "eu", "augue", "ut", "lectus", "arcu,", "bibendum", "at", "varius", 173 | "vel,", "pharetra", "vel", "turpis", "nunc", "eget", "lorem", "dolor,", "sed", 174 | "viverra", "ipsum", "nunc", "aliquet", "bibendum", "enim,", "facilisis", 175 | "gravida", "neque", "convallis", "a", "cras", "semper", "auctor", "neque,", 176 | "vitae", "tempus", "quam", "pellentesque", "nec", "nam", "aliquam", "sem", 177 | "et", "tortor", "consequat", "id", "porta", "nibh", "venenatis", "cras", "sed", 178 | "felis", "eget", "velit", "aliquet", "sagittis", "id", "consectetur", "purus", 179 | "ut", "faucibus", "pulvinar", "elementum", "integer", "enim", "neque,", 180 | "volutpat", "ac", "tincidunt", "vitae,", "semper", "quis", "lectus", "nulla", 181 | "at", "volutpat", "diam", "ut", "venenatis", "tellus", "in", "metus", 182 | "vulputate", "eu", "scelerisque", "felis", "imperdiet", "proin", "fermentum", 183 | "leo", "vel", "orci", "porta", "non", "pulvinar", "neque", "laoreet", 184 | "suspendisse", "interdum", "consectetur", "libero,", "id", "faucibus", "nisl", 185 | "tincidunt", "eget", "nullam", "non", "nisi", "est,", "sit", "amet", 186 | "facilisis", "magna", "etiam", "tempor,", "orci", "eu", "lobortis", 187 | "elementum,", "nibh", "tellus", "molestie", "nunc,", "non", "blandit", "massa", 188 | "enim", "nec", "dui", "nunc", "mattis", "enim", "ut", "tellus", "elementum", 189 | "sagittis", "vitae", "et", "leo", "duis", "ut", "diam", "quam", "nulla", 190 | "porttitor", "massa", "id", "neque", "aliquam", "vestibulum", "morbi", 191 | "blandit", "cursus", "risus,", "at", "ultrices", "mi", "tempus", "imperdiet", 192 | "nulla", "malesuada", "pellentesque", "elit", "eget", "gravida", "cum", 193 | "sociis", "natoque", "penatibus", "et", "magnis", "dis", "parturient", 194 | "montes,", "nascetur", "ridiculus", "mus", "mauris", "vitae", "ultricies", 195 | "leo", "integer", "malesuada", "nunc", "vel", "risus", "commodo", "viverra", 196 | "maecenas", "accumsan,", "lacus", "vel", "facilisis", "volutpat,", "est", 197 | "velit", "egestas", "dui,", "id", "ornare", "arcu", "odio", "ut", "sem", 198 | "nulla", "pharetra", "diam", "sit", "amet", "nisl", "suscipit", "adipiscing", 199 | "bibendum", "est", "ultricies", "integer", "quis", "auctor", "elit", "sed", 200 | "vulputate", "mi", "sit", "amet", "mauris", "commodo", "quis", "imperdiet", 201 | "massa", "tincidunt", "nunc", "pulvinar", "sapien", "et", "ligula", 202 | "ullamcorper", "malesuada", "proin", "libero", "nunc,", "consequat", 203 | "interdum", "varius", "sit", "amet,", "mattis", "vulputate", "enim", "nulla", 204 | "aliquet", "porttitor", "lacus,", "luctus", "accumsan", "tortor", "posuere", 205 | "ac", "ut", "consequat", "semper", "viverra", "nam", "libero", "justo,", 206 | "laoreet", "sit", "amet", "cursus", "sit", "amet,", "dictum", "sit", "amet", 207 | "justo", "donec", "enim", "diam,", "vulputate", "ut", "pharetra", "sit", 208 | "amet,", "aliquam", "id", "diam", "maecenas", "ultricies", "mi", "eget", 209 | "mauris", "pharetra", "et", "ultrices", "neque", "ornare", "aenean", "euismod", 210 | "elementum", "nisi,", "quis", "eleifend", "quam", "adipiscing", "vitae", 211 | "proin", "sagittis,", "nisl", "rhoncus", "mattis", "rhoncus,", "urna", "neque", 212 | "viverra", "justo,", "nec", "ultrices", "dui", "sapien", "eget", "mi", "proin", 213 | "sed", "libero", "enim,", "sed", "faucibus", "turpis", "in", "eu", "mi", 214 | "bibendum", "neque", "egestas", "congue", "quisque", "egestas", "diam", "in", 215 | "arcu", "cursus", "euismod", "quis", "viverra", "nibh", "cras", "pulvinar", 216 | "mattis", "nunc,", "sed", "blandit", "libero", "volutpat", "sed", "cras", 217 | "ornare", "arcu", "dui", "vivamus", "arcu", "felis,", "bibendum", "ut", 218 | "tristique", "et,", "egestas", "quis", "ipsum", "suspendisse", "ultrices", 219 | "fusce", "ut", "placerat", "orci", "nulla", "pellentesque", 220 | "dignissim", "enim,", "sit", "amet", "venenatis", "urna", "cursus", "eget", 221 | "nunc", "scelerisque", "viverra", "mauris,", "in", "aliquam", "sem", 222 | "fringilla", "ut", "morbi", "tincidunt", "augue", "interdum", "velit", 223 | "euismod", "in", "pellentesque", "massa", "placerat", "duis", "ultricies", 224 | "lacus", "sed", "turpis", "tincidunt", "id", "aliquet", "risus", "feugiat", 225 | "in", "ante", "metus,", "dictum", "at", "tempor", "commodo,", "ullamcorper", 226 | "a", "lacus", "vestibulum", "sed", "arcu", "non", "odio", "euismod", "lacinia", 227 | "at", "quis", "risus", "sed", "vulputate", "odio", "ut", "enim", "blandit", 228 | "volutpat", "maecenas", "volutpat", "blandit", "aliquam", "etiam", "erat", 229 | "velit,", "scelerisque", "in", "dictum", "non,", "consectetur", "a", "erat", 230 | "nam", "at", "lectus", "urna", "duis", "convallis", "convallis", "tellus,", 231 | "id", "interdum", "velit", "laoreet", "id", "donec", "ultrices", "tincidunt", 232 | "arcu,", "non", "sodales", "neque", "sodales", "ut", "etiam", "sit", "amet", 233 | "nisl", "purus,", "in", "mollis", "nunc", "sed", "id", "semper", "risus", "in", 234 | "hendrerit", "gravida", "rutrum", "quisque", "non", "tellus", "orci,", "ac", 235 | "auctor", "augue", "mauris", "augue", "neque,", "gravida", "in", "fermentum", 236 | "et,", "sollicitudin", "ac", "orci", "phasellus", "egestas", "tellus", 237 | "rutrum", "tellus", "pellentesque", "eu", "tincidunt", "tortor", "aliquam", 238 | "nulla", "facilisi", "cras", "fermentum,", "odio", "eu", "feugiat", "pretium,", 239 | "nibh", "ipsum", "consequat", "nisl,", "vel", "pretium", "lectus", "quam", 240 | "id", "leo", "in", "vitae", "turpis", "massa", "sed", "elementum", "tempus", 241 | "egestas", "sed", "sed", "risus", "pretium", "quam", "vulputate", "dignissim", 242 | "suspendisse", "in", "est", "ante", "in", "nibh", "mauris,", "cursus", 243 | "mattis", "molestie", "a,", "iaculis", "at", "erat", "pellentesque", 244 | "adipiscing", "commodo", "elit,", "at", "imperdiet", "dui", "accumsan", "sit", 245 | "amet", "nulla", "facilisi", "morbi", "tempus", "iaculis", "urna,", "id", 246 | "volutpat", "lacus", "laoreet", "non", "curabitur", "gravida", "arcu", "ac", 247 | "tortor", "dignissim", "convallis", "aenean", "et", "tortor", "at", "risus", 248 | "viverra", "adipiscing", "at", "in", "tellus", "integer", "feugiat", 249 | "scelerisque", "varius", "morbi", "enim", "nunc,", "faucibus", "a", 250 | "pellentesque", "sit", "amet,", "porttitor", "eget", "dolor", "morbi", "non", 251 | "arcu", "risus,", "quis", "varius", "quam", "quisque", "id", "diam", "vel", 252 | "quam", "elementum", "pulvinar", "etiam", "non", "quam", "lacus", 253 | "suspendisse", "faucibus", "interdum", "posuere", "lorem", "ipsum", "dolor", 254 | "sit", "amet,", "consectetur", "adipiscing", "elit", "duis", "tristique", 255 | "sollicitudin", "nibh", "sit", "amet", "commodo", "nulla", "facilisi", 256 | "nullam", "vehicula", "ipsum", "a", "arcu", "cursus", "vitae", "congue", 257 | "mauris", "rhoncus", "aenean", "vel", "elit", "scelerisque", "mauris", 258 | "pellentesque", "pulvinar", "pellentesque", "habitant", "morbi", "tristique", 259 | "senectus", "et", "netus", "et", "malesuada", "fames", "ac", "turpis", 260 | "egestas", "maecenas", "pharetra", "convallis", "posuere", "morbi", "leo", 261 | "urna,", "molestie", "at", "elementum", "eu,", "facilisis", "sed", "odio", 262 | "morbi", "quis", "commodo", "odio", "aenean", "sed", "adipiscing", "diam", 263 | "donec", "adipiscing", "tristique", "risus", "nec", "feugiat", "in", 264 | "fermentum", "posuere", "urna", "nec", "tincidunt", "praesent", "semper", 265 | "feugiat", "nibh", "sed", "pulvinar", "proin", "gravida", "hendrerit", 266 | "lectus", "a", "molestie", "gravida", "dictum" 267 | ] 268 | } 269 | -------------------------------------------------------------------------------- /testem.json: -------------------------------------------------------------------------------- 1 | { 2 | "framework": "mocha", 3 | "launch_in_ci": [ 4 | "phantomjs" 5 | ], 6 | "launch_in_dev": [ 7 | "phantomjs" 8 | ], 9 | "serve_files": [ 10 | "./spec/browserified.js" 11 | ], 12 | "src_files": [], 13 | 14 | "before_tests": "./node_modules/.bin/browserify ./spec/tests.js -o ./spec/browserified.js", 15 | "on_exit": "rm ./spec/browserified.js" 16 | } 17 | --------------------------------------------------------------------------------