@esri/telemetry
Advanced tools
Comparing version 1.2.0 to 1.3.1
@@ -7,2 +7,22 @@ # Change Log | ||
## [1.3.1] - 12/13/2017 | ||
### Fixed | ||
* User does not need to be logged in to disabled euei | ||
* Check for local storage | ||
## [1.3.0] - 11/06/2017 | ||
### Added | ||
* Support for logging anonymized org id, lastLogin and userSince | ||
* Support metrics: size, number, and count | ||
* Detect users that are internal by esri email addresses and log internalUser | ||
* Automatically log previousPageName and previousPageUrl | ||
* Support for logging errors | ||
* Support for initializing with a portal/self object under `options.portal` | ||
* Automatically disabled if `portal.eueiEnabled === false` | ||
### Fixed | ||
* Initializing telemetry for a public user does not throw an exception | ||
* Ensure null user does not throw error | ||
* `false` attributes are no longer logged as `null` | ||
## [1.2.0] | ||
@@ -53,5 +73,8 @@ ### Added | ||
[1.1.0]: https://github.com/arcgis/telemetry.js/compare/v1.1.0...v1.0.3 | ||
[1.3.1]: https://github.com/arcgis/telemetry.js/compare/v1.3.0...v1.3.1 | ||
[1.3.0]: https://github.com/arcgis/telemetry.js/compare/v1.2.0...v1.3.0 | ||
[1.2.0]: https://github.com/arcgis/telemetry.js/compare/v1.1.0...v1.2.0 | ||
[1.1.0]: https://github.com/arcgis/telemetry.js/compare/v1.0.3...v1.0.1 | ||
[1.0.3]: https://github.com/arcgis/telemetry.js/compare/v1.0.2...v1.0.3 | ||
[1.0.2]: https://github.com/arcgis/telemetry.js/compare/v1.0.2...v1.0.1 | ||
[1.0.2]: https://github.com/arcgis/telemetry.js/compare/v1.0.1...v1.0.2 | ||
[1.0.1]: https://github.com/arcgis/telemetry.js/compare/v1.0.0...v1.0.1 |
define('telemetry', function () { 'use strict'; | ||
function request(options, callback) { | ||
var req = new XMLHttpRequest(); | ||
var req = new XMLHttpRequest(); //eslint-disable-line | ||
req.addEventListener('load', function () { | ||
@@ -22,3 +22,8 @@ callback(req.responseText); | ||
get: function get(key) { | ||
var stored = window.localStorage.getItem(key) || this.storage[key]; | ||
var stored = void 0; | ||
try { | ||
stored = window.localStorage && window.localStorage.getItem(key) || this.storage[key]; | ||
} catch (e) { | ||
stored = this.storage[key]; | ||
} | ||
if (stored) { | ||
@@ -675,3 +680,3 @@ try { | ||
var METRICS = ['size', 'duration', 'position']; | ||
var METRICS = ['size', 'duration', 'position', 'number', 'count', 'lastLogin', 'userSince']; | ||
var DEFAULT_ENDPOINT = 'https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events'; | ||
@@ -692,4 +697,5 @@ | ||
value: function logPageView(page) { | ||
var events = createPageView(page); | ||
sendTelemetry(events, this.userPoolID, this.app); | ||
var event = createPageView(page, this.previousPage); | ||
sendTelemetry(event, this.userPoolID, this.app); | ||
this.previousPage = event.attributes; | ||
} | ||
@@ -707,2 +713,4 @@ }, { | ||
function createPageView(page) { | ||
var previousPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var session = getUser().session; | ||
@@ -719,3 +727,7 @@ return { | ||
hostname: window.location.hostname, | ||
path: window.location.pathname || page | ||
path: page || window.location.pathname, | ||
pageUrl: page || window.location.pathname, | ||
pageName: document.title, | ||
previousPageUrl: previousPage.pageUrl, | ||
previousPageName: previousPage.pageName | ||
}, | ||
@@ -754,3 +766,3 @@ metrics: {} | ||
} else { | ||
attributes[attr] = attributes[attr] ? attributes[attr].toString() : 'null'; | ||
attributes[attr] = attributes[attr] !== undefined ? attributes[attr].toString() : 'null'; | ||
} | ||
@@ -764,3 +776,3 @@ }); | ||
METRICS.forEach(function (metric) { | ||
metrics[metric] = event[metric]; | ||
if (event[metric]) metrics[metric] = event[metric]; | ||
}); | ||
@@ -770,3 +782,6 @@ return metrics; | ||
function createHeaders(credentials, options) { | ||
function createHeaders() { | ||
var credentials = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var options = arguments[1]; | ||
var config = { | ||
@@ -892,5 +907,8 @@ region: 'us-east-1', | ||
var anonymize = function (user) { | ||
if (!user) return undefined; | ||
return CryptoJS.SHA256(user).toString(CryptoJS.enc.Hex); | ||
}; | ||
var internalOrgs = ['esri.com', 'esriuk.com', 'esri.de', 'esri.ca', 'esrifrance.fr', 'esri.nl', 'esri-portugal.pt', 'esribulgaria.com', 'esri.fi', 'esri.kr', 'esrimalaysia.com.my', 'esri.es', 'esriaustralia.com.au', 'esri-southafrica.com', 'esri.cl', 'esrichina.com.cn', 'esri.co', 'esriturkey.com.tr', 'geodata.no', 'esriitalia.it', 'esri.pl']; | ||
var Telemetry = function () { | ||
@@ -902,5 +920,18 @@ function Telemetry(options) { | ||
this.workflows = {}; | ||
this.test = options.test; | ||
this.debug = options.debug; | ||
this.user = options.user; | ||
this.disabled = options.disabled; | ||
if (options.portal && !options.portal.eueiEnabled) { | ||
console.log('Telemetry Disabled'); | ||
this.disabled = true; | ||
} | ||
if (options.portal && options.portal.user) { | ||
var subscriptionInfo = options.portal.subscriptionInfo || {}; | ||
this.setUser(options.portal.user, subscriptionInfo.type); | ||
} else if (options.user) { | ||
this.setUser(options.user); | ||
} | ||
if (options.amazon) { | ||
@@ -920,2 +951,22 @@ var amazon = new Amazon(options.amazon); | ||
createClass(Telemetry, [{ | ||
key: 'setUser', | ||
value: function setUser() { | ||
var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var orgType = arguments[1]; | ||
user = typeof user === 'string' ? { username: user } : user; | ||
this.user = user; | ||
var internalDomain = void 0; | ||
if (user.email && user.email.split) { | ||
var domain = user.email.split('@')[1]; | ||
internalDomain = internalOrgs.filter(function (org) { | ||
return domain === org; | ||
}).length > 0; | ||
} | ||
if (internalDomain || ['In House', 'Demo and Marketing'].includes(orgType)) { | ||
this.user.internalUser = true; | ||
} | ||
} | ||
}, { | ||
key: 'logPageView', | ||
@@ -925,4 +976,5 @@ value: function logPageView(page) { | ||
var attributes = preProcess(options); | ||
if (this.debug) console.log('Tracking page view', JSON.stringify(attributes)); | ||
var attributes = this.preProcess(options); | ||
if (this.debug) console.log('Tracking page view', JSON.stringify(attributes));else if (this.test && !this.disabled) return attributes; | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -947,4 +999,6 @@ if (!this.disabled) console.error(new Error('Page view was not logged because no trackers are configured.')); | ||
var event = preProcess(options); | ||
if (this.debug) console.log('Tracking event', JSON.stringify(event)); | ||
var event = this.preProcess(options); | ||
if (this.debug) console.log('Tracking event', JSON.stringify(event));else if (this.test) return event; | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -965,2 +1019,10 @@ if (!this.disabled) console.error(new Error('Event was not logged because no trackers are configured.')); | ||
}, { | ||
key: 'logError', | ||
value: function logError() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var event = _extends({ eventType: 'error' }, options); | ||
this.logEvent(event); | ||
} | ||
}, { | ||
key: 'startWorkflow', | ||
@@ -1019,3 +1081,3 @@ value: function startWorkflow(name) { | ||
*/ | ||
options = preProcess(options); | ||
options = this.preProcess(options); | ||
var workflow = this.workflows[options.name]; | ||
@@ -1034,3 +1096,2 @@ if (!workflow) { | ||
label: options.details, | ||
user: options.user || this.user, | ||
duration: workflow.duration | ||
@@ -1041,2 +1102,20 @@ }); | ||
} | ||
}, { | ||
key: 'preProcess', | ||
value: function preProcess() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var userOptions = {}; | ||
if (this.user) { | ||
userOptions = { | ||
user: anonymize(this.user.username), | ||
orgId: anonymize(this.user.orgId), | ||
lastLogin: this.user.lastLogin, | ||
userSince: this.user.created, | ||
internalUser: this.user.internalUser || false | ||
}; | ||
} | ||
return _extends({}, options, userOptions); | ||
} | ||
}]); | ||
@@ -1046,12 +1125,2 @@ return Telemetry; | ||
function preProcess() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var attributes = _extends({}, options); | ||
if (attributes.user) { | ||
attributes.user = anonymize(attributes.user); | ||
} | ||
return attributes; | ||
} | ||
return Telemetry; | ||
@@ -1058,0 +1127,0 @@ |
@@ -1,2 +0,2 @@ | ||
define("telemetry",function(){"use strict";function e(e,t){var n=new XMLHttpRequest;n.addEventListener("load",function(){t(n.responseText)}),n.open(e.method,e.url),Object.keys(e.headers).forEach(function(t){n.setRequestHeader(t,e.headers[t])}),n.send(e.body)}function t(e,t){var r=q.get(D);if(r&&Date.now()/1e3<r.Expiration)return t(r);n(e,function(e){q.set(D,e),t(e)})}function n(t,n){var i=j({},W);i.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetId",i.body=JSON.stringify({IdentityPoolId:t}),e(i,function(e){r(JSON.parse(e),n)})}function r(t,n){var r=j({},W);r.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetCredentialsForIdentity",r.body=JSON.stringify({IdentityId:t.IdentityId}),e(r,function(e){var t=JSON.parse(e);n(t.Credentials)})}function i(){return{session:o(),id:s()}}function o(){var e=void 0,t=q.get(K);return(!t||Date.now()>t.expiration)&&(e=!0,t=a()),t.expiration=Date.now()+N,q.set(K,t),e&&(t.new=!0),t}function s(){var e=q.get(M);return e||(e=c(),q.set(M,e)),e}function a(){return{id:Math.floor(17592186044416*(1+Math.random())).toString(16),startTimestamp:(new Date).toISOString()}}function c(){return u()+u()+"-"+u()+"-"+u()+"-"+u()+"-"+u()+u()+u()}function u(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}function h(e,t){var n={host:t.uri.host,"content-type":e.config.defaultContentType,accept:e.config.defaultAcceptType,"x-amz-date":g(t.signDate)};t.request.method=t.request.method.toUpperCase(),t.request.body?t.payload=t.request.body:t.request.data&&e.payloadSerializer?t.payload=e.payloadSerializer(t.request.data):delete n["content-type"],t.request.headers=w(n,Object.keys(t.request.headers||{}).reduce(function(e,n){return e[n.toLowerCase()]=t.request.headers[n],e},{})),t.sortedHeaderKeys=Object.keys(t.request.headers).sort(),t.request.headers["content-type"]&&(t.request.headers["content-type"]=t.request.headers["content-type"].split(";")[0]),"object"===C(t.request.params)&&w(t.uri.queryParams,t.request.params)}function f(e,t){t.signedHeaders=t.sortedHeaderKeys.map(function(e){return e.toLowerCase()}).join(";"),t.canonicalRequest=String(t.request.method).toUpperCase()+"\n"+encodeURI(t.uri.path)+"\n"+Object.keys(t.uri.queryParams).sort().map(function(e){return encodeURIComponent(e)+"="+encodeURIComponent(t.uri.queryParams[e])}).join("&")+"\n"+t.sortedHeaderKeys.map(function(e){return e.toLocaleLowerCase()+":"+t.request.headers[e]}).join("\n")+"\n\n"+t.signedHeaders+"\n"+e.hasher.hash(t.payload?t.payload:"")}function l(e,t){t.credentialScope=[g(t.signDate,!0),e.config.region,e.config.service,"aws4_request"].join("/"),t.stringToSign="AWS4-HMAC-SHA256\n"+g(t.signDate)+"\n"+t.credentialScope+"\n"+e.hasher.hash(t.canonicalRequest)}function d(e,t){var n=e.hasher.hmac,r=n(n(n(n("AWS4"+e.config.secretAccessKey,g(t.signDate,!0),{hexOutput:!1}),e.config.region,{hexOutput:!1,textInput:!1}),e.config.service,{hexOutput:!1,textInput:!1}),"aws4_request",{hexOutput:!1,textInput:!1});t.signature=n(r,t.stringToSign,{textInput:!1})}function p(e,t){t.authorization="AWS4-HMAC-SHA256 Credential="+e.config.accessKeyId+"/"+t.credentialScope+", SignedHeaders="+t.signedHeaders+", Signature="+t.signature}function g(e,t){var n=e.toISOString().replace(/[:\-]|\.\d{3}/g,"").substr(0,17);return t?n.substr(0,8):n}function y(){return function(e){return JSON.stringify(e)}}function v(){function e(e){return/^\??(.*)$/.exec(e)[1].split("&").reduce(function(e,t){return t=/^(.+)=(.*)$/.exec(t),t&&(e[t[1]]=t[2]),e},{})}var t=document?document.createElement("a"):{};return function(n){return t.href=n,{protocol:t.protocol,host:t.host.replace(/^(.*):((80)|(443))$/,"$1"),path:("/"!==t.pathname.charAt(0)?"/":"")+t.pathname,queryParams:e(t.search)}}}function m(){return{hash:function(e,t){t=w({hexOutput:!0,textInput:!0},t);var n=R.SHA256(e);return t.hexOutput?n.toString(R.enc.Hex):n},hmac:function(e,t,n){n=w({hexOutput:!0,textInput:!0},n);var r=R.HmacSHA256(t,e,{asBytes:!0});return n.hexOutput?r.toString(R.enc.Hex):r}}}function w(e){return[].slice.call(arguments,1).forEach(function(t){t&&"object"===(void 0===t?"undefined":C(t))&&Object.keys(t).forEach(function(n){var r=t[n];void 0!==r&&(null!==r&&"object"===(void 0===r?"undefined":C(r))?(e[n]=Array.isArray(r)?[]:{},w(e[n],r)):e[n]=r)})}),e}function S(e,t){if(void 0===e||!e)throw new Error(t)}function k(e){var t=i().session;return{eventType:"pageView",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:{referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname||e},metrics:{}}}function b(e){var t=i().session;return{eventType:e.eventType||"other",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:j({referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname},_(e)),metrics:A(e)}}function _(e){var t=j({},e);return delete t.workflow,F.forEach(function(e){return delete t[e]}),Object.keys(t).forEach(function(e){t[e]="json"===e?t[e]?JSON.stringify(t[e]):"null":t[e]?t[e].toString():"null"}),t}function A(e){var t={};return F.forEach(function(n){t[n]=e[n]}),t}function x(e,t){var n={region:"us-east-1",service:"mobileanalytics",accessKeyId:e.AccessKeyId,secretAccessKey:e.SecretKey,sessionToken:e.SessionToken};return new L(n).sign(t)}function O(e,t){return JSON.stringify({client:{client_id:e,app_title:t.name,app_version_name:t.version||"unknown"},services:{mobile_analytics:{app_id:t.id}}})}function E(n,r,o){var s=i();n=Array.isArray(n)?n:[n];var a=I(n);t(r,function(t){a.headers=x(t,a),a.headers["x-amz-Client-Context"]=O(s.id,o),e(a,function(e){e&&console.error(JSON.parse(e))})})}function I(e){return{url:arguments.length>1&&void 0!==arguments[1]?arguments[1]:U,method:"POST",body:JSON.stringify({events:e})}}function T(e){window.ga?window.ga(function(){e(window.ga.getAll())}):console.log(new Error("Google Analytics trackers not available"))}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={hitType:"event",eventCategory:e.category||"none",eventAction:e.action,eventLabel:e.label};return Object.keys(t).forEach(function(n){r["dimension"+t[n]]=e[n]}),Object.keys(n).forEach(function(t){r["metric"+n[t]]=e[t]}),r}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=j({},e);return t.user&&(t.user=G(t.user)),t}var q={storage:{},memory:!0,get:function(e){var t=window.localStorage.getItem(e)||this.storage[e];if(t)try{return JSON.parse(t)}catch(e){return}},set:function(e,t){t=JSON.stringify(t);try{window.localStorage.setItem(e,t)}catch(n){this.memory||(console.error("setting local storage failed, falling back to in-memory storage"),this.memory=!0),this.storage[e]=t}}},C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},B=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},P=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),j=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},D="TELEMETRY_COGNITO_CREDENTIALS",W={method:"POST",url:"https://cognito-identity.us-east-1.amazonaws.com/",headers:{"Content-type":"application/x-amz-json-1.1"}},N=18e5,K="TELEMETRY_SESSION",M="TELEMETRY_CLIENT_ID",R=function(e,t){var n={},r=n.lib={},i=function(){},o=r.Base={extend:function(e){i.prototype=this;var t=new i;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=o.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=void 0!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var i=0;i<e;i++)t[r+i>>>2]|=(n[i>>>2]>>>24-i%4*8&255)<<24-(r+i)%4*8;else if(n.length>65535)for(i=0;i<e;i+=4)t[r+i>>>2]=n[i>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r<t;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),a=n.enc={},c=a.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++){var i=t[r>>>2]>>>24-r%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},u=a.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new s.init(n,t)}},h=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},f=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=h.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=i/(4*o),a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0);if(t=a*o,i=e.min(4*t,i),t){for(var c=0;c<t;c+=o)this._doProcessBlock(r,c);c=r.splice(0,t),n.sigBytes-=i}return new s.init(c,i)},clone:function(){var e=o.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=f.extend({cfg:o.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){f.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new l.HMAC.init(e,n).finalize(t)}}});var l=n.algo={};return n}(Math);!function(e){for(var t=R,n=t.lib,r=n.WordArray,i=n.Hasher,n=t.algo,o=[],s=[],a=function(e){return 4294967296*(e-(0|e))|0},c=2,u=0;u<64;){var h;e:{h=c;for(var f=e.sqrt(h),l=2;l<=f;l++)if(!(h%l)){h=!1;break e}h=!0}h&&(u<8&&(o[u]=a(e.pow(c,.5))),s[u]=a(e.pow(c,1/3)),u++),c++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],o=n[2],a=n[3],c=n[4],u=n[5],h=n[6],f=n[7],l=0;l<64;l++){if(l<16)d[l]=0|e[t+l];else{var p=d[l-15],g=d[l-2];d[l]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[l-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[l-16]}p=f+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&u^~c&h)+s[l]+d[l],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&o^i&o),f=h,h=u,u=c,c=a+p|0,a=o,o=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0,n[5]=n[5]+u|0,n[6]=n[6]+h|0,n[7]=n[7]+f|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=e.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(n),t.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var e=R,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,i=4*r;n.sigBytes>i&&(n=e.finalize(n)),n.clamp();for(var o=this._oKey=n.clone(),s=this._iKey=n.clone(),a=o.words,c=s.words,u=0;u<r;u++)a[u]^=1549556828,c[u]^=909522486;o.sigBytes=s.sigBytes=i,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}();var J={region:"eu-west-1",service:"execute-api",defaultContentType:"application/json",defaultAcceptType:"application/json",payloadSerializerFactory:y,uriParserFactory:v,hasherFactory:m},L=function(){function e(t){B(this,e),this.config=w({},J,t),this.payloadSerializer=this.config.payloadSerializer||this.config.payloadSerializerFactory(),this.uriParser=this.config.uriParserFactory(),this.hasher=this.config.hasherFactory(),S(this.config.accessKeyId,"AwsSigner requires AWS AccessKeyID"),S(this.config.secretAccessKey,"AwsSigner requires AWS SecretAccessKey")}return P(e,[{key:"sign",value:function(e,t){var n={request:w({},e),signDate:t||new Date,uri:this.uriParser(e.url)};return h(this,n),f(this,n),l(this,n),d(this,n),p(this,n),{Accept:n.request.headers.accept,Authorization:n.authorization,"Content-Type":n.request.headers["content-type"],"x-amz-date":n.request.headers["x-amz-date"],"x-amz-security-token":this.config.sessionToken||void 0}}}]),e}(),F=["size","duration","position"],U="https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events",$=function(){function e(t){B(this,e),this.name="amazon",j(this,t),i().session.new&&this.logEvent({eventType:"_session.start"})}return P(e,[{key:"logPageView",value:function(e){E(k(e),this.userPoolID,this.app)}},{key:"logEvent",value:function(e){E(b(e),this.userPoolID,this.app)}}]),e}(),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};B(this,e),this.name="google",j(this,t)}return P(e,[{key:"logPageView",value:function(e){T(function(t){t.forEach(function(t){t.send("pageview",e||window.location.pathname)})})}},{key:"logEvent",value:function(e){var t=z(e,this.dimensions,this.metrics);T(function(e){e.forEach(function(e){e.send(t)})})}}]),e}(),G=function(e){return R.SHA256(e).toString(R.enc.Hex)};return function(){function e(t){if(B(this,e),this.trackers=[],this.workflows={},this.debug=t.debug,this.user=t.user,this.disabled=t.disabled,t.amazon){var n=new $(t.amazon);this.trackers.push(n)}if(t.google){var r=new V(t.google);this.trackers.push(r)}this.trackers.length||console.error(new Error("No trackers configured"))}return P(e,[{key:"logPageView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=H(t);return this.debug&&console.log("Tracking page view",JSON.stringify(n)),!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Page view was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(t){try{t.logPageView(e,n)}catch(e){console.error(t.name+" tracker failed to log page view.",e)}}),!0)}},{key:"logEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=H(e);return this.debug&&console.log("Tracking event",JSON.stringify(t)),!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Event was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(e){try{e.logEvent(t)}catch(t){console.error(e.name+" tracker failed to log event",t)}}),!0)}},{key:"startWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={name:e,start:Date.now(),steps:[]};this.workflows[e]=n;var r=j({name:e,step:"start"},t);return this._logWorkflow(r),n}},{key:"stepWorkflow",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r="string"==typeof options?n:n.details,i=j({name:e,step:t,details:r},n);this._logWorkflow(i)}},{key:"endWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=j({name:e,step:"finish"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"cancelWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=j({name:e,step:"cancel"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"_logWorkflow",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=H(e);var t=this.workflows[e.name];t||(t=this.startWorkflow(e.name)),t.steps.push(e.step),t.duration=(Date.now()-t.start)/1e3;var n=j(e,{eventType:"workflow",category:e.name,action:e.step,label:e.details,user:e.user||this.user,duration:t.duration});this.logEvent(n)}}]),e}()}); | ||
define("telemetry",function(){"use strict";function e(e,t){var n=new XMLHttpRequest;n.addEventListener("load",function(){t(n.responseText)}),n.open(e.method,e.url),Object.keys(e.headers).forEach(function(t){n.setRequestHeader(t,e.headers[t])}),n.send(e.body)}function t(e,t){var r=H.get(j);if(r&&Date.now()/1e3<r.Expiration)return t(r);n(e,function(e){H.set(j,e),t(e)})}function n(t,n){var i=B({},D);i.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetId",i.body=JSON.stringify({IdentityPoolId:t}),e(i,function(e){r(JSON.parse(e),n)})}function r(t,n){var r=B({},D);r.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetCredentialsForIdentity",r.body=JSON.stringify({IdentityId:t.IdentityId}),e(r,function(e){var t=JSON.parse(e);n(t.Credentials)})}function i(){return{session:o(),id:s()}}function o(){var e=void 0,t=H.get(U);return(!t||Date.now()>t.expiration)&&(e=!0,t=a()),t.expiration=Date.now()+N,H.set(U,t),e&&(t.new=!0),t}function s(){var e=H.get(W);return e||(e=c(),H.set(W,e)),e}function a(){return{id:Math.floor(17592186044416*(1+Math.random())).toString(16),startTimestamp:(new Date).toISOString()}}function c(){return u()+u()+"-"+u()+"-"+u()+"-"+u()+"-"+u()+u()+u()}function u(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}function l(e,t){var n={host:t.uri.host,"content-type":e.config.defaultContentType,accept:e.config.defaultAcceptType,"x-amz-date":g(t.signDate)};t.request.method=t.request.method.toUpperCase(),t.request.body?t.payload=t.request.body:t.request.data&&e.payloadSerializer?t.payload=e.payloadSerializer(t.request.data):delete n["content-type"],t.request.headers=w(n,Object.keys(t.request.headers||{}).reduce(function(e,n){return e[n.toLowerCase()]=t.request.headers[n],e},{})),t.sortedHeaderKeys=Object.keys(t.request.headers).sort(),t.request.headers["content-type"]&&(t.request.headers["content-type"]=t.request.headers["content-type"].split(";")[0]),"object"===q(t.request.params)&&w(t.uri.queryParams,t.request.params)}function h(e,t){t.signedHeaders=t.sortedHeaderKeys.map(function(e){return e.toLowerCase()}).join(";"),t.canonicalRequest=String(t.request.method).toUpperCase()+"\n"+encodeURI(t.uri.path)+"\n"+Object.keys(t.uri.queryParams).sort().map(function(e){return encodeURIComponent(e)+"="+encodeURIComponent(t.uri.queryParams[e])}).join("&")+"\n"+t.sortedHeaderKeys.map(function(e){return e.toLocaleLowerCase()+":"+t.request.headers[e]}).join("\n")+"\n\n"+t.signedHeaders+"\n"+e.hasher.hash(t.payload?t.payload:"")}function f(e,t){t.credentialScope=[g(t.signDate,!0),e.config.region,e.config.service,"aws4_request"].join("/"),t.stringToSign="AWS4-HMAC-SHA256\n"+g(t.signDate)+"\n"+t.credentialScope+"\n"+e.hasher.hash(t.canonicalRequest)}function d(e,t){var n=e.hasher.hmac,r=n(n(n(n("AWS4"+e.config.secretAccessKey,g(t.signDate,!0),{hexOutput:!1}),e.config.region,{hexOutput:!1,textInput:!1}),e.config.service,{hexOutput:!1,textInput:!1}),"aws4_request",{hexOutput:!1,textInput:!1});t.signature=n(r,t.stringToSign,{textInput:!1})}function p(e,t){t.authorization="AWS4-HMAC-SHA256 Credential="+e.config.accessKeyId+"/"+t.credentialScope+", SignedHeaders="+t.signedHeaders+", Signature="+t.signature}function g(e,t){var n=e.toISOString().replace(/[:\-]|\.\d{3}/g,"").substr(0,17);return t?n.substr(0,8):n}function y(){return function(e){return JSON.stringify(e)}}function v(){function e(e){return/^\??(.*)$/.exec(e)[1].split("&").reduce(function(e,t){return t=/^(.+)=(.*)$/.exec(t),t&&(e[t[1]]=t[2]),e},{})}var t=document?document.createElement("a"):{};return function(n){return t.href=n,{protocol:t.protocol,host:t.host.replace(/^(.*):((80)|(443))$/,"$1"),path:("/"!==t.pathname.charAt(0)?"/":"")+t.pathname,queryParams:e(t.search)}}}function m(){return{hash:function(e,t){t=w({hexOutput:!0,textInput:!0},t);var n=K.SHA256(e);return t.hexOutput?n.toString(K.enc.Hex):n},hmac:function(e,t,n){n=w({hexOutput:!0,textInput:!0},n);var r=K.HmacSHA256(t,e,{asBytes:!0});return n.hexOutput?r.toString(K.enc.Hex):r}}}function w(e){return[].slice.call(arguments,1).forEach(function(t){t&&"object"===(void 0===t?"undefined":q(t))&&Object.keys(t).forEach(function(n){var r=t[n];void 0!==r&&(null!==r&&"object"===(void 0===r?"undefined":q(r))?(e[n]=Array.isArray(r)?[]:{},w(e[n],r)):e[n]=r)})}),e}function S(e,t){if(void 0===e||!e)throw new Error(t)}function k(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i().session;return{eventType:"pageView",timestamp:(new Date).toISOString(),session:{id:n.id,startTimestamp:n.startTimestamp},attributes:{referrer:document.referrer,hostname:window.location.hostname,path:e||window.location.pathname,pageUrl:e||window.location.pathname,pageName:document.title,previousPageUrl:t.pageUrl,previousPageName:t.pageName},metrics:{}}}function b(e){var t=i().session;return{eventType:e.eventType||"other",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:B({referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname},_(e)),metrics:A(e)}}function _(e){var t=B({},e);return delete t.workflow,R.forEach(function(e){return delete t[e]}),Object.keys(t).forEach(function(e){t[e]="json"===e?t[e]?JSON.stringify(t[e]):"null":void 0!==t[e]?t[e].toString():"null"}),t}function A(e){var t={};return R.forEach(function(n){e[n]&&(t[n]=e[n])}),t}function I(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n={region:"us-east-1",service:"mobileanalytics",accessKeyId:e.AccessKeyId,secretAccessKey:e.SecretKey,sessionToken:e.SessionToken};return new M(n).sign(t)}function x(e,t){return JSON.stringify({client:{client_id:e,app_title:t.name,app_version_name:t.version||"unknown"},services:{mobile_analytics:{app_id:t.id}}})}function E(n,r,o){var s=i();n=Array.isArray(n)?n:[n];var a=O(n);t(r,function(t){a.headers=I(t,a),a.headers["x-amz-Client-Context"]=x(s.id,o),e(a,function(e){e&&console.error(JSON.parse(e))})})}function O(e){return{url:arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,method:"POST",body:JSON.stringify({events:e})}}function T(e){window.ga?window.ga(function(){e(window.ga.getAll())}):console.log(new Error("Google Analytics trackers not available"))}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={hitType:"event",eventCategory:e.category||"none",eventAction:e.action,eventLabel:e.label};return Object.keys(t).forEach(function(n){r["dimension"+t[n]]=e[n]}),Object.keys(n).forEach(function(t){r["metric"+n[t]]=e[t]}),r}var H={storage:{},memory:!0,get:function(e){var t=void 0;try{t=window.localStorage&&window.localStorage.getItem(e)||this.storage[e]}catch(n){t=this.storage[e]}if(t)try{return JSON.parse(t)}catch(e){return}},set:function(e,t){t=JSON.stringify(t);try{window.localStorage.setItem(e,t)}catch(n){this.memory||(console.error("setting local storage failed, falling back to in-memory storage"),this.memory=!0),this.storage[e]=t}}},q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},C=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),B=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},j="TELEMETRY_COGNITO_CREDENTIALS",D={method:"POST",url:"https://cognito-identity.us-east-1.amazonaws.com/",headers:{"Content-type":"application/x-amz-json-1.1"}},N=18e5,U="TELEMETRY_SESSION",W="TELEMETRY_CLIENT_ID",K=function(e,t){var n={},r=n.lib={},i=function(){},o=r.Base={extend:function(e){i.prototype=this;var t=new i;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=o.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=void 0!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var i=0;i<e;i++)t[r+i>>>2]|=(n[i>>>2]>>>24-i%4*8&255)<<24-(r+i)%4*8;else if(n.length>65535)for(i=0;i<e;i+=4)t[r+i>>>2]=n[i>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r<t;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),a=n.enc={},c=a.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++){var i=t[r>>>2]>>>24-r%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},u=a.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new s.init(n,t)}},l=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},h=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=i/(4*o),a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0);if(t=a*o,i=e.min(4*t,i),t){for(var c=0;c<t;c+=o)this._doProcessBlock(r,c);c=r.splice(0,t),n.sigBytes-=i}return new s.init(c,i)},clone:function(){var e=o.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=h.extend({cfg:o.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new f.HMAC.init(e,n).finalize(t)}}});var f=n.algo={};return n}(Math);!function(e){for(var t=K,n=t.lib,r=n.WordArray,i=n.Hasher,n=t.algo,o=[],s=[],a=function(e){return 4294967296*(e-(0|e))|0},c=2,u=0;u<64;){var l;e:{l=c;for(var h=e.sqrt(l),f=2;f<=h;f++)if(!(l%f)){l=!1;break e}l=!0}l&&(u<8&&(o[u]=a(e.pow(c,.5))),s[u]=a(e.pow(c,1/3)),u++),c++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],o=n[2],a=n[3],c=n[4],u=n[5],l=n[6],h=n[7],f=0;f<64;f++){if(f<16)d[f]=0|e[t+f];else{var p=d[f-15],g=d[f-2];d[f]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[f-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[f-16]}p=h+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&u^~c&l)+s[f]+d[f],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&o^i&o),h=l,l=u,u=c,c=a+p|0,a=o,o=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0,n[5]=n[5]+u|0,n[6]=n[6]+l|0,n[7]=n[7]+h|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=e.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(n),t.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var e=K,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,i=4*r;n.sigBytes>i&&(n=e.finalize(n)),n.clamp();for(var o=this._oKey=n.clone(),s=this._iKey=n.clone(),a=o.words,c=s.words,u=0;u<r;u++)a[u]^=1549556828,c[u]^=909522486;o.sigBytes=s.sigBytes=i,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}();var L={region:"eu-west-1",service:"execute-api",defaultContentType:"application/json",defaultAcceptType:"application/json",payloadSerializerFactory:y,uriParserFactory:v,hasherFactory:m},M=function(){function e(t){P(this,e),this.config=w({},L,t),this.payloadSerializer=this.config.payloadSerializer||this.config.payloadSerializerFactory(),this.uriParser=this.config.uriParserFactory(),this.hasher=this.config.hasherFactory(),S(this.config.accessKeyId,"AwsSigner requires AWS AccessKeyID"),S(this.config.secretAccessKey,"AwsSigner requires AWS SecretAccessKey")}return C(e,[{key:"sign",value:function(e,t){var n={request:w({},e),signDate:t||new Date,uri:this.uriParser(e.url)};return l(this,n),h(this,n),f(this,n),d(this,n),p(this,n),{Accept:n.request.headers.accept,Authorization:n.authorization,"Content-Type":n.request.headers["content-type"],"x-amz-date":n.request.headers["x-amz-date"],"x-amz-security-token":this.config.sessionToken||void 0}}}]),e}(),R=["size","duration","position","number","count","lastLogin","userSince"],J="https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events",F=function(){function e(t){P(this,e),this.name="amazon",B(this,t),i().session.new&&this.logEvent({eventType:"_session.start"})}return C(e,[{key:"logPageView",value:function(e){var t=k(e,this.previousPage);E(t,this.userPoolID,this.app),this.previousPage=t.attributes}},{key:"logEvent",value:function(e){E(b(e),this.userPoolID,this.app)}}]),e}(),$=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};P(this,e),this.name="google",B(this,t)}return C(e,[{key:"logPageView",value:function(e){T(function(t){t.forEach(function(t){t.send("pageview",e||window.location.pathname)})})}},{key:"logEvent",value:function(e){var t=z(e,this.dimensions,this.metrics);T(function(e){e.forEach(function(e){e.send(t)})})}}]),e}(),V=function(e){if(e)return K.SHA256(e).toString(K.enc.Hex)},G=["esri.com","esriuk.com","esri.de","esri.ca","esrifrance.fr","esri.nl","esri-portugal.pt","esribulgaria.com","esri.fi","esri.kr","esrimalaysia.com.my","esri.es","esriaustralia.com.au","esri-southafrica.com","esri.cl","esrichina.com.cn","esri.co","esriturkey.com.tr","geodata.no","esriitalia.it","esri.pl"];return function(){function e(t){if(P(this,e),this.trackers=[],this.workflows={},this.test=t.test,this.debug=t.debug,this.disabled=t.disabled,t.portal&&!t.portal.eueiEnabled&&(console.log("Telemetry Disabled"),this.disabled=!0),t.portal&&t.portal.user){var n=t.portal.subscriptionInfo||{};this.setUser(t.portal.user,n.type)}else t.user&&this.setUser(t.user);if(t.amazon){var r=new F(t.amazon);this.trackers.push(r)}if(t.google){var i=new $(t.google);this.trackers.push(i)}this.trackers.length||console.error(new Error("No trackers configured"))}return C(e,[{key:"setUser",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];e="string"==typeof e?{username:e}:e,this.user=e;var n=void 0;if(e.email&&e.email.split){var r=e.email.split("@")[1];n=G.filter(function(e){return r===e}).length>0}(n||["In House","Demo and Marketing"].includes(t))&&(this.user.internalUser=!0)}},{key:"logPageView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.preProcess(t);if(this.debug)console.log("Tracking page view",JSON.stringify(n));else if(this.test&&!this.disabled)return n;return!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Page view was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(t){try{t.logPageView(e,n)}catch(e){console.error(t.name+" tracker failed to log page view.",e)}}),!0)}},{key:"logEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.preProcess(e);if(this.debug)console.log("Tracking event",JSON.stringify(t));else if(this.test)return t;return!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Event was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(e){try{e.logEvent(t)}catch(t){console.error(e.name+" tracker failed to log event",t)}}),!0)}},{key:"logError",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=B({eventType:"error"},e);this.logEvent(t)}},{key:"startWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={name:e,start:Date.now(),steps:[]};this.workflows[e]=n;var r=B({name:e,step:"start"},t);return this._logWorkflow(r),n}},{key:"stepWorkflow",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r="string"==typeof options?n:n.details,i=B({name:e,step:t,details:r},n);this._logWorkflow(i)}},{key:"endWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=B({name:e,step:"finish"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"cancelWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=B({name:e,step:"cancel"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"_logWorkflow",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=this.preProcess(e);var t=this.workflows[e.name];t||(t=this.startWorkflow(e.name)),t.steps.push(e.step),t.duration=(Date.now()-t.start)/1e3;var n=B(e,{eventType:"workflow",category:e.name,action:e.step,label:e.details,duration:t.duration});this.logEvent(n)}},{key:"preProcess",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return this.user&&(t={user:V(this.user.username),orgId:V(this.user.orgId),lastLogin:this.user.lastLogin,userSince:this.user.created,internalUser:this.user.internalUser||!1}),B({},e,t)}}]),e}()}); | ||
//# sourceMappingURL=telemetry.amd.min.js.map |
define(function () { 'use strict'; | ||
function request(options, callback) { | ||
var req = new XMLHttpRequest(); | ||
var req = new XMLHttpRequest(); //eslint-disable-line | ||
req.addEventListener('load', function () { | ||
@@ -22,3 +22,8 @@ callback(req.responseText); | ||
get: function get(key) { | ||
var stored = window.localStorage.getItem(key) || this.storage[key]; | ||
var stored = void 0; | ||
try { | ||
stored = window.localStorage && window.localStorage.getItem(key) || this.storage[key]; | ||
} catch (e) { | ||
stored = this.storage[key]; | ||
} | ||
if (stored) { | ||
@@ -675,3 +680,3 @@ try { | ||
var METRICS = ['size', 'duration', 'position']; | ||
var METRICS = ['size', 'duration', 'position', 'number', 'count', 'lastLogin', 'userSince']; | ||
var DEFAULT_ENDPOINT = 'https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events'; | ||
@@ -692,4 +697,5 @@ | ||
value: function logPageView(page) { | ||
var events = createPageView(page); | ||
sendTelemetry(events, this.userPoolID, this.app); | ||
var event = createPageView(page, this.previousPage); | ||
sendTelemetry(event, this.userPoolID, this.app); | ||
this.previousPage = event.attributes; | ||
} | ||
@@ -707,2 +713,4 @@ }, { | ||
function createPageView(page) { | ||
var previousPage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
var session = getUser().session; | ||
@@ -719,3 +727,7 @@ return { | ||
hostname: window.location.hostname, | ||
path: window.location.pathname || page | ||
path: page || window.location.pathname, | ||
pageUrl: page || window.location.pathname, | ||
pageName: document.title, | ||
previousPageUrl: previousPage.pageUrl, | ||
previousPageName: previousPage.pageName | ||
}, | ||
@@ -754,3 +766,3 @@ metrics: {} | ||
} else { | ||
attributes[attr] = attributes[attr] ? attributes[attr].toString() : 'null'; | ||
attributes[attr] = attributes[attr] !== undefined ? attributes[attr].toString() : 'null'; | ||
} | ||
@@ -764,3 +776,3 @@ }); | ||
METRICS.forEach(function (metric) { | ||
metrics[metric] = event[metric]; | ||
if (event[metric]) metrics[metric] = event[metric]; | ||
}); | ||
@@ -770,3 +782,6 @@ return metrics; | ||
function createHeaders(credentials, options) { | ||
function createHeaders() { | ||
var credentials = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var options = arguments[1]; | ||
var config = { | ||
@@ -892,5 +907,8 @@ region: 'us-east-1', | ||
var anonymize = function (user) { | ||
if (!user) return undefined; | ||
return CryptoJS.SHA256(user).toString(CryptoJS.enc.Hex); | ||
}; | ||
var internalOrgs = ['esri.com', 'esriuk.com', 'esri.de', 'esri.ca', 'esrifrance.fr', 'esri.nl', 'esri-portugal.pt', 'esribulgaria.com', 'esri.fi', 'esri.kr', 'esrimalaysia.com.my', 'esri.es', 'esriaustralia.com.au', 'esri-southafrica.com', 'esri.cl', 'esrichina.com.cn', 'esri.co', 'esriturkey.com.tr', 'geodata.no', 'esriitalia.it', 'esri.pl']; | ||
var Telemetry = function () { | ||
@@ -902,5 +920,18 @@ function Telemetry(options) { | ||
this.workflows = {}; | ||
this.test = options.test; | ||
this.debug = options.debug; | ||
this.user = options.user; | ||
this.disabled = options.disabled; | ||
if (options.portal && !options.portal.eueiEnabled) { | ||
console.log('Telemetry Disabled'); | ||
this.disabled = true; | ||
} | ||
if (options.portal && options.portal.user) { | ||
var subscriptionInfo = options.portal.subscriptionInfo || {}; | ||
this.setUser(options.portal.user, subscriptionInfo.type); | ||
} else if (options.user) { | ||
this.setUser(options.user); | ||
} | ||
if (options.amazon) { | ||
@@ -920,2 +951,22 @@ var amazon = new Amazon(options.amazon); | ||
createClass(Telemetry, [{ | ||
key: 'setUser', | ||
value: function setUser() { | ||
var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var orgType = arguments[1]; | ||
user = typeof user === 'string' ? { username: user } : user; | ||
this.user = user; | ||
var internalDomain = void 0; | ||
if (user.email && user.email.split) { | ||
var domain = user.email.split('@')[1]; | ||
internalDomain = internalOrgs.filter(function (org) { | ||
return domain === org; | ||
}).length > 0; | ||
} | ||
if (internalDomain || ['In House', 'Demo and Marketing'].includes(orgType)) { | ||
this.user.internalUser = true; | ||
} | ||
} | ||
}, { | ||
key: 'logPageView', | ||
@@ -925,4 +976,5 @@ value: function logPageView(page) { | ||
var attributes = preProcess(options); | ||
if (this.debug) console.log('Tracking page view', JSON.stringify(attributes)); | ||
var attributes = this.preProcess(options); | ||
if (this.debug) console.log('Tracking page view', JSON.stringify(attributes));else if (this.test && !this.disabled) return attributes; | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -947,4 +999,6 @@ if (!this.disabled) console.error(new Error('Page view was not logged because no trackers are configured.')); | ||
var event = preProcess(options); | ||
if (this.debug) console.log('Tracking event', JSON.stringify(event)); | ||
var event = this.preProcess(options); | ||
if (this.debug) console.log('Tracking event', JSON.stringify(event));else if (this.test) return event; | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -965,2 +1019,10 @@ if (!this.disabled) console.error(new Error('Event was not logged because no trackers are configured.')); | ||
}, { | ||
key: 'logError', | ||
value: function logError() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var event = _extends({ eventType: 'error' }, options); | ||
this.logEvent(event); | ||
} | ||
}, { | ||
key: 'startWorkflow', | ||
@@ -1019,3 +1081,3 @@ value: function startWorkflow(name) { | ||
*/ | ||
options = preProcess(options); | ||
options = this.preProcess(options); | ||
var workflow = this.workflows[options.name]; | ||
@@ -1034,3 +1096,2 @@ if (!workflow) { | ||
label: options.details, | ||
user: options.user || this.user, | ||
duration: workflow.duration | ||
@@ -1041,2 +1102,20 @@ }); | ||
} | ||
}, { | ||
key: 'preProcess', | ||
value: function preProcess() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var userOptions = {}; | ||
if (this.user) { | ||
userOptions = { | ||
user: anonymize(this.user.username), | ||
orgId: anonymize(this.user.orgId), | ||
lastLogin: this.user.lastLogin, | ||
userSince: this.user.created, | ||
internalUser: this.user.internalUser || false | ||
}; | ||
} | ||
return _extends({}, options, userOptions); | ||
} | ||
}]); | ||
@@ -1046,12 +1125,2 @@ return Telemetry; | ||
function preProcess() { | ||
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
var attributes = _extends({}, options); | ||
if (attributes.user) { | ||
attributes.user = anonymize(attributes.user); | ||
} | ||
return attributes; | ||
} | ||
return Telemetry; | ||
@@ -1058,0 +1127,0 @@ |
@@ -1,2 +0,2 @@ | ||
define(function(){"use strict";function e(e,t){var n=new XMLHttpRequest;n.addEventListener("load",function(){t(n.responseText)}),n.open(e.method,e.url),Object.keys(e.headers).forEach(function(t){n.setRequestHeader(t,e.headers[t])}),n.send(e.body)}function t(e,t){var r=q.get(D);if(r&&Date.now()/1e3<r.Expiration)return t(r);n(e,function(e){q.set(D,e),t(e)})}function n(t,n){var i=j({},W);i.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetId",i.body=JSON.stringify({IdentityPoolId:t}),e(i,function(e){r(JSON.parse(e),n)})}function r(t,n){var r=j({},W);r.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetCredentialsForIdentity",r.body=JSON.stringify({IdentityId:t.IdentityId}),e(r,function(e){var t=JSON.parse(e);n(t.Credentials)})}function i(){return{session:o(),id:s()}}function o(){var e=void 0,t=q.get(K);return(!t||Date.now()>t.expiration)&&(e=!0,t=a()),t.expiration=Date.now()+N,q.set(K,t),e&&(t.new=!0),t}function s(){var e=q.get(M);return e||(e=c(),q.set(M,e)),e}function a(){return{id:Math.floor(17592186044416*(1+Math.random())).toString(16),startTimestamp:(new Date).toISOString()}}function c(){return u()+u()+"-"+u()+"-"+u()+"-"+u()+"-"+u()+u()+u()}function u(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}function h(e,t){var n={host:t.uri.host,"content-type":e.config.defaultContentType,accept:e.config.defaultAcceptType,"x-amz-date":g(t.signDate)};t.request.method=t.request.method.toUpperCase(),t.request.body?t.payload=t.request.body:t.request.data&&e.payloadSerializer?t.payload=e.payloadSerializer(t.request.data):delete n["content-type"],t.request.headers=w(n,Object.keys(t.request.headers||{}).reduce(function(e,n){return e[n.toLowerCase()]=t.request.headers[n],e},{})),t.sortedHeaderKeys=Object.keys(t.request.headers).sort(),t.request.headers["content-type"]&&(t.request.headers["content-type"]=t.request.headers["content-type"].split(";")[0]),"object"===C(t.request.params)&&w(t.uri.queryParams,t.request.params)}function f(e,t){t.signedHeaders=t.sortedHeaderKeys.map(function(e){return e.toLowerCase()}).join(";"),t.canonicalRequest=String(t.request.method).toUpperCase()+"\n"+encodeURI(t.uri.path)+"\n"+Object.keys(t.uri.queryParams).sort().map(function(e){return encodeURIComponent(e)+"="+encodeURIComponent(t.uri.queryParams[e])}).join("&")+"\n"+t.sortedHeaderKeys.map(function(e){return e.toLocaleLowerCase()+":"+t.request.headers[e]}).join("\n")+"\n\n"+t.signedHeaders+"\n"+e.hasher.hash(t.payload?t.payload:"")}function l(e,t){t.credentialScope=[g(t.signDate,!0),e.config.region,e.config.service,"aws4_request"].join("/"),t.stringToSign="AWS4-HMAC-SHA256\n"+g(t.signDate)+"\n"+t.credentialScope+"\n"+e.hasher.hash(t.canonicalRequest)}function d(e,t){var n=e.hasher.hmac,r=n(n(n(n("AWS4"+e.config.secretAccessKey,g(t.signDate,!0),{hexOutput:!1}),e.config.region,{hexOutput:!1,textInput:!1}),e.config.service,{hexOutput:!1,textInput:!1}),"aws4_request",{hexOutput:!1,textInput:!1});t.signature=n(r,t.stringToSign,{textInput:!1})}function p(e,t){t.authorization="AWS4-HMAC-SHA256 Credential="+e.config.accessKeyId+"/"+t.credentialScope+", SignedHeaders="+t.signedHeaders+", Signature="+t.signature}function g(e,t){var n=e.toISOString().replace(/[:\-]|\.\d{3}/g,"").substr(0,17);return t?n.substr(0,8):n}function y(){return function(e){return JSON.stringify(e)}}function v(){function e(e){return/^\??(.*)$/.exec(e)[1].split("&").reduce(function(e,t){return t=/^(.+)=(.*)$/.exec(t),t&&(e[t[1]]=t[2]),e},{})}var t=document?document.createElement("a"):{};return function(n){return t.href=n,{protocol:t.protocol,host:t.host.replace(/^(.*):((80)|(443))$/,"$1"),path:("/"!==t.pathname.charAt(0)?"/":"")+t.pathname,queryParams:e(t.search)}}}function m(){return{hash:function(e,t){t=w({hexOutput:!0,textInput:!0},t);var n=R.SHA256(e);return t.hexOutput?n.toString(R.enc.Hex):n},hmac:function(e,t,n){n=w({hexOutput:!0,textInput:!0},n);var r=R.HmacSHA256(t,e,{asBytes:!0});return n.hexOutput?r.toString(R.enc.Hex):r}}}function w(e){return[].slice.call(arguments,1).forEach(function(t){t&&"object"===(void 0===t?"undefined":C(t))&&Object.keys(t).forEach(function(n){var r=t[n];void 0!==r&&(null!==r&&"object"===(void 0===r?"undefined":C(r))?(e[n]=Array.isArray(r)?[]:{},w(e[n],r)):e[n]=r)})}),e}function S(e,t){if(void 0===e||!e)throw new Error(t)}function k(e){var t=i().session;return{eventType:"pageView",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:{referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname||e},metrics:{}}}function b(e){var t=i().session;return{eventType:e.eventType||"other",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:j({referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname},_(e)),metrics:A(e)}}function _(e){var t=j({},e);return delete t.workflow,F.forEach(function(e){return delete t[e]}),Object.keys(t).forEach(function(e){t[e]="json"===e?t[e]?JSON.stringify(t[e]):"null":t[e]?t[e].toString():"null"}),t}function A(e){var t={};return F.forEach(function(n){t[n]=e[n]}),t}function x(e,t){var n={region:"us-east-1",service:"mobileanalytics",accessKeyId:e.AccessKeyId,secretAccessKey:e.SecretKey,sessionToken:e.SessionToken};return new L(n).sign(t)}function O(e,t){return JSON.stringify({client:{client_id:e,app_title:t.name,app_version_name:t.version||"unknown"},services:{mobile_analytics:{app_id:t.id}}})}function E(n,r,o){var s=i();n=Array.isArray(n)?n:[n];var a=I(n);t(r,function(t){a.headers=x(t,a),a.headers["x-amz-Client-Context"]=O(s.id,o),e(a,function(e){e&&console.error(JSON.parse(e))})})}function I(e){return{url:arguments.length>1&&void 0!==arguments[1]?arguments[1]:U,method:"POST",body:JSON.stringify({events:e})}}function T(e){window.ga?window.ga(function(){e(window.ga.getAll())}):console.log(new Error("Google Analytics trackers not available"))}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={hitType:"event",eventCategory:e.category||"none",eventAction:e.action,eventLabel:e.label};return Object.keys(t).forEach(function(n){r["dimension"+t[n]]=e[n]}),Object.keys(n).forEach(function(t){r["metric"+n[t]]=e[t]}),r}function H(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=j({},e);return t.user&&(t.user=G(t.user)),t}var q={storage:{},memory:!0,get:function(e){var t=window.localStorage.getItem(e)||this.storage[e];if(t)try{return JSON.parse(t)}catch(e){return}},set:function(e,t){t=JSON.stringify(t);try{window.localStorage.setItem(e,t)}catch(n){this.memory||(console.error("setting local storage failed, falling back to in-memory storage"),this.memory=!0),this.storage[e]=t}}},C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},B=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},P=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),j=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},D="TELEMETRY_COGNITO_CREDENTIALS",W={method:"POST",url:"https://cognito-identity.us-east-1.amazonaws.com/",headers:{"Content-type":"application/x-amz-json-1.1"}},N=18e5,K="TELEMETRY_SESSION",M="TELEMETRY_CLIENT_ID",R=function(e,t){var n={},r=n.lib={},i=function(){},o=r.Base={extend:function(e){i.prototype=this;var t=new i;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=o.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=void 0!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var i=0;i<e;i++)t[r+i>>>2]|=(n[i>>>2]>>>24-i%4*8&255)<<24-(r+i)%4*8;else if(n.length>65535)for(i=0;i<e;i+=4)t[r+i>>>2]=n[i>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r<t;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),a=n.enc={},c=a.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++){var i=t[r>>>2]>>>24-r%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},u=a.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new s.init(n,t)}},h=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},f=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=h.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=i/(4*o),a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0);if(t=a*o,i=e.min(4*t,i),t){for(var c=0;c<t;c+=o)this._doProcessBlock(r,c);c=r.splice(0,t),n.sigBytes-=i}return new s.init(c,i)},clone:function(){var e=o.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=f.extend({cfg:o.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){f.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new l.HMAC.init(e,n).finalize(t)}}});var l=n.algo={};return n}(Math);!function(e){for(var t=R,n=t.lib,r=n.WordArray,i=n.Hasher,n=t.algo,o=[],s=[],a=function(e){return 4294967296*(e-(0|e))|0},c=2,u=0;u<64;){var h;e:{h=c;for(var f=e.sqrt(h),l=2;l<=f;l++)if(!(h%l)){h=!1;break e}h=!0}h&&(u<8&&(o[u]=a(e.pow(c,.5))),s[u]=a(e.pow(c,1/3)),u++),c++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],o=n[2],a=n[3],c=n[4],u=n[5],h=n[6],f=n[7],l=0;l<64;l++){if(l<16)d[l]=0|e[t+l];else{var p=d[l-15],g=d[l-2];d[l]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[l-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[l-16]}p=f+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&u^~c&h)+s[l]+d[l],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&o^i&o),f=h,h=u,u=c,c=a+p|0,a=o,o=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0,n[5]=n[5]+u|0,n[6]=n[6]+h|0,n[7]=n[7]+f|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=e.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(n),t.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var e=R,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,i=4*r;n.sigBytes>i&&(n=e.finalize(n)),n.clamp();for(var o=this._oKey=n.clone(),s=this._iKey=n.clone(),a=o.words,c=s.words,u=0;u<r;u++)a[u]^=1549556828,c[u]^=909522486;o.sigBytes=s.sigBytes=i,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}();var J={region:"eu-west-1",service:"execute-api",defaultContentType:"application/json",defaultAcceptType:"application/json",payloadSerializerFactory:y,uriParserFactory:v,hasherFactory:m},L=function(){function e(t){B(this,e),this.config=w({},J,t),this.payloadSerializer=this.config.payloadSerializer||this.config.payloadSerializerFactory(),this.uriParser=this.config.uriParserFactory(),this.hasher=this.config.hasherFactory(),S(this.config.accessKeyId,"AwsSigner requires AWS AccessKeyID"),S(this.config.secretAccessKey,"AwsSigner requires AWS SecretAccessKey")}return P(e,[{key:"sign",value:function(e,t){var n={request:w({},e),signDate:t||new Date,uri:this.uriParser(e.url)};return h(this,n),f(this,n),l(this,n),d(this,n),p(this,n),{Accept:n.request.headers.accept,Authorization:n.authorization,"Content-Type":n.request.headers["content-type"],"x-amz-date":n.request.headers["x-amz-date"],"x-amz-security-token":this.config.sessionToken||void 0}}}]),e}(),F=["size","duration","position"],U="https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events",$=function(){function e(t){B(this,e),this.name="amazon",j(this,t),i().session.new&&this.logEvent({eventType:"_session.start"})}return P(e,[{key:"logPageView",value:function(e){E(k(e),this.userPoolID,this.app)}},{key:"logEvent",value:function(e){E(b(e),this.userPoolID,this.app)}}]),e}(),V=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};B(this,e),this.name="google",j(this,t)}return P(e,[{key:"logPageView",value:function(e){T(function(t){t.forEach(function(t){t.send("pageview",e||window.location.pathname)})})}},{key:"logEvent",value:function(e){var t=z(e,this.dimensions,this.metrics);T(function(e){e.forEach(function(e){e.send(t)})})}}]),e}(),G=function(e){return R.SHA256(e).toString(R.enc.Hex)};return function(){function e(t){if(B(this,e),this.trackers=[],this.workflows={},this.debug=t.debug,this.user=t.user,this.disabled=t.disabled,t.amazon){var n=new $(t.amazon);this.trackers.push(n)}if(t.google){var r=new V(t.google);this.trackers.push(r)}this.trackers.length||console.error(new Error("No trackers configured"))}return P(e,[{key:"logPageView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=H(t);return this.debug&&console.log("Tracking page view",JSON.stringify(n)),!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Page view was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(t){try{t.logPageView(e,n)}catch(e){console.error(t.name+" tracker failed to log page view.",e)}}),!0)}},{key:"logEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=H(e);return this.debug&&console.log("Tracking event",JSON.stringify(t)),!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Event was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(e){try{e.logEvent(t)}catch(t){console.error(e.name+" tracker failed to log event",t)}}),!0)}},{key:"startWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={name:e,start:Date.now(),steps:[]};this.workflows[e]=n;var r=j({name:e,step:"start"},t);return this._logWorkflow(r),n}},{key:"stepWorkflow",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r="string"==typeof options?n:n.details,i=j({name:e,step:t,details:r},n);this._logWorkflow(i)}},{key:"endWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=j({name:e,step:"finish"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"cancelWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=j({name:e,step:"cancel"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"_logWorkflow",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=H(e);var t=this.workflows[e.name];t||(t=this.startWorkflow(e.name)),t.steps.push(e.step),t.duration=(Date.now()-t.start)/1e3;var n=j(e,{eventType:"workflow",category:e.name,action:e.step,label:e.details,user:e.user||this.user,duration:t.duration});this.logEvent(n)}}]),e}()}); | ||
define(function(){"use strict";function e(e,t){var n=new XMLHttpRequest;n.addEventListener("load",function(){t(n.responseText)}),n.open(e.method,e.url),Object.keys(e.headers).forEach(function(t){n.setRequestHeader(t,e.headers[t])}),n.send(e.body)}function t(e,t){var r=H.get(j);if(r&&Date.now()/1e3<r.Expiration)return t(r);n(e,function(e){H.set(j,e),t(e)})}function n(t,n){var i=B({},D);i.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetId",i.body=JSON.stringify({IdentityPoolId:t}),e(i,function(e){r(JSON.parse(e),n)})}function r(t,n){var r=B({},D);r.headers["X-Amz-Target"]="AWSCognitoIdentityService.GetCredentialsForIdentity",r.body=JSON.stringify({IdentityId:t.IdentityId}),e(r,function(e){var t=JSON.parse(e);n(t.Credentials)})}function i(){return{session:o(),id:s()}}function o(){var e=void 0,t=H.get(U);return(!t||Date.now()>t.expiration)&&(e=!0,t=a()),t.expiration=Date.now()+N,H.set(U,t),e&&(t.new=!0),t}function s(){var e=H.get(W);return e||(e=c(),H.set(W,e)),e}function a(){return{id:Math.floor(17592186044416*(1+Math.random())).toString(16),startTimestamp:(new Date).toISOString()}}function c(){return u()+u()+"-"+u()+"-"+u()+"-"+u()+"-"+u()+u()+u()}function u(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}function l(e,t){var n={host:t.uri.host,"content-type":e.config.defaultContentType,accept:e.config.defaultAcceptType,"x-amz-date":g(t.signDate)};t.request.method=t.request.method.toUpperCase(),t.request.body?t.payload=t.request.body:t.request.data&&e.payloadSerializer?t.payload=e.payloadSerializer(t.request.data):delete n["content-type"],t.request.headers=w(n,Object.keys(t.request.headers||{}).reduce(function(e,n){return e[n.toLowerCase()]=t.request.headers[n],e},{})),t.sortedHeaderKeys=Object.keys(t.request.headers).sort(),t.request.headers["content-type"]&&(t.request.headers["content-type"]=t.request.headers["content-type"].split(";")[0]),"object"===q(t.request.params)&&w(t.uri.queryParams,t.request.params)}function h(e,t){t.signedHeaders=t.sortedHeaderKeys.map(function(e){return e.toLowerCase()}).join(";"),t.canonicalRequest=String(t.request.method).toUpperCase()+"\n"+encodeURI(t.uri.path)+"\n"+Object.keys(t.uri.queryParams).sort().map(function(e){return encodeURIComponent(e)+"="+encodeURIComponent(t.uri.queryParams[e])}).join("&")+"\n"+t.sortedHeaderKeys.map(function(e){return e.toLocaleLowerCase()+":"+t.request.headers[e]}).join("\n")+"\n\n"+t.signedHeaders+"\n"+e.hasher.hash(t.payload?t.payload:"")}function f(e,t){t.credentialScope=[g(t.signDate,!0),e.config.region,e.config.service,"aws4_request"].join("/"),t.stringToSign="AWS4-HMAC-SHA256\n"+g(t.signDate)+"\n"+t.credentialScope+"\n"+e.hasher.hash(t.canonicalRequest)}function d(e,t){var n=e.hasher.hmac,r=n(n(n(n("AWS4"+e.config.secretAccessKey,g(t.signDate,!0),{hexOutput:!1}),e.config.region,{hexOutput:!1,textInput:!1}),e.config.service,{hexOutput:!1,textInput:!1}),"aws4_request",{hexOutput:!1,textInput:!1});t.signature=n(r,t.stringToSign,{textInput:!1})}function p(e,t){t.authorization="AWS4-HMAC-SHA256 Credential="+e.config.accessKeyId+"/"+t.credentialScope+", SignedHeaders="+t.signedHeaders+", Signature="+t.signature}function g(e,t){var n=e.toISOString().replace(/[:\-]|\.\d{3}/g,"").substr(0,17);return t?n.substr(0,8):n}function y(){return function(e){return JSON.stringify(e)}}function v(){function e(e){return/^\??(.*)$/.exec(e)[1].split("&").reduce(function(e,t){return t=/^(.+)=(.*)$/.exec(t),t&&(e[t[1]]=t[2]),e},{})}var t=document?document.createElement("a"):{};return function(n){return t.href=n,{protocol:t.protocol,host:t.host.replace(/^(.*):((80)|(443))$/,"$1"),path:("/"!==t.pathname.charAt(0)?"/":"")+t.pathname,queryParams:e(t.search)}}}function m(){return{hash:function(e,t){t=w({hexOutput:!0,textInput:!0},t);var n=K.SHA256(e);return t.hexOutput?n.toString(K.enc.Hex):n},hmac:function(e,t,n){n=w({hexOutput:!0,textInput:!0},n);var r=K.HmacSHA256(t,e,{asBytes:!0});return n.hexOutput?r.toString(K.enc.Hex):r}}}function w(e){return[].slice.call(arguments,1).forEach(function(t){t&&"object"===(void 0===t?"undefined":q(t))&&Object.keys(t).forEach(function(n){var r=t[n];void 0!==r&&(null!==r&&"object"===(void 0===r?"undefined":q(r))?(e[n]=Array.isArray(r)?[]:{},w(e[n],r)):e[n]=r)})}),e}function S(e,t){if(void 0===e||!e)throw new Error(t)}function k(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i().session;return{eventType:"pageView",timestamp:(new Date).toISOString(),session:{id:n.id,startTimestamp:n.startTimestamp},attributes:{referrer:document.referrer,hostname:window.location.hostname,path:e||window.location.pathname,pageUrl:e||window.location.pathname,pageName:document.title,previousPageUrl:t.pageUrl,previousPageName:t.pageName},metrics:{}}}function b(e){var t=i().session;return{eventType:e.eventType||"other",timestamp:(new Date).toISOString(),session:{id:t.id,startTimestamp:t.startTimestamp},attributes:B({referrer:document.referrer,hostname:window.location.hostname,path:window.location.pathname},_(e)),metrics:A(e)}}function _(e){var t=B({},e);return delete t.workflow,R.forEach(function(e){return delete t[e]}),Object.keys(t).forEach(function(e){t[e]="json"===e?t[e]?JSON.stringify(t[e]):"null":void 0!==t[e]?t[e].toString():"null"}),t}function A(e){var t={};return R.forEach(function(n){e[n]&&(t[n]=e[n])}),t}function I(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n={region:"us-east-1",service:"mobileanalytics",accessKeyId:e.AccessKeyId,secretAccessKey:e.SecretKey,sessionToken:e.SessionToken};return new M(n).sign(t)}function x(e,t){return JSON.stringify({client:{client_id:e,app_title:t.name,app_version_name:t.version||"unknown"},services:{mobile_analytics:{app_id:t.id}}})}function E(n,r,o){var s=i();n=Array.isArray(n)?n:[n];var a=O(n);t(r,function(t){a.headers=I(t,a),a.headers["x-amz-Client-Context"]=x(s.id,o),e(a,function(e){e&&console.error(JSON.parse(e))})})}function O(e){return{url:arguments.length>1&&void 0!==arguments[1]?arguments[1]:J,method:"POST",body:JSON.stringify({events:e})}}function T(e){window.ga?window.ga(function(){e(window.ga.getAll())}):console.log(new Error("Google Analytics trackers not available"))}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r={hitType:"event",eventCategory:e.category||"none",eventAction:e.action,eventLabel:e.label};return Object.keys(t).forEach(function(n){r["dimension"+t[n]]=e[n]}),Object.keys(n).forEach(function(t){r["metric"+n[t]]=e[t]}),r}var H={storage:{},memory:!0,get:function(e){var t=void 0;try{t=window.localStorage&&window.localStorage.getItem(e)||this.storage[e]}catch(n){t=this.storage[e]}if(t)try{return JSON.parse(t)}catch(e){return}},set:function(e,t){t=JSON.stringify(t);try{window.localStorage.setItem(e,t)}catch(n){this.memory||(console.error("setting local storage failed, falling back to in-memory storage"),this.memory=!0),this.storage[e]=t}}},q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},C=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),B=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},j="TELEMETRY_COGNITO_CREDENTIALS",D={method:"POST",url:"https://cognito-identity.us-east-1.amazonaws.com/",headers:{"Content-type":"application/x-amz-json-1.1"}},N=18e5,U="TELEMETRY_SESSION",W="TELEMETRY_CLIENT_ID",K=function(e,t){var n={},r=n.lib={},i=function(){},o=r.Base={extend:function(e){i.prototype=this;var t=new i;return e&&t.mixIn(e),t.hasOwnProperty("init")||(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}},s=r.WordArray=o.extend({init:function(e,t){e=this.words=e||[],this.sigBytes=void 0!=t?t:4*e.length},toString:function(e){return(e||c).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes;if(e=e.sigBytes,this.clamp(),r%4)for(var i=0;i<e;i++)t[r+i>>>2]|=(n[i>>>2]>>>24-i%4*8&255)<<24-(r+i)%4*8;else if(n.length>65535)for(i=0;i<e;i+=4)t[r+i>>>2]=n[i>>>2];else t.push.apply(t,n);return this.sigBytes+=e,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=o.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){for(var n=[],r=0;r<t;r+=4)n.push(4294967296*e.random()|0);return new s.init(n,t)}}),a=n.enc={},c=a.Hex={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++){var i=t[r>>>2]>>>24-r%4*8&255;n.push((i>>>4).toString(16)),n.push((15&i).toString(16))}return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},u=a.Latin1={stringify:function(e){var t=e.words;e=e.sigBytes;for(var n=[],r=0;r<e;r++)n.push(String.fromCharCode(t[r>>>2]>>>24-r%4*8&255));return n.join("")},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r++)n[r>>>2]|=(255&e.charCodeAt(r))<<24-r%4*8;return new s.init(n,t)}},l=a.Utf8={stringify:function(e){try{return decodeURIComponent(escape(u.stringify(e)))}catch(e){throw Error("Malformed UTF-8 data")}},parse:function(e){return u.parse(unescape(encodeURIComponent(e)))}},h=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){"string"==typeof e&&(e=l.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,a=i/(4*o),a=t?e.ceil(a):e.max((0|a)-this._minBufferSize,0);if(t=a*o,i=e.min(4*t,i),t){for(var c=0;c<t;c+=o)this._doProcessBlock(r,c);c=r.splice(0,t),n.sigBytes-=i}return new s.init(c,i)},clone:function(){var e=o.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});r.Hasher=h.extend({cfg:o.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:16,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new f.HMAC.init(e,n).finalize(t)}}});var f=n.algo={};return n}(Math);!function(e){for(var t=K,n=t.lib,r=n.WordArray,i=n.Hasher,n=t.algo,o=[],s=[],a=function(e){return 4294967296*(e-(0|e))|0},c=2,u=0;u<64;){var l;e:{l=c;for(var h=e.sqrt(l),f=2;f<=h;f++)if(!(l%f)){l=!1;break e}l=!0}l&&(u<8&&(o[u]=a(e.pow(c,.5))),s[u]=a(e.pow(c,1/3)),u++),c++}var d=[],n=n.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],o=n[2],a=n[3],c=n[4],u=n[5],l=n[6],h=n[7],f=0;f<64;f++){if(f<16)d[f]=0|e[t+f];else{var p=d[f-15],g=d[f-2];d[f]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+d[f-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+d[f-16]}p=h+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&u^~c&l)+s[f]+d[f],g=((r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22))+(r&i^r&o^i&o),h=l,l=u,u=c,c=a+p|0,a=o,o=i,i=r,r=p+g|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+a|0,n[4]=n[4]+c|0,n[5]=n[5]+u|0,n[6]=n[6]+l|0,n[7]=n[7]+h|0},_doFinalize:function(){var t=this._data,n=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=e.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,t.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(n),t.HmacSHA256=i._createHmacHelper(n)}(Math),function(){var e=K,t=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(e,n){e=this._hasher=new e.init,"string"==typeof n&&(n=t.parse(n));var r=e.blockSize,i=4*r;n.sigBytes>i&&(n=e.finalize(n)),n.clamp();for(var o=this._oKey=n.clone(),s=this._iKey=n.clone(),a=o.words,c=s.words,u=0;u<r;u++)a[u]^=1549556828,c[u]^=909522486;o.sigBytes=s.sigBytes=i,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher;return e=t.finalize(e),t.reset(),t.finalize(this._oKey.clone().concat(e))}})}();var L={region:"eu-west-1",service:"execute-api",defaultContentType:"application/json",defaultAcceptType:"application/json",payloadSerializerFactory:y,uriParserFactory:v,hasherFactory:m},M=function(){function e(t){P(this,e),this.config=w({},L,t),this.payloadSerializer=this.config.payloadSerializer||this.config.payloadSerializerFactory(),this.uriParser=this.config.uriParserFactory(),this.hasher=this.config.hasherFactory(),S(this.config.accessKeyId,"AwsSigner requires AWS AccessKeyID"),S(this.config.secretAccessKey,"AwsSigner requires AWS SecretAccessKey")}return C(e,[{key:"sign",value:function(e,t){var n={request:w({},e),signDate:t||new Date,uri:this.uriParser(e.url)};return l(this,n),h(this,n),f(this,n),d(this,n),p(this,n),{Accept:n.request.headers.accept,Authorization:n.authorization,"Content-Type":n.request.headers["content-type"],"x-amz-date":n.request.headers["x-amz-date"],"x-amz-security-token":this.config.sessionToken||void 0}}}]),e}(),R=["size","duration","position","number","count","lastLogin","userSince"],J="https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events",F=function(){function e(t){P(this,e),this.name="amazon",B(this,t),i().session.new&&this.logEvent({eventType:"_session.start"})}return C(e,[{key:"logPageView",value:function(e){var t=k(e,this.previousPage);E(t,this.userPoolID,this.app),this.previousPage=t.attributes}},{key:"logEvent",value:function(e){E(b(e),this.userPoolID,this.app)}}]),e}(),$=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};P(this,e),this.name="google",B(this,t)}return C(e,[{key:"logPageView",value:function(e){T(function(t){t.forEach(function(t){t.send("pageview",e||window.location.pathname)})})}},{key:"logEvent",value:function(e){var t=z(e,this.dimensions,this.metrics);T(function(e){e.forEach(function(e){e.send(t)})})}}]),e}(),V=function(e){if(e)return K.SHA256(e).toString(K.enc.Hex)},G=["esri.com","esriuk.com","esri.de","esri.ca","esrifrance.fr","esri.nl","esri-portugal.pt","esribulgaria.com","esri.fi","esri.kr","esrimalaysia.com.my","esri.es","esriaustralia.com.au","esri-southafrica.com","esri.cl","esrichina.com.cn","esri.co","esriturkey.com.tr","geodata.no","esriitalia.it","esri.pl"];return function(){function e(t){if(P(this,e),this.trackers=[],this.workflows={},this.test=t.test,this.debug=t.debug,this.disabled=t.disabled,t.portal&&!t.portal.eueiEnabled&&(console.log("Telemetry Disabled"),this.disabled=!0),t.portal&&t.portal.user){var n=t.portal.subscriptionInfo||{};this.setUser(t.portal.user,n.type)}else t.user&&this.setUser(t.user);if(t.amazon){var r=new F(t.amazon);this.trackers.push(r)}if(t.google){var i=new $(t.google);this.trackers.push(i)}this.trackers.length||console.error(new Error("No trackers configured"))}return C(e,[{key:"setUser",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];e="string"==typeof e?{username:e}:e,this.user=e;var n=void 0;if(e.email&&e.email.split){var r=e.email.split("@")[1];n=G.filter(function(e){return r===e}).length>0}(n||["In House","Demo and Marketing"].includes(t))&&(this.user.internalUser=!0)}},{key:"logPageView",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.preProcess(t);if(this.debug)console.log("Tracking page view",JSON.stringify(n));else if(this.test&&!this.disabled)return n;return!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Page view was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(t){try{t.logPageView(e,n)}catch(e){console.error(t.name+" tracker failed to log page view.",e)}}),!0)}},{key:"logEvent",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.preProcess(e);if(this.debug)console.log("Tracking event",JSON.stringify(t));else if(this.test)return t;return!this.trackers.length||this.disabled?(this.disabled||console.error(new Error("Event was not logged because no trackers are configured.")),!1):(this.trackers.forEach(function(e){try{e.logEvent(t)}catch(t){console.error(e.name+" tracker failed to log event",t)}}),!0)}},{key:"logError",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=B({eventType:"error"},e);this.logEvent(t)}},{key:"startWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={name:e,start:Date.now(),steps:[]};this.workflows[e]=n;var r=B({name:e,step:"start"},t);return this._logWorkflow(r),n}},{key:"stepWorkflow",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r="string"==typeof options?n:n.details,i=B({name:e,step:t,details:r},n);this._logWorkflow(i)}},{key:"endWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=B({name:e,step:"finish"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"cancelWorkflow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=B({name:e,step:"cancel"},t);this._logWorkflow(n),delete this.workflows[e]}},{key:"_logWorkflow",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=this.preProcess(e);var t=this.workflows[e.name];t||(t=this.startWorkflow(e.name)),t.steps.push(e.step),t.duration=(Date.now()-t.start)/1e3;var n=B(e,{eventType:"workflow",category:e.name,action:e.step,label:e.details,duration:t.duration});this.logEvent(n)}},{key:"preProcess",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={};return this.user&&(t={user:V(this.user.username),orgId:V(this.user.orgId),lastLogin:this.user.lastLogin,userSince:this.user.created,internalUser:this.user.internalUser||!1}),B({},e,t)}}]),e}()}); | ||
//# sourceMappingURL=telemetry.dojo.min.js.map |
{ | ||
"name": "@esri/telemetry", | ||
"version": "1.2.0", | ||
"version": "1.3.1", | ||
"description": "A JavaScript Implementation of the ArcGIS Telemetry Specification", | ||
@@ -8,3 +8,4 @@ "main": "dist/telemetry.js", | ||
"build": "node build.js", | ||
"test": "standard src" | ||
"lint": "standard src", | ||
"test": "tape test/**/*.spec.js | tap-spec" | ||
}, | ||
@@ -15,3 +16,10 @@ "repository": { | ||
}, | ||
"keywords": ["arcgis", "telemetry", "analytics", "tracking", "google", "amazon"], | ||
"keywords": [ | ||
"arcgis", | ||
"telemetry", | ||
"analytics", | ||
"tracking", | ||
"google", | ||
"amazon" | ||
], | ||
"author": "Daniel Fenton <dfenton@esri.com>", | ||
@@ -35,2 +43,3 @@ "license": "Apache-2.0", | ||
"del": "^2.2.2", | ||
"node-localstorage": "^1.3.0", | ||
"rollup": "^0.41.6", | ||
@@ -41,8 +50,19 @@ "rollup-plugin-babel": "^2.7.1", | ||
"rollup-plugin-uglify": "^1.0.1", | ||
"standard": "^10.0.2" | ||
"standard": "^10.0.2", | ||
"tap-spec": "^4.1.1", | ||
"tape": "^4.8.0", | ||
"window": "^4.2.0", | ||
"xmlhttprequest": "^1.8.0" | ||
}, | ||
"standard": { | ||
"globals": ["window", "document", "XMLHttpRequest"], | ||
"ignore": ["dist/*.js", "test.html"] | ||
"globals": [ | ||
"window", | ||
"document", | ||
"XMLHttpRequest" | ||
], | ||
"ignore": [ | ||
"dist/*.js", | ||
"test.html" | ||
] | ||
} | ||
} |
@@ -11,4 +11,63 @@ # Telemetry.js | ||
### Direct tracking | ||
## Initialization | ||
```js | ||
const telemetry = new Telemetry ({ | ||
debug: false, // OPTIONAL true || false whether to log each event to the console | ||
amazon: { | ||
amazon: { | ||
userPoolID: 'YOUR_USER_POOL_ID', // REQUIRED e.g. us-east-1:aed3c2fe-4d28-431f-abb0-fca6e3167a25 | ||
app: { | ||
name: 'YOUR_APP_NAME', // REQUIRED e.g. ArcGIS Hub | ||
id: 'YOUR_APP_ID', // REQUIRED e.g. 36c5713d9d75496789973403b13548fd | ||
version: 'YOUR_APP_VERSION' // REQUIRED e.g. 1.0 | ||
} | ||
} | ||
}, | ||
portal: { // Optional portal/self object | ||
subscriptionInfo: { | ||
type: 'In House' | ||
}, | ||
user: { // OPTIONAL Can be the entire portal/self user object | ||
username: 'amazing_map_woman', | ||
orgId: '1ef', | ||
userSince: 1503924854932, | ||
lastLogin: 1503924854932 | ||
} | ||
} | ||
}) | ||
``` | ||
### Options | ||
#### portal | ||
Pass the results of a `portal/self` call e.g. https://www.arcgis.com/sharing/rest/portals/self?f=json into `options.portal`. | ||
This will automatically set the user and organization information of the present user and Telemetry will automatically log these values. | ||
#### user | ||
If you do not have access to `portal/self` or do not want to make that HTTP call, you can also pass `options.user` e.g. | ||
```js | ||
options = { | ||
user: { | ||
username: 'amazing_map_woman', | ||
orgId: '1ef', | ||
userSince: 1503924854932, | ||
lastLogin: 1503924854932 | ||
} | ||
} | ||
``` | ||
You can also call `telemetry.setUser` with an object like the one above to set the user after `Telemetry` has already been initiated. | ||
#### debug | ||
Pass `options.debug` to view each event in the console. This is useful for development and testing | ||
## Direct tracking | ||
### `telemetry.logPageView(page)` | ||
@@ -42,3 +101,17 @@ | ||
``` | ||
## Errors | ||
### `telemetry.logError(error)` | ||
E.g. | ||
```js | ||
const options = { | ||
error: 'Service failed count request', | ||
urlRequested: 'http://featureserver.com/FeatureServer/0/query?f=json&returnCountOnly=true', | ||
statusCode: 500 | ||
} | ||
telemetry.logError(options) | ||
``` | ||
## Workflows | ||
@@ -45,0 +118,0 @@ |
@@ -6,3 +6,3 @@ import { getCredentials } from './auth' | ||
const METRICS = ['size', 'duration', 'position'] | ||
const METRICS = ['size', 'duration', 'position', 'number', 'count', 'lastLogin', 'userSince'] | ||
const DEFAULT_ENDPOINT = 'https://mobileanalytics.us-east-1.amazonaws.com/2014-06-05/events' | ||
@@ -19,4 +19,5 @@ | ||
logPageView (page) { | ||
const events = createPageView(page) | ||
sendTelemetry(events, this.userPoolID, this.app) | ||
const event = createPageView(page, this.previousPage) | ||
sendTelemetry(event, this.userPoolID, this.app) | ||
this.previousPage = event.attributes | ||
} | ||
@@ -30,3 +31,3 @@ | ||
function createPageView (page) { | ||
function createPageView (page, previousPage = {}) { | ||
const session = getUser().session | ||
@@ -43,3 +44,7 @@ return { | ||
hostname: window.location.hostname, | ||
path: window.location.pathname || page | ||
path: page || window.location.pathname, | ||
pageUrl: page || window.location.pathname, | ||
pageName: document.title, | ||
previousPageUrl: previousPage.pageUrl, | ||
previousPageName: previousPage.pageName | ||
}, | ||
@@ -77,3 +82,3 @@ metrics: {} | ||
} else { | ||
attributes[attr] = attributes[attr] ? attributes[attr].toString() : 'null' | ||
attributes[attr] = attributes[attr] !== undefined ? attributes[attr].toString() : 'null' | ||
} | ||
@@ -87,3 +92,3 @@ }) | ||
METRICS.forEach(metric => { | ||
metrics[metric] = event[metric] | ||
if (event[metric]) metrics[metric] = event[metric] | ||
}) | ||
@@ -93,3 +98,3 @@ return metrics | ||
function createHeaders (credentials, options) { | ||
function createHeaders (credentials = {}, options) { | ||
const config = { | ||
@@ -96,0 +101,0 @@ region: 'us-east-1', |
import Crypto from './crypto' | ||
export default function (user) { | ||
if (!user) return undefined | ||
return Crypto.SHA256(user).toString(Crypto.enc.Hex) | ||
} |
import Amazon from './amazon' | ||
import Google from './google' | ||
import anonymize from './anonymize' | ||
import internalOrgs from './internal-orgs' | ||
@@ -9,5 +10,18 @@ export default class Telemetry { | ||
this.workflows = {} | ||
this.test = options.test | ||
this.debug = options.debug | ||
this.user = options.user | ||
this.disabled = options.disabled | ||
if (options.portal && !options.portal.eueiEnabled) { | ||
console.log('Telemetry Disabled') | ||
this.disabled = true | ||
} | ||
if (options.portal && options.portal.user) { | ||
const subscriptionInfo = options.portal.subscriptionInfo || {} | ||
this.setUser(options.portal.user, subscriptionInfo.type) | ||
} else if (options.user) { | ||
this.setUser(options.user) | ||
} | ||
if (options.amazon) { | ||
@@ -26,5 +40,24 @@ const amazon = new Amazon(options.amazon) | ||
setUser (user = {}, orgType) { | ||
user = typeof user === 'string' ? { username: user } : user | ||
this.user = user | ||
let internalDomain | ||
if (user.email && user.email.split) { | ||
const domain = user.email.split('@')[1] | ||
internalDomain = | ||
internalOrgs.filter(org => { | ||
return domain === org | ||
}).length > 0 | ||
} | ||
if (internalDomain || ['In House', 'Demo and Marketing'].includes(orgType)) { | ||
this.user.internalUser = true | ||
} | ||
} | ||
logPageView (page, options = {}) { | ||
const attributes = preProcess(options) | ||
const attributes = this.preProcess(options) | ||
if (this.debug) console.log('Tracking page view', JSON.stringify(attributes)) | ||
else if (this.test && !this.disabled) return attributes | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -46,4 +79,7 @@ if (!this.disabled) console.error(new Error('Page view was not logged because no trackers are configured.')) | ||
logEvent (options = {}) { | ||
const event = preProcess(options) | ||
const event = this.preProcess(options) | ||
if (this.debug) console.log('Tracking event', JSON.stringify(event)) | ||
else if (this.test) return event | ||
if (!this.trackers.length || this.disabled) { | ||
@@ -64,2 +100,7 @@ if (!this.disabled) console.error(new Error('Event was not logged because no trackers are configured.')) | ||
logError (options = {}) { | ||
const event = Object.assign({ eventType: 'error' }, options) | ||
this.logEvent(event) | ||
} | ||
startWorkflow (name, attributes = {}) { | ||
@@ -103,3 +144,3 @@ const workflow = { | ||
*/ | ||
options = preProcess(options) | ||
options = this.preProcess(options) | ||
let workflow = this.workflows[options.name] | ||
@@ -118,3 +159,2 @@ if (!workflow) { | ||
label: options.details, | ||
user: options.user || this.user, | ||
duration: workflow.duration | ||
@@ -125,10 +165,17 @@ }) | ||
} | ||
} | ||
function preProcess (options = {}) { | ||
const attributes = Object.assign({}, options) | ||
if (attributes.user) { | ||
attributes.user = anonymize(attributes.user) | ||
preProcess (options = {}) { | ||
let userOptions = {} | ||
if (this.user) { | ||
userOptions = { | ||
user: anonymize(this.user.username), | ||
orgId: anonymize(this.user.orgId), | ||
lastLogin: this.user.lastLogin, | ||
userSince: this.user.created, | ||
internalUser: this.user.internalUser || false | ||
} | ||
} | ||
return Object.assign({}, options, userOptions) | ||
} | ||
return attributes | ||
} |
@@ -1,3 +0,3 @@ | ||
export default function request(options, callback) { | ||
const req = new XMLHttpRequest() | ||
export default function request (options, callback) { | ||
const req = new XMLHttpRequest() //eslint-disable-line | ||
req.addEventListener('load', () => { | ||
@@ -4,0 +4,0 @@ callback(req.responseText) |
@@ -5,3 +5,8 @@ export default { | ||
get (key) { | ||
const stored = window.localStorage.getItem(key) || this.storage[key] | ||
let stored | ||
try { | ||
stored = (window.localStorage && window.localStorage.getItem(key)) || this.storage[key] | ||
} catch (e) { | ||
stored = this.storage[key] | ||
} | ||
if (stored) { | ||
@@ -8,0 +13,0 @@ try { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
736460
41
4996
249
21