Remove Grunt in favor of ts/scripts
This commit is contained in:
		
					parent
					
						
							
								4e947211b2
							
						
					
				
			
			
				commit
				
					
						e74376b997
					
				
			
		
					 92 changed files with 1137 additions and 1661 deletions
				
			
		
							
								
								
									
										2
									
								
								.github/workflows/benchmark.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/benchmark.yml
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -56,7 +56,7 @@ jobs:
 | 
			
		|||
        PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
 | 
			
		||||
 | 
			
		||||
    - name: Build typescript
 | 
			
		||||
      run: yarn grunt
 | 
			
		||||
      run: yarn generate
 | 
			
		||||
    - name: Bundle
 | 
			
		||||
      run: yarn build:webpack
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/ci.yml
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -128,7 +128,6 @@ jobs:
 | 
			
		|||
      run: yarn install --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
    - run: yarn generate
 | 
			
		||||
    - run: node build\grunt.js
 | 
			
		||||
    - run: yarn test-node
 | 
			
		||||
    - run: copy package.json temp.json
 | 
			
		||||
    - run: del package.json
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ cd Signal-Desktop
 | 
			
		|||
git-lfs install                # Setup Git LFS.
 | 
			
		||||
npm install --global yarn      # (only if you don’t already have `yarn`)
 | 
			
		||||
yarn install --frozen-lockfile # Install and build dependencies (this will take a while)
 | 
			
		||||
yarn grunt                     # Generate final JS and CSS assets
 | 
			
		||||
yarn generate                  # Generate final JS and CSS assets
 | 
			
		||||
yarn build:webpack             # Build parts of the app that use webpack (Sticker Creator)
 | 
			
		||||
yarn test                      # A good idea to make sure tests run first
 | 
			
		||||
yarn start                     # Start Signal!
 | 
			
		||||
| 
						 | 
				
			
			@ -72,13 +72,14 @@ is no automatic restart mechanism. Alternatively, keep the developer tools open
 | 
			
		|||
(Windows & Linux).
 | 
			
		||||
 | 
			
		||||
Also, note that the assets loaded by the application are not necessarily the same files
 | 
			
		||||
you’re touching. You may not see your changes until you run `yarn grunt` on the
 | 
			
		||||
you’re touching. You may not see your changes until you run `yarn generate` on the
 | 
			
		||||
command-line like you did during setup. You can make it easier on yourself by generating
 | 
			
		||||
the latest built assets when you change a file. Run this in its own terminal instance
 | 
			
		||||
while you make changes:
 | 
			
		||||
the latest built assets when you change a file. Run each of these in their own terminal
 | 
			
		||||
instance while you make changes - they'll run until you stop them:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
yarn grunt dev # runs until you stop it, re-generating built assets on file changes
 | 
			
		||||
yarn transpile --watch         # recompiles when you change .ts files
 | 
			
		||||
yarn sass-manifest --watch     # recompiles when you change .scss files
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If you miss the `git-lfs` step, run `yarn cache clean` and remove `node_modules` before trying again.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										148
									
								
								Gruntfile.js
									
										
									
									
									
								
							
							
						
						
									
										148
									
								
								Gruntfile.js
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,148 +0,0 @@
 | 
			
		|||
// Copyright 2014-2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
const importOnce = require('node-sass-import-once');
 | 
			
		||||
const rimraf = require('rimraf');
 | 
			
		||||
const mkdirp = require('mkdirp');
 | 
			
		||||
const sass = require('node-sass');
 | 
			
		||||
 | 
			
		||||
/* eslint-disable more/no-then, no-console  */
 | 
			
		||||
 | 
			
		||||
