ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç { 'plugins': [ '@babel', 'promise', 'jsdoc' ], 'extends': [ 'eslint:recommended', 'plugin:promise/recommended' ], 'env': { 'browser': true, // Enable ES6+ features by default. // See http://eslint.org/docs/user-guide/configuring#specifying-environments // Note: The YUI override must exactly match this when disabling the ES6+ version because those features are not supported by Shifter. 'es2020': true, 'amd': true }, 'globals': { 'M': true, 'Y': true }, // Warn about unused eslint-disable statements. 'reportUnusedDisableDirectives': true, 'rules': { // See http://eslint.org/docs/rules/ for all rules and explanations of all // rules. // === Possible Errors === 'comma-dangle': 'off', 'no-console': 'error', 'no-empty': 'warn', 'no-extra-parens': 'off', 'no-prototype-builtins': 'off', 'no-unreachable': 'warn', // === Best Practices === // (these mostly match our jshint config) 'array-callback-return': 'warn', 'block-scoped-var': 'warn', 'complexity': 'warn', 'consistent-return': 'warn', 'curly': 'error', 'dot-notation': 'warn', 'no-alert': 'warn', 'no-caller': 'error', 'no-div-regex': 'error', 'no-empty-function': 'warn', 'no-eq-null': 'error', 'no-eval': 'error', 'no-extend-native': 'error', 'no-extra-bind': 'warn', 'no-floating-decimal': 'warn', 'no-global-assign': 'warn', 'no-implied-eval': 'error', 'no-invalid-this': 'error', 'no-iterator': 'error', 'no-labels': 'error', 'no-loop-func': 'error', 'no-multi-spaces': 'warn', 'no-multi-str': 'error', 'no-new-func': 'error', 'no-new-wrappers': 'error', 'no-octal-escape': 'error', 'no-proto': 'error', 'no-redeclare': 'warn', 'no-restricted-globals': ['error', { 'name': 'Notification' }], 'no-return-assign': 'error', 'no-script-url': 'error', 'no-self-compare': 'error', 'no-sequences': 'warn', 'no-throw-literal': 'warn', 'no-unmodified-loop-condition': 'error', 'no-unused-expressions': 'error', 'no-useless-call': 'warn', 'no-useless-escape': 'warn', 'wrap-iife': ['error', 'any'], // === Variables === 'no-undef-init': 'error', 'no-unused-vars': ['error', { 'caughtErrors': 'none' }], // === Stylistic Issues === 'array-bracket-spacing': 'warn', 'block-spacing': 'warn', 'brace-style': ['warn', '1tbs'], 'camelcase': 'warn', 'capitalized-comments': ['warn', 'always', { 'ignoreConsecutiveComments': true }], 'comma-spacing': ['warn', { 'before': false, 'after': true }], 'comma-style': ['warn', 'last'], 'computed-property-spacing': 'error', 'consistent-this': 'off', 'eol-last': 'off', 'func-call-spacing': ['warn', 'never'], 'func-names': 'off', 'func-style': 'off', // indent currently not doing well with our wrapping style, so disabled. 'indent': ['off', 4, { 'SwitchCase': 1 }], 'key-spacing': ['warn', { 'beforeColon': false, 'afterColon': true, 'mode': minimum }], 'keyword-spacing': 'warn', 'linebreak-style': ['error', 'unix'], 'lines-around-comment': 'off', 'max-len': ['error', 132], 'max-lines': 'off', 'max-depth': 'warn', 'max-nested-callbacks': ['warn', 5], 'max-params': 'off', 'max-statements': 'off', 'max-statements-per-line': ['warn', { max: 2 }], 'new-cap': ['warn', { 'properties': false }], 'new-parens': 'warn', 'newline-per-chained-call': 'off', 'no-array-constructor': 'off', 'no-bitwise': 'error', 'no-continue': 'off', 'no-inline-comments': 'off', 'no-lonely-if': 'off', 'no-mixed-operators': 'off', 'no-multiple-empty-lines': 'warn', 'no-negated-condition': 'off', 'no-nested-ternary': 'warn', 'no-new-object': 'off', 'no-plusplus': 'off', 'no-tabs': 'error', 'no-ternary': 'off', 'no-trailing-spaces': 'error', 'no-underscore-dangle': 'off', 'no-unneeded-ternary': 'off', 'no-whitespace-before-property': 'warn', 'object-curly-newline': 'off', 'object-curly-spacing': 'warn', 'object-property-newline': 'off', 'one-var': 'off', 'one-var-declaration-per-line': ['warn', 'initializations'], 'operator-assignment': 'off', 'operator-linebreak': 'off', 'padded-blocks': 'off', 'quote-props': ['warn', 'as-needed', {'unnecessary': false, 'keywords': true, 'numbers': true}], 'quotes': 'off', 'semi': 'error', 'semi-spacing': ['warn', {'before': false, 'after': true}], 'sort-vars': 'off', 'space-before-blocks': 'warn', 'space-before-function-paren': ['warn', 'never'], 'space-in-parens': 'warn', 'space-infix-ops': 'warn', 'space-unary-ops': 'warn', 'spaced-comment': 'warn', 'unicode-bom': 'error', 'wrap-regex': 'off', // === Promises (override plugin:promise/recommended) === 'promise/always-return': 'warn', 'promise/no-return-wrap': 'warn', 'promise/param-names': 'warn', 'promise/catch-or-return': ['warn', {terminationMethod: ['catch', 'fail', 'always'], allowFinally: true}], 'promise/no-native': 'warn', 'promise/avoid-new': 'warn', // === Deprecations === "no-restricted-properties": ['warn', { 'object': 'M', 'property': 'str', 'message': 'Use "core/str" module or M.util.get_string()' }], }, overrides: [ { files: ["**/yui/src/**/*.js"], 'env': { // Disable ES6+ for YUI files. 'es2020': false, }, // Disable some rules which we can't safely define for YUI rollups. rules: { 'no-undef': 'off', 'no-unused-vars': 'off', 'no-unused-expressions': 'off', // === JSDocs === "jsdoc/check-access": 'off', "jsdoc/check-alignment": 'off', "jsdoc/check-param-names": 'off', "jsdoc/check-property-names": 'off', "jsdoc/empty-tags": 'off', "jsdoc/implements-on-classes": 'off', "jsdoc/multiline-blocks": 'off', "jsdoc/require-jsdoc": 'off', "jsdoc/require-param": 'off', "jsdoc/require-param-name": 'off', "jsdoc/require-param-type": 'off', "jsdoc/require-property": 'off', "jsdoc/require-property-name": 'off', "jsdoc/require-property-type": 'off', } }, { files: ["**/amd/src/*.js", "**/amd/src/**/*.js", "Gruntfile.js", ".grunt/*.js", ".grunt/tasks/*.js", "jsdoc.conf.js"], // We're using babel transpiling so use their parser // for linting. parser: '@babel/eslint-parser', // Check AMD with some slightly stricter rules. rules: { 'no-implicit-globals': 'error', // Disable all of the rules that have babel versions. 'new-cap': 'off', // Not using this rule for the time being because it isn't // compatible with jQuery and ES6. 'no-invalid-this': 'off', 'object-curly-spacing': 'off', 'quotes': 'off', 'semi': 'off', 'no-unused-expressions': 'off', // Enable all of the babel version of these rules. '@babel/new-cap': ['warn', { 'properties': false }], // Not using this rule for the time being because it isn't // compatible with jQuery and ES6. '@babel/no-invalid-this': 'off', '@babel/object-curly-spacing': 'warn', '@babel/semi': 'error', '@babel/no-unused-expressions': 'error', // === Promises === // We have Promise now that we're using ES6. 'promise/no-native': 'off', 'promise/avoid-new': 'off', // === JSDocs === 'jsdoc/check-access': 'error', 'jsdoc/check-alignment': 1, // Recommended. 'jsdoc/check-param-names': 'error', 'jsdoc/check-property-names': 'error', 'jsdoc/empty-tags': 'error', 'jsdoc/implements-on-classes': 'error', 'jsdoc/multiline-blocks': 'error', 'jsdoc/require-jsdoc': 'error', 'jsdoc/require-param': 'error', 'jsdoc/require-param-name': 'error', 'jsdoc/require-param-type': 'error', 'jsdoc/require-property': 'error', 'jsdoc/require-property-name': 'error', 'jsdoc/require-property-type': 'error' }, parserOptions: { 'sourceType': 'module', 'requireConfigFile': false } } ] }