module.exports = grunt => {
 | 
			
		||||
  const bower = grunt.file.readJSON('bower.json');
 | 
			
		||||
  const components = [];
 | 
			
		||||
  // eslint-disable-next-line guard-for-in, no-restricted-syntax
 | 
			
		||||
  for (const i in bower.concat.app) {
 | 
			
		||||
    components.push(bower.concat.app[i]);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  grunt.loadNpmTasks('grunt-sass');
 | 
			
		||||
 | 
			
		||||
  grunt.initConfig({
 | 
			
		||||
    pkg: grunt.file.readJSON('package.json'),
 | 
			
		||||
    concat: {
 | 
			
		||||
      components: {
 | 
			
		||||
        src: components,
 | 
			
		||||
        dest: 'js/components.js',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    sass: {
 | 
			
		||||
      options: {
 | 
			
		||||
        implementation: sass,
 | 
			
		||||
        sourceMap: true,
 | 
			
		||||
        importer: importOnce,
 | 
			
		||||
      },
 | 
			
		||||
      dev: {
 | 
			
		||||
        files: {
 | 
			
		||||
          'stylesheets/manifest.css': 'stylesheets/manifest.scss',
 | 
			
		||||
          'stylesheets/manifest_bridge.css': 'stylesheets/manifest_bridge.scss',
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    copy: {
 | 
			
		||||
      deps: {
 | 
			
		||||
        files: [
 | 
			
		||||
          {
 | 
			
		||||
            src: 'components/mp3lameencoder/lib/Mp3LameEncoder.js',
 | 
			
		||||
            dest: 'js/Mp3LameEncoder.min.js',
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            src: 'components/webaudiorecorder/lib/WebAudioRecorderMp3.js',
 | 
			
		||||
            dest: 'js/WebAudioRecorderMp3.js',
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    watch: {
 | 
			
		||||
      protobuf: {
 | 
			
		||||
        files: ['./protos/SignalService.proto'],
 | 
			
		||||
        tasks: ['exec:build-protobuf'],
 | 
			
		||||
      },
 | 
			
		||||
      sass: {
 | 
			
		||||
        files: ['./stylesheets/*.scss', './stylesheets/**/*.scss'],
 | 
			
		||||
        tasks: ['sass'],
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    exec: {
 | 
			
		||||
      'tx-pull-mostly-translated': {
 | 
			
		||||
        cmd: 'tx pull --all --use-git-timestamps --minimum-perc=80',
 | 
			
		||||
      },
 | 
			
		||||
      'tx-pull-any-existing-translation': {
 | 
			
		||||
        cmd: 'tx pull --use-git-timestamps',
 | 
			
		||||
      },
 | 
			
		||||
      transpile: {
 | 
			
		||||
        cmd: 'yarn transpile',
 | 
			
		||||
      },
 | 
			
		||||
      'build-protobuf': {
 | 
			
		||||
        cmd: 'yarn build-protobuf',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    gitinfo: {}, // to be populated by grunt gitinfo
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  Object.keys(grunt.config.get('pkg').devDependencies).forEach(key => {
 | 
			
		||||
    if (/^grunt(?!(-cli)?$)/.test(key)) {
 | 
			
		||||
      // ignore grunt and grunt-cli
 | 
			
		||||
      grunt.loadNpmTasks(key);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // Transifex does not understand placeholders, so this task patches all non-en
 | 
			
		||||
  // locales with missing placeholders
 | 
			
		||||
  grunt.registerTask('locale-patch', () => {
 | 
			
		||||
    const en = grunt.file.readJSON('_locales/en/messages.json');
 | 
			
		||||
    grunt.file.recurse('_locales', (abspath, rootdir, subdir, filename) => {
 | 
			
		||||
      if (subdir === 'en' || filename !== 'messages.json') {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      const messages = grunt.file.readJSON(abspath);
 | 
			
		||||
 | 
			
		||||
      // eslint-disable-next-line no-restricted-syntax
 | 
			
		||||
      for (const key in messages) {
 | 
			
		||||
        if (en[key] !== undefined && messages[key] !== undefined) {
 | 
			
		||||
          if (
 | 
			
		||||
            en[key].placeholders !== undefined &&
 | 
			
		||||
            messages[key].placeholders === undefined
 | 
			
		||||
          ) {
 | 
			
		||||
            messages[key].placeholders = en[key].placeholders;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      grunt.file.write(abspath, `${JSON.stringify(messages, null, 4)}\n`);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  grunt.registerTask('getExpireTime', () => {
 | 
			
		||||
    grunt.task.requires('gitinfo');
 | 
			
		||||
    const gitinfo = grunt.config.get('gitinfo');
 | 
			
		||||
    const committed = gitinfo.local.branch.current.lastCommitTime;
 | 
			
		||||
    const buildCreation = Date.parse(committed);
 | 
			
		||||
    const buildExpiration = buildCreation + 1000 * 60 * 60 * 24 * 90;
 | 
			
		||||
    grunt.file.write(
 | 
			
		||||
      'config/local-production.json',
 | 
			
		||||
      `${JSON.stringify({ buildCreation, buildExpiration })}\n`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  grunt.registerTask('clean-release', () => {
 | 
			
		||||
    rimraf.sync('release');
 | 
			
		||||
    mkdirp.sync('release');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  grunt.registerTask('tx', [
 | 
			
		||||
    'exec:tx-pull-mostly-translated',
 | 
			
		||||
    'exec:tx-pull-any-existing-translation',
 | 
			
		||||
    'locale-patch',
 | 
			
		||||
  ]);
 | 
			
		||||
  grunt.registerTask('dev', ['default', 'watch']);
 | 
			
		||||
  grunt.registerTask('date', ['gitinfo', 'getExpireTime']);
 | 
			
		||||
  grunt.registerTask('default', [
 | 
			
		||||
    'exec:build-protobuf',
 | 
			
		||||
    'exec:transpile',
 | 
			
		||||
    'concat',
 | 
			
		||||
    'copy:deps',
 | 
			
		||||
    'sass',
 | 
			
		||||
    'date',
 | 
			
		||||
  ]);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Voorskou van duimnaelskakel vir $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "يتم جلب صورة مصغرة لمعاينة الوصلة $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "واجه سطح المكتب خطأ في فك التشفير.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "إرسال السجل",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ üçün bağlantı önbaxış eskizi",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Masaüstü, şifrə açma xətası ilə qarşılaşdı.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Jurnalı göndər",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Преглед на линк към $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ লিঙ্ক এর জন্য ছোট পূর্বরূপ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "ডেস্কটপে একটি ডিক্রিপশন ত্রুটি হয়েছে।",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "লগ জমা দিন",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Previsualització de la vista en miniatura de l'enllaç $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Hi ha hagut un error de desencriptació.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Envia el registre",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Náhled na odkaz pro  $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop narazil na chybu při dešifrování.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Odeslat log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Rhagolwg dolen llun bach ar gyfer $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Cafodd y bwrdd gwaith yn wall dadgryptio.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Cyflwyno cofnod",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniature-linkforhåndsvisning for $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop stødte på en dekrypteringsfejl.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Indsend log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniaturbild der Link-Vorschau für $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Es trat ein Entschlüsselungsfehler auf.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Diagnoseprotokoll übermitteln",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Προεπισκόπηση συνδέσμου για $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Το Desktop αντιμετώπισε σφάλμα αποκρυπτογράφησης.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Υποβολή αρχείου",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
    "placeholders": {
 | 
			
		||||
      "count": {
 | 
			
		||||
        "content": "$1",
 | 
			
		||||
        "example": 123
 | 
			
		||||
        "example": "123"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatura antaŭrigardo de ligilo pri $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Eraro de malĉifrado okazis.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Sendi protokolon",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatura de vista previa para $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Fallo encontrado al descifrar.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Enviar el registro de depuración",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Lingi eelvaate pisipilt: $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Programmil tekkis dekrüptimistõrge.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Postita logi",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Estekaren miniatura aurrebista $domain$ domeinurako",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "پیش نمایش پیوند thumbnail برای $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Linkin $domain$ esikatselukuva",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Ohjelma törmäsi salauksen purkuvirheeseen.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Lähetä loki",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Imagette d’aperçu de lien pour $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Signal pour ordinateur a rencontré une erreur de déchiffrement.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Envoyer le journal",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ માટે થંબનેલ લિંક પ્રિવ્યુ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "קדם־תצוגה של קישור עבור $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "שולחן העבודה נתקל בשגיאת פיענוח.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "הגש יומן",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ के लिये थंबनेल लिंक पूर्वावलोकन",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "डेस्कटॉप एक डिक्रिप्शन एरर में चला गया.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "लॉग सबमिट करें",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Sličica pregleda poveznice za $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "A $domain$ hivatkozás előnézeti képe",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "A Desktop egy dekódolási hibába ütközött.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Log küldése",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Gambar mini pratinjau tautan untuk $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop menemui eror dekripsi.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Kirim catatan",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Smámynd forskoðunar tengils fyrir $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Forritið lenti í afkóðunarvillu.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Senda inn atvikaskrá",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatura anteprima del collegamento per $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ha riscontrato un errore di decrittazione.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Invia log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ のリンクプレビュー",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "デスクトップで復号化エラーが発生しました。",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "ログを送信",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "ការមើលតំណជារូបភាពតូចៗសម្រាប់$domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ಗೆ ಥಂಬ್ನೇಲ್ ಲಿಂಕ್ ಪೂರ್ವವೀಕ್ಷಣೆ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$의 섬네일 링크 미리보기",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Thumbnail link preview for $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "ຮູບນ້ອຍລີງ ທີຜ່ານມາ ສຳລັບ $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatiūrinė nuorodos peržiūra, skirta $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Programa susidūrė su iššifravimo klaida.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Pateikti žurnalą",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ sīktēlu saites priekšskatījums",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Линк до сликичка за преглед на $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$-ൻ്റെ ലിങ്ക് പ്രിവ്യൂ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ करिता थंबनेल दुवा पुनरावलोकन",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": " डेस्कटॉपमध्ये डिक्रिप्शन त्रुटी आली",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "लॉग सादर करा",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Pratonton pautan imej kecil untuk $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Komputer meja mengalami ralat nyahinkripsi.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Hantar log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatyrbilde til linkforhåndsvisning for $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Voorbeeldafbeelding voor $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Signal-Desktop heeft een probleem met ontsleutelen.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Foutopsporingslog indienen",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Førehandsvisning av lenkje til $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Send inn logg",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Thumbnail link preview for $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": " $domain$  ਦੇ ਲਈ ਥੰਬਨੇਲ ਲਿੰਕ ਦੀ ਝਲਕ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Podgląd miniatury odnośnika dla $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Aplikacja Desktop napotkała błąd, w trakcie odszyfrowywania.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Wyślij logi debugowania",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "د $domain$ لپاره د thumbnail د لینک مخکتنه",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "ډیسکټاپ له یوې ډیکرپشن شوې تیروتنې سره رن شوی",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "د رپوټ تسلیمول",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Pré-visualização em miniatura do link $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Signal encontrou um erro ao descriptografar uma mensagem.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Enviar um registro de depuração",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Pré-visualização da hiperligação da miniatura $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "O desktop apresentou um erro de desencriptação.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submeter relatório",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Miniatură a previzualizări pentru $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop a întâmpinat o eroare de decriptare.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Trimite jurnalul",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Миниатюра предпросмотра ссылки для $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "В Signal Desktop произошла ошибка расшифровки.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Отправить журнал",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Náhľad odkazu pre $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "V programe Signal Desktop sa vyskytla chyba pri dešifrovaní.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Odoslať denník",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Predogledna sličica povezave na: $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Prišlo je do težav z dešifriranjem.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Oddaj sistemsko zabeležbo",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Paraparje lidhjeje miniature për $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktopi hasi një gabim shfshehtëzimi.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Parashtroni regjistër",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Сличица прегледа линка за $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Десктоп је налетео на грешку у дешифрирању.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Пошањи извештај",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Länkförhandsgranskning i miniatyrbild för $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop stötte på ett dekrypteringsfel.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Skicka in logg",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Muunganisho wa hakiki ya kijipicha kwa  $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$  க்கான சிறு இணைப்பு முன்னோட்டம்",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$కోసం సూక్ష్మచిత్రం పూర్వప్రదర్శన లింకు ",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "ภาพย่อตัวอย่างลิงก์ของ $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ için bağlantı ön izlemesi küçük resmi",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop deşifreleme hatası ile karşılaştı.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Günlüğü gönder",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ نىڭ كىچىك سۈرەت ئۇلانما ئالدىن كۆزىتىشى",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Мініатюра попереднього перегляду посилання для $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$کیلئے پیش نظر تھمب نیل لنک",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "Hình thu nhỏ liên kết bản xem trước cho $domain$",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$的链接预览缩略图",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "Desktop ran into a decryption error.",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "Submit log",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -425,7 +425,7 @@
 | 
			
		|||
        "placeholders": {
 | 
			
		||||
            "count": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": 123
 | 
			
		||||
                "example": "123"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +631,7 @@
 | 
			
		|||
        "message": "$domain$ 的縮圖連結預覽",
 | 
			
		||||
        "description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "path": {
 | 
			
		||||
            "domain": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "instagram.com"
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +649,17 @@
 | 
			
		|||
    },
 | 
			
		||||
    "decryptionErrorToast": {
 | 
			
		||||
        "message": "電腦遇到解密錯誤。",
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error."
 | 
			
		||||
        "description": "An error popup when we haven't added an error for decryption error.",
 | 
			
		||||
        "placeholders": {
 | 
			
		||||
            "name": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "John"
 | 
			
		||||
            },
 | 
			
		||||
            "deviceId": {
 | 
			
		||||
                "content": "$1",
 | 
			
		||||
                "example": "2"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "decryptionErrorToastAction": {
 | 
			
		||||
        "message": "上傳日誌",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										43
									
								
								bower.json
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								bower.json
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,43 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "signal-desktop",
 | 
			
		||||
  "version": "0.0.0",
 | 
			
		||||
  "homepage": "https://github.com/signalapp/Signal-Desktop",
 | 
			
		||||
  "license": "AGPL-3.0-only",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "mp3lameencoder": "https://github.com/higuma/mp3-lame-encoder-js.git",
 | 
			
		||||
    "protobuf": "~3.8.0",
 | 
			
		||||
    "qrcode": "https://github.com/davidshimjs/qrcodejs.git#1c78ccd71",
 | 
			
		||||
    "webaudiorecorder": "https://github.com/higuma/web-audio-recorder-js.git"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
  },
 | 
			
		||||
  "preen": {
 | 
			
		||||
    "mp3lameencoder": [
 | 
			
		||||
      "lib/Mp3LameEncoder.js"
 | 
			
		||||
    ],
 | 
			
		||||
    "protobuf": [
 | 
			
		||||
      "dist/ProtoBuf.js"
 | 
			
		||||
    ],
 | 
			
		||||
    "qrcode": [
 | 
			
		||||
      "qrcode.js"
 | 
			
		||||
    ],
 | 
			
		||||
    "webaudiorecorder": [
 | 
			
		||||
      "lib/WebAudioRecorder.js",
 | 
			
		||||
      "lib/WebAudioRecorderMp3.js"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "concat": {
 | 
			
		||||
    "app": [
 | 
			
		||||
      "node_modules/jquery/dist/jquery.js",
 | 
			
		||||
      "components/long/**/*.js",
 | 
			
		||||
      "components/bytebuffer/**/*.js",
 | 
			
		||||
      "components/protobuf/**/*.js",
 | 
			
		||||
      "node_modules/mustache/mustache.js",
 | 
			
		||||
      "node_modules/underscore/underscore.js",
 | 
			
		||||
      "components/qrcode/**/*.js",
 | 
			
		||||
      "components/autosize/**/*.js",
 | 
			
		||||
      "components/webaudiorecorder/lib/WebAudioRecorder.js"
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +0,0 @@
 | 
			
		|||
// Copyright 2017-2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
// because grunt.cmd is totally flakey on windows
 | 
			
		||||
require('grunt').cli();
 | 
			
		||||
| 
						 | 
				
			
			@ -1,662 +0,0 @@
 | 
			
		|||
(function (root, factory) {
 | 
			
		||||
    if (typeof define === 'function' && define.amd) {
 | 
			
		||||
        // AMD. Register as an anonymous module.
 | 
			
		||||
        define(['backbone', 'underscore'], factory);
 | 
			
		||||
    } else if (typeof exports === 'object') {
 | 
			
		||||
        // Node. Does not work with strict CommonJS, but
 | 
			
		||||
        // only CommonJS-like environments that support module.exports,
 | 
			
		||||
        // like Node.
 | 
			
		||||
        module.exports = factory(require('backbone'), require('underscore'));
 | 
			
		||||
    } else {
 | 
			
		||||
        // Browser globals (root is window)
 | 
			
		||||
        root.returnExports = factory(root.Backbone, root._);
 | 
			
		||||
    }
 | 
			
		||||
}(this, function (Backbone, _) {
 | 
			
		||||
 | 
			
		||||
    // Generate four random hex digits.
 | 
			
		||||
    function S4() {
 | 
			
		||||
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Generate a pseudo-GUID by concatenating random hexadecimal.
 | 
			
		||||
    function guid() {
 | 
			
		||||
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ( _(indexedDB).isUndefined() ) { return; }
 | 
			
		||||
 | 
			
		||||
    // Driver object
 | 
			
		||||
    // That's the interesting part.
 | 
			
		||||
    // There is a driver for each schema provided. The schema is a te combination of name (for the database), a version as well as migrations to reach that
 | 
			
		||||
    // version of the database.
 | 
			
		||||
    function Driver(schema, ready, nolog, onerror) {
 | 
			
		||||
        this.schema         = schema;
 | 
			
		||||
        this.ready          = ready;
 | 
			
		||||
        this.error          = null;
 | 
			
		||||
        this.transactions   = []; // Used to list all transactions and keep track of active ones.
 | 
			
		||||
        this.db             = null;
 | 
			
		||||
        this.nolog          = nolog;
 | 
			
		||||
        this.onerror        = onerror;
 | 
			
		||||
        var lastMigrationPathVersion = _.last(this.schema.migrations).version;
 | 
			
		||||
        if (!this.nolog) debugLog("opening database " + this.schema.id + " in version #" + lastMigrationPathVersion);
 | 
			
		||||
        this.dbRequest      = indexedDB.open(this.schema.id,lastMigrationPathVersion); //schema version need to be an unsigned long
 | 
			
		||||
 | 
			
		||||
        this.launchMigrationPath = function(dbVersion) {
 | 
			
		||||
            var transaction = this.dbRequest.transaction;
 | 
			
		||||
            var clonedMigrations = _.clone(schema.migrations);
 | 
			
		||||
            this.migrate(transaction, clonedMigrations, dbVersion, {
 | 
			
		||||
                error: function (event) {
 | 
			
		||||
                    this.error = "Database not up to date. " + dbVersion + " expected was " + lastMigrationPathVersion;
 | 
			
		||||
                }.bind(this)
 | 
			
		||||
            });
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        this.dbRequest.onblocked = function(event){
 | 
			
		||||
            if (!this.nolog) debugLog("connection to database blocked");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.dbRequest.onsuccess = function (e) {
 | 
			
		||||
            this.db = e.target.result; // Attach the connection ot the queue.
 | 
			
		||||
            var currentIntDBVersion = (parseInt(this.db.version) ||  0); // we need convert beacuse chrome store in integer and ie10 DP4+ in int;
 | 
			
		||||
            var lastMigrationInt = (parseInt(lastMigrationPathVersion) || 0);  // And make sure we compare numbers with numbers.
 | 
			
		||||
 | 
			
		||||
            if (currentIntDBVersion === lastMigrationInt) { //if support new event onupgradeneeded will trigger the ready function
 | 
			
		||||
                // No migration to perform!
 | 
			
		||||
                this.ready();
 | 
			
		||||
            } else if (currentIntDBVersion < lastMigrationInt ) {
 | 
			
		||||
                // We need to migrate up to the current migration defined in the database
 | 
			
		||||
                this.launchMigrationPath(currentIntDBVersion);
 | 
			
		||||
            } else {
 | 
			
		||||
                // Looks like the IndexedDB is at a higher version than the current driver schema.
 | 
			
		||||
                this.error = "Database version is greater than current code " + currentIntDBVersion + " expected was " + lastMigrationInt;
 | 
			
		||||
            }
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        this.dbRequest.onerror = function (e) {
 | 
			
		||||
            // Failed to open the database
 | 
			
		||||
            this.error = "Couldn't not connect to the database"
 | 
			
		||||
            if (!this.nolog) debugLog("Couldn't not connect to the database");
 | 
			
		||||
            this.onerror();
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
 | 
			
		||||
        this.dbRequest.onabort = function (e) {
 | 
			
		||||
            // Failed to open the database
 | 
			
		||||
            this.error = "Connection to the database aborted"
 | 
			
		||||
            if (!this.nolog) debugLog("Connection to the database aborted");
 | 
			
		||||
            this.onerror();
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        this.dbRequest.onupgradeneeded = function(iDBVersionChangeEvent){
 | 
			
		||||
            this.db =iDBVersionChangeEvent.target.result;
 | 
			
		||||
 | 
			
		||||
            var newVersion = iDBVersionChangeEvent.newVersion;
 | 
			
		||||
            var oldVersion = iDBVersionChangeEvent.oldVersion;
 | 
			
		||||
 | 
			
		||||
            // Fix Safari 8 and iOS 8 bug
 | 
			
		||||
            // at the first connection oldVersion is equal to 9223372036854776000
 | 
			
		||||
            // but the real value is 0
 | 
			
		||||
            if (oldVersion > 99999999999)
 | 
			
		||||
                oldVersion = 0;
 | 
			
		||||
 | 
			
		||||
            if (!this.nolog) debugLog("onupgradeneeded = " + oldVersion + " => " + newVersion);
 | 
			
		||||
            this.launchMigrationPath(oldVersion);
 | 
			
		||||
        }.bind(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function debugLog(str) {
 | 
			
		||||
        if (typeof window !== "undefined" && typeof window.console !== "undefined" && typeof window.console.log !== "undefined") {
 | 
			
		||||
            window.console.log(str);
 | 
			
		||||
        }
 | 
			
		||||
        else if(console.log !== "undefined") {
 | 
			
		||||
            console.log(str)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Driver Prototype
 | 
			
		||||
    Driver.prototype = {
 | 
			
		||||
 | 
			
		||||
        // Tracks transactions. Mostly for debugging purposes. TO-IMPROVE
 | 
			
		||||
        _track_transaction: function(transaction) {
 | 
			
		||||
            this.transactions.push(transaction);
 | 
			
		||||
            function removeIt() {
 | 
			
		||||
                var idx = this.transactions.indexOf(transaction);
 | 
			
		||||
                if (idx !== -1) {this.transactions.splice(idx); }
 | 
			
		||||
            };
 | 
			
		||||
            transaction.oncomplete = removeIt.bind(this);
 | 
			
		||||
            transaction.onabort = removeIt.bind(this);
 | 
			
		||||
            transaction.onerror = removeIt.bind(this);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Performs all the migrations to reach the right version of the database.
 | 
			
		||||
        migrate: function (transaction, migrations, version, options) {
 | 
			
		||||
            transaction.onerror = options.error;
 | 
			
		||||
            transaction.onabort = options.error;
 | 
			
		||||
 | 
			
		||||
            if (!this.nolog) debugLog("migrate begin version from #" + version);
 | 
			
		||||
            var that = this;
 | 
			
		||||
            var migration = migrations.shift();
 | 
			
		||||
            if (migration) {
 | 
			
		||||
                if (!version || version < migration.version) {
 | 
			
		||||
                    // We need to apply this migration-
 | 
			
		||||
                    if (typeof migration.before == "undefined") {
 | 
			
		||||
                        migration.before = function (next) {
 | 
			
		||||
                            next();
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    if (typeof migration.after == "undefined") {
 | 
			
		||||
                        migration.after = function (next) {
 | 
			
		||||
                            next();
 | 
			
		||||
                        };
 | 
			
		||||
                    }
 | 
			
		||||
                    // First, let's run the before script
 | 
			
		||||
                    if (!this.nolog) debugLog("migrate begin before version #" + migration.version);
 | 
			
		||||
                    migration.before(function () {
 | 
			
		||||
                    if (!this.nolog) debugLog("migrate done before version #" + migration.version);
 | 
			
		||||
 | 
			
		||||
                        if (!this.nolog) debugLog("migrate begin migrate version #" + migration.version);
 | 
			
		||||
 | 
			
		||||
                        migration.migrate(transaction, function () {
 | 
			
		||||
                            if (!this.nolog) debugLog("migrate done migrate version #" + migration.version);
 | 
			
		||||
                            // Migration successfully appliedn let's go to the next one!
 | 
			
		||||
                            if (!this.nolog) debugLog("migrate begin after version #" + migration.version);
 | 
			
		||||
                            migration.after(function () {
 | 
			
		||||
                                if (!this.nolog) debugLog("migrate done after version #" + migration.version);
 | 
			
		||||
                                if (!this.nolog) debugLog("Migrated to " + migration.version);
 | 
			
		||||
 | 
			
		||||
                                //last modification occurred, need finish
 | 
			
		||||
                                if(migrations.length ==0) {
 | 
			
		||||
                                    if (!this.nolog) {
 | 
			
		||||
                                        debugLog("migrate setting transaction.oncomplete to finish version #" + migration.version);
 | 
			
		||||
                                        transaction.oncomplete = function() {
 | 
			
		||||
                                            debugLog("migrate done transaction.oncomplete version #" + migration.version);
 | 
			
		||||
                                            debugLog("Done migrating");
 | 
			
		||||
                                        }
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (!this.nolog) debugLog("migrate end from version #" + version + " to " + migration.version);
 | 
			
		||||
                                    that.migrate(transaction, migrations, version, options);
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                            }.bind(this));
 | 
			
		||||
                        }.bind(this));
 | 
			
		||||
                    }.bind(this));
 | 
			
		||||
                } else {
 | 
			
		||||
                    // No need to apply this migration
 | 
			
		||||
                    if (!this.nolog) debugLog("Skipping migration " + migration.version);
 | 
			
		||||
                    this.migrate(transaction, migrations, version, options);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // This is the main method, called by the ExecutionQueue when the driver is ready (database open and migration performed)
 | 
			
		||||
        execute: function (storeName, method, object, options) {
 | 
			
		||||
            if (!this.nolog) debugLog("execute : " + method +  " on " + storeName + " for " + object.id);
 | 
			
		||||
            switch (method) {
 | 
			
		||||
            case "create":
 | 
			
		||||
                this.create(storeName, object, options);
 | 
			
		||||
                break;
 | 
			
		||||
            case "read":
 | 
			
		||||
                if (object.id || object.cid) {
 | 
			
		||||
                    this.read(storeName, object, options); // It's a model
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.query(storeName, object, options); // It's a collection
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case "update":
 | 
			
		||||
                this.update(storeName, object, options); // We may want to check that this is not a collection. TOFIX
 | 
			
		||||
                break;
 | 
			
		||||
            case "delete":
 | 
			
		||||
                if (object.id || object.cid) {
 | 
			
		||||
                    this.delete(storeName, object, options);
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.clear(storeName, object, options);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                // Hum what?
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Writes the json to the storeName in db. It is a create operations, which means it will fail if the key already exists
 | 
			
		||||
        // options are just success and error callbacks.
 | 
			
		||||
        create: function (storeName, object, options) {
 | 
			
		||||
            var writeTransaction = this.db.transaction([storeName], 'readwrite');
 | 
			
		||||
            //this._track_transaction(writeTransaction);
 | 
			
		||||
            var store = writeTransaction.objectStore(storeName);
 | 
			
		||||
            var json = object.toJSON();
 | 
			
		||||
            var idAttribute = _.result(object, 'idAttribute');
 | 
			
		||||
            var writeRequest;
 | 
			
		||||
 | 
			
		||||
            if (json[idAttribute] === undefined && !store.autoIncrement) json[idAttribute] = guid();
 | 
			
		||||
 | 
			
		||||
            writeTransaction.onerror = function (e) {
 | 
			
		||||
                options.error(e);
 | 
			
		||||
            };
 | 
			
		||||
            writeTransaction.oncomplete = function (e) {
 | 
			
		||||
                options.success(json);
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            if (!store.keyPath)
 | 
			
		||||
                writeRequest = store.add(json, json[idAttribute]);
 | 
			
		||||
            else
 | 
			
		||||
                writeRequest = store.add(json);
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Writes the json to the storeName in db. It is an update operation, which means it will overwrite the value if the key already exist
 | 
			
		||||
        // options are just success and error callbacks.
 | 
			
		||||
        update: function (storeName, object, options) {
 | 
			
		||||
            var writeTransaction = this.db.transaction([storeName], 'readwrite');
 | 
			
		||||
            //this._track_transaction(writeTransaction);
 | 
			
		||||
            var store = writeTransaction.objectStore(storeName);
 | 
			
		||||
            var json = object.toJSON();
 | 
			
		||||
            var idAttribute = _.result(object, 'idAttribute');
 | 
			
		||||
            var writeRequest;
 | 
			
		||||
 | 
			
		||||
            if (!json[idAttribute]) json[idAttribute] = guid();
 | 
			
		||||
 | 
			
		||||
            if (!store.keyPath)
 | 
			
		||||
              writeRequest = store.put(json, json[idAttribute]);
 | 
			
		||||
            else
 | 
			
		||||
              writeRequest = store.put(json);
 | 
			
		||||
 | 
			
		||||
            writeRequest.onerror = function (e) {
 | 
			
		||||
                options.error(e);
 | 
			
		||||
            };
 | 
			
		||||
            writeTransaction.oncomplete = function (e) {
 | 
			
		||||
                options.success(json);
 | 
			
		||||
            };
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Reads from storeName in db with json.id if it's there of with any json.xxxx as long as xxx is an index in storeName
 | 
			
		||||
        read: function (storeName, object, options) {
 | 
			
		||||
            var readTransaction = this.db.transaction([storeName], "readonly");
 | 
			
		||||
            this._track_transaction(readTransaction);
 | 
			
		||||
 | 
			
		||||
            var store = readTransaction.objectStore(storeName);
 | 
			
		||||
            var json = object.toJSON();
 | 
			
		||||
            var idAttribute = _.result(object, 'idAttribute');
 | 
			
		||||
 | 
			
		||||
            var getRequest = null;
 | 
			
		||||
            if (json[idAttribute]) {
 | 
			
		||||
                getRequest = store.get(json[idAttribute]);
 | 
			
		||||
            } else if(options.index) {
 | 
			
		||||
                var index = store.index(options.index.name);
 | 
			
		||||
                getRequest = index.get(options.index.value);
 | 
			
		||||
            } else {
 | 
			
		||||
                // We need to find which index we have
 | 
			
		||||
                var cardinality = 0; // try to fit the index with most matches
 | 
			
		||||
                _.each(store.indexNames, function (key, index) {
 | 
			
		||||
                    index = store.index(key);
 | 
			
		||||
                    if(typeof index.keyPath === 'string' && 1 > cardinality) {
 | 
			
		||||
                        // simple index
 | 
			
		||||
                        if (json[index.keyPath] !== undefined) {
 | 
			
		||||
                            getRequest = index.get(json[index.keyPath]);
 | 
			
		||||
                            cardinality = 1;
 | 
			
		||||
                        }
 | 
			
		||||
                    } else if(typeof index.keyPath === 'object' && index.keyPath.length > cardinality) {
 | 
			
		||||
                        // compound index
 | 
			
		||||
                        var valid = true;
 | 
			
		||||
                        var keyValue = _.map(index.keyPath, function(keyPart) {
 | 
			
		||||
                            valid = valid && json[keyPart] !== undefined;
 | 
			
		||||
                            return json[keyPart];
 | 
			
		||||
                        });
 | 
			
		||||
                        if(valid) {
 | 
			
		||||
                            getRequest = index.get(keyValue);
 | 
			
		||||
                            cardinality = index.keyPath.length;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            if (getRequest) {
 | 
			
		||||
                getRequest.onsuccess = function (event) {
 | 
			
		||||
                    if (event.target.result) {
 | 
			
		||||
                        options.success(event.target.result);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        options.error("Not Found");
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
                getRequest.onerror = function () {
 | 
			
		||||
                    options.error("Not Found"); // We couldn't find the record.
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                options.error("Not Found"); // We couldn't even look for it, as we don't have enough data.
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Deletes the json.id key and value in storeName from db.
 | 
			
		||||
        delete: function (storeName, object, options) {
 | 
			
		||||
            var deleteTransaction = this.db.transaction([storeName], 'readwrite');
 | 
			
		||||
            //this._track_transaction(deleteTransaction);
 | 
			
		||||
 | 
			
		||||
            var store = deleteTransaction.objectStore(storeName);
 | 
			
		||||
            var json = object.toJSON();
 | 
			
		||||
            var idAttribute = _.result(object, 'idAttribute');
 | 
			
		||||
 | 
			
		||||
            var deleteRequest = store.delete(json[idAttribute]);
 | 
			
		||||
 | 
			
		||||
            deleteTransaction.oncomplete = function (event) {
 | 
			
		||||
                options.success(null);
 | 
			
		||||
            };
 | 
			
		||||
            deleteRequest.onerror = function (event) {
 | 
			
		||||
                options.error("Not Deleted");
 | 
			
		||||
            };
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Clears all records for storeName from db.
 | 
			
		||||
        clear: function (storeName, object, options) {
 | 
			
		||||
            var deleteTransaction = this.db.transaction([storeName], "readwrite");
 | 
			
		||||
            //this._track_transaction(deleteTransaction);
 | 
			
		||||
 | 
			
		||||
            var store = deleteTransaction.objectStore(storeName);
 | 
			
		||||
 | 
			
		||||
            var deleteRequest = store.clear();
 | 
			
		||||
            deleteRequest.onsuccess = function (event) {
 | 
			
		||||
                options.success(null);
 | 
			
		||||
            };
 | 
			
		||||
            deleteRequest.onerror = function (event) {
 | 
			
		||||
                options.error("Not Cleared");
 | 
			
		||||
            };
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Performs a query on storeName in db.
 | 
			
		||||
        // options may include :
 | 
			
		||||
        // - conditions : value of an index, or range for an index
 | 
			
		||||
        // - range : range for the primary key
 | 
			
		||||
        // - limit : max number of elements to be yielded
 | 
			
		||||
        // - offset : skipped items.
 | 
			
		||||
        query: function (storeName, collection, options) {
 | 
			
		||||
            var elements = [];
 | 
			
		||||
            var skipped = 0, processed = 0;
 | 
			
		||||
            var queryTransaction = this.db.transaction([storeName], "readonly");
 | 
			
		||||
            //this._track_transaction(queryTransaction);
 | 
			
		||||
 | 
			
		||||
            var idAttribute = _.result(collection.model.prototype, 'idAttribute');
 | 
			
		||||
            var readCursor = null;
 | 
			
		||||
            var store = queryTransaction.objectStore(storeName);
 | 
			
		||||
            var index = null,
 | 
			
		||||
                lower = null,
 | 
			
		||||
                upper = null,
 | 
			
		||||
                bounds = null;
 | 
			
		||||
 | 
			
		||||
            if (options.conditions) {
 | 
			
		||||
                // We have a condition, we need to use it for the cursor
 | 
			
		||||
                _.each(store.indexNames, function (key) {
 | 
			
		||||
                    if (!readCursor) {
 | 
			
		||||
                        index = store.index(key);
 | 
			
		||||
                        if (options.conditions[index.keyPath] instanceof Array) {
 | 
			
		||||
                            lower = options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1] ? options.conditions[index.keyPath][1] : options.conditions[index.keyPath][0];
 | 
			
		||||
                            upper = options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1] ? options.conditions[index.keyPath][0] : options.conditions[index.keyPath][1];
 | 
			
		||||
                            bounds = IDBKeyRange.bound(lower, upper, true, true);
 | 
			
		||||
 | 
			
		||||
                            if (options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1]) {
 | 
			
		||||
                                // Looks like we want the DESC order
 | 
			
		||||
                                readCursor = index.openCursor(bounds, window.IDBCursor.PREV || "prev");
 | 
			
		||||
                            } else {
 | 
			
		||||
                                // We want ASC order
 | 
			
		||||
                                readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
 | 
			
		||||
                            }
 | 
			
		||||
                        } else if (typeof options.conditions[index.keyPath] === 'object' && ('$gt' in options.conditions[index.keyPath] || '$gte' in options.conditions[index.keyPath])) {
 | 
			
		||||
                            if('$gt' in options.conditions[index.keyPath])
 | 
			
		||||
                                bounds = IDBKeyRange.lowerBound(options.conditions[index.keyPath]['$gt'], true);
 | 
			
		||||
                            else
 | 
			
		||||
                                bounds = IDBKeyRange.lowerBound(options.conditions[index.keyPath]['$gte']);
 | 
			
		||||
                            readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
 | 
			
		||||
                        } else if (typeof options.conditions[index.keyPath] === 'object' && ('$lt' in options.conditions[index.keyPath] || '$lte' in options.conditions[index.keyPath])) {
 | 
			
		||||
                            if('$lt' in options.conditions[index.keyPath])
 | 
			
		||||
                                bounds = IDBKeyRange.upperBound(options.conditions[index.keyPath]['$lt'], true);
 | 
			
		||||
                            else
 | 
			
		||||
                                bounds = IDBKeyRange.upperBound(options.conditions[index.keyPath]['$lte']);
 | 
			
		||||
                            readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
 | 
			
		||||
                        } else if (options.conditions[index.keyPath] != undefined) {
 | 
			
		||||
                            bounds = IDBKeyRange.only(options.conditions[index.keyPath]);
 | 
			
		||||
                            readCursor = index.openCursor(bounds);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            } else if (options.index) {
 | 
			
		||||
                index = store.index(options.index.name);
 | 
			
		||||
                var excludeLower = !!options.index.excludeLower;
 | 
			
		||||
                var excludeUpper = !!options.index.excludeUpper;
 | 
			
		||||
                if (index) {
 | 
			
		||||
                    if (options.index.lower && options.index.upper) {
 | 
			
		||||
                        bounds = IDBKeyRange.bound(options.index.lower, options.index.upper, excludeLower, excludeUpper);
 | 
			
		||||
                    } else if (options.index.lower) {
 | 
			
		||||
                        bounds = IDBKeyRange.lowerBound(options.index.lower, excludeLower);
 | 
			
		||||
                    } else if (options.index.upper) {
 | 
			
		||||
                        bounds = IDBKeyRange.upperBound(options.index.upper, excludeUpper);
 | 
			
		||||
                    } else if (options.index.only) {
 | 
			
		||||
                        bounds = IDBKeyRange.only(options.index.only);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (typeof options.index.order === 'string' && options.index.order.toLowerCase() === 'desc') {
 | 
			
		||||
                        readCursor = index.openCursor(bounds, window.IDBCursor.PREV || "prev");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                // No conditions, use the index
 | 
			
		||||
                if (options.range) {
 | 
			
		||||
                    lower = options.range[0] > options.range[1] ? options.range[1] : options.range[0];
 | 
			
		||||
                    upper = options.range[0] > options.range[1] ? options.range[0] : options.range[1];
 | 
			
		||||
                    bounds = IDBKeyRange.bound(lower, upper);
 | 
			
		||||
                    if (options.range[0] > options.range[1]) {
 | 
			
		||||
                        readCursor = store.openCursor(bounds, window.IDBCursor.PREV || "prev");
 | 
			
		||||
                    } else {
 | 
			
		||||
                        readCursor = store.openCursor(bounds, window.IDBCursor.NEXT || "next");
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    readCursor = store.openCursor();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (typeof (readCursor) == "undefined" || !readCursor) {
 | 
			
		||||
                options.error("No Cursor");
 | 
			
		||||
            } else {
 | 
			
		||||
                readCursor.onerror = function(e){
 | 
			
		||||
                    options.error("readCursor error", e);
 | 
			
		||||
                };
 | 
			
		||||
                // Setup a handler for the cursor’s `success` event:
 | 
			
		||||
                readCursor.onsuccess = function (e) {
 | 
			
		||||
                    var cursor = e.target.result;
 | 
			
		||||
                    if (!cursor) {
 | 
			
		||||
                        if (options.addIndividually || options.clear) {
 | 
			
		||||
                            // nothing!
 | 
			
		||||
                            // We need to indicate that we're done. But, how?
 | 
			
		||||
                            collection.trigger("reset");
 | 
			
		||||
                        } else {
 | 
			
		||||
                            options.success(elements); // We're done. No more elements.
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        // Cursor is not over yet.
 | 
			
		||||
                        if (options.limit && processed >= options.limit) {
 | 
			
		||||
                            // Yet, we have processed enough elements. So, let's just skip.
 | 
			
		||||
                            if (bounds) {
 | 
			
		||||
                                if (options.conditions && options.conditions[index.keyPath]) {
 | 
			
		||||
                                    cursor.continue(options.conditions[index.keyPath][1] + 1); /* We need to 'terminate' the cursor cleany, by moving to the end */
 | 
			
		||||
                                } else if (options.index && (options.index.upper || options.index.lower)) {
 | 
			
		||||
                                    if (typeof options.index.order === 'string' && options.index.order.toLowerCase() === 'desc') {
 | 
			
		||||
                                        cursor.continue(options.index.lower);
 | 
			
		||||
                                    } else {
 | 
			
		||||
                                        cursor.continue(options.index.upper);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                cursor.continue(); /* We need to 'terminate' the cursor cleany, by moving to the end */
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (options.offset && options.offset > skipped) {
 | 
			
		||||
                            skipped++;
 | 
			
		||||
                            cursor.continue(); /* We need to Moving the cursor forward */
 | 
			
		||||
                        } else {
 | 
			
		||||
                            // This time, it looks like it's good!
 | 
			
		||||
                            if (options.addIndividually) {
 | 
			
		||||
                                collection.add(cursor.value);
 | 
			
		||||
                            } else if (options.clear) {
 | 
			
		||||
                                var deleteRequest = store.delete(cursor.value[idAttribute]);
 | 
			
		||||
                                deleteRequest.onsuccess = function (event) {
 | 
			
		||||
                                    elements.push(cursor.value);
 | 
			
		||||
                                };
 | 
			
		||||
                                deleteRequest.onerror = function (event) {
 | 
			
		||||
                                    elements.push(cursor.value);
 | 
			
		||||
                                };
 | 
			
		||||
 | 
			
		||||
                            } else {
 | 
			
		||||
                                elements.push(cursor.value);
 | 
			
		||||
                            }
 | 
			
		||||
                            processed++;
 | 
			
		||||
                            cursor.continue();
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        close :function(){
 | 
			
		||||
            if(this.db){
 | 
			
		||||
                this.db.close();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // ExecutionQueue object
 | 
			
		||||
    // The execution queue is an abstraction to buffer up requests to the database.
 | 
			
		||||
    // It holds a "driver". When the driver is ready, it just fires up the queue and executes in sync.
 | 
			
		||||
    function ExecutionQueue(schema,next,nolog) {
 | 
			
		||||
        this.driver     = new Driver(schema, this.ready.bind(this), nolog, this.error.bind(this));
 | 
			
		||||
        this.started    = false;
 | 
			
		||||
        this.failed     = false;
 | 
			
		||||
        this.stack      = [];
 | 
			
		||||
        this.version    = _.last(schema.migrations).version;
 | 
			
		||||
        this.next       = next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // ExecutionQueue Prototype
 | 
			
		||||
    ExecutionQueue.prototype = {
 | 
			
		||||
        // Called when the driver is ready
 | 
			
		||||
        // It just loops over the elements in the queue and executes them.
 | 
			
		||||
        ready: function () {
 | 
			
		||||
            this.started = true;
 | 
			
		||||
            _.each(this.stack, function (message) {
 | 
			
		||||
                this.execute(message);
 | 
			
		||||
            }.bind(this));
 | 
			
		||||
            this.stack = [];    // fix memory leak
 | 
			
		||||
            this.next();
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        error: function() {
 | 
			
		||||
            this.failed = true;
 | 
			
		||||
            _.each(this.stack, function (message) {
 | 
			
		||||
                this.execute(message);
 | 
			
		||||
            }.bind(this));
 | 
			
		||||
            this.stack = [];
 | 
			
		||||
            this.next();
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Executes a given command on the driver. If not started, just stacks up one more element.
 | 
			
		||||
        execute: function (message) {
 | 
			
		||||
            if (this.started) {
 | 
			
		||||
              try {
 | 
			
		||||
                this.driver.execute(message[2].storeName || message[1].storeName, message[0], message[1], message[2]); // Upon messages, we execute the query
 | 
			
		||||
              } catch (e) {
 | 
			
		||||
                if (e.name === 'InvalidStateError') {
 | 
			
		||||
                  var f = window.onInvalidStateError;
 | 
			
		||||
                  if (f) f(e);
 | 
			
		||||
                }
 | 
			
		||||
                throw e;
 | 
			
		||||
              }
 | 
			
		||||
            } else if (this.failed) {
 | 
			
		||||
                message[2].error();
 | 
			
		||||
            } else {
 | 
			
		||||
                this.stack.push(message);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        close : function(){
 | 
			
		||||
            this.driver.close();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // Method used by Backbone for sync of data with data store. It was initially designed to work with "server side" APIs, This wrapper makes
 | 
			
		||||
    // it work with the local indexedDB stuff. It uses the schema attribute provided by the object.
 | 
			
		||||
    // The wrapper keeps an active Executuon Queue for each "schema", and executes querues agains it, based on the object type (collection or
 | 
			
		||||
    // single model), but also the method... etc.
 | 
			
		||||
    // Keeps track of the connections
 | 
			
		||||
    var Databases = {};
 | 
			
		||||
 | 
			
		||||
    function sync(method, object, options) {
 | 
			
		||||
 | 
			
		||||
        if(method == "closeall"){
 | 
			
		||||
            _.each(Databases,function(database){
 | 
			
		||||
                database.close();
 | 
			
		||||
            });
 | 
			
		||||
            // Clean up active databases object.
 | 
			
		||||
            Databases = {};
 | 
			
		||||
            return Backbone.$.Deferred().resolve();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If a model or a collection does not define a database, fall back on ajaxSync
 | 
			
		||||
        if (!object || !_.isObject(object.database)) {
 | 
			
		||||
            return Backbone.ajaxSync(method, object, options);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var schema = object.database;
 | 
			
		||||
        if (Databases[schema.id]) {
 | 
			
		||||
            if(Databases[schema.id].version != _.last(schema.migrations).version){
 | 
			
		||||
                Databases[schema.id].close();
 | 
			
		||||
                delete Databases[schema.id];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var promise;
 | 
			
		||||
 | 
			
		||||
        if (typeof Backbone.$ === 'undefined' || typeof Backbone.$.Deferred === 'undefined') {
 | 
			
		||||
            var noop = function() {};
 | 
			
		||||
            var resolve = noop;
 | 
			
		||||
            var reject = noop;
 | 
			
		||||
        } else {
 | 
			
		||||
            var dfd = Backbone.$.Deferred();
 | 
			
		||||
            var resolve = dfd.resolve;
 | 
			
		||||
            var reject = dfd.reject;
 | 
			
		||||
 | 
			
		||||
            promise = dfd.promise();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var success = options.success;
 | 
			
		||||
        options.success = function(resp) {
 | 
			
		||||
            if (success) success(resp);
 | 
			
		||||
            resolve();
 | 
			
		||||
            object.trigger('sync', object, resp, options);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var error = options.error;
 | 
			
		||||
        options.error = function(resp) {
 | 
			
		||||
            if (error) error(resp);
 | 
			
		||||
            reject();
 | 
			
		||||
            object.trigger('error', object, resp, options);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        var next = function(){
 | 
			
		||||
            Databases[schema.id].execute([method, object, options]);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if (!Databases[schema.id]) {
 | 
			
		||||
            Databases[schema.id] = new ExecutionQueue(schema,next,schema.nolog);
 | 
			
		||||
        } else {
 | 
			
		||||
            next();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return promise;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Backbone.ajaxSync = Backbone.sync;
 | 
			
		||||
    Backbone.sync = sync;
 | 
			
		||||
 | 
			
		||||
    return { sync: sync, debugLog: debugLog};
 | 
			
		||||
}));
 | 
			
		||||
							
								
								
									
										28
									
								
								package.json
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								package.json
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -15,11 +15,17 @@
 | 
			
		|||
    "postinstall": "yarn build:acknowledgments && yarn build:fuses && patch-package && yarn electron:install-app-deps && rimraf node_modules/dtrace-provider",
 | 
			
		||||
    "postuninstall": "yarn build:acknowledgments",
 | 
			
		||||
    "start": "electron .",
 | 
			
		||||
    "grunt": "grunt",
 | 
			
		||||
    "generate": "yarn grunt",
 | 
			
		||||
    "generate": "npm-run-all build-protobuf transpile sass get-expire-time copy-and-concat",
 | 
			
		||||
    "build-release": "yarn run build",
 | 
			
		||||
    "sign-release": "node ts/updater/generateSignature.js",
 | 
			
		||||
    "notarize": "node ts/build/notarize.js",
 | 
			
		||||
    "get-strings": "node ts/scripts/get-strings.js",
 | 
			
		||||
    "get-expire-time": "node ts/scripts/get-expire-time.js",
 | 
			
		||||
    "copy-and-concat": "node ts/scripts/copy-and-concat.js",
 | 
			
		||||
    "sass": "npm-run-all sass-manifest sass-manifest-bridge",
 | 
			
		||||
    "sass-base": "node-sass --source-map true --importer node_modules/node-sass-import-once/index.js",
 | 
			
		||||
    "sass-manifest": "yarn sass-base stylesheets/manifest.scss stylesheets/manifest.css",
 | 
			
		||||
    "sass-manifest-bridge": "yarn sass-base stylesheets/manifest_bridge.scss stylesheets/manifest_bridge.css",
 | 
			
		||||
    "build-module-protobuf": "pbjs --target static-module --wrap commonjs --out ts/protobuf/compiled.js protos/*.proto && pbts --out ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
 | 
			
		||||
    "clean-module-protobuf": "rm -f ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
 | 
			
		||||
    "build-protobuf": "yarn build-module-protobuf",
 | 
			
		||||
| 
						 | 
				
			
			@ -43,18 +49,16 @@
 | 
			
		|||
    "clean-transpile-once": "rimraf app/**/*.js app/*.js ts/**/*.js ts/*.js tsconfig.tsbuildinfo",
 | 
			
		||||
    "clean-transpile": "yarn run clean-transpile-once && yarn run clean-transpile-once",
 | 
			
		||||
    "open-coverage": "open coverage/lcov-report/index.html",
 | 
			
		||||
    "ready": "npm-run-all --print-label clean-transpile grunt --parallel lint lint-deps test-node test-electron",
 | 
			
		||||
    "ready": "npm-run-all --print-label clean-transpile generate --parallel lint lint-deps test-node test-electron",
 | 
			
		||||
    "dev": "run-p --print-label dev:*",
 | 
			
		||||
    "dev:grunt": "yarn grunt dev",
 | 
			
		||||
    "dev:transpile": "yarn run transpile --watch --preserveWatchOutput",
 | 
			
		||||
    "dev:webpack": "cross-env NODE_ENV=development webpack serve --mode development",
 | 
			
		||||
    "dev:typed-scss": "yarn build:typed-scss -w",
 | 
			
		||||
    "dev:storybook": "cross-env SIGNAL_ENV=storybook start-storybook -p 6006 -s ./",
 | 
			
		||||
    "storybook:axe": "build-storybook && axe-storybook",
 | 
			
		||||
    "build": "run-s --print-label build:grunt build:typed-scss build:webpack build:fuses:release build:release build:fuses build:zip",
 | 
			
		||||
    "build": "run-s --print-label generate build:typed-scss build:webpack build:fuses:release build:release build:fuses build:zip",
 | 
			
		||||
    "build:acknowledgments": "node scripts/generate-acknowledgments.js",
 | 
			
		||||
    "build:dev": "run-s --print-label build:grunt build:typed-scss build:webpack",
 | 
			
		||||
    "build:grunt": "yarn grunt",
 | 
			
		||||
    "build:dev": "run-s --print-label generate build:typed-scss build:webpack",
 | 
			
		||||
    "build:typed-scss": "tsm sticker-creator",
 | 
			
		||||
    "build:webpack": "run-p build:webpack:sticker-creator build:webpack:preload build:webpack:sql-worker build:webpack:heic-worker",
 | 
			
		||||
    "build:webpack:sticker-creator": "cross-env NODE_ENV=production webpack",
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +69,7 @@
 | 
			
		|||
    "build:release": "cross-env SIGNAL_ENV=production yarn build:electron -- --config.directories.output=release",
 | 
			
		||||
    "build:fuses": "node scripts/fuse-electron.js",
 | 
			
		||||
    "build:fuses:release": "node scripts/fuse-electron.js --release",
 | 
			
		||||
    "build:zip": "node scripts/zip-macos-release.js",
 | 
			
		||||
    "build:zip": "node ts/scripts/zip-macos-release.js",
 | 
			
		||||
    "preverify:ts": "yarn build:typed-scss",
 | 
			
		||||
    "verify": "run-p --print-label verify:*",
 | 
			
		||||
    "verify:ts": "tsc --noEmit",
 | 
			
		||||
| 
						 | 
				
			
			@ -264,14 +268,6 @@
 | 
			
		|||
    "eslint-plugin-more": "1.0.0",
 | 
			
		||||
    "eslint-plugin-react": "7.20.6",
 | 
			
		||||
    "file-loader": "4.2.0",
 | 
			
		||||
    "grunt": "1.4.1",
 | 
			
		||||
    "grunt-cli": "1.4.3",
 | 
			
		||||
    "grunt-contrib-concat": "2.0.0",
 | 
			
		||||
    "grunt-contrib-copy": "1.0.0",
 | 
			
		||||
    "grunt-contrib-watch": "1.1.0",
 | 
			
		||||
    "grunt-exec": "3.0.0",
 | 
			
		||||
    "grunt-gitinfo": "0.1.9",
 | 
			
		||||
    "grunt-sass": "3.1.0",
 | 
			
		||||
    "html-webpack-plugin": "5.3.1",
 | 
			
		||||
    "mocha": "9.1.3",
 | 
			
		||||
    "mocha-testcheck": "1.0.0-rc.0",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,8 @@
 | 
			
		|||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  rules: {
 | 
			
		||||
    'no-console': 'off',
 | 
			
		||||
 | 
			
		||||
    // We still get the value of this rule, it just allows for dev deps
 | 
			
		||||
    'import/no-extraneous-dependencies': [
 | 
			
		||||
      'error',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,6 @@
 | 
			
		|||
// Copyright 2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
const assert = require('assert');
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const { join } = require('path');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const path = require('path');
 | 
			
		||||
const { execSync } = require('child_process');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,6 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const _ = require('lodash');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,6 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const { execSync } = require('child_process');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,6 @@
 | 
			
		|||
// Copyright 2018-2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const _ = require('lodash');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,6 @@
 | 
			
		|||
// Copyright 2018-2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const _ = require('lodash');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								ts/scripts/.eslintrc.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								ts/scripts/.eslintrc.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
// Copyright 2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  rules: {
 | 
			
		||||
    'no-console': 'off',
 | 
			
		||||
 | 
			
		||||
    // We still get the value of this rule, it just allows for dev deps
 | 
			
		||||
    'import/no-extraneous-dependencies': [
 | 
			
		||||
      'error',
 | 
			
		||||
      {
 | 
			
		||||
        devDependencies: true,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										54
									
								
								ts/scripts/copy-and-concat.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								ts/scripts/copy-and-concat.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
import { basename, join } from 'path';
 | 
			
		||||
import { copyFileSync, readFileSync, writeFileSync } from 'fs';
 | 
			
		||||
 | 
			
		||||
// Concat
 | 
			
		||||
 | 
			
		||||
console.log('Concatenating...');
 | 
			
		||||
 | 
			
		||||
const BASE_BOWER = join(__dirname, '../../components');
 | 
			
		||||
const BASE_NODE = join(__dirname, '../../node_modules');
 | 
			
		||||
const CONCAT_TARGET = join(__dirname, '../../js/components.js');
 | 
			
		||||
const CONCAT_SOURCES = [
 | 
			
		||||
  join(BASE_NODE, 'jquery/dist/jquery.js'),
 | 
			
		||||
  join(BASE_NODE, 'mustache/mustache.js'),
 | 
			
		||||
  join(BASE_NODE, 'underscore/underscore.js'),
 | 
			
		||||
  join(BASE_BOWER, 'qrcode/qrcode.js'),
 | 
			
		||||
  join(BASE_BOWER, 'webaudiorecorder/lib/WebAudioRecorder.js'),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
let concat = '// concatenated components.js';
 | 
			
		||||
CONCAT_SOURCES.forEach(source => {
 | 
			
		||||
  const contents = readFileSync(source, 'utf8');
 | 
			
		||||
  const name = basename(source);
 | 
			
		||||
 | 
			
		||||
  console.log(`Concatenating ${source}`);
 | 
			
		||||
  concat += `\n\n// ${name}\n${contents}`;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log(`Writing to ${CONCAT_TARGET}`);
 | 
			
		||||
writeFileSync(CONCAT_TARGET, concat);
 | 
			
		||||
 | 
			
		||||
// Copy
 | 
			
		||||
 | 
			
		||||
console.log();
 | 
			
		||||
console.log('Copying...');
 | 
			
		||||
 | 
			
		||||
const BASE_JS = join(__dirname, '../../js');
 | 
			
		||||
const COPY_SOURCES = [
 | 
			
		||||
  {
 | 
			
		||||
    src: join(BASE_BOWER, 'mp3lameencoder/lib/Mp3LameEncoder.js'),
 | 
			
		||||
    dest: join(BASE_JS, 'Mp3LameEncoder.min.js'),
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    src: join(BASE_BOWER, 'webaudiorecorder/lib/WebAudioRecorderMp3.js'),
 | 
			
		||||
    dest: join(BASE_JS, 'WebAudioRecorderMp3.js'),
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
for (const { src, dest } of COPY_SOURCES) {
 | 
			
		||||
  console.log(`Copying ${src} to ${dest}`);
 | 
			
		||||
  copyFileSync(src, dest);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								ts/scripts/get-expire-time.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ts/scripts/get-expire-time.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
import { join } from 'path';
 | 
			
		||||
import { execSync } from 'child_process';
 | 
			
		||||
import { writeFileSync } from 'fs';
 | 
			
		||||
 | 
			
		||||
import { DAY } from '../util/durations';
 | 
			
		||||
 | 
			
		||||
const unixTimestamp = parseInt(
 | 
			
		||||
  execSync('git show -s --format=%ct').toString('utf8'),
 | 
			
		||||
  10
 | 
			
		||||
);
 | 
			
		||||
const buildCreation = unixTimestamp * 1000;
 | 
			
		||||
 | 
			
		||||
const buildExpiration = buildCreation + DAY * 90;
 | 
			
		||||
 | 
			
		||||
const localProductionPath = join(
 | 
			
		||||
  __dirname,
 | 
			
		||||
  '../../config/local-production.json'
 | 
			
		||||
);
 | 
			
		||||
const localProductionConfig = { buildCreation, buildExpiration };
 | 
			
		||||
writeFileSync(
 | 
			
		||||
  localProductionPath,
 | 
			
		||||
  `${JSON.stringify(localProductionConfig)}\n`
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										53
									
								
								ts/scripts/get-strings.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								ts/scripts/get-strings.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
// Copyright 2021 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
import { join, resolve } from 'path';
 | 
			
		||||
import { existsSync, readdirSync, writeFileSync } from 'fs';
 | 
			
		||||
import { execSync } from 'child_process';
 | 
			
		||||
 | 
			
		||||
import { readJsonSync } from 'fs-extra';
 | 
			
		||||
import type { LocaleMessagesType } from '../types/I18N';
 | 
			
		||||
 | 
			
		||||
console.log('Getting latest strings!');
 | 
			
		||||
 | 
			
		||||
console.log();
 | 
			
		||||
console.log('Getting strings, allow for new ones over 80% translated');
 | 
			
		||||
execSync('tx pull --all --use-git-timestamps --minimum-perc=80', {
 | 
			
		||||
  stdio: [null, process.stdout, process.stderr],
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log();
 | 
			
		||||
console.log('Getting strings, updating everything previously missed');
 | 
			
		||||
execSync('tx pull --use-git-timestamps', {
 | 
			
		||||
  stdio: [null, process.stdout, process.stderr],
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const BASE_DIR = join(__dirname, '../../_locales');
 | 
			
		||||
const en: LocaleMessagesType = readJsonSync(
 | 
			
		||||
  join(BASE_DIR, '/en/messages.json')
 | 
			
		||||
);
 | 
			
		||||
const locales = readdirSync(join(BASE_DIR, ''));
 | 
			
		||||
 | 
			
		||||
console.log();
 | 
			
		||||
console.log('Re-adding placeholders to non-en locales');
 | 
			
		||||
locales.forEach((locale: string) => {
 | 
			
		||||
  if (locale === 'en') {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  const target = resolve(join(BASE_DIR, locale, 'messages.json'));
 | 
			
		||||
  if (!existsSync(target)) {
 | 
			
		||||
    throw new Error(`File not found for ${locale}: ${target}`);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const messages: LocaleMessagesType = readJsonSync(target);
 | 
			
		||||
  Object.keys(messages).forEach(key => {
 | 
			
		||||
    if (!en[key]) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    messages[key].placeholders = en[key].placeholders;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  console.log(`Writing ${target}`);
 | 
			
		||||
  writeFileSync(target, `${JSON.stringify(messages, null, 4)}\n`);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +1,6 @@
 | 
			
		|||
// Copyright 2020 Signal Messenger, LLC
 | 
			
		||||
// SPDX-License-Identifier: AGPL-3.0-only
 | 
			
		||||
 | 
			
		||||
/* eslint-disable no-console */
 | 
			
		||||
 | 
			
		||||
import fs from 'fs';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import rimraf from 'rimraf';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,12 @@ export type LocaleMessagesType = {
 | 
			
		|||
  [key: string]: {
 | 
			
		||||
    message: string;
 | 
			
		||||
    description?: string;
 | 
			
		||||
    placeholders?: {
 | 
			
		||||
      [name: string]: {
 | 
			
		||||
        content: string;
 | 
			
		||||
        example: string;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,4 @@
 | 
			
		|||
[
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-after(",
 | 
			
		||||
    "path": "components/indexeddb-backbonejs-adapter/backbone-indexeddb.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-13T21:24:40.667Z",
 | 
			
		||||
    "line": "                            migration.after(function () {"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-before(",
 | 
			
		||||
    "path": "components/indexeddb-backbonejs-adapter/backbone-indexeddb.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-13T21:24:40.667Z",
 | 
			
		||||
    "line": "                    migration.before(function () {"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "eval",
 | 
			
		||||
    "path": "components/mp3lameencoder/lib/Mp3LameEncoder.js",
 | 
			
		||||
| 
						 | 
				
			
			@ -599,6 +585,101 @@
 | 
			
		|||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-19T18:13:29.628Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertAfter(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "    if (this.tail) this.insertAfter(this.tail, node);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertBefore(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "    if (this.head) this.insertBefore(this.head, node);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertBefore(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "                q._tasks.insertBefore(nextNode, item);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "function wrap(defer) {",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "var setImmediate$1 = wrap(_defer);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.js",
 | 
			
		||||
    "line": "var nextTick = wrap(_defer$1);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-$(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.min.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertAfter(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.min.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertBefore(",
 | 
			
		||||
    "path": "node_modules/async/dist/async.min.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertAfter(",
 | 
			
		||||
    "path": "node_modules/async/internal/DoublyLinkedList.js",
 | 
			
		||||
    "line": "    if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertBefore(",
 | 
			
		||||
    "path": "node_modules/async/internal/DoublyLinkedList.js",
 | 
			
		||||
    "line": "    if (this.head) this.insertBefore(this.head, node);else setInitial(this, node);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/async/internal/setImmediate.js",
 | 
			
		||||
    "line": "function wrap(defer) {",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/async/internal/setImmediate.js",
 | 
			
		||||
    "line": "exports.default = wrap(_defer);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-insertBefore(",
 | 
			
		||||
    "path": "node_modules/async/priorityQueue.js",
 | 
			
		||||
    "line": "                q._tasks.insertBefore(nextNode, item);",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-12-11T02:14:15.457Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "DOM-innerHTML",
 | 
			
		||||
    "path": "node_modules/axe-core/axe.js",
 | 
			
		||||
| 
						 | 
				
			
			@ -6618,26 +6699,6 @@
 | 
			
		|||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-19T21:59:32.770Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/underscore.string/dist/underscore.string.js",
 | 
			
		||||
    "line": "module.exports = function wrap(str, options){",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-19T18:13:29.628Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/underscore.string/dist/underscore.string.min.js",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2021-05-06T21:37:22.288Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-wrap(",
 | 
			
		||||
    "path": "node_modules/underscore.string/wrap.js",
 | 
			
		||||
    "line": "module.exports = function wrap(str, options){",
 | 
			
		||||
    "reasonCategory": "falseMatch",
 | 
			
		||||
    "updated": "2018-09-19T18:13:29.628Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "rule": "jQuery-after(",
 | 
			
		||||
    "path": "node_modules/underscore/amd/after.js",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,6 @@ const FILES_TO_IGNORE = new Set(
 | 
			
		|||
  [
 | 
			
		||||
    '.github/ISSUE_TEMPLATE/bug_report.md',
 | 
			
		||||
    '.github/PULL_REQUEST_TEMPLATE.md',
 | 
			
		||||
    'components/indexeddb-backbonejs-adapter/backbone-indexeddb.js',
 | 
			
		||||
    'components/mp3lameencoder/lib/Mp3LameEncoder.js',
 | 
			
		||||
    'components/qrcode/qrcode.js',
 | 
			
		||||
    'components/recorderjs/recorder.js',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,14 +170,6 @@ const excludedFilesRegexp = RegExp(
 | 
			
		|||
    '^node_modules/gauge/.+',
 | 
			
		||||
    '^node_modules/global-agent/.+',
 | 
			
		||||
    '^node_modules/globule/.+',
 | 
			
		||||
    '^node_modules/grunt-cli/.+',
 | 
			
		||||
    '^node_modules/grunt-contrib-concat/.+',
 | 
			
		||||
    '^node_modules/grunt-contrib-watch/.+',
 | 
			
		||||
    '^node_modules/grunt-gitinfo/.+',
 | 
			
		||||
    '^node_modules/grunt-legacy-log-utils/.+',
 | 
			
		||||
    '^node_modules/grunt-legacy-log/.+',
 | 
			
		||||
    '^node_modules/grunt-legacy-util/.+',
 | 
			
		||||
    '^node_modules/grunt/.+',
 | 
			
		||||
    '^node_modules/handle-thing/.+',
 | 
			
		||||
    '^node_modules/handlebars/.+', // Used by nyc#istanbul-reports
 | 
			
		||||
    '^node_modules/har-validator/.+',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										548
									
								
								yarn.lock
									
										
									
									
									
								
							
							
						
						
									
										548
									
								
								yarn.lock
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -3862,11 +3862,6 @@ arr-union@^3.1.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
 | 
			
		||||
  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
 | 
			
		||||
 | 
			
		||||
array-each@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
 | 
			
		||||
  integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
 | 
			
		||||
 | 
			
		||||
array-filter@~0.0.0:
 | 
			
		||||
  version "0.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
 | 
			
		||||
| 
						 | 
				
			
			@ -3923,11 +3918,6 @@ array-reduce@~0.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
 | 
			
		||||
  integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
 | 
			
		||||
 | 
			
		||||
array-slice@^1.0.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
 | 
			
		||||
  integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
 | 
			
		||||
 | 
			
		||||
array-union@^1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
 | 
			
		||||
| 
						 | 
				
			
			@ -4127,7 +4117,7 @@ async-limiter@~1.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
 | 
			
		||||
  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
 | 
			
		||||
 | 
			
		||||
async@0.9.x, async@~0.9.0:
 | 
			
		||||
async@0.9.x:
 | 
			
		||||
  version "0.9.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4137,18 +4127,13 @@ async@^2.1.4:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    lodash "^4.14.0"
 | 
			
		||||
 | 
			
		||||
async@^2.6.0, async@^2.6.2:
 | 
			
		||||
async@^2.6.2:
 | 
			
		||||
  version "2.6.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
 | 
			
		||||
  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    lodash "^4.17.14"
 | 
			
		||||
 | 
			
		||||
async@~3.2.0:
 | 
			
		||||
  version "3.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
 | 
			
		||||
  integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
 | 
			
		||||
 | 
			
		||||
asynckit@^0.4.0:
 | 
			
		||||
  version "0.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 | 
			
		||||
| 
						 | 
				
			
			@ -4746,16 +4731,6 @@ body-parser@1.19.0:
 | 
			
		|||
    raw-body "2.4.0"
 | 
			
		||||
    type-is "~1.6.17"
 | 
			
		||||
 | 
			
		||||
body@^5.1.0:
 | 
			
		||||
  version "5.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069"
 | 
			
		||||
  integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    continuable-cache "^0.3.1"
 | 
			
		||||
    error "^7.0.0"
 | 
			
		||||
    raw-body "~1.1.0"
 | 
			
		||||
    safe-json-parse "~1.0.1"
 | 
			
		||||
 | 
			
		||||
bonjour@^3.5.0:
 | 
			
		||||
  version "3.5.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
 | 
			
		||||
| 
						 | 
				
			
			@ -5036,11 +5011,6 @@ builtin-status-codes@^3.0.0:
 | 
			
		|||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 | 
			
		||||
 | 
			
		||||
bytes@1:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
 | 
			
		||||
  integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
 | 
			
		||||
 | 
			
		||||
bytes@3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 | 
			
		||||
| 
						 | 
				
			
			@ -5288,7 +5258,7 @@ chalk@^4.0.0, chalk@^4.1.0:
 | 
			
		|||
    ansi-styles "^4.1.0"
 | 
			
		||||
    supports-color "^7.1.0"
 | 
			
		||||
 | 
			
		||||
chalk@^4.1.1, chalk@^4.1.2:
 | 
			
		||||
chalk@^4.1.1:
 | 
			
		||||
  version "4.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
 | 
			
		||||
  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
 | 
			
		||||
| 
						 | 
				
			
			@ -5296,14 +5266,6 @@ chalk@^4.1.1, chalk@^4.1.2:
 | 
			
		|||
    ansi-styles "^4.1.0"
 | 
			
		||||
    supports-color "^7.1.0"
 | 
			
		||||
 | 
			
		||||
chalk@~4.1.0:
 | 
			
		||||
  version "4.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
 | 
			
		||||
  integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    ansi-styles "^4.1.0"
 | 
			
		||||
    supports-color "^7.1.0"
 | 
			
		||||
 | 
			
		||||
change-emitter@^0.1.2:
 | 
			
		||||
  version "0.1.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
 | 
			
		||||
| 
						 | 
				
			
			@ -5681,10 +5643,6 @@ colors@^1.1.2:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
 | 
			
		||||
  integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
 | 
			
		||||
 | 
			
		||||
colors@~1.1.2:
 | 
			
		||||
  version "1.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
 | 
			
		||||
 | 
			
		||||
combined-stream@1.0.6, combined-stream@~1.0.6:
 | 
			
		||||
  version "1.0.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
 | 
			
		||||
| 
						 | 
				
			
			@ -5866,11 +5824,6 @@ content-type@~1.0.4:
 | 
			
		|||
  version "1.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 | 
			
		||||
 | 
			
		||||
continuable-cache@^0.3.1:
 | 
			
		||||
  version "0.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
 | 
			
		||||
  integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=
 | 
			
		||||
 | 
			
		||||
convert-source-map@^1.1.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
 | 
			
		||||
  version "1.6.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
 | 
			
		||||
| 
						 | 
				
			
			@ -6271,11 +6224,6 @@ date-now@^0.1.4:
 | 
			
		|||
  version "0.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
 | 
			
		||||
 | 
			
		||||
dateformat@~3.0.3:
 | 
			
		||||
  version "3.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
 | 
			
		||||
  integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
 | 
			
		||||
 | 
			
		||||
debug-log@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
 | 
			
		||||
| 
						 | 
				
			
			@ -6512,11 +6460,6 @@ destroy@~1.0.4:
 | 
			
		|||
  version "1.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
 | 
			
		||||
 | 
			
		||||
detect-file@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
 | 
			
		||||
  integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
 | 
			
		||||
 | 
			
		||||
detect-indent@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
 | 
			
		||||
| 
						 | 
				
			
			@ -7079,13 +7022,6 @@ error-ex@^1.3.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    is-arrayish "^0.2.1"
 | 
			
		||||
 | 
			
		||||
error@^7.0.0:
 | 
			
		||||
  version "7.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894"
 | 
			
		||||
  integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    string-template "~0.2.1"
 | 
			
		||||
 | 
			
		||||
es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.9.0:
 | 
			
		||||
  version "1.13.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
 | 
			
		||||
| 
						 | 
				
			
			@ -7661,10 +7597,6 @@ event-target-shim@^5.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
 | 
			
		||||
  integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
 | 
			
		||||
 | 
			
		||||
eventemitter2@~0.4.13:
 | 
			
		||||
  version "0.4.14"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
 | 
			
		||||
 | 
			
		||||
eventemitter3@^2.0.3:
 | 
			
		||||
  version "2.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
 | 
			
		||||
| 
						 | 
				
			
			@ -7772,11 +7704,6 @@ execa@^5.0.0:
 | 
			
		|||
    signal-exit "^3.0.3"
 | 
			
		||||
    strip-final-newline "^2.0.0"
 | 
			
		||||
 | 
			
		||||
exit@~0.1.2:
 | 
			
		||||
  version "0.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
 | 
			
		||||
  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
 | 
			
		||||
 | 
			
		||||
expand-brackets@^0.1.4:
 | 
			
		||||
  version "0.1.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
 | 
			
		||||
| 
						 | 
				
			
			@ -7806,13 +7733,6 @@ expand-template@^2.0.3:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
 | 
			
		||||
  integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
 | 
			
		||||
 | 
			
		||||
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
 | 
			
		||||
  integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    homedir-polyfill "^1.0.1"
 | 
			
		||||
 | 
			
		||||
express@^4.17.0, express@^4.17.1:
 | 
			
		||||
  version "4.17.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
 | 
			
		||||
| 
						 | 
				
			
			@ -8039,12 +7959,6 @@ faye-websocket@^0.11.3, faye-websocket@~0.11.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    websocket-driver ">=0.5.1"
 | 
			
		||||
 | 
			
		||||
faye-websocket@~0.10.0:
 | 
			
		||||
  version "0.10.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
 | 
			
		||||
  dependencies:
 | 
			
		||||
    websocket-driver ">=0.5.1"
 | 
			
		||||
 | 
			
		||||
fbjs@^0.8.0, fbjs@^0.8.1:
 | 
			
		||||
  version "0.8.17"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
 | 
			
		||||
| 
						 | 
				
			
			@ -8120,10 +8034,6 @@ file-selector@^0.1.11:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    tslib "^1.9.0"
 | 
			
		||||
 | 
			
		||||
file-sync-cmp@^0.1.0:
 | 
			
		||||
  version "0.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"
 | 
			
		||||
 | 
			
		||||
file-system-cache@^1.0.5:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f"
 | 
			
		||||
| 
						 | 
				
			
			@ -8272,43 +8182,11 @@ find-yarn-workspace-root@^2.0.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    micromatch "^4.0.2"
 | 
			
		||||
 | 
			
		||||
findup-sync@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
 | 
			
		||||
  integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    detect-file "^1.0.0"
 | 
			
		||||
    is-glob "^4.0.0"
 | 
			
		||||
    micromatch "^4.0.2"
 | 
			
		||||
    resolve-dir "^1.0.1"
 | 
			
		||||
 | 
			
		||||
findup-sync@~0.3.0:
 | 
			
		||||
  version "0.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
 | 
			
		||||
  dependencies:
 | 
			
		||||
    glob "~5.0.0"
 | 
			
		||||
 | 
			
		||||
fined@^1.2.0:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
 | 
			
		||||
  integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    expand-tilde "^2.0.2"
 | 
			
		||||
    is-plain-object "^2.0.3"
 | 
			
		||||
    object.defaults "^1.1.0"
 | 
			
		||||
    object.pick "^1.2.0"
 | 
			
		||||
    parse-filepath "^1.0.1"
 | 
			
		||||
 | 
			
		||||
firstline@1.2.1:
 | 
			
		||||
  version "1.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.1.tgz#b88673c42009f8821fac2926e99720acee924fae"
 | 
			
		||||
  integrity sha1-uIZzxCAJ+IIfrCkm6ZcgrO6ST64=
 | 
			
		||||
 | 
			
		||||
flagged-respawn@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
 | 
			
		||||
  integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
 | 
			
		||||
 | 
			
		||||
flat-cache@^2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
 | 
			
		||||
| 
						 | 
				
			
			@ -8381,13 +8259,6 @@ for-own@^0.1.3, for-own@^0.1.4:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    for-in "^1.0.1"
 | 
			
		||||
 | 
			
		||||
for-own@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
 | 
			
		||||
  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    for-in "^1.0.1"
 | 
			
		||||
 | 
			
		||||
foreach@^2.0.5:
 | 
			
		||||
  version "2.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
 | 
			
		||||
| 
						 | 
				
			
			@ -8638,13 +8509,6 @@ gaze@^1.0.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    globule "^1.0.0"
 | 
			
		||||
 | 
			
		||||
gaze@^1.1.0:
 | 
			
		||||
  version "1.1.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
 | 
			
		||||
  integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    globule "^1.0.0"
 | 
			
		||||
 | 
			
		||||
gensync@^1.0.0-beta.2:
 | 
			
		||||
  version "1.0.0-beta.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
 | 
			
		||||
| 
						 | 
				
			
			@ -8740,15 +8604,6 @@ get-value@^2.0.3, get-value@^2.0.6:
 | 
			
		|||
  version "2.0.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
 | 
			
		||||
 | 
			
		||||
getobject@~0.1.0:
 | 
			
		||||
  version "0.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
 | 
			
		||||
 | 
			
		||||
getobject@~1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.0.tgz#27eeb6394716cfb6adcef275a33c2752df9ca49a"
 | 
			
		||||
  integrity sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==
 | 
			
		||||
 | 
			
		||||
getpass@^0.1.1:
 | 
			
		||||
  version "0.1.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
 | 
			
		||||
| 
						 | 
				
			
			@ -8805,7 +8660,7 @@ glob-to-regexp@^0.4.1:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
 | 
			
		||||
  integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
 | 
			
		||||
 | 
			
		||||
glob@7.1.6, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6:
 | 
			
		||||
glob@7.1.6, glob@^7.1.3, glob@^7.1.6:
 | 
			
		||||
  version "7.1.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
 | 
			
		||||
  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
 | 
			
		||||
| 
						 | 
				
			
			@ -8874,16 +8729,6 @@ glob@^7.1.4:
 | 
			
		|||
    once "^1.3.0"
 | 
			
		||||
    path-is-absolute "^1.0.0"
 | 
			
		||||
 | 
			
		||||
glob@~5.0.0:
 | 
			
		||||
  version "5.0.15"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
 | 
			
		||||
  dependencies:
 | 
			
		||||
    inflight "^1.0.4"
 | 
			
		||||
    inherits "2"
 | 
			
		||||
    minimatch "2 || 3"
 | 
			
		||||
    once "^1.3.0"
 | 
			
		||||
    path-is-absolute "^1.0.0"
 | 
			
		||||
 | 
			
		||||
global-agent@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
 | 
			
		||||
| 
						 | 
				
			
			@ -8910,26 +8755,6 @@ global-modules@2.0.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    global-prefix "^3.0.0"
 | 
			
		||||
 | 
			
		||||
global-modules@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
 | 
			
		||||
  integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    global-prefix "^1.0.1"
 | 
			
		||||
    is-windows "^1.0.1"
 | 
			
		||||
    resolve-dir "^1.0.0"
 | 
			
		||||
 | 
			
		||||
global-prefix@^1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
 | 
			
		||||
  integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    expand-tilde "^2.0.2"
 | 
			
		||||
    homedir-polyfill "^1.0.1"
 | 
			
		||||
    ini "^1.3.4"
 | 
			
		||||
    is-windows "^1.0.1"
 | 
			
		||||
    which "^1.2.14"
 | 
			
		||||
 | 
			
		||||
global-prefix@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
 | 
			
		||||
| 
						 | 
				
			
			@ -9102,135 +8927,6 @@ growl@1.10.5:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
 | 
			
		||||
  integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
 | 
			
		||||
 | 
			
		||||
grunt-cli@1.4.3:
 | 
			
		||||
  version "1.4.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.3.tgz#22c9f1a3d2780bf9b0d206e832e40f8f499175ff"
 | 
			
		||||
  integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    grunt-known-options "~2.0.0"
 | 
			
		||||
    interpret "~1.1.0"
 | 
			
		||||
    liftup "~3.0.1"
 | 
			
		||||
    nopt "~4.0.1"
 | 
			
		||||
    v8flags "~3.2.0"
 | 
			
		||||
 | 
			
		||||
grunt-cli@~1.4.2:
 | 
			
		||||
  version "1.4.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.2.tgz#8a83dcc89ebd92d278ccd6014105011cffc71165"
 | 
			
		||||
  integrity sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    grunt-known-options "~1.1.1"
 | 
			
		||||
    interpret "~1.1.0"
 | 
			
		||||
    liftup "~3.0.1"
 | 
			
		||||
    nopt "~4.0.1"
 | 
			
		||||
    v8flags "~3.2.0"
 | 
			
		||||
 | 
			
		||||
grunt-contrib-concat@2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz#3af65e4663186abce6052a6bed345b53c0551090"
 | 
			
		||||
  integrity sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    chalk "^4.1.2"
 | 
			
		||||
    source-map "^0.5.3"
 | 
			
		||||
 | 
			
		||||
grunt-contrib-copy@1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz#7060c6581e904b8ab0d00f076e0a8f6e3e7c3573"
 | 
			
		||||
  integrity sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    chalk "^1.1.1"
 | 
			
		||||
    file-sync-cmp "^0.1.0"
 | 
			
		||||
 | 
			
		||||
grunt-contrib-watch@1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz#c143ca5b824b288a024b856639a5345aedb78ed4"
 | 
			
		||||
  integrity sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    async "^2.6.0"
 | 
			
		||||
    gaze "^1.1.0"
 | 
			
		||||
    lodash "^4.17.10"
 | 
			
		||||
    tiny-lr "^1.1.1"
 | 
			
		||||
 | 
			
		||||
grunt-exec@3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-exec/-/grunt-exec-3.0.0.tgz#881f868d64098788fddaf22fa25d8572a9d64dc7"
 | 
			
		||||
  integrity sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==
 | 
			
		||||
 | 
			
		||||
grunt-gitinfo@0.1.9:
 | 
			
		||||
  version "0.1.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-gitinfo/-/grunt-gitinfo-0.1.9.tgz#299601084e5638cff0e3e4d36093beb5cec9b9ba"
 | 
			
		||||
  integrity sha512-nAyUZQrLkgHZuqepTgkA3jn9CX4kyrNcWzjENxo/nOwYjZPEWDJeaxWcYrAzB5OcBk5gYJmTA0r3XCgczxtbPg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    async "~0.9.0"
 | 
			
		||||
    getobject "~0.1.0"
 | 
			
		||||
    lodash "^4.17.14"
 | 
			
		||||
 | 
			
		||||
grunt-known-options@~1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
 | 
			
		||||
  integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==
 | 
			
		||||
 | 
			
		||||
grunt-known-options@~2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c"
 | 
			
		||||
  integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==
 | 
			
		||||
 | 
			
		||||
grunt-legacy-log-utils@~2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz#49a8c7dc74051476dcc116c32faf9db8646856ef"
 | 
			
		||||
  integrity sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    chalk "~4.1.0"
 | 
			
		||||
    lodash "~4.17.19"
 | 
			
		||||
 | 
			
		||||
grunt-legacy-log@~3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz#1c6eaf92371ea415af31ea84ce50d434ef6d39c4"
 | 
			
		||||
  integrity sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    colors "~1.1.2"
 | 
			
		||||
    grunt-legacy-log-utils "~2.1.0"
 | 
			
		||||
    hooker "~0.2.3"
 | 
			
		||||
    lodash "~4.17.19"
 | 
			
		||||
 | 
			
		||||
grunt-legacy-util@~2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz#0f929d13a2faf9988c9917c82bff609e2d9ba255"
 | 
			
		||||
  integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    async "~3.2.0"
 | 
			
		||||
    exit "~0.1.2"
 | 
			
		||||
    getobject "~1.0.0"
 | 
			
		||||
    hooker "~0.2.3"
 | 
			
		||||
    lodash "~4.17.21"
 | 
			
		||||
    underscore.string "~3.3.5"
 | 
			
		||||
    which "~2.0.2"
 | 
			
		||||
 | 
			
		||||
grunt-sass@3.1.0:
 | 
			
		||||
  version "3.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt-sass/-/grunt-sass-3.1.0.tgz#a5936cc2a80ec08092d9f31c101dc307d1e4f71c"
 | 
			
		||||
  integrity sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==
 | 
			
		||||
 | 
			
		||||
grunt@1.4.1:
 | 
			
		||||
  version "1.4.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.1.tgz#7d1e17db1f9c8108777f7273d6b9359755576f50"
 | 
			
		||||
  integrity sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    dateformat "~3.0.3"
 | 
			
		||||
    eventemitter2 "~0.4.13"
 | 
			
		||||
    exit "~0.1.2"
 | 
			
		||||
    findup-sync "~0.3.0"
 | 
			
		||||
    glob "~7.1.6"
 | 
			
		||||
    grunt-cli "~1.4.2"
 | 
			
		||||
    grunt-known-options "~2.0.0"
 | 
			
		||||
    grunt-legacy-log "~3.0.0"
 | 
			
		||||
    grunt-legacy-util "~2.0.1"
 | 
			
		||||
    iconv-lite "~0.4.13"
 | 
			
		||||
    js-yaml "~3.14.0"
 | 
			
		||||
    minimatch "~3.0.4"
 | 
			
		||||
    mkdirp "~1.0.4"
 | 
			
		||||
    nopt "~3.0.6"
 | 
			
		||||
    rimraf "~3.0.2"
 | 
			
		||||
 | 
			
		||||
gud@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
 | 
			
		||||
| 
						 | 
				
			
			@ -9477,17 +9173,6 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    react-is "^16.7.0"
 | 
			
		||||
 | 
			
		||||
homedir-polyfill@^1.0.1:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
 | 
			
		||||
  integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    parse-passwd "^1.0.0"
 | 
			
		||||
 | 
			
		||||
hooker@~0.2.3:
 | 
			
		||||
  version "0.2.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
 | 
			
		||||
 | 
			
		||||
hosted-git-info@^2.1.4:
 | 
			
		||||
  version "2.8.9"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
 | 
			
		||||
| 
						 | 
				
			
			@ -9748,10 +9433,6 @@ iconv-lite@^0.6.2:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    safer-buffer ">= 2.1.2 < 3.0.0"
 | 
			
		||||
 | 
			
		||||
iconv-lite@~0.4.13:
 | 
			
		||||
  version "0.4.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
 | 
			
		||||
 | 
			
		||||
icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
 | 
			
		||||
| 
						 | 
				
			
			@ -9987,11 +9668,6 @@ interpret@^2.2.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
 | 
			
		||||
  integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
 | 
			
		||||
 | 
			
		||||
interpret@~1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
 | 
			
		||||
  integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
 | 
			
		||||
 | 
			
		||||
intl-tel-input@17.0.13:
 | 
			
		||||
  version "17.0.13"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/intl-tel-input/-/intl-tel-input-17.0.13.tgz#74a51db3b44f47ae8264df7d101a0810e53c77a6"
 | 
			
		||||
| 
						 | 
				
			
			@ -10043,14 +9719,6 @@ is-absolute-url@^3.0.3:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
 | 
			
		||||
  integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
 | 
			
		||||
 | 
			
		||||
is-absolute@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
 | 
			
		||||
  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-relative "^1.0.0"
 | 
			
		||||
    is-windows "^1.0.1"
 | 
			
		||||
 | 
			
		||||
is-accessor-descriptor@^0.1.6:
 | 
			
		||||
  version "0.1.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
 | 
			
		||||
| 
						 | 
				
			
			@ -10471,13 +10139,6 @@ is-regex@^1.1.4:
 | 
			
		|||
    call-bind "^1.0.2"
 | 
			
		||||
    has-tostringtag "^1.0.0"
 | 
			
		||||
 | 
			
		||||
is-relative@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
 | 
			
		||||
  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-unc-path "^1.0.0"
 | 
			
		||||
 | 
			
		||||
is-root@2.1.0:
 | 
			
		||||
  version "2.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
 | 
			
		||||
| 
						 | 
				
			
			@ -10532,13 +10193,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
 | 
			
		|||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
 | 
			
		||||
 | 
			
		||||
is-unc-path@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
 | 
			
		||||
  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    unc-path-regex "^0.1.2"
 | 
			
		||||
 | 
			
		||||
is-unicode-supported@^0.1.0:
 | 
			
		||||
  version "0.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
 | 
			
		||||
| 
						 | 
				
			
			@ -10560,7 +10214,7 @@ is-window@^1.0.2:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
 | 
			
		||||
  integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
 | 
			
		||||
 | 
			
		||||
is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2:
 | 
			
		||||
is-windows@^1.0.0, is-windows@^1.0.2:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -10748,14 +10402,6 @@ js-yaml@^3.2.7:
 | 
			
		|||
    argparse "^1.0.7"
 | 
			
		||||
    esprima "^4.0.0"
 | 
			
		||||
 | 
			
		||||
js-yaml@~3.14.0:
 | 
			
		||||
  version "3.14.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
 | 
			
		||||
  integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    argparse "^1.0.7"
 | 
			
		||||
    esprima "^4.0.0"
 | 
			
		||||
 | 
			
		||||
jsbn@~0.1.0:
 | 
			
		||||
  version "0.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
 | 
			
		||||
| 
						 | 
				
			
			@ -11060,20 +10706,6 @@ libheif-js@^1.10.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/libheif-js/-/libheif-js-1.12.0.tgz#9ad1ed16a8e6412b4d3d83565d285465a00e7305"
 | 
			
		||||
  integrity sha512-hDs6xQ7028VOwAFwEtM0Q+B2x2NW69Jb2MhQFUbk3rUrHzz4qo5mqS8VrqNgYnSc8TiUGnR691LnO4uIfEE23w==
 | 
			
		||||
 | 
			
		||||
liftup@~3.0.1:
 | 
			
		||||
  version "3.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce"
 | 
			
		||||
  integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    extend "^3.0.2"
 | 
			
		||||
    findup-sync "^4.0.0"
 | 
			
		||||
    fined "^1.2.0"
 | 
			
		||||
    flagged-respawn "^1.0.1"
 | 
			
		||||
    is-plain-object "^2.0.4"
 | 
			
		||||
    object.map "^1.0.1"
 | 
			
		||||
    rechoir "^0.7.0"
 | 
			
		||||
    resolve "^1.19.0"
 | 
			
		||||
 | 
			
		||||
lines-and-columns@^1.1.6:
 | 
			
		||||
  version "1.1.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
 | 
			
		||||
| 
						 | 
				
			
			@ -11086,11 +10718,6 @@ linkify-it@2.2.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    uc.micro "^1.0.1"
 | 
			
		||||
 | 
			
		||||
livereload-js@^2.3.0:
 | 
			
		||||
  version "2.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c"
 | 
			
		||||
  integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==
 | 
			
		||||
 | 
			
		||||
load-json-file@^1.0.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
 | 
			
		||||
| 
						 | 
				
			
			@ -11201,7 +10828,7 @@ lodash.throttle@^4.1.1:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
 | 
			
		||||
  integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
 | 
			
		||||
 | 
			
		||||
lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.19, lodash@~4.17.21:
 | 
			
		||||
lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1:
 | 
			
		||||
  version "4.17.21"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
 | 
			
		||||
  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 | 
			
		||||
| 
						 | 
				
			
			@ -11340,13 +10967,6 @@ make-error@^1.1.1:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
 | 
			
		||||
  integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
 | 
			
		||||
 | 
			
		||||
make-iterator@^1.0.0:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
 | 
			
		||||
  integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    kind-of "^6.0.2"
 | 
			
		||||
 | 
			
		||||
mamacro@^0.0.3:
 | 
			
		||||
  version "0.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
 | 
			
		||||
| 
						 | 
				
			
			@ -11359,7 +10979,7 @@ map-age-cleaner@^0.1.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    p-defer "^1.0.0"
 | 
			
		||||
 | 
			
		||||
map-cache@^0.2.0, map-cache@^0.2.2:
 | 
			
		||||
map-cache@^0.2.2:
 | 
			
		||||
  version "0.2.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11748,7 +11368,7 @@ minimalistic-crypto-utils@^1.0.1:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
 | 
			
		||||
  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
 | 
			
		||||
 | 
			
		||||
"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2, minimatch@~3.0.4:
 | 
			
		||||
minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
 | 
			
		||||
  version "3.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
 | 
			
		||||
  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
 | 
			
		||||
| 
						 | 
				
			
			@ -11860,7 +11480,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    minimist "^1.2.5"
 | 
			
		||||
 | 
			
		||||
mkdirp@^1.0.3, mkdirp@~1.0.4:
 | 
			
		||||
mkdirp@^1.0.3:
 | 
			
		||||
  version "1.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
 | 
			
		||||
  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 | 
			
		||||
| 
						 | 
				
			
			@ -12262,20 +11882,6 @@ nopt@~1.0.10:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    abbrev "1"
 | 
			
		||||
 | 
			
		||||
nopt@~3.0.6:
 | 
			
		||||
  version "3.0.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
 | 
			
		||||
  dependencies:
 | 
			
		||||
    abbrev "1"
 | 
			
		||||
 | 
			
		||||
nopt@~4.0.1:
 | 
			
		||||
  version "4.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
 | 
			
		||||
  integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    abbrev "1"
 | 
			
		||||
    osenv "^0.1.4"
 | 
			
		||||
 | 
			
		||||
normalize-package-data@^2.3.2:
 | 
			
		||||
  version "2.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
 | 
			
		||||
| 
						 | 
				
			
			@ -12469,7 +12075,7 @@ object-copy@^0.1.0:
 | 
			
		|||
    define-property "^0.2.5"
 | 
			
		||||
    kind-of "^3.0.3"
 | 
			
		||||
 | 
			
		||||
object-inspect@^1.11.0:
 | 
			
		||||
object-inspect@^1.11.0, object-inspect@^1.9.0:
 | 
			
		||||
  version "1.11.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b"
 | 
			
		||||
  integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==
 | 
			
		||||
| 
						 | 
				
			
			@ -12479,11 +12085,6 @@ object-inspect@^1.7.0, object-inspect@^1.8.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
 | 
			
		||||
  integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
 | 
			
		||||
 | 
			
		||||
object-inspect@^1.9.0:
 | 
			
		||||
  version "1.11.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
 | 
			
		||||
  integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
 | 
			
		||||
 | 
			
		||||
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
 | 
			
		||||
| 
						 | 
				
			
			@ -12519,16 +12120,6 @@ object.assign@^4.1.2:
 | 
			
		|||
    has-symbols "^1.0.1"
 | 
			
		||||
    object-keys "^1.1.1"
 | 
			
		||||
 | 
			
		||||
object.defaults@^1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
 | 
			
		||||
  integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    array-each "^1.0.1"
 | 
			
		||||
    array-slice "^1.0.0"
 | 
			
		||||
    for-own "^1.0.0"
 | 
			
		||||
    isobject "^3.0.0"
 | 
			
		||||
 | 
			
		||||
object.entries@^1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
 | 
			
		||||
| 
						 | 
				
			
			@ -12602,14 +12193,6 @@ object.hasown@^1.1.0:
 | 
			
		|||
    define-properties "^1.1.3"
 | 
			
		||||
    es-abstract "^1.19.1"
 | 
			
		||||
 | 
			
		||||
object.map@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
 | 
			
		||||
  integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    for-own "^1.0.0"
 | 
			
		||||
    make-iterator "^1.0.0"
 | 
			
		||||
 | 
			
		||||
object.omit@^2.0.0:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
 | 
			
		||||
| 
						 | 
				
			
			@ -12617,7 +12200,7 @@ object.omit@^2.0.0:
 | 
			
		|||
    for-own "^0.1.4"
 | 
			
		||||
    is-extendable "^0.1.1"
 | 
			
		||||
 | 
			
		||||
object.pick@^1.2.0, object.pick@^1.3.0:
 | 
			
		||||
object.pick@^1.3.0:
 | 
			
		||||
  version "1.3.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
 | 
			
		||||
  dependencies:
 | 
			
		||||
| 
						 | 
				
			
			@ -13011,15 +12594,6 @@ parse-entities@^1.1.2:
 | 
			
		|||
    is-decimal "^1.0.0"
 | 
			
		||||
    is-hexadecimal "^1.0.0"
 | 
			
		||||
 | 
			
		||||
parse-filepath@^1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
 | 
			
		||||
  integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-absolute "^1.0.0"
 | 
			
		||||
    map-cache "^0.2.0"
 | 
			
		||||
    path-root "^0.1.1"
 | 
			
		||||
 | 
			
		||||
parse-glob@^3.0.4:
 | 
			
		||||
  version "3.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
 | 
			
		||||
| 
						 | 
				
			
			@ -13053,11 +12627,6 @@ parse-json@^5.0.0:
 | 
			
		|||
    json-parse-even-better-errors "^2.3.0"
 | 
			
		||||
    lines-and-columns "^1.1.6"
 | 
			
		||||
 | 
			
		||||
parse-passwd@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
 | 
			
		||||
  integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
 | 
			
		||||
 | 
			
		||||
parseurl@~1.3.2:
 | 
			
		||||
  version "1.3.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
 | 
			
		||||
| 
						 | 
				
			
			@ -13145,18 +12714,6 @@ path-parse@^1.0.5, path-parse@^1.0.6:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
 | 
			
		||||
  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 | 
			
		||||
 | 
			
		||||
path-root-regex@^0.1.0:
 | 
			
		||||
  version "0.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
 | 
			
		||||
  integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
 | 
			
		||||
 | 
			
		||||
path-root@^0.1.1:
 | 
			
		||||
  version "0.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
 | 
			
		||||
  integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    path-root-regex "^0.1.0"
 | 
			
		||||
 | 
			
		||||
path-to-regexp@0.1.7:
 | 
			
		||||
  version "0.1.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
 | 
			
		||||
| 
						 | 
				
			
			@ -13886,13 +13443,6 @@ qs@6.7.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
 | 
			
		||||
  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
 | 
			
		||||
 | 
			
		||||
qs@^6.4.0:
 | 
			
		||||
  version "6.10.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
 | 
			
		||||
  integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    side-channel "^1.0.4"
 | 
			
		||||
 | 
			
		||||
qs@^6.6.0:
 | 
			
		||||
  version "6.8.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/qs/-/qs-6.8.0.tgz#87b763f0d37ca54200334cd57bb2ef8f68a1d081"
 | 
			
		||||
| 
						 | 
				
			
			@ -14041,14 +13591,6 @@ raw-body@^2.2.0:
 | 
			
		|||
    iconv-lite "0.4.19"
 | 
			
		||||
    unpipe "1.0.0"
 | 
			
		||||
 | 
			
		||||
raw-body@~1.1.0:
 | 
			
		||||
  version "1.1.7"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425"
 | 
			
		||||
  integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    bytes "1"
 | 
			
		||||
    string_decoder "0.10"
 | 
			
		||||
 | 
			
		||||
raw-loader@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-2.0.0.tgz#e2813d9e1e3f80d1bbade5ad082e809679e20c26"
 | 
			
		||||
| 
						 | 
				
			
			@ -15019,14 +14561,6 @@ resolve-cwd@^3.0.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    resolve-from "^5.0.0"
 | 
			
		||||
 | 
			
		||||
resolve-dir@^1.0.0, resolve-dir@^1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
 | 
			
		||||
  integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
 | 
			
		||||
  dependencies:
 | 
			
		||||
    expand-tilde "^2.0.0"
 | 
			
		||||
    global-modules "^1.0.0"
 | 
			
		||||
 | 
			
		||||
resolve-from@^2.0.0:
 | 
			
		||||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
 | 
			
		||||
| 
						 | 
				
			
			@ -15075,7 +14609,7 @@ resolve@^1.13.1, resolve@^1.17.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    path-parse "^1.0.6"
 | 
			
		||||
 | 
			
		||||
resolve@^1.19.0, resolve@^1.20.0, resolve@^1.9.0:
 | 
			
		||||
resolve@^1.20.0, resolve@^1.9.0:
 | 
			
		||||
  version "1.20.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
 | 
			
		||||
  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
 | 
			
		||||
| 
						 | 
				
			
			@ -15160,7 +14694,7 @@ rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    glob "^7.1.3"
 | 
			
		||||
 | 
			
		||||
rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2:
 | 
			
		||||
rimraf@^3.0.0, rimraf@^3.0.2:
 | 
			
		||||
  version "3.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
 | 
			
		||||
  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
 | 
			
		||||
| 
						 | 
				
			
			@ -15234,11 +14768,6 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1,
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
 | 
			
		||||
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 | 
			
		||||
 | 
			
		||||
safe-json-parse@~1.0.1:
 | 
			
		||||
  version "1.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
 | 
			
		||||
  integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=
 | 
			
		||||
 | 
			
		||||
safe-regex@^1.1.0:
 | 
			
		||||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
 | 
			
		||||
| 
						 | 
				
			
			@ -15962,7 +15491,7 @@ split2@4.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/split2/-/split2-4.0.0.tgz#c76cb53ad55040ddff3a9c3b73fc88a4690f047c"
 | 
			
		||||
  integrity sha512-gjmavJzvQCAZzaEHWoJBOwqIUAiEvUOlguQ6uO0+0LTS1tlLa2YetTLWCrm049ouvLOa1l6SOGm3XaiRiCg9SQ==
 | 
			
		||||
 | 
			
		||||
sprintf-js@^1.0.3, sprintf-js@^1.1.2:
 | 
			
		||||
sprintf-js@^1.1.2:
 | 
			
		||||
  version "1.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
 | 
			
		||||
  integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
 | 
			
		||||
| 
						 | 
				
			
			@ -16069,11 +15598,6 @@ strict-uri-encode@^1.0.0:
 | 
			
		|||
  version "1.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
 | 
			
		||||
 | 
			
		||||
string-template@~0.2.1:
 | 
			
		||||
  version "0.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
 | 
			
		||||
  integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
 | 
			
		||||
 | 
			
		||||
string-width@^1.0.1:
 | 
			
		||||
  version "1.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
 | 
			
		||||
| 
						 | 
				
			
			@ -16210,10 +15734,6 @@ string.prototype.trimstart@^1.0.4:
 | 
			
		|||
    call-bind "^1.0.2"
 | 
			
		||||
    define-properties "^1.1.3"
 | 
			
		||||
 | 
			
		||||
string_decoder@0.10, string_decoder@~0.10.x:
 | 
			
		||||
  version "0.10.31"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
 | 
			
		||||
 | 
			
		||||
string_decoder@^1.0.0, string_decoder@~1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
 | 
			
		||||
| 
						 | 
				
			
			@ -16228,6 +15748,10 @@ string_decoder@^1.1.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    safe-buffer "~5.2.0"
 | 
			
		||||
 | 
			
		||||
string_decoder@~0.10.x:
 | 
			
		||||
  version "0.10.31"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
 | 
			
		||||
 | 
			
		||||
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
 | 
			
		||||
  version "5.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
 | 
			
		||||
| 
						 | 
				
			
			@ -16633,18 +16157,6 @@ tiny-invariant@^1.0.2:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73"
 | 
			
		||||
  integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==
 | 
			
		||||
 | 
			
		||||
tiny-lr@^1.1.1:
 | 
			
		||||
  version "1.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
 | 
			
		||||
  integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    body "^5.1.0"
 | 
			
		||||
    debug "^3.1.0"
 | 
			
		||||
    faye-websocket "~0.10.0"
 | 
			
		||||
    livereload-js "^2.3.0"
 | 
			
		||||
    object-assign "^4.1.0"
 | 
			
		||||
    qs "^6.4.0"
 | 
			
		||||
 | 
			
		||||
tiny-warning@^1.0.0, tiny-warning@^1.0.2:
 | 
			
		||||
  version "1.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
 | 
			
		||||
| 
						 | 
				
			
			@ -17009,19 +16521,6 @@ unbox-primitive@^1.0.1:
 | 
			
		|||
    has-symbols "^1.0.2"
 | 
			
		||||
    which-boxed-primitive "^1.0.2"
 | 
			
		||||
 | 
			
		||||
unc-path-regex@^0.1.2:
 | 
			
		||||
  version "0.1.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
 | 
			
		||||
  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
 | 
			
		||||
 | 
			
		||||
underscore.string@~3.3.5:
 | 
			
		||||
  version "3.3.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
 | 
			
		||||
  integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    sprintf-js "^1.0.3"
 | 
			
		||||
    util-deprecate "^1.0.2"
 | 
			
		||||
 | 
			
		||||
underscore@1.12.1, underscore@>=1.8.3:
 | 
			
		||||
  version "1.12.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
 | 
			
		||||
| 
						 | 
				
			
			@ -17264,13 +16763,6 @@ v8-compile-cache@^2.2.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
 | 
			
		||||
  integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
 | 
			
		||||
 | 
			
		||||
v8flags@~3.2.0:
 | 
			
		||||
  version "3.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
 | 
			
		||||
  integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    homedir-polyfill "^1.0.1"
 | 
			
		||||
 | 
			
		||||
validate-npm-package-license@^3.0.1:
 | 
			
		||||
  version "3.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
 | 
			
		||||
| 
						 | 
				
			
			@ -17587,14 +17079,14 @@ which-module@^2.0.0:
 | 
			
		|||
  version "2.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 | 
			
		||||
 | 
			
		||||
which@2.0.2, which@^2.0.1, which@^2.0.2, which@~2.0.2:
 | 
			
		||||
which@2.0.2, which@^2.0.1, which@^2.0.2:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
 | 
			
		||||
  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    isexe "^2.0.0"
 | 
			
		||||
 | 
			
		||||
which@^1.2.14, which@^1.2.9, which@^1.3.1:
 | 
			
		||||
which@^1.2.9, which@^1.3.1:
 | 
			
		||||
  version "1.3.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
 | 
			
		||||
  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue